pax_global_header00006660000000000000000000000064145410467550014525gustar00rootroot0000000000000052 comment=108f9c6439b3d183be1b846cddda208009e8661b slepc4py-3.19.2/000077500000000000000000000000001454104675500133645ustar00rootroot00000000000000slepc4py-3.19.2/CHANGES.rst000066400000000000000000000051261454104675500151720ustar00rootroot00000000000000========================= CHANGES: SLEPc for Python ========================= :Author: Lisandro Dalcin :Contact: dalcinl@gmail.com Release 3.19.2 ============== - Update to SLEPc 3.19.2. Release 3.19.1 ============== - Update to SLEPc 3.19.1. Release 3.19.0 ============== - Update to SLEPc 3.19.0. Release 3.18.3 ============== - Update to SLEPc 3.18.3. Release 3.18.2 ============== - Update to SLEPc 3.18.2. Release 3.18.1 ============== - Update to SLEPc 3.18.1. Release 3.18.0 ============== - Update to SLEPc 3.18 release. Release 3.17.2 ============== - Update to SLEPc 3.17.2. Release 3.17.1 ============== - Update to SLEPc 3.17.1. Release 3.17.0 ============== - Update to SLEPc 3.17 release. Release 3.16.2 ============== - Update to SLEPc 3.16.2. Release 3.16.1 ============== - Update to SLEPc 3.16.1. Release 3.16.0 ============== - Update to SLEPc 3.16 release. Release 3.15.2 ============== - Update to SLEPc 3.15.2. Release 3.15.1 ============== - Updates in installation scripts. Release 3.15.0 ============== - Update to SLEPc 3.15 release. Release 3.14.0 ============== - Update to SLEPc 3.14 release. Release 3.13.0 ============== - Update to SLEPc 3.13 release. Release 3.12.0 ============== - Update to SLEPc 3.12 release. Release 3.11.0 ============== - Update to SLEPc 3.11 release. Release 3.10.0 ============== - Update to SLEPc 3.10 release. Release 3.9.0 ============= - Update to SLEPc 3.9 release. Release 3.8.0 ============= - Update to SLEPc 3.8 release. Release 3.7.0 ============= - Update to SLEPc 3.7 release. Release 3.6.0 ============= - Update to SLEPc 3.6 release. Release 3.5.1 ============= - Add RG class introduced in SLEPc 3.5 release. - Add PySlepcXXX_New/Get C API functions. - Fix compilation problem with complex scalars on OS X. - Fix outdated SWIG interface file. Release 3.5 =========== - Update to SLEPc 3.5 release. Release 3.4 =========== - Update to SLEPc 3.4 release. Release 3.3.1 ============= - Regenerate the wrappers using Cython 0.18 and fix binary compatibility issues with petsc4py 3.3.1 . Release 3.3 =========== - Update to SLEPc 3.3 release. Release 1.2 =========== - Update to SLEPc 3.2 release. Release 1.1 =========== * Support for new QEP quadratic eigenproblem solver in SLEPc. * Support for ``pip install slepc4py`` to download and install SLEPc. * Support for PETSc/SLEPc static library builds (Linux-only). * Preliminar support for Python 3. Release 1.0.0 ============= This is the fist release of the all-new, Cython-based, implementation of *SLEPc for Python*. slepc4py-3.19.2/DESCRIPTION.rst000066400000000000000000000017171454104675500157070ustar00rootroot00000000000000SLEPc for Python ================ Python bindings for SLEPc. Install ------- If you have a working MPI implementation and the ``mpicc`` compiler wrapper is on your search path, it highly recommended to install ``mpi4py`` first:: $ pip install mpi4py Ensure you have NumPy installed:: $ pip install numpy and finally:: $ pip install petsc petsc4py slepc slepc4py Citations --------- If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. https://doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman and V. Vidal. *SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. https://doi.org/10.1145/1089014.1089019 slepc4py-3.19.2/LICENSE.rst000066400000000000000000000026311454104675500152020ustar00rootroot00000000000000========================= LICENSE: SLEPc for Python ========================= :Author: Lisandro Dalcin :Contact: dalcinl@gmail.com Copyright (c) 2023, Lisandro Dalcin. All rights reserved. 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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. slepc4py-3.19.2/MANIFEST.in000066400000000000000000000010241454104675500151170ustar00rootroot00000000000000include setup*.py *.toml *.cfg *.rst recursive-include demo [M,m]akefile* *.py recursive-include conf *.py *.sh *.cfg recursive-include src *.py *.pyx *.px[di] *.h *.c *.i *.cfg recursive-include test *.py recursive-include * [M,m]akefile exclude src/slepc4py/SLEPc.c exclude src/slepc4py/SLEPc.h exclude src/slepc4py/SLEPc_api.h include docs/*.html include docs/*.pdf include docs/*.info include docs/*.[137] include docs/*.rst recursive-include docs/usrman * recursive-include docs/apiref * recursive-include docs/source * slepc4py-3.19.2/PKG-INFO000066400000000000000000000047311454104675500144660ustar00rootroot00000000000000Metadata-Version: 2.1 Name: slepc4py Version: 3.19.2 Summary: SLEPc for Python Home-page: https://gitlab.com/slepc/slepc Author: Lisandro Dalcin Author-email: dalcinl@gmail.com Maintainer: SLEPc Team Maintainer-email: slepc-maint@upv.es License: BSD-2-Clause Download-URL: https://pypi.io/packages/source/s/slepc4py/slepc4py-3.19.2.tar.gz Description: SLEPc for Python ================ Python bindings for SLEPc. Install ------- If you have a working MPI implementation and the ``mpicc`` compiler wrapper is on your search path, it highly recommended to install ``mpi4py`` first:: $ pip install mpi4py Ensure you have NumPy installed:: $ pip install numpy and finally:: $ pip install petsc petsc4py slepc slepc4py Citations --------- If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. https://doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman and V. Vidal. *SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. https://doi.org/10.1145/1089014.1089019 Keywords: scientific computing,parallel computing,MPI,SLEPc,PETSc Platform: POSIX Platform: Linux Platform: macOS Platform: FreeBSD Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: POSIX Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: Programming Language :: C Classifier: Programming Language :: C++ Classifier: Programming Language :: Cython Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Development Status :: 5 - Production/Stable Requires: numpy Description-Content-Type: text/x-rst slepc4py-3.19.2/README.rst000066400000000000000000000017401454104675500150550ustar00rootroot00000000000000================ SLEPc for Python ================ Overview -------- Welcome to SLEPc for Python. This package provides Python bindings for SLEPc_, the * Scalable Library for Eigenvalue Problem Computations*. Dependencies ------------ * Python_ 2.7, 3.3 or above. * A recent NumPy_ release. * A matching version of SLEPc_ built with *shared/dynamic libraries*. * A matching version of PETSc_ built with *shared/dynamic libraries*. * A matching version of petsc4py_. * To work with the in-development version, you need Cython_. .. _Python: https://www.python.org .. _NumPy: https://www.numpy.org .. _SLEPc: https://slepc.upv.es .. _PETSc: https://petsc.org .. _petsc4py: https://gitlab.com/petsc/petsc .. _Cython: https://cython.org Documentation ------------- * https://slepc4py.readthedocs.org/, This does not contain the epydoc-generated API reference. * https://slepc.upv.es/slepc4py-current/docs/, This is for the last release, not the in-development version. slepc4py-3.19.2/conf/000077500000000000000000000000001454104675500143115ustar00rootroot00000000000000slepc4py-3.19.2/conf/__init__.py000066400000000000000000000000001454104675500164100ustar00rootroot00000000000000slepc4py-3.19.2/conf/confpetsc.py000066400000000000000000001040131454104675500166460ustar00rootroot00000000000000# -------------------------------------------------------------------- import re import os import sys import glob import copy import warnings try: from cStringIO import StringIO except ImportError: from io import StringIO try: import setuptools except ImportError: setuptools = None if setuptools: from setuptools import setup as _setup from setuptools import Extension as _Extension from setuptools import Command else: from distutils.core import setup as _setup from distutils.core import Extension as _Extension from distutils.core import Command def import_command(cmd): try: from importlib import import_module except ImportError: def import_module(n): return __import__(n, fromlist=[None]) try: if not setuptools: raise ImportError mod = import_module('setuptools.command.' + cmd) return getattr(mod, cmd) except ImportError: mod = import_module('distutils.command.' + cmd) return getattr(mod, cmd) _config = import_command('config') _build = import_command('build') _build_ext = import_command('build_ext') _install = import_command('install') from distutils import log from distutils import sysconfig from distutils.util import execute from distutils.util import split_quoted from distutils.errors import DistutilsError try: from setuptools import dep_util except ImportError: from distutils import dep_util try: from packaging.version import Version except ImportError: try: from setuptools.extern.packaging.version import Version except ImportError: from distutils.version import StrictVersion as Version # -------------------------------------------------------------------- # Cython CYTHON = '0.29.36' def cython_req(): return CYTHON def cython_chk(VERSION, verbose=True): # def warn(message): if not verbose: return ruler, ws, nl = "*"*80, " " ,"\n" pyexe = sys.executable advise = "$ %s -m pip install --upgrade cython" % pyexe def printer(*s): sys.stderr.write(" ".join(s)+"\n") printer(ruler, nl) printer(ws, message, nl) printer(ws, ws, advise, nl) printer(ruler) # try: import Cython except ImportError: warn("You need Cython to generate C source files.") return False # CYTHON_VERSION = Cython.__version__ m = re.match(r"(\d+\.\d+(?:\.\d+)?).*", CYTHON_VERSION) if not m: warn("Cannot parse Cython version string {0!r}" .format(CYTHON_VERSION)) return False REQUIRED = Version(VERSION) PROVIDED = Version(m.groups()[0]) if PROVIDED != REQUIRED: warn("You need Cython == {0} (you have version {1})" .format(VERSION, CYTHON_VERSION)) return False # if verbose: log.info("using Cython %s" % CYTHON_VERSION) return True def cython_run( source, target=None, depends=(), includes=(), workdir=None, force=False, VERSION="0.0", ): if target is None: target = os.path.splitext(source)[0]+'.c' cwd = os.getcwd() try: if workdir: os.chdir(workdir) alldeps = [source] for dep in depends: alldeps += glob.glob(dep) if not (force or dep_util.newer_group(alldeps, target)): log.debug("skipping '%s' -> '%s' (up-to-date)", source, target) return finally: os.chdir(cwd) require = 'Cython == %s' % VERSION if setuptools and not cython_chk(VERSION, verbose=False): if sys.modules.get('Cython'): removed = getattr(sys.modules['Cython'], '__version__', '') log.info("removing Cython %s from sys.modules" % removed) pkgname = re.compile(r'cython(\.|$)', re.IGNORECASE) for modname in list(sys.modules.keys()): if pkgname.match(modname): del sys.modules[modname] try: install_setup_requires = setuptools._install_setup_requires with warnings.catch_warnings(): if hasattr(setuptools, 'SetuptoolsDeprecationWarning'): category = setuptools.SetuptoolsDeprecationWarning warnings.simplefilter('ignore', category) log.info("fetching build requirement '%s'" % require) install_setup_requires(dict(setup_requires=[require])) except Exception: log.info("failed to fetch build requirement '%s'" % require) if not cython_chk(VERSION): raise DistutilsError("unsatisfied build requirement '%s'" % require) # log.info("cythonizing '%s' -> '%s'", source, target) from cythonize import cythonize args = [] if workdir: args += ['--working', workdir] args += [source] if target: args += ['--output-file', target] err = cythonize(args) if err: raise DistutilsError( "Cython failure: '%s' -> '%s'" % (source, target) ) # -------------------------------------------------------------------- def fix_config_vars(names, values): values = list(values) if 'CONDA_BUILD' in os.environ: return values if sys.platform == 'darwin': if 'ARCHFLAGS' in os.environ: ARCHFLAGS = os.environ['ARCHFLAGS'] for i, flag in enumerate(list(values)): flag, count = re.subn('-arch\s+\w+', ' ', str(flag)) if count and ARCHFLAGS: flag = flag + ' ' + ARCHFLAGS values[i] = flag if 'SDKROOT' in os.environ: SDKROOT = os.environ['SDKROOT'] for i, flag in enumerate(list(values)): flag, count = re.subn('-isysroot [^ \t]*', ' ', str(flag)) if count and SDKROOT: flag = flag + ' ' + '-isysroot ' + SDKROOT values[i] = flag return values def get_config_vars(*names): # Core Python configuration values = sysconfig.get_config_vars(*names) # Do any distutils flags fixup right now values = fix_config_vars(names, values) return values from distutils.unixccompiler import UnixCCompiler rpath_option_orig = UnixCCompiler.runtime_library_dir_option def rpath_option(compiler, dir): option = rpath_option_orig(compiler, dir) if sys.platform[:5] == 'linux': if option.startswith('-R'): option = option.replace('-R', '-Wl,-rpath,', 1) elif option.startswith('-Wl,-R'): option = option.replace('-Wl,-R', '-Wl,-rpath,', 1) return option UnixCCompiler.runtime_library_dir_option = rpath_option # -------------------------------------------------------------------- class PetscConfig: def __init__(self, petsc_dir, petsc_arch, dest_dir=None): if dest_dir is None: dest_dir = os.environ.get('DESTDIR') self.configdict = { } if not petsc_dir: raise DistutilsError("PETSc not found") if not os.path.isdir(petsc_dir): raise DistutilsError("invalid PETSC_DIR: %s" % petsc_dir) self.version = self._get_petsc_version(petsc_dir) self.configdict = self._get_petsc_config(petsc_dir, petsc_arch) self.PETSC_DIR = self['PETSC_DIR'] self.PETSC_ARCH = self['PETSC_ARCH'] self.DESTDIR = dest_dir language_map = {'CONLY':'c', 'CXXONLY':'c++'} self.language = language_map[self['PETSC_LANGUAGE']] def __getitem__(self, item): return self.configdict[item] def get(self, item, default=None): return self.configdict.get(item, default) def configure(self, extension, compiler=None): self.configure_extension(extension) if compiler is not None: self.configure_compiler(compiler) def _get_petsc_version(self, petsc_dir): import re version_re = { 'major' : re.compile(r"#define\s+PETSC_VERSION_MAJOR\s+(\d+)"), 'minor' : re.compile(r"#define\s+PETSC_VERSION_MINOR\s+(\d+)"), 'micro' : re.compile(r"#define\s+PETSC_VERSION_SUBMINOR\s+(\d+)"), 'release': re.compile(r"#define\s+PETSC_VERSION_RELEASE\s+(-*\d+)"), } petscversion_h = os.path.join(petsc_dir, 'include', 'petscversion.h') with open(petscversion_h, 'rt') as f: data = f.read() major = int(version_re['major'].search(data).groups()[0]) minor = int(version_re['minor'].search(data).groups()[0]) micro = int(version_re['micro'].search(data).groups()[0]) release = int(version_re['release'].search(data).groups()[0]) return (major, minor, micro), (release == 1) def _get_petsc_config(self, petsc_dir, petsc_arch): from os.path import join, isdir, exists PETSC_DIR = petsc_dir PETSC_ARCH = petsc_arch # confdir = join('lib', 'petsc', 'conf') if not (PETSC_ARCH and isdir(join(PETSC_DIR, PETSC_ARCH))): petscvars = join(PETSC_DIR, confdir, 'petscvariables') PETSC_ARCH = makefile(open(petscvars, 'rt')).get('PETSC_ARCH') if not (PETSC_ARCH and isdir(join(PETSC_DIR, PETSC_ARCH))): PETSC_ARCH = '' # variables = join(PETSC_DIR, confdir, 'variables') if not exists(variables): variables = join(PETSC_DIR, PETSC_ARCH, confdir, 'variables') petscvariables = join(PETSC_DIR, PETSC_ARCH, confdir, 'petscvariables') # with open(variables) as f: contents = f.read() with open(petscvariables) as f: contents += f.read() # confstr = 'PETSC_DIR = %s\n' % PETSC_DIR confstr += 'PETSC_ARCH = %s\n' % PETSC_ARCH confstr += contents confdict = makefile(StringIO(confstr)) return confdict def _configure_ext(self, ext, dct, append=False): extdict = ext.__dict__ for key, values in dct.items(): if key in extdict: for value in values: if value not in extdict[key]: if not append: extdict[key].insert(0, value) else: extdict[key].append(value) def configure_extension(self, extension): # includes and libraries # paths in PETSc config files point to final installation location, but # we might be building against PETSc in staging location (DESTDIR) when # DESTDIR is set, so append DESTDIR (if nonempty) to those paths petsc_inc = flaglist(prepend_to_flags(self.DESTDIR, self['PETSC_CC_INCLUDES'])) lib_flags = prepend_to_flags(self.DESTDIR, '-L%s %s' % \ (self['PETSC_LIB_DIR'], self['PETSC_LIB_BASIC'])) petsc_lib = flaglist(lib_flags) # runtime_library_dirs is not supported on Windows if sys.platform != 'win32': # if DESTDIR is set, then we're building against PETSc in a staging # directory, but rpath needs to point to final install directory. rpath = strip_prefix(self.DESTDIR, self['PETSC_LIB_DIR']) petsc_lib['runtime_library_dirs'].append(rpath) # Link in extra libraries on static builds if self['BUILDSHAREDLIB'] != 'yes': petsc_ext_lib = split_quoted(self['PETSC_EXTERNAL_LIB_BASIC']) petsc_lib['extra_link_args'].extend(petsc_ext_lib) self._configure_ext(extension, petsc_inc, append=True) self._configure_ext(extension, petsc_lib) def configure_compiler(self, compiler): if compiler.compiler_type != 'unix': return getenv = os.environ.get # distutils C/C++ compiler (cc, cflags, ccshared, cxx) = get_config_vars( 'CC', 'CFLAGS', 'CCSHARED', 'CXX') ccshared = getenv('CCSHARED', ccshared or '') cflags = getenv('CFLAGS', cflags or '') cflags = cflags.replace('-Wstrict-prototypes', '') # distutils linker (ldflags, ldshared, so_ext) = get_config_vars( 'LDFLAGS', 'LDSHARED', 'SO') ld = cc ldshared = getenv('LDSHARED', ldshared) ldflags = getenv('LDFLAGS', cflags + ' ' + (ldflags or '')) ldcmd = split_quoted(ld) + split_quoted(ldflags) ldshared = [flg for flg in split_quoted(ldshared) if flg not in ldcmd and (flg.find('/lib/spack/env')<0)] ldshared = str.join(' ', ldshared) # def get_flags(cmd): if not cmd: return '' cmd = split_quoted(cmd) if os.path.basename(cmd[0]) == 'xcrun': del cmd[0] while True: if cmd[0] == '-sdk': del cmd[0:2] continue if cmd[0] == '-log': del cmd[0] continue break return ' '.join(cmd[1:]) # PETSc C compiler PCC = self['PCC'] PCC_FLAGS = get_flags(cc) + ' ' + self['PCC_FLAGS'] PCC_FLAGS = PCC_FLAGS.replace('-fvisibility=hidden', '') PCC = getenv('PCC', PCC) + ' ' + getenv('PCCFLAGS', PCC_FLAGS) PCC_SHARED = str.join(' ', (PCC, ccshared, cflags)) # PETSc C++ compiler PCXX = PCC if self.language == 'c++' else self.get('CXX', cxx) # PETSc linker PLD = self['PCC_LINKER'] PLD_FLAGS = get_flags(ld) + ' ' + self['PCC_LINKER_FLAGS'] PLD_FLAGS = PLD_FLAGS.replace('-fvisibility=hidden', '') PLD = getenv('PLD', PLD) + ' ' + getenv('PLDFLAGS', PLD_FLAGS) PLD_SHARED = str.join(' ', (PLD, ldshared, ldflags)) # compiler.set_executables( compiler = PCC, compiler_cxx = PCXX, linker_exe = PLD, compiler_so = PCC_SHARED, linker_so = PLD_SHARED, ) compiler.shared_lib_extension = so_ext # if sys.platform == 'darwin': for attr in ('preprocessor', 'compiler', 'compiler_cxx', 'compiler_so', 'linker_so', 'linker_exe'): compiler_cmd = getattr(compiler, attr, []) while '-mno-fused-madd' in compiler_cmd: compiler_cmd.remove('-mno-fused-madd') def log_info(self): PETSC_DIR = self['PETSC_DIR'] PETSC_ARCH = self['PETSC_ARCH'] version = ".".join([str(i) for i in self.version[0]]) release = ("development", "release")[self.version[1]] version_info = version + ' ' + release integer_size = '%s-bit' % self['PETSC_INDEX_SIZE'] scalar_type = self['PETSC_SCALAR'] precision = self['PETSC_PRECISION'] language = self['PETSC_LANGUAGE'] compiler = self['PCC'] linker = self['PCC_LINKER'] log.info('PETSC_DIR: %s' % PETSC_DIR ) log.info('PETSC_ARCH: %s' % PETSC_ARCH ) log.info('version: %s' % version_info) log.info('integer-size: %s' % integer_size) log.info('scalar-type: %s' % scalar_type) log.info('precision: %s' % precision) log.info('language: %s' % language) log.info('compiler: %s' % compiler) log.info('linker: %s' % linker) # -------------------------------------------------------------------- class Extension(_Extension): pass # -------------------------------------------------------------------- cmd_petsc_opts = [ ('petsc-dir=', None, "define PETSC_DIR, overriding environmental variables"), ('petsc-arch=', None, "define PETSC_ARCH, overriding environmental variables"), ] class config(_config): Configure = PetscConfig user_options = _config.user_options + cmd_petsc_opts def initialize_options(self): _config.initialize_options(self) self.petsc_dir = None self.petsc_arch = None def get_config_arch(self, arch): return config.Configure(self.petsc_dir, arch) def run(self): _config.run(self) self.petsc_dir = config.get_petsc_dir(self.petsc_dir) if self.petsc_dir is None: return petsc_arch = config.get_petsc_arch(self.petsc_dir, self.petsc_arch) log.info('-' * 70) log.info('PETSC_DIR: %s' % self.petsc_dir) arch_list = petsc_arch if not arch_list : arch_list = [ None ] for arch in arch_list: conf = self.get_config_arch(arch) archname = conf.PETSC_ARCH or conf['PETSC_ARCH'] scalar_type = conf['PETSC_SCALAR'] precision = conf['PETSC_PRECISION'] language = conf['PETSC_LANGUAGE'] compiler = conf['PCC'] linker = conf['PCC_LINKER'] log.info('-'*70) log.info('PETSC_ARCH: %s' % archname) log.info(' * scalar-type: %s' % scalar_type) log.info(' * precision: %s' % precision) log.info(' * language: %s' % language) log.info(' * compiler: %s' % compiler) log.info(' * linker: %s' % linker) log.info('-' * 70) #@staticmethod def get_petsc_dir(petsc_dir): if not petsc_dir: return None petsc_dir = os.path.expandvars(petsc_dir) if not petsc_dir or '$PETSC_DIR' in petsc_dir: try: import petsc petsc_dir = petsc.get_petsc_dir() except ImportError: log.warn("PETSC_DIR not specified") return None petsc_dir = os.path.expanduser(petsc_dir) petsc_dir = os.path.abspath(petsc_dir) return config.chk_petsc_dir(petsc_dir) get_petsc_dir = staticmethod(get_petsc_dir) #@staticmethod def chk_petsc_dir(petsc_dir): if not os.path.isdir(petsc_dir): log.error('invalid PETSC_DIR: %s (ignored)' % petsc_dir) return None return petsc_dir chk_petsc_dir = staticmethod(chk_petsc_dir) #@staticmethod def get_petsc_arch(petsc_dir, petsc_arch): if not petsc_dir: return None petsc_arch = os.path.expandvars(petsc_arch) if (not petsc_arch or '$PETSC_ARCH' in petsc_arch): petsc_arch = '' petsc_conf = os.path.join(petsc_dir, 'lib', 'petsc', 'conf') if os.path.isdir(petsc_conf): petscvariables = os.path.join(petsc_conf, 'petscvariables') if os.path.exists(petscvariables): conf = makefile(open(petscvariables, 'rt')) petsc_arch = conf.get('PETSC_ARCH', '') petsc_arch = petsc_arch.split(os.pathsep) petsc_arch = unique(petsc_arch) petsc_arch = [arch for arch in petsc_arch if arch] return config.chk_petsc_arch(petsc_dir, petsc_arch) get_petsc_arch = staticmethod(get_petsc_arch) #@staticmethod def chk_petsc_arch(petsc_dir, petsc_arch): valid_archs = [] for arch in petsc_arch: arch_path = os.path.join(petsc_dir, arch) if os.path.isdir(arch_path): valid_archs.append(arch) else: log.warn("invalid PETSC_ARCH: %s (ignored)" % arch) return valid_archs chk_petsc_arch = staticmethod(chk_petsc_arch) class build(_build): user_options = _build.user_options + cmd_petsc_opts def initialize_options(self): _build.initialize_options(self) self.petsc_dir = None self.petsc_arch = None def finalize_options(self): _build.finalize_options(self) self.set_undefined_options('config', ('petsc_dir', 'petsc_dir'), ('petsc_arch', 'petsc_arch')) self.petsc_dir = config.get_petsc_dir(self.petsc_dir) self.petsc_arch = config.get_petsc_arch(self.petsc_dir, self.petsc_arch) sub_commands = \ [('build_src', lambda *args: True)] + \ _build.sub_commands class build_src(Command): description = "build C sources from Cython files" user_options = [ ('force', 'f', "forcibly build everything (ignore file timestamps)"), ] boolean_options = ['force'] def initialize_options(self): self.force = False def finalize_options(self): self.set_undefined_options('build', ('force', 'force'), ) def run(self): sources = getattr(self, 'sources', []) for source in sources: cython_run( force=self.force, VERSION=cython_req(), **source ) class build_ext(_build_ext): user_options = _build_ext.user_options + cmd_petsc_opts def initialize_options(self): _build_ext.initialize_options(self) self.petsc_dir = None self.petsc_arch = None self._outputs = [] def finalize_options(self): _build_ext.finalize_options(self) self.set_undefined_options('build', ('petsc_dir', 'petsc_dir'), ('petsc_arch', 'petsc_arch')) if ((sys.platform.startswith('linux') or sys.platform.startswith('gnu') or sys.platform.startswith('sunos')) and sysconfig.get_config_var('Py_ENABLE_SHARED')): py_version = sysconfig.get_python_version() bad_pylib_dir = os.path.join(sys.prefix, "lib", "python" + py_version, "config") try: self.library_dirs.remove(bad_pylib_dir) except ValueError: pass pylib_dir = sysconfig.get_config_var("LIBDIR") if pylib_dir not in self.library_dirs: self.library_dirs.append(pylib_dir) if pylib_dir not in self.rpath: self.rpath.append(pylib_dir) if sys.exec_prefix == '/usr': self.library_dirs.remove(pylib_dir) self.rpath.remove(pylib_dir) def _copy_ext(self, ext): extclass = ext.__class__ fullname = self.get_ext_fullname(ext.name) modpath = str.split(fullname, '.') pkgpath = os.path.join('', *modpath[0:-1]) name = modpath[-1] sources = list(ext.sources) newext = extclass(name, sources) newext.__dict__.update(copy.deepcopy(ext.__dict__)) newext.name = name return pkgpath, newext def _build_ext_arch(self, ext, pkgpath, arch): build_temp = self.build_temp build_lib = self.build_lib try: self.build_temp = os.path.join(build_temp, arch) self.build_lib = os.path.join(build_lib, pkgpath, arch) _build_ext.build_extension(self, ext) finally: self.build_temp = build_temp self.build_lib = build_lib def get_config_arch(self, arch): return config.Configure(self.petsc_dir, arch) def build_extension(self, ext): if not isinstance(ext, Extension): return _build_ext.build_extension(self, ext) petsc_arch = self.petsc_arch if not petsc_arch: petsc_arch = [ None ] for arch in petsc_arch: config = self.get_config_arch(arch) ARCH = arch or config['PETSC_ARCH'] if ARCH not in self.PETSC_ARCH_LIST: self.PETSC_ARCH_LIST.append(ARCH) self.DESTDIR = config.DESTDIR ext.language = config.language config.log_info() pkgpath, newext = self._copy_ext(ext) config.configure(newext, self.compiler) self._build_ext_arch(newext, pkgpath, ARCH) def run(self): self.build_sources() _build_ext.run(self) def build_sources(self): if 'build_src' in self.distribution.cmdclass: self.run_command('build_src') def build_extensions(self, *args, **kargs): self.PETSC_ARCH_LIST = [] _build_ext.build_extensions(self, *args,**kargs) if not self.PETSC_ARCH_LIST: return self.build_configuration(self.PETSC_ARCH_LIST) def build_configuration(self, arch_list): # template, variables = self.get_config_data(arch_list) config_data = template % variables # build_lib = self.build_lib dist_name = self.distribution.get_name() config_file = os.path.join(build_lib, dist_name, 'lib', dist_name.replace('4py', '') + '.cfg') # def write_file(filename, data): with open(filename, 'w') as fh: fh.write(config_data) execute(write_file, (config_file, config_data), msg='writing %s' % config_file, verbose=self.verbose, dry_run=self.dry_run) def get_config_data(self, arch_list): DESTDIR = self.DESTDIR template = "\n".join([ "PETSC_DIR = %(PETSC_DIR)s", "PETSC_ARCH = %(PETSC_ARCH)s", ]) + "\n" variables = { 'PETSC_DIR' : strip_prefix(DESTDIR, self.petsc_dir), 'PETSC_ARCH' : os.path.pathsep.join(arch_list), } return template, variables def copy_extensions_to_source(self): build_py = self.get_finalized_command('build_py') for ext in self.extensions: inp_file, reg_file = self._get_inplace_equivalent(build_py, ext) arch_list = [''] if isinstance(ext, Extension) and self.petsc_arch: arch_list = self.petsc_arch[:] file_pairs = [] inp_head, inp_tail = os.path.split(inp_file) reg_head, reg_tail = os.path.split(reg_file) for arch in arch_list: inp_file = os.path.join(inp_head, arch, inp_tail) reg_file = os.path.join(reg_head, arch, reg_tail) file_pairs.append((inp_file, reg_file)) for inp_file, reg_file in file_pairs: if os.path.exists(reg_file) or not ext.optional: dest_dir, _ = os.path.split(inp_file) self.mkpath(dest_dir) self.copy_file(reg_file, inp_file, level=self.verbose) def get_outputs(self): self.check_extensions_list(self.extensions) outputs = [] for ext in self.extensions: fullname = self.get_ext_fullname(ext.name) filename = self.get_ext_filename(fullname) if isinstance(ext, Extension) and self.petsc_arch: head, tail = os.path.split(filename) for arch in self.petsc_arch: outfile = os.path.join(self.build_lib, head, arch, tail) outputs.append(outfile) else: outfile = os.path.join(self.build_lib, filename) outputs.append(outfile) outputs = list(set(outputs)) return outputs class install(_install): def initialize_options(self): with warnings.catch_warnings(): if setuptools: if hasattr(setuptools, 'SetuptoolsDeprecationWarning'): category = setuptools.SetuptoolsDeprecationWarning warnings.simplefilter('ignore', category) _install.initialize_options(self) self.old_and_unmanageable = True cmdclass_list = [ config, build, build_src, build_ext, install, ] # -------------------------------------------------------------------- def setup(**attrs): cmdclass = attrs.setdefault('cmdclass', {}) for cmd in cmdclass_list: cmdclass.setdefault(cmd.__name__, cmd) build_src.sources = attrs.pop('cython_sources', None) use_setup_requires = False # handle Cython requirement ourselves if setuptools and build_src.sources and use_setup_requires: version = cython_req() if not cython_chk(version, verbose=False): reqs = attrs.setdefault('setup_requires', []) reqs += ['Cython=='+version] return _setup(**attrs) # -------------------------------------------------------------------- if setuptools: try: from setuptools.command import egg_info as mod_egg_info _FileList = mod_egg_info.FileList class FileList(_FileList): def process_template_line(self, line): level = log.set_threshold(log.ERROR) try: _FileList.process_template_line(self, line) finally: log.set_threshold(level) mod_egg_info.FileList = FileList except (ImportError, AttributeError): pass # -------------------------------------------------------------------- def append(seq, item): if item not in seq: seq.append(item) def append_dict(conf, dct): for key, values in dct.items(): if key in conf: for value in values: if value not in conf[key]: conf[key].append(value) def unique(seq): res = [] for item in seq: if item not in res: res.append(item) return res def flaglist(flags): conf = { 'define_macros' : [], 'undef_macros' : [], 'include_dirs' : [], 'libraries' : [], 'library_dirs' : [], 'runtime_library_dirs': [], 'extra_compile_args' : [], 'extra_link_args' : [], } if type(flags) is str: flags = flags.split() switch = '-Wl,' newflags = [] linkopts = [] for f in flags: if f.startswith(switch): if len(f) > 4: append(linkopts, f[4:]) else: append(newflags, f) if linkopts: newflags.append(switch + ','.join(linkopts)) flags = newflags append_next_word = None for word in flags: if append_next_word is not None: append(append_next_word, word) append_next_word = None continue switch, value = word[0:2], word[2:] if switch == "-I": append(conf['include_dirs'], value) elif switch == "-D": try: idx = value.index("=") macro = (value[:idx], value[idx+1:]) except ValueError: macro = (value, None) append(conf['define_macros'], macro) elif switch == "-U": append(conf['undef_macros'], value) elif switch == "-l": append(conf['libraries'], value) elif switch == "-L": append(conf['library_dirs'], value) elif switch == "-R": append(conf['runtime_library_dirs'], value) elif word.startswith("-Wl"): linkopts = word.split(',') append_dict(conf, flaglist(linkopts[1:])) elif word == "-rpath": append_next_word = conf['runtime_library_dirs'] elif word == "-Xlinker": append_next_word = conf['extra_link_args'] else: #log.warn("unrecognized flag '%s'" % word) pass return conf def prepend_to_flags(path, flags): """Prepend a path to compiler flags with absolute paths""" if not path: return flags def append_path(m): switch = m.group(1) open_quote = m.group(4) old_path = m.group(5) close_quote = m.group(6) if os.path.isabs(old_path): moded_path = os.path.normpath(path + os.path.sep + old_path) return switch + open_quote + moded_path + close_quote return m.group(0) return re.sub(r'((^|\s+)(-I|-L))(\s*["\']?)(\S+)(["\']?)', append_path, flags) def strip_prefix(prefix, string): if not prefix: return string return re.sub(r'^' + prefix, '', string) # -------------------------------------------------------------------- from distutils.text_file import TextFile # Regexes needed for parsing Makefile-like syntaxes import re as _re _variable_rx = _re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") _findvar1_rx = _re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") _findvar2_rx = _re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") def makefile(fileobj, dct=None): """Parse a Makefile-style file. A dictionary containing name/value pairs is returned. If an optional dictionary is passed in as the second argument, it is used instead of a new dictionary. """ fp = TextFile(file=fileobj, strip_comments=1, skip_blanks=1, join_lines=1) if dct is None: dct = {} done = {} notdone = {} while 1: line = fp.readline() if line is None: # eof break m = _variable_rx.match(line) if m: n, v = m.group(1, 2) v = str.strip(v) if "$" in v: notdone[n] = v else: try: v = int(v) except ValueError: pass done[n] = v try: del notdone[n] except KeyError: pass fp.close() # do variable interpolation here while notdone: for name in list(notdone.keys()): value = notdone[name] m = _findvar1_rx.search(value) or _findvar2_rx.search(value) if m: n = m.group(1) found = True if n in done: item = str(done[n]) elif n in notdone: # get it on a subsequent round found = False else: done[n] = item = "" if found: after = value[m.end():] value = value[:m.start()] + item + after if "$" in after: notdone[name] = value else: try: value = int(value) except ValueError: done[name] = str.strip(value) else: done[name] = value del notdone[name] else: # bogus variable reference; # just drop it since we can't deal del notdone[name] # save the results in the global dictionary dct.update(done) return dct # -------------------------------------------------------------------- slepc4py-3.19.2/conf/confslepc.py000066400000000000000000000217021454104675500166410ustar00rootroot00000000000000import os import sys from confpetsc import setup as _setup from confpetsc import Extension from confpetsc import config as _config from confpetsc import build as _build from confpetsc import build_src as _build_src from confpetsc import build_ext as _build_ext from confpetsc import install as _install from confpetsc import log from confpetsc import makefile from confpetsc import strip_prefix from confpetsc import split_quoted from confpetsc import DistutilsError from confpetsc import PetscConfig # -------------------------------------------------------------------- class SlepcConfig(PetscConfig): def __init__(self, slepc_dir, petsc_dir, petsc_arch, dest_dir=None): PetscConfig.__init__(self, petsc_dir, petsc_arch, dest_dir='') if dest_dir is None: dest_dir = os.environ.get('DESTDIR') if not slepc_dir: raise DistutilsError("SLEPc not found") if not os.path.isdir(slepc_dir): raise DistutilsError("invalid SLEPC_DIR") self.sversion = self._get_slepc_version(slepc_dir) self._get_slepc_config(petsc_dir,slepc_dir) self.SLEPC_DIR = self['SLEPC_DIR'] self.SLEPC_DESTDIR = dest_dir self.SLEPC_LIB = self['SLEPC_LIB'] self.SLEPC_EXTERNAL_LIB_DIR = self['SLEPC_EXTERNAL_LIB_DIR'] def _get_slepc_version(self, slepc_dir): import re version_re = { 'major' : re.compile(r"#define\s+SLEPC_VERSION_MAJOR\s+(\d+)"), 'minor' : re.compile(r"#define\s+SLEPC_VERSION_MINOR\s+(\d+)"), 'micro' : re.compile(r"#define\s+SLEPC_VERSION_SUBMINOR\s+(\d+)"), 'release': re.compile(r"#define\s+SLEPC_VERSION_RELEASE\s+(-*\d+)"), } slepcversion_h = os.path.join(slepc_dir, 'include', 'slepcversion.h') with open(slepcversion_h, 'rt') as f: data = f.read() major = int(version_re['major'].search(data).groups()[0]) minor = int(version_re['minor'].search(data).groups()[0]) micro = int(version_re['micro'].search(data).groups()[0]) release = int(version_re['release'].search(data).groups()[0]) return (major, minor, micro), (release == 1) def _get_slepc_config(self, petsc_dir, slepc_dir): from os.path import join, isdir PETSC_DIR = petsc_dir SLEPC_DIR = slepc_dir PETSC_ARCH = self.PETSC_ARCH confdir = join('lib', 'slepc', 'conf') if not (PETSC_ARCH and isdir(join(SLEPC_DIR, PETSC_ARCH))): PETSC_ARCH = '' variables = join(SLEPC_DIR, confdir, 'slepc_variables') slepcvariables = join(SLEPC_DIR, PETSC_ARCH, confdir, 'slepcvariables') with open(variables) as f: contents = f.read() with open(slepcvariables) as f: contents += f.read() try: from cStringIO import StringIO except ImportError: from io import StringIO confstr = 'PETSC_DIR = %s\n' % PETSC_DIR confstr += 'PETSC_ARCH = %s\n' % PETSC_ARCH confstr = 'SLEPC_DIR = %s\n' % SLEPC_DIR confstr += contents slepc_confdict = makefile(StringIO(confstr)) self.configdict['SLEPC_DIR'] = SLEPC_DIR self.configdict['SLEPC_LIB'] = slepc_confdict['SLEPC_LIB'] dirlist = [] for external in [ 'ARPACK_LIB', 'BLOPEX_LIB', 'ELPA_LIB', 'EVSL_LIB', 'HPDDM_LIB', 'PRIMME_LIB', 'SLICOT_LIB', 'TRLAN_LIB', ]: flags = split_quoted(slepc_confdict[external]) for entry in [lib[2:] for lib in flags if lib.startswith('-L')]: if entry not in dirlist: dirlist.append(entry) self.configdict['SLEPC_EXTERNAL_LIB_DIR'] = dirlist def configure_extension(self, extension): PetscConfig.configure_extension(self, extension) SLEPC_DIR = self.SLEPC_DIR PETSC_ARCH = self.PETSC_ARCH SLEPC_DESTDIR = self.SLEPC_DESTDIR # take into account the case of prefix PETSc with non-prefix SLEPc SLEPC_ARCH_DIR = PETSC_ARCH or os.environ.get('PETSC_ARCH', '') # includes and libraries SLEPC_INCLUDE = [ os.path.join(SLEPC_DIR, SLEPC_ARCH_DIR, 'include'), os.path.join(SLEPC_DIR, 'include'), ] SLEPC_LIB_DIR = [ os.path.join(SLEPC_DIR, SLEPC_ARCH_DIR, 'lib'), os.path.join(SLEPC_DIR, 'lib'), ] + self.SLEPC_EXTERNAL_LIB_DIR slepc_cfg = { } slepc_cfg['include_dirs'] = SLEPC_INCLUDE slepc_cfg['library_dirs'] = SLEPC_LIB_DIR slepc_cfg['libraries'] = [ lib[2:] for lib in split_quoted(self.SLEPC_LIB) if lib.startswith('-l') ] slepc_cfg['runtime_library_dirs'] = [ strip_prefix(SLEPC_DESTDIR, d) for d in SLEPC_LIB_DIR ] self._configure_ext(extension, slepc_cfg, append=True) if self['BUILDSHAREDLIB'] == 'no': from petsc4py.lib import ImportPETSc PETSc = ImportPETSc(PETSC_ARCH) extension.extra_objects.append(PETSc.__file__) # extra configuration cflags = [] extension.extra_compile_args.extend(cflags) lflags = [] extension.extra_link_args.extend(lflags) def log_info(self): if not self.SLEPC_DIR: return version = ".".join([str(i) for i in self.sversion[0]]) release = ("development", "release")[self.sversion[1]] version_info = version + ' ' + release log.info('SLEPC_DIR: %s' % self.SLEPC_DIR) log.info('version: %s' % version_info) PetscConfig.log_info(self) # -------------------------------------------------------------------- cmd_slepc_opts = [ ('slepc-dir=', None, "define SLEPC_DIR, overriding environmental variable.") ] class config(_config): Configure = SlepcConfig user_options = _config.user_options + cmd_slepc_opts def initialize_options(self): _config.initialize_options(self) self.slepc_dir = None def get_config_arch(self, arch): return config.Configure(self.slepc_dir, self.petsc_dir, arch) def run(self): self.slepc_dir = config.get_slepc_dir(self.slepc_dir) if self.slepc_dir is None: return log.info('-' * 70) log.info('SLEPC_DIR: %s' % self.slepc_dir) _config.run(self) #@staticmethod def get_slepc_dir(slepc_dir): if not slepc_dir: return None slepc_dir = os.path.expandvars(slepc_dir) if not slepc_dir or '$SLEPC_DIR' in slepc_dir: try: import slepc slepc_dir = slepc.get_slepc_dir() except ImportError: log.warn("SLEPC_DIR not specified") return None slepc_dir = os.path.expanduser(slepc_dir) slepc_dir = os.path.abspath(slepc_dir) if not os.path.isdir(slepc_dir): log.warn('invalid SLEPC_DIR: %s' % slepc_dir) return None return slepc_dir get_slepc_dir = staticmethod(get_slepc_dir) class build(_build): user_options = _build.user_options + cmd_slepc_opts def initialize_options(self): _build.initialize_options(self) self.slepc_dir = None def finalize_options(self): _build.finalize_options(self) self.set_undefined_options('config', ('slepc_dir', 'slepc_dir'),) self.slepc_dir = config.get_slepc_dir(self.slepc_dir) class build_src(_build_src): pass class build_ext(_build_ext): user_options = _build_ext.user_options + cmd_slepc_opts def initialize_options(self): _build_ext.initialize_options(self) self.slepc_dir = None def finalize_options(self): _build_ext.finalize_options(self) self.set_undefined_options('build', ('slepc_dir', 'slepc_dir')) def get_config_arch(self, arch): return config.Configure(self.slepc_dir, self.petsc_dir, arch) def get_config_data(self, arch_list): DESTDIR = None for arch in arch_list: conf = self.get_config_arch(arch) DESTDIR = conf.SLEPC_DESTDIR # all archs will have same value template = "\n".join([ "SLEPC_DIR = %(SLEPC_DIR)s", "PETSC_DIR = %(PETSC_DIR)s", "PETSC_ARCH = %(PETSC_ARCH)s", ]) + "\n" variables = { 'SLEPC_DIR' : strip_prefix(DESTDIR, self.slepc_dir), 'PETSC_DIR' : self.petsc_dir, 'PETSC_ARCH' : os.path.pathsep.join(arch_list) } return template, variables class install(_install): pass cmdclass_list = [ config, build, build_src, build_ext, install, ] # -------------------------------------------------------------------- def setup(**attrs): cmdclass = attrs.setdefault('cmdclass', {}) for cmd in cmdclass_list: cmdclass.setdefault(cmd.__name__, cmd) return _setup(**attrs) # -------------------------------------------------------------------- slepc4py-3.19.2/conf/cythonize.py000077500000000000000000000024451454104675500167070ustar00rootroot00000000000000#!/usr/bin/env python """Run Cython with custom options.""" import os import sys appdir = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, appdir) # import cyautodoc # noqa: F401,E402 from Cython.Compiler.Main import main as cython_main # noqa: E402 def cythonize(args=None): """Run `cython --3str --cleanup 3 ...`.""" if args is None: argv = sys.argv[:] else: argv = [os.path.abspath(__file__)] + list(args) if '--cleanup' not in argv: argv[1:1] = ['--cleanup', '3'] if '--3str' not in argv: argv[1:1] = ['--3str'] cwd = os.getcwd() sys_argv = sys.argv[:] try: sys.argv[:] = argv cython_main(command_line=1) return 0 except SystemExit as exc: return exc.code finally: os.chdir(cwd) sys.argv[:] = sys_argv def main(): """Entry-point to run Cython with custom options.""" args = sys.argv[1:] if not args: topdir = os.path.dirname(appdir) srcdir = os.path.join(topdir, 'src') source = os.path.join('slepc4py', 'SLEPc.pyx') target = os.path.join('slepc4py', 'SLEPc.c') args += ['--working', srcdir] args += [source, '--output-file', target] sys.exit(cythonize(args)) if __name__ == "__main__": main() slepc4py-3.19.2/conf/cythonize.sh000077500000000000000000000002231454104675500166610ustar00rootroot00000000000000#!/bin/sh topdir=$(cd $(dirname "$0")/.. && pwd) python$py "$topdir/conf/cythonize.py" \ --working "$topdir/src" $@ \ "slepc4py/SLEPc.pyx" slepc4py-3.19.2/conf/epydoc.cfg000066400000000000000000000105531454104675500162610ustar00rootroot00000000000000[epydoc] # Epydoc section marker (required by ConfigParser) # The list of objects to document. Objects can be named using # dotted names, module filenames, or package directory names. # Alases for this option include "objects" and "values". modules: slepc4py # The type of output that should be generated. Should be one # of: html, text, latex, dvi, ps, pdf. #output: html # The path to the output directory. May be relative or absolute. #target: docs/html/ # An integer indicating how verbose epydoc should be. The default # value is 0; negative values will suppress warnings and errors; # positive values will give more verbose output. verbosity: 0 # A boolean value indicating that Epydoc should show a tracaback # in case of unexpected error. By default don't show tracebacks #debug: 0 # If True, don't try to use colors or cursor control when doing # textual output. The default False assumes a rich text prompt #simple-term: 0 ### Generation options # The default markup language for docstrings, for modules that do # not define __docformat__. Defaults to epytext. docformat: reStructuredText # Whether or not parsing should be used to examine objects. parse: yes # Whether or not introspection should be used to examine objects. introspect: yes # Don't examine in any way the modules whose dotted name match this # regular expression pattern. exclude: slepc4py.__main__ # Don't perform introspection on the modules whose dotted name match this # regular expression pattern. #exclude-introspect # Don't perform parsing on the modules whose dotted name match this # regular expression pattern. #exclude-parse: # The format for showing inheritance objects. # It should be one of: 'grouped', 'listed', 'included'. inheritance: listed # Whether or not to include private variables. (Even if included, # private variables will be hidden by default.) private: yes # Whether or not to list each module's imports. imports: no # Whether or not to include syntax highlighted source code in # the output (HTML only). sourcecode: no # Whether or not to include a a page with Epydoc log, containing # effective option at the time of generation and the reported logs. include-log: no ### Output options # The documented project's name. name: SLEPc for Python # The documented project's URL. url: https://gitlab.com/slepc/slepc # The CSS stylesheet for HTML output. Can be the name of a builtin # stylesheet, or the name of a file. css: white # HTML code for the project link in the navigation bar. If left # unspecified, the project link will be generated based on the # project's name and URL. #link: My Cool Project # The "top" page for the documentation. Can be a URL, the name # of a module or class, or one of the special names "trees.html", # "indices.html", or "help.html" #top: os.path # An alternative help file. The named file should contain the # body of an HTML file; navigation bars will be added to it. #help: my_helpfile.html # Whether or not to include a frames-based table of contents. frames: yes # Whether each class should be listed in its own section when # generating LaTeX or PDF output. separate-classes: no ### API linking options # Define a new API document. A new interpreted text role # will be created #external-api: epydoc # Use the records in this file to resolve objects in the API named NAME. #external-api-file: epydoc:api-objects.txt # Use this URL prefix to configure the string returned for external API. #external-api-root: epydoc:http://epydoc.sourceforge.net/api ### Graph options # The list of graph types that should be automatically included # in the output. Graphs are generated using the Graphviz "dot" # executable. Graph types include: "classtree", "callgraph", # "umlclasstree". Use "all" to include all graph types graph: classtree # The path to the Graphviz "dot" executable, used to generate # graphs. #dotpath: /usr/local/bin/dot # The name of one or more pstat files (generated by the profile # or hotshot module). These are used to generate call graphs. #pstat: profile.out # Specify the font used to generate Graphviz graphs. # (e.g., helvetica or times). graph-font: Helvetica # Specify the font size used to generate Graphviz graphs. graph-font-size: 10 ### Return value options # The condition upon which Epydoc should exit with a non-zero # exit status. Possible values are error, warning, docstring_warning #fail-on: error slepc4py-3.19.2/conf/epydocify.py000077500000000000000000000055051454104675500166660ustar00rootroot00000000000000#!/usr/bin/env python # -------------------------------------------------------------------- from slepc4py import SLEPc # -------------------------------------------------------------------- try: from docutils.nodes import NodeVisitor NodeVisitor.unknown_visit = lambda self, node: None NodeVisitor.unknown_departure = lambda self, node: None except ImportError: pass try: # epydoc 3.0.1 + docutils 0.6 from docutils.nodes import Text from UserString import UserString if not isinstance(Text, UserString): def Text_get_data(s): try: return s._data except AttributeError: return s.astext() def Text_set_data(s, d): s.astext = lambda: d s._data = d Text.data = property(Text_get_data, Text_set_data) except ImportError: pass # -------------------------------------------------------------------- from epydoc.docwriter import dotgraph import re dotgraph._DOT_VERSION_RE = \ re.compile(r'dot (?:- Graphviz )version ([\d\.]+)') try: dotgraph.DotGraph.DEFAULT_HTML_IMAGE_FORMAT dotgraph.DotGraph.DEFAULT_HTML_IMAGE_FORMAT = 'png' except AttributeError: DotGraph_to_html = dotgraph.DotGraph.to_html DotGraph_run_dot = dotgraph.DotGraph._run_dot def to_html(self, image_file, image_url, center=True): if image_file[-4:] == '.gif': image_file = image_file[:-4] + '.png' if image_url[-4:] == '.gif': image_url = image_url[:-4] + '.png' return DotGraph_to_html(self, image_file, image_url) def _run_dot(self, *options): if '-Tgif' in options: opts = list(options) for i, o in enumerate(opts): if o == '-Tgif': opts[i] = '-Tpng' options = type(options)(opts) return DotGraph_run_dot(self, *options) dotgraph.DotGraph.to_html = to_html dotgraph.DotGraph._run_dot = _run_dot # -------------------------------------------------------------------- import re _SIGNATURE_RE = re.compile( # Class name (for builtin methods) r'^\s*((?P\w+)\.)?' + # The function name r'(?P\w+)' + # The parameters r'\(((?P(?:self|cls|mcs)),?)?(?P.*)\)' + # The return value (optional) r'(\s*(->)\s*(?P\S.*?))?'+ # The end marker r'\s*(\n|\s+(--|<=+>)\s+|$|\.\s+|\.\n)') from epydoc import docstringparser as dsp dsp._SIGNATURE_RE = _SIGNATURE_RE # -------------------------------------------------------------------- import sys, os import epydoc.cli def epydocify(): dirname = os.path.dirname(__file__) config = os.path.join(dirname, 'epydoc.cfg') sys.argv.append('--config=' + config) epydoc.cli.cli() if __name__ == '__main__': epydocify() # -------------------------------------------------------------------- slepc4py-3.19.2/demo/000077500000000000000000000000001454104675500143105ustar00rootroot00000000000000slepc4py-3.19.2/demo/ex1.py000066400000000000000000000033131454104675500153570ustar00rootroot00000000000000import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc import numpy opts = PETSc.Options() n = opts.getInt('n', 30) A = PETSc.Mat(); A.create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() # first row if rstart == 0: A[0, :2] = [2, -1] rstart += 1 # last row if rend == n: A[n-1, -2:] = [-1, 2] rend -= 1 # other rows for i in range(rstart, rend): A[i, i-1:i+2] = [-1, 2, -1] A.assemble() E = SLEPc.EPS(); E.create() E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) history = [] def monitor(eps, its, nconv, eig, err): if nconv 0: # Create the results vectors vr, vi = A.createVecs() # Print() Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, vr, vi) error = E.computeError(i) if k.imag != 0.0: Print( " %9f%+9f j %12g" % (k.real, k.imag, error) ) else: Print( " %12f %12g" % (k.real, error) ) Print() slepc4py-3.19.2/demo/ex10.py000066400000000000000000000212711454104675500154420ustar00rootroot00000000000000""" This example program solves the Laplace problem using the Proper Orthogonal Decomposition (POD) reduced-order modeling technique. For a full description of the technique the reader is referred to the papers: [1] K. Kunisch and S. Volkwein. Galerkin proper orthogonal decomposition methods for a general equation in fluid dynamics. SIAM Journal on Numerical Analusis, 40(2):492-515, 2003 [2] S. Volkwein, Optimal control of a phase-field model using the proper orthogonal decomposition, Z. Angew. Math. Mech., 81(2001):83-97 The method is split into an offline (computationally intensive) and an online (computationally cheap) phase. This has many applications including real-time simulation, uncertainty quantification and inverse problems, where similar models must be evaluated quickly and many times. Offline phase: 1. A set of solution snapshots of the 1D Laplace problem in the full problem space are constructed and assembled into the columns of a dense matrix S. 2. A standard eigenvalue decomposition is performed on the matrix S.T*S. 3. The eigenvectors and eigenvalues are projected back to the original eigenvalue problem S. 4. The leading eigenvectors then form the POD basis. Online phase: 1. The operator corresponding to the discrete Laplacian is projected onto the POD basis. 2. The operator corresponding to the right-hand side is projected onto the POD basis. 3. The reduced (dense) problem expressed in the POD basis is solved. 4. The reduced solution is projected back to the full problem space. Authors: Elisa Schenone Jack S. Hale """ try: range = xrange except: pass import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc import numpy import random import math def construct_operator(m): """ Standard symmetric eigenproblem corresponding to the Laplacian operator in 1 dimension with homogeneous Dirichlet boundary conditions. """ # Create matrix for 1D Laplacian operator A = PETSc.Mat().create(PETSc.COMM_SELF) A.setSizes([m, m]) A.setFromOptions() A.setUp() # Fill matrix hx = 1.0/(m-1) # x grid spacing diagv = 2.0/hx offdx = -1.0/hx Istart, Iend = A.getOwnershipRange() for i in range(Istart, Iend): if i != 0 and i != (m - 1): A[i, i] = diagv if i > 1: A[i, i - 1] = offdx if i < m - 2: A[i, i + 1] = offdx else: A[i, i] = 1. A.assemble() return A def set_problem_rhs(m): """ Set bell-shape function as the solution of the Laplacian problem in 1 dimension with homogeneous Dirichlet boundary conditions and compute the associated discrete RHS. """ # Create 1D mass matrix operator M = PETSc.Mat().create(PETSc.COMM_SELF) M.setSizes([m, m]) M.setFromOptions() M.setUp() # Fill matrix hx = 1.0/(m-1) # x grid spacing diagv = hx/3 offdx = hx/6 Istart, Iend = M.getOwnershipRange() for i in range(Istart, Iend): if i != 0 and i != (m - 1): M[i, i] = 2*diagv else: M[i, i] = diagv if i > 1: M[i, i - 1] = offdx if i < m - 2: M[i, i + 1] = offdx M.assemble() x_0 = 0.3 x_f = 0.7 mu = x_0 + (x_f - x_0)*random.random() sigma = 0.1**2 uex, f = M.createVecs() for j in range(Istart, Iend): value = 2/sigma * math.exp(-(hx*j - mu)**2/sigma) * (1 - 2/sigma * (hx*j - mu)**2 ) f.setValue(j, value) value = math.exp(-(hx*j - mu)**2/sigma) uex.setValue(j, value) f.assemble() uex.assemble() RHS = f.duplicate() M.mult(f, RHS) RHS.setValue(0, 0.) RHS.setValue(m-1, 0.) RHS.assemble() return RHS, uex def solve_laplace_problem(A, RHS): """ Solve 1D Laplace problem with FEM. """ u = A.createVecs('right') r, c = A.getOrdering("natural") A.factorILU(r, c) A.solve(RHS, u) A.setUnfactored() return u def solve_laplace_problem_pod(A, RHS, u): """ Solve 1D Laplace problem with POD (dense matrix). """ ksp = PETSc.KSP().create(PETSc.COMM_SELF) ksp.setOperators(A) ksp.setType('preonly') pc = ksp.getPC() pc.setType('none') ksp.setFromOptions() ksp.solve(RHS, u) return u def construct_snapshot_matrix(A, N, m): """ Set N solution of the 1D Laplace problem as columns of a matrix (snapshot matrix). Note: For simplicity we do not perform a linear solve, but use some analytical solution: z(x) = exp(-(x - mu)**2 / sigma) """ snapshots = PETSc.Mat().create(PETSc.COMM_SELF) snapshots.setSizes([m, N]) snapshots.setType('seqdense') snapshots.setUp() Istart, Iend = snapshots.getOwnershipRange() hx = 1.0/(m - 1) x_0 = 0.3 x_f = 0.7 sigma = 0.1**2 for i in range(N): mu = x_0 + (x_f - x_0)*random.random() for j in range(Istart, Iend): value = math.exp(-(hx*j - mu)**2/sigma) snapshots.setValue(j, i, value) snapshots.assemble() return snapshots def solve_eigenproblem(snapshots, N): """ Solve the eigenvalue problem: the eigenvectors of this problem form the POD basis. """ print('Solving POD basis eigenproblem using eigensolver...') Es = SLEPc.EPS() Es.create(PETSc.COMM_SELF) Es.setDimensions(N) Es.setProblemType(SLEPc.EPS.ProblemType.NHEP) Es.setTolerances(1.0e-8, 500); Es.setKrylovSchurRestart(0.6) Es.setWhichEigenpairs(SLEPc.EPS.Which.LARGEST_REAL) Es.setOperators(snapshots) Es.setFromOptions() Es.solve() print('Solved POD basis eigenproblem.') return Es def project_STS_eigenvectors_to_S_eigenvectors(bvEs, S): sizes = S.getSizes()[0] N = bvEs.getActiveColumns()[1] bv = SLEPc.BV().create(PETSc.COMM_SELF) bv.setSizes(sizes, N) bv.setActiveColumns(0, N) bv.setFromOptions() tmpvec2 = S.createVecs('left') for i in range(N): tmpvec = bvEs.getColumn(i) S.mult(tmpvec, tmpvec2) bv.insertVec(i, tmpvec2) bvEs.restoreColumn(i, tmpvec) return bv def project_reduced_to_full_space(alpha, bv): uu = bv.getColumn(0) uPOD = uu.duplicate() bv.restoreColumn(0,uu) scatter, Wr = PETSc.Scatter.toAll(alpha) scatter.begin(alpha, Wr, PETSc.InsertMode.INSERT, PETSc.ScatterMode.FORWARD) scatter.end(alpha, Wr, PETSc.InsertMode.INSERT, PETSc.ScatterMode.FORWARD) PODcoeff = Wr.getArray(readonly=1) bv.multVec(1., 0., uPOD, PODcoeff) return uPOD def main(): problem_dim = 200 num_snapshots = 30 num_pod_basis_functions = 8 assert(num_pod_basis_functions <= num_snapshots) A = construct_operator(problem_dim) S = construct_snapshot_matrix(A, num_snapshots, problem_dim) # Instead of solving the SVD of S, we solve the standard # eigenvalue problem on S.T*S STS = S.transposeMatMult(S) Es = solve_eigenproblem(STS, num_pod_basis_functions) nconv = Es.getConverged() print('Number of converged eigenvalues: %i' % nconv) Es.view() # get the EPS solution in a BV object bvEs = Es.getBV() bvEs.setActiveColumns(0, num_pod_basis_functions) # set the bv POD basis bv = project_STS_eigenvectors_to_S_eigenvectors(bvEs, S) # rescale the eigenvectors for i in range(num_pod_basis_functions): ll = Es.getEigenvalue(i) print('Eigenvalue '+str(i)+': '+str(ll.real)) bv.scaleColumn(i,1.0/math.sqrt(ll.real)) print('--------------------------------') # Verify that the active columns of bv form an orthonormal subspace, i.e. that X^H*X = Id print('Check that bv.dot(bv) is close to the identity matrix') XtX = bv.dot(bv) XtX.view() XtX_array = XtX.getDenseArray() n,m = XtX_array.shape assert numpy.allclose(XtX_array, numpy.eye(n, m)) print('--------------------------------') print('Solve the problem with POD') # Project the linear operator A Ared = bv.matProject(A,bv) # Set the RHS and the exact solution RHS, uex = set_problem_rhs(problem_dim) # Project the RHS on the POD basis RHSred = PETSc.Vec().createWithArray(bv.dotVec(RHS)) # Solve the problem with POD alpha = Ared.createVecs('right') alpha = solve_laplace_problem_pod(Ared,RHSred,alpha) # Project the POD solution back to the FE space uPOD = project_reduced_to_full_space(alpha, bv) # Compute the L2 and Linf norm of the error error = uex.copy() error.axpy(-1,uPOD) errorL2 = math.sqrt(error.dot(error).real) print('The L2-norm of the error is: '+str(errorL2)) print("NORMAL END") if __name__ == '__main__': main() slepc4py-3.19.2/demo/ex11.py000066400000000000000000000033631454104675500154450ustar00rootroot00000000000000try: range = xrange except: pass import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print def construct_operator(m, n): """ Standard symmetric eigenproblem corresponding to the Laplacian operator in 2 dimensions. """ # Create matrix for 2D Laplacian operator A = PETSc.Mat().create() A.setSizes([m*n, m*n]) A.setFromOptions( ) A.setUp() # Fill matrix hx = 1.0/(m-1) # x grid spacing hy = 1.0/(n-1) # y grid spacing diagv = 2.0*hy/hx + 2.0*hx/hy offdx = -1.0*hy/hx offdy = -1.0*hx/hy Istart, Iend = A.getOwnershipRange() for I in range(Istart, Iend) : A[I,I] = diagv i = I//n # map row number to j = I - i*n # grid coordinates if i> 0 : J = I-n; A[I,J] = offdx if i< m-1: J = I+n; A[I,J] = offdx if j> 0 : J = I-1; A[I,J] = offdy if j< n-1: J = I+1; A[I,J] = offdy A.assemble() return A def main(): opts = PETSc.Options() n = opts.getInt('n', 32) m = opts.getInt('m', 32) Print("2-D Laplacian Eigenproblem solved with contour integral, " "N=%d (%dx%d grid)\n" % (m*n, m, n)) A = construct_operator(m,n) # Solver object E = SLEPc.EPS().create() E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) E.setType(SLEPc.EPS.Type.CISS) # Define region of interest R = E.getRG() R.setType(SLEPc.RG.Type.ELLIPSE) R.setEllipseParameters(0.0,0.2,0.1) E.setFromOptions() # Compute solution E.solve() # Print solution vw = PETSc.Viewer.STDOUT() vw.pushFormat(PETSc.Viewer.Format.ASCII_INFO_DETAIL) E.errorView(viewer=vw) vw.popFormat() if __name__ == '__main__': main() slepc4py-3.19.2/demo/ex12.py000066400000000000000000000022511454104675500154410ustar00rootroot00000000000000# Tests use of setArbitrarySelection() import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc import numpy opts = PETSc.Options() n = opts.getInt('n', 30) # Create matrix tridiag([-1 0 -1]) A = PETSc.Mat(); A.create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() for i in range(rstart, rend): if i>0: A[i, i-1] = -1 if i0: sxr, sxi = A.createVecs() E.getEigenpair(0, sxr, sxi) vw.pushFormat(PETSc.Viewer.Format.ASCII_INFO_DETAIL) E.errorView(viewer=vw) def myArbitrarySel(evalue, xr, xi, sxr): return abs(xr.dot(sxr)) E.setArbitrarySelection(myArbitrarySel,sxr) E.setWhichEigenpairs(SLEPc.EPS.Which.LARGEST_MAGNITUDE) E.solve() E.errorView(viewer=vw) vw.popFormat() else: Print( "No eigenpairs converged" ) slepc4py-3.19.2/demo/ex13.py000066400000000000000000000171711454104675500154510ustar00rootroot00000000000000# ------------------------------------------------------------------------ # Solve nonlinear (in eigenvalue k) EVP using the NEP module # # u_xx(x) + nc^2*k^2*u(x) + g(k)*D0*k^2*u(x) = 0 # # where g(k) = gt/(k-ka + i*gt) # ka=8.0, gt=0.5 # D0 = 0.5 # nc = 1.2 # # u(0) = 0 # u_x(1) = i*k*u(1) ## ## # # Discretization: # # n grid points: x1=0.0 .. xn=1.0 # # u1 is at x=0.0 # un is at x=1.0 # # step size h = 1/(n-1) # # u_xx(x_i) = 1/h**2 * (u_im1 - 2 u_i + u_ip1) # = 1/h**2 dot((1, -2, 1), (u_im1, u_i, u_ip1)) # # BC x=0: u1 = 0.0 # BC x=1: u'(1) ~ 1/2*( u'(1+h/2) + u'(1-h/2) ) # = 1/2*( (u_np1-u_n)/h + (u_n-u_nm1)/h ) # = 1/(2h)*(u_np1 - u_nm1) = ik * u_n # => u_np1 = 2i*h*k u_n + u_nm1 # # laplace term for un: # 1/h**2 (u_nm1 - 2u_n + u_np1) # = 1/h**2 (u_nm1 - 2u_n + 2ihk u_n + u_nm1) # = 1/h**2 (2 u_nm1 + (2ihk - 2) u_n) # = 1/h**2 dot((2, 2ihk -2), (u_nm1, u_n)) # # The above discretization allows us to write the nonlinear PDE # in the following split-operator form # # {A + k^2 nc^2 Id + g(k)*k^2*D0 Id + 2ik/h D} u = 0 # # f1 = 1, f2 = nc^2 k^2, f3 = g(k)k^2D0, f4 = 2ik/h # # A = (1 0 0 ... ) # (0 ....... ) # (0 ....... ) # (0 ....... ) # (......... ) # # Id = (0 0 0 ... ) # (0 1 0 ... ) # (0 0 1 ... ) # (0 0 0 ... ) # (......... ) # # D = (0 0 0 ... ) # (0 ....... ) # (0 ....... ) # (0 ....... ) # (......... ) # # ------------------------------------------------------------------------ import sys import slepc4py slepc4py.init(sys.argv) # isort:skip import numpy as np try: import scipy import scipy.optimize except ImportError: scipy = None from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print if not np.issubdtype(PETSc.ScalarType, np.complexfloating): Print("Demo should only be executed with complex PETSc scalars") exit(0) def solve(n): L = 1.0 h = L / (n - 1) nc = 1.2 ka = 10.0 gt = 4.0 D0 = 0.5 A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() A.setOption(PETSc.Mat.Option.HERMITIAN, False) rstart, rend = A.getOwnershipRange() d0, d1, d2 = ( 1 / h**2, -2 / h**2, 1 / h**2, ) Print(f"dterms={(d0, d1, d2)}") if rstart == 0: # dirichlet boundary condition at the left lead A[0, 0] = 1.0 A[0, 1] = 0.0 A[1, 0] = 0.0 A[1, 1] = d1 A[1, 2] = d2 rstart += 2 if rend == n: # at x=1.0 neumann boundary condition (not handled here but in a # different matrix (D)) A[n - 1, n - 2] = 2.0 / h**2 A[n - 1, n - 1] = (-2) / h**2 # + 2j*k*h / h**2 (neumann) rend -= 1 for i in range(rstart, rend): A[i, i - 1 : i + 2] = [d0, d1, d2] A.assemble() Id = PETSc.Mat().create() Id.setSizes([n, n]) Id.setFromOptions() Id.setUp() Id.setOption(PETSc.Mat.Option.HERMITIAN, True) rstart, rend = Id.getOwnershipRange() if rstart == 0: # due to dirichlet BC rstart += 1 for i in range(rstart, rend): Id[i, i] = 1.0 Id.assemble() D = PETSc.Mat().create() D.setSizes([n, n]) D.setFromOptions() D.setUp() D.setOption(PETSc.Mat.Option.HERMITIAN, True) _, rend = D.getOwnershipRange() if rend == n: D[n - 1, n - 1] = 1 D.assemble() Print(f"DOF: {A.getInfo()['nz_used']}, MEM: {A.getInfo()['memory']}") f1 = SLEPc.FN().create() f1.setType(SLEPc.FN.Type.RATIONAL) f1.setRationalNumerator([1.0]) f2 = SLEPc.FN().create() f2.setType(SLEPc.FN.Type.RATIONAL) f2.setRationalNumerator([nc**2, 0.0, 0.0]) f3 = SLEPc.FN().create() f3.setType(SLEPc.FN.Type.RATIONAL) f3.setRationalNumerator([D0 * gt, 0.0, 0.0]) f3.setRationalDenominator([1.0, -ka + 1j * gt]) f4 = SLEPc.FN().create() f4.setType(SLEPc.FN.Type.RATIONAL) f4.setRationalNumerator([2j / h, 0]) # Setup the solver nep = SLEPc.NEP().create() nep.setSplitOperator( [A, Id, Id, D], [f1, f2, f3, f4], PETSc.Mat.Structure.SUBSET, ) # Customize options nep.setTolerances(tol=1e-7) nep.setDimensions(nev=24) nep.setType(SLEPc.NEP.Type.CISS) # the rg params are chosen s.t. the singularity at k = ka - 1j*gt is # outside of the contour. radius = 3 * gt vscale = 0.5 * gt / radius rg_params = (ka, 3 * gt, vscale) R = nep.getRG() R.setType(SLEPc.RG.Type.ELLIPSE) Print(f"RG params: {rg_params}") R.setEllipseParameters(*rg_params) nep.setFromOptions() # Solve the problem nep.solve() its = nep.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = nep.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = nep.getDimensions() Print("") Print("Subspace dimension: %i" % ncv) tol, maxit = nep.getTolerances() Print("Stopping condition: tol=%.4g" % tol) Print("") nconv = nep.getConverged() Print("Number of converged eigenpairs %d" % nconv) x = A.createVecs("right") evals = [] modes = [] if nconv > 0: Print() Print(" lam ||T(lam)x|| |lam-lam_exact|/|lam_exact| ") Print("--------------------- ------------- -----------------------------") for i in range(nconv): lam = nep.getEigenpair(i, x) error = nep.computeError(i) def eigenvalue_error_term(k): gkmu = gt / (k - ka + 1j * gt) nceff = np.sqrt(nc**2 + gkmu * D0) return -1j / np.tan(nceff * k * L) - 1 / nceff # compute the expected_eigenvalue # we assume that the numerically calculated eigenvalue is close to # the exact one, which we can determine using a Newton-Raphson # method. if scipy: expected_lam = scipy.optimize.newton( eigenvalue_error_term, np.complex128(lam), rtol=1e-11 ) rel_err = abs(lam - expected_lam) / abs(expected_lam) rel_err = "%6g" % rel_err else: rel_err = "scipy not installed" Print(" %9f%+9f j %12g %s" % (lam.real, lam.imag, error, rel_err)) evals.append(lam) modes.append(x.getArray().copy()) Print() return np.asarray(evals), rg_params, ka, gt def main(): opts = PETSc.Options() n = opts.getInt("n", 256) Print(f"n={n}") evals, rg_params, ka, gt = solve(n) if not opts.getBool("ploteigs", True) or PETSc.COMM_WORLD.getRank(): return try: import matplotlib.pyplot as plt from matplotlib.patches import Ellipse except ImportError: print("plot is not shown, because matplotlib is not installed") else: fig, ax = plt.subplots() ax.plot(evals.real, evals.imag, "x") height = 2 * rg_params[1] * rg_params[2] ellipse = Ellipse( xy=(rg_params[0], 0.0), width=rg_params[1] * 2, height=height, edgecolor="r", fc="None", lw=2, ) ax.add_patch(ellipse) ax.grid() ax.legend() plt.show() if __name__ == "__main__": main() slepc4py-3.19.2/demo/ex2.py000066400000000000000000000050051454104675500153600ustar00rootroot00000000000000try: range = xrange except: pass import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print def construct_operator(m, n): """ Standard symmetric eigenproblem corresponding to the Laplacian operator in 2 dimensions. """ # Create matrix for 2D Laplacian operator A = PETSc.Mat().create() A.setSizes([m*n, m*n]) A.setFromOptions( ) A.setUp() # Fill matrix hx = 1.0/(m-1) # x grid spacing hy = 1.0/(n-1) # y grid spacing diagv = 2.0*hy/hx + 2.0*hx/hy offdx = -1.0*hy/hx offdy = -1.0*hx/hy Istart, Iend = A.getOwnershipRange() for I in range(Istart, Iend) : A[I,I] = diagv i = I//n # map row number to j = I - i*n # grid coordinates if i> 0 : J = I-n; A[I,J] = offdx if i< m-1: J = I+n; A[I,J] = offdx if j> 0 : J = I-1; A[I,J] = offdy if j< n-1: J = I+1; A[I,J] = offdy A.assemble() return A def solve_eigensystem(A, problem_type=SLEPc.EPS.ProblemType.HEP): # Create the result vectors xr, xi = A.createVecs() # Setup the eigensolver E = SLEPc.EPS().create() E.setOperators(A,None) E.setDimensions(3,PETSc.DECIDE) E.setProblemType( problem_type ) E.setFromOptions() # Solve the eigensystem E.solve() Print("") its = E.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = E.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %i" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) nconv = E.getConverged() Print("Number of converged eigenpairs: %d" % nconv) if nconv > 0: Print("") Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, xr, xi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print("") def main(): opts = PETSc.Options() N = opts.getInt('N', 32) m = opts.getInt('m', N) n = opts.getInt('n', m) Print("Symmetric Eigenproblem (sparse matrix), " "N=%d (%dx%d grid)" % (m*n, m, n)) A = construct_operator(m,n) solve_eigensystem(A) if __name__ == '__main__': main() slepc4py-3.19.2/demo/ex3.py000066400000000000000000000055451454104675500153720ustar00rootroot00000000000000import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc import numpy as np # this a sequential example assert PETSc.COMM_WORLD.getSize() == 1 Print = PETSc.Sys.Print def laplace2d(U, x, f): U[:,:] = 0 U[1:-1, 1:-1] = x # Grid spacing m, n = x.shape hx = 1.0/(m-1) # x grid spacing hy = 1.0/(n-1) # y grid spacing # Setup 5-points stencil u = U[1:-1, 1:-1] # center uN = U[1:-1, :-2] # north uS = U[1:-1, 2: ] # south uW = U[ :-2, 1:-1] # west uE = U[2:, 1:-1] # east # Apply Laplacian f[:,:] = \ (2*u - uE - uW) * (hy/hx) \ + (2*u - uN - uS) * (hx/hy) \ class Laplacian2D(object): def __init__(self, m, n): self.m, self.n = m, n scalar = PETSc.ScalarType self.U = np.zeros([m+2, n+2], dtype=scalar) def mult(self, A, x, y): m, n = self.m, self.n xx = x.getArray(readonly=1).reshape(m,n) yy = y.getArray(readonly=0).reshape(m,n) laplace2d(self.U, xx, yy) def construct_operator(m, n): """ Standard symmetric eigenproblem corresponding to the Laplacian operator in 2 dimensions. Uses *shell* matrix. """ # Create shell matrix context = Laplacian2D(m,n) A = PETSc.Mat().createPython([m*n,m*n], context) A.setUp() return A def solve_eigensystem(A, problem_type=SLEPc.EPS.ProblemType.HEP): # Create the result vectors xr, xi = A.createVecs() # Setup the eigensolver E = SLEPc.EPS().create() E.setOperators(A,None) E.setDimensions(3,PETSc.DECIDE) E.setProblemType( problem_type ) E.setFromOptions() # Solve the eigensystem E.solve() Print("") its = E.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = E.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %i" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) nconv = E.getConverged() Print("Number of converged eigenpairs: %d" % nconv) if nconv > 0: Print("") Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, xr, xi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print("") def main(): opts = PETSc.Options() N = opts.getInt('N', 32) m = opts.getInt('m', N) n = opts.getInt('n', m) Print("Symmetric Eigenproblem (matrix-free), " "N=%d (%dx%d grid)" % (m*n, m, n)) A = construct_operator(m,n) solve_eigensystem(A) if __name__ == '__main__': main() slepc4py-3.19.2/demo/ex4.py000066400000000000000000000027771454104675500153770ustar00rootroot00000000000000try: range = xrange except: pass import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc opts = PETSc.Options() n = opts.getInt('n', 30) mu = opts.getScalar('mu', 1e-6) PETSc.Sys.Print( "Lauchli singular value decomposition, (%d x %d) mu=%g\n" % (n+1,n,mu) ) A = PETSc.Mat(); A.create() A.setSizes([n+1, n]) A.setFromOptions( ) A.setUp() rstart, rend = A.getOwnershipRange() for i in range(rstart, rend): if i==0: for j in range(n): A[0,j] = 1.0 else: A[i,i-1] = mu A.assemble() S = SLEPc.SVD(); S.create() S.setOperator(A) S.setType(S.Type.TRLANCZOS) S.setFromOptions() S.solve() Print = PETSc.Sys.Print Print( "******************************" ) Print( "*** SLEPc Solution Results ***" ) Print( "******************************\n" ) svd_type = S.getType() Print( "Solution method: %s" % svd_type ) its = S.getIterationNumber() Print( "Number of iterations of the method: %d" % its ) nsv, ncv, mpd = S.getDimensions() Print( "Number of requested singular values: %d" % nsv ) tol, maxit = S.getTolerances() Print( "Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit) ) nconv = S.getConverged() Print( "Number of converged approximate singular triplets %d" % nconv ) if nconv > 0: v, u = A.createVecs() Print() Print(" sigma residual norm ") Print("------------- ---------------") for i in range(nconv): sigma = S.getSingularTriplet(i, u, v) error = S.computeError(i) Print( " %6f %12g" % (sigma, error) ) Print() slepc4py-3.19.2/demo/ex5.py000066400000000000000000000051201454104675500153610ustar00rootroot00000000000000 import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print def construct_operators(m,n): """ Standard symmetric eigenproblem corresponding to the Laplacian operator in 2 dimensions. """ Print("Quadratic Eigenproblem, N=%d (%dx%d grid)"% (m*n, m, n)) # K is the 2-D Laplacian K = PETSc.Mat().create() K.setSizes([n*m, n*m]) K.setFromOptions( ) K.setUp() Istart, Iend = K.getOwnershipRange() for I in range(Istart,Iend): v = -1.0; i = I//n; j = I-i*n; if i>0: J=I-n; K[I,J] = v if i0: J=I-1; K[I,J] = v if j 0: Print("") Print(" k ||(k^2M+Ck+K)x||/||kx|| ") Print("-------------------- -------------------------") for i in range(nconv): k = Q.getEigenpair(i, xr, xi) error = Q.computeError(i) if k.imag != 0.0: Print("%9f%+9f j %12g" % (k.real, k.imag, error)) else: Print("%12f %12g" % (k.real, error)) Print("") if __name__ == '__main__': opts = PETSc.Options() m = opts.getInt('m', 32) n = opts.getInt('n', m) M, C, K = construct_operators(m,n) solve_eigensystem(M, C, K) M = C = K = None slepc4py-3.19.2/demo/ex6.py000066400000000000000000000042571454104675500153740ustar00rootroot00000000000000import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print def build_matrix(m): """ Markov model of a random walk on a triangular grid """ N = m*(m+1)/2 Print("Markov y=exp(t*A)*e_1, N=%d (m=%d)"% (N, m)) A = PETSc.Mat().create() A.setSizes([N, N]) A.setFromOptions( ) A.setUp() Istart, Iend = A.getOwnershipRange() ix = 0 cst = 0.5/(m-1) for i in range(1,m+1): jmax = m-i+1 for j in range(1,jmax+1): ix = ix + 1 if ix-1Iend: continue # compute only owned rows if j!=jmax: pd = cst*(i+j-1) # north if i==1: A[ix-1,ix] = 2*pd else: A[ix-1,ix] = pd # east if j==1: A[ix-1,ix+jmax-1] = 2*pd else: A[ix-1,ix+jmax-1] = pd # south pu = 0.5 - cst*(i+j-3) if j>1: A[ix-1,ix-2] = pu # west if i>1: A[ix-1,ix-jmax-2] = pu A.assemble() return A def solve_exp(t, A, b, x): # Setup the solver M = SLEPc.MFN().create() M.setOperator(A) f = M.getFN() f.setType(SLEPc.FN.Type.EXP) f.setScale(t) M.setTolerances(1e-7) M.setFromOptions() # Solve the problem M.solve(b,x) its = M.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = M.getType() Print("Solution method: %s" % sol_type) ncv = M.getDimensions() Print("") Print("Subspace dimension: %i" % ncv) tol, maxit = M.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) Print("Computed vector at time t=%.4g has norm %g" % (t.real, x.norm())) Print("") if __name__ == '__main__': opts = PETSc.Options() m = opts.getInt('m', 15) A = build_matrix(m) # transition probability matrix x, b = A.createVecs() x.set(0) b.set(0) b[0] = 1 b.assemble() t = 2 solve_exp(t, A, b, x) # compute x=exp(t*A)*b A = None b = x = None slepc4py-3.19.2/demo/ex7.py000066400000000000000000000103341454104675500153660ustar00rootroot00000000000000# ------------------------------------------------------------------------ # Solve 1-D PDE # -u'' = lambda*u # on [0,1] subject to # u(0)=0, u'(1)=u(1)*lambda*kappa/(kappa-lambda) # ------------------------------------------------------------------------ import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc from numpy import sqrt, sin Print = PETSc.Sys.Print class MyPDE(object): def __init__(self, kappa, h): self.kappa = kappa self.h = h def formFunction(self, nep, mu, F, B): n, m = F.getSize() Istart, Iend = F.getOwnershipRange() i1 = Istart if Istart==0: i1 = i1 + 1 i2 = Iend if Iend==n: i2 = i2 - 1 h = self.h c = self.kappa/(mu-self.kappa) d = n # Interior grid points for i in range(i1,i2): val = -d-mu*h/6.0 F[i,i-1] = val F[i,i] = 2.0*(d-mu*h/3.0) F[i,i+1] = val # Boundary points if Istart==0: F[0,0] = 2.0*(d-mu*h/3.0) F[0,1] = -d-mu*h/6.0 if Iend==n: F[n-1,n-2] = -d-mu*h/6.0 F[n-1,n-1] = d-mu*h/3.0+mu*c F.assemble() if B != F: B.assemble() return PETSc.Mat.Structure.SAME_NONZERO_PATTERN def formJacobian(self, nep, mu, F): n, m = J.getSize() Istart, Iend = J.getOwnershipRange() i1 = Istart if Istart==0: i1 = i1 + 1 i2 = Iend if Iend==n: i2 = i2 - 1 h = self.h c = self.kappa/(mu-self.kappa) # Interior grid points for i in range(i1,i2): J[i,i-1] = -h/6.0 J[i,i] = -2.0*h/3.0 J[i,i+1] = -h/6.0 # Boundary points if Istart==0: J[0,0] = -2.0*h/3.0 J[0,1] = -h/6.0 if Iend==n: J[n-1,n-2] = -h/6.0 J[n-1,n-1] = -h/3.0-c*c J.assemble() return PETSc.Mat.Structure.SAME_NONZERO_PATTERN def checkSolution(self, mu, y): nu = sqrt(mu) u = y.duplicate() n = u.getSize() Istart, Iend = J.getOwnershipRange() h = self.h for i in range(Istart,Iend): x = (i+1)*h u[i] = sin(nu*x); u.assemble() u.normalize() u.axpy(-1.0,y) return u.norm() def FixSign(x): # Force the eigenfunction to be real and positive, since # some eigensolvers may return the eigenvector multiplied # by a complex number of modulus one. comm = x.getComm() rank = comm.getRank() n = 1 if rank == 0 else 0 aux = PETSc.Vec().createMPI((n, PETSc.DECIDE), comm=comm) if rank == 0: aux[0] = x[0] aux.assemble() x0 = aux.sum() sign = x0/abs(x0) x.scale(1.0/sign) opts = PETSc.Options() n = opts.getInt('n', 128) kappa = opts.getReal('kappa', 1.0) pde = MyPDE(kappa, 1.0/n) # Setup the solver nep = SLEPc.NEP().create() F = PETSc.Mat().create() F.setSizes([n, n]) F.setType('aij') F.setPreallocationNNZ(3) F.setUp() nep.setFunction(pde.formFunction, F) J = PETSc.Mat().create() J.setSizes([n, n]) J.setType('aij') J.setPreallocationNNZ(3) J.setUp() nep.setJacobian(pde.formJacobian, J) nep.setTolerances(tol=1e-9) nep.setDimensions(1) nep.setFromOptions() # Solve the problem x = F.createVecs('right') x.set(1.0) nep.setInitialSpace(x) nep.solve() its = nep.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = nep.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = nep.getDimensions() Print("") Print("Subspace dimension: %i" % ncv) tol, maxit = nep.getTolerances() Print("Stopping condition: tol=%.4g" % tol) Print("") nconv = nep.getConverged() Print( "Number of converged eigenpairs %d" % nconv ) if nconv > 0: Print() Print(" k ||T(k)x|| error ") Print("----------------- ------------------ ------------------") for i in range(nconv): k = nep.getEigenpair(i, x) FixSign(x) res = nep.computeError(i) error = pde.checkSolution(k.real, x) if k.imag != 0.0: Print( " %9f%+9f j %12g %12g" % (k.real, k.imag, res, error) ) else: Print( " %12f %12g %12g" % (k.real, res, error) ) Print() slepc4py-3.19.2/demo/ex8.py000066400000000000000000000060461454104675500153740ustar00rootroot00000000000000# ------------------------------------------------------------------------ # Solve parabolic partial differential equation with time delay tau # # u_t = u_xx + a*u(t) + b*u(t-tau) # u(0,t) = u(pi,t) = 0 # # with a = 20 and b(x) = -4.1+x*(1-exp(x-pi)). # # Discretization leads to a DDE of dimension n # # -u' = A*u(t) + B*u(t-tau) # # which results in the nonlinear eigenproblem # # (-lambda*I + A + exp(-tau*lambda)*B)*u = 0 # ------------------------------------------------------------------------ import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc from numpy import exp from math import pi Print = PETSc.Sys.Print opts = PETSc.Options() n = opts.getInt('n', 128) tau = opts.getReal('tau', 0.001) a = 20 h = pi/(n+1) # Setup the solver nep = SLEPc.NEP().create() # Create problem matrices # Identity matrix Id = PETSc.Mat().create() Id.setSizes([n, n]) Id.setFromOptions() Id.setUp() Id.assemble() Id.shift(1.0) Id.setOption(PETSc.Mat.Option.HERMITIAN, True) # A = 1/h^2*tridiag(1,-2,1) + a*I A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() vd = -2.0/(h*h)+a vo = 1.0/(h*h) if rstart == 0: A[0, :2] = [vd, vo] rstart += 1 if rend == n: A[n-1, -2:] = [vo, vd] rend -= 1 for i in range(rstart, rend): A[i, i-1:i+2] = [vo, vd, vo] A.assemble() # B = diag(b(xi)) B = PETSc.Mat().create() B.setSizes([n, n]) B.setFromOptions() B.setUp() rstart, rend = B.getOwnershipRange() for i in range(rstart, rend): xi = (i+1)*h B[i, i] = -4.1+xi*(1.0-exp(xi-pi)); B.assemble() B.setOption(PETSc.Mat.Option.HERMITIAN, True) # Functions: f1=-lambda, f2=1.0, f3=exp(-tau*lambda) f1 = SLEPc.FN().create() f1.setType(SLEPc.FN.Type.RATIONAL) f1.setRationalNumerator([-1, 0]) f2 = SLEPc.FN().create() f2.setType(SLEPc.FN.Type.RATIONAL) f2.setRationalNumerator([1]) f3 = SLEPc.FN().create() f3.setType(SLEPc.FN.Type.EXP) f3.setScale(-tau) # Set the split operator. Note that A is passed first so that # SUBSET_NONZERO_PATTERN can be used nep.setSplitOperator([A, Id, B], [f2, f1, f3], PETSc.Mat.Structure.SUBSET) # Customize options nep.setTolerances(tol=1e-9) nep.setDimensions(1) nep.setFromOptions() # Solve the problem nep.solve() its = nep.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = nep.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = nep.getDimensions() Print("") Print("Subspace dimension: %i" % ncv) tol, maxit = nep.getTolerances() Print("Stopping condition: tol=%.4g" % tol) Print("") nconv = nep.getConverged() Print( "Number of converged eigenpairs %d" % nconv ) if nconv > 0: x = Id.createVecs('right') x.set(1.0) Print() Print(" k ||T(k)x||") Print("----------------- ------------------") for i in range(nconv): k = nep.getEigenpair(i, x) res = nep.computeError(i) if k.imag != 0.0: Print( " %9f%+9f j %12g" % (k.real, k.imag, res) ) else: Print( " %12f %12g" % (k.real, res) ) Print() slepc4py-3.19.2/demo/ex9.py000066400000000000000000000064341454104675500153760ustar00rootroot00000000000000try: range = xrange except: pass import sys, slepc4py slepc4py.init(sys.argv) from petsc4py import PETSc from slepc4py import SLEPc Print = PETSc.Sys.Print def Laplacian2D(m, n): """ Builds discretized Laplacian operator in 2 dimensions. """ # Create matrix for 2D Laplacian operator A = PETSc.Mat().create() A.setSizes([m*n, m*n]) A.setFromOptions( ) A.setUp() # Fill matrix hx = 1.0/(m-1) # x grid spacing hy = 1.0/(n-1) # y grid spacing diagv = 2.0*hy/hx + 2.0*hx/hy offdx = -1.0*hy/hx offdy = -1.0*hx/hy Istart, Iend = A.getOwnershipRange() for I in range(Istart, Iend): A[I,I] = diagv i = I//n # map row number to j = I - i*n # grid coordinates if i> 0 : J = I-n; A[I,J] = offdx if i< m-1: J = I+n; A[I,J] = offdx if j> 0 : J = I-1; A[I,J] = offdy if j< n-1: J = I+1; A[I,J] = offdy A.assemble() return A def QuasiDiagonal(N): """ Builds matrix diag(2)+[4 -1; -1 -1] """ # Create matrix B = PETSc.Mat().create() B.setSizes([N, N]) B.setFromOptions( ) B.setUp() # Fill matrix Istart, Iend = B.getOwnershipRange() for I in range(Istart, Iend): B[I,I] = 2.0 if Istart==0: B[0,0] = 6.0 B[0,1] = -1.0 B[1,0] = -1.0 B[1,1] = 1.0 B.assemble() return B def solve_eigensystem(A, B, problem_type=SLEPc.EPS.ProblemType.GHEP): # Create the results vectors xr, xi = A.createVecs() pc = PETSc.PC().create() # pc.setType(pc.Type.HYPRE) pc.setType(pc.Type.BJACOBI) ksp = PETSc.KSP().create() ksp.setType(ksp.Type.PREONLY) ksp.setPC( pc ) F = SLEPc.ST().create() F.setType(F.Type.PRECOND) F.setKSP( ksp ) F.setShift(0) # Setup the eigensolver E = SLEPc.EPS().create() E.setST(F) E.setOperators(A,B) E.setType(E.Type.LOBPCG) E.setDimensions(10,PETSc.DECIDE) E.setWhichEigenpairs(E.Which.SMALLEST_REAL) E.setProblemType( problem_type ) E.setFromOptions() # Solve the eigensystem E.solve() Print("") its = E.getIterationNumber() Print("Number of iterations of the method: %i" % its) sol_type = E.getType() Print("Solution method: %s" % sol_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %i" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) nconv = E.getConverged() Print("Number of converged eigenpairs: %d" % nconv) if nconv > 0: Print("") Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, xr, xi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print("") def main(): opts = PETSc.Options() N = opts.getInt('N', 10) m = opts.getInt('m', N) n = opts.getInt('n', m) Print("Symmetric-definite Eigenproblem, " "N=%d (%dx%d grid)" % (m*n, m, n)) A = Laplacian2D(m,n) B = QuasiDiagonal(m*n) solve_eigensystem(A,B) if __name__ == '__main__': main() slepc4py-3.19.2/demo/makefile000066400000000000000000000005051454104675500160100ustar00rootroot00000000000000PYTHON=python TESTFILES = $(filter-out ex13.py,$(wildcard ex*.py)) TESTS = $(TESTFILES:.py=) RUNRULES = $(addprefix run_,$(TESTS)) .PHONY:test run ${RUNRULES} test: run run: ${RUNRULES} run_ex13 ${RUNRULES}: ${PYTHON} $(subst run_,,$@).py ${SLEPC_OPTIONS} run_ex13: ${PYTHON} ex13.py -ploteigs 0 ${SLEPC_OPTIONS} slepc4py-3.19.2/docs/000077500000000000000000000000001454104675500143145ustar00rootroot00000000000000slepc4py-3.19.2/docs/CHANGES.html000066400000000000000000000324621454104675500162610ustar00rootroot00000000000000 CHANGES: SLEPc for Python

CHANGES: SLEPc for Python

Author: Lisandro Dalcin
Contact: dalcinl@gmail.com

Release 3.19.2

  • Update to SLEPc 3.19.2.

Release 3.19.1

  • Update to SLEPc 3.19.1.

Release 3.19.0

  • Update to SLEPc 3.19.0.

Release 3.18.3

  • Update to SLEPc 3.18.3.

Release 3.18.2

  • Update to SLEPc 3.18.2.

Release 3.18.1

  • Update to SLEPc 3.18.1.

Release 3.18.0

  • Update to SLEPc 3.18 release.

Release 3.17.2

  • Update to SLEPc 3.17.2.

Release 3.17.1

  • Update to SLEPc 3.17.1.

Release 3.17.0

  • Update to SLEPc 3.17 release.

Release 3.16.2

  • Update to SLEPc 3.16.2.

Release 3.16.1

  • Update to SLEPc 3.16.1.

Release 3.16.0

  • Update to SLEPc 3.16 release.

Release 3.15.2

  • Update to SLEPc 3.15.2.

Release 3.15.1

  • Updates in installation scripts.

Release 3.15.0

  • Update to SLEPc 3.15 release.

Release 3.14.0

  • Update to SLEPc 3.14 release.

Release 3.13.0

  • Update to SLEPc 3.13 release.

Release 3.12.0

  • Update to SLEPc 3.12 release.

Release 3.11.0

  • Update to SLEPc 3.11 release.

Release 3.10.0

  • Update to SLEPc 3.10 release.

Release 3.9.0

  • Update to SLEPc 3.9 release.

Release 3.8.0

  • Update to SLEPc 3.8 release.

Release 3.7.0

  • Update to SLEPc 3.7 release.

Release 3.6.0

  • Update to SLEPc 3.6 release.

Release 3.5.1

  • Add RG class introduced in SLEPc 3.5 release.

  • Add PySlepcXXX_New/Get C API functions.

  • Fix compilation problem with complex scalars on OS X.

  • Fix outdated SWIG interface file.

Release 3.5

  • Update to SLEPc 3.5 release.

Release 3.4

  • Update to SLEPc 3.4 release.

Release 3.3.1

  • Regenerate the wrappers using Cython 0.18 and fix binary compatibility issues with petsc4py 3.3.1 .

Release 3.3

  • Update to SLEPc 3.3 release.

Release 1.2

  • Update to SLEPc 3.2 release.

Release 1.1

  • Support for new QEP quadratic eigenproblem solver in SLEPc.

  • Support for pip install slepc4py to download and install SLEPc.

  • Support for PETSc/SLEPc static library builds (Linux-only).

  • Preliminar support for Python 3.

Release 1.0.0

This is the fist release of the all-new, Cython-based, implementation of SLEPc for Python.

slepc4py-3.19.2/docs/LICENSE.html000066400000000000000000000227201454104675500162670ustar00rootroot00000000000000 LICENSE: SLEPc for Python

LICENSE: SLEPc for Python

Author: Lisandro Dalcin
Contact: dalcinl@gmail.com

Copyright (c) 2023, Lisandro Dalcin. All rights reserved.

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.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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.

slepc4py-3.19.2/docs/apiref/000077500000000000000000000000001454104675500155625ustar00rootroot00000000000000slepc4py-3.19.2/docs/apiref/api-objects.txt000066400000000000000000003015251454104675500205310ustar00rootroot00000000000000slepc4py.SLEPc slepc4py.SLEPc-module.html slepc4py.SLEPc.DECIDE slepc4py.SLEPc-module.html#DECIDE slepc4py.SLEPc.DEFAULT slepc4py.SLEPc-module.html#DEFAULT slepc4py.SLEPc.COMM_NULL slepc4py.SLEPc-module.html#COMM_NULL slepc4py.SLEPc.COMM_WORLD slepc4py.SLEPc-module.html#COMM_WORLD slepc4py.SLEPc.__arch__ slepc4py.SLEPc-module.html#__arch__ slepc4py.SLEPc.__package__ slepc4py.SLEPc-module.html#__package__ slepc4py.SLEPc.DETERMINE slepc4py.SLEPc-module.html#DETERMINE slepc4py.SLEPc._finalize slepc4py.SLEPc-module.html#_finalize slepc4py.SLEPc.__pyx_capi__ slepc4py.SLEPc-module.html#__pyx_capi__ slepc4py.SLEPc._initialize slepc4py.SLEPc-module.html#_initialize slepc4py.SLEPc.COMM_SELF slepc4py.SLEPc-module.html#COMM_SELF slepc4py slepc4py-module.html slepc4py.__credits__ slepc4py-module.html#__credits__ slepc4py.get_include slepc4py-module.html#get_include slepc4py.init slepc4py-module.html#init slepc4py.__package__ slepc4py-module.html#__package__ slepc4py.lib slepc4py.lib-module.html slepc4py.lib.__package__ slepc4py.lib-module.html#__package__ slepc4py.lib.ImportSLEPc slepc4py.lib-module.html#ImportSLEPc slepc4py.lib.getPathArchSLEPc slepc4py.lib-module.html#getPathArchSLEPc slepc4py.SLEPc.BV slepc4py.SLEPc.BV-class.html slepc4py.SLEPc.BV.setDefiniteTolerance slepc4py.SLEPc.BV-class.html#setDefiniteTolerance slepc4py.SLEPc.BV.matMult slepc4py.SLEPc.BV-class.html#matMult slepc4py.SLEPc.BV.createVec slepc4py.SLEPc.BV-class.html#createVec slepc4py.SLEPc.BV.getMat slepc4py.SLEPc.BV-class.html#getMat slepc4py.SLEPc.BV.getNumConstraints slepc4py.SLEPc.BV-class.html#getNumConstraints slepc4py.SLEPc.BV.norm slepc4py.SLEPc.BV-class.html#norm slepc4py.SLEPc.BV.setOptionsPrefix slepc4py.SLEPc.BV-class.html#setOptionsPrefix slepc4py.SLEPc.BV.OrthogBlockType slepc4py.SLEPc.BV.BlockType-class.html slepc4py.SLEPc.BV.setSizes slepc4py.SLEPc.BV-class.html#setSizes slepc4py.SLEPc.BV.setFromOptions slepc4py.SLEPc.BV-class.html#setFromOptions slepc4py.SLEPc.BV.setNumConstraints slepc4py.SLEPc.BV-class.html#setNumConstraints slepc4py.SLEPc.BV.orthogonalize slepc4py.SLEPc.BV-class.html#orthogonalize slepc4py.SLEPc.BV.copyVec slepc4py.SLEPc.BV-class.html#copyVec slepc4py.SLEPc.BV.scaleColumn slepc4py.SLEPc.BV-class.html#scaleColumn slepc4py.SLEPc.BV.setRandomCond slepc4py.SLEPc.BV-class.html#setRandomCond slepc4py.SLEPc.BV.getSizes slepc4py.SLEPc.BV-class.html#getSizes slepc4py.SLEPc.BV.view slepc4py.SLEPc.BV-class.html#view slepc4py.SLEPc.BV.getActiveColumns slepc4py.SLEPc.BV-class.html#getActiveColumns slepc4py.SLEPc.BV.restoreColumn slepc4py.SLEPc.BV-class.html#restoreColumn slepc4py.SLEPc.BV.insertConstraints slepc4py.SLEPc.BV-class.html#insertConstraints slepc4py.SLEPc.BV.Type slepc4py.SLEPc.BV.Type-class.html slepc4py.SLEPc.BV.scale slepc4py.SLEPc.BV-class.html#scale slepc4py.SLEPc.BV.multColumn slepc4py.SLEPc.BV-class.html#multColumn slepc4py.SLEPc.BV.setRandomColumn slepc4py.SLEPc.BV-class.html#setRandomColumn slepc4py.SLEPc.BV.orthogonalizeVec slepc4py.SLEPc.BV-class.html#orthogonalizeVec slepc4py.SLEPc.BV.insertVecs slepc4py.SLEPc.BV-class.html#insertVecs slepc4py.SLEPc.BV.copyColumn slepc4py.SLEPc.BV-class.html#copyColumn slepc4py.SLEPc.BV.normColumn slepc4py.SLEPc.BV-class.html#normColumn slepc4py.SLEPc.BV.matMultTransposeColumn slepc4py.SLEPc.BV-class.html#matMultTransposeColumn slepc4py.SLEPc.BV.restoreMat slepc4py.SLEPc.BV-class.html#restoreMat slepc4py.SLEPc.BV.getRandomContext slepc4py.SLEPc.BV-class.html#getRandomContext slepc4py.SLEPc.BV.getOrthogonalization slepc4py.SLEPc.BV-class.html#getOrthogonalization slepc4py.SLEPc.BV.getOptionsPrefix slepc4py.SLEPc.BV-class.html#getOptionsPrefix slepc4py.SLEPc.BV.matMultHermitianTransposeColumn slepc4py.SLEPc.BV-class.html#matMultHermitianTransposeColumn slepc4py.SLEPc.BV.setSizesFromVec slepc4py.SLEPc.BV-class.html#setSizesFromVec slepc4py.SLEPc.BV.getMatrix slepc4py.SLEPc.BV-class.html#getMatrix slepc4py.SLEPc.BV.setRandomNormal slepc4py.SLEPc.BV-class.html#setRandomNormal slepc4py.SLEPc.BV.multVec slepc4py.SLEPc.BV-class.html#multVec slepc4py.SLEPc.BV.setActiveColumns slepc4py.SLEPc.BV-class.html#setActiveColumns slepc4py.SLEPc.BV.OrthogRefineType slepc4py.SLEPc.BV.RefineType-class.html slepc4py.SLEPc.BV.multInPlace slepc4py.SLEPc.BV-class.html#multInPlace slepc4py.SLEPc.BV.getColumn slepc4py.SLEPc.BV-class.html#getColumn slepc4py.SLEPc.BV.getMatMultMethod slepc4py.SLEPc.BV-class.html#getMatMultMethod slepc4py.SLEPc.BV.setMatrix slepc4py.SLEPc.BV-class.html#setMatrix slepc4py.SLEPc.BV.insertVec slepc4py.SLEPc.BV-class.html#insertVec slepc4py.SLEPc.BV.createMat slepc4py.SLEPc.BV-class.html#createMat slepc4py.SLEPc.BV.orthonormalizeColumn slepc4py.SLEPc.BV-class.html#orthonormalizeColumn slepc4py.SLEPc.BV.BlockType slepc4py.SLEPc.BV.BlockType-class.html slepc4py.SLEPc.BV.matMultHermitianTranspose slepc4py.SLEPc.BV-class.html#matMultHermitianTranspose slepc4py.SLEPc.BV.setType slepc4py.SLEPc.BV-class.html#setType slepc4py.SLEPc.BV.create slepc4py.SLEPc.BV-class.html#create slepc4py.SLEPc.BV.duplicate slepc4py.SLEPc.BV-class.html#duplicate slepc4py.SLEPc.BV.mult slepc4py.SLEPc.BV-class.html#mult slepc4py.SLEPc.BV.matProject slepc4py.SLEPc.BV-class.html#matProject slepc4py.SLEPc.BV.getType slepc4py.SLEPc.BV-class.html#getType slepc4py.SLEPc.BV.OrthogType slepc4py.SLEPc.BV.OrthogType-class.html slepc4py.SLEPc.BV.setRandomContext slepc4py.SLEPc.BV-class.html#setRandomContext slepc4py.SLEPc.BV.copy slepc4py.SLEPc.BV-class.html#copy slepc4py.SLEPc.BV.resize slepc4py.SLEPc.BV-class.html#resize slepc4py.SLEPc.BV.getDefiniteTolerance slepc4py.SLEPc.BV-class.html#getDefiniteTolerance slepc4py.SLEPc.BV.applyMatrix slepc4py.SLEPc.BV-class.html#applyMatrix slepc4py.SLEPc.BV.dotColumn slepc4py.SLEPc.BV-class.html#dotColumn slepc4py.SLEPc.BV.setMatMultMethod slepc4py.SLEPc.BV-class.html#setMatMultMethod slepc4py.SLEPc.BV.__new__ slepc4py.SLEPc.BV-class.html#__new__ slepc4py.SLEPc.BV.setRandomSign slepc4py.SLEPc.BV-class.html#setRandomSign slepc4py.SLEPc.BV.destroy slepc4py.SLEPc.BV-class.html#destroy slepc4py.SLEPc.BV.matMultColumn slepc4py.SLEPc.BV-class.html#matMultColumn slepc4py.SLEPc.BV.orthogonalizeColumn slepc4py.SLEPc.BV-class.html#orthogonalizeColumn slepc4py.SLEPc.BV.setOrthogonalization slepc4py.SLEPc.BV-class.html#setOrthogonalization slepc4py.SLEPc.BV.createFromMat slepc4py.SLEPc.BV-class.html#createFromMat slepc4py.SLEPc.BV.duplicateResize slepc4py.SLEPc.BV-class.html#duplicateResize slepc4py.SLEPc.BV.RefineType slepc4py.SLEPc.BV.RefineType-class.html slepc4py.SLEPc.BV.setRandom slepc4py.SLEPc.BV-class.html#setRandom slepc4py.SLEPc.BV.dotVec slepc4py.SLEPc.BV-class.html#dotVec slepc4py.SLEPc.BV.MatMultType slepc4py.SLEPc.BV.MatMultType-class.html slepc4py.SLEPc.BV.dot slepc4py.SLEPc.BV-class.html#dot slepc4py.SLEPc.BV.BlockType slepc4py.SLEPc.BV.BlockType-class.html slepc4py.SLEPc.BV.BlockType.TSQR slepc4py.SLEPc.BV.BlockType-class.html#TSQR slepc4py.SLEPc.BV.BlockType.GS slepc4py.SLEPc.BV.BlockType-class.html#GS slepc4py.SLEPc.BV.BlockType.CHOL slepc4py.SLEPc.BV.BlockType-class.html#CHOL slepc4py.SLEPc.BV.BlockType.__qualname__ slepc4py.SLEPc.BV.BlockType-class.html#__qualname__ slepc4py.SLEPc.BV.BlockType.SVQB slepc4py.SLEPc.BV.BlockType-class.html#SVQB slepc4py.SLEPc.BV.BlockType.TSQRCHOL slepc4py.SLEPc.BV.BlockType-class.html#TSQRCHOL slepc4py.SLEPc.BV.MatMultType slepc4py.SLEPc.BV.MatMultType-class.html slepc4py.SLEPc.BV.MatMultType.__qualname__ slepc4py.SLEPc.BV.MatMultType-class.html#__qualname__ slepc4py.SLEPc.BV.MatMultType.VECS slepc4py.SLEPc.BV.MatMultType-class.html#VECS slepc4py.SLEPc.BV.MatMultType.MAT slepc4py.SLEPc.BV.MatMultType-class.html#MAT slepc4py.SLEPc.BV.OrthogType slepc4py.SLEPc.BV.OrthogType-class.html slepc4py.SLEPc.BV.OrthogType.__qualname__ slepc4py.SLEPc.BV.OrthogType-class.html#__qualname__ slepc4py.SLEPc.BV.OrthogType.MGS slepc4py.SLEPc.BV.OrthogType-class.html#MGS slepc4py.SLEPc.BV.OrthogType.CGS slepc4py.SLEPc.BV.OrthogType-class.html#CGS slepc4py.SLEPc.BV.RefineType slepc4py.SLEPc.BV.RefineType-class.html slepc4py.SLEPc.BV.RefineType.ALWAYS slepc4py.SLEPc.BV.RefineType-class.html#ALWAYS slepc4py.SLEPc.BV.RefineType.NEVER slepc4py.SLEPc.BV.RefineType-class.html#NEVER slepc4py.SLEPc.BV.RefineType.__qualname__ slepc4py.SLEPc.BV.RefineType-class.html#__qualname__ slepc4py.SLEPc.BV.RefineType.IFNEEDED slepc4py.SLEPc.BV.RefineType-class.html#IFNEEDED slepc4py.SLEPc.BV.Type slepc4py.SLEPc.BV.Type-class.html slepc4py.SLEPc.BV.Type.MAT slepc4py.SLEPc.BV.Type-class.html#MAT slepc4py.SLEPc.BV.Type.TENSOR slepc4py.SLEPc.BV.Type-class.html#TENSOR slepc4py.SLEPc.BV.Type.CONTIGUOUS slepc4py.SLEPc.BV.Type-class.html#CONTIGUOUS slepc4py.SLEPc.BV.Type.__qualname__ slepc4py.SLEPc.BV.Type-class.html#__qualname__ slepc4py.SLEPc.BV.Type.VECS slepc4py.SLEPc.BV.Type-class.html#VECS slepc4py.SLEPc.BV.Type.SVEC slepc4py.SLEPc.BV.Type-class.html#SVEC slepc4py.SLEPc.BVSVDMethod slepc4py.SLEPc.BVSVDMethod-class.html slepc4py.SLEPc.BVSVDMethod.QR slepc4py.SLEPc.BVSVDMethod-class.html#QR slepc4py.SLEPc.BVSVDMethod.QR_CAA slepc4py.SLEPc.BVSVDMethod-class.html#QR_CAA slepc4py.SLEPc.BVSVDMethod.__qualname__ slepc4py.SLEPc.BVSVDMethod-class.html#__qualname__ slepc4py.SLEPc.BVSVDMethod.REFINE slepc4py.SLEPc.BVSVDMethod-class.html#REFINE slepc4py.SLEPc.DS slepc4py.SLEPc.DS-class.html slepc4py.SLEPc.DS.setCompact slepc4py.SLEPc.DS-class.html#setCompact slepc4py.SLEPc.DS.getMat slepc4py.SLEPc.DS-class.html#getMat slepc4py.SLEPc.DS.compact slepc4py.SLEPc.DS-class.html#compact slepc4py.SLEPc.DS.getCompact slepc4py.SLEPc.DS-class.html#getCompact slepc4py.SLEPc.DS.setExtraRow slepc4py.SLEPc.DS-class.html#setExtraRow slepc4py.SLEPc.DS.setHSVDDimensions slepc4py.SLEPc.DS-class.html#setHSVDDimensions slepc4py.SLEPc.DS.getLeadingDimension slepc4py.SLEPc.DS-class.html#getLeadingDimension slepc4py.SLEPc.DS.setOptionsPrefix slepc4py.SLEPc.DS-class.html#setOptionsPrefix slepc4py.SLEPc.DS.setBlockSize slepc4py.SLEPc.DS-class.html#setBlockSize slepc4py.SLEPc.DS.getDimensions slepc4py.SLEPc.DS-class.html#getDimensions slepc4py.SLEPc.DS.setFromOptions slepc4py.SLEPc.DS-class.html#setFromOptions slepc4py.SLEPc.DS.getExtraRow slepc4py.SLEPc.DS-class.html#getExtraRow slepc4py.SLEPc.DS.getParallel slepc4py.SLEPc.DS-class.html#getParallel slepc4py.SLEPc.DS.setRefined slepc4py.SLEPc.DS-class.html#setRefined slepc4py.SLEPc.DS.view slepc4py.SLEPc.DS-class.html#view slepc4py.SLEPc.DS.getPEPDegree slepc4py.SLEPc.DS-class.html#getPEPDegree slepc4py.SLEPc.DS.getGSVDDimensions slepc4py.SLEPc.DS-class.html#getGSVDDimensions slepc4py.SLEPc.DS.getBlockSize slepc4py.SLEPc.DS-class.html#getBlockSize slepc4py.SLEPc.DS.Type slepc4py.SLEPc.DS.Type-class.html slepc4py.SLEPc.DS.truncate slepc4py.SLEPc.DS-class.html#truncate slepc4py.SLEPc.DS.extra_row slepc4py.SLEPc.DS-class.html#extra_row slepc4py.SLEPc.DS.state slepc4py.SLEPc.DS-class.html#state slepc4py.SLEPc.DS.allocate slepc4py.SLEPc.DS-class.html#allocate slepc4py.SLEPc.DS.getSVDDimensions slepc4py.SLEPc.DS-class.html#getSVDDimensions slepc4py.SLEPc.DS.method slepc4py.SLEPc.DS-class.html#method slepc4py.SLEPc.DS.setParallel slepc4py.SLEPc.DS-class.html#setParallel slepc4py.SLEPc.DS.restoreMat slepc4py.SLEPc.DS-class.html#restoreMat slepc4py.SLEPc.DS.getOptionsPrefix slepc4py.SLEPc.DS-class.html#getOptionsPrefix slepc4py.SLEPc.DS.StateType slepc4py.SLEPc.DS.StateType-class.html slepc4py.SLEPc.DS.setPEPCoefficients slepc4py.SLEPc.DS-class.html#setPEPCoefficients slepc4py.SLEPc.DS.updateExtraRow slepc4py.SLEPc.DS-class.html#updateExtraRow slepc4py.SLEPc.DS.MatType slepc4py.SLEPc.DS.MatType-class.html slepc4py.SLEPc.DS.setMethod slepc4py.SLEPc.DS-class.html#setMethod slepc4py.SLEPc.DS.refined slepc4py.SLEPc.DS-class.html#refined slepc4py.SLEPc.DS.block_size slepc4py.SLEPc.DS-class.html#block_size slepc4py.SLEPc.DS.setType slepc4py.SLEPc.DS-class.html#setType slepc4py.SLEPc.DS.getPEPCoefficients slepc4py.SLEPc.DS-class.html#getPEPCoefficients slepc4py.SLEPc.DS.create slepc4py.SLEPc.DS-class.html#create slepc4py.SLEPc.DS.getMethod slepc4py.SLEPc.DS-class.html#getMethod slepc4py.SLEPc.DS.duplicate slepc4py.SLEPc.DS-class.html#duplicate slepc4py.SLEPc.DS.setIdentity slepc4py.SLEPc.DS-class.html#setIdentity slepc4py.SLEPc.DS.getType slepc4py.SLEPc.DS-class.html#getType slepc4py.SLEPc.DS.setPEPDegree slepc4py.SLEPc.DS-class.html#setPEPDegree slepc4py.SLEPc.DS.reset slepc4py.SLEPc.DS-class.html#reset slepc4py.SLEPc.DS.setSVDDimensions slepc4py.SLEPc.DS-class.html#setSVDDimensions slepc4py.SLEPc.DS.setDimensions slepc4py.SLEPc.DS-class.html#setDimensions slepc4py.SLEPc.DS.getState slepc4py.SLEPc.DS-class.html#getState slepc4py.SLEPc.DS.cond slepc4py.SLEPc.DS-class.html#cond slepc4py.SLEPc.DS.setState slepc4py.SLEPc.DS-class.html#setState slepc4py.SLEPc.DS.__new__ slepc4py.SLEPc.DS-class.html#__new__ slepc4py.SLEPc.DS.setGSVDDimensions slepc4py.SLEPc.DS-class.html#setGSVDDimensions slepc4py.SLEPc.DS.destroy slepc4py.SLEPc.DS-class.html#destroy slepc4py.SLEPc.DS.ParallelType slepc4py.SLEPc.DS.ParallelType-class.html slepc4py.SLEPc.DS.getRefined slepc4py.SLEPc.DS-class.html#getRefined slepc4py.SLEPc.DS.parallel slepc4py.SLEPc.DS-class.html#parallel slepc4py.SLEPc.DS.getHSVDDimensions slepc4py.SLEPc.DS-class.html#getHSVDDimensions slepc4py.SLEPc.DS.MatType slepc4py.SLEPc.DS.MatType-class.html slepc4py.SLEPc.DS.MatType.A slepc4py.SLEPc.DS.MatType-class.html#A slepc4py.SLEPc.DS.MatType.C slepc4py.SLEPc.DS.MatType-class.html#C slepc4py.SLEPc.DS.MatType.B slepc4py.SLEPc.DS.MatType-class.html#B slepc4py.SLEPc.DS.MatType.D slepc4py.SLEPc.DS.MatType-class.html#D slepc4py.SLEPc.DS.MatType.Q slepc4py.SLEPc.DS.MatType-class.html#Q slepc4py.SLEPc.DS.MatType.U slepc4py.SLEPc.DS.MatType-class.html#U slepc4py.SLEPc.DS.MatType.T slepc4py.SLEPc.DS.MatType-class.html#T slepc4py.SLEPc.DS.MatType.W slepc4py.SLEPc.DS.MatType-class.html#W slepc4py.SLEPc.DS.MatType.V slepc4py.SLEPc.DS.MatType-class.html#V slepc4py.SLEPc.DS.MatType.Y slepc4py.SLEPc.DS.MatType-class.html#Y slepc4py.SLEPc.DS.MatType.X slepc4py.SLEPc.DS.MatType-class.html#X slepc4py.SLEPc.DS.MatType.Z slepc4py.SLEPc.DS.MatType-class.html#Z slepc4py.SLEPc.DS.MatType.__qualname__ slepc4py.SLEPc.DS.MatType-class.html#__qualname__ slepc4py.SLEPc.DS.ParallelType slepc4py.SLEPc.DS.ParallelType-class.html slepc4py.SLEPc.DS.ParallelType.SYNCHRONIZED slepc4py.SLEPc.DS.ParallelType-class.html#SYNCHRONIZED slepc4py.SLEPc.DS.ParallelType.DISTRIBUTED slepc4py.SLEPc.DS.ParallelType-class.html#DISTRIBUTED slepc4py.SLEPc.DS.ParallelType.REDUNDANT slepc4py.SLEPc.DS.ParallelType-class.html#REDUNDANT slepc4py.SLEPc.DS.ParallelType.__qualname__ slepc4py.SLEPc.DS.ParallelType-class.html#__qualname__ slepc4py.SLEPc.DS.StateType slepc4py.SLEPc.DS.StateType-class.html slepc4py.SLEPc.DS.StateType.CONDENSED slepc4py.SLEPc.DS.StateType-class.html#CONDENSED slepc4py.SLEPc.DS.StateType.TRUNCATED slepc4py.SLEPc.DS.StateType-class.html#TRUNCATED slepc4py.SLEPc.DS.StateType.__qualname__ slepc4py.SLEPc.DS.StateType-class.html#__qualname__ slepc4py.SLEPc.DS.StateType.RAW slepc4py.SLEPc.DS.StateType-class.html#RAW slepc4py.SLEPc.DS.StateType.INTERMEDIATE slepc4py.SLEPc.DS.StateType-class.html#INTERMEDIATE slepc4py.SLEPc.DS.Type slepc4py.SLEPc.DS.Type-class.html slepc4py.SLEPc.DS.Type.NEP slepc4py.SLEPc.DS.Type-class.html#NEP slepc4py.SLEPc.DS.Type.HSVD slepc4py.SLEPc.DS.Type-class.html#HSVD slepc4py.SLEPc.DS.Type.GNHEP slepc4py.SLEPc.DS.Type-class.html#GNHEP slepc4py.SLEPc.DS.Type.HEP slepc4py.SLEPc.DS.Type-class.html#HEP slepc4py.SLEPc.DS.Type.GHIEP slepc4py.SLEPc.DS.Type-class.html#GHIEP slepc4py.SLEPc.DS.Type.PEP slepc4py.SLEPc.DS.Type-class.html#PEP slepc4py.SLEPc.DS.Type.SVD slepc4py.SLEPc.DS.Type-class.html#SVD slepc4py.SLEPc.DS.Type.GSVD slepc4py.SLEPc.DS.Type-class.html#GSVD slepc4py.SLEPc.DS.Type.GHEP slepc4py.SLEPc.DS.Type-class.html#GHEP slepc4py.SLEPc.DS.Type.NHEPTS slepc4py.SLEPc.DS.Type-class.html#NHEPTS slepc4py.SLEPc.DS.Type.__qualname__ slepc4py.SLEPc.DS.Type-class.html#__qualname__ slepc4py.SLEPc.DS.Type.NHEP slepc4py.SLEPc.DS.Type-class.html#NHEP slepc4py.SLEPc.EPS slepc4py.SLEPc.EPS-class.html slepc4py.SLEPc.EPS.setGDInitialSize slepc4py.SLEPc.EPS-class.html#setGDInitialSize slepc4py.SLEPc.EPS.setJDBlockSize slepc4py.SLEPc.EPS-class.html#setJDBlockSize slepc4py.SLEPc.EPS.setWhichEigenpairs slepc4py.SLEPc.EPS-class.html#setWhichEigenpairs slepc4py.SLEPc.EPS.setStoppingTest slepc4py.SLEPc.EPS-class.html#setStoppingTest slepc4py.SLEPc.EPS.getJDInitialSize slepc4py.SLEPc.EPS-class.html#getJDInitialSize slepc4py.SLEPc.EPS.setJDInitialSize slepc4py.SLEPc.EPS-class.html#setJDInitialSize slepc4py.SLEPc.EPS.setMonitor slepc4py.SLEPc.EPS-class.html#setMonitor slepc4py.SLEPc.EPS.cancelMonitor slepc4py.SLEPc.EPS-class.html#cancelMonitor slepc4py.SLEPc.EPS.max_it slepc4py.SLEPc.EPS-class.html#max_it slepc4py.SLEPc.EPS.getTrueResidual slepc4py.SLEPc.EPS-class.html#getTrueResidual slepc4py.SLEPc.EPS.setGDKrylovStart slepc4py.SLEPc.EPS-class.html#setGDKrylovStart slepc4py.SLEPc.EPS.getRG slepc4py.SLEPc.EPS-class.html#getRG slepc4py.SLEPc.EPS.setDS slepc4py.SLEPc.EPS-class.html#setDS slepc4py.SLEPc.EPS.setJDConstCorrectionTol slepc4py.SLEPc.EPS-class.html#setJDConstCorrectionTol slepc4py.SLEPc.EPS.getGDInitialSize slepc4py.SLEPc.EPS-class.html#getGDInitialSize slepc4py.SLEPc.EPS.computeError slepc4py.SLEPc.EPS-class.html#computeError slepc4py.SLEPc.EPS.errorView slepc4py.SLEPc.EPS-class.html#errorView slepc4py.SLEPc.EPS.valuesView slepc4py.SLEPc.EPS-class.html#valuesView slepc4py.SLEPc.EPS.setPowerShiftType slepc4py.SLEPc.EPS-class.html#setPowerShiftType slepc4py.SLEPc.EPS.getCISSSizes slepc4py.SLEPc.EPS-class.html#getCISSSizes slepc4py.SLEPc.EPS.appendOptionsPrefix slepc4py.SLEPc.EPS-class.html#appendOptionsPrefix slepc4py.SLEPc.EPS.setOperators slepc4py.SLEPc.EPS-class.html#setOperators slepc4py.SLEPc.EPS.setGDBOrth slepc4py.SLEPc.EPS-class.html#setGDBOrth slepc4py.SLEPc.EPS.getConvergedReason slepc4py.SLEPc.EPS-class.html#getConvergedReason slepc4py.SLEPc.EPS.getGDRestart slepc4py.SLEPc.EPS-class.html#getGDRestart slepc4py.SLEPc.EPS.setInitialSpace slepc4py.SLEPc.EPS-class.html#setInitialSpace slepc4py.SLEPc.EPS.setLOBPCGLocking slepc4py.SLEPc.EPS-class.html#setLOBPCGLocking slepc4py.SLEPc.EPS.getInterval slepc4py.SLEPc.EPS-class.html#getInterval slepc4py.SLEPc.EPS.setOptionsPrefix slepc4py.SLEPc.EPS-class.html#setOptionsPrefix slepc4py.SLEPc.EPS.getKrylovSchurLocking slepc4py.SLEPc.EPS-class.html#getKrylovSchurLocking slepc4py.SLEPc.EPS.getArnoldiDelayed slepc4py.SLEPc.EPS-class.html#getArnoldiDelayed slepc4py.SLEPc.EPS.getLanczosReorthogType slepc4py.SLEPc.EPS-class.html#getLanczosReorthogType slepc4py.SLEPc.EPS.getDimensions slepc4py.SLEPc.EPS-class.html#getDimensions slepc4py.SLEPc.EPS.getKrylovSchurSubintervals slepc4py.SLEPc.EPS-class.html#getKrylovSchurSubintervals slepc4py.SLEPc.EPS.getStoppingTest slepc4py.SLEPc.EPS-class.html#getStoppingTest slepc4py.SLEPc.EPS.isGeneralized slepc4py.SLEPc.EPS-class.html#isGeneralized slepc4py.SLEPc.EPS.ds slepc4py.SLEPc.EPS-class.html#ds slepc4py.SLEPc.EPS.target slepc4py.SLEPc.EPS-class.html#target slepc4py.SLEPc.EPS.setGDRestart slepc4py.SLEPc.EPS-class.html#setGDRestart slepc4py.SLEPc.EPS.setCISSQuadRule slepc4py.SLEPc.EPS-class.html#setCISSQuadRule slepc4py.SLEPc.EPS.isHermitian slepc4py.SLEPc.EPS-class.html#isHermitian slepc4py.SLEPc.EPS.setGDBlockSize slepc4py.SLEPc.EPS-class.html#setGDBlockSize slepc4py.SLEPc.EPS.getKrylovSchurSubcommInfo slepc4py.SLEPc.EPS-class.html#getKrylovSchurSubcommInfo slepc4py.SLEPc.EPS.getJDKrylovStart slepc4py.SLEPc.EPS-class.html#getJDKrylovStart slepc4py.SLEPc.EPS.getBV slepc4py.SLEPc.EPS-class.html#getBV slepc4py.SLEPc.EPS.view slepc4py.SLEPc.EPS-class.html#view slepc4py.SLEPc.EPS.track_all slepc4py.SLEPc.EPS-class.html#track_all slepc4py.SLEPc.EPS.setKrylovSchurDetectZeros slepc4py.SLEPc.EPS-class.html#setKrylovSchurDetectZeros slepc4py.SLEPc.EPS.updateKrylovSchurSubcommMats slepc4py.SLEPc.EPS-class.html#updateKrylovSchurSubcommMats slepc4py.SLEPc.EPS.getLyapIIRanks slepc4py.SLEPc.EPS-class.html#getLyapIIRanks slepc4py.SLEPc.EPS.Extraction slepc4py.SLEPc.EPS.Extraction-class.html slepc4py.SLEPc.EPS.ConvergedReason slepc4py.SLEPc.EPS.ConvergedReason-class.html slepc4py.SLEPc.EPS.setKrylovSchurPartitions slepc4py.SLEPc.EPS-class.html#setKrylovSchurPartitions slepc4py.SLEPc.EPS.setExtraction slepc4py.SLEPc.EPS-class.html#setExtraction slepc4py.SLEPc.EPS.getJDBOrth slepc4py.SLEPc.EPS-class.html#getJDBOrth slepc4py.SLEPc.EPS.Type slepc4py.SLEPc.EPS.Type-class.html slepc4py.SLEPc.EPS.getKrylovSchurInertias slepc4py.SLEPc.EPS-class.html#getKrylovSchurInertias slepc4py.SLEPc.EPS.getLOBPCGBlockSize slepc4py.SLEPc.EPS-class.html#getLOBPCGBlockSize slepc4py.SLEPc.EPS.setTwoSided slepc4py.SLEPc.EPS-class.html#setTwoSided slepc4py.SLEPc.EPS.getJDConstCorrectionTol slepc4py.SLEPc.EPS-class.html#getJDConstCorrectionTol slepc4py.SLEPc.EPS.setLanczosReorthogType slepc4py.SLEPc.EPS-class.html#setLanczosReorthogType slepc4py.SLEPc.EPS.getBalance slepc4py.SLEPc.EPS-class.html#getBalance slepc4py.SLEPc.EPS.getGDKrylovStart slepc4py.SLEPc.EPS-class.html#getGDKrylovStart slepc4py.SLEPc.EPS.rg slepc4py.SLEPc.EPS-class.html#rg slepc4py.SLEPc.EPS.getLOBPCGLocking slepc4py.SLEPc.EPS-class.html#getLOBPCGLocking slepc4py.SLEPc.EPS.getJDRestart slepc4py.SLEPc.EPS-class.html#getJDRestart slepc4py.SLEPc.EPS.setCISSRefinement slepc4py.SLEPc.EPS-class.html#setCISSRefinement slepc4py.SLEPc.EPS.CISSExtraction slepc4py.SLEPc.EPS.CISSExtraction-class.html slepc4py.SLEPc.EPS.getLOBPCGRestart slepc4py.SLEPc.EPS-class.html#getLOBPCGRestart slepc4py.SLEPc.EPS.setUp slepc4py.SLEPc.EPS-class.html#setUp slepc4py.SLEPc.EPS.getST slepc4py.SLEPc.EPS-class.html#getST slepc4py.SLEPc.EPS.getDS slepc4py.SLEPc.EPS-class.html#getDS slepc4py.SLEPc.EPS.getTolerances slepc4py.SLEPc.EPS-class.html#getTolerances slepc4py.SLEPc.EPS.setArbitrarySelection slepc4py.SLEPc.EPS-class.html#setArbitrarySelection slepc4py.SLEPc.EPS.getOptionsPrefix slepc4py.SLEPc.EPS-class.html#getOptionsPrefix slepc4py.SLEPc.EPS.getOperators slepc4py.SLEPc.EPS-class.html#getOperators slepc4py.SLEPc.EPS.getJDFix slepc4py.SLEPc.EPS-class.html#getJDFix slepc4py.SLEPc.EPS.setArnoldiDelayed slepc4py.SLEPc.EPS-class.html#setArnoldiDelayed slepc4py.SLEPc.EPS.setJDFix slepc4py.SLEPc.EPS-class.html#setJDFix slepc4py.SLEPc.EPS.setJDBOrth slepc4py.SLEPc.EPS-class.html#setJDBOrth slepc4py.SLEPc.EPS.Conv slepc4py.SLEPc.EPS.Conv-class.html slepc4py.SLEPc.EPS.setLeftInitialSpace slepc4py.SLEPc.EPS-class.html#setLeftInitialSpace slepc4py.SLEPc.EPS.getConvergenceTest slepc4py.SLEPc.EPS-class.html#getConvergenceTest slepc4py.SLEPc.EPS.getGDBOrth slepc4py.SLEPc.EPS-class.html#getGDBOrth slepc4py.SLEPc.EPS.setTolerances slepc4py.SLEPc.EPS-class.html#setTolerances slepc4py.SLEPc.EPS.getEigenpair slepc4py.SLEPc.EPS-class.html#getEigenpair slepc4py.SLEPc.EPS.getKrylovSchurDimensions slepc4py.SLEPc.EPS-class.html#getKrylovSchurDimensions slepc4py.SLEPc.EPS.setEigenvalueComparison slepc4py.SLEPc.EPS-class.html#setEigenvalueComparison slepc4py.SLEPc.EPS.getConverged slepc4py.SLEPc.EPS-class.html#getConverged slepc4py.SLEPc.EPS.setKrylovSchurLocking slepc4py.SLEPc.EPS-class.html#setKrylovSchurLocking slepc4py.SLEPc.EPS.getTarget slepc4py.SLEPc.EPS-class.html#getTarget slepc4py.SLEPc.EPS.getPowerShiftType slepc4py.SLEPc.EPS-class.html#getPowerShiftType slepc4py.SLEPc.EPS.setLyapIIRanks slepc4py.SLEPc.EPS-class.html#setLyapIIRanks slepc4py.SLEPc.EPS.problem_type slepc4py.SLEPc.EPS-class.html#problem_type slepc4py.SLEPc.EPS.getGDDoubleExpansion slepc4py.SLEPc.EPS-class.html#getGDDoubleExpansion slepc4py.SLEPc.EPS.setType slepc4py.SLEPc.EPS-class.html#setType slepc4py.SLEPc.EPS.setLOBPCGBlockSize slepc4py.SLEPc.EPS-class.html#setLOBPCGBlockSize slepc4py.SLEPc.EPS.getKrylovSchurKSP slepc4py.SLEPc.EPS-class.html#getKrylovSchurKSP slepc4py.SLEPc.EPS.getCISSThreshold slepc4py.SLEPc.EPS-class.html#getCISSThreshold slepc4py.SLEPc.EPS.create slepc4py.SLEPc.EPS-class.html#create slepc4py.SLEPc.EPS.LanczosReorthogType slepc4py.SLEPc.EPS.LanczosReorthogType-class.html slepc4py.SLEPc.EPS.extraction slepc4py.SLEPc.EPS-class.html#extraction slepc4py.SLEPc.EPS.tol slepc4py.SLEPc.EPS-class.html#tol slepc4py.SLEPc.EPS.getRQCGReset slepc4py.SLEPc.EPS-class.html#getRQCGReset slepc4py.SLEPc.EPS.getErrorEstimate slepc4py.SLEPc.EPS-class.html#getErrorEstimate slepc4py.SLEPc.EPS.getProblemType slepc4py.SLEPc.EPS-class.html#getProblemType slepc4py.SLEPc.EPS.getEigenvalue slepc4py.SLEPc.EPS-class.html#getEigenvalue slepc4py.SLEPc.EPS.getJDBlockSize slepc4py.SLEPc.EPS-class.html#getJDBlockSize slepc4py.SLEPc.EPS.getGDBlockSize slepc4py.SLEPc.EPS-class.html#getGDBlockSize slepc4py.SLEPc.EPS.getLeftEigenvector slepc4py.SLEPc.EPS-class.html#getLeftEigenvector slepc4py.SLEPc.EPS.setInterval slepc4py.SLEPc.EPS-class.html#setInterval slepc4py.SLEPc.EPS.setTarget slepc4py.SLEPc.EPS-class.html#setTarget slepc4py.SLEPc.EPS.getType slepc4py.SLEPc.EPS-class.html#getType slepc4py.SLEPc.EPS.getMonitor slepc4py.SLEPc.EPS-class.html#getMonitor slepc4py.SLEPc.EPS.getKrylovSchurDetectZeros slepc4py.SLEPc.EPS-class.html#getKrylovSchurDetectZeros slepc4py.SLEPc.EPS.vectorsView slepc4py.SLEPc.EPS-class.html#vectorsView slepc4py.SLEPc.EPS.setJDRestart slepc4py.SLEPc.EPS-class.html#setJDRestart slepc4py.SLEPc.EPS.bv slepc4py.SLEPc.EPS-class.html#bv slepc4py.SLEPc.EPS.getTrackAll slepc4py.SLEPc.EPS-class.html#getTrackAll slepc4py.SLEPc.EPS.Balance slepc4py.SLEPc.EPS.Balance-class.html slepc4py.SLEPc.EPS.getWhichEigenpairs slepc4py.SLEPc.EPS-class.html#getWhichEigenpairs slepc4py.SLEPc.EPS.reset slepc4py.SLEPc.EPS-class.html#reset slepc4py.SLEPc.EPS.getKrylovSchurSubcommPairs slepc4py.SLEPc.EPS-class.html#getKrylovSchurSubcommPairs slepc4py.SLEPc.EPS.setJDKrylovStart slepc4py.SLEPc.EPS-class.html#setJDKrylovStart slepc4py.SLEPc.EPS.CISSQuadRule slepc4py.SLEPc.EPS.CISSQuadRule-class.html slepc4py.SLEPc.EPS.ErrorType slepc4py.SLEPc.EPS.ErrorType-class.html slepc4py.SLEPc.EPS.getKrylovSchurPartitions slepc4py.SLEPc.EPS-class.html#getKrylovSchurPartitions slepc4py.SLEPc.EPS.getKrylovSchurSubcommMats slepc4py.SLEPc.EPS-class.html#getKrylovSchurSubcommMats slepc4py.SLEPc.EPS.setConvergenceTest slepc4py.SLEPc.EPS-class.html#setConvergenceTest slepc4py.SLEPc.EPS.getIterationNumber slepc4py.SLEPc.EPS-class.html#getIterationNumber slepc4py.SLEPc.EPS.getKrylovSchurRestart slepc4py.SLEPc.EPS-class.html#getKrylovSchurRestart slepc4py.SLEPc.EPS.setDimensions slepc4py.SLEPc.EPS-class.html#setDimensions slepc4py.SLEPc.EPS.Which slepc4py.SLEPc.EPS.Which-class.html slepc4py.SLEPc.EPS.setRQCGReset slepc4py.SLEPc.EPS-class.html#setRQCGReset slepc4py.SLEPc.EPS.setKrylovSchurRestart slepc4py.SLEPc.EPS-class.html#setKrylovSchurRestart slepc4py.SLEPc.EPS.getCISSUseST slepc4py.SLEPc.EPS-class.html#getCISSUseST slepc4py.SLEPc.EPS.getCISSExtraction slepc4py.SLEPc.EPS-class.html#getCISSExtraction slepc4py.SLEPc.EPS.setTrueResidual slepc4py.SLEPc.EPS-class.html#setTrueResidual slepc4py.SLEPc.EPS.isPositive slepc4py.SLEPc.EPS-class.html#isPositive slepc4py.SLEPc.EPS.setBV slepc4py.SLEPc.EPS-class.html#setBV slepc4py.SLEPc.EPS.getCISSKSPs slepc4py.SLEPc.EPS-class.html#getCISSKSPs slepc4py.SLEPc.EPS.setTrackAll slepc4py.SLEPc.EPS-class.html#setTrackAll slepc4py.SLEPc.EPS.setCISSSizes slepc4py.SLEPc.EPS-class.html#setCISSSizes slepc4py.SLEPc.EPS.getInvariantSubspace slepc4py.SLEPc.EPS-class.html#getInvariantSubspace slepc4py.SLEPc.EPS.__new__ slepc4py.SLEPc.EPS-class.html#__new__ slepc4py.SLEPc.EPS.setKrylovSchurSubintervals slepc4py.SLEPc.EPS-class.html#setKrylovSchurSubintervals slepc4py.SLEPc.EPS.setKrylovSchurDimensions slepc4py.SLEPc.EPS-class.html#setKrylovSchurDimensions slepc4py.SLEPc.EPS.getCISSQuadRule slepc4py.SLEPc.EPS-class.html#getCISSQuadRule slepc4py.SLEPc.EPS.Stop slepc4py.SLEPc.EPS.Stop-class.html slepc4py.SLEPc.EPS.true_residual slepc4py.SLEPc.EPS-class.html#true_residual slepc4py.SLEPc.EPS.setRG slepc4py.SLEPc.EPS-class.html#setRG slepc4py.SLEPc.EPS.which slepc4py.SLEPc.EPS-class.html#which slepc4py.SLEPc.EPS.PowerShiftType slepc4py.SLEPc.EPS.PowerShiftType-class.html slepc4py.SLEPc.EPS.destroy slepc4py.SLEPc.EPS-class.html#destroy slepc4py.SLEPc.EPS.getTwoSided slepc4py.SLEPc.EPS-class.html#getTwoSided slepc4py.SLEPc.EPS.setLOBPCGRestart slepc4py.SLEPc.EPS-class.html#setLOBPCGRestart slepc4py.SLEPc.EPS.getCISSRefinement slepc4py.SLEPc.EPS-class.html#getCISSRefinement slepc4py.SLEPc.EPS.setPurify slepc4py.SLEPc.EPS-class.html#setPurify slepc4py.SLEPc.EPS.getPurify slepc4py.SLEPc.EPS-class.html#getPurify slepc4py.SLEPc.EPS.setProblemType slepc4py.SLEPc.EPS-class.html#setProblemType slepc4py.SLEPc.EPS.setDeflationSpace slepc4py.SLEPc.EPS-class.html#setDeflationSpace slepc4py.SLEPc.EPS.ProblemType slepc4py.SLEPc.EPS.ProblemType-class.html slepc4py.SLEPc.EPS.setBalance slepc4py.SLEPc.EPS-class.html#setBalance slepc4py.SLEPc.EPS.setST slepc4py.SLEPc.EPS-class.html#setST slepc4py.SLEPc.EPS.setCISSExtraction slepc4py.SLEPc.EPS-class.html#setCISSExtraction slepc4py.SLEPc.EPS.setGDDoubleExpansion slepc4py.SLEPc.EPS-class.html#setGDDoubleExpansion slepc4py.SLEPc.EPS.two_sided slepc4py.SLEPc.EPS-class.html#two_sided slepc4py.SLEPc.EPS.setCISSUseST slepc4py.SLEPc.EPS-class.html#setCISSUseST slepc4py.SLEPc.EPS.purify slepc4py.SLEPc.EPS-class.html#purify slepc4py.SLEPc.EPS.st slepc4py.SLEPc.EPS-class.html#st slepc4py.SLEPc.EPS.setCISSThreshold slepc4py.SLEPc.EPS-class.html#setCISSThreshold slepc4py.SLEPc.EPS.solve slepc4py.SLEPc.EPS-class.html#solve slepc4py.SLEPc.EPS.setFromOptions slepc4py.SLEPc.EPS-class.html#setFromOptions slepc4py.SLEPc.EPS.getExtraction slepc4py.SLEPc.EPS-class.html#getExtraction slepc4py.SLEPc.EPS.getEigenvector slepc4py.SLEPc.EPS-class.html#getEigenvector slepc4py.SLEPc.EPS.Balance slepc4py.SLEPc.EPS.Balance-class.html slepc4py.SLEPc.EPS.Balance.ONESIDE slepc4py.SLEPc.EPS.Balance-class.html#ONESIDE slepc4py.SLEPc.EPS.Balance.TWOSIDE slepc4py.SLEPc.EPS.Balance-class.html#TWOSIDE slepc4py.SLEPc.EPS.Balance.NONE slepc4py.SLEPc.EPS.Balance-class.html#NONE slepc4py.SLEPc.EPS.Balance.__qualname__ slepc4py.SLEPc.EPS.Balance-class.html#__qualname__ slepc4py.SLEPc.EPS.Balance.USER slepc4py.SLEPc.EPS.Balance-class.html#USER slepc4py.SLEPc.EPS.CISSExtraction slepc4py.SLEPc.EPS.CISSExtraction-class.html slepc4py.SLEPc.EPS.CISSExtraction.RITZ slepc4py.SLEPc.EPS.CISSExtraction-class.html#RITZ slepc4py.SLEPc.EPS.CISSExtraction.__qualname__ slepc4py.SLEPc.EPS.CISSExtraction-class.html#__qualname__ slepc4py.SLEPc.EPS.CISSExtraction.HANKEL slepc4py.SLEPc.EPS.CISSExtraction-class.html#HANKEL slepc4py.SLEPc.EPS.CISSQuadRule slepc4py.SLEPc.EPS.CISSQuadRule-class.html slepc4py.SLEPc.EPS.CISSQuadRule.CHEBYSHEV slepc4py.SLEPc.EPS.CISSQuadRule-class.html#CHEBYSHEV slepc4py.SLEPc.EPS.CISSQuadRule.__qualname__ slepc4py.SLEPc.EPS.CISSQuadRule-class.html#__qualname__ slepc4py.SLEPc.EPS.CISSQuadRule.TRAPEZOIDAL slepc4py.SLEPc.EPS.CISSQuadRule-class.html#TRAPEZOIDAL slepc4py.SLEPc.EPS.Conv slepc4py.SLEPc.EPS.Conv-class.html slepc4py.SLEPc.EPS.Conv.__qualname__ slepc4py.SLEPc.EPS.Conv-class.html#__qualname__ slepc4py.SLEPc.EPS.Conv.ABS slepc4py.SLEPc.EPS.Conv-class.html#ABS slepc4py.SLEPc.EPS.Conv.USER slepc4py.SLEPc.EPS.Conv-class.html#USER slepc4py.SLEPc.EPS.Conv.REL slepc4py.SLEPc.EPS.Conv-class.html#REL slepc4py.SLEPc.EPS.Conv.NORM slepc4py.SLEPc.EPS.Conv-class.html#NORM slepc4py.SLEPc.EPS.ConvergedReason slepc4py.SLEPc.EPS.ConvergedReason-class.html slepc4py.SLEPc.EPS.ConvergedReason.DIVERGED_BREAKDOWN slepc4py.SLEPc.EPS.ConvergedReason-class.html#DIVERGED_BREAKDOWN slepc4py.SLEPc.EPS.ConvergedReason.CONVERGED_USER slepc4py.SLEPc.EPS.ConvergedReason-class.html#CONVERGED_USER slepc4py.SLEPc.EPS.ConvergedReason.DIVERGED_SYMMETRY_LOST slepc4py.SLEPc.EPS.ConvergedReason-class.html#DIVERGED_SYMMETRY_LOST slepc4py.SLEPc.EPS.ConvergedReason.CONVERGED_TOL slepc4py.SLEPc.EPS.ConvergedReason-class.html#CONVERGED_TOL slepc4py.SLEPc.EPS.ConvergedReason.ITERATING slepc4py.SLEPc.EPS.ConvergedReason-class.html#ITERATING slepc4py.SLEPc.EPS.ConvergedReason.CONVERGED_ITERATING slepc4py.SLEPc.EPS.ConvergedReason-class.html#CONVERGED_ITERATING slepc4py.SLEPc.EPS.ConvergedReason.DIVERGED_ITS slepc4py.SLEPc.EPS.ConvergedReason-class.html#DIVERGED_ITS slepc4py.SLEPc.EPS.ConvergedReason.__qualname__ slepc4py.SLEPc.EPS.ConvergedReason-class.html#__qualname__ slepc4py.SLEPc.EPS.ErrorType slepc4py.SLEPc.EPS.ErrorType-class.html slepc4py.SLEPc.EPS.ErrorType.__qualname__ slepc4py.SLEPc.EPS.ErrorType-class.html#__qualname__ slepc4py.SLEPc.EPS.ErrorType.RELATIVE slepc4py.SLEPc.EPS.ErrorType-class.html#RELATIVE slepc4py.SLEPc.EPS.ErrorType.BACKWARD slepc4py.SLEPc.EPS.ErrorType-class.html#BACKWARD slepc4py.SLEPc.EPS.ErrorType.ABSOLUTE slepc4py.SLEPc.EPS.ErrorType-class.html#ABSOLUTE slepc4py.SLEPc.EPS.Extraction slepc4py.SLEPc.EPS.Extraction-class.html slepc4py.SLEPc.EPS.Extraction.HARMONIC slepc4py.SLEPc.EPS.Extraction-class.html#HARMONIC slepc4py.SLEPc.EPS.Extraction.HARMONIC_RIGHT slepc4py.SLEPc.EPS.Extraction-class.html#HARMONIC_RIGHT slepc4py.SLEPc.EPS.Extraction.HARMONIC_RELATIVE slepc4py.SLEPc.EPS.Extraction-class.html#HARMONIC_RELATIVE slepc4py.SLEPc.EPS.Extraction.HARMONIC_LARGEST slepc4py.SLEPc.EPS.Extraction-class.html#HARMONIC_LARGEST slepc4py.SLEPc.EPS.Extraction.REFINED_HARMONIC slepc4py.SLEPc.EPS.Extraction-class.html#REFINED_HARMONIC slepc4py.SLEPc.EPS.Extraction.RITZ slepc4py.SLEPc.EPS.Extraction-class.html#RITZ slepc4py.SLEPc.EPS.Extraction.__qualname__ slepc4py.SLEPc.EPS.Extraction-class.html#__qualname__ slepc4py.SLEPc.EPS.Extraction.REFINED slepc4py.SLEPc.EPS.Extraction-class.html#REFINED slepc4py.SLEPc.EPS.LanczosReorthogType slepc4py.SLEPc.EPS.LanczosReorthogType-class.html slepc4py.SLEPc.EPS.LanczosReorthogType.FULL slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#FULL slepc4py.SLEPc.EPS.LanczosReorthogType.PARTIAL slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#PARTIAL slepc4py.SLEPc.EPS.LanczosReorthogType.DELAYED slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#DELAYED slepc4py.SLEPc.EPS.LanczosReorthogType.__qualname__ slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#__qualname__ slepc4py.SLEPc.EPS.LanczosReorthogType.SELECTIVE slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#SELECTIVE slepc4py.SLEPc.EPS.LanczosReorthogType.LOCAL slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#LOCAL slepc4py.SLEPc.EPS.LanczosReorthogType.PERIODIC slepc4py.SLEPc.EPS.LanczosReorthogType-class.html#PERIODIC slepc4py.SLEPc.EPS.PowerShiftType slepc4py.SLEPc.EPS.PowerShiftType-class.html slepc4py.SLEPc.EPS.PowerShiftType.CONSTANT slepc4py.SLEPc.EPS.PowerShiftType-class.html#CONSTANT slepc4py.SLEPc.EPS.PowerShiftType.RAYLEIGH slepc4py.SLEPc.EPS.PowerShiftType-class.html#RAYLEIGH slepc4py.SLEPc.EPS.PowerShiftType.__qualname__ slepc4py.SLEPc.EPS.PowerShiftType-class.html#__qualname__ slepc4py.SLEPc.EPS.PowerShiftType.WILKINSON slepc4py.SLEPc.EPS.PowerShiftType-class.html#WILKINSON slepc4py.SLEPc.EPS.ProblemType slepc4py.SLEPc.EPS.ProblemType-class.html slepc4py.SLEPc.EPS.ProblemType.GHEP slepc4py.SLEPc.EPS.ProblemType-class.html#GHEP slepc4py.SLEPc.EPS.ProblemType.HEP slepc4py.SLEPc.EPS.ProblemType-class.html#HEP slepc4py.SLEPc.EPS.ProblemType.GHIEP slepc4py.SLEPc.EPS.ProblemType-class.html#GHIEP slepc4py.SLEPc.EPS.ProblemType.PGNHEP slepc4py.SLEPc.EPS.ProblemType-class.html#PGNHEP slepc4py.SLEPc.EPS.ProblemType.__qualname__ slepc4py.SLEPc.EPS.ProblemType-class.html#__qualname__ slepc4py.SLEPc.EPS.ProblemType.NHEP slepc4py.SLEPc.EPS.ProblemType-class.html#NHEP slepc4py.SLEPc.EPS.ProblemType.GNHEP slepc4py.SLEPc.EPS.ProblemType-class.html#GNHEP slepc4py.SLEPc.EPS.Stop slepc4py.SLEPc.EPS.Stop-class.html slepc4py.SLEPc.EPS.Stop.__qualname__ slepc4py.SLEPc.EPS.Stop-class.html#__qualname__ slepc4py.SLEPc.EPS.Stop.USER slepc4py.SLEPc.EPS.Stop-class.html#USER slepc4py.SLEPc.EPS.Stop.BASIC slepc4py.SLEPc.EPS.Stop-class.html#BASIC slepc4py.SLEPc.EPS.Type slepc4py.SLEPc.EPS.Type-class.html slepc4py.SLEPc.EPS.Type.EVSL slepc4py.SLEPc.EPS.Type-class.html#EVSL slepc4py.SLEPc.EPS.Type.SUBSPACE slepc4py.SLEPc.EPS.Type-class.html#SUBSPACE slepc4py.SLEPc.EPS.Type.ELPA slepc4py.SLEPc.EPS.Type-class.html#ELPA slepc4py.SLEPc.EPS.Type.JD slepc4py.SLEPc.EPS.Type-class.html#JD slepc4py.SLEPc.EPS.Type.LOBPCG slepc4py.SLEPc.EPS.Type-class.html#LOBPCG slepc4py.SLEPc.EPS.Type.SCALAPACK slepc4py.SLEPc.EPS.Type-class.html#SCALAPACK slepc4py.SLEPc.EPS.Type.RQCG slepc4py.SLEPc.EPS.Type-class.html#RQCG slepc4py.SLEPc.EPS.Type.POWER slepc4py.SLEPc.EPS.Type-class.html#POWER slepc4py.SLEPc.EPS.Type.LAPACK slepc4py.SLEPc.EPS.Type-class.html#LAPACK slepc4py.SLEPc.EPS.Type.CISS slepc4py.SLEPc.EPS.Type-class.html#CISS slepc4py.SLEPc.EPS.Type.TRLAN slepc4py.SLEPc.EPS.Type-class.html#TRLAN slepc4py.SLEPc.EPS.Type.ARNOLDI slepc4py.SLEPc.EPS.Type-class.html#ARNOLDI slepc4py.SLEPc.EPS.Type.LANCZOS slepc4py.SLEPc.EPS.Type-class.html#LANCZOS slepc4py.SLEPc.EPS.Type.ARPACK slepc4py.SLEPc.EPS.Type-class.html#ARPACK slepc4py.SLEPc.EPS.Type.KRYLOVSCHUR slepc4py.SLEPc.EPS.Type-class.html#KRYLOVSCHUR slepc4py.SLEPc.EPS.Type.FEAST slepc4py.SLEPc.EPS.Type-class.html#FEAST slepc4py.SLEPc.EPS.Type.ELEMENTAL slepc4py.SLEPc.EPS.Type-class.html#ELEMENTAL slepc4py.SLEPc.EPS.Type.LYAPII slepc4py.SLEPc.EPS.Type-class.html#LYAPII slepc4py.SLEPc.EPS.Type.GD slepc4py.SLEPc.EPS.Type-class.html#GD slepc4py.SLEPc.EPS.Type.BLOPEX slepc4py.SLEPc.EPS.Type-class.html#BLOPEX slepc4py.SLEPc.EPS.Type.PRIMME slepc4py.SLEPc.EPS.Type-class.html#PRIMME slepc4py.SLEPc.EPS.Type.__qualname__ slepc4py.SLEPc.EPS.Type-class.html#__qualname__ slepc4py.SLEPc.EPS.Which slepc4py.SLEPc.EPS.Which-class.html slepc4py.SLEPc.EPS.Which.TARGET_MAGNITUDE slepc4py.SLEPc.EPS.Which-class.html#TARGET_MAGNITUDE slepc4py.SLEPc.EPS.Which.LARGEST_IMAGINARY slepc4py.SLEPc.EPS.Which-class.html#LARGEST_IMAGINARY slepc4py.SLEPc.EPS.Which.USER slepc4py.SLEPc.EPS.Which-class.html#USER slepc4py.SLEPc.EPS.Which.SMALLEST_REAL slepc4py.SLEPc.EPS.Which-class.html#SMALLEST_REAL slepc4py.SLEPc.EPS.Which.SMALLEST_MAGNITUDE slepc4py.SLEPc.EPS.Which-class.html#SMALLEST_MAGNITUDE slepc4py.SLEPc.EPS.Which.SMALLEST_IMAGINARY slepc4py.SLEPc.EPS.Which-class.html#SMALLEST_IMAGINARY slepc4py.SLEPc.EPS.Which.LARGEST_REAL slepc4py.SLEPc.EPS.Which-class.html#LARGEST_REAL slepc4py.SLEPc.EPS.Which.ALL slepc4py.SLEPc.EPS.Which-class.html#ALL slepc4py.SLEPc.EPS.Which.LARGEST_MAGNITUDE slepc4py.SLEPc.EPS.Which-class.html#LARGEST_MAGNITUDE slepc4py.SLEPc.EPS.Which.__qualname__ slepc4py.SLEPc.EPS.Which-class.html#__qualname__ slepc4py.SLEPc.EPS.Which.TARGET_IMAGINARY slepc4py.SLEPc.EPS.Which-class.html#TARGET_IMAGINARY slepc4py.SLEPc.EPS.Which.TARGET_REAL slepc4py.SLEPc.EPS.Which-class.html#TARGET_REAL slepc4py.SLEPc.FN slepc4py.SLEPc.FN-class.html slepc4py.SLEPc.FN.evaluateFunction slepc4py.SLEPc.FN-class.html#evaluateFunction slepc4py.SLEPc.FN.getRationalDenominator slepc4py.SLEPc.FN-class.html#getRationalDenominator slepc4py.SLEPc.FN.setScale slepc4py.SLEPc.FN-class.html#setScale slepc4py.SLEPc.FN.setMethod slepc4py.SLEPc.FN-class.html#setMethod slepc4py.SLEPc.FN.getPhiIndex slepc4py.SLEPc.FN-class.html#getPhiIndex slepc4py.SLEPc.FN.getRationalNumerator slepc4py.SLEPc.FN-class.html#getRationalNumerator slepc4py.SLEPc.FN.Type slepc4py.SLEPc.FN.Type-class.html slepc4py.SLEPc.FN.setType slepc4py.SLEPc.FN-class.html#setType slepc4py.SLEPc.FN.__new__ slepc4py.SLEPc.FN-class.html#__new__ slepc4py.SLEPc.FN.evaluateDerivative slepc4py.SLEPc.FN-class.html#evaluateDerivative slepc4py.SLEPc.FN.create slepc4py.SLEPc.FN-class.html#create slepc4py.SLEPc.FN.getMethod slepc4py.SLEPc.FN-class.html#getMethod slepc4py.SLEPc.FN.CombineType slepc4py.SLEPc.FN.CombineType-class.html slepc4py.SLEPc.FN.duplicate slepc4py.SLEPc.FN-class.html#duplicate slepc4py.SLEPc.FN.evaluateFunctionMat slepc4py.SLEPc.FN-class.html#evaluateFunctionMat slepc4py.SLEPc.FN.setPhiIndex slepc4py.SLEPc.FN-class.html#setPhiIndex slepc4py.SLEPc.FN.destroy slepc4py.SLEPc.FN-class.html#destroy slepc4py.SLEPc.FN.evaluateFunctionMatVec slepc4py.SLEPc.FN-class.html#evaluateFunctionMatVec slepc4py.SLEPc.FN.method slepc4py.SLEPc.FN-class.html#method slepc4py.SLEPc.FN.setParallel slepc4py.SLEPc.FN-class.html#setParallel slepc4py.SLEPc.FN.ParallelType slepc4py.SLEPc.FN.ParallelType-class.html slepc4py.SLEPc.FN.setRationalNumerator slepc4py.SLEPc.FN-class.html#setRationalNumerator slepc4py.SLEPc.FN.setOptionsPrefix slepc4py.SLEPc.FN-class.html#setOptionsPrefix slepc4py.SLEPc.FN.getType slepc4py.SLEPc.FN-class.html#getType slepc4py.SLEPc.FN.getCombineChildren slepc4py.SLEPc.FN-class.html#getCombineChildren slepc4py.SLEPc.FN.setCombineChildren slepc4py.SLEPc.FN-class.html#setCombineChildren slepc4py.SLEPc.FN.getOptionsPrefix slepc4py.SLEPc.FN-class.html#getOptionsPrefix slepc4py.SLEPc.FN.setFromOptions slepc4py.SLEPc.FN-class.html#setFromOptions slepc4py.SLEPc.FN.getScale slepc4py.SLEPc.FN-class.html#getScale slepc4py.SLEPc.FN.parallel slepc4py.SLEPc.FN-class.html#parallel slepc4py.SLEPc.FN.setRationalDenominator slepc4py.SLEPc.FN-class.html#setRationalDenominator slepc4py.SLEPc.FN.getParallel slepc4py.SLEPc.FN-class.html#getParallel slepc4py.SLEPc.FN.view slepc4py.SLEPc.FN-class.html#view slepc4py.SLEPc.FN.CombineType slepc4py.SLEPc.FN.CombineType-class.html slepc4py.SLEPc.FN.CombineType.COMPOSE slepc4py.SLEPc.FN.CombineType-class.html#COMPOSE slepc4py.SLEPc.FN.CombineType.DIVIDE slepc4py.SLEPc.FN.CombineType-class.html#DIVIDE slepc4py.SLEPc.FN.CombineType.__qualname__ slepc4py.SLEPc.FN.CombineType-class.html#__qualname__ slepc4py.SLEPc.FN.CombineType.ADD slepc4py.SLEPc.FN.CombineType-class.html#ADD slepc4py.SLEPc.FN.CombineType.MULTIPLY slepc4py.SLEPc.FN.CombineType-class.html#MULTIPLY slepc4py.SLEPc.FN.ParallelType slepc4py.SLEPc.FN.ParallelType-class.html slepc4py.SLEPc.FN.ParallelType.SYNCHRONIZED slepc4py.SLEPc.FN.ParallelType-class.html#SYNCHRONIZED slepc4py.SLEPc.FN.ParallelType.REDUNDANT slepc4py.SLEPc.FN.ParallelType-class.html#REDUNDANT slepc4py.SLEPc.FN.ParallelType.__qualname__ slepc4py.SLEPc.FN.ParallelType-class.html#__qualname__ slepc4py.SLEPc.FN.Type slepc4py.SLEPc.FN.Type-class.html slepc4py.SLEPc.FN.Type.LOG slepc4py.SLEPc.FN.Type-class.html#LOG slepc4py.SLEPc.FN.Type.COMBINE slepc4py.SLEPc.FN.Type-class.html#COMBINE slepc4py.SLEPc.FN.Type.EXP slepc4py.SLEPc.FN.Type-class.html#EXP slepc4py.SLEPc.FN.Type.INVSQRT slepc4py.SLEPc.FN.Type-class.html#INVSQRT slepc4py.SLEPc.FN.Type.RATIONAL slepc4py.SLEPc.FN.Type-class.html#RATIONAL slepc4py.SLEPc.FN.Type.PHI slepc4py.SLEPc.FN.Type-class.html#PHI slepc4py.SLEPc.FN.Type.SQRT slepc4py.SLEPc.FN.Type-class.html#SQRT slepc4py.SLEPc.FN.Type.__qualname__ slepc4py.SLEPc.FN.Type-class.html#__qualname__ slepc4py.SLEPc.MFN slepc4py.SLEPc.MFN-class.html slepc4py.SLEPc.MFN.setMonitor slepc4py.SLEPc.MFN-class.html#setMonitor slepc4py.SLEPc.MFN.cancelMonitor slepc4py.SLEPc.MFN-class.html#cancelMonitor slepc4py.SLEPc.MFN.max_it slepc4py.SLEPc.MFN-class.html#max_it slepc4py.SLEPc.MFN.getConvergedReason slepc4py.SLEPc.MFN-class.html#getConvergedReason slepc4py.SLEPc.MFN.setOptionsPrefix slepc4py.SLEPc.MFN-class.html#setOptionsPrefix slepc4py.SLEPc.MFN.getDimensions slepc4py.SLEPc.MFN-class.html#getDimensions slepc4py.SLEPc.MFN.setFromOptions slepc4py.SLEPc.MFN-class.html#setFromOptions slepc4py.SLEPc.MFN.setErrorIfNotConverged slepc4py.SLEPc.MFN-class.html#setErrorIfNotConverged slepc4py.SLEPc.MFN.getBV slepc4py.SLEPc.MFN-class.html#getBV slepc4py.SLEPc.MFN.view slepc4py.SLEPc.MFN-class.html#view slepc4py.SLEPc.MFN.ConvergedReason slepc4py.SLEPc.MFN.ConvergedReason-class.html slepc4py.SLEPc.MFN.setFN slepc4py.SLEPc.MFN-class.html#setFN slepc4py.SLEPc.MFN.Type slepc4py.SLEPc.MFN.Type-class.html slepc4py.SLEPc.MFN.setUp slepc4py.SLEPc.MFN-class.html#setUp slepc4py.SLEPc.MFN.getOptionsPrefix slepc4py.SLEPc.MFN-class.html#getOptionsPrefix slepc4py.SLEPc.MFN.solveTranspose slepc4py.SLEPc.MFN-class.html#solveTranspose slepc4py.SLEPc.MFN.bv slepc4py.SLEPc.MFN-class.html#bv slepc4py.SLEPc.MFN.setTolerances slepc4py.SLEPc.MFN-class.html#setTolerances slepc4py.SLEPc.MFN.appendOptionsPrefix slepc4py.SLEPc.MFN-class.html#appendOptionsPrefix slepc4py.SLEPc.MFN.getErrorIfNotConverged slepc4py.SLEPc.MFN-class.html#getErrorIfNotConverged slepc4py.SLEPc.MFN.setType slepc4py.SLEPc.MFN-class.html#setType slepc4py.SLEPc.MFN.create slepc4py.SLEPc.MFN-class.html#create slepc4py.SLEPc.MFN.tol slepc4py.SLEPc.MFN-class.html#tol slepc4py.SLEPc.MFN.getType slepc4py.SLEPc.MFN-class.html#getType slepc4py.SLEPc.MFN.getFN slepc4py.SLEPc.MFN-class.html#getFN slepc4py.SLEPc.MFN.reset slepc4py.SLEPc.MFN-class.html#reset slepc4py.SLEPc.MFN.setOperator slepc4py.SLEPc.MFN-class.html#setOperator slepc4py.SLEPc.MFN.getIterationNumber slepc4py.SLEPc.MFN-class.html#getIterationNumber slepc4py.SLEPc.MFN.getOperator slepc4py.SLEPc.MFN-class.html#getOperator slepc4py.SLEPc.MFN.setDimensions slepc4py.SLEPc.MFN-class.html#setDimensions slepc4py.SLEPc.MFN.setBV slepc4py.SLEPc.MFN-class.html#setBV slepc4py.SLEPc.MFN.__new__ slepc4py.SLEPc.MFN-class.html#__new__ slepc4py.SLEPc.MFN.destroy slepc4py.SLEPc.MFN-class.html#destroy slepc4py.SLEPc.MFN.getMonitor slepc4py.SLEPc.MFN-class.html#getMonitor slepc4py.SLEPc.MFN.getTolerances slepc4py.SLEPc.MFN-class.html#getTolerances slepc4py.SLEPc.MFN.fn slepc4py.SLEPc.MFN-class.html#fn slepc4py.SLEPc.MFN.solve slepc4py.SLEPc.MFN-class.html#solve slepc4py.SLEPc.MFN.ConvergedReason slepc4py.SLEPc.MFN.ConvergedReason-class.html slepc4py.SLEPc.MFN.ConvergedReason.DIVERGED_BREAKDOWN slepc4py.SLEPc.MFN.ConvergedReason-class.html#DIVERGED_BREAKDOWN slepc4py.SLEPc.MFN.ConvergedReason.ITERATING slepc4py.SLEPc.MFN.ConvergedReason-class.html#ITERATING slepc4py.SLEPc.MFN.ConvergedReason.CONVERGED_ITS slepc4py.SLEPc.MFN.ConvergedReason-class.html#CONVERGED_ITS slepc4py.SLEPc.MFN.ConvergedReason.__qualname__ slepc4py.SLEPc.MFN.ConvergedReason-class.html#__qualname__ slepc4py.SLEPc.MFN.ConvergedReason.CONVERGED_ITERATING slepc4py.SLEPc.MFN.ConvergedReason-class.html#CONVERGED_ITERATING slepc4py.SLEPc.MFN.ConvergedReason.DIVERGED_ITS slepc4py.SLEPc.MFN.ConvergedReason-class.html#DIVERGED_ITS slepc4py.SLEPc.MFN.ConvergedReason.CONVERGED_TOL slepc4py.SLEPc.MFN.ConvergedReason-class.html#CONVERGED_TOL slepc4py.SLEPc.MFN.Type slepc4py.SLEPc.MFN.Type-class.html slepc4py.SLEPc.MFN.Type.__qualname__ slepc4py.SLEPc.MFN.Type-class.html#__qualname__ slepc4py.SLEPc.MFN.Type.KRYLOV slepc4py.SLEPc.MFN.Type-class.html#KRYLOV slepc4py.SLEPc.MFN.Type.EXPOKIT slepc4py.SLEPc.MFN.Type-class.html#EXPOKIT slepc4py.SLEPc.NEP slepc4py.SLEPc.NEP-class.html slepc4py.SLEPc.NEP.setWhichEigenpairs slepc4py.SLEPc.NEP-class.html#setWhichEigenpairs slepc4py.SLEPc.NEP.setStoppingTest slepc4py.SLEPc.NEP-class.html#setStoppingTest slepc4py.SLEPc.NEP.getSLPKSP slepc4py.SLEPc.NEP-class.html#getSLPKSP slepc4py.SLEPc.NEP.setMonitor slepc4py.SLEPc.NEP-class.html#setMonitor slepc4py.SLEPc.NEP.cancelMonitor slepc4py.SLEPc.NEP-class.html#cancelMonitor slepc4py.SLEPc.NEP.max_it slepc4py.SLEPc.NEP-class.html#max_it slepc4py.SLEPc.NEP.getRIIConstCorrectionTol slepc4py.SLEPc.NEP-class.html#getRIIConstCorrectionTol slepc4py.SLEPc.NEP.getRG slepc4py.SLEPc.NEP-class.html#getRG slepc4py.SLEPc.NEP.getNLEIGSLocking slepc4py.SLEPc.NEP-class.html#getNLEIGSLocking slepc4py.SLEPc.NEP.setDS slepc4py.SLEPc.NEP-class.html#setDS slepc4py.SLEPc.NEP.setRIIKSP slepc4py.SLEPc.NEP-class.html#setRIIKSP slepc4py.SLEPc.NEP.computeError slepc4py.SLEPc.NEP-class.html#computeError slepc4py.SLEPc.NEP.errorView slepc4py.SLEPc.NEP-class.html#errorView slepc4py.SLEPc.NEP.RefineScheme slepc4py.SLEPc.NEP.RefineScheme-class.html slepc4py.SLEPc.NEP.valuesView slepc4py.SLEPc.NEP-class.html#valuesView slepc4py.SLEPc.NEP.getCISSSizes slepc4py.SLEPc.NEP-class.html#getCISSSizes slepc4py.SLEPc.NEP.appendOptionsPrefix slepc4py.SLEPc.NEP-class.html#appendOptionsPrefix slepc4py.SLEPc.NEP.getNArnoldiKSP slepc4py.SLEPc.NEP-class.html#getNArnoldiKSP slepc4py.SLEPc.NEP.getConvergedReason slepc4py.SLEPc.NEP-class.html#getConvergedReason slepc4py.SLEPc.NEP.setNLEIGSRKShifts slepc4py.SLEPc.NEP-class.html#setNLEIGSRKShifts slepc4py.SLEPc.NEP.getRIIDeflationThreshold slepc4py.SLEPc.NEP-class.html#getRIIDeflationThreshold slepc4py.SLEPc.NEP.setInitialSpace slepc4py.SLEPc.NEP-class.html#setInitialSpace slepc4py.SLEPc.NEP.setOptionsPrefix slepc4py.SLEPc.NEP-class.html#setOptionsPrefix slepc4py.SLEPc.NEP.getDimensions slepc4py.SLEPc.NEP-class.html#getDimensions slepc4py.SLEPc.NEP.setFromOptions slepc4py.SLEPc.NEP-class.html#setFromOptions slepc4py.SLEPc.NEP.getTarget slepc4py.SLEPc.NEP-class.html#getTarget slepc4py.SLEPc.NEP.getStoppingTest slepc4py.SLEPc.NEP-class.html#getStoppingTest slepc4py.SLEPc.NEP.ds slepc4py.SLEPc.NEP-class.html#ds slepc4py.SLEPc.NEP.setSLPEPS slepc4py.SLEPc.NEP-class.html#setSLPEPS slepc4py.SLEPc.NEP.applyResolvent slepc4py.SLEPc.NEP-class.html#applyResolvent slepc4py.SLEPc.NEP.getBV slepc4py.SLEPc.NEP-class.html#getBV slepc4py.SLEPc.NEP.setRefine slepc4py.SLEPc.NEP-class.html#setRefine slepc4py.SLEPc.NEP.view slepc4py.SLEPc.NEP-class.html#view slepc4py.SLEPc.NEP.track_all slepc4py.SLEPc.NEP-class.html#track_all slepc4py.SLEPc.NEP.getRIILagPreconditioner slepc4py.SLEPc.NEP-class.html#getRIILagPreconditioner slepc4py.SLEPc.NEP.setRIIHermitian slepc4py.SLEPc.NEP-class.html#setRIIHermitian slepc4py.SLEPc.NEP.getInterpolPEP slepc4py.SLEPc.NEP-class.html#getInterpolPEP slepc4py.SLEPc.NEP.setNArnoldiKSP slepc4py.SLEPc.NEP-class.html#setNArnoldiKSP slepc4py.SLEPc.NEP.ConvergedReason slepc4py.SLEPc.NEP.ConvergedReason-class.html slepc4py.SLEPc.NEP.CISSExtraction slepc4py.SLEPc.NEP.CISSExtraction-class.html slepc4py.SLEPc.NEP.setJacobian slepc4py.SLEPc.NEP-class.html#setJacobian slepc4py.SLEPc.NEP.getWhichEigenpairs slepc4py.SLEPc.NEP-class.html#getWhichEigenpairs slepc4py.SLEPc.NEP.Type slepc4py.SLEPc.NEP.Type-class.html slepc4py.SLEPc.NEP.setNArnoldiLagPreconditioner slepc4py.SLEPc.NEP-class.html#setNArnoldiLagPreconditioner slepc4py.SLEPc.NEP.setTwoSided slepc4py.SLEPc.NEP-class.html#setTwoSided slepc4py.SLEPc.NEP.setNLEIGSFullBasis slepc4py.SLEPc.NEP-class.html#setNLEIGSFullBasis slepc4py.SLEPc.NEP.setNLEIGSInterpolation slepc4py.SLEPc.NEP-class.html#setNLEIGSInterpolation slepc4py.SLEPc.NEP.getNLEIGSInterpolation slepc4py.SLEPc.NEP-class.html#getNLEIGSInterpolation slepc4py.SLEPc.NEP.setInterpolInterpolation slepc4py.SLEPc.NEP-class.html#setInterpolInterpolation slepc4py.SLEPc.NEP.rg slepc4py.SLEPc.NEP-class.html#rg slepc4py.SLEPc.NEP.setSLPKSP slepc4py.SLEPc.NEP-class.html#setSLPKSP slepc4py.SLEPc.NEP.setCISSRefinement slepc4py.SLEPc.NEP-class.html#setCISSRefinement slepc4py.SLEPc.NEP.getNLEIGSRKShifts slepc4py.SLEPc.NEP-class.html#getNLEIGSRKShifts slepc4py.SLEPc.NEP.getNLEIGSFullBasis slepc4py.SLEPc.NEP-class.html#getNLEIGSFullBasis slepc4py.SLEPc.NEP.getRIIHermitian slepc4py.SLEPc.NEP-class.html#getRIIHermitian slepc4py.SLEPc.NEP.getSLPEPSLeft slepc4py.SLEPc.NEP-class.html#getSLPEPSLeft slepc4py.SLEPc.NEP.setUp slepc4py.SLEPc.NEP-class.html#setUp slepc4py.SLEPc.NEP.setNLEIGSEPS slepc4py.SLEPc.NEP-class.html#setNLEIGSEPS slepc4py.SLEPc.NEP.getDS slepc4py.SLEPc.NEP-class.html#getDS slepc4py.SLEPc.NEP.getOptionsPrefix slepc4py.SLEPc.NEP-class.html#getOptionsPrefix slepc4py.SLEPc.NEP.getSLPDeflationThreshold slepc4py.SLEPc.NEP-class.html#getSLPDeflationThreshold slepc4py.SLEPc.NEP.Conv slepc4py.SLEPc.NEP.Conv-class.html slepc4py.SLEPc.NEP.getFunction slepc4py.SLEPc.NEP-class.html#getFunction slepc4py.SLEPc.NEP.getConvergenceTest slepc4py.SLEPc.NEP-class.html#getConvergenceTest slepc4py.SLEPc.NEP.Refine slepc4py.SLEPc.NEP.Refine-class.html slepc4py.SLEPc.NEP.setTolerances slepc4py.SLEPc.NEP-class.html#setTolerances slepc4py.SLEPc.NEP.getEigenpair slepc4py.SLEPc.NEP-class.html#getEigenpair slepc4py.SLEPc.NEP.getConverged slepc4py.SLEPc.NEP-class.html#getConverged slepc4py.SLEPc.NEP.setNLEIGSRestart slepc4py.SLEPc.NEP-class.html#setNLEIGSRestart slepc4py.SLEPc.NEP.getNLEIGSKSPs slepc4py.SLEPc.NEP-class.html#getNLEIGSKSPs slepc4py.SLEPc.NEP.getInterpolInterpolation slepc4py.SLEPc.NEP-class.html#getInterpolInterpolation slepc4py.SLEPc.NEP.getJacobian slepc4py.SLEPc.NEP-class.html#getJacobian slepc4py.SLEPc.NEP.setSLPEPSLeft slepc4py.SLEPc.NEP-class.html#setSLPEPSLeft slepc4py.SLEPc.NEP.problem_type slepc4py.SLEPc.NEP-class.html#problem_type slepc4py.SLEPc.NEP.setType slepc4py.SLEPc.NEP-class.html#setType slepc4py.SLEPc.NEP.setFunction slepc4py.SLEPc.NEP-class.html#setFunction slepc4py.SLEPc.NEP.getSLPEPS slepc4py.SLEPc.NEP-class.html#getSLPEPS slepc4py.SLEPc.NEP.getCISSThreshold slepc4py.SLEPc.NEP-class.html#getCISSThreshold slepc4py.SLEPc.NEP.create slepc4py.SLEPc.NEP-class.html#create slepc4py.SLEPc.NEP.tol slepc4py.SLEPc.NEP-class.html#tol slepc4py.SLEPc.NEP.setInterpolPEP slepc4py.SLEPc.NEP-class.html#setInterpolPEP slepc4py.SLEPc.NEP.getErrorEstimate slepc4py.SLEPc.NEP-class.html#getErrorEstimate slepc4py.SLEPc.NEP.setNLEIGSLocking slepc4py.SLEPc.NEP-class.html#setNLEIGSLocking slepc4py.SLEPc.NEP.getProblemType slepc4py.SLEPc.NEP-class.html#getProblemType slepc4py.SLEPc.NEP.getLeftEigenvector slepc4py.SLEPc.NEP-class.html#getLeftEigenvector slepc4py.SLEPc.NEP.getRIIMaximumIterations slepc4py.SLEPc.NEP-class.html#getRIIMaximumIterations slepc4py.SLEPc.NEP.setTarget slepc4py.SLEPc.NEP-class.html#setTarget slepc4py.SLEPc.NEP.getType slepc4py.SLEPc.NEP-class.html#getType slepc4py.SLEPc.NEP.getSplitOperator slepc4py.SLEPc.NEP-class.html#getSplitOperator slepc4py.SLEPc.NEP.setSLPDeflationThreshold slepc4py.SLEPc.NEP-class.html#setSLPDeflationThreshold slepc4py.SLEPc.NEP.getNLEIGSEPS slepc4py.SLEPc.NEP-class.html#getNLEIGSEPS slepc4py.SLEPc.NEP.vectorsView slepc4py.SLEPc.NEP-class.html#vectorsView slepc4py.SLEPc.NEP.bv slepc4py.SLEPc.NEP-class.html#bv slepc4py.SLEPc.NEP.getTrackAll slepc4py.SLEPc.NEP-class.html#getTrackAll slepc4py.SLEPc.NEP.getRIIKSP slepc4py.SLEPc.NEP-class.html#getRIIKSP slepc4py.SLEPc.NEP.reset slepc4py.SLEPc.NEP-class.html#reset slepc4py.SLEPc.NEP.target slepc4py.SLEPc.NEP-class.html#target slepc4py.SLEPc.NEP.ErrorType slepc4py.SLEPc.NEP.ErrorType-class.html slepc4py.SLEPc.NEP.setConvergenceTest slepc4py.SLEPc.NEP-class.html#setConvergenceTest slepc4py.SLEPc.NEP.getIterationNumber slepc4py.SLEPc.NEP-class.html#getIterationNumber slepc4py.SLEPc.NEP.setDimensions slepc4py.SLEPc.NEP-class.html#setDimensions slepc4py.SLEPc.NEP.Which slepc4py.SLEPc.NEP.Which-class.html slepc4py.SLEPc.NEP.getCISSExtraction slepc4py.SLEPc.NEP-class.html#getCISSExtraction slepc4py.SLEPc.NEP.setBV slepc4py.SLEPc.NEP-class.html#setBV slepc4py.SLEPc.NEP.getCISSKSPs slepc4py.SLEPc.NEP-class.html#getCISSKSPs slepc4py.SLEPc.NEP.setTrackAll slepc4py.SLEPc.NEP-class.html#setTrackAll slepc4py.SLEPc.NEP.setCISSSizes slepc4py.SLEPc.NEP-class.html#setCISSSizes slepc4py.SLEPc.NEP.__new__ slepc4py.SLEPc.NEP-class.html#__new__ slepc4py.SLEPc.NEP.Stop slepc4py.SLEPc.NEP.Stop-class.html slepc4py.SLEPc.NEP.setRIIDeflationThreshold slepc4py.SLEPc.NEP-class.html#setRIIDeflationThreshold slepc4py.SLEPc.NEP.setRG slepc4py.SLEPc.NEP-class.html#setRG slepc4py.SLEPc.NEP.which slepc4py.SLEPc.NEP-class.html#which slepc4py.SLEPc.NEP.destroy slepc4py.SLEPc.NEP-class.html#destroy slepc4py.SLEPc.NEP.getTwoSided slepc4py.SLEPc.NEP-class.html#getTwoSided slepc4py.SLEPc.NEP.getNArnoldiLagPreconditioner slepc4py.SLEPc.NEP-class.html#getNArnoldiLagPreconditioner slepc4py.SLEPc.NEP.getNLEIGSRestart slepc4py.SLEPc.NEP-class.html#getNLEIGSRestart slepc4py.SLEPc.NEP.getCISSRefinement slepc4py.SLEPc.NEP-class.html#getCISSRefinement slepc4py.SLEPc.NEP.getMonitor slepc4py.SLEPc.NEP-class.html#getMonitor slepc4py.SLEPc.NEP.setProblemType slepc4py.SLEPc.NEP-class.html#setProblemType slepc4py.SLEPc.NEP.getTolerances slepc4py.SLEPc.NEP-class.html#getTolerances slepc4py.SLEPc.NEP.setSplitOperator slepc4py.SLEPc.NEP-class.html#setSplitOperator slepc4py.SLEPc.NEP.ProblemType slepc4py.SLEPc.NEP.ProblemType-class.html slepc4py.SLEPc.NEP.getRefineKSP slepc4py.SLEPc.NEP-class.html#getRefineKSP slepc4py.SLEPc.NEP.setSplitPreconditioner slepc4py.SLEPc.NEP-class.html#setSplitPreconditioner slepc4py.SLEPc.NEP.setCISSExtraction slepc4py.SLEPc.NEP-class.html#setCISSExtraction slepc4py.SLEPc.NEP.setRIIConstCorrectionTol slepc4py.SLEPc.NEP-class.html#setRIIConstCorrectionTol slepc4py.SLEPc.NEP.setRIILagPreconditioner slepc4py.SLEPc.NEP-class.html#setRIILagPreconditioner slepc4py.SLEPc.NEP.setCISSThreshold slepc4py.SLEPc.NEP-class.html#setCISSThreshold slepc4py.SLEPc.NEP.solve slepc4py.SLEPc.NEP-class.html#solve slepc4py.SLEPc.NEP.setRIIMaximumIterations slepc4py.SLEPc.NEP-class.html#setRIIMaximumIterations slepc4py.SLEPc.NEP.getSplitPreconditioner slepc4py.SLEPc.NEP-class.html#getSplitPreconditioner slepc4py.SLEPc.NEP.getRefine slepc4py.SLEPc.NEP-class.html#getRefine slepc4py.SLEPc.NEP.CISSExtraction slepc4py.SLEPc.NEP.CISSExtraction-class.html slepc4py.SLEPc.NEP.CISSExtraction.RITZ slepc4py.SLEPc.NEP.CISSExtraction-class.html#RITZ slepc4py.SLEPc.NEP.CISSExtraction.__qualname__ slepc4py.SLEPc.NEP.CISSExtraction-class.html#__qualname__ slepc4py.SLEPc.NEP.CISSExtraction.HANKEL slepc4py.SLEPc.NEP.CISSExtraction-class.html#HANKEL slepc4py.SLEPc.NEP.CISSExtraction.CAA slepc4py.SLEPc.NEP.CISSExtraction-class.html#CAA slepc4py.SLEPc.NEP.Conv slepc4py.SLEPc.NEP.Conv-class.html slepc4py.SLEPc.NEP.Conv.__qualname__ slepc4py.SLEPc.NEP.Conv-class.html#__qualname__ slepc4py.SLEPc.NEP.Conv.ABS slepc4py.SLEPc.NEP.Conv-class.html#ABS slepc4py.SLEPc.NEP.Conv.USER slepc4py.SLEPc.NEP.Conv-class.html#USER slepc4py.SLEPc.NEP.Conv.REL slepc4py.SLEPc.NEP.Conv-class.html#REL slepc4py.SLEPc.NEP.Conv.NORM slepc4py.SLEPc.NEP.Conv-class.html#NORM slepc4py.SLEPc.NEP.ConvergedReason slepc4py.SLEPc.NEP.ConvergedReason-class.html slepc4py.SLEPc.NEP.ConvergedReason.DIVERGED_SUBSPACE_EXHAUSTED slepc4py.SLEPc.NEP.ConvergedReason-class.html#DIVERGED_SUBSPACE_EXHAUSTED slepc4py.SLEPc.NEP.ConvergedReason.DIVERGED_BREAKDOWN slepc4py.SLEPc.NEP.ConvergedReason-class.html#DIVERGED_BREAKDOWN slepc4py.SLEPc.NEP.ConvergedReason.CONVERGED_USER slepc4py.SLEPc.NEP.ConvergedReason-class.html#CONVERGED_USER slepc4py.SLEPc.NEP.ConvergedReason.CONVERGED_TOL slepc4py.SLEPc.NEP.ConvergedReason-class.html#CONVERGED_TOL slepc4py.SLEPc.NEP.ConvergedReason.ITERATING slepc4py.SLEPc.NEP.ConvergedReason-class.html#ITERATING slepc4py.SLEPc.NEP.ConvergedReason.CONVERGED_ITERATING slepc4py.SLEPc.NEP.ConvergedReason-class.html#CONVERGED_ITERATING slepc4py.SLEPc.NEP.ConvergedReason.DIVERGED_ITS slepc4py.SLEPc.NEP.ConvergedReason-class.html#DIVERGED_ITS slepc4py.SLEPc.NEP.ConvergedReason.__qualname__ slepc4py.SLEPc.NEP.ConvergedReason-class.html#__qualname__ slepc4py.SLEPc.NEP.ConvergedReason.DIVERGED_LINEAR_SOLVE slepc4py.SLEPc.NEP.ConvergedReason-class.html#DIVERGED_LINEAR_SOLVE slepc4py.SLEPc.NEP.ErrorType slepc4py.SLEPc.NEP.ErrorType-class.html slepc4py.SLEPc.NEP.ErrorType.__qualname__ slepc4py.SLEPc.NEP.ErrorType-class.html#__qualname__ slepc4py.SLEPc.NEP.ErrorType.RELATIVE slepc4py.SLEPc.NEP.ErrorType-class.html#RELATIVE slepc4py.SLEPc.NEP.ErrorType.BACKWARD slepc4py.SLEPc.NEP.ErrorType-class.html#BACKWARD slepc4py.SLEPc.NEP.ErrorType.ABSOLUTE slepc4py.SLEPc.NEP.ErrorType-class.html#ABSOLUTE slepc4py.SLEPc.NEP.ProblemType slepc4py.SLEPc.NEP.ProblemType-class.html slepc4py.SLEPc.NEP.ProblemType.GENERAL slepc4py.SLEPc.NEP.ProblemType-class.html#GENERAL slepc4py.SLEPc.NEP.ProblemType.__qualname__ slepc4py.SLEPc.NEP.ProblemType-class.html#__qualname__ slepc4py.SLEPc.NEP.ProblemType.RATIONAL slepc4py.SLEPc.NEP.ProblemType-class.html#RATIONAL slepc4py.SLEPc.NEP.Refine slepc4py.SLEPc.NEP.Refine-class.html slepc4py.SLEPc.NEP.Refine.NONE slepc4py.SLEPc.NEP.Refine-class.html#NONE slepc4py.SLEPc.NEP.Refine.MULTIPLE slepc4py.SLEPc.NEP.Refine-class.html#MULTIPLE slepc4py.SLEPc.NEP.Refine.SIMPLE slepc4py.SLEPc.NEP.Refine-class.html#SIMPLE slepc4py.SLEPc.NEP.Refine.__qualname__ slepc4py.SLEPc.NEP.Refine-class.html#__qualname__ slepc4py.SLEPc.NEP.RefineScheme slepc4py.SLEPc.NEP.RefineScheme-class.html slepc4py.SLEPc.NEP.RefineScheme.SCHUR slepc4py.SLEPc.NEP.RefineScheme-class.html#SCHUR slepc4py.SLEPc.NEP.RefineScheme.MBE slepc4py.SLEPc.NEP.RefineScheme-class.html#MBE slepc4py.SLEPc.NEP.RefineScheme.EXPLICIT slepc4py.SLEPc.NEP.RefineScheme-class.html#EXPLICIT slepc4py.SLEPc.NEP.RefineScheme.__qualname__ slepc4py.SLEPc.NEP.RefineScheme-class.html#__qualname__ slepc4py.SLEPc.NEP.Stop slepc4py.SLEPc.NEP.Stop-class.html slepc4py.SLEPc.NEP.Stop.__qualname__ slepc4py.SLEPc.NEP.Stop-class.html#__qualname__ slepc4py.SLEPc.NEP.Stop.USER slepc4py.SLEPc.NEP.Stop-class.html#USER slepc4py.SLEPc.NEP.Stop.BASIC slepc4py.SLEPc.NEP.Stop-class.html#BASIC slepc4py.SLEPc.NEP.Type slepc4py.SLEPc.NEP.Type-class.html slepc4py.SLEPc.NEP.Type.NARNOLDI slepc4py.SLEPc.NEP.Type-class.html#NARNOLDI slepc4py.SLEPc.NEP.Type.SLP slepc4py.SLEPc.NEP.Type-class.html#SLP slepc4py.SLEPc.NEP.Type.CISS slepc4py.SLEPc.NEP.Type-class.html#CISS slepc4py.SLEPc.NEP.Type.__qualname__ slepc4py.SLEPc.NEP.Type-class.html#__qualname__ slepc4py.SLEPc.NEP.Type.INTERPOL slepc4py.SLEPc.NEP.Type-class.html#INTERPOL slepc4py.SLEPc.NEP.Type.RII slepc4py.SLEPc.NEP.Type-class.html#RII slepc4py.SLEPc.NEP.Type.NLEIGS slepc4py.SLEPc.NEP.Type-class.html#NLEIGS slepc4py.SLEPc.NEP.Which slepc4py.SLEPc.NEP.Which-class.html slepc4py.SLEPc.NEP.Which.TARGET_MAGNITUDE slepc4py.SLEPc.NEP.Which-class.html#TARGET_MAGNITUDE slepc4py.SLEPc.NEP.Which.LARGEST_IMAGINARY slepc4py.SLEPc.NEP.Which-class.html#LARGEST_IMAGINARY slepc4py.SLEPc.NEP.Which.USER slepc4py.SLEPc.NEP.Which-class.html#USER slepc4py.SLEPc.NEP.Which.SMALLEST_REAL slepc4py.SLEPc.NEP.Which-class.html#SMALLEST_REAL slepc4py.SLEPc.NEP.Which.SMALLEST_MAGNITUDE slepc4py.SLEPc.NEP.Which-class.html#SMALLEST_MAGNITUDE slepc4py.SLEPc.NEP.Which.SMALLEST_IMAGINARY slepc4py.SLEPc.NEP.Which-class.html#SMALLEST_IMAGINARY slepc4py.SLEPc.NEP.Which.LARGEST_REAL slepc4py.SLEPc.NEP.Which-class.html#LARGEST_REAL slepc4py.SLEPc.NEP.Which.ALL slepc4py.SLEPc.NEP.Which-class.html#ALL slepc4py.SLEPc.NEP.Which.LARGEST_MAGNITUDE slepc4py.SLEPc.NEP.Which-class.html#LARGEST_MAGNITUDE slepc4py.SLEPc.NEP.Which.__qualname__ slepc4py.SLEPc.NEP.Which-class.html#__qualname__ slepc4py.SLEPc.NEP.Which.TARGET_IMAGINARY slepc4py.SLEPc.NEP.Which-class.html#TARGET_IMAGINARY slepc4py.SLEPc.NEP.Which.TARGET_REAL slepc4py.SLEPc.NEP.Which-class.html#TARGET_REAL slepc4py.SLEPc.PEP slepc4py.SLEPc.PEP-class.html slepc4py.SLEPc.PEP.setWhichEigenpairs slepc4py.SLEPc.PEP-class.html#setWhichEigenpairs slepc4py.SLEPc.PEP.setStoppingTest slepc4py.SLEPc.PEP-class.html#setStoppingTest slepc4py.SLEPc.PEP.setMonitor slepc4py.SLEPc.PEP-class.html#setMonitor slepc4py.SLEPc.PEP.cancelMonitor slepc4py.SLEPc.PEP-class.html#cancelMonitor slepc4py.SLEPc.PEP.max_it slepc4py.SLEPc.PEP-class.html#max_it slepc4py.SLEPc.PEP.setJDProjection slepc4py.SLEPc.PEP-class.html#setJDProjection slepc4py.SLEPc.PEP.getRG slepc4py.SLEPc.PEP-class.html#getRG slepc4py.SLEPc.PEP.setDS slepc4py.SLEPc.PEP-class.html#setDS slepc4py.SLEPc.PEP.getSTOARCheckEigenvalueType slepc4py.SLEPc.PEP-class.html#getSTOARCheckEigenvalueType slepc4py.SLEPc.PEP.setSTOARDimensions slepc4py.SLEPc.PEP-class.html#setSTOARDimensions slepc4py.SLEPc.PEP.computeError slepc4py.SLEPc.PEP-class.html#computeError slepc4py.SLEPc.PEP.errorView slepc4py.SLEPc.PEP-class.html#errorView slepc4py.SLEPc.PEP.getExtract slepc4py.SLEPc.PEP-class.html#getExtract slepc4py.SLEPc.PEP.getLinearLinearization slepc4py.SLEPc.PEP-class.html#getLinearLinearization slepc4py.SLEPc.PEP.valuesView slepc4py.SLEPc.PEP-class.html#valuesView slepc4py.SLEPc.PEP.getCISSSizes slepc4py.SLEPc.PEP-class.html#getCISSSizes slepc4py.SLEPc.PEP.appendOptionsPrefix slepc4py.SLEPc.PEP-class.html#appendOptionsPrefix slepc4py.SLEPc.PEP.setOperators slepc4py.SLEPc.PEP-class.html#setOperators slepc4py.SLEPc.PEP.setSTOARLocking slepc4py.SLEPc.PEP-class.html#setSTOARLocking slepc4py.SLEPc.PEP.setTOARLocking slepc4py.SLEPc.PEP-class.html#setTOARLocking slepc4py.SLEPc.PEP.getConvergedReason slepc4py.SLEPc.PEP-class.html#getConvergedReason slepc4py.SLEPc.PEP.setInitialSpace slepc4py.SLEPc.PEP-class.html#setInitialSpace slepc4py.SLEPc.PEP.getInterval slepc4py.SLEPc.PEP-class.html#getInterval slepc4py.SLEPc.PEP.setOptionsPrefix slepc4py.SLEPc.PEP-class.html#setOptionsPrefix slepc4py.SLEPc.PEP.getSTOARDetectZeros slepc4py.SLEPc.PEP-class.html#getSTOARDetectZeros slepc4py.SLEPc.PEP.getLinearEPS slepc4py.SLEPc.PEP-class.html#getLinearEPS slepc4py.SLEPc.PEP.ProblemType slepc4py.SLEPc.PEP.ProblemType-class.html slepc4py.SLEPc.PEP.setSTOARLinearization slepc4py.SLEPc.PEP-class.html#setSTOARLinearization slepc4py.SLEPc.PEP.setFromOptions slepc4py.SLEPc.PEP-class.html#setFromOptions slepc4py.SLEPc.PEP.getStoppingTest slepc4py.SLEPc.PEP-class.html#getStoppingTest slepc4py.SLEPc.PEP.setQArnoldiRestart slepc4py.SLEPc.PEP-class.html#setQArnoldiRestart slepc4py.SLEPc.PEP.ds slepc4py.SLEPc.PEP-class.html#ds slepc4py.SLEPc.PEP.setSTOARDetectZeros slepc4py.SLEPc.PEP-class.html#setSTOARDetectZeros slepc4py.SLEPc.PEP.setST slepc4py.SLEPc.PEP-class.html#setST slepc4py.SLEPc.PEP.getBV slepc4py.SLEPc.PEP-class.html#getBV slepc4py.SLEPc.PEP.setRefine slepc4py.SLEPc.PEP-class.html#setRefine slepc4py.SLEPc.PEP.view slepc4py.SLEPc.PEP-class.html#view slepc4py.SLEPc.PEP.track_all slepc4py.SLEPc.PEP-class.html#track_all slepc4py.SLEPc.PEP.Scale slepc4py.SLEPc.PEP.Scale-class.html slepc4py.SLEPc.PEP.ConvergedReason slepc4py.SLEPc.PEP.ConvergedReason-class.html slepc4py.SLEPc.PEP.JDProjection slepc4py.SLEPc.PEP.JDProjection-class.html slepc4py.SLEPc.PEP.getWhichEigenpairs slepc4py.SLEPc.PEP-class.html#getWhichEigenpairs slepc4py.SLEPc.PEP.getTOARLocking slepc4py.SLEPc.PEP-class.html#getTOARLocking slepc4py.SLEPc.PEP.extract slepc4py.SLEPc.PEP-class.html#extract slepc4py.SLEPc.PEP.getLinearExplicitMatrix slepc4py.SLEPc.PEP-class.html#getLinearExplicitMatrix slepc4py.SLEPc.PEP.setLinearLinearization slepc4py.SLEPc.PEP-class.html#setLinearLinearization slepc4py.SLEPc.PEP.rg slepc4py.SLEPc.PEP-class.html#rg slepc4py.SLEPc.PEP.getJDMinimalityIndex slepc4py.SLEPc.PEP-class.html#getJDMinimalityIndex slepc4py.SLEPc.PEP.getJDRestart slepc4py.SLEPc.PEP-class.html#getJDRestart slepc4py.SLEPc.PEP.setCISSRefinement slepc4py.SLEPc.PEP-class.html#setCISSRefinement slepc4py.SLEPc.PEP.CISSExtraction slepc4py.SLEPc.PEP.CISSExtraction-class.html slepc4py.SLEPc.PEP.setUp slepc4py.SLEPc.PEP-class.html#setUp slepc4py.SLEPc.PEP.getST slepc4py.SLEPc.PEP-class.html#getST slepc4py.SLEPc.PEP.getDS slepc4py.SLEPc.PEP-class.html#getDS slepc4py.SLEPc.PEP.getOptionsPrefix slepc4py.SLEPc.PEP-class.html#getOptionsPrefix slepc4py.SLEPc.PEP.getJDFix slepc4py.SLEPc.PEP-class.html#getJDFix slepc4py.SLEPc.PEP.setJDReusePreconditioner slepc4py.SLEPc.PEP-class.html#setJDReusePreconditioner slepc4py.SLEPc.PEP.setLinearExplicitMatrix slepc4py.SLEPc.PEP-class.html#setLinearExplicitMatrix slepc4py.SLEPc.PEP.RefineScheme slepc4py.SLEPc.PEP.RefineScheme-class.html slepc4py.SLEPc.PEP.getBasis slepc4py.SLEPc.PEP-class.html#getBasis slepc4py.SLEPc.PEP.getIterationNumber slepc4py.SLEPc.PEP-class.html#getIterationNumber slepc4py.SLEPc.PEP.setJDMinimalityIndex slepc4py.SLEPc.PEP-class.html#setJDMinimalityIndex slepc4py.SLEPc.PEP.getConvergenceTest slepc4py.SLEPc.PEP-class.html#getConvergenceTest slepc4py.SLEPc.PEP.Refine slepc4py.SLEPc.PEP.Refine-class.html slepc4py.SLEPc.PEP.getSTOARDimensions slepc4py.SLEPc.PEP-class.html#getSTOARDimensions slepc4py.SLEPc.PEP.setTOARRestart slepc4py.SLEPc.PEP-class.html#setTOARRestart slepc4py.SLEPc.PEP.setTolerances slepc4py.SLEPc.PEP-class.html#setTolerances slepc4py.SLEPc.PEP.getEigenpair slepc4py.SLEPc.PEP-class.html#getEigenpair slepc4py.SLEPc.PEP.Basis slepc4py.SLEPc.PEP.Basis-class.html slepc4py.SLEPc.PEP.getConverged slepc4py.SLEPc.PEP-class.html#getConverged slepc4py.SLEPc.PEP.getTarget slepc4py.SLEPc.PEP-class.html#getTarget slepc4py.SLEPc.PEP.getTOARRestart slepc4py.SLEPc.PEP-class.html#getTOARRestart slepc4py.SLEPc.PEP.getJDProjection slepc4py.SLEPc.PEP-class.html#getJDProjection slepc4py.SLEPc.PEP.getSTOARLocking slepc4py.SLEPc.PEP-class.html#getSTOARLocking slepc4py.SLEPc.PEP.problem_type slepc4py.SLEPc.PEP-class.html#problem_type slepc4py.SLEPc.PEP.setType slepc4py.SLEPc.PEP-class.html#setType slepc4py.SLEPc.PEP.getOperators slepc4py.SLEPc.PEP-class.html#getOperators slepc4py.SLEPc.PEP.getCISSThreshold slepc4py.SLEPc.PEP-class.html#getCISSThreshold slepc4py.SLEPc.PEP.create slepc4py.SLEPc.PEP-class.html#create slepc4py.SLEPc.PEP.setQArnoldiLocking slepc4py.SLEPc.PEP-class.html#setQArnoldiLocking slepc4py.SLEPc.PEP.tol slepc4py.SLEPc.PEP-class.html#tol slepc4py.SLEPc.PEP.getErrorEstimate slepc4py.SLEPc.PEP-class.html#getErrorEstimate slepc4py.SLEPc.PEP.getProblemType slepc4py.SLEPc.PEP-class.html#getProblemType slepc4py.SLEPc.PEP.setInterval slepc4py.SLEPc.PEP-class.html#setInterval slepc4py.SLEPc.PEP.setTarget slepc4py.SLEPc.PEP-class.html#setTarget slepc4py.SLEPc.PEP.getType slepc4py.SLEPc.PEP-class.html#getType slepc4py.SLEPc.PEP.getMonitor slepc4py.SLEPc.PEP-class.html#getMonitor slepc4py.SLEPc.PEP.setSTOARCheckEigenvalueType slepc4py.SLEPc.PEP-class.html#setSTOARCheckEigenvalueType slepc4py.SLEPc.PEP.setJDFix slepc4py.SLEPc.PEP-class.html#setJDFix slepc4py.SLEPc.PEP.vectorsView slepc4py.SLEPc.PEP-class.html#vectorsView slepc4py.SLEPc.PEP.setJDRestart slepc4py.SLEPc.PEP-class.html#setJDRestart slepc4py.SLEPc.PEP.bv slepc4py.SLEPc.PEP-class.html#bv slepc4py.SLEPc.PEP.getTrackAll slepc4py.SLEPc.PEP-class.html#getTrackAll slepc4py.SLEPc.PEP.getQArnoldiLocking slepc4py.SLEPc.PEP-class.html#getQArnoldiLocking slepc4py.SLEPc.PEP.reset slepc4py.SLEPc.PEP-class.html#reset slepc4py.SLEPc.PEP.target slepc4py.SLEPc.PEP-class.html#target slepc4py.SLEPc.PEP.ErrorType slepc4py.SLEPc.PEP.ErrorType-class.html slepc4py.SLEPc.PEP.getJDReusePreconditioner slepc4py.SLEPc.PEP-class.html#getJDReusePreconditioner slepc4py.SLEPc.PEP.setExtract slepc4py.SLEPc.PEP-class.html#setExtract slepc4py.SLEPc.PEP.setConvergenceTest slepc4py.SLEPc.PEP-class.html#setConvergenceTest slepc4py.SLEPc.PEP.Extract slepc4py.SLEPc.PEP.Extract-class.html slepc4py.SLEPc.PEP.Conv slepc4py.SLEPc.PEP.Conv-class.html slepc4py.SLEPc.PEP.setDimensions slepc4py.SLEPc.PEP-class.html#setDimensions slepc4py.SLEPc.PEP.Which slepc4py.SLEPc.PEP.Which-class.html slepc4py.SLEPc.PEP.setBasis slepc4py.SLEPc.PEP-class.html#setBasis slepc4py.SLEPc.PEP.setScale slepc4py.SLEPc.PEP-class.html#setScale slepc4py.SLEPc.PEP.getCISSExtraction slepc4py.SLEPc.PEP-class.html#getCISSExtraction slepc4py.SLEPc.PEP.setBV slepc4py.SLEPc.PEP-class.html#setBV slepc4py.SLEPc.PEP.getCISSKSPs slepc4py.SLEPc.PEP-class.html#getCISSKSPs slepc4py.SLEPc.PEP.getSTOARLinearization slepc4py.SLEPc.PEP-class.html#getSTOARLinearization slepc4py.SLEPc.PEP.setTrackAll slepc4py.SLEPc.PEP-class.html#setTrackAll slepc4py.SLEPc.PEP.setCISSSizes slepc4py.SLEPc.PEP-class.html#setCISSSizes slepc4py.SLEPc.PEP.__new__ slepc4py.SLEPc.PEP-class.html#__new__ slepc4py.SLEPc.PEP.Type slepc4py.SLEPc.PEP.Type-class.html slepc4py.SLEPc.PEP.Stop slepc4py.SLEPc.PEP.Stop-class.html slepc4py.SLEPc.PEP.setRG slepc4py.SLEPc.PEP-class.html#setRG slepc4py.SLEPc.PEP.which slepc4py.SLEPc.PEP-class.html#which slepc4py.SLEPc.PEP.destroy slepc4py.SLEPc.PEP-class.html#destroy slepc4py.SLEPc.PEP.getCISSRefinement slepc4py.SLEPc.PEP-class.html#getCISSRefinement slepc4py.SLEPc.PEP.setProblemType slepc4py.SLEPc.PEP-class.html#setProblemType slepc4py.SLEPc.PEP.getSTOARInertias slepc4py.SLEPc.PEP-class.html#getSTOARInertias slepc4py.SLEPc.PEP.getTolerances slepc4py.SLEPc.PEP-class.html#getTolerances slepc4py.SLEPc.PEP.getDimensions slepc4py.SLEPc.PEP-class.html#getDimensions slepc4py.SLEPc.PEP.getRefineKSP slepc4py.SLEPc.PEP-class.html#getRefineKSP slepc4py.SLEPc.PEP.getScale slepc4py.SLEPc.PEP-class.html#getScale slepc4py.SLEPc.PEP.setCISSExtraction slepc4py.SLEPc.PEP-class.html#setCISSExtraction slepc4py.SLEPc.PEP.setLinearEPS slepc4py.SLEPc.PEP-class.html#setLinearEPS slepc4py.SLEPc.PEP.st slepc4py.SLEPc.PEP-class.html#st slepc4py.SLEPc.PEP.setCISSThreshold slepc4py.SLEPc.PEP-class.html#setCISSThreshold slepc4py.SLEPc.PEP.solve slepc4py.SLEPc.PEP-class.html#solve slepc4py.SLEPc.PEP.getQArnoldiRestart slepc4py.SLEPc.PEP-class.html#getQArnoldiRestart slepc4py.SLEPc.PEP.getRefine slepc4py.SLEPc.PEP-class.html#getRefine slepc4py.SLEPc.PEP.Basis slepc4py.SLEPc.PEP.Basis-class.html slepc4py.SLEPc.PEP.Basis.CHEBYSHEV1 slepc4py.SLEPc.PEP.Basis-class.html#CHEBYSHEV1 slepc4py.SLEPc.PEP.Basis.CHEBYSHEV2 slepc4py.SLEPc.PEP.Basis-class.html#CHEBYSHEV2 slepc4py.SLEPc.PEP.Basis.LEGENDRE slepc4py.SLEPc.PEP.Basis-class.html#LEGENDRE slepc4py.SLEPc.PEP.Basis.LAGUERRE slepc4py.SLEPc.PEP.Basis-class.html#LAGUERRE slepc4py.SLEPc.PEP.Basis.MONOMIAL slepc4py.SLEPc.PEP.Basis-class.html#MONOMIAL slepc4py.SLEPc.PEP.Basis.HERMITE slepc4py.SLEPc.PEP.Basis-class.html#HERMITE slepc4py.SLEPc.PEP.Basis.__qualname__ slepc4py.SLEPc.PEP.Basis-class.html#__qualname__ slepc4py.SLEPc.PEP.CISSExtraction slepc4py.SLEPc.PEP.CISSExtraction-class.html slepc4py.SLEPc.PEP.CISSExtraction.RITZ slepc4py.SLEPc.PEP.CISSExtraction-class.html#RITZ slepc4py.SLEPc.PEP.CISSExtraction.__qualname__ slepc4py.SLEPc.PEP.CISSExtraction-class.html#__qualname__ slepc4py.SLEPc.PEP.CISSExtraction.HANKEL slepc4py.SLEPc.PEP.CISSExtraction-class.html#HANKEL slepc4py.SLEPc.PEP.CISSExtraction.CAA slepc4py.SLEPc.PEP.CISSExtraction-class.html#CAA slepc4py.SLEPc.PEP.Conv slepc4py.SLEPc.PEP.Conv-class.html slepc4py.SLEPc.PEP.Conv.__qualname__ slepc4py.SLEPc.PEP.Conv-class.html#__qualname__ slepc4py.SLEPc.PEP.Conv.ABS slepc4py.SLEPc.PEP.Conv-class.html#ABS slepc4py.SLEPc.PEP.Conv.USER slepc4py.SLEPc.PEP.Conv-class.html#USER slepc4py.SLEPc.PEP.Conv.REL slepc4py.SLEPc.PEP.Conv-class.html#REL slepc4py.SLEPc.PEP.Conv.NORM slepc4py.SLEPc.PEP.Conv-class.html#NORM slepc4py.SLEPc.PEP.ConvergedReason slepc4py.SLEPc.PEP.ConvergedReason-class.html slepc4py.SLEPc.PEP.ConvergedReason.DIVERGED_BREAKDOWN slepc4py.SLEPc.PEP.ConvergedReason-class.html#DIVERGED_BREAKDOWN slepc4py.SLEPc.PEP.ConvergedReason.CONVERGED_USER slepc4py.SLEPc.PEP.ConvergedReason-class.html#CONVERGED_USER slepc4py.SLEPc.PEP.ConvergedReason.DIVERGED_SYMMETRY_LOST slepc4py.SLEPc.PEP.ConvergedReason-class.html#DIVERGED_SYMMETRY_LOST slepc4py.SLEPc.PEP.ConvergedReason.CONVERGED_TOL slepc4py.SLEPc.PEP.ConvergedReason-class.html#CONVERGED_TOL slepc4py.SLEPc.PEP.ConvergedReason.ITERATING slepc4py.SLEPc.PEP.ConvergedReason-class.html#ITERATING slepc4py.SLEPc.PEP.ConvergedReason.CONVERGED_ITERATING slepc4py.SLEPc.PEP.ConvergedReason-class.html#CONVERGED_ITERATING slepc4py.SLEPc.PEP.ConvergedReason.DIVERGED_ITS slepc4py.SLEPc.PEP.ConvergedReason-class.html#DIVERGED_ITS slepc4py.SLEPc.PEP.ConvergedReason.__qualname__ slepc4py.SLEPc.PEP.ConvergedReason-class.html#__qualname__ slepc4py.SLEPc.PEP.ErrorType slepc4py.SLEPc.PEP.ErrorType-class.html slepc4py.SLEPc.PEP.ErrorType.__qualname__ slepc4py.SLEPc.PEP.ErrorType-class.html#__qualname__ slepc4py.SLEPc.PEP.ErrorType.RELATIVE slepc4py.SLEPc.PEP.ErrorType-class.html#RELATIVE slepc4py.SLEPc.PEP.ErrorType.BACKWARD slepc4py.SLEPc.PEP.ErrorType-class.html#BACKWARD slepc4py.SLEPc.PEP.ErrorType.ABSOLUTE slepc4py.SLEPc.PEP.ErrorType-class.html#ABSOLUTE slepc4py.SLEPc.PEP.Extract slepc4py.SLEPc.PEP.Extract-class.html slepc4py.SLEPc.PEP.Extract.NONE slepc4py.SLEPc.PEP.Extract-class.html#NONE slepc4py.SLEPc.PEP.Extract.STRUCTURED slepc4py.SLEPc.PEP.Extract-class.html#STRUCTURED slepc4py.SLEPc.PEP.Extract.RESIDUAL slepc4py.SLEPc.PEP.Extract-class.html#RESIDUAL slepc4py.SLEPc.PEP.Extract.__qualname__ slepc4py.SLEPc.PEP.Extract-class.html#__qualname__ slepc4py.SLEPc.PEP.Extract.NORM slepc4py.SLEPc.PEP.Extract-class.html#NORM slepc4py.SLEPc.PEP.JDProjection slepc4py.SLEPc.PEP.JDProjection-class.html slepc4py.SLEPc.PEP.JDProjection.ORTHOGONAL slepc4py.SLEPc.PEP.JDProjection-class.html#ORTHOGONAL slepc4py.SLEPc.PEP.JDProjection.HARMONIC slepc4py.SLEPc.PEP.JDProjection-class.html#HARMONIC slepc4py.SLEPc.PEP.JDProjection.__qualname__ slepc4py.SLEPc.PEP.JDProjection-class.html#__qualname__ slepc4py.SLEPc.PEP.ProblemType slepc4py.SLEPc.PEP.ProblemType-class.html slepc4py.SLEPc.PEP.ProblemType.HYPERBOLIC slepc4py.SLEPc.PEP.ProblemType-class.html#HYPERBOLIC slepc4py.SLEPc.PEP.ProblemType.GENERAL slepc4py.SLEPc.PEP.ProblemType-class.html#GENERAL slepc4py.SLEPc.PEP.ProblemType.__qualname__ slepc4py.SLEPc.PEP.ProblemType-class.html#__qualname__ slepc4py.SLEPc.PEP.ProblemType.HERMITIAN slepc4py.SLEPc.PEP.ProblemType-class.html#HERMITIAN slepc4py.SLEPc.PEP.ProblemType.GYROSCOPIC slepc4py.SLEPc.PEP.ProblemType-class.html#GYROSCOPIC slepc4py.SLEPc.PEP.Refine slepc4py.SLEPc.PEP.Refine-class.html slepc4py.SLEPc.PEP.Refine.NONE slepc4py.SLEPc.PEP.Refine-class.html#NONE slepc4py.SLEPc.PEP.Refine.MULTIPLE slepc4py.SLEPc.PEP.Refine-class.html#MULTIPLE slepc4py.SLEPc.PEP.Refine.SIMPLE slepc4py.SLEPc.PEP.Refine-class.html#SIMPLE slepc4py.SLEPc.PEP.Refine.__qualname__ slepc4py.SLEPc.PEP.Refine-class.html#__qualname__ slepc4py.SLEPc.PEP.RefineScheme slepc4py.SLEPc.PEP.RefineScheme-class.html slepc4py.SLEPc.PEP.RefineScheme.SCHUR slepc4py.SLEPc.PEP.RefineScheme-class.html#SCHUR slepc4py.SLEPc.PEP.RefineScheme.MBE slepc4py.SLEPc.PEP.RefineScheme-class.html#MBE slepc4py.SLEPc.PEP.RefineScheme.EXPLICIT slepc4py.SLEPc.PEP.RefineScheme-class.html#EXPLICIT slepc4py.SLEPc.PEP.RefineScheme.__qualname__ slepc4py.SLEPc.PEP.RefineScheme-class.html#__qualname__ slepc4py.SLEPc.PEP.Scale slepc4py.SLEPc.PEP.Scale-class.html slepc4py.SLEPc.PEP.Scale.BOTH slepc4py.SLEPc.PEP.Scale-class.html#BOTH slepc4py.SLEPc.PEP.Scale.NONE slepc4py.SLEPc.PEP.Scale-class.html#NONE slepc4py.SLEPc.PEP.Scale.DIAGONAL slepc4py.SLEPc.PEP.Scale-class.html#DIAGONAL slepc4py.SLEPc.PEP.Scale.__qualname__ slepc4py.SLEPc.PEP.Scale-class.html#__qualname__ slepc4py.SLEPc.PEP.Scale.SCALAR slepc4py.SLEPc.PEP.Scale-class.html#SCALAR slepc4py.SLEPc.PEP.Stop slepc4py.SLEPc.PEP.Stop-class.html slepc4py.SLEPc.PEP.Stop.__qualname__ slepc4py.SLEPc.PEP.Stop-class.html#__qualname__ slepc4py.SLEPc.PEP.Stop.USER slepc4py.SLEPc.PEP.Stop-class.html#USER slepc4py.SLEPc.PEP.Stop.BASIC slepc4py.SLEPc.PEP.Stop-class.html#BASIC slepc4py.SLEPc.PEP.Type slepc4py.SLEPc.PEP.Type-class.html slepc4py.SLEPc.PEP.Type.QARNOLDI slepc4py.SLEPc.PEP.Type-class.html#QARNOLDI slepc4py.SLEPc.PEP.Type.LINEAR slepc4py.SLEPc.PEP.Type-class.html#LINEAR slepc4py.SLEPc.PEP.Type.CISS slepc4py.SLEPc.PEP.Type-class.html#CISS slepc4py.SLEPc.PEP.Type.__qualname__ slepc4py.SLEPc.PEP.Type-class.html#__qualname__ slepc4py.SLEPc.PEP.Type.JD slepc4py.SLEPc.PEP.Type-class.html#JD slepc4py.SLEPc.PEP.Type.STOAR slepc4py.SLEPc.PEP.Type-class.html#STOAR slepc4py.SLEPc.PEP.Type.TOAR slepc4py.SLEPc.PEP.Type-class.html#TOAR slepc4py.SLEPc.PEP.Which slepc4py.SLEPc.PEP.Which-class.html slepc4py.SLEPc.PEP.Which.TARGET_MAGNITUDE slepc4py.SLEPc.PEP.Which-class.html#TARGET_MAGNITUDE slepc4py.SLEPc.PEP.Which.LARGEST_IMAGINARY slepc4py.SLEPc.PEP.Which-class.html#LARGEST_IMAGINARY slepc4py.SLEPc.PEP.Which.USER slepc4py.SLEPc.PEP.Which-class.html#USER slepc4py.SLEPc.PEP.Which.SMALLEST_REAL slepc4py.SLEPc.PEP.Which-class.html#SMALLEST_REAL slepc4py.SLEPc.PEP.Which.SMALLEST_MAGNITUDE slepc4py.SLEPc.PEP.Which-class.html#SMALLEST_MAGNITUDE slepc4py.SLEPc.PEP.Which.SMALLEST_IMAGINARY slepc4py.SLEPc.PEP.Which-class.html#SMALLEST_IMAGINARY slepc4py.SLEPc.PEP.Which.LARGEST_REAL slepc4py.SLEPc.PEP.Which-class.html#LARGEST_REAL slepc4py.SLEPc.PEP.Which.ALL slepc4py.SLEPc.PEP.Which-class.html#ALL slepc4py.SLEPc.PEP.Which.LARGEST_MAGNITUDE slepc4py.SLEPc.PEP.Which-class.html#LARGEST_MAGNITUDE slepc4py.SLEPc.PEP.Which.__qualname__ slepc4py.SLEPc.PEP.Which-class.html#__qualname__ slepc4py.SLEPc.PEP.Which.TARGET_IMAGINARY slepc4py.SLEPc.PEP.Which-class.html#TARGET_IMAGINARY slepc4py.SLEPc.PEP.Which.TARGET_REAL slepc4py.SLEPc.PEP.Which-class.html#TARGET_REAL slepc4py.SLEPc.RG slepc4py.SLEPc.RG-class.html slepc4py.SLEPc.RG.isAxisymmetric slepc4py.SLEPc.RG-class.html#isAxisymmetric slepc4py.SLEPc.RG.computeContour slepc4py.SLEPc.RG-class.html#computeContour slepc4py.SLEPc.RG.setScale slepc4py.SLEPc.RG-class.html#setScale slepc4py.SLEPc.RG.Type slepc4py.SLEPc.RG.Type-class.html slepc4py.SLEPc.RG.setRingParameters slepc4py.SLEPc.RG-class.html#setRingParameters slepc4py.SLEPc.RG.scale slepc4py.SLEPc.RG-class.html#scale slepc4py.SLEPc.RG.__new__ slepc4py.SLEPc.RG-class.html#__new__ slepc4py.SLEPc.RG.getComplement slepc4py.SLEPc.RG-class.html#getComplement slepc4py.SLEPc.RG.create slepc4py.SLEPc.RG-class.html#create slepc4py.SLEPc.RG.setComplement slepc4py.SLEPc.RG-class.html#setComplement slepc4py.SLEPc.RG.computeQuadrature slepc4py.SLEPc.RG-class.html#computeQuadrature slepc4py.SLEPc.RG.getRingParameters slepc4py.SLEPc.RG-class.html#getRingParameters slepc4py.SLEPc.RG.destroy slepc4py.SLEPc.RG-class.html#destroy slepc4py.SLEPc.RG.setType slepc4py.SLEPc.RG-class.html#setType slepc4py.SLEPc.RG.getType slepc4py.SLEPc.RG-class.html#getType slepc4py.SLEPc.RG.setOptionsPrefix slepc4py.SLEPc.RG-class.html#setOptionsPrefix slepc4py.SLEPc.RG.complement slepc4py.SLEPc.RG-class.html#complement slepc4py.SLEPc.RG.QuadRule slepc4py.SLEPc.RG.QuadRule-class.html slepc4py.SLEPc.RG.getOptionsPrefix slepc4py.SLEPc.RG-class.html#getOptionsPrefix slepc4py.SLEPc.RG.getIntervalEndpoints slepc4py.SLEPc.RG-class.html#getIntervalEndpoints slepc4py.SLEPc.RG.setFromOptions slepc4py.SLEPc.RG-class.html#setFromOptions slepc4py.SLEPc.RG.setIntervalEndpoints slepc4py.SLEPc.RG-class.html#setIntervalEndpoints slepc4py.SLEPc.RG.getScale slepc4py.SLEPc.RG-class.html#getScale slepc4py.SLEPc.RG.checkInside slepc4py.SLEPc.RG-class.html#checkInside slepc4py.SLEPc.RG.computeBoundingBox slepc4py.SLEPc.RG-class.html#computeBoundingBox slepc4py.SLEPc.RG.isTrivial slepc4py.SLEPc.RG-class.html#isTrivial slepc4py.SLEPc.RG.getEllipseParameters slepc4py.SLEPc.RG-class.html#getEllipseParameters slepc4py.SLEPc.RG.canUseConjugates slepc4py.SLEPc.RG-class.html#canUseConjugates slepc4py.SLEPc.RG.setPolygonVertices slepc4py.SLEPc.RG-class.html#setPolygonVertices slepc4py.SLEPc.RG.getPolygonVertices slepc4py.SLEPc.RG-class.html#getPolygonVertices slepc4py.SLEPc.RG.setEllipseParameters slepc4py.SLEPc.RG-class.html#setEllipseParameters slepc4py.SLEPc.RG.view slepc4py.SLEPc.RG-class.html#view slepc4py.SLEPc.RG.QuadRule slepc4py.SLEPc.RG.QuadRule-class.html slepc4py.SLEPc.RG.QuadRule.CHEBYSHEV slepc4py.SLEPc.RG.QuadRule-class.html#CHEBYSHEV slepc4py.SLEPc.RG.QuadRule.__qualname__ slepc4py.SLEPc.RG.QuadRule-class.html#__qualname__ slepc4py.SLEPc.RG.QuadRule.TRAPEZOIDAL slepc4py.SLEPc.RG.QuadRule-class.html#TRAPEZOIDAL slepc4py.SLEPc.RG.Type slepc4py.SLEPc.RG.Type-class.html slepc4py.SLEPc.RG.Type.POLYGON slepc4py.SLEPc.RG.Type-class.html#POLYGON slepc4py.SLEPc.RG.Type.INTERVAL slepc4py.SLEPc.RG.Type-class.html#INTERVAL slepc4py.SLEPc.RG.Type.__qualname__ slepc4py.SLEPc.RG.Type-class.html#__qualname__ slepc4py.SLEPc.RG.Type.RING slepc4py.SLEPc.RG.Type-class.html#RING slepc4py.SLEPc.RG.Type.ELLIPSE slepc4py.SLEPc.RG.Type-class.html#ELLIPSE slepc4py.SLEPc.ST slepc4py.SLEPc.ST-class.html slepc4py.SLEPc.ST.ksp slepc4py.SLEPc.ST-class.html#ksp slepc4py.SLEPc.ST.setOptionsPrefix slepc4py.SLEPc.ST-class.html#setOptionsPrefix slepc4py.SLEPc.ST.setFromOptions slepc4py.SLEPc.ST-class.html#setFromOptions slepc4py.SLEPc.ST.getFilterRange slepc4py.SLEPc.ST-class.html#getFilterRange slepc4py.SLEPc.ST.view slepc4py.SLEPc.ST-class.html#view slepc4py.SLEPc.ST.setTransform slepc4py.SLEPc.ST-class.html#setTransform slepc4py.SLEPc.ST.setFilterInterval slepc4py.SLEPc.ST-class.html#setFilterInterval slepc4py.SLEPc.ST.MatMode slepc4py.SLEPc.ST.MatMode-class.html slepc4py.SLEPc.ST.setMatMode slepc4py.SLEPc.ST-class.html#setMatMode slepc4py.SLEPc.ST.Type slepc4py.SLEPc.ST.Type-class.html slepc4py.SLEPc.ST.setPreconditionerMat slepc4py.SLEPc.ST-class.html#setPreconditionerMat slepc4py.SLEPc.ST.setUp slepc4py.SLEPc.ST-class.html#setUp slepc4py.SLEPc.ST.setMatrices slepc4py.SLEPc.ST-class.html#setMatrices slepc4py.SLEPc.ST.setShift slepc4py.SLEPc.ST-class.html#setShift slepc4py.SLEPc.ST.getMatStructure slepc4py.SLEPc.ST-class.html#getMatStructure slepc4py.SLEPc.ST.getOptionsPrefix slepc4py.SLEPc.ST-class.html#getOptionsPrefix slepc4py.SLEPc.ST.setMatStructure slepc4py.SLEPc.ST-class.html#setMatStructure slepc4py.SLEPc.ST.shift slepc4py.SLEPc.ST-class.html#shift slepc4py.SLEPc.ST.getShift slepc4py.SLEPc.ST-class.html#getShift slepc4py.SLEPc.ST.restoreOperator slepc4py.SLEPc.ST-class.html#restoreOperator slepc4py.SLEPc.ST.getOperator slepc4py.SLEPc.ST-class.html#getOperator slepc4py.SLEPc.ST.setFilterDegree slepc4py.SLEPc.ST-class.html#setFilterDegree slepc4py.SLEPc.ST.getFilterDegree slepc4py.SLEPc.ST-class.html#getFilterDegree slepc4py.SLEPc.ST.apply slepc4py.SLEPc.ST-class.html#apply slepc4py.SLEPc.ST.setType slepc4py.SLEPc.ST-class.html#setType slepc4py.SLEPc.ST.getFilterInterval slepc4py.SLEPc.ST-class.html#getFilterInterval slepc4py.SLEPc.ST.create slepc4py.SLEPc.ST-class.html#create slepc4py.SLEPc.ST.transform slepc4py.SLEPc.ST-class.html#transform slepc4py.SLEPc.ST.getMatrices slepc4py.SLEPc.ST-class.html#getMatrices slepc4py.SLEPc.ST.applyMat slepc4py.SLEPc.ST-class.html#applyMat slepc4py.SLEPc.ST.getPreconditionerMat slepc4py.SLEPc.ST-class.html#getPreconditionerMat slepc4py.SLEPc.ST.getCayleyAntishift slepc4py.SLEPc.ST-class.html#getCayleyAntishift slepc4py.SLEPc.ST.getType slepc4py.SLEPc.ST-class.html#getType slepc4py.SLEPc.ST.reset slepc4py.SLEPc.ST-class.html#reset slepc4py.SLEPc.ST.setFilterRange slepc4py.SLEPc.ST-class.html#setFilterRange slepc4py.SLEPc.ST.applyTranspose slepc4py.SLEPc.ST-class.html#applyTranspose slepc4py.SLEPc.ST.applyHermitianTranspose slepc4py.SLEPc.ST-class.html#applyHermitianTranspose slepc4py.SLEPc.ST.setKSP slepc4py.SLEPc.ST-class.html#setKSP slepc4py.SLEPc.ST.getMatMode slepc4py.SLEPc.ST-class.html#getMatMode slepc4py.SLEPc.ST.getTransform slepc4py.SLEPc.ST-class.html#getTransform slepc4py.SLEPc.ST.__new__ slepc4py.SLEPc.ST-class.html#__new__ slepc4py.SLEPc.ST.setCayleyAntishift slepc4py.SLEPc.ST-class.html#setCayleyAntishift slepc4py.SLEPc.ST.mat_structure slepc4py.SLEPc.ST-class.html#mat_structure slepc4py.SLEPc.ST.destroy slepc4py.SLEPc.ST-class.html#destroy slepc4py.SLEPc.ST.getKSP slepc4py.SLEPc.ST-class.html#getKSP slepc4py.SLEPc.ST.mat_mode slepc4py.SLEPc.ST-class.html#mat_mode slepc4py.SLEPc.ST.MatMode slepc4py.SLEPc.ST.MatMode-class.html slepc4py.SLEPc.ST.MatMode.SHELL slepc4py.SLEPc.ST.MatMode-class.html#SHELL slepc4py.SLEPc.ST.MatMode.INPLACE slepc4py.SLEPc.ST.MatMode-class.html#INPLACE slepc4py.SLEPc.ST.MatMode.__qualname__ slepc4py.SLEPc.ST.MatMode-class.html#__qualname__ slepc4py.SLEPc.ST.MatMode.COPY slepc4py.SLEPc.ST.MatMode-class.html#COPY slepc4py.SLEPc.ST.Type slepc4py.SLEPc.ST.Type-class.html slepc4py.SLEPc.ST.Type.SINVERT slepc4py.SLEPc.ST.Type-class.html#SINVERT slepc4py.SLEPc.ST.Type.FILTER slepc4py.SLEPc.ST.Type-class.html#FILTER slepc4py.SLEPc.ST.Type.SHELL slepc4py.SLEPc.ST.Type-class.html#SHELL slepc4py.SLEPc.ST.Type.CAYLEY slepc4py.SLEPc.ST.Type-class.html#CAYLEY slepc4py.SLEPc.ST.Type.SHIFT slepc4py.SLEPc.ST.Type-class.html#SHIFT slepc4py.SLEPc.ST.Type.__qualname__ slepc4py.SLEPc.ST.Type-class.html#__qualname__ slepc4py.SLEPc.ST.Type.PRECOND slepc4py.SLEPc.ST.Type-class.html#PRECOND slepc4py.SLEPc.SVD slepc4py.SLEPc.SVD-class.html slepc4py.SLEPc.SVD.setStoppingTest slepc4py.SLEPc.SVD-class.html#setStoppingTest slepc4py.SLEPc.SVD.setMonitor slepc4py.SLEPc.SVD-class.html#setMonitor slepc4py.SLEPc.SVD.setInitialSpaces slepc4py.SLEPc.SVD-class.html#setInitialSpaces slepc4py.SLEPc.SVD.max_it slepc4py.SLEPc.SVD-class.html#max_it slepc4py.SLEPc.SVD.getTRLanczosExplicitMatrix slepc4py.SLEPc.SVD-class.html#getTRLanczosExplicitMatrix slepc4py.SLEPc.SVD.getTrackAll slepc4py.SLEPc.SVD-class.html#getTrackAll slepc4py.SLEPc.SVD.setDS slepc4py.SLEPc.SVD-class.html#setDS slepc4py.SLEPc.SVD.computeError slepc4py.SLEPc.SVD-class.html#computeError slepc4py.SLEPc.SVD.errorView slepc4py.SLEPc.SVD-class.html#errorView slepc4py.SLEPc.SVD.valuesView slepc4py.SLEPc.SVD-class.html#valuesView slepc4py.SLEPc.SVD.appendOptionsPrefix slepc4py.SLEPc.SVD-class.html#appendOptionsPrefix slepc4py.SLEPc.SVD.setOperators slepc4py.SLEPc.SVD-class.html#setOperators slepc4py.SLEPc.SVD.cancelMonitor slepc4py.SLEPc.SVD-class.html#cancelMonitor slepc4py.SLEPc.SVD.getConvergedReason slepc4py.SLEPc.SVD-class.html#getConvergedReason slepc4py.SLEPc.SVD.setTRLanczosRestart slepc4py.SLEPc.SVD-class.html#setTRLanczosRestart slepc4py.SLEPc.SVD.setOptionsPrefix slepc4py.SLEPc.SVD-class.html#setOptionsPrefix slepc4py.SLEPc.SVD.ProblemType slepc4py.SLEPc.SVD.ProblemType-class.html slepc4py.SLEPc.SVD.setFromOptions slepc4py.SLEPc.SVD-class.html#setFromOptions slepc4py.SLEPc.SVD.getStoppingTest slepc4py.SLEPc.SVD-class.html#getStoppingTest slepc4py.SLEPc.SVD.setTRLanczosGBidiag slepc4py.SLEPc.SVD-class.html#setTRLanczosGBidiag slepc4py.SLEPc.SVD.ds slepc4py.SLEPc.SVD-class.html#ds slepc4py.SLEPc.SVD.getTRLanczosGBidiag slepc4py.SLEPc.SVD-class.html#getTRLanczosGBidiag slepc4py.SLEPc.SVD.getBV slepc4py.SLEPc.SVD-class.html#getBV slepc4py.SLEPc.SVD.view slepc4py.SLEPc.SVD-class.html#view slepc4py.SLEPc.SVD.track_all slepc4py.SLEPc.SVD-class.html#track_all slepc4py.SLEPc.SVD.getLanczosOneSide slepc4py.SLEPc.SVD-class.html#getLanczosOneSide slepc4py.SLEPc.SVD.ConvergedReason slepc4py.SLEPc.SVD.ConvergedReason-class.html slepc4py.SLEPc.SVD.getTRLanczosKSP slepc4py.SLEPc.SVD-class.html#getTRLanczosKSP slepc4py.SLEPc.SVD.Which slepc4py.SLEPc.SVD.Which-class.html slepc4py.SLEPc.SVD.Type slepc4py.SLEPc.SVD.Type-class.html slepc4py.SLEPc.SVD.getCrossEPS slepc4py.SLEPc.SVD-class.html#getCrossEPS slepc4py.SLEPc.SVD.getTRLanczosLocking slepc4py.SLEPc.SVD-class.html#getTRLanczosLocking slepc4py.SLEPc.SVD.getWhichSingularTriplets slepc4py.SLEPc.SVD-class.html#getWhichSingularTriplets slepc4py.SLEPc.SVD.setUp slepc4py.SLEPc.SVD-class.html#setUp slepc4py.SLEPc.SVD.getDS slepc4py.SLEPc.SVD-class.html#getDS slepc4py.SLEPc.SVD.transpose_mode slepc4py.SLEPc.SVD-class.html#transpose_mode slepc4py.SLEPc.SVD.getOptionsPrefix slepc4py.SLEPc.SVD-class.html#getOptionsPrefix slepc4py.SLEPc.SVD.setConvergenceTest slepc4py.SLEPc.SVD-class.html#setConvergenceTest slepc4py.SLEPc.SVD.Conv slepc4py.SLEPc.SVD.Conv-class.html slepc4py.SLEPc.SVD.getCrossExplicitMatrix slepc4py.SLEPc.SVD-class.html#getCrossExplicitMatrix slepc4py.SLEPc.SVD.getSignature slepc4py.SLEPc.SVD-class.html#getSignature slepc4py.SLEPc.SVD.setTolerances slepc4py.SLEPc.SVD-class.html#setTolerances slepc4py.SLEPc.SVD.isGeneralized slepc4py.SLEPc.SVD-class.html#isGeneralized slepc4py.SLEPc.SVD.getConverged slepc4py.SLEPc.SVD-class.html#getConverged slepc4py.SLEPc.SVD.setCrossEPS slepc4py.SLEPc.SVD-class.html#setCrossEPS slepc4py.SLEPc.SVD.problem_type slepc4py.SLEPc.SVD-class.html#problem_type slepc4py.SLEPc.SVD.setCyclicExplicitMatrix slepc4py.SLEPc.SVD-class.html#setCyclicExplicitMatrix slepc4py.SLEPc.SVD.setType slepc4py.SLEPc.SVD-class.html#setType slepc4py.SLEPc.SVD.setSignature slepc4py.SLEPc.SVD-class.html#setSignature slepc4py.SLEPc.SVD.getOperators slepc4py.SLEPc.SVD-class.html#getOperators slepc4py.SLEPc.SVD.setLanczosOneSide slepc4py.SLEPc.SVD-class.html#setLanczosOneSide slepc4py.SLEPc.SVD.setTRLanczosKSP slepc4py.SLEPc.SVD-class.html#setTRLanczosKSP slepc4py.SLEPc.SVD.isHyperbolic slepc4py.SLEPc.SVD-class.html#isHyperbolic slepc4py.SLEPc.SVD.create slepc4py.SLEPc.SVD-class.html#create slepc4py.SLEPc.SVD.TRLanczosGBidiag slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html slepc4py.SLEPc.SVD.getTRLanczosRestart slepc4py.SLEPc.SVD-class.html#getTRLanczosRestart slepc4py.SLEPc.SVD.tol slepc4py.SLEPc.SVD-class.html#tol slepc4py.SLEPc.SVD.getCyclicEPS slepc4py.SLEPc.SVD-class.html#getCyclicEPS slepc4py.SLEPc.SVD.getProblemType slepc4py.SLEPc.SVD-class.html#getProblemType slepc4py.SLEPc.SVD.setImplicitTranspose slepc4py.SLEPc.SVD-class.html#setImplicitTranspose slepc4py.SLEPc.SVD.getType slepc4py.SLEPc.SVD-class.html#getType slepc4py.SLEPc.SVD.getMonitor slepc4py.SLEPc.SVD-class.html#getMonitor slepc4py.SLEPc.SVD.setWhichSingularTriplets slepc4py.SLEPc.SVD-class.html#setWhichSingularTriplets slepc4py.SLEPc.SVD.vectorsView slepc4py.SLEPc.SVD-class.html#vectorsView slepc4py.SLEPc.SVD.getSingularTriplet slepc4py.SLEPc.SVD-class.html#getSingularTriplet slepc4py.SLEPc.SVD.setCyclicEPS slepc4py.SLEPc.SVD-class.html#setCyclicEPS slepc4py.SLEPc.SVD.setTRLanczosExplicitMatrix slepc4py.SLEPc.SVD-class.html#setTRLanczosExplicitMatrix slepc4py.SLEPc.SVD.getTRLanczosOneSide slepc4py.SLEPc.SVD-class.html#getTRLanczosOneSide slepc4py.SLEPc.SVD.reset slepc4py.SLEPc.SVD-class.html#reset slepc4py.SLEPc.SVD.ErrorType slepc4py.SLEPc.SVD.ErrorType-class.html slepc4py.SLEPc.SVD.getValue slepc4py.SLEPc.SVD-class.html#getValue slepc4py.SLEPc.SVD.getCyclicExplicitMatrix slepc4py.SLEPc.SVD-class.html#getCyclicExplicitMatrix slepc4py.SLEPc.SVD.setOperator slepc4py.SLEPc.SVD-class.html#setOperator slepc4py.SLEPc.SVD.getIterationNumber slepc4py.SLEPc.SVD-class.html#getIterationNumber slepc4py.SLEPc.SVD.setDimensions slepc4py.SLEPc.SVD-class.html#setDimensions slepc4py.SLEPc.SVD.getConvergenceTest slepc4py.SLEPc.SVD-class.html#getConvergenceTest slepc4py.SLEPc.SVD.getVectors slepc4py.SLEPc.SVD-class.html#getVectors slepc4py.SLEPc.SVD.setBV slepc4py.SLEPc.SVD-class.html#setBV slepc4py.SLEPc.SVD.setTrackAll slepc4py.SLEPc.SVD-class.html#setTrackAll slepc4py.SLEPc.SVD.getImplicitTranspose slepc4py.SLEPc.SVD-class.html#getImplicitTranspose slepc4py.SLEPc.SVD.setTRLanczosOneSide slepc4py.SLEPc.SVD-class.html#setTRLanczosOneSide slepc4py.SLEPc.SVD.__new__ slepc4py.SLEPc.SVD-class.html#__new__ slepc4py.SLEPc.SVD.Stop slepc4py.SLEPc.SVD.Stop-class.html slepc4py.SLEPc.SVD.which slepc4py.SLEPc.SVD-class.html#which slepc4py.SLEPc.SVD.destroy slepc4py.SLEPc.SVD-class.html#destroy slepc4py.SLEPc.SVD.setProblemType slepc4py.SLEPc.SVD-class.html#setProblemType slepc4py.SLEPc.SVD.getTolerances slepc4py.SLEPc.SVD-class.html#getTolerances slepc4py.SLEPc.SVD.setTRLanczosLocking slepc4py.SLEPc.SVD-class.html#setTRLanczosLocking slepc4py.SLEPc.SVD.getDimensions slepc4py.SLEPc.SVD-class.html#getDimensions slepc4py.SLEPc.SVD.solve slepc4py.SLEPc.SVD-class.html#solve slepc4py.SLEPc.SVD.setCrossExplicitMatrix slepc4py.SLEPc.SVD-class.html#setCrossExplicitMatrix slepc4py.SLEPc.SVD.Conv slepc4py.SLEPc.SVD.Conv-class.html slepc4py.SLEPc.SVD.Conv.__qualname__ slepc4py.SLEPc.SVD.Conv-class.html#__qualname__ slepc4py.SLEPc.SVD.Conv.ABS slepc4py.SLEPc.SVD.Conv-class.html#ABS slepc4py.SLEPc.SVD.Conv.MAXIT slepc4py.SLEPc.SVD.Conv-class.html#MAXIT slepc4py.SLEPc.SVD.Conv.USER slepc4py.SLEPc.SVD.Conv-class.html#USER slepc4py.SLEPc.SVD.Conv.REL slepc4py.SLEPc.SVD.Conv-class.html#REL slepc4py.SLEPc.SVD.Conv.NORM slepc4py.SLEPc.SVD.Conv-class.html#NORM slepc4py.SLEPc.SVD.ConvergedReason slepc4py.SLEPc.SVD.ConvergedReason-class.html slepc4py.SLEPc.SVD.ConvergedReason.DIVERGED_BREAKDOWN slepc4py.SLEPc.SVD.ConvergedReason-class.html#DIVERGED_BREAKDOWN slepc4py.SLEPc.SVD.ConvergedReason.CONVERGED_USER slepc4py.SLEPc.SVD.ConvergedReason-class.html#CONVERGED_USER slepc4py.SLEPc.SVD.ConvergedReason.CONVERGED_TOL slepc4py.SLEPc.SVD.ConvergedReason-class.html#CONVERGED_TOL slepc4py.SLEPc.SVD.ConvergedReason.ITERATING slepc4py.SLEPc.SVD.ConvergedReason-class.html#ITERATING slepc4py.SLEPc.SVD.ConvergedReason.CONVERGED_ITERATING slepc4py.SLEPc.SVD.ConvergedReason-class.html#CONVERGED_ITERATING slepc4py.SLEPc.SVD.ConvergedReason.DIVERGED_ITS slepc4py.SLEPc.SVD.ConvergedReason-class.html#DIVERGED_ITS slepc4py.SLEPc.SVD.ConvergedReason.__qualname__ slepc4py.SLEPc.SVD.ConvergedReason-class.html#__qualname__ slepc4py.SLEPc.SVD.ConvergedReason.CONVERGED_MAXIT slepc4py.SLEPc.SVD.ConvergedReason-class.html#CONVERGED_MAXIT slepc4py.SLEPc.SVD.ErrorType slepc4py.SLEPc.SVD.ErrorType-class.html slepc4py.SLEPc.SVD.ErrorType.__qualname__ slepc4py.SLEPc.SVD.ErrorType-class.html#__qualname__ slepc4py.SLEPc.SVD.ErrorType.RELATIVE slepc4py.SLEPc.SVD.ErrorType-class.html#RELATIVE slepc4py.SLEPc.SVD.ErrorType.NORM slepc4py.SLEPc.SVD.ErrorType-class.html#NORM slepc4py.SLEPc.SVD.ErrorType.ABSOLUTE slepc4py.SLEPc.SVD.ErrorType-class.html#ABSOLUTE slepc4py.SLEPc.SVD.ProblemType slepc4py.SLEPc.SVD.ProblemType-class.html slepc4py.SLEPc.SVD.ProblemType.HYPERBOLIC slepc4py.SLEPc.SVD.ProblemType-class.html#HYPERBOLIC slepc4py.SLEPc.SVD.ProblemType.STANDARD slepc4py.SLEPc.SVD.ProblemType-class.html#STANDARD slepc4py.SLEPc.SVD.ProblemType.__qualname__ slepc4py.SLEPc.SVD.ProblemType-class.html#__qualname__ slepc4py.SLEPc.SVD.ProblemType.GENERALIZED slepc4py.SLEPc.SVD.ProblemType-class.html#GENERALIZED slepc4py.SLEPc.SVD.Stop slepc4py.SLEPc.SVD.Stop-class.html slepc4py.SLEPc.SVD.Stop.__qualname__ slepc4py.SLEPc.SVD.Stop-class.html#__qualname__ slepc4py.SLEPc.SVD.Stop.USER slepc4py.SLEPc.SVD.Stop-class.html#USER slepc4py.SLEPc.SVD.Stop.BASIC slepc4py.SLEPc.SVD.Stop-class.html#BASIC slepc4py.SLEPc.SVD.TRLanczosGBidiag slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html slepc4py.SLEPc.SVD.TRLanczosGBidiag.UPPER slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html#UPPER slepc4py.SLEPc.SVD.TRLanczosGBidiag.LOWER slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html#LOWER slepc4py.SLEPc.SVD.TRLanczosGBidiag.__qualname__ slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html#__qualname__ slepc4py.SLEPc.SVD.TRLanczosGBidiag.SINGLE slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html#SINGLE slepc4py.SLEPc.SVD.Type slepc4py.SLEPc.SVD.Type-class.html slepc4py.SLEPc.SVD.Type.CROSS slepc4py.SLEPc.SVD.Type-class.html#CROSS slepc4py.SLEPc.SVD.Type.SCALAPACK slepc4py.SLEPc.SVD.Type-class.html#SCALAPACK slepc4py.SLEPc.SVD.Type.LAPACK slepc4py.SLEPc.SVD.Type-class.html#LAPACK slepc4py.SLEPc.SVD.Type.LANCZOS slepc4py.SLEPc.SVD.Type-class.html#LANCZOS slepc4py.SLEPc.SVD.Type.TRLANCZOS slepc4py.SLEPc.SVD.Type-class.html#TRLANCZOS slepc4py.SLEPc.SVD.Type.KSVD slepc4py.SLEPc.SVD.Type-class.html#KSVD slepc4py.SLEPc.SVD.Type.ELEMENTAL slepc4py.SLEPc.SVD.Type-class.html#ELEMENTAL slepc4py.SLEPc.SVD.Type.RANDOMIZED slepc4py.SLEPc.SVD.Type-class.html#RANDOMIZED slepc4py.SLEPc.SVD.Type.PRIMME slepc4py.SLEPc.SVD.Type-class.html#PRIMME slepc4py.SLEPc.SVD.Type.CYCLIC slepc4py.SLEPc.SVD.Type-class.html#CYCLIC slepc4py.SLEPc.SVD.Type.__qualname__ slepc4py.SLEPc.SVD.Type-class.html#__qualname__ slepc4py.SLEPc.SVD.Which slepc4py.SLEPc.SVD.Which-class.html slepc4py.SLEPc.SVD.Which.__qualname__ slepc4py.SLEPc.SVD.Which-class.html#__qualname__ slepc4py.SLEPc.SVD.Which.SMALLEST slepc4py.SLEPc.SVD.Which-class.html#SMALLEST slepc4py.SLEPc.SVD.Which.LARGEST slepc4py.SLEPc.SVD.Which-class.html#LARGEST slepc4py.SLEPc.Sys slepc4py.SLEPc.Sys-class.html slepc4py.SLEPc.Sys.__new__ slepc4py.SLEPc.Sys-class.html#__new__ slepc4py.SLEPc.Sys.isFinalized slepc4py.SLEPc.Sys-class.html#isFinalized slepc4py.SLEPc.Sys.isInitialized slepc4py.SLEPc.Sys-class.html#isInitialized slepc4py.SLEPc.Sys.getVersionInfo slepc4py.SLEPc.Sys-class.html#getVersionInfo slepc4py.SLEPc.Sys.getVersion slepc4py.SLEPc.Sys-class.html#getVersion slepc4py.SLEPc.Sys.hasExternalPackage slepc4py.SLEPc.Sys-class.html#hasExternalPackage slepc4py.SLEPc._p_mem slepc4py.SLEPc._p_mem-class.html slepc4py.SLEPc._p_mem.__new__ slepc4py.SLEPc._p_mem-class.html#__new__ slepc4py-3.19.2/docs/apiref/class-tree.html000066400000000000000000000437701454104675500205250ustar00rootroot00000000000000 Class Hierarchy
 
[hide private]
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Class Hierarchy

slepc4py-3.19.2/docs/apiref/class_hierarchy_for__p_mem.png000066400000000000000000000014221454104675500236140ustar00rootroot00000000000000‰PNG  IHDRS$õ•ybKGDÿÿÿ ½§“ÇIDAThíšOH“aÀ_zJ8Cœ ®C´ÆN þAÄ¿K¿ˆ %ôàaÐT qt“–Ú¦eá@…yKH/’‡]:Ø ‚)œÉ:)¥M7÷ºZ¼?ø`ûÞ=Ïû~?ž‡±÷ …BHD0yío¯àBʈ”)’Ð)yEp©ªzZGV¦@’à d¦§“k4Æs- ÁäÜ\ر°2sF<½½W² DF1™ÂŽÉ6ˆ”))S R¦@¤LH™¹R™+~?ŠÉÄû…îÖÔ -*Âb·s ^«˜L¸§§¹W[KZa!¯FF›™!§ªŠëyy¼<ùì£#lN'ºÒRnæçc±Û F'VâR™Ž‰ ¦xçp0ëõòÚåŠ(nj~¯ÛM·ÕŠÍédrv–Ï}mmt ómg€¾ÑQ–×ÖðºÝ|t¹ðú|؜ΨóÄJ\döµ¶¢×é¸o0Ðe±063Qœµ®Ž†z³€¶úzR4žUWð}w€·SS8;:ÈLOÇ ×Ómµ2çõF'VÂþÉí¬¬“×w²³Ù"ŠËHK 9)éïñomq«¸ø·{7RS£Î+q‘ùe}ƒ^ÀòÚZ­ÐüZ-††ÈÑéØÙÛck{[è‘—6ÞÓÊßϧ¥%:ê**„æR^΋þ~¾nn²´ºJ¥Å›ñq¡sDB\*óie%%ÍÍìíïó¸¬ŒÎÆF¡ùmMMt 𠡃`‡ô´´#”ÓjŠ¢ –”ļk´â÷£7› -.Æ”ç_âx×HUU<ϯCò@M$1·ùyû{ͪz©¸D¬æ˜e^ö¡QÖEÈ6ˆ”))S R¦@Â~y}>µ·Çs- OX™À¹gÄ’³È6șʔ×¼<²2"e DÊÈO:VTÜa›IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_balance.png000066400000000000000000000017121454104675500237470ustar00rootroot00000000000000‰PNG  IHDRP$‘À*-bKGDÿÿÿ ½§“IDAThcüÿÿ?ÃHLízƒQwÀ‚Ìadd(wÐ —S#;†!@F\ÜROþN¡:8~éÒ“—/ѱxØROoUw7]œD[VZºz÷n4Á—¤G=<Ü9f40€#a{û˜ªª÷Ÿ>áR|÷ñcF \He@f _´èÅÞ½Ï÷ìÙ5}úý§Oó:;©ë,Ú,¥41@TPP\X˜ABD¤³ À/?Ÿª®¢! Bfffâ燰×ïÛ§Êen.ïá1yùr4•Xe ÖíÝk!`cÓxÐ:{6DYÏÂ…·><¾hÑ¡yóŽ_ºT=e .'3I뇅ÁÙ|ÜÜsêë8ØÙ/¯Y#+!ÁÅÁ¡(-ÍÀÀðîãG¸2¬²‚|| Yááü<<ñ~~)ï?}š³~}G~¾¶²2¦¦@L˜¿qã¡yóÄ……eÄÅ; Jz{ éäá;›7+ËÊ200|ÿù³ñbç´´ûÛ¶±²°<|þ<§½ýË÷ïç"<²R¢¢ ,ÌÌîÃgÏTde!l EE EEûñ‹ÎÎp]¼¼d¸œÒ<ÌÉΞùàÙ³WïÞýúý;°°° &æø¢ES++ÑTâ‘eBí¥I‰‰=xö ¾xëVÛœ9pñ;›7ÿ¿páÿ… Ž9±x1&Óï߿ùöíË·oï?}Z7mšŒ¸¸¨ à×ïß¿ÿüÉÂÌüýçÏúéÓ>ûׂ_Äz{WOž|åÎk÷îå´·Ã=åéY6aÂý§O¯Ý»ç“3iÙ22\Nf’¶Œ‹ƒ0˜™˜tTTVww322 òñµåæF”— òñU&'Gyzzde]°¢«ì‹½{1 ¯LNþúý»GVÖ×ïß½llº`µ:%¥bâD«øøŸ¿~ùÙÛw‘ž‘;Ç€PW×aÖ[Ñ£î`ÔÃÃŒzx¸,õðð¦Eñ#¦‡‡Ñ ÆÑùáaF=<ÜC•”ï`¨MmIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_basis.png000066400000000000000000000014641454104675500234670ustar00rootroot00000000000000‰PNG  IHDRA$Y¬ÀûbKGDÿÿÿ ½§“éIDATX…cüÿÿ?ÃLí*€Q? ð ´[H«V­‚;{8Ä ¦Œ¸¸¥žýB xòòåñK—бøÁROoUw7]œD2X½{÷ñÒR4Áá–Fý089~`40€#a{û˜ªª÷Ÿ>‘dÂÝÇ Ȱ+ 3Ž/ZôbïÞç{öìš>ýþÓ§y$iàã«HJ"ÏjL€¥\"ˆ Š 300Hˆˆtøå瓤]˜Ÿ¿=/<«1ò33³??„½~ß>½ÐP.ssyÉË—C7ì߯Âin®ìã³dëVÔ´„)K'?|ýþýë÷ï_¾}»õðaõäɱÞÞ Ÿ¿~ /+3Óѹ³eK{~~^gçûOŸ¾~ÿ^V–ñ`Û¶šÔÔ¤úúo?~ ›ƒG–H@fZÒ ƒ³ù¸¹çÔ×300p°³_^³FVB‚‹ƒCQZšáÝÇ¢BBLLL¿ÿüáåæNô÷ssãdg‡ëýûïY"™ñpgóæÿ.ü¿páÛɓ剉Îii ¬,,Ÿ?÷ÏÏ·Œ‹›»~=܇GæÏ?u劼‡‡GVÖ™kבýG–¶~€NvöÜÈÈÏž½z÷î×ïß……11Ç-šZY QðãçÏï?.jiy¹o_‚ŸŸ[FÆÇ/_àÚñËÒ֯߿ùöíË·oï?}Z7mšŒ¸¸¨ à×ïß¿ÿüÉÂÌüýçÏúéÓ>ûÆÀÀàš‘±dëÖ—ïÞ½ùð‰‰‰•Ù(ü²Ä2óƒe\„ÁÌĤ£¢²º»›‘‘Q¯-77¢¼\¯299ÊÓÓ#+ëÅÞ½sj¦LIilT‘•]ÙÙ‰œâ9ØÙñÈ ‘»>´êê:˜Û­a¥¥ «V­ …ŽÔöÒ`£~`Ôƒ ?`©ãŽ_º†1v0HÀ“—/±ˆŽŽó À8´‚+ñ0ê‡Áuf÷A¥ƒIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_blocktype.png000066400000000000000000000027621454104675500243640ustar00rootroot00000000000000‰PNG  IHDR_$ï©æ÷bKGDÿÿÿ ½§“§IDAThíš{LSWÇ?P.>±Ò¡.L|,. ¢$º9 ‚T!©Næ#>bˆa¢f:ÔIÔRÔkuÎGQð5HŒ¨c2×ùŒŒMÔI“—Pb]Ði†jéþp6–ZD,^#÷“œäÜóûs¾ùÞÓßM{ëa³ÙlˆAž§Ð º2¢ù"š/$¶Vb넦R©Z[+ž|ñrð—Ëô:µ¼•ä>í2æÒü1AAänÙÒ)‚ºÁÁ.cbÙÑ|Í·˜ïìФãÇ3kÍî=x@Emm›µ¯=´µÆ……NžmWËË_iïÎÂå÷e)ÊÎ&Àϛ͆ñΖh4,ÑhÈÙ´É][¸ä³°0n TŒ™3Ç~ íÛ·Ó5t·™ïëãƒ\*`@ÿþh–.ejb¢»–o“îÞÞt÷ö ±© À®åM¦Ój¾D"¡_Ÿ>ÏÝoldÞºuø†…¡ˆŠbEz:Í Ö–¾Ù¹“÷¢£‘…‡3wíZî76>wéé„̘AÃýû/Ô²D£aᆠöë‡f3=F¦¤¬Ì^Î~¼p±±ÈÂÃIP«i¶Xxlµ’¤Ó¡ˆŠ¢ß¸q$¨ÕX=ê€#θÍü‡f3Íf›š(¯©!I«e¶RùÜܵš:“‰ßä§íÛ)¼t MVpÔ` `ûv~ݽ›²êj6íÞí4ÿëŒ ÅÅvíBêâ?‹*2’ü3g°¶´ö,ïûû>ž¬ü|ÎëõÈ¥Rüår4K—òÕ¶m°lY{­q‰ÛÌ¿y⃠ÌÍͤçä±hUy¦†[­ ö÷·*Ô™LöþS†0< Àaþ7nŠzï^²RRÚ¥ÍÓӓ؈Ž  Ê/ÅÅìLNvÈ2h½ÿA@€]OííÛ ˆˆpÈíÛ«W»ö}¡.·¬ÒŠw½½ùræLªëë¹s÷®CL.•â%‘Pi4ÚÇ*êêð“É(“Q]_o¿Z^Îæ={æŸÔjù~íZŽröòåvkRMœÈQƒÜÂBƆ„à/—;Äÿ¾uËÞ/¯©a LÀ@™Œ›'N`+)ÁVR¿/ò[NN»÷m ·™ÿϽ{˜054Pe4²nÇüår|}|ò¼$fDE±$5•êúznTT¬Ó1K©d¶RI’VËŸ7oRZYI‚Zíp3àÉ2h«æÍ#~ãFûƒñE|‚µ¥…”]»œJ@bZµµ\.-eVË11ÄMšÄÊŒ ªŒFJ++Q&$ðí¡CtÉ·•1sæØûOO> $oË<<<œru«W“˜–Fh\ïtëF\L «,ž<¸£/æ¡ÙLÌØ±¤¹¨­«æÏçð©S¤êõ¬¡¾§¥gÿñãÄN˜àŸ¥TOcSŸGG³æ=I ²*3“çÎ¥Ùbaêøñ.5½,­_ ?5KùÖýª™¬ÓQ]_ÏÍ›ícµµN™‚­¤¤Sö|ú­\¥R‘››ûl¨k¼@o¶X¨2Ñ;ÆÂØX¡åØéæ_¿Î¨¸8æO›FبQ±Þ={¯R ¢Ëm5ÿMfÜÈ‘4œ;÷ܘ¯ß%%½fEOè'ÿME4_@DóD4_@\>p‹®]cúНSK—Ã¥ùu&S›ÿ9yuIJ# N'_ü»þëC<ù"š/ ¢ùò2äfø®²G IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_bv.png000066400000000000000000000056461454104675500230030ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ [IDATxœíÝ{LTWð/Zä ¨„E‘"â Ô¢¶­&î*b”µ´MmZ –ÄN%E’¦b“m–4KK"°¾ÚÚ¦Vc³¥n@°dåáEÜ%å!Ã0-3ßýÃr—yŠ0:^úû$7;wÎüÎ9ß¹.pq#I¡"³\]€÷KB+TGB+Tç1Ë7nÜÀùóç]Q‹VÂÃñlÙ2ó´PUUE²ÉöHl™™™–¥Õ™vœ\T®¶iÓ&›ûeM+TGB+TGB+TGB+TGB;Innnf›¿¿?Ö¯_k×®Ù=fâUUUinn†N§ÃîÝ»±`Áx{{#::{÷îÅèèè”kÁ;#øøxÌ;‰‰‰(..†Ñhtvv*5Úë{ggç”_ßÙ\Ú+W® ((È©mvuuÁÏÏï p]]z{{qëÖ-œ={cccÈÎζyŒåëׯW>¯««³cbcc‘——‡ÆÆF=zׯ_ǧŸ~ŠÏ?ÿZ­vJ5céÒ¥hllDII .\¸€={ö ¢¢iii0™L÷l£¬¬lZsåô¹¶wöAëèèpêë &$$;::œÖî8[íÞ¼y“844d÷{ìõßßߟ fûÎ;Ljˆˆ)Õ­Õj¹råJF³ý:Ž‘‘‘|`4QTT„ˆˆ#''ƒƒƒfuìÞ½ “®mçÎxõÕW•cu:|||ÐÔÔ4é¾Ïž=[飳øùùá“O>ÁÀÀ€²oÅŠ¸zõ*€ÉÅD‡Faa!fÍ2ŸjooohµZeŒ ²²QQQÆŽ; ×ë˜/ìͧ£ºlÍõ´X¦ø~Ï´ãŒ ¶··³¡¡‹-bQQI²¸¸˜™™™ìîîfKK —,Y·ß~ÛêÝ7<<Ì9sæ°¬¬Œ½½½,//§»»;u:?üðCÆÅűµµ•---LJJ¢V«Už{òäIj4êõz³³£ÚÎ;ÇÀÀ@Ž‘$+**¸xñb»ýÀææfóÎ;ììì䯙˜˜hóËÍÞ¸Yª««£F£¡··7_xá~ôÑG¼qã†òø½Æb¢`__ŸÍÇÏŸ?Ï¥–ÔÔT¶··ó‡~`tt4÷ìÙ£ôk|Líͧ£ºœ}¦uZh[ZZÌÚX´hI2::š½½½Êcß~û-5UGéééÉÒÒRêt:’wƒl2™Ã'N(Ƕµµñøñã$Éëׯ3<<œmmmw;d#´¶j3 åwß}G’\»v-KJJìö?^œ3gSRRØÕÕe÷˜‰›½q³Åd2ñÂ… ,..f||<ÝÝÝyäÈ’t8–úûû†¶¾¾žAAA6Ç©ººš ,Pú5>¦öæÓQ]lhGGG•}/^¤——IÒËËËjýüülväÇä¶mÛÈŒŒ ž={Vi£µµÕæë'''³´´T9£Ÿí Ã=k{óÍ7™››Ë¾¾>zxx°»»Ûn?'NÜtŽg«ÿ:ŽGޱZ1<<œ¤ã±°%44”gΜ±ùXYYW¯^}ÏqšØ/{ó騮GnM;®½½]ùøòåË „……¡££¼ûÁÀÀêëë­ž?:: ½^ƒâöíÛx饗žžŽÁÁA„……)k:hnnƾ}û ÈË˃¯¯/|}}÷¬mÓ¦M8v쪫«±|ùrÌŸ?ßYÃ1%&“ [·nEkk«Ùþ´´4üúë¯àp,lÉÎÎÆûï¿ou•`dd%%%ظq£²Ïrœ"""¬Ú³7Ÿ÷[×´X¦xªgÚ””vtt°±±‘ÑÑÑ,,,$I¾÷Þ{ܰa»ººxéÒ%&''sÇŽÊóîܹC’Ôëõôôôä¡C‡ØÓÓÃÒÒRzzzrdd„EEEÔh4liiá¥K—¸|ùrnß¾Ýf=°±<°W›Ñhä¼yóÂÏ>û̬pppÐf»ö`]]{{{­6{ãf)''‡111üúë¯ÙÞÞΣG2))‰»ví"É{Ž…eÝCCCŒ‰‰áªU«øÍ7ß°½½Çgll,×­[gVKzzºÙ8}ðÁV}·7ŸŽê²œëÉzà˃òòrFFF2((ˆyyyÊ—šÑÑQæçç3$$„þþþÌÉÉáðð0ÇÆÆ¸lÙ2úúú*mUTT022’ŒåÉ“'IÞ½œ¥Õjùä“OÒÏÏ[·ne¿Ízl…Ö^m$ùÆoÐÛÛ[¹le«[ŸÛ{m{›½q³466ÆÂÂBÆÅÅÑËË‹ .dAA äÆÂV:Ž»víb\\}||¸xñbîÛ·z½Þ¬–ššFEE1((ˆo½õ–òšÛ´7ŸŽê²5דñÀCû(šLmÌÎÎ~H©ÓdÞ°‚½ÐÚý}Ú™Î`0 §§åå娬¬tu9¬‹/ÜÝÝ]\ÉÿMû±¹sçâõ×_wF-N稶††,]º¯¼ò ž{[˜JüôÓOHKKÃöíÛîêrn¿þÕÕÕØ¼y³üå‚p¹ñ¿\¨©©1Û/¿å%TGB+TGB+TGB+TGB+TÇîuZG~!ÄÃ’™™iµÏê’—ÜÉ96oÞŒüü|ë[úˆûbë¶HV¡Îáææ†ªª*dee¹º”GÖ´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Bu~·ÿsa¢úúztww?v}O´ñ»cÿžÉm‘deeYÝ"ýQ%Ó%Ë¡B²<°P½¿«K°ò×C‡P÷Û¿FZ+›žÞÕ%X©9}ÚÕ%‹¿¼û.ú‡†WUa~zºÍKTX³WU=ì’g í4Ô<ˆÞÚZÜ:s§ÿþw\¹y;KJÜý†®·¯盛͞ó¯¶6tß¾©©®(yFÐNC¿?æ=ñBñǧžBI~>N}ÿ= 8 ©II¨¶øÎÿXm-V.Y‚À@W”<#HhhöìÙxüqåó-kÖ æôi˜L&eß±ÚZlÎÈpEy3†„vtz=tz=†GFpùÚ5”–bÛÚµÊãRSñóÐþÙÔø÷Õ«¸|í6ÈÒ`Zä‡ Ó ±øwKs}|p`ï^³Ï×®XêÓ§±bÉ«­Åª„<ìRg9ÓNCÇ_€MM`SF°ûå—‘úÚkfÇlY½ÿ8s&“ Çjk‘%Kƒi“Ð:‰—‡ò¶lÁÕžüç矕ýëV®„N¯GÅW_¡ùòeü9%Å…UÎ ²<˜†ÿö÷Ã×Û02:Š¿UVbþ¼yò÷WŽñôðÀŸV­BþþýHILD ŸŸ«Ê1$´Ó°ìÅ•gÏš…ÅQQ¨Ù¿ßê¿·®YƒC_~‰¬ôô‡]âŒ$¡"þvE`2V''ß×ñÂ1YÓ Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘ë´Üâã]]‚¸9Ó Õ‘3-€gžyÆÕ%ˆû ÷òª#Ë¡:Z¡:PÇ=.…øÍÿë²ÍIJ*˜›IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_bvsvdmetho.png000066400000000000000000000033671454104675500245530ustar00rootroot00000000000000‰PNG  IHDRy$"ˆ7bKGDÿÿÿ ½§“¬IDAThíškPWÇo©È#A§RDË DP0<’bQ´AaxŒ£ƒ•AD§) U4hyé„G¦2¼”K+ø‚ hAK©ÀøQ*"¤U  IúaÇ"`l×»¿É‡=gÏÙ{ö¿÷žÙÝ,N£Ñ TÐûÐüÀ´FLkÑ øÐµ|„…BX^l^£‡þT—5‘HvrB¿”‰>™¬¹£c’S‹Öd''af&*%}´TˆDÍÎ$'ÖCÐÓ=0­ÑC­q$ü3óñ ;pàùÈ O °¦Ó'Ý;~Ædæ €Q¥2>+Ë–Åšçîn˜œŸ?6>>cr¬¥‘>BVb8©¼€˜‰ÔÕÛ;Ës™e$’®Þ^‰ô®Y:Îëæâⱸ¿®®6?ÿ±T›ž`ÓhOŸ6µ·ÃaÜ¿ß+“m¡R{ÒÒZîÞýñĉžšš®ª¯çðx3fÁcIE¢B.wD.wÙ¶mX.‡ƒ»ŸØô$‘ä ÔFFFG¯µ´lD´ˆãEEIsqqã™3ÍI|þÍ’@]SÝÐðûÙ³…\nr~þ³áa@LjjŸLö[YÙ•¼¼š¦¦ôÂB~yùÑ‚‚ïccVUŠŠ:›«ƒh:jí<ŸL6öðX¾qcë½{á6@þOŒXÞÞÐD«‹ýÖ¬!˜šB»Ü[ÊÊn•”¬÷ô¬ª¯· tOÏçÖÖH›FƒZöy‘Ù@½–T*tCÛµKÒß?õ€‹ ‡ƒLÙ³g¯T*x;›>™¬§¿Ÿ´|9œâ´lÙ¬dz“÷í׆{BBºŸ<ùkpòl PF•ʲ˗Û;;ƒÖ­ƒœ&41±ãáC8‘N&«ÔjÕë­5K+ù, éñZµJ®Pܸ}[tó&4=að´ºqj “À½iÍÌôñø?¥RÈìêë³"–ZY!ïvîtuMSáÛÐò>d6üýüùüy󊱱œ³g­‰D‹… ¡]s 6ùùÅef®ss371œF††á,V0‡Ããplm‡‡Ÿ:õ%…ò©‘Ñ4YȱTjõ£ž^iéc©´:' §§·™JÝ•’âæè—Êd~›•u|ÿ~åøx—ëlo¿?< W( úµ(‚Çoe0bÓÒ ’“G•Êïøü0‹hfÆáñÌŸï¾reÛƒóòtMG­ÉÐ^OÏÑή"3^ƒ€P&³äâÅ`:™ræÈ‘£I¹¹ ÁÔ4Ð×— К…k‰¥%ÅÕµõÜ9ø ÁÓéyA̶m“üI;w&dg{DFŽOLúødìÛ7×À€ìä´ÈßÿESÓÛÎŽŸ˜¸7#cMhè'sæ„$îØ1G__¥V'dg÷ 8ØÚ–;æ9³Lo‚C>°Az±i4ì=ß{R!s8¡PÈf³!'ö>=0­ÑÓ=0­ÑÓ=0­ÑÓ=´<Ë4wtOùãè“É´x±ïžþS°ïž> 8l:£6¯ÑÓ=0­Ñãá°àpÌIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_cissextrac.png000066400000000000000000000031431454104675500245320ustar00rootroot00000000000000‰PNG  IHDR|$Ä¡ÉsbKGDÿÿÿ ½§“IDAThíš{LSWÇOm]°B!)D*dÃH:l¨ ï.¸Åð°<Œ`&òªH°4Ut”Gº¢¼‡òP”EePµ‚QaêT†Ê2- j*ãQ^¡íþ¸Ys×`uÜDï'ç{~¿_çw¿½=çÞÓ‹Q(eeY…tŸ"¨è€ŠŽ8xƒÁ UÇG|íD¯tÀ©›¬ÌÍ©dòÊ—òQÒÙÝ=(«5ˆN%“Ïçå­HI?Á))®_W1¢Ó  ¢#*:è(ºxd$òðá4šÁöí[éô‹7n(]GÇÞèxZ*eæço¤ÑðÎÎ_¦—”ÌÎÍ-éÂ8:ª·÷8Çw w``ÆÒ°.Éøää–š»{}NŽÁÚµ-wÙx==WW•È„ìì~‘è"—kmañG__bNΨDRšº¸ ÐYUE"—SÌ_CCNaaÃíí:œˆz#!5*JçTËD—+ýhié×[·–§¥998l"‘FD$„†þX]­ùs[[6ƒ±ÅÞ~‘‘…r’ɼrëÖ’.€©±±¹‰ ¼i+F.—ÿ=>®ÃYhÌ`bhÈIL|ŸlËAÑ/\»Æ Óá–ô˜˜Ÿ22Ô# ÊÇ''¡®…ÒßÒ²¤K—ÛÛ­|| Ôµ´|¹cÇÌì¬KD`½—øwrh{ðÀÆßÿnWWÓÍ›ä  ¼³ó?¿‚º:€L.?ZZºÁÏÏÌÓs÷‘#’©)€zh8ÉÔÔž´4Sk_ßoîí[ÆÑñ’@@ 5ru=vê”êDŸ˜ž Û“HpãÚ5k¬-,ÔƒÏq8{zˆÞÞ´øøµµCoÞ,ǘ–JU ÐÃÃËÙ9)/ïÍèèA.·&+ ¯§÷ku5à5lQÉ;{67)ÉÖÊ*äÐ!'áÕ«#1'glb"¿¦æ’@ðKQÑÍòò?ûû(/¨g€ˆçpÅâûµµ-EEüŽŽœÊJÈÞÀç·UTp““ÓŠ‹G%’wè ºL&ËÞ¥q!“74Ü®¬t£PÎ\¾L hàó—t¾ Ö§Rá ²Ÿ`2÷ïûÄÄì Ú¶y³ÆAsöñ112zÒØx’É´45…–‡Q‰¤¢©éX\Üf[[;»3™™Ûµ¯™ 2Y}kë &“D$:ØÙeÆÆÖ47C®ØC}ýÝ€±‰‰åè Â;‹nL ¬_·®§¯nü­§Ç),lfvnœ™màó eÓ¦Ô¨¨Ç ì½{Sx¼Å]Â+W]]ðÙ õõ¿ß¹óYoïþà`mB¿ÂÕ8ÜËׯw0ÔÈÈÓMMë¥Hdgm­ ûÖÓS[ñÈÈ‚Lfkeuí¬­•O󖦦»¹4¢ËœèáÁ­ª‚[jš›çðzzp£\.§³XO…B¥ÅËÅe~aaq×â ŠÅ…õõ^..É\®¶HŽ·óóß%%שׁ*b± —¥™Y¿HÿþüyVE…¶$æ&&8,¶ohêöÍÌ ãUォ‹èY ·=Š`³;»»Ÿ¼x‘YVvòܹcqq*aúx|Âd¶Þ½+¸$$s¹a‹» †ÇÆÄ##ðP(Qéé »vÕeg î݃ßíLĮ́Œ>-•JçæpX¬tn.½¤093A£± ž …=}}ñŽò PÏ€ÃbC|}³³ûE¢g½½‡ Ãi4´Òˆ.÷éŸ>¬«Káñ‚SR$SSö66M<Þ7îîê‘§322ËÊåç _½²43 õõMÛ·oI€©’JÑÕU|þüðØsÏ[ÌfÇ?îF¡Ø‰T2y½—×dG<Þ˜@ÈJHe2 Vt4Ýßß/6öUkë´Tê;-•¸ºæ&%´e(d±¹¹ÛèôÏV¯¦°¢£uÐJ#øæ:´<y{£»Œ å.#ú' ¢#*: ¢#*: ¢#*:h¸OG_Áø€(_ÁøÎꢣü GƒAßO_yÐ+PÑþbAû£r‹ÏIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_cissextrac_2.png000066400000000000000000000031431454104675500247530ustar00rootroot00000000000000‰PNG  IHDR|$Ä¡ÉsbKGDÿÿÿ ½§“IDAThíš{LSWÇOm]°B!)D*dÃH:l¨ ï.¸Åð°<Œ`&òªH°4Ut”Gº¢¼‡òP”EePµ‚QaêT†Ê2- j*ãQ^¡íþ¸Ys×`uÜDï'ç{~¿_çw¿½=çÞÓ‹Q(eeY…tŸ"¨è€ŠŽ8xƒÁ UÇG|íD¯tÀ©›¬ÌÍ©dòÊ—òQÒÙÝ=(«5ˆN%“Ïçå­HI?Á))®_W1¢Ó  ¢#*:è(ºxd$òðá4šÁöí[éô‹7n(]GÇÞèxZ*eæço¤ÑðÎÎ_¦—”ÌÎÍ-éÂ8:ª·÷8Çw w``ÆÒ°.Éøää–š»{}NŽÁÚµ-wÙx==WW•È„ìì~‘è"—kmañG__bNΨDRšº¸ ÐYUE"—SÌ_CCNaaÃíí:œˆz#!5*JçTËD—+ýhié×[·–§¥998l"‘FD$„†þX]­ùs[[6ƒ±ÅÞ~‘‘…r’ɼrëÖ’.€©±±¹‰ ¼i+F.—ÿ=>®ÃYhÌ`bhÈIL|ŸlËAÑ/\»Æ Óá–ô˜˜Ÿ22Ô# ÊÇ''¡®…ÒßÒ²¤K—ÛÛ­|| Ôµ´|¹cÇÌì¬KD`½—øwrh{ðÀÆßÿnWWÓÍ›ä  ¼³ó?¿‚º:€L.?ZZºÁÏÏÌÓs÷‘#’©)€zh8ÉÔÔž´4Sk_ßoîí[ÆÑñ’@@ 5ru=vê”êDŸ˜ž Û“HpãÚ5k¬-,ÔƒÏq8{zˆÞÞ´øøµµCoÞ,ǘ–JU ÐÃÃËÙ9)/ïÍèèA.·&+ ¯§÷ku5à5lQÉ;{67)ÉÖÊ*äÐ!'áÕ«#1'glb"¿¦æ’@ðKQÑÍòò?ûû(/¨g€ˆçpÅâûµµ-EEüŽŽœÊJÈÞÀç·UTp““ÓŠ‹G%’wè ºL&ËÞ¥q!“74Ü®¬t£PÎ\¾L hàó—t¾ Ö§Rá ²Ÿ`2÷ïûÄÄì Ú¶y³ÆAsöñ112zÒØx’É´45…–‡Q‰¤¢©éX\Üf[[;»3™™Ûµ¯™ 2Y}kë &“D$:ØÙeÆÆÖ47C®ØC}ýÝ€±‰‰åè Â;‹nL ¬_·®§¯nü­§Ç),lfvnœ™màó eÓ¦Ô¨¨Ç ì½{Sx¼Å]Â+W]]ðÙ õõ¿ß¹óYoïþà`mB¿ÂÕ8ÜËׯw0ÔÈÈÓMMë¥Hdgm­ ûÖÓS[ñÈÈ‚Lfkeuí¬­•O󖦦»¹4¢ËœèáÁ­ª‚[jš›çðzzp£\.§³XO…B¥ÅËÅe~aaq×â ŠÅ…õõ^..É\®¶HŽ·óóß%%שׁ*b± —¥™Y¿HÿþüyVE…¶$æ&&8,¶ohêöÍÌ ãUォ‹èY ·=Š`³;»»Ÿ¼x‘YVvòܹcqq*aúx|Âd¶Þ½+¸$$s¹a‹» †ÇÆÄ##ðP(Qéé »vÕeg î݃ßíLĮ́Œ>-•JçæpX¬tn.½¤093A£± ž …=}}ñŽò PÏ€ÃbC|}³³ûE¢g½½‡ Ãi4´Òˆ.÷éŸ>¬«Káñ‚SR$SSö66M<Þ7îîê‘§322ËÊåç _½²43 õõMÛ·oI€©’JÑÕU|þüðØsÏ[ÌfÇ?îF¡Ø‰T2y½—×dG<Þ˜@ÈJHe2 Vt4Ýßß/6öUkë´Tê;-•¸ºæ&%´e(d±¹¹ÛèôÏV¯¦°¢£uÐJ#øæ:´<y{£»Œ å.#ú' ¢#*: ¢#*: ¢#*:h¸OG_Áø€(_ÁøÎꢣü GƒAßO_yÐ+PÑþbAû£r‹ÏIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_cissextrac_3.png000066400000000000000000000031431454104675500247540ustar00rootroot00000000000000‰PNG  IHDR|$Ä¡ÉsbKGDÿÿÿ ½§“IDAThíš{LSWÇOm]°B!)D*dÃH:l¨ ï.¸Åð°<Œ`&òªH°4Ut”Gº¢¼‡òP”EePµ‚QaêT†Ê2- j*ãQ^¡íþ¸Ys×`uÜDï'ç{~¿_çw¿½=çÞÓ‹Q(eeY…tŸ"¨è€ŠŽ8xƒÁ UÇG|íD¯tÀ©›¬ÌÍ©dòÊ—òQÒÙÝ=(«5ˆN%“Ïçå­HI?Á))®_W1¢Ó  ¢#*:è(ºxd$òðá4šÁöí[éô‹7n(]GÇÞèxZ*eæço¤ÑðÎÎ_¦—”ÌÎÍ-éÂ8:ª·÷8Çw w``ÆÒ°.Éøää–š»{}NŽÁÚµ-wÙx==WW•È„ìì~‘è"—kmañG__bNΨDRšº¸ ÐYUE"—SÌ_CCNaaÃíí:œˆz#!5*JçTËD—+ýhié×[·–§¥998l"‘FD$„†þX]­ùs[[6ƒ±ÅÞ~‘‘…r’ɼrëÖ’.€©±±¹‰ ¼i+F.—ÿ=>®ÃYhÌ`bhÈIL|ŸlËAÑ/\»Æ Óá–ô˜˜Ÿ22Ô# ÊÇ''¡®…ÒßÒ²¤K—ÛÛ­|| Ôµ´|¹cÇÌì¬KD`½—øwrh{ðÀÆßÿnWWÓÍ›ä  ¼³ó?¿‚º:€L.?ZZºÁÏÏÌÓs÷‘#’©)€zh8ÉÔÔž´4Sk_ßoîí[ÆÑñ’@@ 5ru=vê”êDŸ˜ž Û“HpãÚ5k¬-,ÔƒÏq8{zˆÞÞ´øøµµCoÞ,ǘ–JU ÐÃÃËÙ9)/ïÍèèA.·&+ ¯§÷ku5à5lQÉ;{67)ÉÖÊ*äÐ!'áÕ«#1'glb"¿¦æ’@ðKQÑÍòò?ûû(/¨g€ˆçpÅâûµµ-EEüŽŽœÊJÈÞÀç·UTp““ÓŠ‹G%’wè ºL&ËÞ¥q!“74Ü®¬t£PÎ\¾L hàó—t¾ Ö§Rá ²Ÿ`2÷ïûÄÄì Ú¶y³ÆAsöñ112zÒØx’É´45…–‡Q‰¤¢©éX\Üf[[;»3™™Ûµ¯™ 2Y}kë &“D$:ØÙeÆÆÖ47C®ØC}ýÝ€±‰‰åè Â;‹nL ¬_·®§¯nü­§Ç),lfvnœ™màó eÓ¦Ô¨¨Ç ì½{Sx¼Å]Â+W]]ðÙ õõ¿ß¹óYoïþà`mB¿ÂÕ8ÜËׯw0ÔÈÈÓMMë¥Hdgm­ ûÖÓS[ñÈÈ‚Lfkeuí¬­•O󖦦»¹4¢ËœèáÁ­ª‚[jš›çðzzp£\.§³XO…B¥ÅËÅe~aaq×â ŠÅ…õõ^..É\®¶HŽ·óóß%%שׁ*b± —¥™Y¿HÿþüyVE…¶$æ&&8,¶ohêöÍÌ ãUォ‹èY ·=Š`³;»»Ÿ¼x‘YVvòܹcqq*aúx|Âd¶Þ½+¸$$s¹a‹» †ÇÆÄ##ðP(Qéé »vÕeg î݃ßíLĮ́Œ>-•JçæpX¬tn.½¤093A£± ž …=}}ñŽò PÏ€ÃbC|}³³ûE¢g½½‡ Ãi4´Òˆ.÷éŸ>¬«Káñ‚SR$SSö66M<Þ7îîê‘§322ËÊåç _½²43 õõMÛ·oI€©’JÑÕU|þüðØsÏ[ÌfÇ?îF¡Ø‰T2y½—×dG<Þ˜@ÈJHe2 Vt4Ýßß/6öUkë´Tê;-•¸ºæ&%´e(d±¹¹ÛèôÏV¯¦°¢£uÐJ#øæ:´<y{£»Œ å.#ú' ¢#*: ¢#*: ¢#*:h¸OG_Áø€(_ÁøÎꢣü GƒAßO_yÐ+PÑþbAû£r‹ÏIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_cissquadru.png000066400000000000000000000035311454104675500245460ustar00rootroot00000000000000‰PNG  IHDR{$©E]bKGDÿÿÿ ½§“IDATxœí›{P”ׇ ® ˆ€Œ&˜ŠŒ•‹Hn¢Â:V¹”[CÀ$\Ûr+Š1‰"Z$Hƒm@£hÌÅ1mc Ž‚4•hÀ‚¸ ÈeûGÇ-°ìÊÆÅLØï™9|ç}ßï={~ûË~gud2™ m`ÿ¸Ÿ»Al-B[› Ê(>>>C¥-žl-BW™ÁÊÜ{ûGÙ °ÿÄ ¥6¥b»ØÛS¶e˨4H`ôÐqpPj†q-B[‹ÄÖ"4&öÍÖVBÖ¬a†XŒ‘«+søð“Oùè88pµ©I~-éì$1+‹b1"''žZ¶Œu¹¹tuw«å íê"!3__&ÍŸSP›÷졯¿_SQÎÕ¦&ùܨãà0¨Ltvæ¹W^áb}½Ú÷m”.ÐÔ¡­£ƒ9~~ˆÝÝ)IOÇhâDŽž>MPJ "<Ý܆‹Ú´‰ïoÜàÃŒ ¬-,¸ÔÐ@tz:·ÛÛÙ‘”4bŸ»R)ó175%=6–VV\¬¯gmNÇ«ª8ž›Ë¸q£7ˆUbci @‡Tʆü|üøîàÁQËùSÐH¼ùî»<7w.ù©©Ì³³c¶ &Êߟ­{÷*ûÛgŸ±)&†9¶¶˜³Àё퉉T|ñ…Z>oåå1ÕÄ„“»v±ØÕ•YÓ§ãýâ‹ü½¨ˆ†k×øë¡Cšø˜J™:e 榦˜›š2ÓÚšÍqqÔ64ÐÒÖ6ªyÕE#bï?~œ˜€…úu«WS°~½Ò8c##ò ­£C^·ÀÑ‘ïUËçƒ#GH WxzE$„†RôñÇ ÃåÐëCŸ~н"''~µd ;öí@&“‘]RÂ3ÞÞ¹ºâ™óçUö‡ž®.ãõô0‰†Í¥jèîíë#%;ëÅ‹1qw'2-{==*ó”‡ûŽDÂÄÖÆFÁ6q¬-,”Ƨ¥ñMm-–ˆ##ÙVTÄõ[·Ôòi¿{—æ–lm‡Í1ÇÖ–ï0vH$ø%$0ÏÎŽúÇI‹‰!:=ÿܹCvI ïäç³1:šºòrRÃÃùóŽƒâ%òÒÜÒBêÎzy¡?~¼Ê¼Ãñ—÷ßçJc#U……œ*( ª¦†”ìlµï3-v__:::jÇ:ÛÛómi)_îÞÍGGö”—cãåEieåˆ}W–]&“=p¾6Ð×çÂlOLdÚÔ©òù÷v{;;ËÊØËò^ÀÂÌ O77Ò¢£ÅÿÆ×C ]\˜¶p!…¼©vìþè#²“’°27ÇnæLÒcc9QUõ“î5”‡{ʤIžù¡¡>uŠC™™,uwW÷Þúõø.ZDBVö+W’•ÅB''6FE©åc(ñâbmmùÓÖ­8øúRRYÉšW_e¶ Á))˜óæêÕÄmÙÂo óö–ÇO™4‰QQø'&òë+xÒÚšOO–¼þ:+W²6<œ¤mÛxréRÖæä°wÕýaenÎdCCZÛÛTæJJXÓ-,p}ùeÜBCå[9M 3ôÀáý…–‡Ç˜xëÕÓÛ˹K—pzöÙŸ»)„û[:ÊÊÊšÆþC=]]­úAŒy±þ ¶!ˆ­Ebk‚ØZ„ ¶¡ôðBUMÊßw~y(ûÚÍ›*Ï üò†q-BáÉþ®=vžl-B[‹ÄÖ"þ ©÷‰[™ š¢IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_combinetyp.png000066400000000000000000000027471454104675500245440ustar00rootroot00000000000000‰PNG  IHDRq$1_BÃbKGDÿÿÿ ½§“œIDAThíšmLSWÆOä]‘–aë¬v¾DFÊÄE¡ëŠ+Ô4"¦* °¤)QÖùRÆæµ(¢raŠXcÐ’9lT$v,jjÍHÄb)£A§"j@.݇›®´ØâƒÞ_úáÜçœó?OžœÓ›{[‚Ñh8˜âô¡ |„à™bžé{ÀhƇö2Q(¦ñ}Š=.#%2‰´88xü­LDº µVk!ZÉtqp°âÀq±4á©llT‹D"~ö±Ï{ðL±gŒ™?NÌÊšÉáx………òx¿]ºô.&Úu:n8:ç”J>òs»­í]ì9Š•{Ô[yúüyHB‡É<+•zyxÔ77¯‹ÝÝÜ¢ ùz{o߸ѡ)+X¬• p_¯_œ˜Û?__ ½•±dú˱cß…†žÈΆ—ó¨ÔžG•–b›©Ÿ$=Ý¡)n®®n®®€þ—/$?? ýØÏXÎ~eCÃfÏ\ù™Ï—íÚÛÏúû7dgû³X6[”Ÿ?08 Ðéòšš¯V­òg±rJJÊêêfÅÆú„‡ÿTXh*R^_O‹‹#FDrr^ ˜Ÿ}~^¥úzÍ_cOq1‡PTŒ 6{ “)”H_¿¶e8]*M}cïÅ«W‹iîÞ…õk¯]›Ïå#"„ ´jY[8œiß‹ݽ½s©TsÑcÒ$J@l %’.ƒáϲ²úÂBåõëÒS§ ^}åŠZ.—fdˆ¤²¡á¶Bq03sï‰ÿ>{Ȫª.Õ"ˆª¥Åœ‰sJåå’’¼ÌÌì¢"8åàéÓmj¹¼I&Skµb±å9>*ªúòetxÚ˜I&ÓçÌ]ÕGŽ\((hP«÷Ëd•µ…Ù¢( V{‡PôìÅ‹G¶m£N›D£íÎÔÖ®Œµk=ÝÝã♉‰žîîV¬<é냋D4 eáüù{…ÂsJ¥EeAB‚§gÒòå¦)§ª«‘íÛÉ$R&ÍÈhT«my§Ó?sqiºyP^W·>6ÖÔupëV…òMPÐ^¡°¬®Î¡²¶pøût²·÷çS§¶vt˜?¿ÞhmìÛwåäÉ'}}C(:‹L†:Bé2`;ÐßàâìlÑ6ñåôé°1wÆŒz{-Ö9E×Óiºôõò²åÙÉɉy^¥ ž=ûRK˱¬¬‘‹Î£R¡UûËÚ\ÎÑ €å,Vž\n®œ©­}=4äîæFòósqvîÐë¡ÞÞÕ5H´³ì½‡a£­³ó‹À@K£#NF ‘øwMQ£1j4O››ÿ(-¥xüÒ¥çU*…RÉ !“HV $-k•±dš³iÓµ[·Ö‹Åj­öν{»?Z^¾'- àâìœÀf§ïßÿ »û¯öö,YÇáØY63/¯]§»ÑÚº³ `½³xÑÑ?>|_¯oíèà…GËËGümH:<¼»¸Øüà6çæš]ãhY«Œ%Ó)>>7+*†PtµHžœ|¡©é÷üüX&ö";v‰ y¼¥|þ²ðð))v–ýžË]&Ĥ¥E3?$%½u¼85uz@@XR#9™F¡änÙ2Ê`xüûúû¹K–˜ëë8œ(>?&-¶3%ÅѲV!˜¿Š†wžø¨¨ò½T‚<èî>““/Ûu:Z\œQ£y—š•«E"€B¡ˆ‡â'ñ¼?08x_¯—UU¥r¹ã°Ü'‘iË;¡<ÞÆ•+Y¡¡&ÑÛÓ“ÿfgaËXžM'Ì _½j!úOžü«Xü>–û$öé8ƒgŠ=x¦ØƒgŠ=VîQj­võˆßq¬bz›ñ?ðÿ¡`þ?”÷ ßž˜ƒïSìÁ3Å z` ™xùöm\M’·7¯••ITÔÚ={¨ë,â–LL|øüÙ0<ÜÛÎnEg'/7÷ö#Gbª«¹88‚€4̘aob2»®ÂÕTT|ñæMßâÅâr’Ðê]»ò£¢Eê32æ56BØ¿|I¬«upuw/íïÿùë£Áº½{""llšgÍb``,,,éëƒhùõû·Ýö#GèáO_¿>{ýZCQY›“SVBÂÎioòòå©¥K·OºóرÎùó!â+wîÜ?gNoqqÝ´iï>~Œôô\+Ôw;ÆÉÎîfeEüýû—w«éÏß¿+vì˜X^®(-­£¢Ò”•µdëVˆTVx8?O¼ŸÃûOŸ|ííß~üxæÚ5†å;v$øû33‘“HÖ#ÈÇ')"ríÞ=dÁ3×®™EGûñãåÛ·þþU–‘ˆ«ÈÊÂ+)QQff—“ÝßÁaÍîÝß~üØ|ð`¢¿?®'Ç ~½‹!‹,Ùºõ÷Ÿ?\âÂÂ,ÌÌ÷ž>…ˆß}òDZL jF¤Ezz®Ù³gÓÆšš*²²d¸„<´åæ>w.¶ºúø¥K—oßnš9sÒ²eÍÙÙ ,ÌÌáîîyž=»z÷nÍ”)1ÞÞ¸Ìq³´üðéSýôéI乞LñóŸ]¾üÏß¿a¥¥Ö [Zßßïcg‘RY)%&få–‘áam]™œŒËV–W×çoÞ„¸º’é|FäÎ$k†ººòÖè°êÐŒz` Á¨Œz` –z`ð« ¸Óƒ «ŠŒqt~`€Á¨)y¡ôU´IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_conv_2.png000066400000000000000000000014621454104675500235520ustar00rootroot00000000000000‰PNG  IHDR@$¶n«ÅbKGDÿÿÿ ½§“çIDATX…cüÿÿ?ÃPLíJÁ¨° sÊ$ä|;¼bdÄÅ-õôèï‚àø¥KO^¾DÄâK=½UÝÝtqi ¬´tõîÝh‚C> z` ™xùöm\M’·7¯••ITÔÚ={¨ë,â–LL|øüÙ0<ÜÛÎnEg'/7÷ö#Gbª«¹88‚€4̘aob2»®ÂÕTT|ñæMßâÅâr’Ðê]»ò£¢Eê32æ56BØ¿|I¬«upuw/íïÿùë£Áº½{""llšgÍb``,,,éëƒhùõû·Ýö#GèáO_¿>{ýZCQY›“SVBÂÎioòòå©¥K·OºóرÎùó!â+wîÜ?gNoqqÝ´iï>~Œôô\+Ôw;ÆÉÎîfeEüýû—w«éÏß¿+vì˜X^®(-­£¢Ò”•µdëVˆTVx8?O¼ŸÃûOŸ|ííß~üxæÚ5†å;v$øû33‘“HÖ#ÈÇ')"ríÞ=dÁ3×®™EGûñãåÛ·þþU–‘ˆ«ÈÊÂ+)QQff—“ÝßÁaÍîÝß~üØ|ð`¢¿?®'Ç ~½‹!‹,Ùºõ÷Ÿ?\âÂÂ,ÌÌ÷ž>…ˆß}òDZL jF¤Ezz®Ù³gÓÆšš*²²d¸„<´åæ>w.¶ºúø¥K—oßnš9sÒ²eÍÙÙ ,ÌÌáîîyž=»z÷nÍ”)1ÞÞ¸Ìq³´üðéSýôéI乞LñóŸ]¾üÏß¿a¥¥Ö [Zßßïcg‘RY)%&få–‘áam]™œŒËV–W×çoÞ„¸º’é|FäÎ$k†ººòÖè°êÐŒz` Á¨Œz` –z`ð« ¸Óƒ «ŠŒqt~`€Á¨)y¡ôU´IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_conv_3.png000066400000000000000000000014621454104675500235530ustar00rootroot00000000000000‰PNG  IHDR@$¶n«ÅbKGDÿÿÿ ½§“çIDATX…cüÿÿ?ÃPLíJÁ¨° sÊ$ä|;¼bdÄÅ-õôèï‚àø¥KO^¾DÄâK=½UÝÝtqi ¬´tõîÝh‚C> z` ™xùöm\M’·7¯••ITÔÚ={¨ë,â–LL|øüÙ0<ÜÛÎnEg'/7÷ö#Gbª«¹88‚€4̘aob2»®ÂÕTT|ñæMßâÅâr’Ðê]»ò£¢Eê32æ56BØ¿|I¬«upuw/íïÿùë£Áº½{""llšgÍb``,,,éëƒhùõû·Ýö#GèáO_¿>{ýZCQY›“SVBÂÎioòòå©¥K·OºóرÎùó!â+wîÜ?gNoqqÝ´iï>~Œôô\+Ôw;ÆÉÎîfeEüýû—w«éÏß¿+vì˜X^®(-­£¢Ò”•µdëVˆTVx8?O¼ŸÃûOŸ|ííß~üxæÚ5†å;v$øû33‘“HÖ#ÈÇ')"ríÞ=dÁ3×®™EGûñãåÛ·þþU–‘ˆ«ÈÊÂ+)QQff—“ÝßÁaÍîÝß~üØ|ð`¢¿?®'Ç ~½‹!‹,Ùºõ÷Ÿ?\âÂÂ,ÌÌ÷ž>…ˆß}òDZL jF¤Ezz®Ù³gÓÆšš*²²d¸„<´åæ>w.¶ºúø¥K—oßnš9sÒ²eÍÙÙ ,ÌÌáîîyž=»z÷nÍ”)1ÞÞ¸Ìq³´üðéSýôéI乞LñóŸ]¾üÏß¿a¥¥Ö [Zßßïcg‘RY)%&få–‘áam]™œŒËV–W×çoÞ„¸º’é|FäÎ$k†ººòÖè°êÐŒz` Á¨Œz` –z`ð« ¸Óƒ «ŠŒqt~`€Á¨)y¡ôU´IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_conv_4.png000066400000000000000000000014621454104675500235540ustar00rootroot00000000000000‰PNG  IHDR@$¶n«ÅbKGDÿÿÿ ½§“çIDATX…cüÿÿ?ÃPLíJÁ¨° sÊ$ä|;¼bdÄÅ-õôèï‚àø¥KO^¾DÄâK=½UÝÝtqi ¬´tõîÝh‚C> z` ™xùöm\M’·7¯••ITÔÚ={¨ë,â–LL|øüÙ0<ÜÛÎnEg'/7÷ö#Gbª«¹88‚€4̘aob2»®ÂÕTT|ñæMßâÅâr’Ðê]»ò£¢Eê32æ56BØ¿|I¬«upuw/íïÿùë£Áº½{""llšgÍb``,,,éëƒhùõû·Ýö#GèáO_¿>{ýZCQY›“SVBÂÎioòòå©¥K·OºóرÎùó!â+wîÜ?gNoqqÝ´iï>~Œôô\+Ôw;ÆÉÎîfeEüýû—w«éÏß¿+vì˜X^®(-­£¢Ò”•µdëVˆTVx8?O¼ŸÃûOŸ|ííß~üxæÚ5†å;v$øû33‘“HÖ#ÈÇ')"ríÞ=dÁ3×®™EGûñãåÛ·þþU–‘ˆ«ÈÊÂ+)QQff—“ÝßÁaÍîÝß~üØ|ð`¢¿?®'Ç ~½‹!‹,Ùºõ÷Ÿ?\âÂÂ,ÌÌ÷ž>…ˆß}òDZL jF¤Ezz®Ù³gÓÆšš*²²d¸„<´åæ>w.¶ºúø¥K—oßnš9sÒ²eÍÙÙ ,ÌÌáîîyž=»z÷nÍ”)1ÞÞ¸Ìq³´üðéSýôéI乞LñóŸ]¾üÏß¿a¥¥Ö [Zßßïcg‘RY)%&få–‘áam]™œŒËV–W×çoÞ„¸º’é|FäÎ$k†ººòÖè°êÐŒz` Á¨Œz` –z`ð« ¸Óƒ «ŠŒqt~`€Á¨)y¡ôU´IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_convergedr.png000066400000000000000000000036411454104675500245230ustar00rootroot00000000000000‰PNG  IHDR$;/.ÔbKGDÿÿÿ ½§“VIDAThíš{PSWÇOÞ(¯Ð@vÒv¥”e«]`xŒ `ËKŠŠ‚–ÁI5A6¾ƒD¢ Ô`±Š¨4V(°Ä©Ý£Ò–—uÀGF^ „BšýãîfÒ&¬&ãïô~æþqî÷Üß/¿“oιwN.J©T„×´¡ @x)ŸàâLPªaèZ~C}}½Êd>Á¬¦ä„Ç“=<¿ˆ¡/üNÔâÙãþðáE) A <ŸÁøˆ¬{ðñ  >Á=}ŽmÌÉq ³ðö^•pñæÍW[Ö+gpxåé @yzª³>ðON¾?0`èê^Œ–çˆ295õ·¸¸0?¿:6ÛÂÌìzWW"‹ejlLñõ}åõý?às¹ÎŽŽ€©™™üŠŠ8&óAS“¡‹zúø´§¼ÜÕªŠÜ\èt…³ó³ÑÑcÕÕpñÉnÙ2¼ ocSH§ÛŽNNÚ.]jèºþú¬{ _}•™ ®ä¥¦žÝ»j‹¦§7çæÚCBEE²¹9ÊÓ³éë¯ß‹_êë»ÿôiÀ::}ç±cPÈœ\níçw½« 0¯P°8bHˆµŸµ `N.‡–¬¶;w–S(ÿìé©ljrÿøcKŸÀ””«Ðj¦¥T*9uunëÖYx{“7nì¾{WëXŒ°Ø%FF¦¦Ð©fÀ¥[· Å-Y²Pž)‰$ŽÉü»»ûÀÕ«™™lö„X,‘Jã˜Lj|ü/×®ålݺ%/ofvöåÇ®ëwôðI¡PP(”ÖÞy…¢îÆâ¬,gGGwi_Zšê·–gen¾)"0!¯õ÷‰¾ëíÔÞ¸‘‰A£U—/svírÂãÝI$6Æãó¡ðB-68øôÅ‹…4Z0™lceµÚËk_ZÔ«UV__H£E:ØÚR|} 22TEþ56ÖœL6'“ ~Èmn>@¥ªº4óãp÷Odeìì »Ú¸H¤øõW4-ŸŸ·03Û9ÑÙi‚ýüØuýÎ÷§e––oØÚö ©ï-}×Û›–Ÿß~æÌ„X<¯P¸:9A:‰H ¡6Á΀Å` S.2  ‘Çssqiþæ›.\€ôágÏV¯Ve^ja5 <8<ìN"©zÝ\\Šš“Ë=ß~[¥x¼ù¦ª=ÐÜìJ$¤2ÙŽ£GcŒ®Ï?_(ûèéSjAÁ´TúŽ«+¤[š™uUU×Ôì-/_éæ–œì¿r¥plì%Ç®úÜŸ"Žr¹êÊù–ùü¼©±1ÞÆ‹Á =~ éƒ##Žööÿù$)¸žBi¼yóJ{ûÊ+HD"$ìíš›•==ÊžžÉ®®ÛÕÕ r9ð`pP•áLJŠrvt¼Û×§ºò¾Z” nKTÔ½þ~•¢™gN._G§Óù\niv6tÙ¬L&•ɸoÝJŠˆNMMOë4v]Ñǧƒééß¿Åâ ÷úû÷:u¢¦fÿöí,’qèÐ/Ož<ÌápÃÂÊL&OŠÅy'On‰ŠR‰  óøñ‡÷ …Q©'jjÔCÒׯg?λ}{\$j»sgOyùBQÔøxFQÑ•öváØXkw÷îÒR­5à­­ÅÉôÌÌBy$R©T&Ãb0R™,ïäIÀÔÌ (5õ|K‹p||trF/12Òi캢OÖVVÿª­W(b Ÿ¤¤«—ŠŠÂýü ^Nv6ÁÞþý„„àÔÔ5>>ÙÉÉ å1Âb£ƒ‚žŽŽF©DVJÊŸ¼7mòMJ"‰…tºzȧÑѬ””L6{yhèÁÊÊC™™VææZ£>ŽÞ½mÛ®âb×ððÝ¥¥ÕùùZkpÂã­ÌÍÇþ{o×̳ÌÒò`zz|VÖ;}äJ$&P(kÒÒŒq¸3{öä–•9‡†–74\`³Mp8Æ®+(õ¿¡§ƒ˜  ×v¿¼¥³“ˆÇ{¼õtz¹½=»¸¸÷Ò%ÃVõjiàñb @}}}LL $ÂlOÐ×—ÈbýðÓOR™ìÛû÷Y%%×®5tQ‹>û„¹yóÌìlö|bb9ðIXØg6º¨Åf>aÐèýÛ·CÏ,(`¶îýaA|‚ˆOðñ hyŽà ±ï» ,ª]Á߀¼ûÚ‚¼ ?PÈ4‚È|‚ˆOðñ ü8¦ªýˆ5ëIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_convergedr_2.png000066400000000000000000000036411454104675500247440ustar00rootroot00000000000000‰PNG  IHDR$;/.ÔbKGDÿÿÿ ½§“VIDAThíš{PSWÇOÞ(¯Ð@vÒv¥”e«]`xŒ `ËKŠŠ‚–ÁI5A6¾ƒD¢ Ô`±Š¨4V(°Ä©Ý£Ò–—uÀGF^ „BšýãîfÒ&¬&ãïô~æþqî÷Üß/¿“oιwN.J©T„×´¡ @x)ŸàâLPªaèZ~C}}½Êd>Á¬¦ä„Ç“=<¿ˆ¡/üNÔâÙãþðáE) A <ŸÁøˆ¬{ðñ  >Á=}ŽmÌÉq ³ðö^•pñæÍW[Ö+gpxåé @yzª³>ðON¾?0`èê^Œ–çˆ295õ·¸¸0?¿:6ÛÂÌìzWW"‹ejlLñõ}åõý?às¹ÎŽŽ€©™™üŠŠ8&óAS“¡‹zúø´§¼ÜÕªŠÜ\èt…³ó³ÑÑcÕÕpñÉnÙ2¼ ocSH§ÛŽNNÚ.]jèºþú¬{ _}•™ ®ä¥¦žÝ»j‹¦§7çæÚCBEE²¹9ÊÓ³éë¯ß‹_êë»ÿôiÀ::}ç±cPÈœ\níçw½« 0¯P°8bHˆµŸµ `N.‡–¬¶;w–S(ÿìé©ljrÿøcKŸÀ””«Ðj¦¥T*9uunëÖYx{“7nì¾{WëXŒ°Ø%FF¦¦Ð©fÀ¥[· Å-Y²Pž)‰$ŽÉü»»ûÀÕ«™™lö„X,‘Jã˜Lj|ü/×®ålݺ%/ofvöåÇ®ëwôðI¡PP(”ÖÞy…¢îÆâ¬,gGGwi_Zšê·–gen¾)"0!¯õ÷‰¾ëíÔÞ¸‘‰A£U—/svírÂãÝI$6Æãó¡ðB-68øôÅ‹…4Z0™lceµÚËk_ZÔ«UV__H£E:ØÚR|} 22TEþ56ÖœL6'“ ~Èmn>@¥ªº4óãp÷Odeìì »Ú¸H¤øõW4-ŸŸ·03Û9ÑÙi‚ýüØuýÎ÷§e––oØÚö ©ï-}×Û›–Ÿß~æÌ„X<¯P¸:9A:‰H ¡6Á΀Å` S.2  ‘Çssqiþæ›.\€ôágÏV¯Ve^ja5 <8<ìN"©zÝ\\Šš“Ë=ß~[¥x¼ù¦ª=ÐÜìJ$¤2ÙŽ£GcŒ®Ï?_(ûèéSjAÁ´TúŽ«+¤[š™uUU×Ôì-/_éæ–œì¿r¥plì%Ç®úÜŸ"Žr¹êÊù–ùü¼©±1ÞÆ‹Á =~ éƒ##Žööÿù$)¸žBi¼yóJ{ûÊ+HD"$ìíš›•==ÊžžÉ®®ÛÕÕ r9ð`pP•áLJŠrvt¼Û×§ºò¾Z” nKTÔ½þ~•¢™gN._G§Óù\niv6tÙ¬L&•ɸoÝJŠˆNMMOë4v]Ñǧƒééß¿Åâ ÷úû÷:u¢¦fÿöí,’qèÐ/Ož<ÌápÃÂÊL&OŠÅy'On‰ŠR‰  óøñ‡÷ …Q©'jjÔCÒׯg?λ}{\$j»sgOyùBQÔøxFQÑ•öváØXkw÷îÒR­5à­­ÅÉôÌÌBy$R©T&Ãb0R™,ïäIÀÔÌ (5õ|K‹p||trF/12Òi캢OÖVVÿª­W(b Ÿ¤¤«—ŠŠÂýü ^Nv6ÁÞþý„„àÔÔ5>>ÙÉÉ å1Âb£ƒ‚žŽŽF©DVJÊŸ¼7mòMJ"‰…tºzȧÑѬ””L6{yhèÁÊÊC™™VææZ£>ŽÞ½mÛ®âb×ððÝ¥¥ÕùùZkpÂã­ÌÍÇþ{o×̳ÌÒò`zz|VÖ;}äJ$&P(kÒÒŒq¸3{öä–•9‡†–74\`³Mp8Æ®+(õ¿¡§ƒ˜  ×v¿¼¥³“ˆÇ{¼õtz¹½=»¸¸÷Ò%ÃVõjiàñb @}}}LL $ÂlOÐ×—ÈbýðÓOR™ìÛû÷Y%%×®5tQ‹>û„¹yóÌìlö|bb9ðIXØg6º¨Åf>aÐèýÛ·CÏ,(`¶îýaA|‚ˆOðñ hyŽà ±ï» ,ª]Á߀¼ûÚ‚¼ ?PÈ4‚È|‚ˆOðñ ü8¦ªýˆ5ëIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_convergedr_3.png000066400000000000000000000036411454104675500247450ustar00rootroot00000000000000‰PNG  IHDR$;/.ÔbKGDÿÿÿ ½§“VIDAThíš{PSWÇOÞ(¯Ð@vÒv¥”e«]`xŒ `ËKŠŠ‚–ÁI5A6¾ƒD¢ Ô`±Š¨4V(°Ä©Ý£Ò–—uÀGF^ „BšýãîfÒ&¬&ãïô~æþqî÷Üß/¿“oιwN.J©T„×´¡ @x)ŸàâLPªaèZ~C}}½Êd>Á¬¦ä„Ç“=<¿ˆ¡/üNÔâÙãþðáE) A <ŸÁøˆ¬{ðñ  >Á=}ŽmÌÉq ³ðö^•pñæÍW[Ö+gpxåé @yzª³>ðON¾?0`èê^Œ–çˆ295õ·¸¸0?¿:6ÛÂÌìzWW"‹ejlLñõ}åõý?às¹ÎŽŽ€©™™üŠŠ8&óAS“¡‹zúø´§¼ÜÕªŠÜ\èt…³ó³ÑÑcÕÕpñÉnÙ2¼ ocSH§ÛŽNNÚ.]jèºþú¬{ _}•™ ®ä¥¦žÝ»j‹¦§7çæÚCBEE²¹9ÊÓ³éë¯ß‹_êë»ÿôiÀ::}ç±cPÈœ\níçw½« 0¯P°8bHˆµŸµ `N.‡–¬¶;w–S(ÿìé©ljrÿøcKŸÀ””«Ðj¦¥T*9uunëÖYx{“7nì¾{WëXŒ°Ø%FF¦¦Ð©fÀ¥[· Å-Y²Pž)‰$ŽÉü»»ûÀÕ«™™lö„X,‘Jã˜Lj|ü/×®ålݺ%/ofvöåÇ®ëwôðI¡PP(”ÖÞy…¢îÆâ¬,gGGwi_Zšê·–gen¾)"0!¯õ÷‰¾ëíÔÞ¸‘‰A£U—/svírÂãÝI$6Æãó¡ðB-68øôÅ‹…4Z0™lceµÚËk_ZÔ«UV__H£E:ØÚR|} 22TEþ56ÖœL6'“ ~Èmn>@¥ªº4óãp÷Odeìì »Ú¸H¤øõW4-ŸŸ·03Û9ÑÙi‚ýüØuýÎ÷§e––oØÚö ©ï-}×Û›–Ÿß~æÌ„X<¯P¸:9A:‰H ¡6Á΀Å` S.2  ‘Çssqiþæ›.\€ôágÏV¯Ve^ja5 <8<ìN"©zÝ\\Šš“Ë=ß~[¥x¼ù¦ª=ÐÜìJ$¤2ÙŽ£GcŒ®Ï?_(ûèéSjAÁ´TúŽ«+¤[š™uUU×Ôì-/_éæ–œì¿r¥plì%Ç®úÜŸ"Žr¹êÊù–ùü¼©±1ÞÆ‹Á =~ éƒ##Žööÿù$)¸žBi¼yóJ{ûÊ+HD"$ìíš›•==ÊžžÉ®®ÛÕÕ r9ð`pP•áLJŠrvt¼Û×§ºò¾Z” nKTÔ½þ~•¢™gN._G§Óù\niv6tÙ¬L&•ɸoÝJŠˆNMMOë4v]Ñǧƒééß¿Åâ ÷úû÷:u¢¦fÿöí,’qèÐ/Ož<ÌápÃÂÊL&OŠÅy'On‰ŠR‰  óøñ‡÷ …Q©'jjÔCÒׯg?λ}{\$j»sgOyùBQÔøxFQÑ•öváØXkw÷îÒR­5à­­ÅÉôÌÌBy$R©T&Ãb0R™,ïäIÀÔÌ (5õ|K‹p||trF/12Òi캢OÖVVÿª­W(b Ÿ¤¤«—ŠŠÂýü ^Nv6ÁÞþý„„àÔÔ5>>ÙÉÉ å1Âb£ƒ‚žŽŽF©DVJÊŸ¼7mòMJ"‰…tºzȧÑѬ””L6{yhèÁÊÊC™™VææZ£>ŽÞ½mÛ®âb×ððÝ¥¥ÕùùZkpÂã­ÌÍÇþ{o×̳ÌÒò`zz|VÖ;}äJ$&P(kÒÒŒq¸3{öä–•9‡†–74\`³Mp8Æ®+(õ¿¡§ƒ˜  ×v¿¼¥³“ˆÇ{¼õtz¹½=»¸¸÷Ò%ÃVõjiàñb @}}}LL $ÂlOÐ×—ÈbýðÓOR™ìÛû÷Y%%×®5tQ‹>û„¹yóÌìlö|bb9ðIXØg6º¨Åf>aÐèýÛ·CÏ,(`¶îýaA|‚ˆOðñ hyŽà ±ï» ,ª]Á߀¼ûÚ‚¼ ?PÈ4‚È|‚ˆOðñ ü8¦ªýˆ5ëIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_convergedr_4.png000066400000000000000000000036411454104675500247460ustar00rootroot00000000000000‰PNG  IHDR$;/.ÔbKGDÿÿÿ ½§“VIDAThíš{PSWÇOÞ(¯Ð@vÒv¥”e«]`xŒ `ËKŠŠ‚–ÁI5A6¾ƒD¢ Ô`±Š¨4V(°Ä©Ý£Ò–—uÀGF^ „BšýãîfÒ&¬&ãïô~æþqî÷Üß/¿“oιwN.J©T„×´¡ @x)ŸàâLPªaèZ~C}}½Êd>Á¬¦ä„Ç“=<¿ˆ¡/üNÔâÙãþðáE) A <ŸÁøˆ¬{ðñ  >Á=}ŽmÌÉq ³ðö^•pñæÍW[Ö+gpxåé @yzª³>ðON¾?0`èê^Œ–çˆ295õ·¸¸0?¿:6ÛÂÌìzWW"‹ejlLñõ}åõý?às¹ÎŽŽ€©™™üŠŠ8&óAS“¡‹zúø´§¼ÜÕªŠÜ\èt…³ó³ÑÑcÕÕpñÉnÙ2¼ ocSH§ÛŽNNÚ.]jèºþú¬{ _}•™ ®ä¥¦žÝ»j‹¦§7çæÚCBEE²¹9ÊÓ³éë¯ß‹_êë»ÿôiÀ::}ç±cPÈœ\níçw½« 0¯P°8bHˆµŸµ `N.‡–¬¶;w–S(ÿìé©ljrÿøcKŸÀ””«Ðj¦¥T*9uunëÖYx{“7nì¾{WëXŒ°Ø%FF¦¦Ð©fÀ¥[· Å-Y²Pž)‰$ŽÉü»»ûÀÕ«™™lö„X,‘Jã˜Lj|ü/×®ålݺ%/ofvöåÇ®ëwôðI¡PP(”ÖÞy…¢îÆâ¬,gGGwi_Zšê·–gen¾)"0!¯õ÷‰¾ëíÔÞ¸‘‰A£U—/svírÂãÝI$6Æãó¡ðB-68øôÅ‹…4Z0™lceµÚËk_ZÔ«UV__H£E:ØÚR|} 22TEþ56ÖœL6'“ ~Èmn>@¥ªº4óãp÷Odeìì »Ú¸H¤øõW4-ŸŸ·03Û9ÑÙi‚ýüØuýÎ÷§e––oØÚö ©ï-}×Û›–Ÿß~æÌ„X<¯P¸:9A:‰H ¡6Á΀Å` S.2  ‘Çssqiþæ›.\€ôágÏV¯Ve^ja5 <8<ìN"©zÝ\\Šš“Ë=ß~[¥x¼ù¦ª=ÐÜìJ$¤2ÙŽ£GcŒ®Ï?_(ûèéSjAÁ´TúŽ«+¤[š™uUU×Ôì-/_éæ–œì¿r¥plì%Ç®úÜŸ"Žr¹êÊù–ùü¼©±1ÞÆ‹Á =~ éƒ##Žööÿù$)¸žBi¼yóJ{ûÊ+HD"$ìíš›•==ÊžžÉ®®ÛÕÕ r9ð`pP•áLJŠrvt¼Û×§ºò¾Z” nKTÔ½þ~•¢™gN._G§Óù\niv6tÙ¬L&•ɸoÝJŠˆNMMOë4v]Ñǧƒééß¿Åâ ÷úû÷:u¢¦fÿöí,’qèÐ/Ož<ÌápÃÂÊL&OŠÅy'On‰ŠR‰  óøñ‡÷ …Q©'jjÔCÒׯg?λ}{\$j»sgOyùBQÔøxFQÑ•öváØXkw÷îÒR­5à­­ÅÉôÌÌBy$R©T&Ãb0R™,ïäIÀÔÌ (5õ|K‹p||trF/12Òi캢OÖVVÿª­W(b Ÿ¤¤«—ŠŠÂýü ^Nv6ÁÞþý„„àÔÔ5>>ÙÉÉ å1Âb£ƒ‚žŽŽF©DVJÊŸ¼7mòMJ"‰…tºzȧÑѬ””L6{yhèÁÊÊC™™VææZ£>ŽÞ½mÛ®âb×ððÝ¥¥ÕùùZkpÂã­ÌÍÇþ{o×̳ÌÒò`zz|VÖ;}äJ$&P(kÒÒŒq¸3{öä–•9‡†–74\`³Mp8Æ®+(õ¿¡§ƒ˜  ×v¿¼¥³“ˆÇ{¼õtz¹½=»¸¸÷Ò%ÃVõjiàñb @}}}LL $ÂlOÐ×—ÈbýðÓOR™ìÛû÷Y%%×®5tQ‹>û„¹yóÌìlö|bb9ðIXØg6º¨Åf>aÐèýÛ·CÏ,(`¶îýaA|‚ˆOðñ hyŽà ±ï» ,ª]Á߀¼ûÚ‚¼ ?PÈ4‚È|‚ˆOðñ ü8¦ªýˆ5ëIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_convergedr_5.png000066400000000000000000000036411454104675500247470ustar00rootroot00000000000000‰PNG  IHDR$;/.ÔbKGDÿÿÿ ½§“VIDAThíš{PSWÇOÞ(¯Ð@vÒv¥”e«]`xŒ `ËKŠŠ‚–ÁI5A6¾ƒD¢ Ô`±Š¨4V(°Ä©Ý£Ò–—uÀGF^ „BšýãîfÒ&¬&ãïô~æþqî÷Üß/¿“oιwN.J©T„×´¡ @x)ŸàâLPªaèZ~C}}½Êd>Á¬¦ä„Ç“=<¿ˆ¡/üNÔâÙãþðáE) A <ŸÁøˆ¬{ðñ  >Á=}ŽmÌÉq ³ðö^•pñæÍW[Ö+gpxåé @yzª³>ðON¾?0`èê^Œ–çˆ295õ·¸¸0?¿:6ÛÂÌìzWW"‹ejlLñõ}åõý?às¹ÎŽŽ€©™™üŠŠ8&óAS“¡‹zúø´§¼ÜÕªŠÜ\èt…³ó³ÑÑcÕÕpñÉnÙ2¼ ocSH§ÛŽNNÚ.]jèºþú¬{ _}•™ ®ä¥¦žÝ»j‹¦§7çæÚCBEE²¹9ÊÓ³éë¯ß‹_êë»ÿôiÀ::}ç±cPÈœ\níçw½« 0¯P°8bHˆµŸµ `N.‡–¬¶;w–S(ÿìé©ljrÿøcKŸÀ””«Ðj¦¥T*9uunëÖYx{“7nì¾{WëXŒ°Ø%FF¦¦Ð©fÀ¥[· Å-Y²Pž)‰$ŽÉü»»ûÀÕ«™™lö„X,‘Jã˜Lj|ü/×®ålݺ%/ofvöåÇ®ëwôðI¡PP(”ÖÞy…¢îÆâ¬,gGGwi_Zšê·–gen¾)"0!¯õ÷‰¾ëíÔÞ¸‘‰A£U—/svírÂãÝI$6Æãó¡ðB-68øôÅ‹…4Z0™lceµÚËk_ZÔ«UV__H£E:ØÚR|} 22TEþ56ÖœL6'“ ~Èmn>@¥ªº4óãp÷Odeìì »Ú¸H¤øõW4-ŸŸ·03Û9ÑÙi‚ýüØuýÎ÷§e––oØÚö ©ï-}×Û›–Ÿß~æÌ„X<¯P¸:9A:‰H ¡6Á΀Å` S.2  ‘Çssqiþæ›.\€ôágÏV¯Ve^ja5 <8<ìN"©zÝ\\Šš“Ë=ß~[¥x¼ù¦ª=ÐÜìJ$¤2ÙŽ£GcŒ®Ï?_(ûèéSjAÁ´TúŽ«+¤[š™uUU×Ôì-/_éæ–œì¿r¥plì%Ç®úÜŸ"Žr¹êÊù–ùü¼©±1ÞÆ‹Á =~ éƒ##Žööÿù$)¸žBi¼yóJ{ûÊ+HD"$ìíš›•==ÊžžÉ®®ÛÕÕ r9ð`pP•áLJŠrvt¼Û×§ºò¾Z” nKTÔ½þ~•¢™gN._G§Óù\niv6tÙ¬L&•ɸoÝJŠˆNMMOë4v]Ñǧƒééß¿Åâ ÷úû÷:u¢¦fÿöí,’qèÐ/Ož<ÌápÃÂÊL&OŠÅy'On‰ŠR‰  óøñ‡÷ …Q©'jjÔCÒׯg?λ}{\$j»sgOyùBQÔøxFQÑ•öváØXkw÷îÒR­5à­­ÅÉôÌÌBy$R©T&Ãb0R™,ïäIÀÔÌ (5õ|K‹p||trF/12Òi캢OÖVVÿª­W(b Ÿ¤¤«—ŠŠÂýü ^Nv6ÁÞþý„„àÔÔ5>>ÙÉÉ å1Âb£ƒ‚žŽŽF©DVJÊŸ¼7mòMJ"‰…tºzȧÑѬ””L6{yhèÁÊÊC™™VææZ£>ŽÞ½mÛ®âb×ððÝ¥¥ÕùùZkpÂã­ÌÍÇþ{o×̳ÌÒò`zz|VÖ;}äJ$&P(kÒÒŒq¸3{öä–•9‡†–74\`³Mp8Æ®+(õ¿¡§ƒ˜  ×v¿¼¥³“ˆÇ{¼õtz¹½=»¸¸÷Ò%ÃVõjiàñb @}}}LL $ÂlOÐ×—ÈbýðÓOR™ìÛû÷Y%%×®5tQ‹>û„¹yóÌìlö|bb9ðIXØg6º¨Åf>aÐèýÛ·CÏ,(`¶îýaA|‚ˆOðñ hyŽà ±ï» ,ª]Á߀¼ûÚ‚¼ ?PÈ4‚È|‚ˆOðñ ü8¦ªýˆ5ëIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_ds.png000066400000000000000000000057501454104675500227760ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ IDATxœíÝmLTWð?Zê-ƒ¼8² ÄaëK¬Eiµ‰Ie´+±4FSµ fq¤„”â6•²i£-¥Æ‚u@‹ÚclZË&¥¤"¨‰3 "RÚ% Ã0ufžýàr—yC„ÑñèóKnÂܹœyÎ9ÿ¹¯ÌÅ‹ˆŒ d’§ `ìaqh™p8´L8ÏÙïèèèÀÅ‹=Q c”J%.\h»“ìhµZÀoOÄ–––fQr8Óã‹ ÌÓÔjµÓý¼¦eÂáÐ2áph™p8´L8Ú1òòò²Ù±fÍܺuËå1#7Ðjµ£ÓÔÔƒÁ€œœDEEA&“!&&~ø!†††Æ]ûàà öìÙƒ„„L:óçÏGaa!,  µµUªÑUß[[[Çýúîæ±ÐÞ¸q …­m¶µµA.—?²®­­EWW~ýõW\¸pf³éééN±ß`Íš5ÒãÚÚZ°9&..YYYhhhÀ‰'ÐÞÞŽC‡áôéÓÐh4ãªy``IIIhhh@QQ‘››‹ŠŠ ¤¤¤Àjµ>°’’’ Í•ÛçÚÕuÚGM¯×»õuL&Í›7^¯w[»Ãœµ{çÎ@wïÞuyŒ+®úHõõõ6ûjjj(""b\uk4Zºt)Y,›ýƒ"##éàÁƒnŸ {ãm?--ÍéuÚ Ÿi‡´œ9sqqqFff&L&Àl6#//J¥/¼ð233ñÇ 99*µuòäIÄÇÇÃÏÏ3gÎDyy9Àb±   FFFúúúlêÈÉÉÁ¼yóÆ\ÛŽ;°yóféXƒÁ\ºtiÌ}ŸÝ]Ã1.V«6l@KK‹Íþ””Ü»wF gÒÓÓñÑG9\%DQQÖ®]+í³§ˆˆ‡ö\ÍçÃÖ5!ö)ï™vùòå¤×ë©¡¡bbb(??Ÿˆˆ>øàzóÍ7©­­®\¹B‹-¢íÛ·Kß×ßßODDF£‘|}}髯¾¢ÎÎN*..&___¤‚‚R©TÔÜÜLW®\¡Å‹Ó–-[œÖ'ËWµY,š6m…„„ÐáÇmÚ9xð õõõ9m×T[[K]]]›«q³—‘‘A±±±töìYÒéttâÄ Z°`egg=p,ìë¾{÷.ÅÆÆÒ+¯¼BçÎ#NGÕÕÕGo¼ñ†M-+W®´§?þØ¡ï®æs´ºìçz¬ùò ¬¬Œ"##I¡PPVV–ô£fhhˆvíÚE!!!H400@f³™.\HR[I>>>G§N"¢û—³4 …‡‡“\.§ 6POOÓzœ…ÖUmDDÛ¶m#™L&]¶rÖŽ³Ç®^ÛÕæjÜì™ÍfÊÏϧøøxòóó£™3gR^^™L¦1…³: eggS||<ùûûÓìÙ³iß¾}d4mj©ªª¢Y³f‘B¡ ;wJ¯9²MWó9Z]Îæz,yhŸDc©-//ÒÓÓSEbËöQpZ—¿Oû´3™LèììDYYŽ=êéržX—/_x{{{¸’ÿ›ð?ĦNŠ­[·º£·­¶úúz$%%aÓ¦MX¶lÙã-LW¯^EJJ ¶lÙ¥Réér$^ÿ;ýK*++±~ýzþäó¸áO.TUUÙìçßòbÂáÐ2áph™p8´L8Z&—×iGûøcKZZšÃ>‡K^|[$÷X¿~=víÚåxKöPœÝÉ!´Ì=¼¼¼ Õj±nÝ:O—òÔá5-‡– ‡C˄áeÂáÐ2áph™p8´L8Z&-‡– ‡C˄áeÂáÐ2áph™p8´L8Z&-‡– ‡C˄áeÂáÐ2áph™p8´L8Z&-Î3û7†uttHÜÝêêêÜ~O4¥R)ý­ÙgÕ3[¤ªª*¡n]¤V«QYYéé2<Š—L8Ïüò`¤¿m܈ä9s<]†Së4O—ðÄàÐŽ¯¨@â[o¡ùøqü) õÉ'¸ÙÙ‰Ÿ}eH®µµaGQþÓׇâ÷ß÷pÄÄ˃ PbÚ‹/"L¡À²¤$Tïߨðpì//—Ž9ùÃødçNü%6Ar9–$&⋜|ûã¬\lZ7ÛªVãLMôXþüó(=~½ýýÒ¾%‰‰¸yö¬'Ê{*phÝ,zÆ ´vtH¢ñêU„¯XÕ™™ø¼¢w~ÿ݃ŠCëfö¿È‘}‘«VA{îœGê{phÝLßÞŽ™Ó§‡† =wD„Ä—^Âû›6á­y›7C³¿‡+‡ÖÍþYU…ÕK—¬V+6俢E¯·9&%9÷ÌfO”÷TàK^ðïžÈd°X­Ð··cy9nܹƒo¿ø “aãêÕXŸ“ƒý»wcÖŒ¸|ý:þqø0ÒW­òpõââÐNÀ·ߖ¾ž‚¥sç¢ñë¯1Õß_Úhï^ü½´{€¾½aÁÁx+5ùï¾ë‰’Ÿ Úq¢K—ÆtÜäI“°wÛ6ìݶíWôìà5-‡– ‡C˄áeÂáÐ2áph™p8´L8|vþ˜¶øLË„óÌŸi•J%Ôjµ§Ë³—_~ÙÓ%xÜ3//&^0áph™pžPåé"{ÿ™^Õ¥Õ_IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_eps.png000066400000000000000000000057671454104675500231670ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ ¬IDATxœíÝmLTWð?ZFJ†Ð)Á‚J}Áú’Ö¢XmbRAv%–ÆÔ´*¨Y)KŠØF)›6ºò²JˆŠ¨õ-éÚ´jv(5AmœZDŠ]R@†©3óì—»Ì̽88y~ÉMäÌáÎsÎùÏåp…Á‹ˆŒ dœ§ `l¸8´L8Z&œçœZZZpùòeOÔ˜ Fƒùóç;6’“ŠŠ ÀOÅ‘’’âQr¹Òöã› ÌÓRSSeÛyO˄áeÂáÐ2áph™p8´CäåååpbÕªUøå—_û < ¢¢bÐ>uuu0™LÈÎÎÆÔ©S¡R©…]»v¡¯¯oĵ÷ööbçΈG@@æÎ‹‚‚Øl6@cc£T£ÒØGüüîæ±ÐþüóÏvë9›šš V«Gm‚õz=ÚÚÚð믿âÂ… °Z­HOO—íã|ÀªU«¤õz=8ô‰‰‰AVVjkkqâÄ 477ãСC8sæ t:݈jîééÁìÙ³Q[[‹ÂÂB\¹r999(//GRRìvû#ÏQ\\üXkåöµVºO;ÚŒF£[ŸÇb±Ðœ9sF··ŸÜyïÞ½KèþýûŠ}”(?00jjjÚ.]ºD#ª[§ÓÑâÅ‹Éf³9´›L&ŠŒŒ¤ƒº}-œôü)))²÷iûJÛÿ¥å«¯¾BLL BBB™™ ‹Å°Z­ÈÍÍ…F£Á /¼€ÌÌLüñÇHLL„……Iç:uêâââàçç‡iÓ¦áèÑ£›Í†üü|DDD $$èêêr¨#;;sæÌrm[¶lÁ{ï½'õ5™L˜8q"®^½:ä±?^£»¨Õj””” ³³Sj[´hnß¾ `hs1ÐÑ£G‘——‡qã—Z¥RA§ÓIs ÇŽÃôéÓ‚M›6Ál6pÜ(­ç`uÉ­õcqNñp¯´ý¯¢ääd2 TSSC3fÌ üü|""*(( ””ºsçÕ××SBBíØ±ÃåÕ×ÓÓC&L ââbjkk£ÒÒRòöö&“ÉDŸ}öÅÅÅQCCÕ××Ó¼yóH§ÓIŸ{úôiÒjµd6›®vƒÕvéÒ% "«ÕJDDååå«8NTWWG===ÔÝÝM´zõjš;w®lçCiÞœéõzÒjµ¤R©hÅŠ´ÿ~jii‘Ô\ ÔÙÙI¨½½]öñË—/Shh¨TËo¼Aƒ¾ÿþ{ŠŠŠ¢œœi\ýsª´žƒÕåî+­ÛB[__ïpŽ3fQTTµµµI?ž´Z­Ë@ºººÈ××—ŠŠŠÈd2Ñà ÛívŠŽŽ¦S§NI}oÞ¼I'Ož$"¢ææfÒh4tóæÍ‡’ ­\m6›ÂÂÂèÛo¿%"¢•+WRaa¡â8áôß‹&L %K–PSS“bŸ‡Ò¼É±ÛítåÊ*(( øøxòöö¦ãÇ :Î::: muu5ËÎSee%M:UWÿœ*­ç`u=µ¡íëë“Ú®]»F~~~DDäççç²€jµZv ?üð­[·Ž‚‚‚(99™.\¸ £¡¡Aöù,X@EEEÒ­ÿjg±XYÛæÍ›)33“ÚÛÛÉÇLJîܹ£8Î ÷8}úÉßd2ÑñãÇ]öŸùùù¤Ñhˆhð¹Fß|óìcÅÅÅ´|ùòGÎÓÀq)­ç`u=u{Ú~ƒAú÷­[·‡Ñh=| ³³ÕÕÕ.Ÿß×׳ٌÇãÞ½{x÷Ýw±lÙ2tuu!<<\ÚÓ@]]öîÝ ¨©©AVVüýýáïïÐjµÈÍÍ}dm©©©øòË/QYY‰… bÊ”)±ÛíX»v-Ú“’’ðàÁt.䤧§ã“O>q¹KÐÛÛ‹ÂÂB¬^½Zjsž§ˆˆ—ó)­çpëz,Î)é•vÉ’%d4©¶¶–¢¢¢(//ˆˆ>úè#zûí·©©©‰®_¿N , M›6IŸ×ÝÝMDDf³™|}}éÈ‘#ÔÚÚJEEEäëëK½½½”ŸŸOZ­–êëëéúõë´páBÚ°aƒl=Ù(Õf³ÙhÒ¤IJeeeç9xð uuuÉžW ÒëõÔÖÖær(Í›³ŒŒ ŠŽŽ¦sçΑÁ` 'NмyóhûöíDDœ çºïß¿OÑÑÑôúë¯Ó×_MƒNžÚ¶m…††R`` eddPOOY­Vš?>ùûûKç*//§ÈÈHòññ¡˜˜:}ú4=¼¥ÓéhòäɤV«iíÚµÔÑÑ![\h•j#"Ú¸q#©T*é¶•Üyä>Vzn¥CiÞœY­VÊËË£¸¸8òóó£iÓ¦Qnn.Y,–!Í…\&“‰¶oßNqqq4qâDŠ¥½{÷’Ùlv¨¥ªªŠ¦OŸNÁÁÁ´uëVé9žSi=«Kn­‡bÔCû4Jm¹¹¹”žžþ„*ÓP^°£A)´Š?Oû¬³X,hmmEii)Ž;æéržZ×®]x{{{¸’ÿ{ìoÄðÁ¸£·¬¶ššÌž=ëׯÇk¯½öd Ä7””„ 6@£Ñxº‰×ÿ.ÿ’ÊÊJ¤¥¥ño.0ëÿÍ…ªª*‡vþ)/&-‡– ‡C˄áeÂQ¼O;د_0ö¤¤¤¤¸´¹Üòâ·Er´´4lÛ¶Íõ-}ذȽ-’Kh™{xyy¡¢¢kÖ¬ñt)ÏÞÓ2áph™p8´L8Z&-‡– ‡C˄áeÂáÐ2áph™p8´L8Z&-‡– ‡C˄áeÂáÐ2áph™p8´L8Z&-‡– ‡C˄áeÂáÐ2ጹ¿¹ÐÒÒ"ýðÑV]]=êÑh¤¿=;VŒ¹·Eªªªz¦Þª(55•••ž.ã‰âíΘÛ ô—uë8k–§Ë‘5:§Kð˜1ÚÄY³ºt©§Ë`ÃÄÛ&-‡– gLïi‡Ã+>^ñ1ºzU¶úùç±ø•Wp ;aa“ÙŒKJPuþ<ÚÚÛ1eÒ$üùÍ7‘³~=|}|FoÏí0èFääÉCêCD¸÷ûïøëHÏÉÁ¿ÊÊYŸ~ŠÛ­­8ñùçЄ†âfS¶â÷®.}øá…øx{0 Á˜ôâ‹.‡\ŸÐ  h£¢ð]»ðï«WÑm2N}÷>ݺ/GG#H­Æ¢„ÈÎÆÙ‹=1$!qhGÙøq§Øj³x¸e(ùâ tvwK}%$àö¹s©ODÚa0™Í²‡\ŸžÞ^4µ´`sAæÆÆ"0 p¬ WnÜÀä¥K±23//ÇÝß~óÄp„Å{ÚaÐ*üÌBÿ7bÎ}&x{cáË/ãxa¡Ô–8k~¬¨À?ý„êõ(;sº}ûpdϤ%'^ñÏí0ÏžÅ4fÄ}zûúpöâE¤.]Š„™3‘0s&>\¿»‹‹¡Û·C;D¼=x‚ìv;Öæä ÁhthOJLÄ«ÕCU‰‡¯´ÃðŸŽø«T.íÎw”ø«TX·r%Ò²³±oÇLé%\»u ++CúŠî.÷™Å¡†ùï¼#Û>pOû(‡vïÆÇ%%ع?ŒÍÍ ÁŸ’“‘÷þûî*ó™Ç¡¢¡s(}ƇÝ7b÷Æî(kLâ=-‡– ‡C˄áeÂáÐ2áph™p8´L8cú>íXþ5l‘ñ•– gÌ]i5 RSS=]†Û¼ú꫞.á‰sïåÅÄÇÛ&-Îsª<]cÃñ_(»÷Ui0IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_errortype.png000066400000000000000000000022031454104675500244110ustar00rootroot00000000000000‰PNG  IHDRY$mÕçbKGDÿÿÿ ½§“8IDAThcüÿÿ?Ã(``````h "00Hà?h· XµjÜû£éX0…dÄÅ-õôèïz‚'/_¿t MKXXêé­ê“ ¬Þ½ûxi)šàhA€Ñ°@€Ñ°@,åAÀh`€)øÿ²±rçΈòrLñ «Vé«©‘m,©€œ°```8¾h‘¢´4µáïàðbï^†ûOŸZÆÅAØ ÂÔ²‚@fXˆ Š SËìììì _¾}c`` ¢É$j–w?f40Øú´‚§ç¢Í›áì£.|üò%±®NÔÁAÖݽ´¿ÿç¯_ÈŠâÈ_y)ö×ïß¹-,.ܼ Ѹõðaí  1GÇœööŸ¿~100üùû·zÊYww!;»œöö_¿“ê~2Ãâë÷ïh.Õ½paWa¡º:2;§½ýÉË—§–.Ý>uêÎcÇ:çÏÇTŒ B]]7îßÿ÷ß?†(ÉÈÀUN^¾|ãĉ[&OÞuüxǼy = Þzøðø¢E‡æÍ;~éRõ”)¤zŠÌ°Ð ã±´DFp©®‚‚077nNN8›mÅŽËË¥¥uTTš²²–lÝŠ©X°²°:{–aÙ¶m±>>p©ž¢"YY3–œœ¥Û¶100Ì߸qJE…Œ¸¸ŽŠJgAÁîãÇIõ™åÅÍ›•ee±Ji(*¢±_¾}ûçï_eˆ Š¬ì“—/1c&&¦ gçu{÷ê©©í9yrFM \JUNÂÐTT„˜öøÅ gg¸^^R=EfXà3‘™-.,ÌÂÌ|ïéSMEE†»OžH‹‰a*Æ BÝÜ¢**´””l eÄÅáâ·=ÒQQa``¸õ𡔘ƒ”˜ØÎiÓ 1ôñË—oÞêr2óÈë÷ï_¾}‹Œð(fafwwÏëèxðìÙÕ»wk¦L‰ñö&Ò"[Cÿÿþ5Íš…œAò»ºî>~|æÚµªÉ“£½¼¢<=Ë&L¸ÿôéµ{÷¼sr&-[Fª§ÈL–qqh"øÛZS*+ó»ºL£¢ØXY£¼¼*““¿xAŒEl²pÓ¦ ''dñoo׌Œ/ß¾ExxT%'300T§¤TLœhÿó×/?{û®ÂBýÄÀˆ<„ÃÈÈÈÀÀêê:¨ú©5S¦uêÎcÇ:çÏÇTŒ B]]7îßÿ÷ß?†(ÉÈÀUN^¾|ãĉ[&OÞuüxǼy = Þzøðø¢E‡æÍ;~éRõ”)¤zŠÌ°Ð ã±´DFp©®‚‚077nNN8›mÅŽËË¥¥uTTš²²–lÝŠ©X°²°:{–aÙ¶m±>>p©ž¢"YY3–œœ¥Û¶100Ì߸qJE…Œ¸¸ŽŠJgAÁîãÇIõ™åÅÍ›•ee±Ji(*¢±_¾}ûçï_eˆ Š¬ì“—/1c&&¦ gçu{÷ê©©í9yrFM \JUNÂÐTT„˜öøÅ gg¸^^R=EfXà3‘™-.,ÌÂÌ|ïéSMEE†»OžH‹‰a*Æ BÝÜ¢**´””l eÄÅáâ·=ÒQQa``¸õ𡔘ƒ”˜ØÎiÓ 1ôñË—oÞêr2óÈë÷ï_¾}‹Œð(fafwwÏëèxðìÙÕ»wk¦L‰ñö&Ò"[Cÿÿþ5Íš…œAò»ºî>~|æÚµªÉ“£½¼¢<=Ë&L¸ÿôéµ{÷¼sr&-[Fª§ÈL–qqh"øÛZS*+ó»ºL£¢ØXY£¼¼*““¿xAŒEl²pÓ¦ ''dñoo׌Œ/ß¾ExxT%'300T§¤TLœhÿó×/?{û®ÂBýÄÀˆ<„ÃÈÈÈÀÀêê:¨ú©5S¦uêÎcÇ:çÏÇTŒ B]]7îßÿ÷ß?†(ÉÈÀUN^¾|ãĉ[&OÞuüxǼy = Þzøðø¢E‡æÍ;~éRõ”)¤zŠÌ°Ð ã±´DFp©®‚‚077nNN8›mÅŽËË¥¥uTTš²²–lÝŠ©X°²°:{–aÙ¶m±>>p©ž¢"YY3–œœ¥Û¶100Ì߸qJE…Œ¸¸ŽŠJgAÁîãÇIõ™åÅÍ›•ee±Ji(*¢±_¾}ûçï_eˆ Š¬ì“—/1c&&¦ gçu{÷ê©©í9yrFM \JUNÂÐTT„˜öøÅ gg¸^^R=EfXà3‘™-.,ÌÂÌ|ïéSMEE†»OžH‹‰a*Æ BÝÜ¢**´””l eÄÅáâ·=ÒQQa``¸õ𡔘ƒ”˜ØÎiÓ 1ôñË—oÞêr2óÈë÷ï_¾}‹Œð(fafwwÏëèxðìÙÕ»wk¦L‰ñö&Ò"[Cÿÿþ5Íš…œAò»ºî>~|æÚµªÉ“£½¼¢<=Ë&L¸ÿôéµ{÷¼sr&-[Fª§ÈL–qqh"øÛZS*+ó»ºL£¢ØXY£¼¼*““¿xAŒEl²pÓ¦ ''dñoo׌Œ/ß¾ExxT%'300T§¤TLœhÿó×/?{û®ÂBýÄÀˆ<„ÃÈÈÈÀÀêê:¨ú©5S¦uêÎcÇ:çÏÇTŒ B]]7îßÿ÷ß?†(ÉÈÀUN^¾|ãĉ[&OÞuüxǼy = Þzøðø¢E‡æÍ;~éRõ”)¤zŠÌ°Ð ã±´DFp©®‚‚077nNN8›mÅŽËË¥¥uTTš²²–lÝŠ©X°²°:{–aÙ¶m±>>p©ž¢"YY3–œœ¥Û¶100Ì߸qJE…Œ¸¸ŽŠJgAÁîãÇIõ™åÅÍ›•ee±Ji(*¢±_¾}ûçï_eˆ Š¬ì“—/1c&&¦ gçu{÷ê©©í9yrFM \JUNÂÐTT„˜öøÅ gg¸^^R=EfXà3‘™-.,ÌÂÌ|ïéSMEE†»OžH‹‰a*Æ BÝÜ¢**´””l eÄÅáâ·=ÒQQa``¸õ𡔘ƒ”˜ØÎiÓ 1ôñË—oÞêr2óÈë÷ï_¾}‹Œð(fafwwÏëèxðìÙÕ»wk¦L‰ñö&Ò"[Cÿÿþ5Íš…œAò»ºî>~|æÚµªÉ“£½¼¢<=Ë&L¸ÿôéµ{÷¼sr&-[Fª§ÈL–qqh"øÛZS*+ó»ºL£¢ØXY£¼¼*““¿xAŒEl²pÓ¦ ''dñoo׌Œ/ß¾ExxT%'300T§¤TLœhÿó×/?{û®ÂBýÄÀˆ<„ÃÈÈÈÀÀêê:¨ú©5S¦ðþqÏó|¿ï÷><ÏÃËû¼&MÓ4$ÿ…sq/»‚ÿR–R–Ú4y¦(Êt5~9³°èud¤¦Rd·/d-‹‚sÝݺ}º²Šìvü^ï¼´˜1åçëöÉe(€”%€”%€îž%Âlë\ Œ¸Å¢ÀY}mmØÒÓ…ã~{øU;v0ÔÛkT)ó–×0Yo$%‘šœ,‰DøsdĨ2æ5ï‚ìYß÷ö’Q\ÌÈØ/òÖ¦M„?¦°¼€4‡€_ïßÇ”ŸÏ7n°´¤„Ÿ:{z°+ Ö‚²œNš::ø;ásŸ,§“”õëÙ}ø0£ãã1yÀ0Yª:ãðþºu8 py½ü1<Ìg´××cçú™3 \¾ü¯|ÞÓ§ip¹ÈÎÈ ìÐ!Vååq÷Â<ÕÕ|zâ¡Gøª½ï®\á‡æfzZZø%ä‹–ݼ/‚aËpEiéŒíO7ø¯Ýn–oÝJqE+ ïäæÎ𝡦†¼œ¦ž<áöùód.Y‚5>>º/ŽÒÚÙÉ—ÕÕäfgðí±cü õ—b0LÖÝ®.²33uû_OHà£-[8êóÑ}êÔœù–Ùl¼f±po`€ýãªp¯¿Ÿœgî¹Ìf‹ÆÍ öœõ`poΞÅQXÈÆÆ9Ç[Ìfþššâ—‹š;ékk£¹¶6:æÍ”‚ýýÑß7ïÜ¡¾µÕøâŸÖdT¢¡Pˆ«5¦=59MÓØ{äUÛ¶ñIY¹›7Óuõ*ï­]7Ï?¡ª¨““XÌfÔÉIŽú|Œ…ÔoÜH]SYiiÄÅűßãáíi3K/ïó`˜¬¢]»fl×Núý …B¸÷ìÁb6s²®ŽŠãÇY³r%KÓÓ)²ÛIs8»v-&>)1‘úª*>t»IJL¤vß>¶—”ବä÷K—˜PUœ••L¨*ï®^MƒË0gÞçÁ4ýÀÂd2 lØðJ¿uP¿ßÿl—<°AÊ@Ê@Ê@Ê@Ê@Ê@÷¡´ïÖ-J\ÈZ=º² Îz†ö*"—¡13K~®¥œYHYHYü±g—„hãÃTIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_extraction.png000066400000000000000000000022071454104675500245420ustar00rootroot00000000000000‰PNG  IHDR\$‹üÊ£bKGDÿÿÿ ½§“5‹Ž~}ày¡™ ÀÇW‘”D¶QD2ETPP\X˜•ÿþý{óáy¶`š ÌÏßž—G‰iÄj–)›qsûðù3ÃòíÛÕýý¿ýøaËÀÀ éâÂÀÀp÷ñcFƒý§O+xz½paý¾}z¡¡\ææò“—/g``øûï_ÃŒòbŽŽñµµ¿|a``À4bÝÇ/_ëêDdÝÝKûûþúÅÀÀÀh`°nï^£ˆ›æY³Èó™òõûw4ÄÀÀàçààbn^ØÝýêÝ»¢ÞÞ%mm\'/f``x¾g\o÷Â…]……Ê22áeef::w¶liÏÏÏëì|ÿéÓ„%KÖíÝ»mêÔ}³gß|ð uölL §½ýÉË—§–.Ý>uêÎcÇ:çχˆ¯Ü¹sÿœ9½ÅÅuÓ¦½ûø‘ ß‘™}ôÃÂÐD …ßÄòrÝ·ŒŒÌÐPSmm¬z» tTT~ÿùsyÍY .HñôîãÇ9ë×wäçk++300,hjºñà.üùûwÅŽW¯†èmÊÊ*ëï¯KOg``È ççá‰÷óKil|ÿé“??©¾#3PîlÞ¬,+‹)ÎÏÓÜ8cÆî™3qéÕPTd```eayøüyN{û—ïß!¡ÀÀÀððÙ3˜±ŠŠ•XÁË·oÿüý«,#áªÈÊÂ[ëR¢¢ ,ÌÌäxŒêí”'/_NY±ÂÅ¢¸·—ˆsýþXXXs|Ñ¢©••))1±ÏžAØoÝj›3—!âÂÂ,ÌÌ÷ž>…pï>y"-&a3QÜ×'3P^¿ÿòí[dÄÀÀðÿÿÿ¤úúÜÈÈå{OžÜ|ð \ý—oßÐLøúýû÷Ÿ?Y˜™¿ÿüY?}:Ãçoßb½½«'O¾rçε{÷rÚÛá„i 3s¸»{^GǃgϮ޽[3eJŒ·7y~Ádf˸84‘ÿ.L[µêõû÷剉,ÌÌÓª«3ZZlŒ¤¥-õô$]\>;†¬^¯-77¢¼\¯299ÊÓÓ#+ëÑŽ_¿÷ÈÊúúý»—MWa!.¦TVæwu™FE±±²FyyU&'“çLÀˆ<¸d uu½äÑA&`4P°€Ñ@ÁF  ,`4P°€Ñ@Á°´SFæJ8`ÊÈ£7€qt} &M)XÀh `£‚c¨¿Ú¼×—IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_fn.png000066400000000000000000000053461454104675500227740ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ ›IDATxœíÝ}LTWð- H ´‚€°$C„Zµ±J¡©mL”FÚÐtë®U¨níÔXRJc Këf›Mqc‰«bkѺM£5Æø¥&"X“ÐV¬¥‰‰  ô3<û‡å.óq„áÐ÷—ÜDyÏ9Ï\ޏ$„PÈ ă’Ð åHh…rrÝqóæM466ú£!Ü ¬\¹Òy']ÔÕÕ€l²Íˆ-''Ç5¢t»ÒŽ› Âßrss=î—5­PŽ„V(GB+”#¡ʑЎS@@€ÓŽ7âÇÔ=gôuuu^ÏikkƒÅbÁž={°téR„„„ 11ï¾û.†††&\ûàà Þzë-¤¦¦báÂ…HOOGEE ««K«Q¯ï]]]~}_ó[h¿ÿþ{DDDø´Íîîn„……MÙ755¡··?ÿü3.^¼»ÝŽ‚‚ç¸n°qãFí㦦&p:'99ÅÅÅhmmÅÉ“'qãÆ |òÉ'øüóÏa2™&TóÀÀÒÒÒÐÚÚŠÊÊJ\¾|{÷îEmm-2331<<Ÿ Wm?''Çã}ÚI_iG¾´|ñÅHNNFdd$ŠŠŠ`³Ùv»%%%0 xøá‡QTT„_ý?þ8 ::ZkëÔ©SHIIApp0âããqôèQ€Ãá@YYbcc‰ÂÂBô÷÷;Õ±gϬX±bܵ½þúëxõÕWµs- ,X€+W®Œ»ïsçÎÕúè+aaa8pàúúú´}kÖ¬Á?ü`|c1ÚÑ£GQZZŠ9sœ§:$$&“Ic8vì‰íÛ·Ãjµp^èͧ·º<Íõ¤¸¦øA¯´#ï¢ììlšÍf¶´´pÙ²e,++#IVTT0''‡===looçc=Æ7ß|ÓíÝ700Àyóæ±ººš½½½¬©©a`` - ÷ïßÏ””vtt°½½4™LÚçž>}šF£‘V«Õéjç­¶K—.qÑ¢E´Ûí$ÉÚÚZ._¾\·ŸØÖÖÆÞ»w]]]ܼy3ÓÓÓ=žãºé›«¦¦&F†„„ðÙgŸåG}Ä›7ojÇÇ‹Ñúúú€·oßöx¼±±‘QQQZ-ëׯ§Ùlæ×_ÍÄÄDîÝ»Wë×Șêͧ·º|}¥õYhÛÛÛÚX¶lI211‘½½½Ú±¯¾úŠF£Ñ­#ýýý bUU- ÉûAfRRO:¥{ýúu644$oܸAƒÁÀëׯßï‡ÐzªÍáp0::š.\ Inذ•••ºý„Ë·çÍ›ÇuëÖ±»»[÷œÑ›Þ¸y2<<ÌË—/³¢¢‚©©© äñãÇIÒëX¸ºsçŽ×Ð6773""Âã8Õ××séÒ¥Z¿FÆTo>½Õ5cC;44¤í»zõ*ƒƒƒI’ÁÁÁnæ±#ß|ó _zé%.Z´ˆÙÙÙ¼xñ¢ÖFGG‡Ç×_µj«ªª´+ÚÈÕÎf³YÛŽ;XTTÄÛ·osþüùìééÑíç艛Ì9#<õßb±ðøñãnëϲ²2 ’ÞÇ“èèhž?Þã±êêj>óÌ3cŽÓè~éͧ·ºfÜšv„ÙlÖþýÝwß!&&ƒÎÎNðþ}}}hnnvûü¡¡!X­V>|¿üò ^~ùedee¡¿¿111ÚšÚÚÚP^^hiiAqq1BCC 0())³¶ÜÜ\|öÙg¨¯¯ÇêÕ«ñè£új8&dxx[¶lAGG‡ÓþÌÌLüöÛoàu,<)((À¾}ûÜî ¢²²›7oÖö¹ŽSll¬[{zóù uMŠkŠ'z¥]·n;;;ÙÚÚÊÄÄD–––’$ßyçnÚ´‰ÝÝݼvíW­ZÅíÛ·kŸwïÞ=’¤ÕjePP9Â[·n±ªªŠAAAdYYF#ÛÛÛyíÚ5®^½š[·nõX<,ôjs8\¼x1£¢¢xèÐ!§v<Èþþ~íêÀ¦¦&öööºmzãæª°°IIIüòË/i6›yòäIfddp÷îÝ$9æX¸Ö}÷î]&%%ñ©§žâÙ³gi6›ÙÐÐÀääd>÷ÜsNµdee9Óûï¿ïÖw½ùôV—ë\×”/jjjLjˆk_j†††¸k×.FEE1<<œ……… ÝnçÊ•+ªµU[[˸¸8Ο?ŸÉÉÉ<}ú4Éû·³L&—,Y°°0nÙ²…wîÜñX§ÐêÕF’¯½öCBB´ÛVžÚñô±ÞkëmzãæÊn·³´´”))) f||ý´¿KpsâÜ9—0£Èò@(GB+”#¡Ê‘5í¤¦êã•+HME^Vê>øÀéXWOž¼reªKœµ$´“Ðtø0â–,Ñ=^î6­_üììi¬jö“ÐNBDx8?òˆîñm¹¹ØQ^޵ii^ÏFÖ´Sèo/¾ˆ¤¸8üeß>—2«Hh'ÁbµºmŽáaíøÜ9sphß>œonÆΜñc¥³‹,&ÁèáÏ-ý·ª Ö¬Ñ>N0ð÷;±³²ëÓÓ§³¼YKB; gÎ Þ`ó¼¢^@Ã… øsYþõöÛÓPÙì&˃i€š÷ÞCc[þýé§þ.GyÚiò§˜ìã üãÈ—¢< í4úkN232ü]†òdM;Ac}GKïøÙ?žŠrþPäJ+”#¡ʑРåHh…r$´B9Z¡ ­PŽÜ§uáí7ÄÌ WZ¡¹Òxâ‰'ü]‚xò,/¡YåHh…r Æ3.…øÝÿC[„ø¹„ÔIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_jdprojecti.png000066400000000000000000000024641454104675500245240ustar00rootroot00000000000000‰PNG  IHDRl$ãH›bKGDÿÿÿ ½§“éIDAThcüÿÿ?Ã(  0 ´† D*€Ñ@¤`Aæ022”;†@®KFS" ¦Œ¸¸¥žý2$ÀñK—ž¼|‰&ˆ%-õôVuwÓÅIC„•–®Þ½Mp4;SŒ"Àh RPˆw?f40€° àHÑË+¾¶ö͇p•Ȳ‚¶¶þŸ?'ÒFƒ»SîBÚj¦Ä㋽ػ÷éîÝó›š>}ùbññË4Ùç{ö˜;÷ÏŸ?Ñ••D;£¦FTHˆxgÜúTÔÁÂàã«HJ"^/y€š(*((.,,%*ê`b²¾¿_IZºÉ4Y }5µÙõõG/\øüõ+1Ʀ‡„ðqsïŒÿþÁ30?{^I¾ аLÌ ÝzèV)f&&†?ÿB²ÛþÓ§<=^¸ðñ˗ĺ:QYw÷ÒþþŸ¿~1 eç?ÿVO™"ëî.dg—ÓÞþë÷ï¿ÿþ5̘!ïá!æè_[ Iø±± ’.. ¨Ù—áëöî5Šˆ°±iž5‹<ŸÒ0Uåäî>yç~ýþýë÷ï_¾}»÷äIv{»™ŽŽ Dª{á®ÂBuõœöö'/_žZºtûÔ©;ëœ?ÙÀž… o=|x|Ñ¢Cóæ¿t©zÊ” K–¬Û»wÛÔ©ûfϾùàAëìÙ '/f``x¾gš{p¾rçÎýsæô×M›öîãG2|Š¥±M-€6N©a°±²Ú®èì„Ku訨üùûwÅŽW¯V”–f``hÊÊ*ëï¯KO‡+›¿qã¡yóÄ……eÄÅ; Jz{þþÝ‘Ÿ¯­¬ÌÀÀ° ©éƃ¸ƒÇð¬ðp~žx?¿”ÆÆ÷Ÿ> ñó“êS’qêÊ•1ÞÞü<< Á„î@rv.îí½ÿô)„ýöÃ..\*§¯^ímgGŒ™ˆ ³03߃~÷Éi11deRbbw6oþáÂÿ >9rbñb)1±ÏžAd/ÞºÕ6g.+ðÎDñØÉhgdÔ4sæÃçÏo?zT7mš«…\êõû÷/ß¾}öúõ¡³g ï?}ZK¼É,ÌÌáîîyž=»z÷nÍ”)1ÞÞÈ ¢<=Ë&L¸ÿôéµ{÷¼sr&-[ëí]=yò•;w®Ý»—ÓÞP†/ß¾‘d8%€äì<¿©)¯³Ó0<œ‰‘ÑÍÊjBi)\Ê2.“°36>»|9IM†)••ù]]¦QQl¬¬Q^^•ÉÉȲÕ))'ZÅÇÿüõËÏÞ¾«°•…åë÷ïYY_¿÷²±é*,d``P–¶ÔÓ“tqù|ìñ†S‘!ƒ²¡®®ƒj‡ÑÀOyJgÅJƒ²—nÝb```eeh‡àƒ:¯Ý»ç’žž$+.>ÐnÁhØN¤h))½Ú¿ ]A ê”8TÀh RŒ"Àh R`i'ŽN™âð)S”pà ÄQ@ Jí!G×'RFS"Àh RŒ"¢Ó§t¸½IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_lanczosreo.png000066400000000000000000000041631454104675500245440ustar00rootroot00000000000000‰PNG  IHDR¤$ˆgÎbKGDÿÿÿ ½§“(IDATxœí›yTSWÇoBBdQQ†d ¤ÉØV3L1•Q(; -KalðŠQD¨ ZbPGR‚" [«Ó‚ˆ0e4@…#RÚ3ÊTvÖÊ$<Âæ{úN„NA´3ä}Îýã®ß÷ûÝß{÷¾p„™™€£kp^x°U<Ø*I±@ ~+;p^Šïdø“­BæVÒhl“×o ÎRUW×Ù×7«#Øl“›çν“p^îaaÿ¸{wV%¾Œ«x°U<Ø*Äb‚M`±ZÄâ%7åe °XhÒÚ¾}‡ó¸¹yiõíò’EóÐô¨±q -ü5`¼ ýŸR•md`x>6öYjªGxø“¼¼E«µuumóö~V^þò†í17&Û׿º:://¾ –O°õÖ¬¡éêhººñ!!T ‹þááß-vBåryÿðð’¶‚BYA¡FÇÆ yK"»–lÏÎ/-5qsÓ45}ËÎ.ñúuXI`±òD¢?{zꘙNILËå§’“ß²³£ZXø}ú©dtöÔ05…I}ëV‹+%££ûOœÐ37§ÛÚ†]¼(›˜Ü*+ûã‡j˜šïÞST„i ™DR'“WjjÂâÔôt”PH·µ]»s'—Ç›˜œÄo‹ ,VYMÍ:{{†“à ++T³´¦æ]3³Ø+Wæ1/-/ùÁ«vì°ð÷¿sÿ>êË\óùþ110/E­íÛkŸ>…6UTlru¥ZXpy<(‹éÂBYš`?—J=Â÷1™Íwîð‚‚óùC##°éFIIYZÚ…#GN\º4(‘$äää‰DÅII¥©©OÛÛ?KM…Ýêj˜\--?qw‡•\¯³¯ï»k×þ™”Tòà?#CŠ áá\OÏöââè>>yrl|v–"L=ýý'.]òvp ¨«Ã¦óYYUÙÙ÷ÓÓ«êꢄBLqØù\VV|HÈ£›7=÷î¡>~ûí÷¹¹±±'/_H02oߎ¹råïG¶G8zþü<“æfm]PV6-— ÊËײÞ~6%^¿^ ÜILüWUÕÙôte.,”¥ ö ¥þ«¯>ˆÐ×Óƒç D›=s¦¯´ôoÎÎ6订A¡|¼wo}S“âE› gjkgjk‡++~ñ¦8Ì£÷å,fb*¬Ó×ÒÒ‚öùO[›²ƒ¸ÙØä‰D7KJÌ6o6¤ÑÐú¦Ÿ~‚™ÆŽx“Íua~eLìgCC}h’""“‘ÔÔ™ìäåË€çcc˜÷9:F%&>nnnhmåòxhàÆÅù»¸ìüå1ÔÔ¿óçŸM™Ì³AA~ ‹ó\àJžuû¶ëûï+Öû8:ZŒŽyÚÙçp”¹°PЇÛpCr³¶ÆO½GQEF3Ù° ÊË#‚†üüy†D …íÝÝ9qq°Ø"3œœfjk_ÒôÔ ÿxáUQרèõïDd²ï?ŽJLôurRÖY61ÑÖÕ•~ë–¿«ëë1oùüíðýûÇÆÇ÷?Z§¯ïíèºoŸ²ÎÕõõ.¡¡Ÿ¸¹™oÝŠV®ÒÖps{EæáËøò_ÆU<Ø*l¶ ñ‚†J¼ @?%~!¾sƒ³œÀ߯UþÿÙªþd«x°U<Ø*Ä®ÿÿõ@IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_matmode.png000066400000000000000000000023001454104675500240020ustar00rootroot00000000000000‰PNG  IHDRW$ü~¦bKGDÿÿÿ ½§“uIDAThíšYLTW€¿ahlšTãÂR†ikÄš´d¼ÆTÙb!0,Ÿ•QBm4`ÈÈòÀV MjÑ&¸ÌÔS‰P•Œ$FÄT…XB#ÐÖê ”eœ¤´ì„uúboXŠR¹WZr¿ä&7ç¿ÿŸ3_Î9sîœQ9 rpÕi¡{°˜Qäʈ"WNÓ”ë%.ƒÁ0]¥E¹2â<[ÀÓÍ _îUöåÉÕŠŠYc³ÊõÕé°œ<)K‡*A˜5¦, 2¢È•E®ŒH"W%¼·mÛ?Æ>6Q Ö¶¶ÿL]k[Ûs×J©lä>é줱¹yJ[w_Õ÷ïÏ)ÿqG.’×]H$“âãÃÕ;w¦´•UUñÑÆsÊŸ˜˜à÷înÉë.$’É5èõX¦I(­¬$J¯ŸÒvíî]tolÞÌ;á᜽rŸ½{x+$ä¥êöô÷óin..hÃÂH+(`xd‡Ã©¤„÷wîäM??|ãâ¨mlóÆÆÇÉ6™Ð†…±bËŒyyŒŒŽÎOÆ3$“ë/ôŠS¸w`€îÝcû¤©Þ70Àžôt6y{󨼜¼äd’òóù³·—úâbl••ÿº.€1/v»/]â{³™Ûµµäb*)á«óç9–”įeeäÆÇóÙÙ³bÞ×/ÒÜÚJ]QÕ.P×ÔD¶É$‰É䪜ø$$DeåÕÕø­_ÏŠeËÄg^_²„ŸJK9“‘‡‹ «5þèé™WݱñqJnÝâtF«5¼½¼ø21‘ïnÞä‹…))ì Â}Õ*"ÈKJs ¯_Ç”™‰§›Þ^^䧤PQW'‰I·b½^\K+*fLÝלiµÙØžœŒo\ß^»&I]{Wcãã¬ñôÛ¼´ZÚív~³ÙÖ­›ò¼níZñ¾íéS܃ƒQ *A@Ÿ@«Í6÷ý$•°aýƒƒÔÓ?é~®uÕjö„…‘tü8O:;ùÅjås“‰ØÈHŒÑѤPVU…½«‹Ûµµä˜ÍbnLDé§Nñ¸£ƒ‡--Dœ¹|Y’T™ÄîÐP¶´5í[`ùÒ¥;|˜èŒ >ص‹5Z-1„'&ò®Fƒ¯N7c·0—º¦¬,<\]ù0&†ÐC‡÷÷'ëÀ¢¢È‰'óôiÖlÝJŽÙLñÑ£b^öÁƒ¼íîŽß¾}ìß—VˉÔTI\¨¦PªT*àÙHùUì…üý¦g0°X,“CÊ¥œ(reD‘+#Š\Qäʈ"WF¹22ëéo]S»ÓÒ^e_³Êm·ÛŸ{&¯ðb”eAFfŒ\åïºÒ¡Œ\Qäʈ"WFþØ$“ÿ«6IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_matmulttyp.png000066400000000000000000000024461454104675500246070ustar00rootroot00000000000000‰PNG  IHDRm$ Í#¥bKGDÿÿÿ ½§“ÛIDAThíšLgÇŸ–̦ vP”Áfšz ¡@A:Ë~¨™$­&€Ê’͹ÀÿPÛ…Äd,Ö ²BD#RA$)Ä»’Ȭµü0sãWÛ´Œv¼¡éÚJàzbhî“þñÞóÞ}ß÷¾÷>÷Þ½=ŠÅb—¡¾î¸ ¤Ä@úH^w_¶R©Ôj9‰æ b0bØìÍïÊVáÙì¬B¥² :ñ1†Í–Ö×oJ—¶$-2™¢¼Ü.Hæ51>é#1àñ‘‚a>lL )6®Ñ¼"…q†‚avÁ_º»)æøûcll}§B8Çã“©)Û¾Î-.““’2:1qäÿS§—WõéÓŸWV†óù¡Lf.—vòä»1l¶ã$ëTá­]»¾...«¯ÿ(/¯0;Ûî—IÙ.ÒÂÒÿÀÛx~F·¸8ýÔ©ÔØØ 'N@Uaa°¿ì±cqLJ1™uee2A±]¾¥P(€žHÜb½çK±øÉÔÔOÕÕhs\£ ;tÈ¢Tº(Û"“å”—€T*(èžï×F“iR«m¼}»ÏßœÝÓÇá‘‘ÈÜÜ/²²"#­A¯;ŠW‡á8YÇuâ#"^ܽkôõñi¨ªzE-ºçxÜ|H‰ô‘H‰ÁÉ<£P©rþ#±‚ÞÊí!¿§À ù=ñPÈaHäx$ÒGb }$†ÿïç7§-P³ÔIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_mattype.png000066400000000000000000000022471454104675500240510ustar00rootroot00000000000000‰PNG  IHDRT$˜+ŠWbKGDÿÿÿ ½§“\IDAThcüÿÿ?ÃHL퀣ž©€™ÃÈÈ8Pî @.ãFcȈ‹[êéÑß)4Ç/]zòò%š Ï[êé­ê“èÂJKWïÞ&8¢“ý¨çG* ÇóŒj~~h‚^99Œw?&¨}åÎŒ˜èâ­[d8†€¥À#|€°9ØÙÅ……Å……E lqaaffòC6 Óó¡®®«<¿fÏžWW8wý¾}z¡¡\ææò“—/g``°ˆe``tqÁcf^ggJc#„ýõûwn ‹ 7oÞ}ü˜ÑÀ`ëáÃÚAAbŽŽ9íí?ýb``øó÷oõ”)²îîBvv9íí¿~ÿ&ÃdzÞÚÀàË·o\úéë×ý§Oû;8@¤>ý^Vf¦£sgË–öüü¼ÎÎ÷Ÿ>X¼˜áùž=xÌ uuݸÿßÿ68 $#c ®‘š¼|ùƉ·Lž¼ëøñŽyóz.¼õðáñE‹Í›wüÒ¥ê)SÈð™žgfb vqDþ–C‡¬ôõ…øù!Rìì—׬™T^.%*ª(-ÍÀÀðîãGbÌ´60`ea”˶m‹õñKõ©ÈÊšéè´ää,ݶaþÆS**dÄÅuTT: v?N†/È,ðB]]SrÖìÞœæYYX>žÓÞþåûwmeeâ dbb rv^·w¯žšÚž“'gÔÔÀ¥Tåä MEEH+õñ‹ÎÎp¼¼dx|ÏÛ~ùöíÈùó»Oœ˜Y[ ÿõûw`aáªîno[ÛŸ¿~Í]¿žx3CÝÜ¢**´””l eÄÅáâ·=ÒQQa``¸õ𡔘ƒ”˜ØÎiÓ”ee>~ùòâÍ2¼@~#QéÍÍf::r¾~ÿþýçOfæï?ÖOŸÎÀÀðùÛ7ˆÔ°54üûï_Ó¬YÈiž!¿«ëîãÇg®]«š<9ÚË‹!ÊÓ³l„ûOŸ^»wÏ;'gÒ²eäx =pæævíÞ½Ô2\¯-77¢¼\;(HYV6ÊÓÓ#+KAZÚROiÏ ÐO_¾99!‹Çx{»fdxeg»[YU%'300T§¤ÈIHXÅÇÛ$$¨ÈÊv’á~FäÎ=d0#ÔÕu{u5S¦>>ؼy3~üñGÕ67(((pئººF£ļyóàéé‰|øá‡èîîví]]]8pà"##1cÆ ,[¶ YYY0›Í€ÆÆF¥Fµ±766ûõmÜBûÃ?À××ש}655ÁÛÛ{Ô&¸¬¬ ­­­øùçŸQRR‚ÞÞ^$&&Úmc½ÀæÍ›•÷ËÊÊÀ¢MXXRRRPYY‰³gÏâîÝ»øüóÏqñâE¤¦¦«æÎÎN,Y²•••ÈÎÎFUU:„üü|ÄÄÄ ¯¯ï‰}äææŽh­œ¾Öj÷iG[CCƒS_§§§‡K—.%6448­ß~öúýé§Ÿ€=Rm£Fmü>>>¬¨¨°ØWZZÊ   aÕššÊÕ«WÓl6[ì7 æÑ£G¾Ö†Û¿Á`°{ŸvÄgÚþ/-_~ù%ÂÂÂàçç‡äädôôôz{{‘––N‡™3g"99¿þú+–/_Pú:þ<"""àááùóçãäÉ“³ÙŒŒŒ ÁÏÏIIIhoo·¨ãàÁƒXºté k{çwðæ›o*mF#¦OŸŽëׯzìS¦LQÆè,ÞÞÞøì³ÏÐÖÖ¦ì[µjîܹ`ps1ÐÉ“'‘žžWWË¥öôôDjjª2ÇpêÔ),X°~~~ؽ{7L&Ë˵õtT—½µëõLÛÿYÇúúzVTTpáÂ…ÌÈÈ IfeeÑ`0°¹¹™µµµ\´hßÿ}›Ï¾ÎÎNN:•¹¹¹lmme^^ÝÜÜh4yäÈFDD°®®ŽµµµŒŠŠbjjªò±.\ ^¯§Éd²8Û9ª­´´”³fÍboo/I2??ŸáááªãÀêêjvvv²££ƒÜºu+—-[f·õ¦6oÖÊÊʨ×ëéééÉ7ò“O>á½{÷”ãOš‹ÚÚÚ€<°{üÚµkô÷÷WjY¿~=ëëëùí·ß2$$„‡RÆÕ?§jëé¨.gŸiÚÚÚZ‹>.\H’ akk«r¬¸¸˜z½Þf ííítwwgNNF#ÉÇAîëëchh(ÏŸ?¯´½uëÏ;G’¼{÷.u:oݺõx@vBk¯6³ÙÌ€€~ýõ×$ÉM›61;;[uœ°úñâÔ©S¹nÝ:655©¶¸©Í›=}}}¬ªªbVV###éææÆÓ§O“¤Ã¹°öðáC‡¡-//§¯¯¯Ýy*,,ä¼yó”qõÏ©Úz:ªë© mww·²¯¦¦†$I›ôöö¶;ï¾ûŽ;vìà¬Y³Ç’’¥ºº:»¯¿bÅ æää(g´þ³]OOÏkÛ³g“““ùàÁN›6ÍÍͪã¸p#iÓÏÞøF#OŸ>msý™‘‘ANGÒñ\ØÀ«W¯Ú=–››Ë—^zé‰ó4p\jë騮§îš¶_}}½òöíÛ· DCCøømmm(//·ùøîîn˜L&?~÷ïßÇë¯¿ŽØØX´··#00P¹¦€êêj>|PQQ””xyyÁËË  ×ë‘––öÄÚâããñÅ_ °°+W®Äܹs5ÃÒ×ׇíÛ·£®®ÎbLL ~ûí7p8ö$&&"33Óæ.AWW²³³±uëVeŸõ<Ùô§¶žC­kD¬S<Ü3íºuëØÐÐÀÊÊJ†„„0==$ùÁpË–-ljjâ7¸bÅ îÞ½[ù¸ŽŽ’¤Éd¢»»;Oœ8Á––æääÐÝÝ]]]ÌÈÈ ^¯gmm-oܸÁ•+WrçÎvë˵ÚÌf3gÏžM;vÌ¢Ÿ£G²½½Ýn¿j°¬¬Œ­­­6›Ú¼YKJJbhh(¿úê+Ö××óìÙ³ŒŠŠâþýûIò‰sa]÷£Gʵk×òòåˬ¯¯ç¹sçÆ—_~Ù¢–ØØX‹yúøãmÆ®¶žŽê²^ëÁõ˃¼¼<Ó××—)))Ê—šîînîÛ·þþþôññaRR;;;ÙÛÛËèèhzyy)}åçç388˜Ó¦McXX/\¸@òñí¬ÔÔTΙ3‡ÞÞÞܾ};>|h·{¡U«$ß~ûmzzz*·­ìõcï}µ×VÛÔæÍZoo/ÓÓÓAΟ?ŸiiiìééÔ\Ø«Óh4rÿþýŒˆˆàôéÓÎÇÓd2YÔRTTÄ Ð××—{÷îU^s`Ÿjëé¨.{k=£Ú§Ñ`jKKKcbbâU¤Mƒù„ j¡Uý}Ú‰®§§---ÈËËéS§Æ»œ§VMM ÀÍÍmœ+ù¿#6cÆ ìڵ˵8£Ú***°dɼñÆX³fÍØ¦7oÞDLL vîÜ N7Þå(\þwúW"!!AþrAŒ»þ¿\(**²Ø/¿å%4GB+4GB+4GB+4GB+4Gõ>­£?¿b¬ ›}6·¼ä±HΑ€}ûöÙ>ÒG ‰½Ç"Ù„V8‡‹‹ °mÛ¶ñ.e‘kZ¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9Z¡9“î.X?Uz4•——É3Ñ¢££Çý ¥I÷X¤‰ø`½ÂÂBåQï“\Í™t—ý¢_xïîØ1Þe [yM þvâÄx—1.&mhçΞø Æ» 1 ry 4GB+4GB+4GB;.‘‘yå»Ç6&'Ã%2ÍÍJ[µ­ÿxÂ6ý467+m„c“ö±¡ºÓÒ‚êÛ·¡ Qöµut ´ªÊ¦mÙñãž3Gµ¯Â+W°eýz$ÄÅJ­œi)fùr]¹b±ïbI þ°x±M[_Ì~î9›­ß®øxì9|÷ùeÔ랈$´ƒ¿a ­B{æêU†qÛìÝ×^Chp0þœ™é¬ò& í ­ˆŒDgWªoß<2ñïÊJl^³Æ¦­Ñd²ÙÌ}}Êñ)®®8–™‰«ååøÇ¥Kc5„ CB;HS\]±5&F9Ûþ³´¿×ë1óÙgmÚê·mƒWt´Åö¯o¾±h³@§Ã_öîÅÞìlÜ»LÆ0QHh‡ ~ÃåºöLq±ê¥AÃ¥KàõëÛ¦U«lÚ%¿ú*=ÿ<þ”‘Iõ[K#$¡‚•/¾ˆÎ®.üçûïQ\^Ž?®];¢þ\\\÷ÑG¸V]¿Ÿ9ã¤*'> í¸ººbËúõx+3ËÂÃáëã3â>ˆ#g¿NÒ_~ ím‹Åͦ&bbœÖç[b¢¢œÖßD'?\^¿®¼½zñb‹÷­[sÔ×@—?ýtN.r¦š#¡š#¡š#¡š#¡š#¡š#¡š3iïÓË_ h”œi…æLº3íD||N§ïÆÔ¤{–—Ð>¹<š#¡šó €±{`«Nð_aÛÖ,!+“IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_nep.png000066400000000000000000000055511454104675500231510ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ IDATxœíÝ}LTWð-ÊW ´€€NX С-b‰ÖX¥Ðô#& ÚH-M·îZ…jk)¡¤Hc ËÆlš’Mé®%®Š¬_5McµÆ˜¥&òaM:@[¡³¦€2 ÓÎðì.³Ì̽〣ã…÷—ÜDïμ眇Ëñ ?’„2Ã×1QZ¡9Z¡98ŸèííÅùóç}Q‹.t:233OÒICCÈ!Ç}qäææ:G”.WÚ1rSAøZ^^žâyÙÓ Í‘Ð Í‘Ð Í‘Ð Í‘ÐzÈÏÏÏáǪU«ðÓO?©¶@CCƒÛ6­­­0™L())Áüùó„ÄÄDìØ±###“®}xxï¼óÒÒÒŠŒŒ TUUÁf³ºººì5ª½««kÒïïm> í?ü€ÈÈH¯öÙÝݰ°°»6Áƒ}}}øå—_pöìYX­Väçç+¶q>`ÕªUö¿ ph“œœŒ¢¢"´´´àðáørå >ýôS|þùç(..žTÍCCCHOOGKK ª««qá”––¢¾¾YYY½mµµµw´V^_kµû´w[gg§WßÇb±pÑ¢EÀÎÎN¯õ;F©ßŸþ™xãÆ Õ6jÔÆÎææf‡sçÎc\\ܤê...æ²eËh³ÙΛL&ÆÇÇs÷îÝ^_ g“í?77Wñ>í_iǾ´|ñÅHNNFTT a±XV«eeeÐétx衇PXXˆß~û O<ñ &&ÆÞ×±cÇššŠÀÀ@,X°û÷ïØl6TTT ..QQQ(((Ààà C%%%X´h‘ǵ½ñÆxíµ×ìmM&‚ƒƒqñâEÇ>sæLû½%,, Ÿ|ò ìçž|òIüøã<›‹ñöïßòòr̘á¸ÔAAA(..¶Ï18p ˆŠŠÂæÍ›a6›8nÔÖÓ]]Jk}GœS<Ñ+íØgQNNF#›››¹páBVTT$«ªª˜››Ëžž¶··ó±ÇãÛo¿íòÙ744ÄY³f±¶¶–}}}¬««£¿¿?M&wíÚÅÔÔTvtt°½½‹/fqq±ýc?N½^O³ÙìpµsWÛ¹sçA«ÕJ’¬¯¯gJJŠê8°µµ•CCC¼yó&»ºº¸fÍfdd(¶q>ÔæÍ™Á` ^¯gPPŸ}öY~øá‡ìííµ¿~»¹o``€xýúuÅ×ÏŸ?Ïèèh{-+W®¤Ñhä7ß|ÃÄÄD–––ÚÇ56§jëé®.o_i½Úööv‡>.\H’LLLd__ŸýµS§NQ¯×» dpp¬©©¡Éd"y+È£££LJJâ±cÇìm/_¾Ì£G’$¯\¹BNÇË—/ßBh•j³ÙlŒ‰‰á™3gH’Ï=÷«««UÇ §ÿ^œ5kW¬XÁîînÕ6ãµyS2::Ê .°ªªŠiiiô÷÷çÁƒIÒí\8ëïïwÚ¦¦&FFF*ÎScc#çÏŸoרœª­§»ºîÛÐŽŒŒØÏµµµ100$è²€aaaŠùöÛo¹aÃFDD0''‡gÏžµ÷ÑÑÑ¡øþK–,aMMýŠ6vµ³X,·­mË–-,,,äõë×9{ölöôô¨ŽsüÂÝI›1Jã7™L^½z•555 àðð0+**¨×ëÙÞÞÎK—.qéҥܸq£b=PبÕf³Ù8gÎFGGsÏž=ýìÞ½›ƒƒƒŠýª@ƒÁÀ¾¾>—CmÞœ0))‰_~ù%F#>ÌÅ‹sûöí$yÛ¹p®ûÆLJJâSO=Å“'OÒh4òèÑ£LNNæóÏ?ïPKvv¶Ã<}ðÁ.cW[Owu9¯µ§îúö ®®ŽñññŒŒŒdQQ‘ýKÍÈÈ·mÛÆèèh†‡‡³  €CCC´Z­ÌÌÌdHHˆ½¯úúzÆÇÇsöìÙLNNæñãÇIÞºU\\̹sç2,,Œëׯg¿b=J¡U«$_ýuÙo[)õ£ôwµ÷V;ÔæÍ™Õjeyy9SSSÈ °¬¬Œ‹Å£¹PªÓd2qûöíLMMepp0SRRXYYI³ÙìPË¡C‡˜ÀÈÈHnݺÕþžãûT[Owu)­µ'îzhïGžÔVVVÆüüü{T‘6yò {7¨…Võûi§:‹Å‚«W¯¢®®ðu9÷­¶¶6€¿¿¿+ù¿;þ‡Xhh(6mÚäZ¼Î]mÍÍÍHOOÇ«¯¾ŠåË—ßÛÂ4â»ï¾CVV6nÜNçërìüþwù·kllĺuëä'„Ïýä¡C‡ÎËwy ͑Р͑Р͑Р͑РÍQ½OëîÇ/„¸Wrss]ιÜò’Ç"yǺuë°mÛ6×Gúˆ Qz,’Kh…wøùù¡¡¡k×®õu)SŽìi…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æHh…æL»ß¹àüT黩©©éž<-33Óç¿í^švEšŠÖkll´?ê}:íМi·=“ùÈ#xsÃ_—1iMmmøÛ¾}¾.Ã'¦mhçÍ™ƒ¼§Ÿöubd{ 4GB+4GB+4gÚîi'Â/- k³³Ñð׿:œïêéA /€/ÚÛ©QköàƒXöøãø¨¤q11^®|j’Ðz¨ñ«¯°zåJ¬ËÉqÛΰw/âçÎõ¨ I\ûõW¼ûÑGÈ/-Å¿÷ìñbÅS—„ÖC›òò°¥²ËÓÓ1çá‡UÛE†‡»}ݹMtDþ¹cæ>ý4nšLx08Ø«uOE²§õЛ/½„¤øxüiçN¯÷=sÆ­e°Úl^ï{*’ÐzhæŒسs'N75á_'N¨¶3™ÍЇR›¡áat÷öbKU2RRz·‡1%Èö`t:üeëVl­®ÆÊŒ Å6z•_Á4ö1ç6³üý±ôÑGq°ºÚ»ÅNaÚ *|ñE=s¬¨Àßß}×åõÎ'°@§sÛ‡'m„:ÙLŸŸêÞç[[ñÏ>óu9Ó’\i'á±±ØõÖ[Ø\YéòÚúûärþvw„ç$´“ôçÜ\ùúk|e08œÏ|ùeÅöã÷´âÎHh= ¸“ìQ»‰¶îÉžVhŽ„VhŽ„VhŽ„VhŽ„VhŽ„VhŽ„Vhδ½O{èÔ)·?i î_r¥š3í®´SññAºiöcÓîY^Bûd{ 4GB+4ç÷î­BxÁ`n¸2ÏIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_orthogtype.png000066400000000000000000000031161454104675500245660ustar00rootroot00000000000000‰PNG  IHDRe$cQbKGDÿÿÿ ½§“IDAThí™{LSWÇO[>Ð*P`EÔ¦)шS—PÙR6)B ˆ˜(–±Y¡•E…LаÕ-Z&"ãe¨Šf•£TRÂML¼)î]º¤Í9×Ðp½¬¬˜ÍþöèÑ¡!@|f¦\©¼vêÔ¯ùùÕÍÍœââŸ*+÷NNJß±#);{1ta]tt ëëˆDê²eÐ¥¼òr!w>/ï¢XœUTÈ.)éìëŸ8ÑXT$nmeñùpküšê6‹Á¨Õj¨Íe2C}}ÍÍÌôr’#"ÌÍ̶xzŸ>}¡Vÿ|áoÏ{kk2‰ÄŽ-‰rJK¹L¦¯›~Þ¿·¿¿ôàA¨+•ÉHãÉ*9]Sš’t: Üýckgg8‹õ{{û³ÑÑk·o³òò"§JëQ(ŠÎžô(x Ùï”ÔíÛU##[˜Ì‡OžØYY1h´¤mÛ¦J¾zëVPRÒWtºÇêÕÚàÜÙ³w½\oƒó ‡Åˆ‹;7“äõ«V 44èÍŸ”ÅzÒ0Àýhà ~Áõ ¨_ð˜ä¼·¶†Nx.ò?ºëÔ}¾ýZÐçÛÈÁ Ë èú‚ê¬$æè˜ÓÞþó×/òÌÇd†Ý×ïß¿~ÿþåÛ·{Ožd··›éèòñ}þú5¼¬ÌLGçΖ-íùùyï?}‚¨ï^¸°«°PYF—4гpá­‡/ZthÞ¼ã—.UO™BÐI¡®®÷ïÿûïÃÆ”dd ÔÕ!R“—/ß8qâ–É“w?Þ1oyæc2ó¬~X„ÁÆÊjch¸¢³“ƒýòš5²\ŠÒÒ ï>~„(ë*(ÐQQùýç.h`þƇæÍ–ï,((éíÍ Áï$kV–CgÏ:šš.Û¶-ÖÇ.ÕST¤"+Ë +Û’“S3eJ}F¦ù ……¤™awgófeYY4AV–‡ÏŸç´·ùþ][YYJCQ¿4ðøÅ gg8W€—— “˜˜˜‚œ×íÝ«§¦¶çäÉ55p)U99CSQñÉË—ä™ È ;¬à×ïß……«º»½mmþú5wýz„5ÌÌø )1±Ó¦A¢çã—//Þ¼!Æ¡nnQZJJ6††2ââpñÛ騨000ÜzøPJLŒlóÑ5ÛÆ_¿ÿþó' 3ó÷Ÿ?ë§Og``øüíI à ÊÓ³l„ûOŸ^»wÏ;'gÒ²eÄ8ÀÖÐðï¿M³f!gX†ü®®»Ÿ¹v­jòäh//²ÍGÔ ;A>¾¶Ü܈òrí  eYÙ(OO¬,’ÀAuJŠœ„„U|¼MB‚Ьlq…$Û~úò%ÈÉ Y<ÆÛÛ5#Ã+;ÛÝʪ*9™lóÑ#ò'###C¨«ëÐG©™2åÁ³gKÚÚ Ü»«øúþ¿pBcWïÞVZÊÀÀ°jÕªÐÐPˆàðéÏþüõëþÓ§ó6lH ¢Ã'ìN^¾l•à`bäãáÉ€%ªjÖ³ ìŒß<ˆ&(*(8½ºšF6ŸtG0väƒÑ°#Œ†ùK]qüÒ¥0Œ9¡ ½`t0º.€$0º.€:€q4¹‘ FÓù`4ìÈ£aG>Ý>!¬ÍXNÄIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_parallelty_2.png000066400000000000000000000023201454104675500247500ustar00rootroot00000000000000‰PNG  IHDRi$&ƒßbKGDÿÿÿ ½§“…IDAThcüÿÿ?Ã( 0 ´†0 ;òÁhØQþ#vË«V­‚×hº#°` Ɉ‹[êéÑß)ƒ¬$æè˜ÓÞþó×/òÌÇd†Ý×ïß¿~ÿþåÛ·{Ožd··›éèòñ}þú5¼¬ÌLGçΖ-íùùyï?}‚¨ï^¸°«°PYF—4гpá­‡/ZthÞ¼ã—.UO™BÐI¡®®÷ïÿûïÃÆ”dd ÔÕ!R“—/ß8qâ–É“w?Þ1oyæc2ó¬~X„ÁÆÊjch¸¢³“ƒýòš5²\ŠÒÒ ï>~„(ë*(ÐQQùýç.h`þƇæÍ–ï,((éíÍ Áï$kV–CgÏ:šš.Û¶-ÖÇ.ÕST¤"+Ë +Û’“S3eJ}F¦ù ……¤™awgófeYY4AV–‡ÏŸç´·ùþ][YYJCQ¿4ðøÅ gg8W€—— “˜˜˜‚œ×íÝ«§¦¶çäÉ55p)U99CSQñÉË—ä™ È ;¬à×ïß……«º»½mmþú5wýz„5ÌÌø )1±Ó¦A¢çã—//Þ¼!Æ¡nnQZJJ6††2ââpñÛ騨000ÜzøPJLŒlóÑ5ÛÆ_¿ÿþó' 3ó÷Ÿ?ë§Og``øüíI à ÊÓ³l„ûOŸ^»wÏ;'gÒ²eÄ8ÀÖÐðï¿M³f!gX†ü®®»Ÿ¹v­jòäh//²ÍGÔ ;A>¾¶Ü܈òrí  eYÙ(OO¬,’ÀAuJŠœ„„U|¼MB‚Ьlq…$Û~úò%ÈÉ Y<ÆÛÛ5#Ã+;ÛÝʪ*9™lóÑ#ò'###C¨«ëÐG©™2åÁ³gKÚÚ Ü»«øúþ¿pBcWïÞVZÊÀÀ°jÕªÐÐPˆàðéÏþüõëþÓ§ó6lH ¢Ã'ìN^¾l•à`bäãáÉ€%ªjÖ³ ìŒß<ˆ&(*(8½ºšF6ŸtG0väƒÑ°#Œ†ùK]qüÒ¥0Œ9¡ ½`t0º.€$0º.€:€q4¹‘ FÓù`4ìÈ£aG>Ý>!¬ÍXNÄIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_pep.png000066400000000000000000000053231454104675500231500ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ ˆIDATxœíÝLÔõð'ʯ `7†(c<*EIre¨­ÚÜt“­åVå¾v2¾,dkÉØúÃÅ?´¯1gâø1Sk­µZs® Dn"˜[TJ†ß¯ŽãêŽç÷¿|¾ÜÝçspx¾ãõØ>›|xó¾×ûý~Þ‡7¹#„$!„B–»!fKB+”#¡ÊyÈóÄÀÀ.^¼ŒZ„ðb2™——ç~’š›› @9ˆ£°°Ð3¢ôºÒN‘› "ØŠŠŠtÏËžV(GB+”#¡ʑРåHhýâvÄÆÆbÇŽøí·ß ÛL? ¹¹Ùg›®®.Øl6”——cÕªUˆˆˆ@zz:>Œ‰‰‰9×>>>ŽC‡!''ÑÑÑÈÍÍEMM \. ¯¯O«Ñhì}}}s~ü@ ZhùåÄÇÇ´Ïþþ~ÄÄÄ,Ø·µµappüñΟ?§Ó‰ââbÝ6žìرCû¸­­ ÜÚdff¢¬¬ 8}ú4®_¿ŽO>ùŸþ9,ËœjúuëÐÙÙ‰ÚÚZ\ºt hllDAA&''g죾¾~^kðµ6ºO»Ðz{{ú8‡ƒëׯ'ööö¬ß)zýþþûïÀ»wï¶1b4þØØXvtt¸»páSRRæT·ÅbáæÍ›ér¹ÜÎÛl6¦¦¦òرc_ Osí¿°°P÷>í¼¯´SßZ¾üòKdff"!!¥¥¥p8§Ó‰ÊÊJ˜L&<òÈ#(--ÅŸþ‰7’’’´¾Îž=‹ììl„‡‡#-- 'Ož¸\.TWW#%% ())ÁÈȈ[åååX¿~½ßµ½ýöÛxýõ×µ¶6› ‘‘‘¸|ù²ßc_ºt©6Æ@‰‰‰ÁÇŒááaíÜÓO?_ý€s1ÝÉ“'QUU…%KÜ—:""‹E›c8uêV¯^„„ìß¿v»€ûöÀh=}Õ¥·Öóâ™âÙ^i§žEÛ·o§ÕjeGG׬YÃêêj’dMM yãÆ vwwó‰'žà»ï¾ëõìã²eËX__ÏÁÁA644044”6›~ø!³³³ÙÓÓÃîînnذ‹EûÚsçÎÑl6Ón·»]í|ÕváÂÆÅÅÑét’$™••e8NìêêâØØGGGÙ××Ç;w277W·ça4ožÚÚÚh6›Á^xGåÀÀ€öù™æbºááaàíÛ·u?ñâE&&&jµ<÷Üs´Z­üᇘžžÎŠŠ m\Ssj´ž¾ê ô•6`¡íîîvëcÍš5$ÉôôtjŸûæ›oh6›½222°°0ÖÕÕÑf³‘¼äÉÉIfddðìÙ³ZÛk×®ñÌ™3$ÉëׯÓd2ñÚµk÷¤Z½Ú\.“’’øÝwß‘$_|ñEÖÖÖŽÿ½¸lÙ2nÙ²…ýýý†m¦Fó¦grr’—.]bMM srrʦ¦&’ô9ž†††|†¶½½ñññºóÔÒÒÂU«ViãššS£õôU×Ú‰‰ íÜ•+WN’ ÷ZÀ˜˜ÝüøãÜ»w/ãââ¸}ûvž?^룧§G÷ñ7mÚĺº:íŠ6uµs83ÖöÖ[o±´´”·oßæòåËyãÆ ÃqN_¸ù´™¢7~›ÍƦ¦&¯ýguu5M&Ißs¡'))‰ß~û­îçêëëùüóÏÏ8OÓÇe´ž¾êzàö´S¬V«öïŸþÉÉÉ€äädôöö‚÷ž F{{»××OLLÀn·ãĉ¸uë^}õUlÛ¶ ###HNNÖötÐÕÕ…#GŽ:::PVV†¨¨(DEEÌf3*++g¬­¨¨Ÿ}öZZZŸŸÇ{,PÓ1'“““سgzzzÜÎ௿þŸs¡§¸¸ï¿ÿ¾×]‚ññqÔÖÖbçÎÚ9ÏyJIIñêÏh=g[×¼x¦x®WÚ-[¶°··—LOOgUUIò½÷ÞãË/¿Ìþþ~^½z•›6mâþýûµ¯%IÚív†……ñÓO?åÍ›7YWWǰ°0޳ººšf³™ÝÝݼzõ*óóó¹oß>Ýz ³=0ªÍårqÅŠLLLäñãÇÝú9vìGFFtû5€mmmô:ŒæÍSII 322øÕW_ÑjµòôéÓܰaŽyøal~òI|T^Ž”¤$Ý6Óñòe¿û¾Ihg¡íÄ ¤®\ ’¸uçþùÑG(®¨À÷Ç{µ™o?˜„vâcc±âÑG‰qqø×áÃX¹u+Fm6<éÕf>ýc²§‡¥KîMŸÓåz úY,äJ; 6»6»$ñï;wpèèQäfe!6:Ú«§ÈððYõ#ŒIhgÁ<íw–…†"ÿñÇÑT[kØfº©ÄüíG“ÐÎBï_ Ídº/m„1ÙÓ åÈ•6Àþ34„¨ˆ¯ó3ÝQþ“ÐXÞ+¯èžŸ¾§ó#¡õ“?¡ Tá›ìi…r$´B9Z¡ ­PŽ„V(GB+”#¡ÊYÔ÷ió˰U&WZ¡œEw¥5™L(** vóÔSO»„ûnѽ——PŸl„r$´B9h vBÌÆFT¨s¨Ù%‰IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_powershift.png000066400000000000000000000034161454104675500245570ustar00rootroot00000000000000‰PNG  IHDR}$+c¢MbKGDÿÿÿ ½§“ÃIDAThíšmLSgÇOÅ!/ÒU[ê†2¤ëJÕB±e(–ê|!œlC?­ˆn£,– Uº¡.E­›‘1Q]Eq]×uv8YD@°­ •·m÷áê]ƒÈ°"7ÑûK?œ{îÓçüï¿OÎs{[‚Õjœ)Çk/)¸ïØ€ûŽV°Öò‚#“ÉP«ñõŽ N§|(6>õR^T: eCèä¾³étY^Þ”Hz)8US£LM•Äû 6à¾cî;6Øã;Á@_D.weJJûíÛ“® ¥o` M"™+Lö_±bwaá É„*iÑél·èt‰Sòòˆ\î¨ÙNVWÛêG_45=¿Kxœ1öÕ‰ ,)ñõö¶Z­†{÷v8°V$ª?rdR…ýÇæìì¶ÎÎïöí£zzþÕÚšœ“s¯§§ =}ÌÁîî鉉ÐÕÓSP^ÞVU7õzÖÚµ_¸+ÃÃïÈåH’€Ä@òðxNúÇÄÎ>3‹H¤Hž3g¾ãïÿõîÝ—µÚ}}“« åŒB‘½eKP@ÀL.“y -­²®îIƒI3fˆ““ Ûh´X,TOO°X,ÿtw#^6B"QH¤YD" 1…Drrt|NúÇdú»£ƒŒ˜ÍÐÓÛûé®]³Âé|~j~¾ihˆ )-€ûF£CPPj~>X,–×ÂÂÎÕ×#oÌJ©|þkaaB±xhxé µú¨¨ËZ­‡›Û¡o¿í~ð)Çe2ÛÎC«ÿ¤VÓV¯öàp²›>²nx-[6*~É9923‘¸o`À%$D{ý:2ÛÙK—ÞŠ‰!/Y"‹MCCcj~ZÓìô½o` o` ·¿¿µ£c“XÌ $º»€P,î0~--=÷å—Õ?ÿœS\,àrå*Ô_¹âîâ¢P«@{ýú É¾hì=z´©½]YRr±¨HÙÐ!•"%òŽÍݺ•1~™X¬ilôæñBáþÒRýÝ»¶J*ëê~+++ÎÊÚ]XØÕÓƒæ9v n×ÖŽŠŸD,W¡P˜-¨¸pa®cþ|äTAyyÅþý?ü¨Tf£yâØéû;qq®l¶[h(mõêûF㉜1›Oœ?¿?-Í×Û;ÐÏ/kãÆãgÏFs8u͈Ù\§Ñ?üðê=½½ µz)‹åé#A˜ÌxÛZÞ1”J%n¹‰ÁþõƒN°½”wN§X\ÄÇà€eQ‘M$½“4vw«¤ÒAr_é#1>ƒ5>R¸\üã¶cGœD2:>nÉÀ!µšÂåZ´œ«æzðÏÝÁA«ç´‚E®3– R(XÞÞ&“I÷ìÙ±²²¤ÜÜŸ/^$T˜¥Äñx==0¢Õ''£6¸»ºÚR†•>z¸¹ÑÝÝÀsýúê'¼ùü¿¦§]œœÕfkÖ:8€~f*ÛCÀù‘jg/F´C{oßÞõKÿ¤^èøq)HÏ››CýÚÛÙB!-<<£ À0;k>ÕK£1ØÁ;wŠe²¹/€Âå*ZZ>ݷσÇ+¸p¡¾­Í76öýÐÐo+*–QuX.O;yµ§ §íÛû<@ [oÞÜ,ÑÂÃÅ2RµhÝÿ„•>N Óƒ~ffX£É”ɶq8nëÖ¡TQ]]aV×ÏO,“itº_ëëÛ+*:oÝ’×Ö¢5MM••­ÖÓ×÷]U•ù´Åuuƒ££*…âFMj` ÃP¼ùÚ5•B!—Hò0¬±«ë®RYœ}ººúÙääR ãùüæÞ^ãü<îÃ`pýüPªüòåæÒÒËË»Tª355ËÔµ+}ü,!Á98Ø%$ÄïÞçSSWär•‘q©µu(‘JÙLæÖÍ›O‹ÅW;;ͧ­mnÆrrt:‡Í–K$Ý*ŠK’’œ“…BÈNNvvt<ϧ¦–RÊå¾goãÎhhk;‹§Ša3™Û8œÓbq}[Û2u-ÇÊóãŸ--¾L梩Y,Ð=}úÒhôe0PÍdjt:ÔþhÆznÜ8þø±ùXõÄ„gD~èêâ‚^`O¥.h/ƒ("⇞ž€M›~êëû>?OáüY,¤j©º–c¥ËÍH¥ÝÝÝžJÖjýY,Òh¼i4ÔáG8l6 ŽŽ~èåe>Ö‹F묬DßФ^?ñäÉJ”ÄGF&æä|âãÈ Óñ¸¹/ºoêw¸=•ú¹@pøÌ™‡cc¿ åcØþ˜”Ê>{vH­þíþýcåå^‰QQß””Œhµ÷‡‡cÄⲆ†•hØhœŸ?UUe¾©à«ÂB\@Rt4!ußàý –›ëE£mMLŒLOßš›šŠâ_ŠD»32¢33£Â¾NI1’—–¶ÁÓ3$%%ìàA6“Y˜•µhkOéõ¢]»ÌãûcbøééÑ™™‚c©©„Ô¥˜?¾¥P(Ï篚ç=ùöplìRA:R«ÙB¡©¿%s6vw'H¥ T*ãããQpÕÞ_ÏÎÍhµ5MMi"‘ Ê­ZûîÝ JLübÏ^P\çìœþj ñ×ëÿ ;·lyzýú‚ ‡›Ûù¼¼7QnÕ®GCúH ¤Ä@úH ‹\gT ¯ýF‚ƒ?(øäûVC¾OA<r¹‰ô‘H‰áoMx3ð|-VIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_problemtyp_2.png000066400000000000000000000025651454104675500250070ustar00rootroot00000000000000‰PNG  IHDRm$ Í#¥bKGDÿÿÿ ½§“*IDAThíš{LSWÇ¥L CZ­³Ðɘ+<4ER*m„%  ƒ%Wd L£3ÔF\À€4‚Z’Âxàc³aÎ13‘ Û¯À héþ8ó¦C ]¹ÖIî'ýãÜßïœóûæÛsîí½½“É$+Æîm X%>é#A˜ÌxÛZÞ1”J%n¹‰ÁþõƒN°½”wN§X\ÄÇà€eQ‘M$½“4vw«¤ÒAr_é#1>ƒ5>R¸\üã¶cGœD2:>nÉÀ!µšÂåZ´œ«æzðÏÝÁA«ç´‚E®3– R(XÞÞ&“I÷ìÙ±²²¤ÜÜŸ/^$T˜¥Äñx==0¢Õ''£6¸»ºÚR†•>z¸¹ÑÝÝÀsýúê'¼ùü¿¦§]œœÕfkÖ:8€~f*ÛCÀù‘jg/F´C{oßÞõKÿ¤^èøq)HÏ››CýÚÛÙB!-<<£ À0;k>ÕK£1ØÁ;wŠe²¹/€Âå*ZZ>ݷσÇ+¸p¡¾­Í76öýÐÐo+*–QuX.O;yµ§ §íÛû<@ [oÞÜ,ÑÂÃÅ2RµhÝÿ„•>N Óƒ~ffX£É”ɶq8nëÖ¡TQ]]aV×ÏO,“itº_ëëÛ+*:oÝ’×Ö¢5MM••­ÖÓ×÷]U•ù´Åuuƒ££*…âFMj` ÃP¼ùÚ5•B!—Hò0¬±«ë®RYœ}ººúÙääR ãùüæÞ^ãü<îÃ`pýüPªüòåæÒÒËË»Tª355ËÔµ+}ü,!Á98Ø%$ÄïÞçSSWär•‘q©µu(‘JÙLæÖÍ›O‹ÅW;;ͧ­mnÆrrt:‡Í–K$Ý*ŠK’’œ“…BÈNNvvt<ϧ¦–RÊå¾goãÎhhk;‹§Ša3™Û8œÓbq}[Û2u-ÇÊóãŸ--¾L梩Y,Ð=}úÒhôe0PÍdjt:ÔþhÆznÜ8þø±ùXõÄ„gD~èêâ‚^`O¥.h/ƒ("⇞ž€M›~êëû>?OáüY,¤j©º–c¥ËÍH¥ÝÝÝžJÖjýY,Òh¼i4ÔáG8l6 ŽŽ~èåe>Ö‹F묬DßФ^?ñäÉJ”ÄGF&æä|âãÈ Óñ¸¹/ºoêw¸=•ú¹@pøÌ™‡cc¿ åcØþ˜”Ê>{vH­þíþýcåå^‰QQß””Œhµ÷‡‡cÄⲆ†•hØhœŸ?UUe¾©à«ÂB\@Rt4!ußàý –›ëE£mMLŒLOßš›šŠâ_ŠD»32¢33£Â¾NI1’—–¶ÁÓ3$%%ìàA6“Y˜•µhkOéõ¢]»ÌãûcbøééÑ™™‚c©©„Ô¥˜?¾¥P(Ï篚ç=ùöplìRA:R«ÙB¡©¿%s6vw'H¥ T*ãããQpÕÞ_ÏÎÍhµ5MMi"‘ Ê­ZûîÝ JLübÏ^P\çìœþj ñ×ëÿ ;·lyzýú‚ ‡›Ûù¼¼7QnÕ®GCúH ¤Ä@úH ‹\gT ¯ýF‚ƒ?(øäûVC¾OA<r¹‰ô‘H‰áoMx3ð|-VIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_problemtyp_3.png000066400000000000000000000025651454104675500250100ustar00rootroot00000000000000‰PNG  IHDRm$ Í#¥bKGDÿÿÿ ½§“*IDAThíš{LSWÇ¥L CZ­³Ðɘ+<4ER*m„%  ƒ%Wd L£3ÔF\À€4‚Z’Âxàc³aÎ13‘ Û¯À héþ8ó¦C ]¹ÖIî'ýãÜßïœóûæÛsîí½½“É$+Æîm X%>é#A˜ÌxÛZÞ1”J%n¹‰ÁþõƒN°½”wN§X\ÄÇà€eQ‘M$½“4vw«¤ÒAr_é#1>ƒ5>R¸\üã¶cGœD2:>nÉÀ!µšÂåZ´œ«æzðÏÝÁA«ç´‚E®3– R(XÞÞ&“I÷ìÙ±²²¤ÜÜŸ/^$T˜¥Äñx==0¢Õ''£6¸»ºÚR†•>z¸¹ÑÝÝÀsýúê'¼ùü¿¦§]œœÕfkÖ:8€~f*ÛCÀù‘jg/F´C{oßÞõKÿ¤^èøq)HÏ››CýÚÛÙB!-<<£ À0;k>ÕK£1ØÁ;wŠe²¹/€Âå*ZZ>ݷσÇ+¸p¡¾­Í76öýÐÐo+*–QuX.O;yµ§ §íÛû<@ [oÞÜ,ÑÂÃÅ2RµhÝÿ„•>N Óƒ~ffX£É”ɶq8nëÖ¡TQ]]aV×ÏO,“itº_ëëÛ+*:oÝ’×Ö¢5MM••­ÖÓ×÷]U•ù´Åuuƒ££*…âFMj` ÃP¼ùÚ5•B!—Hò0¬±«ë®RYœ}ººúÙääR ãùüæÞ^ãü<îÃ`pýüPªüòåæÒÒËË»Tª355ËÔµ+}ü,!Á98Ø%$ÄïÞçSSWär•‘q©µu(‘JÙLæÖÍ›O‹ÅW;;ͧ­mnÆrrt:‡Í–K$Ý*ŠK’’œ“…BÈNNvvt<ϧ¦–RÊå¾goãÎhhk;‹§Ša3™Û8œÓbq}[Û2u-ÇÊóãŸ--¾L梩Y,Ð=}úÒhôe0PÍdjt:ÔþhÆznÜ8þø±ùXõÄ„gD~èêâ‚^`O¥.h/ƒ("⇞ž€M›~êëû>?OáüY,¤j©º–c¥ËÍH¥ÝÝÝžJÖjýY,Òh¼i4ÔáG8l6 ŽŽ~èåe>Ö‹F묬DßФ^?ñäÉJ”ÄGF&æä|âãÈ Óñ¸¹/ºoêw¸=•ú¹@pøÌ™‡cc¿ åcØþ˜”Ê>{vH­þíþýcåå^‰QQß””Œhµ÷‡‡cÄⲆ†•hØhœŸ?UUe¾©à«ÂB\@Rt4!ußàý –›ëE£mMLŒLOßš›šŠâ_ŠD»32¢33£Â¾NI1’—–¶ÁÓ3$%%ìàA6“Y˜•µhkOéõ¢]»ÌãûcbøééÑ™™‚c©©„Ô¥˜?¾¥P(Ï篚ç=ùöplìRA:R«ÙB¡©¿%s6vw'H¥ T*ãããQpÕÞ_ÏÎÍhµ5MMi"‘ Ê­ZûîÝ JLübÏ^P\çìœþj ñ×ëÿ ;·lyzýú‚ ‡›Ûù¼¼7QnÕ®GCúH ¤Ä@úH ‹\gT ¯ýF‚ƒ?(øäûVC¾OA<r¹‰ô‘H‰áoMx3ð|-VIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_problemtyp_4.png000066400000000000000000000025651454104675500250110ustar00rootroot00000000000000‰PNG  IHDRm$ Í#¥bKGDÿÿÿ ½§“*IDAThíš{LSWÇ¥L CZ­³Ðɘ+<4ER*m„%  ƒ%Wd L£3ÔF\À€4‚Z’Âxàc³aÎ13‘ Û¯À héþ8ó¦C ]¹ÖIî'ýãÜßïœóûæÛsîí½½“É$+Æîm X%>é#A˜ÌxÛZÞ1”J%n¹‰ÁþõƒN°½”wN§X\ÄÇà€eQ‘M$½“4vw«¤ÒAr_é#1>ƒ5>R¸\üã¶cGœD2:>nÉÀ!µšÂåZ´œ«æzðÏÝÁA«ç´‚E®3– R(XÞÞ&“I÷ìÙ±²²¤ÜÜŸ/^$T˜¥Äñx==0¢Õ''£6¸»ºÚR†•>z¸¹ÑÝÝÀsýúê'¼ùü¿¦§]œœÕfkÖ:8€~f*ÛCÀù‘jg/F´C{oßÞõKÿ¤^èøq)HÏ››CýÚÛÙB!-<<£ À0;k>ÕK£1ØÁ;wŠe²¹/€Âå*ZZ>ݷσÇ+¸p¡¾­Í76öýÐÐo+*–QuX.O;yµ§ §íÛû<@ [oÞÜ,ÑÂÃÅ2RµhÝÿ„•>N Óƒ~ffX£É”ɶq8nëÖ¡TQ]]aV×ÏO,“itº_ëëÛ+*:oÝ’×Ö¢5MM••­ÖÓ×÷]U•ù´Åuuƒ££*…âFMj` ÃP¼ùÚ5•B!—Hò0¬±«ë®RYœ}ººúÙääR ãùüæÞ^ãü<îÃ`pýüPªüòåæÒÒËË»Tª355ËÔµ+}ü,!Á98Ø%$ÄïÞçSSWär•‘q©µu(‘JÙLæÖÍ›O‹ÅW;;ͧ­mnÆrrt:‡Í–K$Ý*ŠK’’œ“…BÈNNvvt<ϧ¦–RÊå¾goãÎhhk;‹§Ša3™Û8œÓbq}[Û2u-ÇÊóãŸ--¾L梩Y,Ð=}úÒhôe0PÍdjt:ÔþhÆznÜ8þø±ùXõÄ„gD~èêâ‚^`O¥.h/ƒ("⇞ž€M›~êëû>?OáüY,¤j©º–c¥ËÍH¥ÝÝÝžJÖjýY,Òh¼i4ÔáG8l6 ŽŽ~èåe>Ö‹F묬DßФ^?ñäÉJ”ÄGF&æä|âãÈ Óñ¸¹/ºoêw¸=•ú¹@pøÌ™‡cc¿ åcØþ˜”Ê>{vH­þíþýcåå^‰QQß””Œhµ÷‡‡cÄⲆ†•hØhœŸ?UUe¾©à«ÂB\@Rt4!ußàý –›ëE£mMLŒLOßš›šŠâ_ŠD»32¢33£Â¾NI1’—–¶ÁÓ3$%%ìàA6“Y˜•µhkOéõ¢]»ÌãûcbøééÑ™™‚c©©„Ô¥˜?¾¥P(Ï篚ç=ùöplìRA:R«ÙB¡©¿%s6vw'H¥ T*ãããQpÕÞ_ÏÎÍhµ5MMi"‘ Ê­ZûîÝ JLübÏ^P\çìœþj ñ×ëÿ ;·lyzýú‚ ‡›Ûù¼¼7QnÕ®GCúH ¤Ä@úH ‹\gT ¯ýF‚ƒ?(øäûVC¾OA<r¹‰ô‘H‰áoMx3ð|-VIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_quadrule.png000066400000000000000000000025201454104675500242020ustar00rootroot00000000000000‰PNG  IHDR[$æBFbKGDÿÿÿ ½§“IDAThíšmLSWÇÕ"Œ"EËuAfdSY·d h\˜Ùõƒ€­PÉÄúÄ’I•u°e›2`ˆN ú!©F¢¨ñ%3Æ1Y² ¾¬.ÌÔ ¥T@í>8 ´¦ÒÞezÉùpÏsÏyžûÏsŸ{rΕX­V+"B°{ÈÁË„(¶€ˆb ‰µ€ØÜÐT*Uibf ˆÔ‘!T.gJd¤±¼ì>v̡͡ØS"#1z$ ‰RéÐ&–ÅQlq›Ø +.F©V3|êT¢SR(¨ªâÑãÇîraãʵk¶Ú(Q*û´W'O惥K9o2¹<—§qøt…ŽÎN¢’“‘ËdäkµŒ å¼ÉDNi)Gëë9ZVÆ!ž{‰ê ÂBB¸ßÙɆРèt\Ø»×c>Ÿ·ˆýõöíŒ ä×òr›¨ãÆŒafL ù±¶Mb¢;\ Ȩ‘#‘ËdÈe2 23KÛÝ»x̯«¸%Ý~>x\Æ.{}}|Ð¥¦òË¡Cv¯kÿëÚãljT©ðŽæY³ØºkV«•’šÞŽÇ?&†)‹súìY§ñxI¥ óòÂß×w@_ÎJÇÃGЗ” ˜9“ÀéÓIÏË£»§Ç5A0h±Û;:hmkC1 ý݈.<£~Þ7›Y Ó5q"¦È[³†Œü|þ¾w’š¾­¨`cF—÷ï'W£áó­[ûŒ7[,¶ÖÚÖFî¶m$Ïž÷°a.?Ï÷;vÐÜÒB½ÁÀÉÊJêÑ—”¸<Ï@ ºŒ<Ý—8±?«^ûx{snÏÁÁøúøØêïöv¶hµÌ‹ nÚ4ò22X¤×ÛÆ¿£V÷™o„ŸkkŸëy~Ú·“••Èe2BåròµZÖAfæsÍ×›A‹àïÏkAA445ñaT”½¡©‰ˆ°0»þÞ'^R)-­­¤çåÑa±0!<Üfû³µåøñ}ÆFŽ×çÚTWG¸B€¥«‹ÏŠŠPgeqªªjÀ˜–\»qƒà3ìžÑ¸¥f§Ì™Ã7åå<îµÌKÊΦæða¾«¬$).ÎÖÿt)xýÖ-[_wOñ™™hSR¨7(ÍζÙÂBB8ÛÜÜÇßù+WÆòŠ·7ŸÎ›Ç¹Ë—ílùîÏë£Gcª«ÃÚЀµ¡»§NqfçN‡÷»‚[ÄÎ]¾œ[wîðñÊ•;s†æ–Ɔ„ðÉúõ<èî&-!ÿf‡¡®Žûf3?TWÛÆ›-,]]H‡ÅÒÕÅ—eeÀ“e\úÂ…d³ÿÄ n޾͑ӧÉ)-u<0{f3N}÷').ÝæÍüqý:¯^eNzºÓû]Á-bûùúò[u5ïED°vÓ&”j55GŽðŲe¼Æ"½ž €¾Z±‚ÌÂBÞON&->Þ6~äðál\½š…ëÖ1!!p…‚¤¸8f­ZÅòùóÉÑhX¿e ásç’SZÊÎ œÆ*—3ÂÏÛííN}÷GŸ–Ƙà`b–,aZj*o*¸¡^HúøJ$O>uª>rË®_ÏÇü~éÑ“& z®ÿO—”*• £ÑØÛäù_/©ô¥úYˆQ"Š- ¢Ø"Š- ¢Ø"Š- ÷FêQge Ë C±ÿºyÓé?"®#–±ËlñwmÏ!f¶€ˆb ˆ(¶€ü3(JE‘1RIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_refine.png000066400000000000000000000015071454104675500236340ustar00rootroot00000000000000‰PNG  IHDRG$ÛÐ'ëbKGDÿÿÿ ½§“üIDAThíš_HSQÇ?ó/Ùü;ô.sAäcØèÉ…Úƒ†T ¾L¥Eó%F2_*¤L{P)[P4A!• ‚õ,åC˜&*¬rË?”ézÑåÔ™»SÁóûrþ|ïçœqïÆçóùlGoÔ~Wp‘rH9"|›åe6›7«pÊ•# &XG–¢`ÊÉÙËZö…Þ¡¡ }Aå˜rrp¶µE¤ ƒ„Æh Ú'·•)G€”#@9£1à:š›ËùÚZÞï8£¾­Ôü|>NN Ï‚½"èü¿¸N?ÀÏÅEîtuQÞØÈû¾¾s¿y<<|þœÏ/_’”DSMZ¥íÕ¶Uzj*ŠN‡¢Ó‘m0pïæMÆ&&pÏÍ…œ;çõ²ººŠA¯@—œLëj•¶k"væÄÆÄKbB‚¿íÏÊ Í6†âbÒ °´¶ò{y™ÜÊJŽ[·•Æh¤od„³¤äåq«³3d¦¨&gaiÉM»Ý´Øí\½t‰ø¸8ÿ˜ûOžðáË\¯=Â5:J³ÍÆÛ§O˜šÿbpWÝÝ´74Ðb·óÝãfªjrΔ•¡5™ÐšLdáà¶Å0æq?¶¦&²…ÓÙÙÜ­¯gÈåÚQþõòr’µZªJJøáõ† ÕäñN ,ýúEC{;eV+ozzüc&gfÐÌKILÜQ~fz:1ÑÑíád†B599OMi)…uuí™ Úí~‰žùyfÜîeFi4Û¶‡“òžª¤lƒ’–†waùÅEÛ•‹iìèàÓÔc\¶XxðìYX÷‰Dæ:““¥($kµ|[;8š¯]ã„^Ϲª*òª«ý?ùá‰Ìu4›_°kÖ–¯ùÂ…CõTn6›q:»ä vRŽ)G€”#@Ê år}|pŽRfµîe-Ž r¾ÎÎ ¿éä¶°eåÈ¿ëüC®RŽ)GÀ_Á¬iÚcíÒ±IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_refine_2.png000066400000000000000000000015071454104675500240550ustar00rootroot00000000000000‰PNG  IHDRG$ÛÐ'ëbKGDÿÿÿ ½§“üIDAThíš_HSQÇ?ó/Ùü;ô.sAäcØèÉ…Úƒ†T ¾L¥Eó%F2_*¤L{P)[P4A!• ‚õ,åC˜&*¬rË?”ézÑåÔ™»SÁóûrþ|ïçœqïÆçóùlGoÔ~Wp‘rH9"|›åe6›7«pÊ•# &XG–¢`ÊÉÙËZö…Þ¡¡ }Aå˜rrp¶µE¤ ƒ„Æh Ú'·•)G€”#@9£1à:š›ËùÚZÞï8£¾­Ôü|>NN Ï‚½"èü¿¸N?ÀÏÅEîtuQÞØÈû¾¾s¿y<<|þœÏ/_’”DSMZ¥íÕ¶Uzj*ŠN‡¢Ó‘m0pïæMÆ&&pÏÍ…œ;çõ²ººŠA¯@—œLëj•¶k"væÄÆÄKbB‚¿íÏÊ Í6†âbÒ °´¶ò{y™ÜÊJŽ[·•Æh¤od„³¤äåq«³3d¦¨&gaiÉM»Ý´Øí\½t‰ø¸8ÿ˜ûOžðáË\¯=Â5:J³ÍÆÛ§O˜šÿbpWÝÝ´74Ðb·óÝãfªjrΔ•¡5™ÐšLdáà¶Å0æq?¶¦&²…ÓÙÙÜ­¯gÈåÚQþõòr’µZªJJøáõ† ÕäñN ,ýúEC{;eV+ozzüc&gfÐÌKILÜQ~fz:1ÑÑíád†B599OMi)…uuí™ Úí~‰žùyfÜîeFi4Û¶‡“òžª¤lƒ’–†waùÅEÛ•‹iìèàÓÔc\¶XxðìYX÷‰Dæ:““¥($kµ|[;8š¯]ã„^Ϲª*òª«ý?ùá‰Ìu4›_°kÖ–¯ùÂ…CõTn6›q:»ä vRŽ)G€”#@Ê år}|pŽRfµîe-Ž r¾ÎÎ ¿éä¶°eåÈ¿ëüC®RŽ)GÀ_Á¬iÚcíÒ±IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_refinesche.png000066400000000000000000000026651454104675500245050ustar00rootroot00000000000000‰PNG  IHDRw$³#¥ÓbKGDÿÿÿ ½§“jIDATxœí›kL“WǨ±A´Sqé ¢c]¿ N"ˆ‚¢&\Œp€_ø8¢N¼ Cb'W… VÅ€ §Íp¨¨¸–¸e‘8–d&^‚‹ÌYöa³´P×âåÍûKΗsù?Ïyÿ}Ï9oûVÒßß߈9öÖ«Î@däÍ0¢¹B¦€XÞÀ2ØÊrñÎ0VƦÊåxº¹½Ì\DþÇΜ1ÚfÔ\O77Ê33G$!Ë!Q©Œ¶‰Ë²€Í0¢¹Æ"æJTªe¼‡ÅÄpµ±ÑdøÌL&z{p½¥eȽÄTº{{IÖhx/0©»;Óƒ‚Ø’ŸÏþ>“ÆKT*®·´˜Ç«ÂèêE©ÓjQN™Àƒžv–”Ä/••ÃŽ½×ÑAöÑ£4WU`;a)ÑÑfç´v×.š[[ù*+ G…‚_›šX—‘Áý޲SRÌÖݱزl?q"r;;ävv8;:òù† 445ÑÖÞ>ìØöÎNôz=Ž v66¤¯[gvN_Ÿ?Ï®õëùÐÅ…·mmñV«Ù›œŒ®¶Ölí7ÛsG[Y1fôh¬¥RCÝß“š“ƒ£¿?“æÌ!.=¿=Â#"€w|}g—e‰JEeM êå˱õòbÛþýÃjØZ[³¯¢‚ö ý½ÕjšOà±^Ïg¼»`>>DmÚDGW×€yœ»|×e˰õò"mß>“âJT*´:ïc?w.;‹Š8RU…Ó¢EØÌžÍ¦Ü\“tÌÅbæv÷öÊ­¶66çåÀØ1c }v<ȵ7¨Ój¹xàuõõ¤æäðáCÜ:{Ö¨~Yu5狊ÈJH`s^÷;:†Ô(MO秆¦øùÇGŽpóî]ƒ¦æða*kj¨ÊÍå\a!¿57³£°p@\]m-?––Rœ–Æ–ü|î™àÄ… ÔiµdÄÇ“š“ñӧ¹R^Îî„¶š”¿¹XÌÜBC‘yz"óôd²¯/ZŽíqqúŸ8ANJ Sårf:;“Ï™º:“ôW‡…a#“ÀŸÃjz¸¹ñsYßã­VSrò$ʀʪ«(:~œmkÖ0Ãɉ™ÎΔ¤¥1kÐAî“ÈHÆÇRàß-Ä”¹Ä‡‡#“J‰\¼€„ÈHdR)/Ybrþæb±U£N‡“£#½}}$deš˜È÷%%†>-·o£˜7oÀ8[kk“ô'ÛÛ`5jÔ€zcš=¢«­%Äϵ«+jWWR¢£ÙZP@âž=„ùûs£µçÿrpQ*qQ*Æup@"‘˜×X¾/š¿%°˜¹O3nìX¢—.eÞªUê';8P—gøttuq»­Í$Í·]Üá4õz=+6nÄU©ÄmútC_ ** c›[[™áäÀ•k×øæâE>5ô~Tóæ2:ÏcÄTòI“èì§ÇP·báB’4~¿y“†¦&ãâØ[ZjVcš2©”ˆÀ@Â’“ùöÒ%[Z¨¬©!!+‹ð€"IÍÎæjc# MMÄ¥§ÓÜÚjV\Kåo FÌÜ©r962™áË4…‚YQQx­\ixd2‡¡4¿Üº•ÐùóIÒhp &I£Á×Ýk×°1&†ùžž,X½šÙQQLS(LÎÇRs‰kòÉàäžì-!~~â¯BoOCBB(//ºI|ANȈæ Ñ\#š+`DsŒh®€Í0F¿~¬«¯'41ñeæ"baŒšûÇ;C¾+òú#.Ëæ™;Wü»®pï\#š+`DsÌ?ûöí§Â÷¶ûIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_refinesche_2.png000066400000000000000000000026651454104675500247260ustar00rootroot00000000000000‰PNG  IHDRw$³#¥ÓbKGDÿÿÿ ½§“jIDATxœí›kL“WǨ±A´Sqé ¢c]¿ N"ˆ‚¢&\Œp€_ø8¢N¼ Cb'W… VÅ€ §Íp¨¨¸–¸e‘8–d&^‚‹ÌYöa³´P×âåÍûKΗsù?Ïyÿ}Ï9oûVÒßß߈9öÖ«Î@däÍ0¢¹B¦€XÞÀ2ØÊrñÎ0VƦÊåxº¹½Ì\DþÇΜ1ÚfÔ\O77Ê33G$!Ë!Q©Œ¶‰Ë²€Í0¢¹Æ"æJTªe¼‡ÅÄpµ±ÑdøÌL&z{p½¥eȽÄTº{{IÖhx/0©»;Óƒ‚Ø’ŸÏþ>“ÆKT*®·´˜Ç«ÂèêE©ÓjQN™Àƒžv–”Ä/••ÃŽ½×ÑAöÑ£4WU`;a)ÑÑfç´v×.š[[ù*+ G…‚_›šX—‘Áý޲SRÌÖݱزl?q"r;;ävv8;:òù† 445ÑÖÞ>ìØöÎNôz=Ž v66¤¯[gvN_Ÿ?Ï®õëùÐÅ…·mmñV«Ù›œŒ®¶Ölí7ÛsG[Y1fôh¬¥RCÝß“š“ƒ£¿?“æÌ!.=¿=Â#"€w|}g—e‰JEeM êå˱õòbÛþýÃjØZ[³¯¢‚ö ý½ÕjšOà±^Ïg¼»`>>DmÚDGW×€yœ»|×e˰õò"mß>“âJT*´:ïc?w.;‹Š8RU…Ó¢EØÌžÍ¦Ü\“tÌÅbæv÷öÊ­¶66çåÀØ1c }v<ȵ7¨Ój¹xàuõõ¤æäðáCÜ:{Ö¨~Yu5狊ÈJH`s^÷;:†Ô(MO秆¦øùÇGŽpóî]ƒ¦æða*kj¨ÊÍå\a!¿57³£°p@\]m-?––Rœ–Æ–ü|î™àÄ… ÔiµdÄÇ“š“ñӧ¹R^Îî„¶š”¿¹XÌÜBC‘yz"óôd²¯/ZŽíqqúŸ8ANJ Sårf:;“Ï™º:“ôW‡…a#“ÀŸÃjz¸¹ñsYßã­VSrò$ʀʪ«(:~œmkÖ0Ãɉ™ÎΔ¤¥1kÐAî“ÈHÆÇRàß-Ä”¹Ä‡‡#“J‰\¼€„ÈHdR)/Ybrþæb±U£N‡“£#½}}$deš˜È÷%%†>-·o£˜7oÀ8[kk“ô'ÛÛ`5jÔ€zcš=¢«­%Äϵ«+jWWR¢£ÙZP@âž=„ùûs£µçÿrpQ*qQ*Æup@"‘˜×X¾/š¿%°˜¹O3nìX¢—.eÞªUê';8P—gøttuq»­Í$Í·]Üá4õz=+6nÄU©ÄmútC_ ** c›[[™áäÀ•k×øæâE>5ô~Tóæ2:ÏcÄTòI“èì§ÇP·báB’4~¿y“†¦&ãâØ[ZjVcš2©”ˆÀ@Â’“ùöÒ%[Z¨¬©!!+‹ð€"IÍÎæjc# MMÄ¥§ÓÜÚjV\Kåo FÌÜ©r962™áË4…‚YQQx­\ixd2‡¡4¿Üº•ÐùóIÒhp &I£Á×Ýk×°1&†ùžž,X½šÙQQLS(LÎÇRs‰kòÉàäžì-!~~â¯BoOCBB(//ºI|ANȈæ Ñ\#š+`DsŒh®€Í0F¿~¬«¯'41ñeæ"baŒšûÇ;C¾+òú#.Ëæ™;Wü»®pï\#š+`DsÌ?ûöí§Â÷¶ûIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_refinetype.png000066400000000000000000000022441454104675500245350ustar00rootroot00000000000000‰PNG  IHDRd$ðØobKGDÿÿÿ ½§“YIDAThcüÿÿ?Ã( 0 ´† ,Àh`‘X9ŒŒŒåŽA ËôÑ”E`Á’·ÔÓ£¿S8~éÒ“—/ѱ–¥žÞªînº8ið‚°ÒÒÕ»w£ ŽfCÀh`‘F‹@N`1À·……}rò•;wðk)èî´µe``¸ûø1£Iܹ֭ÙF8ºxëާ`)à‰Ç-R”–f``øüí[ëìÙáeeW×­Ã¥øíÇ“—/°mƒ_ERIvù;8¼Ø»—áþÓ§–qq6ƒ°€yŽ'X¢‚‚â âÂÂ]……bŽŽo>|ÁáúŸ>ýû÷OVB‚A˜Ÿ¿=/$»8ØÙ9ØÙ¾|û±‘<7S¨Pf±²°°±²òrqA¸þþ­ž2EÖÝ]ÈÎ.§½ý×ïß±± ’.. ¨ÙÑÀ`ÝÞ½F66ͳfáÒŽËÞ¼ÎΔÆFûë÷ïÜnÞ„˜¿õðaí  1GÇœööŸ¿~‘d,@f`}ýþ‚ž¿yS7mZ´—;DªgáÂ[_´èмyÇ/]ªž2åÄâÅ Ï÷ìÁ4gåÎûçÌé-.®›6íÝÇXµãrC¨«ëÆýûÿþûÇÀÀ°ñÀ%uuˆÔäåË7Nœ¸eòä]ÇwÌ›G’±x™¥ÆciÉci)åâ²hóæ–œ¸Ôü§TTȈ‹ë¨¨tì>~9Yááü<<ñ~~ ï?}"I»µ+ Ë¡³g–mÛëã—ê)*R‘•5ÓÑiÉÉYºm©®ÂÈ,³îlÞ¬,+ËÀÀðýçÏâÞÞ°ÒÒ# @¤¿x!áì W)ÀË‹Ç)QQff¸ñÚ™˜˜‚œ×íÝ«§¦¶çäÉ55p)U99CSQÒk!ÉU¸™œììIΩ©p)1±Ó¦A‚òã—//Þ¼Á£ cœƒ$í¡nnQZJJ6††2ââpñÛ騨000ÜzøPJLŒTcqº– =h@\HèÓׯªŠ!ÊÓ³l„ûOŸ^»wÏ;'gÒ²e$™F’v[Cÿÿþ5Íš…œò»ºî>~|æÚµªÉ“£½¼(wP!°dÄÅùyxÞ~üáV§¤ÈIHXÅÇÛ$$¨ÈÊv’dIÚ!9ñÓ—/ANNÈâ1ÞÞ®^ÙÙîVVUÉÉ”» ‘· ƒ¡®®ChÔ¡fʔϞ-ikƒpï>~¬âëûÿ …: “Á¿Ÿ¿~ÝútÞ† )AAô±qÖÉË—M¢¢’LLà‚|<<¡¡4²‘ÒÚp±ñÛƒÑE§WWÓÈÆ!œ²èF‹0X$€ÑÀ"`igN…1 M…¡„f`d0L¥ôŒ£ë³ˆ£)‹0X$€ÑÀ"ÃsèPlÔIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_rg.png000066400000000000000000000057201454104675500227750ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ …IDATxœíÝ{LTgð‡Vn#« 7)]¤C¬—m·ZªmbSQ³Cc4¥ ­ -KŠ$¦6vÓ,Ù„6JêX‹¶1M£¶®mŠf¹©ÝP«1a# Ã@áÙ?,g™â88yÉIœoΜyÏ÷=søæ8sƇ$!„Š<æí„¸_Z¡:Z¡:“ì®_¿ŽsçÎy£!èt:$''Û6ÒNyy9È"˸XRSSí#J‡#í9© ¼mÍš5NÛeN+TGB+TGB+TGB+TGB;J>>>6KHHV­Z…_~ùÅå:Ã(//q††˜L&ìØ±111Ðh4ˆ‹‹ÃÎ;Ñßßïví}}}ؾ};’’’0eÊ,\¸………°Z­€ÖÖV¥FWûÞÚÚêöó{š×BûóÏ?C«Õzt›mmm³®®®FGGnܸ3gÎÀb± --Íé:ö ¬ZµJ¹]]] 6ë$$$ ++ uuu8zô(®^½Š½{÷âóÏ?‡Á`p«æÞÞ^ÌŸ?uuu(**Â… ““ƒ²²2¤¤¤`ppðžÛ())y ±òøX»:O;ÖZZZ<ú<\°`°¥¥ÅcÛâl»¿þú+°§§Çå:®¸ÚÿÖÖÖÚ´={–QQQnÕm0øÜsÏÑjµÚ´›L&FGGsÏž= {în?55ÕéyÚ>Òýi9qâŠÌÌL , rss¡Óé0mÚ4dffâ·ß~Ã3Ï<ˆˆˆP¶uìØ1$&&"00³gÏÆÁƒV«ùùùˆŠŠBhh(ÒÓÓÑÝÝmSÇŽ;°`Á‚Q×öÖ[oaÓ¦Mʺ&“ “'OF}}ý¨÷ýñÇWöÑS‚ƒƒññÇ£««Ki{öÙgqåÊ£ë‹á<ˆ¼¼<<ö˜íPk4 ¥àСCˆEhh(¶lÙ³Ù Àvzàjûì3TTT`É’%˜5k–§ºÃ-ƒƒƒX¿~=š››mÚSRRpçα/œIKKî]»Îôõõ¡¨¨«W¯VÚìû)**Êa{®Æó~ëz ö)v÷H»lÙ2¶´´°®®ŽqqqÌËË#I¾ÿþû|íµ×ØÖÖÆ‹/rñâÅܲe‹ò¸Û·o“$Íf3xàÀ¶··³¸¸˜ìëëc~~>õz=›ššxñâE.Y²„›7ovZœL\ÕfµZÆððp~úé§6ÛÙ³g»»»n׬®®fGG‡Ãâªß쥧§3>>ž_~ù%F#=ÊE‹1;;›$ïÙöu÷ôô0>>žK—.åW_}E£ÑȪª*&$$ð•W^±©eùòå6ýôÁ8컫ñ©.û±­1Ÿ”––2::šZ­–YYYÊŸšþþ~nÛ¶ááá azz:{{{i±X˜œœÌ   e[eeeŒŽŽ¦¿¿?xüøq’wOg Μ9“ÁÁÁ\¿~=oݺå´g¡uUI¾ùæ›Ôh4Êi+gÛqvÛÕs»Z\õ›=‹Å¼¼<&&&200³gÏfnn.FÕÎê4™LÌÎÎfbb"'OžÌ¹sç²  €f³Ù¦–ÊÊJÆÆÆR«Õòí·ßVžsø6]çHu9ëÑóÐŽG£©-77—iii©"uÍ v,¸ ­ËÏÓ>êÐÞÞŽÒÒR:tÈÛåŒ[___/WòüFlÊ”)ÈÈÈðD-7Rmµµµ˜?>6n܈çŸþᦗ.]BJJ 6oÞ Nçír>¿þX·n|sAxÝÐ7*++mÚåS^Bu$´Bu$´Bu$´Bu$´Bu\ž§éëB<,©©©m§¼ä²Hž±nÝ:lÛ¶Íñ’>â¾8»,’Ch…gøøø ¼¼k×®õv)™Ó Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ‘Ð Õ™°¿¹0Äþ*ÓžTSS3&×DKNNöúožyÓ„¿,’/´WQQ¡\Ú}"’éP ?=’üÔSxgÃo—áRMc#þvà€·Ë$´¿›†5/¾èí2Ä(Èô@¨Ž„V¨Ž„V¨ŽÌiÝà“”ds[€ù øGNæÆÆÚÜw¥½9ÿ;þuþ<úúû1ïÉ'±këV,¶Û†=9Òº©zÿ~tœ>ŽÓ§ÑPY‰˜™3±nûv›un›LXºi|||ðÏ?DÍøÓÓOãÅ7ÞÀ¿üÑK•«Ÿiݤ AØô逰éÓñ×wÞAèÒ¥èìêÂŒà`À_Š‹‘ôÄ8TX¨Ìò)Z7™Ìf˜Ìf@Ʉ½{‘¶r%üýüÜ\ioÇcbl~~ˆG?E¯6Z7éí~jijP.UU)·ïX, ëà Òd÷{X¬¯Û"QòFÌM-_|Ö׃õõè«­Åú•+±Ö`PîŸ6u*¦OŠ&£QiZ¿ûûï½Qò#CBëþþØøê«6€Õ))ؽoŸÃúÇ¿ùæa•öH’ÐzHØ´iè1™ÐÛ×§´íÌÈÀùK—ðç÷Þù†üçÊ>ŒâÇá;Iffî’ÐzȬ°0L »»•¶H­I¤fgcyFFœúä›7hâþÈËÝ ÎÞ@ùøø ë»ïÚg††âHQ‘C{}EŘÔ6È‘V¨Ž„V¨Ž„V¨Ž„V¨Ž„V¨Ž„V¨Ž„V¨Žœ§ý]åÉ“ßHã“i…êLø#­//¤›àŸÅð×òê#Ó¡:Z¡:“ŒÝZ…ÿÝ~ÚÓ…[IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_scale.png000066400000000000000000000017201454104675500234500ustar00rootroot00000000000000‰PNG  IHDRA$Y¬ÀûbKGDÿÿÿ ½§“…IDATX…cüÿÿ?ÃLí*€Q? ð ´[H«V­‚;{8Ä ¦Œ¸¸¥žýB xòòåñK—бøÁROoUw7]œD2X½{÷ñÒR4Áá–Fý089~øúý{ù„ JÞÞ\ææj~~õÓ§ÿøù“$î>~Ìh`@†ÕX–>>6[pp0Ö¬YƒŸþÙå1n`0ÜSWW“É„ììlÌœ9ˆÅûï¿þþþ×Þ×ׇݻw#11S¦LÁ‚ PPP«Õ hnnVjtÕ÷æææ¿¿§y-´7nÜ@HHˆGÛliiF£yl\UU…ŽŽüòË/¸pá, ÒÓÓc¿Àš5k”ÇUUU`sL||<²²²P[[‹ãÇ£µµÄ™3g ×ëGTsoo/æÍ›‡ÚÚZâòåËÈÉÉAYYRRR088øÐ6Š‹‹G5WŸkW×i7£ÑèÑ÷àüùó €F£ÑcíqÖîíÛ· €wïÞuyŒ+®úÌšš›}/^dTTÔˆêÖëõ|î¹çhµZmö›L&FGGóÀŸ {#m?--ÍéuÚQŸi‡¾´|ùå—ˆGhh(233100°X,ÈÍÍ…V«Å3Ï<ƒÌÌLüþûïX´h ""BiëÔ©SHHH@@@bbbpäÈ€ÕjE~~>¢¢¢ŠŒŒ twwÛÔ‘ùóç»¶íÛ·cóæÍʱ&“ “'OÆ•+W†Ý÷‰'*}ôFƒ’’tuu)û–.]Š›7oÞX<èÈ‘#ÈËËÄ ¶S½^¯Œ1=z³fÍBhh(¶mÛ³Ù Àvyàj>ÝÕål®GÅ>Åz¦ú¥¦¦²©©‰555œ={6óóóI’LKKc[[˜””ÄwÞyÇáÓ×ÛÛËI“&±¸¸˜,--¥¯¯/M&?ùä&$$°±±‘ \¸p!õz½òÚÓ§OS§ÓÑl6ÛœíÜÕvñâEN›6‹…$YVVÆ9sæ¸ì'ÖÕÕ±··—===lnnæÚµk¹`Á§ÇØo®ÆÍ^UUu:¹jÕ*îß¿Ÿ·nÝRžØX<¨««‹ØÙÙéôùK—.1<<\©å…^`SS¿ÿþ{ÆÆÆ2''Gé×ИºšOwuyúLë±Ð644Ø´1{öl’dll,;::”çÎ;GNçБîînúûû³¨¨ˆ&“‰äý 2..ާNR޽~ý:OžÝÕ5fCÛß߯쫯¯g@@I2 Àa5ÓŽüðÃܸq#§M›ÆÔÔT^¸pAi£±±Ñéû/^¼˜EEEÊmèl700ðÐÚÞ~ûmfff²³³“~~~lkksÙÏ'n4Ç qÖ“ÉÄcÇŽ9¬?óóó©ÕjIº g"""øÕW_9}®¸¸˜/¾øâCÇéÁ~¹šOwu¹5í¦¦&åß?ýô"##‘‘‘0àýºººP]]íðúþþ~˜Íf|þùçøõ×_ñÆo`åÊ•èîîFdd¤²¦€ºº:ìÝ»PSSƒ¬¬,!(( Óé››ûÐÚÖ­[‡'N ¼¼K–,ÁŒ3<5#288ˆ 6 ±±ÑfJJ îÝ»nÇ™ôôt|øá‡W úúúPXXˆµk×*ûìÇ)**Ê¡=Wóù¨uŠ}ŠGz¦]¾|9F#kkk˼¼<’ä{ï½ÇW^y…---¼zõ*/^ÌmÛ¶)¯ëéé!IšÍfúûûóðáÃloogQQýýýÙ××Çüü|êt:644ðêÕ«\²d ·lÙâ´8Y¸ªÍjµ2,,Œáááÿü󬬬dSSOž<Éøøx¾üòË6µ¬\¹Òfœ>úè#‡¾»šOwuÙÏõp=öåAii)£££¬¬,åKM?wîÜÉððp3##ƒ½½½´X,LNNfPPÒVYY£££éççÇøøxž>}šäýËYz½žÓ§O§F£á† xçΧõ8 ­«ÚHrëÖ­ T.[9kÇÙcWïíjs5nö, óòò˜À€€ÆÄÄ077—à gušL&îÚµ‹ œâ‘8»-’Ch…gøøøÀ`0àÕW_õv)㎬i…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êHh…êüiÿæ‚=û»M{BuuµGœœìõ¿u6Èm‘þ †î•——+·tÿ3“åPYØIž;Û¸ÑÛe(ªëëñ÷ǽ]Ƙ"¡µ3#, ëV¬ðv YÕ‘Ð Õ‘Ð Õ‘5í(˜Ìf|PR‚ŠsçÐÑÙ‰aaøëK/!gÓ&øûùÁPY‰×²³]¾þJy9t±±O°âñAB; YŒ›íí8¾o´áá¸ÞÒ‚í……øow7ŠÞ}k–-CÇùó€·o#ùõוÇ0U£ñVéª&˃Q8õÍ7øxÇü%.Ó4,MJÂ?³³ñ¯o¿øûù!lêT„MŠà`P‡MЧ&Nôfùª%¡ÍÓO£ä‹/ÐÕÓ£ì[𔄛gÏz±ªñOB; G pùÚ5L_±«33ñ²2Üþí7o—5îIhGaÑܹøÑ`À>û K“’pèÌD¯ZCe¥·K×$´#Ô×ßCe%H"éÙgñî¦MøÑ`@îæÍÐú©·Ë×$´#488ˆ 99h4mö§,Z„{‹—ªúsÐŽPP` 6®^õÙÙø÷wßÁØÖ†çÏc×¾}H_µÊÛåkrvîÙƒJJ°{ÿ~[[Š×RS‘÷æ›Þ.m\“ÐŽÂÄ °gëVìÙºõ¡ÇÆhµà•+O ªñO–Bu$´Bu$´Bu$´Bu$´Bu$´Bu$´Buä:­Šsçà“˜èí2„r¦ª#gÚ?¨ávCZ­ÖÛ%Œ r//¡:²<ª#¡ªóÏߘUˆÇè†!±H4çIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_statetype.png000066400000000000000000000025071454104675500244070ustar00rootroot00000000000000‰PNG  IHDR]$d>¡bKGDÿÿÿ ½§“üIDAThí™kLSgÇŸB „;(Êt(ƒtP · A¡Üª™k,8jD‹ˆ ´É‚Y(‰@aê€P:e8V˜Žddܬåâ˜ãR¨-£ìÉMSNËZ6.Ëù}zÏsþ}ž'ÿ¾ï{òžƒ[__Œ ˜ít»Ìt0_ô°®ÅN÷²Ã…BØ|A¿1äJ$†P(ÛßÊNñrvV24¤Dñ%„B–”lKK»‚&±X’­ÄÖ:˜/è`¾ ƒ²¿lʲBqµººI,ž™›s%?‹ËMMµ´°Øz7§ØìñA¡ðc/¯­çÿç˜âKFQÑÄÔÔw¥¥$'§_ÇÆ.òx¯øθL˜œü{O¾n*ø4"b¦« Q†œ>Œ€`ggBŸ[Á”uÔÒÝ]”™éðà»vvaTj›ý ·ÔjõÜü¼n*°´° DÁÁÞ1‘@À›››ÐçV0Å;›j‘h~i ¹ £R'>€à”x/* ‰7?zDa2­‚‚Þå74lüµ¶–'bbö‡‡³¸\ÕꪾŠy¼´‚d¼¬P¼<øôé¨TŠóóû¾¯Ï‡Áp8£‚ƒ«D"™juõ³¬,aI =,L©RÝjnÞ˜ÊÙÑ±ãÆ O äò™¹9u™ÑÑIÎG‡ýý]‰DMü·/|Édx69éìèhlZ}½Ž¬­¬RèôD6û‡'OžK¥÷ºº¾,-MŽ×ä++°¬P(”J¼¹¹B©üª²–VV´—SV6.“ŒÑY¬ŠúzuÃüý×Ôê«7oj/"È,.•J¹Âç#m•V¦ì/· ¢£sÊÊ('O攕EfdÀ..! ò¸±·µ-ÌÈ8Åfû0ž$RR\\ìùóÚÈKKssr =sæðÙ³d©8+ËP£ffŒÈÈE¹œqô¨vü :–žáBLhè•sçŒM«œöë(Lmwž§ó‚‰©©o ‘ËQ©”|üøúààÓ6‰Å ÙÙ  ™L&Üç#¥J5.“Õ´´¤1ÛSqoøÒ?<””zâDD@€&hkmþöïý×1å|´ý„:ôGo¯NÐÁÞ¾2/ï?ª¸7æËöƒù‚æ :˜/è ì»’¡¡„ ïÇÿÇ §*]°ï°ï›ƒÃ¦ *Ø|AóÌtþ¹]-X<AIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_stop.png000066400000000000000000000015271454104675500233530ustar00rootroot00000000000000‰PNG  IHDR<$ZÎÓbKGDÿÿÿ ½§“ IDATX…cüÿÿ?ÃPLírÀ¨£éX9ŒŒŒå‚9ï ý†qqK==ú;+8~éÒ“—/ѱ8ÚROoUw7]œD„•–®Þ½MpH&QGÓ ãè¯ß¿—O˜ äíÍen®æçW?}úŸ?©î2<€Gçvtœ¾zumoï£;ç64l:p ´¿ŸáþÓ§¢Tv 6@Ž£7ìßß‘Ÿo¨¡!" `kd4©¼|óÁƒ ÿþý{óáµ]ˆãh^Þ™kÖ|øüµ52z°};ƒEl,ƒ¤‹ Düã—/‰uu¢²îî¥ýý?ýºûø1£ÁÖǵƒ‚ÄsÚÛþúE'G/ko?{íš´««wNÎÄ¥KŸ¾z?±x1Ãó={ Üœöö'/_žZºtûÔ©;ëœ?">yùò'n™…pï>y"-&aß~ô¸õð¡L¶ŽæáâŠõö//ßqôèÇ×íÝ[ÜÛíåWðåÛ7fæpw÷¼ŽŽÏž]½{·fÊ”ooˆ‚ü®®»Ÿ¹v­jòddÄ, &‚`nccÓÌ™e&ÜyôHJL,Âݽ.=AAZÚROOÒÅåó±c S*+ó»ºL£¢ØXY£¼¼*““¿xÁÀÀãííš‘ñåÛ·ªäd2ÀˆÜ¸†tB]]iÔÊ»ûø±Š¯ïÿ ˆ×oå ùN]ÍÇÓJ¹9tu´¨ àôêjÊÍMô£Ž¦ÀRNÎ!wb:zp‚!_¹0ŽŽOÓ Œ:š^à5VÁ>4’IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_stop_2.png000066400000000000000000000015271454104675500235740ustar00rootroot00000000000000‰PNG  IHDR<$ZÎÓbKGDÿÿÿ ½§“ IDATX…cüÿÿ?ÃPLírÀ¨£éX9ŒŒŒå‚9ï ý†qqK==ú;+8~éÒ“—/ѱ8ÚROoUw7]œD„•–®Þ½MpH&QGÓ ãè¯ß¿—O˜ äíÍen®æçW?}úŸ?©î2<€Gçvtœ¾zumoï£;ç64l:p ´¿ŸáþÓ§¢Tv 6@Ž£7ìßß‘Ÿo¨¡!" `kd4©¼|óÁƒ ÿþý{óáµ]ˆãh^Þ™kÖ|øüµ52z°};ƒEl,ƒ¤‹ Düã—/‰uu¢²îî¥ýý?ýºûø1£ÁÖǵƒ‚ÄsÚÛþúE'G/ko?{íš´««wNÎÄ¥KŸ¾z?±x1Ãó={ Üœöö'/_žZºtûÔ©;ëœ?">yùò'n™…pï>y"-&aß~ô¸õð¡L¶ŽæáâŠõö//ßqôèÇ×íÝ[ÜÛíåWðåÛ7fæpw÷¼ŽŽÏž]½{·fÊ”ooˆ‚ü®®»Ÿ¹v­jòddÄ, &‚`nccÓÌ™e&ÜyôHJL,Âݽ.=AAZÚROOÒÅåó±c S*+ó»ºL£¢ØXY£¼¼*““¿xÁÀÀãííš‘ñåÛ·ªäd2ÀˆÜ¸†tB]]iÔÊ»ûø±Š¯ïÿ ˆ×oå ùN]ÍÇÓJ¹9tu´¨ àôêjÊÍMô£Ž¦ÀRNÎ!wb:zp‚!_¹0ŽŽOÓ Œ:š^à5VÁ>4’IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_stop_3.png000066400000000000000000000015271454104675500235750ustar00rootroot00000000000000‰PNG  IHDR<$ZÎÓbKGDÿÿÿ ½§“ IDATX…cüÿÿ?ÃPLírÀ¨£éX9ŒŒŒå‚9ï ý†qqK==ú;+8~éÒ“—/ѱ8ÚROoUw7]œD„•–®Þ½MpH&QGÓ ãè¯ß¿—O˜ äíÍen®æçW?}úŸ?©î2<€Gçvtœ¾zumoï£;ç64l:p ´¿ŸáþÓ§¢Tv 6@Ž£7ìßß‘Ÿo¨¡!" `kd4©¼|óÁƒ ÿþý{óáµ]ˆãh^Þ™kÖ|øüµ52z°};ƒEl,ƒ¤‹ Düã—/‰uu¢²îî¥ýý?ýºûø1£ÁÖǵƒ‚ÄsÚÛþúE'G/ko?{íš´««wNÎÄ¥KŸ¾z?±x1Ãó={ Üœöö'/_žZºtûÔ©;ëœ?">yùò'n™…pï>y"-&aß~ô¸õð¡L¶ŽæáâŠõö//ßqôèÇ×íÝ[ÜÛíåWðåÛ7fæpw÷¼ŽŽÏž]½{·fÊ”ooˆ‚ü®®»Ÿ¹v­jòddÄ, &‚`nccÓÌ™e&ÜyôHJL,Âݽ.=AAZÚROOÒÅåó±c S*+ó»ºL£¢ØXY£¼¼*““¿xÁÀÀãííš‘ñåÛ·ªäd2ÀˆÜ¸†tB]]iÔÊ»ûø±Š¯ïÿ ˆ×oå ùN]ÍÇÓJ¹9tu´¨ àôêjÊÍMô£Ž¦ÀRNÎ!wb:zp‚!_¹0ŽŽOÓ Œ:š^à5VÁ>4’IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_stop_4.png000066400000000000000000000015271454104675500235760ustar00rootroot00000000000000‰PNG  IHDR<$ZÎÓbKGDÿÿÿ ½§“ IDATX…cüÿÿ?ÃPLírÀ¨£éX9ŒŒŒå‚9ï ý†qqK==ú;+8~éÒ“—/ѱ8ÚROoUw7]œD„•–®Þ½MpH&QGÓ ãè¯ß¿—O˜ äíÍen®æçW?}úŸ?©î2<€Gçvtœ¾zumoï£;ç64l:p ´¿ŸáþÓ§¢Tv 6@Ž£7ìßß‘Ÿo¨¡!" `kd4©¼|óÁƒ ÿþý{óáµ]ˆãh^Þ™kÖ|øüµ52z°};ƒEl,ƒ¤‹ Düã—/‰uu¢²îî¥ýý?ýºûø1£ÁÖǵƒ‚ÄsÚÛþúE'G/ko?{íš´««wNÎÄ¥KŸ¾z?±x1Ãó={ Üœöö'/_žZºtûÔ©;ëœ?">yùò'n™…pï>y"-&aß~ô¸õð¡L¶ŽæáâŠõö//ßqôèÇ×íÝ[ÜÛíåWðåÛ7fæpw÷¼ŽŽÏž]½{·fÊ”ooˆ‚ü®®»Ÿ¹v­jòddÄ, &‚`nccÓÌ™e&ÜyôHJL,Âݽ.=AAZÚROOÒÅåó±c S*+ó»ºL£¢ØXY£¼¼*““¿xÁÀÀãííš‘ñåÛ·ªäd2ÀˆÜ¸†tB]]iÔÊ»ûø±Š¯ïÿ ˆ×oå ùN]ÍÇÓJ¹9tu´¨ àôêjÊÍMô£Ž¦ÀRNÎ!wb:zp‚!_¹0ŽŽOÓ Œ:š^à5VÁ>4’IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_svd.png000066400000000000000000000062631454104675500231640ustar00rootroot00000000000000‰PNG  IHDR­[dGbKGDÿÿÿ ½§“ hIDATxœíÝ}LTWð-%ƒtdñƒÐ ÂR‰J* (˜º« ­ÄÒMÕBu£È"b›JÙmW·¤)&J‚u ~¶Ö ÒZ6+PÊV¾$+*¢Å.Y†©3ó̌8€WÞ_r9sçÌ{Î}ær¸""0&"ƺƞ‡–‰‡–‰Î † mmm¸zõêXÔ˜™L†°°0ýF2 —Ë o¼=[||¼aDÉèLÛ/*°±–`²×´Lt8´Lt8´Lt8´Lt8´²±±ÑÛ\\\°råJܾ}Ûì>7ËåƒîSSS¥R‰ôôt̘1‰¾¾¾Ø³gúúú†]{oo/vî܉   8;;#$$ÙÙÙÐjµ€ææf¡Fsconnöë[Û˜…öæÍ›pss³jŸ---J¥#6ÁåååhooÇÏ?ÿŒ+W®@£Ñ ))Éä>†¬\¹Røº¼¼ôöñ÷÷Gjj*ªªªpòäI´¶¶âðáÃ8wîÒÒÒ†UsOOæÍ›‡ªª*äää ºº»víBaa!¢¢¢ Óé†ì#//祈•Õµ¹ë´#M¡PXõuÔj5ÍŸ?ŸB¡°Z¿ýLõ{÷î]@ÝÝÝf÷1ÇÜø]\\¨²²R¯­¬¬Œ¼½½‡UwZZ…‡‡“V«ÕkW*•äããC‡²ú±04ÜþãããM^§}ê3mÿ·–óçÏÃßßîîîHIIZ­h4ddd@&“aòäÉHIIÁ¯¿þŠ <==…¾Îœ9ƒ€€888`æÌ™(((hµZdeeÁÛÛîîîHNNFWW—^ééé˜?¾Åµ½ûî»Ø°aƒ°¯R©„££#®]»fñØ'Nœ(ŒÑZ¤R)<ˆÎÎN¡mñâŸuëËæb ‚‚dffbÂýC-‘H––&Ì1?~³fÍ‚»»;¶lÙ•J@y`îxV—©cýT Sü¤gÚþwQLL 555Qee%Íž=›²²²ˆˆ(;;›âããéÎ;TWWGÁÁÁ´cÇ£w_OOMš4‰òòò¨½½òóóÉÖÖ–”J%}ôÑG@õõõTWWG¡¡¡”––&<÷ìÙ³H*•Jïl7XmeeeäêêJ†ˆˆ iΜ9fÇ €jjj¨§§‡>|HÍÍÍ´zõj 1¹áfnÞ •——S`` I$Š¥P[[›ðøPs1Pgg' ŽŽ“_½z•<<<„Z"##©©©‰~øáòõõ¥]»v ãêŸSsÇs°º¬}¦µZhëêêôú˜={6ùúúR{{»ðØ¥K—(00Ðh ]]]dooO¹¹¹¤T*‰èqu:ùùùÑ™3g„}éôéÓDDÔÚÚJ2™ŒÈDhMÕ¦ÕjÉÓÓ“¾ýö[""Š‹‹£œœ³ã„Á/Nš4‰"""¨¥¥Åì>7sófŠN§£êêjÊÎΦ   ²µµ¥'N :†êëëM¾þÂ… )77W8£õŸíÔjõµ½óÎ;”’’BdggGwîÜ1;ÎîiöégjüJ¥’Nœ8a´þÌÊÊ"™LFDƒÏ…)žžžtùòe“åååѲeˆœ§ã2w<«ë™[Óökjjþ}ãÆ xyy¼¼¼ P(@ß èììDEE…Ñóûúú R©pôèQÜ¿o½õ¢££ÑÕÕ///aM555Ø·o ²²©©©prr‚““ 00CÖ–€S§N¡¨¨‹-´iÓ¬5âÓé°víZÔ××ëµGEEáÑ£G0è\˜’””„÷ßßè*Aoo/rrr°zõj¡Ípž¼½½ú3w<Ÿ´®§b˜âáži#""H¡PPUUùúúRff&íÞ½›V­ZE---ÔÐÐ@ .¤-[¶Ï{øð!©T*²··§cǎѽ{÷(77—ìíí©··—²²²(00êêꨡ¡-ZD7n4YL,ÌÕ¦ÕjiÊ”)äááAGŽÑëçСCÔÕÕe²_sPyy9µ··mææÍPrr2ùùùÑ… ¨©©‰NžR©TzµÓ¬Y³ÈÍͶnÝ*¼æÀ>ÍÏÁê2u¬-1â¡}YR[FF%%%REâdÉv$˜ ­ÙÏÓ>ïÔj5îÝ»‡üü|?~|¬ËyfÕÖÖlmmǸ’ÿ{êÄœ±iÓ&kÔbuƒÕVYY‰yóæaýúõxõÕWG·0‘¸~ý:¢¢¢°qãFÈd²±.G`óÛé_PTT„ÄÄDþÍ6æús¡¸¸X¯?åÅD‡CËD‡CËD‡CËD‡CËDÇìuÚÁ~ý‚±ÑoÔftÉ‹o‹d‰‰‰Ø¶m›ñ-}Ø1u[$£Ð2ë°±±\.Çš5kƺ”ç¯i™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èph™èŒ»¿¹`xWé‘TQQ1*÷D ó¿6šÆÝm‘žÇë ·zxyÀDgÜ-ú…Í‹?­[7Öe [Em-þvìØX—1&Æmh§M™‚„¥KǺ 6 ¼<`¢Ã¡e¢Ã¡e¢Ã¡µ€R¥Bú˜Ih(|_{ {>û }j5àS¹Ó¢£Mþ•Ëß-_ŽOår€MPÞæ‹äÝ»ÑÑÙ9ªã;­R?üU 8ùñÇh-)Áá¬,œ»riû÷–.E{G®ÖÔè=ï_¸sÿ>VGF måG¢½´w/]Âçgîž¿þ:ºzzFuLbÆ¡µÀ™ï¾Ã‡[·â÷~~p•J±88Ÿ¤§ã«ï¿¸OžŒÈÐP]¼¨÷¼S¥¥†‡««Ðææâ‚)/½/77¼:oNïßS§bAÁ¨ŽIÌ8´¾ø"~ù%:>ÚãÖ… Â×o,_Žâ‹¡Óé„¶S¥¥HŒ‰²ÿM 8_VfÝ¢ŸcZ ÏÎFõõ똺t)âRRð÷ÂBÜýå½}VEFâ¿ÝÝøçµk€ߺ…·ocÕ€¥9³§OGs[ÛˆÔþ<âÐZ`ÁܹøI.Ç?>ÿ‹ƒƒqäÜ9øÄÆB^R"ìãì舸ŋ…%©ÒR,™?î“'Ùÿ¸úð‡ph‡ÐÛ×yI ˆÁ/¿Œ?¯_ŸärdlØ ü ÖïeËðååËÐét8UZŠ5, @ÑÚŠ™ãèSZO‹C;N‡µ»v¡^¡ÐkZ°4½¶ááPªT(üæÔܸ?FDXôŸ#.<Üj5?ïÆíg,å$‘`]\ÓÓ±ÇÌš>µ7nà/GŽ )6Vo_{;;üaÉlûë_W©Ô¨¿ÿH&“u £jÜÝË‹‰/˜èph™è¼`ônØÊ˜ü (Zt§_IEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_sys.png000066400000000000000000000015271454104675500232040ustar00rootroot00000000000000‰PNG  IHDR8$Sðn©bKGDÿÿÿ ½§“ IDATX…cüÿÿ?ÃPLíbÁ¨C© X9ŒŒŒå¬9ÿ Í…qqK==ú;Ž_ºôäåK4A,µÔÓ[ÕÝM'aa¥¥«wïF2Q?êPjrúõû÷ò ”¼½¹ÌÍÕüüê§Oÿñó'Õ]†°d&‚ ·£ãÁ³gk{{e%$®ß»—×ÙùîãÇÉTw2 'D7ìßß‘Ÿo¨¡!" `kd4©¼|óÁƒTw Ç¡¼¼ÓV®|÷ñ#„kkdô`ûv†¼ÎΔÆFˆà×ïß¹-,.ܼÉÀÀ°aÿ~ÝNsseŸ%[·ÒÏ¡+:;¯Ü½+íææž™Ù½páÇ!â¡®®÷ïÿûïÃÆ”dd ÔÕ¿~ÿ^V–ñ`Û¶šÔÔ¤úúo?~ÐÉ¡f::§—.=¹x±‡µõ¦Ôüüz-b``°60`ea9tö,òmÛb}|þþûÇÄÄôûÏ^nîDÿ÷‡s²³Óáß~üX¹sçÿÿÿõÔÔ cbÏŸ¿°¹¹rÒ¤¯ß¿3119;¯Û»÷íÇ{NžŒòôd``àãæ>2þ©+Wä=<<²²Î\»F^Ó‡d‡þÿÿ?ª²òÒíÛp7KË¿ÿþAb<ÔÍmÝÞ½«vî´14”g``øñóç÷Ÿ?µ´¼Ü·/ÁÏÏ-#ãã—/ôp(7'g¬·wXiéÖÇï?}zöÚµ”ÆF_;;>nn[Cÿÿþ5Íš‰wpÍÈX²uëËwïÞ|øÀÄÄÄÆÊJ‡200ÌklŒñö®žFЦ²ËÚ鎀î. ²bÁŠ"H¸D…ìw¸› ÄÅ :™¹ŸÉ÷œßÉÉ9¿o~¿û›äT*àèÄ÷]βÁ5Ó=pÍt•ﻜ%ihhÀdÂ×™îA^è²d±œß})8 íìéy͹ˆfÎŽŽ 'N¼“’pÞ@ckkgJÊkN|oÔ=pÍt\3ÝcÙšoi!p8 _Ý2™ºi´i“Ÿ÷Þ=ì§pP«Åk¹<$-Í|ëVcW×ßñÅ_ºº°!õv˜nnaééã““Ð?8Hàp¦BýKj‘ek¶kË–©tD*í¬©ôzD*ý tÖÔ fwc£µ…EP¨ý’µÇs…Â=:š@ \((ø[m­›“Ó¶n÷öbh;ÃׯÿÍ7÷>LÈËc:=mß¾¥rjÕ ‹œ5£O¥êS©05= ,&S}ÔÔÄõ°˜Ìü¤$3w÷±gÏÖk©Z-“^\ÌY¿¾N"Aͬ˜˜á±±/««ÏÎ{°vÖ®Y“'ø$&“Á$$,•Só¨VXÁû…LÖ£PVjˆiºqÃ1 ÀË]çåU|îê$p8¥ÒOƒƒ]]sÊË`vn.»¬l——™»{ä¡CSSh¤—‹¾ô6nÄv¤‰©©¨Ã‡M·laoßžRX¨|ñþÜÖæàïoÀåÚ|þù™+WÐÈ+7o¦ìÝ«^On|¼0*jÑRI$ÒjÔöF•JUR_oçç·jóf爈¿vwïwÎE»«¸xÑ~÷nº‹‹{tôå~x‹tÙëL3 Q L*’ÊÊ=ÞÞT=½¥‚Ÿ+ABaÄÎ×Nžlÿé§="QgB§Àù––¶ŠŠ ­­Ñbq\PÐéææ‹RéÕÒR•J-çž:•Ÿ”È­[hªàÔTtBà D226öãÙ³  ‰V&GD …_§¦úº»_íèØ—•õÙÙÙ¹ÜÎÚ«ôõôlÙì×ÚQ©TòÇ3Š‹Ãy<õúKêës+*Ê23798ÜîíÝŸ“óÆîšÛÛÅß~[™ídg×ÕÛûÇÜÜ·˜d-köÛÀ@ìšA£ý³©IC°>•zçÂöÚµ†úúVðtbÕ,6(ˆA£EúøD‹Åã““MMÇÑ[fÕ‘#½êyÊ¿ûîÁðpÍÑ£ðjv¶þÚµîÆF4á‘ØXaa¡ ,ŒH$¾|õj•‘QÔ®]žžTêøä¤J¥š›C“М±„ªù“ˆz;t#£Š¬,õÏ=ÙÐ/øº»ÀWWIBBxF†æî ÏœÉ<ÀƒË=’–ö¿Nî$d@.ôô)æ´²°è–É0ónÿ»ûÐÜüjaÿº_Ãü,…–×™:¬Õ«'Š©éiÚü1äñø8MíH¢G¡ J%™DB”JqY<Ÿž^4U8—Q\¼îƒˆDâA‰dÃü:‹;v,ÚÏï3'',’L"mßžpüø©¬,‚d–”„ñx°-&æÔáÃ\îØ³gD"]”Y11Ÿ‡¤¥Å‡„0Œï;;k/_¦ÿ;'XÁÓ33_×ÕY²X¦&&Ï tô`ppJa!ƒFã:8týüó¡ÒRõš²°»øáW_16lè–ɲËÊÞbbWP3K‹A£=™˜ÀtrŽˆPPuu‹NM5¡ÓE|~èŽ^±±#RéÂT">_ ^±± ñvuE P}éR}KKjQ‰ÜºU"%æçÿ.4TB õöñùzJevvfII´XlËfŸÏË3 RÀÜÔôïçÎ%ø''SÈdÏÍ›¯——¦vnÄ &‰ö¶¶'NÔ6€þþ³ssiEE¿ŒŒØY[׿æºDFb£&túRÝ%æå =zĵ·?ž˜™™¹Ü‰%¨ÿÕ‰°mþ»þ qåæM6‹åøñǨÙÜÞ.**ÒpRklm LI€†††€€Ô‰ÿÞøNé‘ÉÂ22n÷ö"JåwïfGìܹÜ$+¸7â,D5=3ã+<ÿÐÜ|÷§ððå&Á5{§ˆÄœ¸¸œ¸¸ÿ' ¾7ê¸fº®™îk¦{,réìé \ð¬Î{ahtt/þ±N€?G¬Ûðå¥sàëL÷À5Ó=pÍtÿ®bY„™ÑPÖIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type.png000066400000000000000000000014741454104675500233500ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_10.png000066400000000000000000000014741454104675500236500ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_2.png000066400000000000000000000014741454104675500235710ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_3.png000066400000000000000000000014741454104675500235720ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_4.png000066400000000000000000000014741454104675500235730ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_5.png000066400000000000000000000014741454104675500235740ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_6.png000066400000000000000000000014741454104675500235750ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_7.png000066400000000000000000000014741454104675500235760ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_8.png000066400000000000000000000014741454104675500235770ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_type_9.png000066400000000000000000000014741454104675500236000ustar00rootroot00000000000000‰PNG  IHDR=$µÙ¥íbKGDÿÿÿ ½§“ñIDATX…cüÿÿ?ÃLí2Á¨»é þ#v °jÕ*¸S‡jx³` Ɉ‹[êéÑß)¸À“—/_º„&ˆÅÝ–zz«º»éâ$¢ÀêÝ»—–¢ Õt2ênú,é?X¹sgDy9¦ø…U«ôÕÔ¨á$¢Éîöwpx±w/Ãý§O-ãâ la*; / ÙÝìììì _¾}c``¦¾£ˆTKßy)ö×ïß¹-,.ܼy÷ñcFƒ­‡k‰9:æ´·ÿüõ‹áÏß¿ÕS¦Èº» ÙÙå´·ÿúý{ÀÜêêºqÿþ¿ÿþ100lyù²ITTR@€ƒ‰ \‡'#4”ZV ª•'vÆÆoDœ^]M-+ÁPmÇŽº›¾`¨ºK¾<~éR%+Õ¤IƒFÇ«è 0cC5¼GÝM_תZØ:íIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_which.png000066400000000000000000000015341454104675500234660ustar00rootroot00000000000000‰PNG  IHDRE$PG`bKGDÿÿÿ ½§“IDATX…í˜]HZqÀϵQYFö¹°‚µ)Îð¶Ë]1“J‚ aoS(ØCELرá>„zDT,Xôà`=cdÂÚUúô2§EEC‘ Vô‰º‡Ë.âÇüh•9O÷þçr~üÿzϽˆßqÑ ücÒ>IŽ?€‹î%At:­jûs%4UÌåâBáù·/—‹ É d\(Ô žKK§â½^O¨TAÉT;oiŸä&nŸW(èp`b‰v*t¸\ˆHdX]D$Ú±ÛkwìvD$úËÍCKâ%nŸ:]³ZÝn*œ73 ½ÑH…IfefbAØÚœììÇ ÷ qûÜ‹O<žU«ŽÝîÏëëÊ–ÚÇH’w‚«YYakóØlMoïiÚJÜ>œÜÜ[ee„Ù KÅ\îö¶“Éëóa6KÄbzñâòòÍÖÖœÚZõØœ7¯Ï÷|t´´©‰#•*ûûŽŽ"•œ¹HPô‹Ù z£±ÃP>A‹åÄãY³Ù$(J¯œ1V¦¦ÞªÕÏFF~Ðù7““>/jµ›{{¯´Ú¨%gèS‡¢ÔƒyÞdjÀ° £ÃæbÝfóz½³Å#…‚ÅdÞ—Jà×á!Ÿž~ÑÝÍ//TTL¨Õwþ$"•ÄH˜ù *±øÇþþ²ÅbÞÜ”VW€ ÇßÍÎ^c±P>ŸÅdÒ+ 9@$èßΊ’꺒ǫäñ¢–ÄH"ûÃÍË«äñ^jµ·oÜÈe³@†ãF’œ#ˆÀDjªÃÙs:©kóÖÖëññ¨%1’àó´Eg † £ÂÒ‚^Qѧ¥¥ ŸHaæ7‚$ÛC¾›$!—+L6ý}4©A.ï¶„%Õö'í“Üü¦A0Šð!ŽIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_which_2.png000066400000000000000000000015341454104675500237070ustar00rootroot00000000000000‰PNG  IHDRE$PG`bKGDÿÿÿ ½§“IDATX…í˜]HZqÀϵQYFö¹°‚µ)Îð¶Ë]1“J‚ aoS(ØCELرá>„zDT,Xôà`=cdÂÚUúô2§EEC‘ Vô‰º‡Ë.âÇüh•9O÷þçr~üÿzϽˆßqÑ ücÒ>IŽ?€‹î%At:­jûs%4UÌåâBáù·/—‹ É d\(Ô žKK§â½^O¨TAÉT;oiŸä&nŸW(èp`b‰v*t¸\ˆHdX]D$Ú±ÛkwìvD$úËÍCKâ%nŸ:]³ZÝn*œ73 ½ÑH…IfefbAØÚœììÇ ÷ qûÜ‹O<žU«ŽÝîÏëëÊ–ÚÇH’w‚«YYakóØlMoïiÚJÜ>œÜÜ[ee„Ù KÅ\îö¶“Éëóa6KÄbzñâòòÍÖÖœÚZõØœ7¯Ï÷|t´´©‰#•*ûûŽŽ"•œ¹HPô‹Ù z£±ÃP>A‹åÄãY³Ù$(J¯œ1V¦¦ÞªÕÏFF~Ðù7““>/jµ›{{¯´Ú¨%gèS‡¢ÔƒyÞdjÀ° £ÃæbÝfóz½³Å#…‚ÅdÞ—Jà×á!Ÿž~ÑÝÍ//TTL¨Õwþ$"•ÄH˜ù *±øÇþþ²ÅbÞÜ”VW€ ÇßÍÎ^c±P>ŸÅdÒ+ 9@$èßΊ’꺒ǫäñ¢–ÄH"ûÃÍË«äñ^jµ·oÜÈe³@†ãF’œ#ˆÀDjªÃÙs:©kóÖÖëññ¨%1’àó´Eg † £ÂÒ‚^Qѧ¥¥ ŸHaæ7‚$ÛC¾›$!—+L6ý}4©A.ï¶„%Õö'í“Üü¦A0Šð!ŽIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_which_3.png000066400000000000000000000015341454104675500237100ustar00rootroot00000000000000‰PNG  IHDRE$PG`bKGDÿÿÿ ½§“IDATX…í˜]HZqÀϵQYFö¹°‚µ)Îð¶Ë]1“J‚ aoS(ØCELرá>„zDT,Xôà`=cdÂÚUúô2§EEC‘ Vô‰º‡Ë.âÇüh•9O÷þçr~üÿzϽˆßqÑ ücÒ>IŽ?€‹î%At:­jûs%4UÌåâBáù·/—‹ É d\(Ô žKK§â½^O¨TAÉT;oiŸä&nŸW(èp`b‰v*t¸\ˆHdX]D$Ú±ÛkwìvD$úËÍCKâ%nŸ:]³ZÝn*œ73 ½ÑH…IfefbAØÚœììÇ ÷ qûÜ‹O<žU«ŽÝîÏëëÊ–ÚÇH’w‚«YYakóØlMoïiÚJÜ>œÜÜ[ee„Ù KÅ\îö¶“Éëóa6KÄbzñâòòÍÖÖœÚZõØœ7¯Ï÷|t´´©‰#•*ûûŽŽ"•œ¹HPô‹Ù z£±ÃP>A‹åÄãY³Ù$(J¯œ1V¦¦ÞªÕÏFF~Ðù7““>/jµ›{{¯´Ú¨%gèS‡¢ÔƒyÞdjÀ° £ÃæbÝfóz½³Å#…‚ÅdÞ—Jà×á!Ÿž~ÑÝÍ//TTL¨Õwþ$"•ÄH˜ù *±øÇþþ²ÅbÞÜ”VW€ ÇßÍÎ^c±P>ŸÅdÒ+ 9@$èßΊ’꺒ǫäñ¢–ÄH"ûÃÍË«äñ^jµ·oÜÈe³@†ãF’œ#ˆÀDjªÃÙs:©kóÖÖëññ¨%1’àó´Eg † £ÂÒ‚^Qѧ¥¥ ŸHaæ7‚$ÛC¾›$!—+L6ý}4©A.ï¶„%Õö'í“Üü¦A0Šð!ŽIEND®B`‚slepc4py-3.19.2/docs/apiref/class_hierarchy_for_which_4.png000066400000000000000000000015341454104675500237110ustar00rootroot00000000000000‰PNG  IHDRE$PG`bKGDÿÿÿ ½§“IDATX…í˜]HZqÀϵQYFö¹°‚µ)Îð¶Ë]1“J‚ aoS(ØCELرá>„zDT,Xôà`=cdÂÚUúô2§EEC‘ Vô‰º‡Ë.âÇüh•9O÷þçr~üÿzϽˆßqÑ ücÒ>IŽ?€‹î%At:­jûs%4UÌåâBáù·/—‹ É d\(Ô žKK§â½^O¨TAÉT;oiŸä&nŸW(èp`b‰v*t¸\ˆHdX]D$Ú±ÛkwìvD$úËÍCKâ%nŸ:]³ZÝn*œ73 ½ÑH…IfefbAØÚœììÇ ÷ qûÜ‹O<žU«ŽÝîÏëëÊ–ÚÇH’w‚«YYakóØlMoïiÚJÜ>œÜÜ[ee„Ù KÅ\îö¶“Éëóa6KÄbzñâòòÍÖÖœÚZõØœ7¯Ï÷|t´´©‰#•*ûûŽŽ"•œ¹HPô‹Ù z£±ÃP>A‹åÄãY³Ù$(J¯œ1V¦¦ÞªÕÏFF~Ðù7““>/jµ›{{¯´Ú¨%gèS‡¢ÔƒyÞdjÀ° £ÃæbÝfóz½³Å#…‚ÅdÞ—Jà×á!Ÿž~ÑÝÍ//TTL¨Õwþ$"•ÄH˜ù *±øÇþþ²ÅbÞÜ”VW€ ÇßÍÎ^c±P>ŸÅdÒ+ 9@$èßΊ’꺒ǫäñ¢–ÄH"ûÃÍË«äñ^jµ·oÜÈe³@†ãF’œ#ˆÀDjªÃÙs:©kóÖÖëññ¨%1’àó´Eg † £ÂÒ‚^Qѧ¥¥ ŸHaæ7‚$ÛC¾›$!—+L6ý}4©A.ï¶„%Õö'í“Üü¦A0Šð!ŽIEND®B`‚slepc4py-3.19.2/docs/apiref/crarr.png000066400000000000000000000005241454104675500174020ustar00rootroot00000000000000‰PNG  IHDR e¢E,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIMEÖ)Ó}Ö pHYsÂÂnÐu>gAMA± üaEPLTEÿÿÿÍð×ÏÀ€f4sW áÛЊrD`@bCÜÕÈéäÜ–X{`,¯Ÿ€lN‡o@õóðª™xdEðí螊dÐÆ´”~TÖwÅvtRNS@æØfMIDATxÚc`@¼ì¼0&+š—Šˆ°»(’ˆ€ ;; /ðEXùØ‘?Ð n ƒª†— b;'ª+˜˜YÐ#œ(r<£"IEND®B`‚slepc4py-3.19.2/docs/apiref/epydoc.css000066400000000000000000000372271454104675500175720ustar00rootroot00000000000000 /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } p { margin-top: 0.5em; margin-bottom: 0.5em; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* N.B.: class, not pseudoclass */ a.link { font-family: monospace; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; margin-top: 0.2em; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* Subclass list */ ul.subclass-list { display: inline; } ul.subclass-list li { display: inline; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } slepc4py-3.19.2/docs/apiref/epydoc.js000066400000000000000000000245251454104675500174130ustar00rootroot00000000000000function toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
"; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } slepc4py-3.19.2/docs/apiref/frames.html000066400000000000000000000011151454104675500177230ustar00rootroot00000000000000 SLEPc for Python slepc4py-3.19.2/docs/apiref/help.html000066400000000000000000000260271454104675500174070ustar00rootroot00000000000000 Help
 
[hide private]
[frames] | no frames]

API Documentation

This document contains the API (Application Programming Interface) documentation for SLEPc for Python. Documentation for the Python objects defined by the project is divided into separate pages for each package, module, and class. The API documentation also includes two pages containing information about the project as a whole: a trees page, and an index page.

Object Documentation

Each Package Documentation page contains:

  • A description of the package.
  • A list of the modules and sub-packages contained by the package.
  • A summary of the classes defined by the package.
  • A summary of the functions defined by the package.
  • A summary of the variables defined by the package.
  • A detailed description of each function defined by the package.
  • A detailed description of each variable defined by the package.

Each Module Documentation page contains:

  • A description of the module.
  • A summary of the classes defined by the module.
  • A summary of the functions defined by the module.
  • A summary of the variables defined by the module.
  • A detailed description of each function defined by the module.
  • A detailed description of each variable defined by the module.

Each Class Documentation page contains:

  • A class inheritance diagram.
  • A list of known subclasses.
  • A description of the class.
  • A summary of the methods defined by the class.
  • A summary of the instance variables defined by the class.
  • A summary of the class (static) variables defined by the class.
  • A detailed description of each method defined by the class.
  • A detailed description of each instance variable defined by the class.
  • A detailed description of each class (static) variable defined by the class.

Project Documentation

The Trees page contains the module and class hierarchies:

  • The module hierarchy lists every package and module, with modules grouped into packages. At the top level, and within each package, modules and sub-packages are listed alphabetically.
  • The class hierarchy lists every class, grouped by base class. If a class has more than one base class, then it will be listed under each base class. At the top level, and under each base class, classes are listed alphabetically.

The Index page contains indices of terms and identifiers:

  • The term index lists every term indexed by any object's documentation. For each term, the index provides links to each place where the term is indexed.
  • The identifier index lists the (short) name of every package, module, class, method, function, variable, and parameter. For each identifier, the index provides a short description, and a link to its documentation.

The Table of Contents

The table of contents occupies the two frames on the left side of the window. The upper-left frame displays the project contents, and the lower-left frame displays the module contents:

Project
Contents
...
API
Documentation
Frame


Module
Contents
 
...
 

The project contents frame contains a list of all packages and modules that are defined by the project. Clicking on an entry will display its contents in the module contents frame. Clicking on a special entry, labeled "Everything," will display the contents of the entire project.

The module contents frame contains a list of every submodule, class, type, exception, function, and variable defined by a module or package. Clicking on an entry will display its documentation in the API documentation frame. Clicking on the name of the module, at the top of the frame, will display the documentation for the module itself.

The "frames" and "no frames" buttons below the top navigation bar can be used to control whether the table of contents is displayed or not.

The Navigation Bar

A navigation bar is located at the top and bottom of every page. It indicates what type of page you are currently viewing, and allows you to go to related pages. The following table describes the labels on the navigation bar. Note that not some labels (such as [Parent]) are not displayed on all pages.

Label Highlighted when... Links to...
[Parent] (never highlighted) the parent of the current package
[Package] viewing a package the package containing the current object
[Module] viewing a module the module containing the current object
[Class] viewing a class the class containing the current object
[Trees] viewing the trees page the trees page
[Index] viewing the index page the index page
[Help] viewing the help page the help page

The "show private" and "hide private" buttons below the top navigation bar can be used to control whether documentation for private objects is displayed. Private objects are usually defined as objects whose (short) names begin with a single underscore, but do not end with an underscore. For example, "_x", "__pprint", and "epydoc.epytext._tokenize" are private objects; but "re.sub", "__init__", and "type_" are not. However, if a module defines the "__all__" variable, then its contents are used to decide which objects are private.

A timestamp below the bottom navigation bar indicates when each page was last updated.

slepc4py-3.19.2/docs/apiref/identifier-index.html000066400000000000000000010303461454104675500217060ustar00rootroot00000000000000 Identifier Index
 
[hide private]
[frames] | no frames]

Identifier Index

[ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ ]

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

_



slepc4py-3.19.2/docs/apiref/index.html000066400000000000000000000011151454104675500175550ustar00rootroot00000000000000 SLEPc for Python slepc4py-3.19.2/docs/apiref/module-tree.html000066400000000000000000000111071454104675500206720ustar00rootroot00000000000000 Module Hierarchy
 
[hide private]
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Module Hierarchy

  • slepc4py: This package is an interface to SLEPc libraries.
    • slepc4py.SLEPc: Scalable Library for Eigenvalue Problem Computations
    • slepc4py.lib: Extension modules for different SLEPc configurations.
slepc4py-3.19.2/docs/apiref/redirect.html000066400000000000000000000065751454104675500202660ustar00rootroot00000000000000Epydoc Redirect Page

Epydoc Auto-redirect page

When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

 

slepc4py-3.19.2/docs/apiref/slepc4py-module.html000066400000000000000000000275731454104675500215140ustar00rootroot00000000000000 slepc4py
Package slepc4py
[hide private]
[frames] | no frames]

Package slepc4py

This package is an interface to SLEPc libraries.

SLEPc (the Scalable Library for Eigenvalue Problem Computations) is a software library for the solution of large scale sparse eigenvalue problems on parallel computers. It is an extension of PETSc and can be used for either standard or generalized eigenproblems, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix.


Version: 3.19.2

Author: Lisandro Dalcin

Submodules [hide private]
  • slepc4py.SLEPc: Scalable Library for Eigenvalue Problem Computations
  • slepc4py.lib: Extension modules for different SLEPc configurations.

Functions [hide private]
 
init(args=None, arch=None)
Initialize SLEPc.
 
get_include()
Return the directory in the package that contains header files.
Variables [hide private]
  __credits__ = 'SLEPc Team <slepc-maint@upv.es>'
  __package__ = None
Function Details [hide private]

init(args=None, arch=None)

 

Initialize SLEPc.

This function should be called only once, typically at the very beginning of the bootstrap script of an application.
Parameters:
  • args - command-line arguments, usually the 'sys.argv' list.
  • arch - specific configuration to use.

get_include()

 

Return the directory in the package that contains header files.

Extension modules that need to compile against slepc4py should use this function to locate the appropriate include directory. Using Python distutils (or perhaps NumPy distutils):

import petscc4py, slepc4py
Extension('extension_name', ...
          include_dirs=[...,
                        petsc4py.get_include(),
                        slepc4py.get_include(),])

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc-module.html000066400000000000000000000413121454104675500224040ustar00rootroot00000000000000 slepc4py.SLEPc
Package slepc4py :: Module SLEPc
[hide private]
[frames] | no frames]

Module SLEPc

Scalable Library for Eigenvalue Problem Computations
Classes [hide private]
  BV
BV
  BVSVDMethod
BV methods for computing the SVD
  DS
DS
  EPS
EPS
  FN
FN
  MFN
MFN
  NEP
NEP
  PEP
PEP
  RG
RG
  ST
ST
  SVD
SVD
  Sys
  _p_mem
Functions [hide private]
 
_finalize()
 
_initialize(args=None)
Variables [hide private]
  COMM_NULL = <petsc4py.PETSc.Comm object>
  COMM_SELF = <petsc4py.PETSc.Comm object>
  COMM_WORLD = <petsc4py.PETSc.Comm object>
  DECIDE = -1
  DEFAULT = -2
  DETERMINE = -1
  __arch__ = 'arch-gnu-c-opt'
  __package__ = 'slepc4py'
  __pyx_capi__ = {'PySlepcBV_Get': <capsule object "BV (PyObject...
Variables Details [hide private]

__pyx_capi__

Value:
{'PySlepcBV_Get': <capsule object "BV (PyObject *)" at 0x7f6d72bbeb70>\
,
 'PySlepcBV_New': <capsule object "PyObject *(BV)" at 0x7f6d72bbeb40>,
 'PySlepcDS_Get': <capsule object "DS (PyObject *)" at 0x7f6d72bbebd0>\
,
 'PySlepcDS_New': <capsule object "PyObject *(DS)" at 0x7f6d72bbeba0>,
 'PySlepcEPS_Get': <capsule object "EPS (PyObject *)" at 0x7f6d72bbecf\
0>,
...

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV-class.html000066400000000000000000003770441454104675500225500ustar00rootroot00000000000000 slepc4py.SLEPc.BV
Package slepc4py :: Module SLEPc :: Class BV
[hide private]
[frames] | no frames]

Class BV


BV
Nested Classes [hide private]
  BlockType
BV block-orthogonalization types
  MatMultType
BV mat-mult types
  OrthogBlockType
BV block-orthogonalization types
  OrthogRefineType
BV orthogonalization refinement types
  OrthogType
BV orthogonalization types
  RefineType
BV orthogonalization refinement types
  Type
BV type
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
applyMatrix(self, Vec x, Vec y)
Multiplies a vector with the matrix associated to the bilinear form.
 
copy(self, BV result=None)
Copies a basis vector object into another one.
 
copyColumn(self, j, i)
Copies the values from one of the columns to another one.
 
copyVec(self, j, Vec v)
Copies one of the columns of a basis vectors object into a Vec.
 
create(self, comm=None)
Creates the BV object.
 
createFromMat(self, Mat A)
Creates a basis vectors object from a dense Mat object.
 
createMat(self)
Creates a new Mat object of dense type and copies the contents of the BV object.
 
createVec(self)
Creates a new Vec object with the same type and dimensions as the columns of the basis vectors object.
 
destroy(self)
Destroys the BV object.
 
dot(self, BV Y)
M = Y^H*X (m_ij = y_i^H x_j) or M = Y^H*B*X
 
dotColumn(self, j)
Computes multiple dot products of a column against all the column vectors of a BV.
 
dotVec(self, Vec v)
Computes multiple dot products of a vector against all the column vectors of a BV.
 
duplicate(self)
Duplicate the BV object with the same type and dimensions.
 
duplicateResize(self, m)
Creates a new BV object of the same type and dimensions as an existing one, but with possibly different number of columns.
 
getActiveColumns(self)
Returns the current active dimensions.
 
getColumn(self, j)
Returns a Vec object that contains the entries of the requested column of the basis vectors object.
 
getDefiniteTolerance(self)
Gets the tolerance to be used when checking a definite inner product.
 
getMat(self)
Returns a Mat object of dense type that shares the memory of the basis vectors object.
 
getMatMultMethod(self)
Gets the method used for the matMult() operation.
 
getMatrix(self)
Retrieves the matrix representation of the inner product.
 
getNumConstraints(self)
Gets the number of constraints.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all BV options in the database.
 
getOrthogonalization(self)
Gets the orthogonalization settings from the BV object.
 
getRandomContext(self)
Gets the PETSc.Random object associated with the BV.
 
getSizes(self)
Returns the local and global sizes, and the number of columns.
 
getType(self)
Gets the BV type of this object.
 
insertConstraints(self, C)
Insert a set of vectors as constraints.
 
insertVec(self, j, Vec w)
Insert a vector into the specified column.
 
insertVecs(self, s, W, bool orth)
Insert a set of vectors into specified columns.
 
matMult(self, Mat A, BV Y=None)
Computes the matrix-vector product for each column, Y = A*V.
 
matMultColumn(self, Mat A, j)
Computes the matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A*v_j.
 
matMultHermitianTranspose(self, Mat A, BV Y=None)
Computes the matrix-vector product with the conjugate transpose of a matrix for each column, Y=A^H*V.
 
matMultHermitianTransposeColumn(self, Mat A, j)
Computes the conjugate-transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^H*v_j.
 
matMultTransposeColumn(self, Mat A, j)
Computes the transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^T*v_j.
 
matProject(self, Mat A, BV Y)
Computes the projection of a matrix onto a subspace.
 
mult(self, alpha, beta, BV X, Mat Q)
Computes Y = beta*Y + alpha*X*Q.
 
multColumn(self, alpha, beta, j, q)
Computes y = beta*y + alpha*X*q, where y is the j-th column.
 
multInPlace(self, Mat Q, s, e)
Update a set of vectors as V(:,s:e-1) = V*Q(:,s:e-1).
 
multVec(self, alpha, beta, Vec y, q)
Computes y = beta*y + alpha*X*q.
 
norm(self, norm_type=None)
Computes the matrix norm of the BV.
 
normColumn(self, int j, norm_type=None)
Computes the matrix norm of the BV.
 
orthogonalize(self, Mat R=None, **kargs)
Orthogonalize all columns (except leading ones), that is, compute the QR decomposition.
 
orthogonalizeColumn(self, j)
Orthogonalize one of the column vectors with respect to the previous ones.
 
orthogonalizeVec(self, Vec v)
Orthogonalize a vector with respect to a set of vectors.
 
orthonormalizeColumn(self, j, replace=False)
Orthonormalize one of the column vectors with respect to the previous ones.
 
resize(self, m, copy=True)
Change the number of columns.
 
restoreColumn(self, j, Vec v)
Restore a column obtained with getColumn().
 
restoreMat(self, Mat A)
Restores the Mat obtained with getMat().
 
scale(self, alpha)
Multiply the entries by a scalar value.
 
scaleColumn(self, j, alpha)
Scale column j by alpha
 
setActiveColumns(self, l, k)
Specify the columns that will be involved in operations.
 
setDefiniteTolerance(self, deftol)
Sets the tolerance to be used when checking a definite inner product.
 
setFromOptions(self)
Sets BV options from the options database.
 
setMatMultMethod(self, method)
Specifies the method used for the matMult() operation.
 
setMatrix(self, Mat mat, bool indef)
Sets the bilinear form to be used for inner products.
 
setNumConstraints(self, nc)
Sets the number of constraints.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all BV options in the database.
 
setOrthogonalization(self, otype=None, refine=None, eta=None, block=None)
Specifies the method used for the orthogonalization of vectors (classical or modified Gram-Schmidt with or without refinement), and for the block-orthogonalization (simultaneous orthogonalization of a set of vectors).
 
setRandom(self)
Set the active columns of the BV to random numbers.
 
setRandomColumn(self, j)
Set one column of the BV to random numbers.
 
setRandomCond(self, condn)
Set the columns of a BV to random numbers, in a way that the generated matrix has a given condition number.
 
setRandomContext(self, Random rnd)
Sets the PETSc.Random object associated with the BV, to be used in operations that need random numbers.
 
setRandomNormal(self)
Set the active columns of the BV to random numbers (with normal distribution).
 
setRandomSign(self)
Set the entries of a BV to values 1 or -1 with equal probability.
 
setSizes(self, sizes, m)
Sets the local and global sizes, and the number of columns.
 
setSizesFromVec(self, Vec w, m)
Sets the local and global sizes, and the number of columns.
 
setType(self, bv_type)
Selects the type for the BV object.
 
view(self, Viewer viewer=None)
Prints the BV data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, appendOptionsPrefix, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

applyMatrix(self, Vec x, Vec y)

 

Multiplies a vector with the matrix associated to the bilinear form.

Parameters

x: Vec
The input vector.
y: Vec
The result vector.

Notes

If the bilinear form has no associated matrix this function copies the vector.

copy(self, BV result=None)

 

Copies a basis vector object into another one.

Parameters

result: BV, optional
The copy.

copyColumn(self, j, i)

 

Copies the values from one of the columns to another one.

Parameters

j: int
The number of the source column.
i: int
The number of the destination column.

copyVec(self, j, Vec v)

 

Copies one of the columns of a basis vectors object into a Vec.

Parameters

j: int
The column number to be copied.
v: Vec
A vector.

create(self, comm=None)

 

Creates the BV object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

createFromMat(self, Mat A)

 

Creates a basis vectors object from a dense Mat object.

Parameters

A: Mat
A dense tall-skinny matrix.

createMat(self)

 

Creates a new Mat object of dense type and copies the contents of the BV object.

Returns

mat: the new matrix.

createVec(self)

 

Creates a new Vec object with the same type and dimensions as the columns of the basis vectors object.

Returns

v: Vec
New vector.

destroy(self)

 
Destroys the BV object.
Overrides: petsc4py.PETSc.Object.destroy

dot(self, BV Y)

 
Computes the 'block-dot' product of two basis vectors objects.
M = Y^H*X (m_ij = y_i^H x_j) or M = Y^H*B*X

Parameters

Y: BV
Left basis vectors, can be the same as self, giving M = X^H X.

Returns

M: Mat
The resulting matrix.

Notes

This is the generalization of VecDot() for a collection of vectors, M = Y^H*X. The result is a matrix M whose entry m_ij is equal to y_i^H x_j (where y_i^H denotes the conjugate transpose of y_i).

X and Y can be the same object.

If a non-standard inner product has been specified with setMatrix(), then the result is M = Y^H*B*X. In this case, both X and Y must have the same associated matrix.

Only rows (resp. columns) of M starting from ly (resp. lx) are computed, where ly (resp. lx) is the number of leading columns of Y (resp. X).

dotColumn(self, j)

 

Computes multiple dot products of a column against all the column vectors of a BV.

Parameters

j: int
The index of the column.

Returns

m: array of scalars
The computed values.

dotVec(self, Vec v)

 

Computes multiple dot products of a vector against all the column vectors of a BV.

Parameters

v: Vec
A vector.

Returns

m: array of scalars
The computed values.

Notes

This is analogue to VecMDot(), but using BV to represent a collection of vectors. The result is m = X^H*y, so m_i is equal to x_j^H y. Note that here X is transposed as opposed to BVDot().

If a non-standard inner product has been specified with BVSetMatrix(), then the result is m = X^H*B*y.

duplicateResize(self, m)

 

Creates a new BV object of the same type and dimensions as an existing one, but with possibly different number of columns.

Parameters

m: int
The number of columns.

getActiveColumns(self)

 

Returns the current active dimensions.

Returns

l: int
The leading number of columns.
k: int
The active number of columns.

getColumn(self, j)

 

Returns a Vec object that contains the entries of the requested column of the basis vectors object.

Parameters

j: int
The index of the requested column.

Returns

v: Vec
The vector containing the jth column.

Notes

Modifying the returned Vec will change the BV entries as well.

getDefiniteTolerance(self)

 

Gets the tolerance to be used when checking a definite inner product.

Returns

deftol: float
The tolerance.

getMat(self)

 

Returns a Mat object of dense type that shares the memory of the basis vectors object.

Returns

A: Mat
The matrix

Notes

The returned matrix contains only the active columns. If the content of the Mat is modified, these changes are also done in the BV object. The user must call restoreMat() when no longer needed.

getMatMultMethod(self)

 

Gets the method used for the matMult() operation.

Returns

method: BV.MatMultType enumerate
The method for the matMult() operation.

getMatrix(self)

 

Retrieves the matrix representation of the inner product.

Returns

mat: the matrix of the inner product

getNumConstraints(self)

 

Gets the number of constraints.

Returns

nc: int
The number of constraints.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all BV options in the database.

Returns

prefix: string
The prefix string set for this BV object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getOrthogonalization(self)

 

Gets the orthogonalization settings from the BV object.

Returns

type: BV.OrthogType enumerate
The type of orthogonalization technique.
refine: BV.OrthogRefineType enumerate
The type of refinement.
eta: float
Parameter for selective refinement (used when the refinement type is BV.OrthogRefineType.IFNEEDED).
block: BV.OrthogBlockType enumerate
The type of block orthogonalization .

getRandomContext(self)

 

Gets the PETSc.Random object associated with the BV.

Returns

rnd: PETSc.Random
The random number generator context.

getSizes(self)

 

Returns the local and global sizes, and the number of columns.

Returns

sizes: two-tuple of int
The local and global sizes (n, N).
m: int
The number of columns.

getType(self)

 

Gets the BV type of this object.

Returns

type: BV.Type enumerate
The inner product type currently being used.
Overrides: petsc4py.PETSc.Object.getType

insertConstraints(self, C)

 

Insert a set of vectors as constraints.

Parameters

C: Vec or sequence of Vec.
Set of vectors to be inserted as constraints.

Returns

nc: int
Number of linearly independent vectors.

Notes

The constraints are relevant only during orthogonalization. Constraint vectors span a subspace that is deflated in every orthogonalization operation, so they are intended for removing those directions from the orthogonal basis computed in regular BV columns.

insertVec(self, j, Vec w)

 

Insert a vector into the specified column.

Parameters

j: int
The column to be overwritten.
w: Vec
The vector to be copied.

insertVecs(self, s, W, bool orth)

 

Insert a set of vectors into specified columns.

Parameters

s: int
The first column to be overwritten.
W: Vec or sequence of Vec.
Set of vectors to be copied.
orth:
Flag indicating if the vectors must be orthogonalized.

Returns

m: int
Number of linearly independent vectors.

Notes

Copies the contents of vectors W into self(:,s:s+n), where n is the length of W. If orthogonalization flag is set then the vectors are copied one by one then orthogonalized against the previous one. If any are linearly dependent then it is discared and the value of m is decreased.

matMult(self, Mat A, BV Y=None)

 

Computes the matrix-vector product for each column, Y = A*V.

Parameters

A: Mat
The matrix.

Returns

Y: BV
The result.

Notes

Only active columns (excluding the leading ones) are processed.

It is possible to choose whether the computation is done column by column or using dense matrices using the options database keys:

-bv_matmult_vecs -bv_matmult_mat

The default is bv_matmult_mat.

matMultColumn(self, Mat A, j)

 

Computes the matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A*v_j.

Parameters

A: Mat
The matrix.
j: int
Index of column.

matMultHermitianTranspose(self, Mat A, BV Y=None)

 

Computes the matrix-vector product with the conjugate transpose of a matrix for each column, Y=A^H*V.

Parameters

A: Mat
The matrix.

Returns

Y: BV
The result.

Notes

Only active columns (excluding the leading ones) are processed.

As opoosed to matMult(), this operation is always done by column by column, with a sequence of calls to MatMultHermitianTranspose().

matMultHermitianTransposeColumn(self, Mat A, j)

 

Computes the conjugate-transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^H*v_j.

Parameters

A: Mat
The matrix.
j: int
Index of column.

matMultTransposeColumn(self, Mat A, j)

 

Computes the transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^T*v_j.

Parameters

A: Mat
The matrix.
j: int
Index of column.

matProject(self, Mat A, BV Y)

 

Computes the projection of a matrix onto a subspace.

M = Y^H A X

Parameters

A: Mat or None
Matrix to be projected.
Y: BV
Left basis vectors, can be the same as self, giving M = X^H A X.

Returns

M: Mat
Projection of the matrix A onto the subspace.

mult(self, alpha, beta, BV X, Mat Q)

 

Computes Y = beta*Y + alpha*X*Q.

Parameters

alpha: scalar
Coefficient that multiplies X.
beta: scalar
Coefficient that multiplies Y.
X: BV
Input basis vectors.
Q: Mat, optional
Input matrix, if not given the identity matrix is assumed.

multColumn(self, alpha, beta, j, q)

 

Computes y = beta*y + alpha*X*q, where y is the j-th column.

Parameters

alpha: scalar
Coefficient that multiplies X.
beta: scalar
Coefficient that multiplies y.
j: int
The column index.
q: Array of scalar
Input coefficients.

multInPlace(self, Mat Q, s, e)

 

Update a set of vectors as V(:,s:e-1) = V*Q(:,s:e-1).

Parameters

Q: Mat
A sequential dense matrix.
s: int
First column to be overwritten.
e: int
Last column to be overwritten.

multVec(self, alpha, beta, Vec y, q)

 

Computes y = beta*y + alpha*X*q.

Parameters

alpha: scalar
Coefficient that multiplies X.
beta: scalar
Coefficient that multiplies y.
y: Vec
Input/output vector.
q: Array of scalar
Input coefficients.

norm(self, norm_type=None)

 

Computes the matrix norm of the BV.

Parameters

norm_type: PETSC.NormType enumerate
The norm type.

Returns

norm: float

Notes

All active columns (except the leading ones) are considered as a matrix. The allowed norms are NORM_1, NORM_FROBENIUS, and NORM_INFINITY.

This operation fails if a non-standard inner product has been specified with BVSetMatrix().

normColumn(self, int j, norm_type=None)

 

Computes the matrix norm of the BV.

Parameters

j: int
Index of column.
norm_type: PETSc.NormType enumerate
The norm type.

Returns

norm: float

Notes

The norm of V[j] is computed (NORM_1, NORM_2, or NORM_INFINITY).

If a non-standard inner product has been specified with BVSetMatrix(), then the returned value is sqrt(V[j]'* B*V[j]), where B is the inner product matrix (argument 'type' is ignored).

orthogonalize(self, Mat R=None, **kargs)

 

Orthogonalize all columns (except leading ones), that is, compute the QR decomposition.

Parameters

R: Mat, optional
A sequential dense matrix.

Notes

The output satisfies V0 = V*R (where V0 represent the input V) and V'*V = I.

orthogonalizeColumn(self, j)

 

Orthogonalize one of the column vectors with respect to the previous ones.

Parameters

j: int
Index of the column to be orthogonalized.

Returns

norm: float
The norm of the resulting vector.
lindep: bool
Flag indicating that refinement did not improve the quality of orthogonalization.

Notes

This function applies an orthogonal projector to project vector V[j] onto the orthogonal complement of the span of the columns V[0..j-1], where V[.] are the vectors of the BV. The columns V[0..j-1] are assumed to be mutually orthonormal.

This routine does not normalize the resulting vector.

orthogonalizeVec(self, Vec v)

 

Orthogonalize a vector with respect to a set of vectors.

Parameters

v: Vec
Vector to be orthogonalized, modified on return.

Returns

norm: float
The norm of the resulting vector.
lindep: bool
Flag indicating that refinement did not improve the quality of orthogonalization.

Notes

This function applies an orthogonal projector to project vector v onto the orthogonal complement of the span of the columns of the BV.

This routine does not normalize the resulting vector.

orthonormalizeColumn(self, j, replace=False)

 

Orthonormalize one of the column vectors with respect to the previous ones. This is equivalent to a call to orthogonalizeColumn() followed by a call to scaleColumn() with the reciprocal of the norm.

Parameters

j: int
Index of the column to be orthonormalized.
replace: bool, optional
Whether it is allowed to set the vector randomly.

Returns

norm: float
The norm of the resulting vector.
lindep: bool
Flag indicating that refinement did not improve the quality of orthogonalization.

resize(self, m, copy=True)

 

Change the number of columns.

Parameters

m: int
The new number of columns.
copy: bool
A flag indicating whether current values should be kept.

Notes

Internal storage is reallocated. If copy is True, then the contents are copied to the leading part of the new space.

restoreColumn(self, j, Vec v)

 

Restore a column obtained with getColumn().

Parameters

j: int
The index of the requested column.
v: Vec
The vector obtained with getColumn().

Notes

The arguments must match the corresponding call to getColumn().

restoreMat(self, Mat A)

 

Restores the Mat obtained with getMat().

Parameters

A: Mat
The matrix obtained with getMat().

Notes

A call to this function must match a previous call of getMat(). The effect is that the contents of the Mat are copied back to the BV internal data structures.

scale(self, alpha)

 

Multiply the entries by a scalar value.

Parameters

alpha: float
scaling factor.

Notes

All active columns (except the leading ones) are scaled.

scaleColumn(self, j, alpha)

 

Scale column j by alpha

Parameters

j: int
column number to be scaled.
alpha: float
scaling factor.

setActiveColumns(self, l, k)

 

Specify the columns that will be involved in operations.

Parameters

l: int
The leading number of columns.
k: int
The active number of columns.

setDefiniteTolerance(self, deftol)

 

Sets the tolerance to be used when checking a definite inner product.

Parameters

deftol: float
The tolerance.

setFromOptions(self)

 

Sets BV options from the options database.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setMatMultMethod(self, method)

 

Specifies the method used for the matMult() operation.

Parameters

method: BV.MatMultType enumerate
The method for the matMult() operation.

setMatrix(self, Mat mat, bool indef)

 

Sets the bilinear form to be used for inner products.

Parameters

mat: Mat or None
The matrix of the inner product.
indef: bool, optional
Whether the matrix is indefinite

setNumConstraints(self, nc)

 

Sets the number of constraints.

Parameters

nc: int
The number of constraints.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all BV options in the database.

Parameters

prefix: string
The prefix string to prepend to all BV option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setOrthogonalization(self, otype=None, refine=None, eta=None, block=None)

 

Specifies the method used for the orthogonalization of vectors (classical or modified Gram-Schmidt with or without refinement), and for the block-orthogonalization (simultaneous orthogonalization of a set of vectors).

Parameters

otype: BV.OrthogType enumerate, optional
The type of orthogonalization technique.
refine: BV.OrthogRefineType enumerate, optional
The type of refinement.
eta: float, optional
Parameter for selective refinement.
block: BV.OrthogBlockType enumerate, optional
The type of block orthogonalization.

Notes

The default settings work well for most problems.

The parameter eta should be a real value between 0 and 1 (or DEFAULT). The value of eta is used only when the refinement type is BV.OrthogRefineType.IFNEEDED.

When using several processors, BV.OrthogType.MGS is likely to result in bad scalability.

If the method set for block orthogonalization is GS, then the computation is done column by column with the vector orthogonalization.

setRandom(self)

 

Set the active columns of the BV to random numbers.

Notes

All active columns (except the leading ones) are modified.

setRandomColumn(self, j)

 

Set one column of the BV to random numbers.

Parameters

j: int
Column number to be set.

setRandomCond(self, condn)

 

Set the columns of a BV to random numbers, in a way that the generated matrix has a given condition number.

Parameters

condn: float
Condition number.

setRandomContext(self, Random rnd)

 

Sets the PETSc.Random object associated with the BV, to be used in operations that need random numbers.

Parameters

rnd: PETSc.Random
The random number generator context.

setRandomNormal(self)

 

Set the active columns of the BV to random numbers (with normal distribution).

Notes

All active columns (except the leading ones) are modified.

setRandomSign(self)

 

Set the entries of a BV to values 1 or -1 with equal probability.

Notes

All active columns (except the leading ones) are modified.

setSizes(self, sizes, m)

 

Sets the local and global sizes, and the number of columns.

Parameters

sizes: int or two-tuple of int
The global size N or a two-tuple (n, N) with the local and global sizes.
m: int
The number of columns.

Notes

Either n or N (but not both) can be PETSc.DECIDE or None to have it automatically set.

setSizesFromVec(self, Vec w, m)

 

Sets the local and global sizes, and the number of columns. Local and global sizes are specified indirectly by passing a template vector.

Parameters

w: Vec
The template vector.
m: int
The number of columns.

setType(self, bv_type)

 

Selects the type for the BV object.

Parameters

bv_type: BV.Type enumerate
The inner product type to be used.

view(self, Viewer viewer=None)

 

Prints the BV data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV.BlockType-class.html000066400000000000000000000231451454104675500244310ustar00rootroot00000000000000 slepc4py.SLEPc.BV.BlockType
Package slepc4py :: Module SLEPc :: Class BV :: Class BlockType
[hide private]
[frames] | no frames]

Class BlockType


BV block-orthogonalization types

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CHOL = 1
  GS = 0
  SVQB = 4
  TSQR = 2
  TSQRCHOL = 3
  __qualname__ = 'BVOrthogBlockType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV.MatMultType-class.html000066400000000000000000000211301454104675500247520ustar00rootroot00000000000000 slepc4py.SLEPc.BV.MatMultType
Package slepc4py :: Module SLEPc :: Class BV :: Class MatMultType
[hide private]
[frames] | no frames]

Class MatMultType


BV mat-mult types

  • VECS: Perform a matrix-vector multiply per each column.
  • MAT: Carry out a Mat-Mat product with a dense matrix.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  MAT = 1
  VECS = 0
  __qualname__ = 'BVMatMultType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV.OrthogType-class.html000066400000000000000000000210351454104675500246350ustar00rootroot00000000000000 slepc4py.SLEPc.BV.OrthogType
Package slepc4py :: Module SLEPc :: Class BV :: Class OrthogType
[hide private]
[frames] | no frames]

Class OrthogType


BV orthogonalization types

  • CGS: Classical Gram-Schmidt.
  • MGS: Modified Gram-Schmidt.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CGS = 0
  MGS = 1
  __qualname__ = 'BVOrthogType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV.RefineType-class.html000066400000000000000000000217421454104675500246100ustar00rootroot00000000000000 slepc4py.SLEPc.BV.RefineType
Package slepc4py :: Module SLEPc :: Class BV :: Class RefineType
[hide private]
[frames] | no frames]

Class RefineType


BV orthogonalization refinement types

  • IFNEEDED: Reorthogonalize if a criterion is satisfied.
  • NEVER: Never reorthogonalize.
  • ALWAYS: Always reorthogonalize.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ALWAYS = 2
  IFNEEDED = 0
  NEVER = 1
  __qualname__ = 'BVOrthogRefineType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BV.Type-class.html000066400000000000000000000230721454104675500234550ustar00rootroot00000000000000 slepc4py.SLEPc.BV.Type
Package slepc4py :: Module SLEPc :: Class BV :: Class Type
[hide private]
[frames] | no frames]

Class Type


BV type
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONTIGUOUS = 'contiguous'
  MAT = 'mat'
  SVEC = 'svec'
  TENSOR = 'tensor'
  VECS = 'vecs'
  __qualname__ = 'BVType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.BVSVDMethod-class.html000066400000000000000000000220211454104675500242440ustar00rootroot00000000000000 slepc4py.SLEPc.BVSVDMethod
Package slepc4py :: Module SLEPc :: Class BVSVDMethod
[hide private]
[frames] | no frames]

Class BVSVDMethod


BV methods for computing the SVD

  • REFINE: Based on the SVD of the cross product matrix S'*S, with refinement.
  • QR: Based on the SVD of the triangular factor of qr(S).
  • QR_CAA: Variant of QR intended for use in cammunication-avoiding Arnoldi.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  QR = 1
  QR_CAA = 2
  REFINE = 0
  __qualname__ = 'BVSVDMethod'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.DS-class.html000066400000000000000000002340421454104675500225350ustar00rootroot00000000000000 slepc4py.SLEPc.DS
Package slepc4py :: Module SLEPc :: Class DS
[hide private]
[frames] | no frames]

Class DS


DS
Nested Classes [hide private]
  MatType
To refer to one of the matrices stored internally in DS
  ParallelType
DS parallel types
  StateType
DS state types
  Type
DS type
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
allocate(self, ld)
Allocates memory for internal storage or matrices in DS.
 
cond(self)
Compute the inf-norm condition number of the first matrix.
 
create(self, comm=None)
Creates the DS object.
 
destroy(self)
Destroys the DS object.
 
duplicate(self)
Duplicate the DS object with the same type and dimensions.
 
getBlockSize(self)
Gets the block size.
 
getCompact(self)
Gets the compact storage flag.
 
getDimensions(self)
Returns the current dimensions.
 
getExtraRow(self)
Gets the extra row flag.
 
getGSVDDimensions(self)
Gets the number of columns and rows of a DS of type GSVD.
 
getHSVDDimensions(self)
Gets the number of columns of a DS of type HSVD.
 
getLeadingDimension(self)
Returns the leading dimension of the allocated matrices.
 
getMat(self, matname)
Returns the requested matrix as a sequential dense Mat object.
 
getMethod(self)
Gets the method currently used in the DS.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all DS options in the database.
 
getPEPCoefficients(self)
Gets the polynomial basis coefficients of a DS of type PEP.
 
getPEPDegree(self)
Gets the polynomial degree of a DS of type PEP.
 
getParallel(self)
Gets the mode of operation in parallel runs.
 
getRefined(self)
Gets the refined vectors flag.
 
getSVDDimensions(self)
Gets the number of columns of a DS of type SVD.
 
getState(self)
Returns the current state.
 
getType(self)
Gets the DS type of this object.
 
reset(self)
Resets the DS object.
 
restoreMat(self, matname, Mat mat)
Restore the previously seized matrix.
 
setBlockSize(self, bs)
Selects the block size.
 
setCompact(self, comp)
Switch to compact storage of matrices.
 
setDimensions(self, n=None, l=None, k=None)
Resize the matrices in the DS object.
 
setExtraRow(self, ext)
Sets a flag to indicate that the matrix has one extra row.
 
setFromOptions(self)
Sets DS options from the options database.
 
setGSVDDimensions(self, m, p)
Sets the number of columns and rows of a DS of type GSVD.
 
setHSVDDimensions(self, m)
Sets the number of columns of a DS of type HSVD.
 
setIdentity(self, matname)
Copy the identity on the active part of a matrix.
 
setMethod(self, meth)
Selects the method to be used to solve the problem.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all DS options in the database.
 
setPEPCoefficients(self, pbc)
Sets the polynomial basis coefficients of a DS of type PEP.
 
setPEPDegree(self, deg)
Sets the polynomial degree of a DS of type PEP.
 
setParallel(self, pmode)
Selects the mode of operation in parallel runs.
 
setRefined(self, ref)
Sets a flag to indicate that refined vectors must be computed.
 
setSVDDimensions(self, m)
Sets the number of columns of a DS of type SVD.
 
setState(self, state)
Change the state of the DS object.
 
setType(self, ds_type)
Selects the type for the DS object.
 
truncate(self, n, trim=False)
Truncates the system represented in the DS object.
 
updateExtraRow(self)
Performs all necessary operations so that the extra row gets up-to-date after a call to solve().
 
view(self, Viewer viewer=None)
Prints the DS data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, appendOptionsPrefix, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  block_size
  compact
  extra_row
  method
  parallel
  refined
  state

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

allocate(self, ld)

 

Allocates memory for internal storage or matrices in DS.

Parameters

ld: int
Leading dimension (maximum allowed dimension for the matrices, including the extra row if present).

cond(self)

 

Compute the inf-norm condition number of the first matrix.

Returns

cond: real
Condition number.

create(self, comm=None)

 

Creates the DS object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the DS object.
Overrides: petsc4py.PETSc.Object.destroy

getBlockSize(self)

 

Gets the block size.

Returns

bs: int
The block size.

getCompact(self)

 

Gets the compact storage flag.

Returns

comp: bool
The flag.

getDimensions(self)

 

Returns the current dimensions.

Returns

n: int
The new size.
l: int
Number of locked (inactive) leading columns.
k: int
Intermediate dimension (e.g., position of arrow).
t: int
Truncated length.

getExtraRow(self)

 

Gets the extra row flag.

Returns

comp: bool
The flag.

getGSVDDimensions(self)

 

Gets the number of columns and rows of a DS of type GSVD.

Returns

m: int
The number of columns.
p: int
The number of rows for the second matrix.

getHSVDDimensions(self)

 

Gets the number of columns of a DS of type HSVD.

Returns

m: int
The number of columns.

getLeadingDimension(self)

 

Returns the leading dimension of the allocated matrices.

Returns

ld: int
Leading dimension (maximum allowed dimension for the matrices).

getMat(self, matname)

 

Returns the requested matrix as a sequential dense Mat object.

Parameters

matname: DS.MatType enumerate
The requested matrix.

getMethod(self)

 

Gets the method currently used in the DS.

Returns

meth: int
Identifier of the method.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all DS options in the database.

Returns

prefix: string
The prefix string set for this DS object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getPEPCoefficients(self)

 

Gets the polynomial basis coefficients of a DS of type PEP.

Returns

pbc: array of float
Coefficients.

getPEPDegree(self)

 

Gets the polynomial degree of a DS of type PEP.

Returns

deg: int
The polynomial degree.

getParallel(self)

 

Gets the mode of operation in parallel runs.

Returns

pmode: DS.ParallelType enumerate
The parallel mode.

getRefined(self)

 

Gets the refined vectors flag.

Returns

comp: bool
The flag.

getSVDDimensions(self)

 

Gets the number of columns of a DS of type SVD.

Returns

m: int
The number of columns.

getState(self)

 

Returns the current state.

Returns

state: DS.StateType enumerate
The current state.

getType(self)

 

Gets the DS type of this object.

Returns

type: DS.Type enumerate
The direct solver type currently being used.
Overrides: petsc4py.PETSc.Object.getType

restoreMat(self, matname, Mat mat)

 

Restore the previously seized matrix.

Parameters

matname: DS.MatType enumerate
The selected matrix.
mat: Mat
The matrix previously obtained with getMat().

setBlockSize(self, bs)

 

Selects the block size.

Parameters

bs: int
The block size.

setCompact(self, comp)

 

Switch to compact storage of matrices.

Parameters

comp: bool
True means compact storage.

Notes

Compact storage is used in some DS types such as DS.Type.HEP when the matrix is tridiagonal. This flag can be used to indicate whether the user provides the matrix entries via the compact form (the tridiagonal DS.MatType.T) or the non-compact one (DS.MatType.A).

The default is False.

setDimensions(self, n=None, l=None, k=None)

 

Resize the matrices in the DS object.

Parameters

n: int, optional
The new size.
l: int, optional
Number of locked (inactive) leading columns.
k: int, optional
Intermediate dimension (e.g., position of arrow).

Notes

The internal arrays are not reallocated.

setExtraRow(self, ext)

 

Sets a flag to indicate that the matrix has one extra row.

Parameters

ext: bool
True if the matrix has extra row.

Notes

In Krylov methods it is useful that the matrix representing the direct solver has one extra row, i.e., has dimension (n+1)*n . If this flag is activated, all transformations applied to the right of the matrix also affect this additional row. In that case, (n+1) must be less or equal than the leading dimension.

The default is False.

setFromOptions(self)

 

Sets DS options from the options database.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setGSVDDimensions(self, m, p)

 

Sets the number of columns and rows of a DS of type GSVD.

Parameters

m: int
The number of columns.
p: int
The number of rows for the second matrix.

setHSVDDimensions(self, m)

 

Sets the number of columns of a DS of type HSVD.

Parameters

m: int
The number of columns.

setIdentity(self, matname)

 

Copy the identity on the active part of a matrix.

Parameters

matname: DS.MatType enumerate
The requested matrix.

setMethod(self, meth)

 

Selects the method to be used to solve the problem.

Parameters

meth: int
An index identifying the method.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all DS options in the database.

Parameters

prefix: string
The prefix string to prepend to all DS option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setPEPCoefficients(self, pbc)

 

Sets the polynomial basis coefficients of a DS of type PEP.

Parameters

pbc: array of float
Coefficients.

setPEPDegree(self, deg)

 

Sets the polynomial degree of a DS of type PEP.

Parameters

deg: int
The polynomial degree.

setParallel(self, pmode)

 

Selects the mode of operation in parallel runs.

Parameters

pmode: DS.ParallelType enumerate
The parallel mode.

setRefined(self, ref)

 

Sets a flag to indicate that refined vectors must be computed.

Parameters

ref: bool
True if refined vectors must be used.

Notes

Normally the vectors returned in DS.MatType.X are eigenvectors of the projected matrix. With this flag activated, vectors() will return the right singular vector of the smallest singular value of matrix At-theta*I, where At is the extended (n+1)xn matrix and theta is the Ritz value. This is used in the refined Ritz approximation.

The default is False.

setSVDDimensions(self, m)

 

Sets the number of columns of a DS of type SVD.

Parameters

m: int
The number of columns.

setState(self, state)

 

Change the state of the DS object.

Parameters

state: DS.StateType enumerate
The new state.

Notes

The state indicates that the dense system is in an initial state (raw), in an intermediate state (such as tridiagonal, Hessenberg or Hessenberg-triangular), in a condensed state (such as diagonal, Schur or generalized Schur), or in a truncated state.

This function is normally used to return to the raw state when the condensed structure is destroyed.

setType(self, ds_type)

 

Selects the type for the DS object.

Parameters

ds_type: DS.Type enumerate
The direct solver type to be used.

truncate(self, n, trim=False)

 

Truncates the system represented in the DS object.

Parameters

n: int
The new size.
trim: bool, optional
A flag to indicate if the factorization must be trimmed.

view(self, Viewer viewer=None)

 

Prints the DS data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.DS.MatType-class.html000066400000000000000000000300511454104675500241110ustar00rootroot00000000000000 slepc4py.SLEPc.DS.MatType
Package slepc4py :: Module SLEPc :: Class DS :: Class MatType
[hide private]
[frames] | no frames]

Class MatType


To refer to one of the matrices stored internally in DS

  • A: first matrix of eigenproblem/singular value problem.
  • B: second matrix of a generalized eigenproblem.
  • C: third matrix of a quadratic eigenproblem.
  • T: tridiagonal matrix.
  • D: diagonal matrix.
  • Q: orthogonal matrix of (right) Schur vectors.
  • Z: orthogonal matrix of left Schur vectors.
  • X: right eigenvectors.
  • Y: left eigenvectors.
  • U: left singular vectors.
  • V: right singular vectors.
  • W: workspace matrix.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  A = 0
  B = 1
  C = 2
  D = 4
  Q = 5
  T = 3
  U = 9
  V = 10
  W = 11
  X = 7
  Y = 8
  Z = 6
  __qualname__ = 'DSMatType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.DS.ParallelType-class.html000066400000000000000000000221261454104675500251300ustar00rootroot00000000000000 slepc4py.SLEPc.DS.ParallelType
Package slepc4py :: Module SLEPc :: Class DS :: Class ParallelType
[hide private]
[frames] | no frames]

Class ParallelType


DS parallel types

  • REDUNDANT: Every process performs the computation redundantly.
  • SYNCHRONIZED: The first process sends the result to the rest.
  • DISTRIBUTED: Used in some cases to distribute the computation among processes.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  DISTRIBUTED = 2
  REDUNDANT = 0
  SYNCHRONIZED = 1
  __qualname__ = 'DSParallelType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.DS.StateType-class.html000066400000000000000000000226121454104675500244540ustar00rootroot00000000000000 slepc4py.SLEPc.DS.StateType
Package slepc4py :: Module SLEPc :: Class DS :: Class StateType
[hide private]
[frames] | no frames]

Class StateType


DS state types

  • RAW: Not processed yet.
  • INTERMEDIATE: Reduced to Hessenberg or tridiagonal form (or equivalent).
  • CONDENSED: Reduced to Schur or diagonal form (or equivalent).
  • TRUNCATED: Condensed form truncated to a smaller size.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONDENSED = 2
  INTERMEDIATE = 1
  RAW = 0
  TRUNCATED = 3
  __qualname__ = 'DSStateType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.DS.Type-class.html000066400000000000000000000273661454104675500234660ustar00rootroot00000000000000 slepc4py.SLEPc.DS.Type
Package slepc4py :: Module SLEPc :: Class DS :: Class Type
[hide private]
[frames] | no frames]

Class Type


DS type
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  GHEP = 'ghep'
  GHIEP = 'ghiep'
  GNHEP = 'gnhep'
  GSVD = 'gsvd'
  HEP = 'hep'
  HSVD = 'hsvd'
  NEP = 'nep'
  NHEP = 'nhep'
  NHEPTS = 'nhepts'
  PEP = 'pep'
  SVD = 'svd'
  __qualname__ = 'DSType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS-class.html000066400000000000000000010103631454104675500226550ustar00rootroot00000000000000 slepc4py.SLEPc.EPS
Package slepc4py :: Module SLEPc :: Class EPS
[hide private]
[frames] | no frames]

Class EPS


EPS
Nested Classes [hide private]
  Balance
EPS type of balancing used for non-Hermitian problems
  CISSExtraction
EPS CISS extraction technique
  CISSQuadRule
EPS CISS quadrature rule
  Conv
EPS convergence test
  ConvergedReason
EPS convergence reasons
  ErrorType
EPS error type to assess accuracy of computed solutions
  Extraction
EPS extraction technique
  LanczosReorthogType
EPS Lanczos reorthogonalization type
  PowerShiftType
EPS Power shift type.
  ProblemType
EPS problem type
  Stop
EPS stopping test
  Type
EPS type
  Which
EPS desired part of spectrum
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
appendOptionsPrefix(self, prefix)
Appends to the prefix used for searching for all EPS options in the database.
 
cancelMonitor(self)
Clears all monitors for an EPS object.
 
computeError(self, int i, etype=None)
Computes the error (based on the residual norm) associated with the i-th computed eigenpair.
 
create(self, comm=None)
Creates the EPS object.
 
destroy(self)
Destroys the EPS object.
 
errorView(self, etype=None, Viewer viewer=None)
Displays the errors associated with the computed solution (as well as the eigenvalues).
 
getArnoldiDelayed(self)
Gets the type of reorthogonalization used during the Arnoldi iteration.
 
getBV(self)
Obtain the basis vector objects associated to the eigensolver.
 
getBalance(self)
Gets the balancing type used by the EPS object, and the associated parameters.
 
getCISSExtraction(self)
Gets the extraction technique used in the CISS solver.
 
getCISSKSPs(self)
Retrieve the array of linear solver objects associated with the CISS solver.
 
getCISSQuadRule(self)
Gets the quadrature rule used in the CISS solver.
 
getCISSRefinement(self)
Gets the values of various refinement parameters in the CISS solver.
 
getCISSSizes(self)
Gets the values of various size parameters in the CISS solver.
 
getCISSThreshold(self)
Gets the values of various threshold parameters in the CISS solver.
 
getCISSUseST(self)
Gets the flag for using the ST object in the CISS solver.
 
getConverged(self)
Gets the number of converged eigenpairs.
 
getConvergedReason(self)
Gets the reason why the solve() iteration was stopped.
 
getConvergenceTest(self)
Return the method used to compute the error estimate used in the convergence test.
 
getDS(self)
Obtain the direct solver associated to the eigensolver.
 
getDimensions(self)
Gets the number of eigenvalues to compute and the dimension of the subspace.
 
getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)
Gets the i-th solution of the eigenproblem as computed by solve().
 
getEigenvalue(self, int i)
Gets the i-th eigenvalue as computed by solve().
 
getEigenvector(self, int i, Vec Vr, Vec Vi=None)
Gets the i-th eigenvector as computed by solve().
 
getErrorEstimate(self, int i)
Returns the error estimate associated to the i-th computed eigenpair.
 
getExtraction(self)
Gets the extraction type used by the EPS object.
 
getGDBOrth(self)
Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems.
 
getGDBlockSize(self)
Gets the number of vectors to be added to the searching space in every iteration.
 
getGDDoubleExpansion(self)
Gets a flag indicating whether the double expansion variant has been activated or not.
 
getGDInitialSize(self)
Gets the initial size of the searching space.
 
getGDKrylovStart(self)
Gets a flag indicating if the search subspace is started with a Krylov basis.
 
getGDRestart(self)
Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.
 
getInterval(self)
Gets the computational interval for spectrum slicing.
 
getInvariantSubspace(self)
Gets an orthonormal basis of the computed invariant subspace.
 
getIterationNumber(self)
Gets the current iteration number.
 
getJDBOrth(self)
Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems.
 
getJDBlockSize(self)
Gets the number of vectors to be added to the searching space in every iteration.
 
getJDConstCorrectionTol(self)
Returns the flag indicating if the dynamic stopping is being used for solving the correction equation.
 
getJDFix(self)
Gets the threshold for changing the target in the correction equation.
 
getJDInitialSize(self)
Gets the initial size of the searching space.
 
getJDKrylovStart(self)
Gets a flag indicating if the search subspace is started with a Krylov basis.
 
getJDRestart(self)
Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.
 
getKrylovSchurDetectZeros(self)
Gets the flag that enforces zero detection in spectrum slicing.
 
getKrylovSchurDimensions(self)
Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.
 
getKrylovSchurInertias(self)
Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval.
 
getKrylovSchurKSP(self)
Retrieve the linear solver object associated with the internal EPS object in case of doing spectrum slicing for a computational interval.
 
getKrylovSchurLocking(self)
Gets the locking flag used in the Krylov-Schur method.
 
getKrylovSchurPartitions(self)
Gets the number of partitions of the communicator in case of spectrum slicing.
 
getKrylovSchurRestart(self)
Gets the restart parameter used in the Krylov-Schur method.
 
getKrylovSchurSubcommInfo(self)
Gets information related to the case of doing spectrum slicing for a computational interval with multiple communicators.
 
getKrylovSchurSubcommMats(self)
Gets the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs.
 
getKrylovSchurSubcommPairs(self, int i, Vec V)
Gets the i-th eigenpair stored internally in the multi-communicator to which the calling process belongs.
 
getKrylovSchurSubintervals(self)
Returns the points that delimit the subintervals used in spectrum slicing with several partitions.
 
getLOBPCGBlockSize(self)
Gets the block size used in the LOBPCG method.
 
getLOBPCGLocking(self)
Gets the locking flag used in the LOBPCG method.
 
getLOBPCGRestart(self)
Gets the restart parameter used in the LOBPCG method.
 
getLanczosReorthogType(self)
Gets the type of reorthogonalization used during the Lanczos iteration.
 
getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None)
Gets the i-th left eigenvector as computed by solve().
 
getLyapIIRanks(self)
Return the rank values used for the Lyapunov step.
 
getMonitor(self)
Gets the list of monitor functions.
 
getOperators(self)
Gets the matrices associated with the eigenvalue problem.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all EPS options in the database.
 
getPowerShiftType(self)
Gets the type of shifts used during the power iteration.
 
getProblemType(self)
Gets the problem type from the EPS object.
 
getPurify(self)
Returns the flag indicating whether purification is activated or not.
 
getRG(self)
Obtain the region object associated to the eigensolver.
 
getRQCGReset(self)
Gets the reset parameter used in the RQCG method.
 
getST(self)
Obtain the spectral transformation (ST) object associated to the eigensolver object.
 
getStoppingTest(self)
Gets the stopping function.
 
getTarget(self)
Gets the value of the target.
 
getTolerances(self)
Gets the tolerance and maximum iteration count used by the default EPS convergence tests.
 
getTrackAll(self)
Returns the flag indicating whether all residual norms must be computed or not.
 
getTrueResidual(self)
Returns the flag indicating whether true residual must be computed explicitly or not.
 
getTwoSided(self)
Returns the flag indicating whether a two-sided variant of the algorithm is being used or not.
 
getType(self)
Gets the EPS type of this object.
 
getWhichEigenpairs(self)
Returns which portion of the spectrum is to be sought.
 
isGeneralized(self)
Tells whether the EPS object corresponds to a generalized eigenvalue problem.
 
isHermitian(self)
Tells whether the EPS object corresponds to a Hermitian eigenvalue problem.
 
isPositive(self)
Tells whether the EPS object corresponds to an eigenvalue problem type that requires a positive (semi-) definite matrix B.
 
reset(self)
Resets the EPS object.
 
setArbitrarySelection(self, arbitrary, args=None, kargs=None)
Sets a function to look for eigenvalues according to an arbitrary selection criterion.
 
setArnoldiDelayed(self, delayed)
Activates or deactivates delayed reorthogonalization in the Arnoldi iteration.
 
setBV(self, BV bv)
Associates a basis vectors object to the eigensolver.
 
setBalance(self, balance=None, iterations=None, cutoff=None)
Specifies the balancing technique to be employed by the eigensolver, and some parameters associated to it.
 
setCISSExtraction(self, extraction)
Sets the extraction technique used in the CISS solver.
 
setCISSQuadRule(self, quad)
Sets the quadrature rule used in the CISS solver.
 
setCISSRefinement(self, inner=None, blsize=None)
Sets the values of various refinement parameters in the CISS solver.
 
setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)
Sets the values of various size parameters in the CISS solver.
 
setCISSThreshold(self, delta=None, spur=None)
Sets the values of various threshold parameters in the CISS solver.
 
setCISSUseST(self, usest)
Sets a flag indicating that the CISS solver will use the ST object for the linear solves.
 
setConvergenceTest(self, conv)
Specifies how to compute the error estimate used in the convergence test.
 
setDS(self, DS ds)
Associates a direct solver object to the eigensolver.
 
setDeflationSpace(self, space)
Add vectors to the basis of the deflation space.
 
setDimensions(self, nev=None, ncv=None, mpd=None)
Sets the number of eigenvalues to compute and the dimension of the subspace.
 
setEigenvalueComparison(self, comparison, args=None, kargs=None)
Specifies the eigenvalue comparison function when setWhichEigenpairs() is set to EPS.Which.USER.
 
setExtraction(self, extraction)
Sets the extraction type used by the EPS object.
 
setFromOptions(self)
Sets EPS options from the options database.
 
setGDBOrth(self, borth)
Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems.
 
setGDBlockSize(self, bs)
Sets the number of vectors to be added to the searching space in every iteration.
 
setGDDoubleExpansion(self, doubleexp)
Activate a variant where the search subspace is expanded with K*[A*x B*x] (double expansion) instead of the classic K*r, where K is the preconditioner, x the selected approximate eigenvector and r its associated residual vector.
 
setGDInitialSize(self, initialsize)
Sets the initial size of the searching space.
 
setGDKrylovStart(self, krylovstart=True)
Activates or deactivates starting the search subspace with a Krylov basis.
 
setGDRestart(self, minv=None, plusk=None)
Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.
 
setInitialSpace(self, space)
Sets the initial space from which the eigensolver starts to iterate.
 
setInterval(self, inta, intb)
Defines the computational interval for spectrum slicing.
 
setJDBOrth(self, borth)
Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems.
 
setJDBlockSize(self, bs)
Sets the number of vectors to be added to the searching space in every iteration.
 
setJDConstCorrectionTol(self, constant)
Deactivates the dynamic stopping criterion that sets the KSP relative tolerance to 0.5**i, where i is the number of EPS iterations from the last converged value.
 
setJDFix(self, fix)
Sets the threshold for changing the target in the correction equation.
 
setJDInitialSize(self, initialsize)
Sets the initial size of the searching space.
 
setJDKrylovStart(self, krylovstart=True)
Activates or deactivates starting the search subspace with a Krylov basis.
 
setJDRestart(self, minv=None, plusk=None)
Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.
 
setKrylovSchurDetectZeros(self, detect)
Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation.
 
setKrylovSchurDimensions(self, nev=None, ncv=None, mpd=None)
Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.
 
setKrylovSchurLocking(self, lock)
Choose between locking and non-locking variants of the Krylov-Schur method.
 
setKrylovSchurPartitions(self, npart)
Sets the number of partitions for the case of doing spectrum slicing for a computational interval with the communicator split in several sub-communicators.
 
setKrylovSchurRestart(self, keep)
Sets the restart parameter for the Krylov-Schur method, in particular the proportion of basis vectors that must be kept after restart.
 
setKrylovSchurSubintervals(self, subint)
Sets the subinterval boundaries for spectrum slicing with a computational interval.
 
setLOBPCGBlockSize(self, bs)
Sets the block size of the LOBPCG method.
 
setLOBPCGLocking(self, lock)
Choose between locking and non-locking variants of the LOBPCG method.
 
setLOBPCGRestart(self, restart)
Sets the restart parameter for the LOBPCG method.
 
setLanczosReorthogType(self, reorthog)
Sets the type of reorthogonalization used during the Lanczos iteration.
 
setLeftInitialSpace(self, space)
Sets the left initial space from which the eigensolver starts to iterate.
 
setLyapIIRanks(self, rkc=None, rkl=None)
Set the ranks used in the solution of the Lyapunov equation.
 
setMonitor(self, monitor, args=None, kargs=None)
Appends a monitor function to the list of monitors.
 
setOperators(self, Mat A, Mat B=None)
Sets the matrices associated with the eigenvalue problem.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all EPS options in the database.
 
setPowerShiftType(self, shift)
Sets the type of shifts used during the power iteration.
 
setProblemType(self, problem_type)
Specifies the type of the eigenvalue problem.
 
setPurify(self, purify=True)
Activate or deactivate eigenvector purification.
 
setRG(self, RG rg)
Associates a region object to the eigensolver.
 
setRQCGReset(self, nrest)
Sets the reset parameter of the RQCG iteration.
 
setST(self, ST st)
Associates a spectral transformation object to the eigensolver.
 
setStoppingTest(self, stopping, args=None, kargs=None)
Sets a function to decide when to stop the outer iteration of the eigensolver.
 
setTarget(self, target)
Sets the value of the target.
 
setTolerances(self, tol=None, max_it=None)
Sets the tolerance and maximum iteration count used by the default EPS convergence tests.
 
setTrackAll(self, trackall)
Specifies if the solver must compute the residual of all approximate eigenpairs or not.
 
setTrueResidual(self, trueres)
Specifies if the solver must compute the true residual explicitly or not.
 
setTwoSided(self, twosided)
Sets the solver to use a two-sided variant so that left eigenvectors are also computed.
 
setType(self, eps_type)
Selects the particular solver to be used in the EPS object.
 
setUp(self)
Sets up all the internal data structures necessary for the execution of the eigensolver.
 
setWhichEigenpairs(self, which)
Specifies which portion of the spectrum is to be sought.
 
solve(self)
Solves the eigensystem.
 
updateKrylovSchurSubcommMats(self, s=1.0, a=1.0, Mat Au=None, t=1.0, b=1.0, Mat Bu=None, structure=None, globalup=False)
Update the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs.
 
valuesView(self, Viewer viewer=None)
Displays the computed eigenvalues in a viewer.
 
vectorsView(self, Viewer viewer=None)
Outputs computed eigenvectors to a viewer.
 
view(self, Viewer viewer=None)
Prints the EPS data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  bv
  ds
  extraction
  max_it
  problem_type
  purify
  rg
  st
  target
  tol
  track_all
  true_residual
  two_sided
  which

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

appendOptionsPrefix(self, prefix)

 

Appends to the prefix used for searching for all EPS options in the database.

Parameters

prefix: string
The prefix string to prepend to all EPS option requests.
Overrides: petsc4py.PETSc.Object.appendOptionsPrefix

computeError(self, int i, etype=None)

 

Computes the error (based on the residual norm) associated with the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.
etype: EPS.ErrorType enumerate
The error type to compute.

Returns

e: real
The error bound, computed in various ways from the residual norm ||Ax-kBx||_2 where k is the eigenvalue and x is the eigenvector.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()).

create(self, comm=None)

 

Creates the EPS object.

Parameters

comm: MPI_Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the EPS object.
Overrides: petsc4py.PETSc.Object.destroy

errorView(self, etype=None, Viewer viewer=None)

 

Displays the errors associated with the computed solution (as well as the eigenvalues).

Parameters

etype: EPS.ErrorType enumerate, optional
The error type to compute.
viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

Notes

By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ASCII_INFO_DETAIL then a table with eigenvalues and corresponding errors is printed.

getArnoldiDelayed(self)

 

Gets the type of reorthogonalization used during the Arnoldi iteration.

Returns

delayed: bool
True if delayed reorthogonalization is to be used.

getBV(self)

 

Obtain the basis vector objects associated to the eigensolver.

Returns

bv: BV
The basis vectors context.

getBalance(self)

 

Gets the balancing type used by the EPS object, and the associated parameters.

Returns

balance: EPS.Balance enumerate
The balancing method
iterations: int
Number of iterations of the balancing algorithm
cutoff: real
Cutoff value

getCISSExtraction(self)

 

Gets the extraction technique used in the CISS solver.

Returns

extraction: EPS.CISSExtraction enumerate
The extraction technique.

getCISSKSPs(self)

 

Retrieve the array of linear solver objects associated with the CISS solver.

Returns

ksp: list of KSP
The linear solver objects.

Notes

The number of KSP solvers is equal to the number of integration points divided by the number of partitions. This value is halved in the case of real matrices with a region centered at the real axis.

getCISSQuadRule(self)

 

Gets the quadrature rule used in the CISS solver.

Returns

quad: EPS.CISSQuadRule enumerate
The quadrature rule.

getCISSRefinement(self)

 

Gets the values of various refinement parameters in the CISS solver.

Returns

inner: int
Number of iterative refinement iterations (inner loop).
blsize: int
Number of iterative refinement iterations (blocksize loop).

getCISSSizes(self)

 

Gets the values of various size parameters in the CISS solver.

Returns

ip: int
Number of integration points.
bs: int
Block size.
ms: int
Moment size.
npart: int
Number of partitions when splitting the communicator.
bsmax: int
Maximum block size.
realmats: bool
True if A and B are real.

getCISSThreshold(self)

 

Gets the values of various threshold parameters in the CISS solver.

Returns

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs.

getCISSUseST(self)

 

Gets the flag for using the ST object in the CISS solver.

Returns

usest: bool
Whether to use the ST object or not.

getConverged(self)

 

Gets the number of converged eigenpairs.

Returns

nconv: int
Number of converged eigenpairs.

Notes

This function should be called after solve() has finished.

getConvergedReason(self)

 

Gets the reason why the solve() iteration was stopped.

Returns

reason: EPS.ConvergedReason enumerate
Negative value indicates diverged, positive value converged.

getConvergenceTest(self)

 

Return the method used to compute the error estimate used in the convergence test.

Returns

conv: EPS.Conv
The method used to compute the error estimate used in the convergence test.

getDS(self)

 

Obtain the direct solver associated to the eigensolver.

Returns

ds: DS
The direct solver context.

getDimensions(self)

 

Gets the number of eigenvalues to compute and the dimension of the subspace.

Returns

nev: int
Number of eigenvalues to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)

 

Gets the i-th solution of the eigenproblem as computed by solve(). The solution consists of both the eigenvalue and the eigenvector.

Parameters

i: int
Index of the solution to be obtained.
Vr: Vec
Placeholder for the returned eigenvector (real part).
Vi: Vec
Placeholder for the returned eigenvector (imaginary part).

Returns

e: scalar (possibly complex)
The computed eigenvalue.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()). Eigenpairs are indexed according to the ordering criterion established with setWhichEigenpairs().

getEigenvalue(self, int i)

 

Gets the i-th eigenvalue as computed by solve().

Parameters

i: int
Index of the solution to be obtained.

Returns

e: scalar (possibly complex)
The computed eigenvalue.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()). Eigenpairs are indexed according to the ordering criterion established with setWhichEigenpairs().

getEigenvector(self, int i, Vec Vr, Vec Vi=None)

 

Gets the i-th eigenvector as computed by solve().

Parameters

i: int
Index of the solution to be obtained.
Vr: Vec
Placeholder for the returned eigenvector (real part).
Vi: Vec, optional
Placeholder for the returned eigenvector (imaginary part).

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()). Eigenpairs are indexed according to the ordering criterion established with setWhichEigenpairs().

getErrorEstimate(self, int i)

 

Returns the error estimate associated to the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.

Returns

e: real
Error estimate.

Notes

This is the error estimate used internally by the eigensolver. The actual error bound can be computed with computeError().

getExtraction(self)

 

Gets the extraction type used by the EPS object.

Returns

extraction: EPS.Extraction enumerate
The method of extraction.

getGDBOrth(self)

 

Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems.

Returns

borth: bool
Whether to B-orthogonalize the search subspace.

getGDBlockSize(self)

 

Gets the number of vectors to be added to the searching space in every iteration.

Returns

bs: int
The number of vectors added to the search space in every iteration.

getGDDoubleExpansion(self)

 

Gets a flag indicating whether the double expansion variant has been activated or not.

Returns

doubleexp: bool
True if using double expansion.

getGDInitialSize(self)

 

Gets the initial size of the searching space.

Returns

initialsize: int
The number of vectors of the initial searching subspace.

getGDKrylovStart(self)

 

Gets a flag indicating if the search subspace is started with a Krylov basis.

Returns

krylovstart: bool
True if starting the search subspace with a Krylov basis.

getGDRestart(self)

 

Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.

Returns

minv: int
The number of vectors of the search subspace after restart.
plusk: int
The number of vectors saved from the previous iteration.

getInterval(self)

 

Gets the computational interval for spectrum slicing.

Returns

inta: float
The left end of the interval.
intb: float
The right end of the interval.

Notes

If the interval was not set by the user, then zeros are returned.

getInvariantSubspace(self)

 

Gets an orthonormal basis of the computed invariant subspace.

Returns

subspace: list of Vec
Basis of the invariant subspace.

Notes

This function should be called after solve() has finished.

The returned vectors span an invariant subspace associated with the computed eigenvalues. An invariant subspace X of A` satisfies ``A x in X for all x in X (a similar definition applies for generalized eigenproblems).

getIterationNumber(self)

 

Gets the current iteration number. If the call to solve() is complete, then it returns the number of iterations carried out by the solution method.

Returns

its: int
Iteration number.

getJDBOrth(self)

 

Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems.

Returns

borth: bool
Whether to B-orthogonalize the search subspace.

getJDBlockSize(self)

 

Gets the number of vectors to be added to the searching space in every iteration.

Returns

bs: int
The number of vectors added to the search space in every iteration.

getJDConstCorrectionTol(self)

 

Returns the flag indicating if the dynamic stopping is being used for solving the correction equation.

Returns

constant: bool
Flag indicating if the dynamic stopping criterion is not being used.

getJDFix(self)

 

Gets the threshold for changing the target in the correction equation.

Returns

fix: float
The threshold for changing the target.

getJDInitialSize(self)

 

Gets the initial size of the searching space.

Returns

initialsize: int
The number of vectors of the initial searching subspace.

getJDKrylovStart(self)

 

Gets a flag indicating if the search subspace is started with a Krylov basis.

Returns

krylovstart: bool
True if starting the search subspace with a Krylov basis.

getJDRestart(self)

 

Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.

Returns

minv: int
The number of vectors of the search subspace after restart.
plusk: int
The number of vectors saved from the previous iteration.

getKrylovSchurDetectZeros(self)

 

Gets the flag that enforces zero detection in spectrum slicing.

Returns

detect: bool
The zero detection flag.

getKrylovSchurDimensions(self)

 

Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.

Returns

nev: int
Number of eigenvalues to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getKrylovSchurInertias(self)

 

Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval.

Returns

shifts: list of float
The values of the shifts used internally in the solver.
inertias: list of int
The values of the inertia in each shift.

getKrylovSchurKSP(self)

 

Retrieve the linear solver object associated with the internal EPS object in case of doing spectrum slicing for a computational interval.

Returns

ksp: KSP
The linear solver object.

getKrylovSchurLocking(self)

 

Gets the locking flag used in the Krylov-Schur method.

Returns

lock: bool
The locking flag.

getKrylovSchurPartitions(self)

 

Gets the number of partitions of the communicator in case of spectrum slicing.

Returns

npart: int
The number of partitions.

getKrylovSchurRestart(self)

 

Gets the restart parameter used in the Krylov-Schur method.

Returns

keep: float
The number of vectors to be kept at restart.

getKrylovSchurSubcommInfo(self)

 

Gets information related to the case of doing spectrum slicing for a computational interval with multiple communicators.

Returns

k: int
Number of the subinterval for the calling process.
n: int
Number of eigenvalues found in the k-th subinterval.
v: Vec
A vector owned by processes in the subcommunicator with dimensions compatible for locally computed eigenvectors.

Notes

This function is only available for spectrum slicing runs.

The returned Vec should be destroyed by the user.

getKrylovSchurSubcommMats(self)

 

Gets the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs.

Returns

A: Mat
The matrix associated with the eigensystem.
B: Mat
The second matrix in the case of generalized eigenproblems.

Notes

This is the analog of getOperators(), but returns the matrices distributed differently (in the subcommunicator rather than in the parent communicator).

These matrices should not be modified by the user.

getKrylovSchurSubcommPairs(self, int i, Vec V)

 

Gets the i-th eigenpair stored internally in the multi-communicator to which the calling process belongs.

Parameters

i: int
Index of the solution to be obtained.
V: Vec
Placeholder for the returned eigenvector.

Returns

e: scalar
The computed eigenvalue.

Notes

The index i should be a value between 0 and n-1, where n is the number of vectors in the local subinterval, see getKrylovSchurSubcommInfo().

getKrylovSchurSubintervals(self)

 

Returns the points that delimit the subintervals used in spectrum slicing with several partitions.

Returns

subint: list of float
Real values specifying subintervals

getLOBPCGBlockSize(self)

 

Gets the block size used in the LOBPCG method.

Returns

bs: int
The block size.

getLOBPCGLocking(self)

 

Gets the locking flag used in the LOBPCG method.

Returns

lock: bool
The locking flag.

getLOBPCGRestart(self)

 

Gets the restart parameter used in the LOBPCG method.

Returns

restart: float
The restart parameter.

getLanczosReorthogType(self)

 

Gets the type of reorthogonalization used during the Lanczos iteration.

Returns

reorthog: EPS.LanczosReorthogType enumerate
The type of reorthogonalization.

getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None)

 

Gets the i-th left eigenvector as computed by solve().

Parameters

i: int
Index of the solution to be obtained.
Wr: Vec
Placeholder for the returned eigenvector (real part).
Wi: Vec, optional
Placeholder for the returned eigenvector (imaginary part).

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()). Eigensolutions are indexed according to the ordering criterion established with setWhichEigenpairs().

Left eigenvectors are available only if the twosided flag was set with setTwoSided().

getLyapIIRanks(self)

 

Return the rank values used for the Lyapunov step.

Returns

rkc: int
The compressed rank.
rkl: int
The Lyapunov rank.

getOperators(self)

 

Gets the matrices associated with the eigenvalue problem.

Returns

A: Mat
The matrix associated with the eigensystem.
B: Mat
The second matrix in the case of generalized eigenproblems.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all EPS options in the database.

Returns

prefix: string
The prefix string set for this EPS object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getPowerShiftType(self)

 

Gets the type of shifts used during the power iteration.

Returns

shift: EPS.PowerShiftType enumerate
The type of shift.

getProblemType(self)

 

Gets the problem type from the EPS object.

Returns

problem_type: EPS.ProblemType enumerate
The problem type that was previously set.

getPurify(self)

 

Returns the flag indicating whether purification is activated or not.

Returns

purify: bool
Whether purification is activated or not.

getRG(self)

 

Obtain the region object associated to the eigensolver.

Returns

rg: RG
The region context.

getRQCGReset(self)

 

Gets the reset parameter used in the RQCG method.

Returns

nrest: int
The number of iterations between resets.

getST(self)

 

Obtain the spectral transformation (ST) object associated to the eigensolver object.

Returns

st: ST
The spectral transformation.

getTarget(self)

 

Gets the value of the target.

Returns

target: float (real or complex)
The value of the target.

Notes

If the target was not set by the user, then zero is returned.

getTolerances(self)

 

Gets the tolerance and maximum iteration count used by the default EPS convergence tests.

Returns

tol: float
The convergence tolerance.
max_it: int
The maximum number of iterations

getTrackAll(self)

 

Returns the flag indicating whether all residual norms must be computed or not.

Returns

trackall: bool
Whether the solver compute all residuals or not.

getTrueResidual(self)

 

Returns the flag indicating whether true residual must be computed explicitly or not.

Returns

trueres: bool
Whether the solver compute all residuals or not.

getTwoSided(self)

 

Returns the flag indicating whether a two-sided variant of the algorithm is being used or not.

Returns

twosided: bool
Whether the two-sided variant is to be used or not.

getType(self)

 

Gets the EPS type of this object.

Returns

type: EPS.Type enumerate
The solver currently being used.
Overrides: petsc4py.PETSc.Object.getType

getWhichEigenpairs(self)

 

Returns which portion of the spectrum is to be sought.

Returns

which: EPS.Which enumerate
The portion of the spectrum to be sought by the solver.

isGeneralized(self)

 

Tells whether the EPS object corresponds to a generalized eigenvalue problem.

Returns

flag: bool
True if two matrices were set with setOperators().

isHermitian(self)

 

Tells whether the EPS object corresponds to a Hermitian eigenvalue problem.

Returns

flag: bool
True if the problem type set with setProblemType() was Hermitian.

isPositive(self)

 

Tells whether the EPS object corresponds to an eigenvalue problem type that requires a positive (semi-) definite matrix B.

Returns

flag: bool
True if the problem type set with setProblemType() was positive.

setArbitrarySelection(self, arbitrary, args=None, kargs=None)

 
Sets a function to look for eigenvalues according to an arbitrary selection criterion. This criterion can be based on a computation involving the current eigenvector approximation.

setArnoldiDelayed(self, delayed)

 

Activates or deactivates delayed reorthogonalization in the Arnoldi iteration.

Parameters

delayed: bool
True if delayed reorthogonalization is to be used.

Notes

This call is only relevant if the type was set to EPS.Type.ARNOLDI with setType().

Delayed reorthogonalization is an aggressive optimization for the Arnoldi eigensolver than may provide better scalability, but sometimes makes the solver converge less than the default algorithm.

setBV(self, BV bv)

 

Associates a basis vectors object to the eigensolver.

Parameters

bv: BV
The basis vectors context.

setBalance(self, balance=None, iterations=None, cutoff=None)

 

Specifies the balancing technique to be employed by the eigensolver, and some parameters associated to it.

Parameters

balance: EPS.Balance enumerate
The balancing method
iterations: int
Number of iterations of the balancing algorithm
cutoff: real
Cutoff value

setCISSExtraction(self, extraction)

 

Sets the extraction technique used in the CISS solver.

Parameters

extraction: EPS.CISSExtraction enumerate
The extraction technique.

setCISSQuadRule(self, quad)

 

Sets the quadrature rule used in the CISS solver.

Parameters

quad: EPS.CISSQuadRule enumerate
The quadrature rule.

setCISSRefinement(self, inner=None, blsize=None)

 

Sets the values of various refinement parameters in the CISS solver.

Parameters

inner: int, optional
Number of iterative refinement iterations (inner loop).
blsize: int, optional
Number of iterative refinement iterations (blocksize loop).

setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)

 

Sets the values of various size parameters in the CISS solver.

Parameters

ip: int, optional
Number of integration points.
bs: int, optional
Block size.
ms: int, optional
Moment size.
npart: int, optional
Number of partitions when splitting the communicator.
bsmax: int, optional
Maximum block size.
realmats: bool, optional
True if A and B are real.

Notes

The default number of partitions is 1. This means the internal KSP object is shared among all processes of the EPS communicator. Otherwise, the communicator is split into npart communicators, so that npart KSP solves proceed simultaneously.

setCISSThreshold(self, delta=None, spur=None)

 

Sets the values of various threshold parameters in the CISS solver.

Parameters

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs).

setCISSUseST(self, usest)

 

Sets a flag indicating that the CISS solver will use the ST object for the linear solves.

Parameters

usest: bool
Whether to use the ST object or not.

setConvergenceTest(self, conv)

 

Specifies how to compute the error estimate used in the convergence test.

Parameters

conv: EPS.Conv
The method used to compute the error estimate used in the convergence test.

setDS(self, DS ds)

 

Associates a direct solver object to the eigensolver.

Parameters

ds: DS
The direct solver context.

setDeflationSpace(self, space)

 

Add vectors to the basis of the deflation space.

Parameters

space: a Vec or an array of Vec
Set of basis vectors to be added to the deflation space.

Notes

When a deflation space is given, the eigensolver seeks the eigensolution in the restriction of the problem to the orthogonal complement of this space. This can be used for instance in the case that an invariant subspace is known beforehand (such as the nullspace of the matrix).

The vectors do not need to be mutually orthonormal, since they are explicitly orthonormalized internally.

These vectors do not persist from one solve() call to the other, so the deflation space should be set every time.

setDimensions(self, nev=None, ncv=None, mpd=None)

 

Sets the number of eigenvalues to compute and the dimension of the subspace.

Parameters

nev: int, optional
Number of eigenvalues to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

Notes

Use DECIDE for ncv and mpd to assign a reasonably good value, which is dependent on the solution method.

The parameters ncv and mpd are intimately related, so that the user is advised to set one of them at most. Normal usage is the following:

  • In cases where nev is small, the user sets ncv (a reasonable default is 2 * nev).
  • In cases where nev is large, the user sets mpd.

The value of ncv should always be between nev and (nev + mpd), typically ncv = nev + mpd. If nev is not too large, mpd = nev is a reasonable choice, otherwise a smaller value should be used.

setExtraction(self, extraction)

 

Sets the extraction type used by the EPS object.

Parameters

extraction: EPS.Extraction enumerate
The extraction method to be used by the solver.

Notes

Not all eigensolvers support all types of extraction. See the SLEPc documentation for details.

By default, a standard Rayleigh-Ritz extraction is used. Other extractions may be useful when computing interior eigenvalues.

Harmonic-type extractions are used in combination with a target. See setTarget().

setFromOptions(self)

 

Sets EPS options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setGDBOrth(self, borth)

 

Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems.

Parameters

borth: bool
Whether to B-orthogonalize the search subspace.

setGDBlockSize(self, bs)

 

Sets the number of vectors to be added to the searching space in every iteration.

Parameters

bs: int
The number of vectors added to the search space in every iteration.

setGDDoubleExpansion(self, doubleexp)

 

Activate a variant where the search subspace is expanded with K*[A*x B*x] (double expansion) instead of the classic K*r, where K is the preconditioner, x the selected approximate eigenvector and r its associated residual vector.

Parameters

doubleexp: bool
True if using double expansion.

setGDInitialSize(self, initialsize)

 

Sets the initial size of the searching space.

Parameters

initialsize: int
The number of vectors of the initial searching subspace.

setGDKrylovStart(self, krylovstart=True)

 

Activates or deactivates starting the search subspace with a Krylov basis.

Parameters

krylovstart: bool
True if starting the search subspace with a Krylov basis.

setGDRestart(self, minv=None, plusk=None)

 

Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.

Parameters

minv: int, optional
The number of vectors of the search subspace after restart.
plusk: int, optional
The number of vectors saved from the previous iteration.

setInitialSpace(self, space)

 

Sets the initial space from which the eigensolver starts to iterate.

Parameters

space: Vec or sequence of Vec
The initial space

Notes

Some solvers start to iterate on a single vector (initial vector). In that case, the other vectors are ignored.

In contrast to setDeflationSpace(), these vectors do not persist from one solve() call to the other, so the initial space should be set every time.

The vectors do not need to be mutually orthonormal, since they are explicitly orthonormalized internally.

Common usage of this function is when the user can provide a rough approximation of the wanted eigenspace. Then, convergence may be faster.

setInterval(self, inta, intb)

 

Defines the computational interval for spectrum slicing.

Parameters

inta: float
The left end of the interval.
intb: float
The right end of the interval.

Notes

Spectrum slicing is a technique employed for computing all eigenvalues of symmetric eigenproblems in a given interval. This function provides the interval to be considered. It must be used in combination with EPS.Which.ALL, see setWhichEigenpairs().

setJDBOrth(self, borth)

 

Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems.

Parameters

borth: bool
Whether to B-orthogonalize the search subspace.

setJDBlockSize(self, bs)

 

Sets the number of vectors to be added to the searching space in every iteration.

Parameters

bs: int
The number of vectors added to the search space in every iteration.

setJDConstCorrectionTol(self, constant)

 

Deactivates the dynamic stopping criterion that sets the KSP relative tolerance to 0.5**i, where i is the number of EPS iterations from the last converged value.

Parameters

constant: bool
If False, the KSP relative tolerance is set to 0.5**i.

setJDFix(self, fix)

 

Sets the threshold for changing the target in the correction equation.

Parameters

fix: float
The threshold for changing the target.

Notes

The target in the correction equation is fixed at the first iterations. When the norm of the residual vector is lower than the fix value, the target is set to the corresponding eigenvalue.

setJDInitialSize(self, initialsize)

 

Sets the initial size of the searching space.

Parameters

initialsize: int
The number of vectors of the initial searching subspace.

setJDKrylovStart(self, krylovstart=True)

 

Activates or deactivates starting the search subspace with a Krylov basis.

Parameters

krylovstart: bool
True if starting the search subspace with a Krylov basis.

setJDRestart(self, minv=None, plusk=None)

 

Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration.

Parameters

minv: int, optional
The number of vectors of the search subspace after restart.
plusk: int, optional
The number of vectors saved from the previous iteration.

setKrylovSchurDetectZeros(self, detect)

 

Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation.

Parameters

detect: bool
True if zeros must checked for.

Notes

A zero in the factorization indicates that a shift coincides with an eigenvalue.

This flag is turned off by default, and may be necessary in some cases, especially when several partitions are being used. This feature currently requires an external package for factorizations with support for zero detection, e.g. MUMPS.

setKrylovSchurDimensions(self, nev=None, ncv=None, mpd=None)

 

Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. The meaning of the parameters is the same as in setDimensions().

Parameters

nev: int, optional
Number of eigenvalues to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

setKrylovSchurLocking(self, lock)

 

Choose between locking and non-locking variants of the Krylov-Schur method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setKrylovSchurPartitions(self, npart)

 

Sets the number of partitions for the case of doing spectrum slicing for a computational interval with the communicator split in several sub-communicators.

Parameters

npart: int
The number of partitions.

Notes

By default, npart=1 so all processes in the communicator participate in the processing of the whole interval. If npart>1 then the interval is divided into npart subintervals, each of them being processed by a subset of processes.

setKrylovSchurRestart(self, keep)

 

Sets the restart parameter for the Krylov-Schur method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setKrylovSchurSubintervals(self, subint)

 

Sets the subinterval boundaries for spectrum slicing with a computational interval.

Parameters

subint: list of float
Real values specifying subintervals

Notes

This function must be called after setKrylovSchurPartitions(). For npart partitions, the argument subint must contain npart+1 real values sorted in ascending order: subint_0, subint_1, ..., subint_npart, where the first and last values must coincide with the interval endpoints set with EPSSetInterval(). The subintervals are then defined by two consecutive points: [subint_0,subint_1], [subint_1,subint_2], and so on.

setLOBPCGBlockSize(self, bs)

 

Sets the block size of the LOBPCG method.

Parameters

bs: int
The block size.

setLOBPCGLocking(self, lock)

 

Choose between locking and non-locking variants of the LOBPCG method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

This flag refers to soft locking (converged vectors within the current block iterate), since hard locking is always used (when nev is larger than the block size).

setLOBPCGRestart(self, restart)

 

Sets the restart parameter for the LOBPCG method. The meaning of this parameter is the proportion of vectors within the current block iterate that must have converged in order to force a restart with hard locking.

Parameters

restart: float
The percentage of the block of vectors to force a restart.

Notes

Allowed values are in the range [0.1,1.0]. The default is 0.9.

setLanczosReorthogType(self, reorthog)

 

Sets the type of reorthogonalization used during the Lanczos iteration.

Parameters

reorthog: EPS.LanczosReorthogType enumerate
The type of reorthogonalization.

Notes

This call is only relevant if the type was set to EPS.Type.LANCZOS with setType().

setLeftInitialSpace(self, space)

 

Sets the left initial space from which the eigensolver starts to iterate.

Parameters

space: Vec or sequence of Vec
The left initial space

Notes

Left initial vectors are used to initiate the left search space in two-sided eigensolvers. Users should pass here an approximation of the left eigenspace, if available.

The same comments in setInitialSpace() are applicable here.

setLyapIIRanks(self, rkc=None, rkl=None)

 

Set the ranks used in the solution of the Lyapunov equation.

Parameters

rkc: int, optional
The compressed rank.
rkl: int, optional
The Lyapunov rank.

setOperators(self, Mat A, Mat B=None)

 

Sets the matrices associated with the eigenvalue problem.

Parameters

A: Mat
The matrix associated with the eigensystem.
B: Mat, optional
The second matrix in the case of generalized eigenproblems; if not provided, a standard eigenproblem is assumed.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all EPS options in the database.

Parameters

prefix: string
The prefix string to prepend to all EPS option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

For example, to distinguish between the runtime options for two different EPS contexts, one could call:

E1.setOptionsPrefix("eig1_")
E2.setOptionsPrefix("eig2_")
Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setPowerShiftType(self, shift)

 

Sets the type of shifts used during the power iteration. This can be used to emulate the Rayleigh Quotient Iteration (RQI) method.

Parameters

shift: EPS.PowerShiftType enumerate
The type of shift.

Notes

This call is only relevant if the type was set to EPS.Type.POWER with setType().

By default, shifts are constant (EPS.PowerShiftType.CONSTANT) and the iteration is the simple power method (or inverse iteration if a shift-and-invert transformation is being used).

A variable shift can be specified (EPS.PowerShiftType.RAYLEIGH or EPS.PowerShiftType.WILKINSON). In this case, the iteration behaves rather like a cubic converging method as RQI.

setProblemType(self, problem_type)

 

Specifies the type of the eigenvalue problem.

Parameters

problem_type: EPS.ProblemType enumerate
The problem type to be set.

Notes

Allowed values are: Hermitian (HEP), non-Hermitian (NHEP), generalized Hermitian (GHEP), generalized non-Hermitian (GNHEP), and generalized non-Hermitian with positive semi-definite B (PGNHEP).

This function must be used to instruct SLEPc to exploit symmetry. If no problem type is specified, by default a non-Hermitian problem is assumed (either standard or generalized). If the user knows that the problem is Hermitian (i.e. A=A^H) or generalized Hermitian (i.e. A=A^H, B=B^H, and B positive definite) then it is recommended to set the problem type so that eigensolver can exploit these properties.

setPurify(self, purify=True)

 

Activate or deactivate eigenvector purification.

Parameters

purify: bool, optional
True to activate purification (default).

setRG(self, RG rg)

 

Associates a region object to the eigensolver.

Parameters

rg: RG
The region context.

setRQCGReset(self, nrest)

 

Sets the reset parameter of the RQCG iteration. Every nrest iterations, the solver performs a Rayleigh-Ritz projection step.

Parameters

nrest: int
The number of iterations between resets.

setST(self, ST st)

 

Associates a spectral transformation object to the eigensolver.

Parameters

st: ST
The spectral transformation.

setTarget(self, target)

 

Sets the value of the target.

Parameters

target: float (real or complex)
The value of the target.

Notes

The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with setWhichEigenpairs().

setTolerances(self, tol=None, max_it=None)

 

Sets the tolerance and maximum iteration count used by the default EPS convergence tests.

Parameters

tol: float, optional
The convergence tolerance.
max_it: int, optional
The maximum number of iterations

Notes

Use DECIDE for maxits to assign a reasonably good value, which is dependent on the solution method.

setTrackAll(self, trackall)

 

Specifies if the solver must compute the residual of all approximate eigenpairs or not.

Parameters

trackall: bool
Whether compute all residuals or not.

setTrueResidual(self, trueres)

 

Specifies if the solver must compute the true residual explicitly or not.

Parameters

trueres: bool
Whether compute the true residual or not.

setTwoSided(self, twosided)

 

Sets the solver to use a two-sided variant so that left eigenvectors are also computed.

Parameters

twosided: bool
Whether the two-sided variant is to be used or not.

setType(self, eps_type)

 

Selects the particular solver to be used in the EPS object.

Parameters

eps_type: EPS.Type enumerate
The solver to be used.

Notes

See EPS.Type for available methods. The default is EPS.Type.KRYLOVSCHUR. Normally, it is best to use setFromOptions() and then set the EPS type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods.

setUp(self)

 

Sets up all the internal data structures necessary for the execution of the eigensolver.

Notes

This function need not be called explicitly in most cases, since solve() calls it. It can be useful when one wants to measure the set-up time separately from the solve time.

setWhichEigenpairs(self, which)

 

Specifies which portion of the spectrum is to be sought.

Parameters

which: EPS.Which enumerate
The portion of the spectrum to be sought by the solver.

Notes

Not all eigensolvers implemented in EPS account for all the possible values. Also, some values make sense only for certain types of problems. If SLEPc is compiled for real numbers EPS.Which.LARGEST_IMAGINARY and EPS.Which.SMALLEST_IMAGINARY use the absolute value of the imaginary part for eigenvalue selection.

updateKrylovSchurSubcommMats(self, s=1.0, a=1.0, Mat Au=None, t=1.0, b=1.0, Mat Bu=None, structure=None, globalup=False)

 

Update the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs.

Parameters

s: float (real or complex)
Scalar that multiplies the existing A matrix.
a: float (real or complex)
Scalar used in the axpy operation on A.
Au: Mat, optional
The matrix used in the axpy operation on A.
t: float (real or complex)
Scalar that multiplies the existing B matrix.
b: float (real or complex)
Scalar used in the axpy operation on B.
Bu: Mat, optional
The matrix used in the axpy operation on B.
structure: PETSc.Mat.Structure enumerate
Either same, different, or a subset of the non-zero sparsity pattern.
globalup: bool
Whether global matrices must be updated or not.

Notes

This function modifies the eigenproblem matrices at subcommunicator level, and optionally updates the global matrices in the parent communicator. The updates are expressed as A <-- s*A + a*Au, B <-- t*B + b*Bu.

It is possible to update one of the matrices, or both.

The matrices Au and Bu must be equal in all subcommunicators.

The structure flag is passed to the PETSc.Mat.axpy() operations to perform the updates.

If globalup is True, communication is carried out to reconstruct the updated matrices in the parent communicator.

valuesView(self, Viewer viewer=None)

 

Displays the computed eigenvalues in a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

vectorsView(self, Viewer viewer=None)

 

Outputs computed eigenvectors to a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

view(self, Viewer viewer=None)

 

Prints the EPS data structure.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Balance-class.html000066400000000000000000000224201454104675500241750ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Balance
Package slepc4py :: Module SLEPc :: Class EPS :: Class Balance
[hide private]
[frames] | no frames]

Class Balance


EPS type of balancing used for non-Hermitian problems

  • NONE: None.
  • ONESIDE: One-sided balancing.
  • TWOSIDE: Two-sided balancing.
  • USER: User-provided balancing matrices.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  NONE = 0
  ONESIDE = 1
  TWOSIDE = 2
  USER = 3
  __qualname__ = 'EPSBalance'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.CISSExtraction-class.html000066400000000000000000000211521454104675500254530ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.CISSExtraction
Package slepc4py :: Module SLEPc :: Class EPS :: Class CISSExtraction
[hide private]
[frames] | no frames]

Class CISSExtraction


EPS CISS extraction technique

  • RITZ: Ritz extraction.
  • HANKEL: Extraction via Hankel eigenproblem.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  HANKEL = 1
  RITZ = 0
  __qualname__ = 'EPSCISSExtraction'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.CISSQuadRule-class.html000066400000000000000000000211501454104675500250530ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.CISSQuadRule
Package slepc4py :: Module SLEPc :: Class EPS :: Class CISSQuadRule
[hide private]
[frames] | no frames]

Class CISSQuadRule


EPS CISS quadrature rule

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CHEBYSHEV = 2
  TRAPEZOIDAL = 1
  __qualname__ = 'EPSCISSQuadRule'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Conv-class.html000066400000000000000000000223331454104675500235600ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Conv
Package slepc4py :: Module SLEPc :: Class EPS :: Class Conv
[hide private]
[frames] | no frames]

Class Conv


EPS convergence test

  • ABS: Absolute convergence test.
  • REL: Convergence test relative to the eigenvalue.
  • NORM: Convergence test relative to the matrix norms.
  • USER: User-defined convergence test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABS = 0
  NORM = 2
  REL = 1
  USER = 3
  __qualname__ = 'EPSConv'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.ConvergedReason-class.html000066400000000000000000000253651454104675500257470ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.ConvergedReason
Package slepc4py :: Module SLEPc :: Class EPS :: Class ConvergedReason
[hide private]
[frames] | no frames]

Class ConvergedReason


EPS convergence reasons

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONVERGED_ITERATING = 0
  CONVERGED_TOL = 1
  CONVERGED_USER = 2
  DIVERGED_BREAKDOWN = -2
  DIVERGED_ITS = -1
  DIVERGED_SYMMETRY_LOST = -3
  ITERATING = 0
  __qualname__ = 'EPSConvergedReason'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.ErrorType-class.html000066400000000000000000000217061454104675500246110ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.ErrorType
Package slepc4py :: Module SLEPc :: Class EPS :: Class ErrorType
[hide private]
[frames] | no frames]

Class ErrorType


EPS error type to assess accuracy of computed solutions

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABSOLUTE = 0
  BACKWARD = 2
  RELATIVE = 1
  __qualname__ = 'EPSErrorType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Extraction-class.html000066400000000000000000000252731454104675500250010ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Extraction
Package slepc4py :: Module SLEPc :: Class EPS :: Class Extraction
[hide private]
[frames] | no frames]

Class Extraction


EPS extraction technique

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  HARMONIC = 1
  HARMONIC_LARGEST = 4
  HARMONIC_RELATIVE = 2
  HARMONIC_RIGHT = 3
  REFINED = 5
  REFINED_HARMONIC = 6
  RITZ = 0
  __qualname__ = 'EPSExtraction'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.LanczosReorthogType-class.html000066400000000000000000000243531454104675500266440ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.LanczosReorthogType
Package slepc4py :: Module SLEPc :: Class EPS :: Class LanczosReorthogType
[hide private]
[frames] | no frames]

Class LanczosReorthogType


EPS Lanczos reorthogonalization type

  • LOCAL: Local reorthogonalization only.
  • FULL: Full reorthogonalization.
  • SELECTIVE: Selective reorthogonalization.
  • PERIODIC: Periodic reorthogonalization.
  • PARTIAL: Partial reorthogonalization.
  • DELAYED: Delayed reorthogonalization.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  DELAYED = 5
  FULL = 1
  LOCAL = 0
  PARTIAL = 4
  PERIODIC = 3
  SELECTIVE = 2
  __qualname__ = 'EPSLanczosReorthogType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.PowerShiftType-class.html000066400000000000000000000217521454104675500256130ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.PowerShiftType
Package slepc4py :: Module SLEPc :: Class EPS :: Class PowerShiftType
[hide private]
[frames] | no frames]

Class PowerShiftType


EPS Power shift type.

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONSTANT = 0
  RAYLEIGH = 1
  WILKINSON = 2
  __qualname__ = 'EPSPowerShiftType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.ProblemType-class.html000066400000000000000000000243201454104675500251130ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.ProblemType
Package slepc4py :: Module SLEPc :: Class EPS :: Class ProblemType
[hide private]
[frames] | no frames]

Class ProblemType


EPS problem type

  • HEP: Hermitian eigenproblem.
  • NHEP: Non-Hermitian eigenproblem.
  • GHEP: Generalized Hermitian eigenproblem.
  • GNHEP: Generalized Non-Hermitian eigenproblem.
  • PGNHEP: Generalized Non-Hermitian eigenproblem
    with positive definite B.
  • GHIEP: Generalized Hermitian-indefinite eigenproblem.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  GHEP = 2
  GHIEP = 6
  GNHEP = 4
  HEP = 1
  NHEP = 3
  PGNHEP = 5
  __qualname__ = 'EPSProblemType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Stop-class.html000066400000000000000000000207321454104675500236010ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Stop
Package slepc4py :: Module SLEPc :: Class EPS :: Class Stop
[hide private]
[frames] | no frames]

Class Stop


EPS stopping test

  • BASIC: Default stopping test.
  • USER: User-defined stopping test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  BASIC = 0
  USER = 1
  __qualname__ = 'EPSStop'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Type-class.html000066400000000000000000000436561454104675500236070ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Type
Package slepc4py :: Module SLEPc :: Class EPS :: Class Type
[hide private]
[frames] | no frames]

Class Type


EPS type

Native sparse eigensolvers.

  • POWER: Power Iteration, Inverse Iteration, RQI.
  • SUBSPACE: Subspace Iteration.
  • ARNOLDI: Arnoldi.
  • LANCZOS: Lanczos.
  • KRYLOVSCHUR: Krylov-Schur (default).
  • GD: Generalized Davidson.
  • JD: Jacobi-Davidson.
  • RQCG: Rayleigh Quotient Conjugate Gradient.
  • LOBPCG: Locally Optimal Block Preconditioned Conjugate Gradient.
  • CISS: Contour Integral Spectrum Slicing.
  • LYAPII: Lyapunov inverse iteration.
  • LAPACK: Wrappers to dense eigensolvers in Lapack.

Wrappers to external eigensolvers (should be enabled during installation of SLEPc)

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ARNOLDI = 'arnoldi'
  ARPACK = 'arpack'
  BLOPEX = 'blopex'
  CISS = 'ciss'
  ELEMENTAL = 'elemental'
  ELPA = 'elpa'
  EVSL = 'evsl'
  FEAST = 'feast'
  GD = 'gd'
  JD = 'jd'
  KRYLOVSCHUR = 'krylovschur'
  LANCZOS = 'lanczos'
  LAPACK = 'lapack'
  LOBPCG = 'lobpcg'
  LYAPII = 'lyapii'
  POWER = 'power'
  PRIMME = 'primme'
  RQCG = 'rqcg'
  SCALAPACK = 'scalapack'
  SUBSPACE = 'subspace'
  TRLAN = 'trlan'
  __qualname__ = 'EPSType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.EPS.Which-class.html000066400000000000000000000302741454104675500237200ustar00rootroot00000000000000 slepc4py.SLEPc.EPS.Which
Package slepc4py :: Module SLEPc :: Class EPS :: Class Which
[hide private]
[frames] | no frames]

Class Which


EPS desired part of spectrum

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ALL = 10
  LARGEST_IMAGINARY = 5
  LARGEST_MAGNITUDE = 1
  LARGEST_REAL = 3
  SMALLEST_IMAGINARY = 6
  SMALLEST_MAGNITUDE = 2
  SMALLEST_REAL = 4
  TARGET_IMAGINARY = 9
  TARGET_MAGNITUDE = 7
  TARGET_REAL = 8
  USER = 11
  __qualname__ = 'EPSWhich'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.FN-class.html000066400000000000000000001533731454104675500225410ustar00rootroot00000000000000 slepc4py.SLEPc.FN
Package slepc4py :: Module SLEPc :: Class FN
[hide private]
[frames] | no frames]

Class FN


FN
Nested Classes [hide private]
  CombineType
FN type of combination of child functions
  ParallelType
FN parallel types
  Type
FN type
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
create(self, comm=None)
Creates the FN object.
 
destroy(self)
Destroys the FN object.
 
duplicate(self, comm=None)
Duplicate the FN object copying all parameters, possibly with a different communicator.
 
evaluateDerivative(self, x)
Computes the value of the derivative f'(x) for a given x.
 
evaluateFunction(self, x)
Computes the value of the function f(x) for a given x.
 
evaluateFunctionMat(self, Mat A, Mat B=None)
Computes the value of the function f(A) for a given matrix A.
 
evaluateFunctionMatVec(self, Mat A, Vec v=None)
Computes the first column of the matrix f(A) for a given matrix A.
 
getCombineChildren(self)
Gets the two child functions that constitute this combined function, and the way they must be combined.
 
getMethod(self)
Gets the method currently used for matrix functions.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all FN options in the database.
 
getParallel(self)
Gets the mode of operation in parallel runs.
 
getPhiIndex(self)
Gets the index of the phi-function.
 
getRationalDenominator(self)
Gets the coefficients of the denominator of the rational function.
 
getRationalNumerator(self)
Gets the coefficients of the numerator of the rational function.
 
getScale(self)
Gets the scaling parameters that define the matematical function.
 
getType(self)
Gets the FN type of this object.
 
setCombineChildren(self, comb, FN f1, FN f2)
Sets the two child functions that constitute this combined function, and the way they must be combined.
 
setFromOptions(self)
Sets FN options from the options database.
 
setMethod(self, meth)
Selects the method to be used to evaluate functions of matrices.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all FN options in the database.
 
setParallel(self, pmode)
Selects the mode of operation in parallel runs.
 
setPhiIndex(self, k)
Sets the index of the phi-function.
 
setRationalDenominator(self, alpha)
Sets the coefficients of the denominator of the rational function.
 
setRationalNumerator(self, alpha)
Sets the coefficients of the numerator of the rational function.
 
setScale(self, alpha=None, beta=None)
Sets the scaling parameters that define the matematical function.
 
setType(self, fn_type)
Selects the type for the FN object.
 
view(self, Viewer viewer=None)
Prints the FN data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, appendOptionsPrefix, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  method
  parallel

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

create(self, comm=None)

 

Creates the FN object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the FN object.
Overrides: petsc4py.PETSc.Object.destroy

duplicate(self, comm=None)

 

Duplicate the FN object copying all parameters, possibly with a different communicator.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to the object's communicator.

evaluateDerivative(self, x)

 

Computes the value of the derivative f'(x) for a given x.

Parameters

x: scalar
Value where the derivative must be evaluated.

Returns

y: scalar
The result of f'(x).

evaluateFunction(self, x)

 

Computes the value of the function f(x) for a given x.

Parameters

x: scalar
Value where the function must be evaluated.

Returns

y: scalar
The result of f(x).

evaluateFunctionMat(self, Mat A, Mat B=None)

 

Computes the value of the function f(A) for a given matrix A.

Parameters

A: Mat
Matrix on which the function must be evaluated.
B: Mat, optional
Placeholder for the result.

Returns

B: Mat
The result of f(A).

evaluateFunctionMatVec(self, Mat A, Vec v=None)

 

Computes the first column of the matrix f(A) for a given matrix A.

Parameters

A: Mat
Matrix on which the function must be evaluated.

Returns

v: Vec
The first column of the result f(A).

getCombineChildren(self)

 

Gets the two child functions that constitute this combined function, and the way they must be combined.

Returns

comb: FN.CombineType enumerate
How to combine the functions (addition, multiplication, division, composition).
f1: FN
First function.
f2: FN
Second function.

getMethod(self)

 

Gets the method currently used for matrix functions.

Returns

meth: int
An index identifying the method.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all FN options in the database.

Returns

prefix: string
The prefix string set for this FN object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getParallel(self)

 

Gets the mode of operation in parallel runs.

Returns

pmode: FN.ParallelType enumerate
The parallel mode.

getPhiIndex(self)

 

Gets the index of the phi-function.

Returns

k: int
The index.

getRationalDenominator(self)

 

Gets the coefficients of the denominator of the rational function.

Returns

alpha: array of scalars
Coefficients.

getRationalNumerator(self)

 

Gets the coefficients of the numerator of the rational function.

Returns

alpha: array of scalars
Coefficients.

getScale(self)

 

Gets the scaling parameters that define the matematical function.

Returns

alpha: scalar (possibly complex)
Inner scaling (argument).
beta: scalar (possibly complex)
Outer scaling (result).

getType(self)

 

Gets the FN type of this object.

Returns

type: FN.Type enumerate
The inner product type currently being used.
Overrides: petsc4py.PETSc.Object.getType

setCombineChildren(self, comb, FN f1, FN f2)

 

Sets the two child functions that constitute this combined function, and the way they must be combined.

Parameters

comb: FN.CombineType enumerate
How to combine the functions (addition, multiplication, division, composition).
f1: FN
First function.
f2: FN
Second function.

setFromOptions(self)

 

Sets FN options from the options database.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setMethod(self, meth)

 

Selects the method to be used to evaluate functions of matrices.

Parameters

meth: int
An index identifying the method.

Notes

In some FN types there are more than one algorithms available for computing matrix functions. In that case, this function allows choosing the wanted method.

If meth is currently set to 0 and the input argument of FN.evaluateFunctionMat() is a symmetric/Hermitian matrix, then the computation is done via the eigendecomposition, rather than with the general algorithm.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all FN options in the database.

Parameters

prefix: string
The prefix string to prepend to all FN option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setParallel(self, pmode)

 

Selects the mode of operation in parallel runs.

Parameters

pmode: FN.ParallelType enumerate
The parallel mode.

setPhiIndex(self, k)

 

Sets the index of the phi-function.

Parameters

k: int
The index.

setRationalDenominator(self, alpha)

 

Sets the coefficients of the denominator of the rational function.

Parameters

alpha: array of scalars
Coefficients.

setRationalNumerator(self, alpha)

 

Sets the coefficients of the numerator of the rational function.

Parameters

alpha: array of scalars
Coefficients.

setScale(self, alpha=None, beta=None)

 

Sets the scaling parameters that define the matematical function.

Parameters

alpha: scalar (possibly complex), optional
Inner scaling (argument), default is 1.0.
beta: scalar (possibly complex), optional
Outer scaling (result), default is 1.0.

setType(self, fn_type)

 

Selects the type for the FN object.

Parameters

fn_type: FN.Type enumerate
The inner product type to be used.

view(self, Viewer viewer=None)

 

Prints the FN data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.FN.CombineType-class.html000066400000000000000000000225741454104675500247540ustar00rootroot00000000000000 slepc4py.SLEPc.FN.CombineType
Package slepc4py :: Module SLEPc :: Class FN :: Class CombineType
[hide private]
[frames] | no frames]

Class CombineType


FN type of combination of child functions

  • ADD: Addition f(x) = f1(x)+f2(x)
  • MULTIPLY: Multiplication f(x) = f1(x)*f2(x)
  • DIVIDE: Division f(x) = f1(x)/f2(x)
  • COMPOSE: Composition f(x) = f2(f1(x))
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ADD = 0
  COMPOSE = 3
  DIVIDE = 2
  MULTIPLY = 1
  __qualname__ = 'FNCombineType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.FN.ParallelType-class.html000066400000000000000000000212451454104675500251260ustar00rootroot00000000000000 slepc4py.SLEPc.FN.ParallelType
Package slepc4py :: Module SLEPc :: Class FN :: Class ParallelType
[hide private]
[frames] | no frames]

Class ParallelType


FN parallel types

  • REDUNDANT: Every process performs the computation redundantly.
  • SYNCHRONIZED: The first process sends the result to the rest.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  REDUNDANT = 0
  SYNCHRONIZED = 1
  __qualname__ = 'FNParallelType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.FN.Type-class.html000066400000000000000000000244621454104675500234550ustar00rootroot00000000000000 slepc4py.SLEPc.FN.Type
Package slepc4py :: Module SLEPc :: Class FN :: Class Type
[hide private]
[frames] | no frames]

Class Type


FN type
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  COMBINE = 'combine'
  EXP = 'exp'
  INVSQRT = 'invsqrt'
  LOG = 'log'
  PHI = 'phi'
  RATIONAL = 'rational'
  SQRT = 'sqrt'
  __qualname__ = 'FNType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.MFN-class.html000066400000000000000000001501611454104675500226460ustar00rootroot00000000000000 slepc4py.SLEPc.MFN
Package slepc4py :: Module SLEPc :: Class MFN
[hide private]
[frames] | no frames]

Class MFN


MFN
Nested Classes [hide private]
  ConvergedReason
  Type
MFN type
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
appendOptionsPrefix(self, prefix)
Appends to the prefix used for searching for all MFN options in the database.
 
cancelMonitor(self)
Clears all monitors for an MFN object.
 
create(self, comm=None)
Creates the MFN object.
 
destroy(self)
Destroys the MFN object.
 
getBV(self)
Obtain the basis vector object associated to the MFN object.
 
getConvergedReason(self)
Gets the reason why the solve() iteration was stopped.
 
getDimensions(self)
Gets the dimension of the subspace used by the solver.
 
getErrorIfNotConverged(self)
Return a flag indicating whether solve() will generate an error if the solver does not converge.
 
getFN(self)
Obtain the math function object associated to the MFN object.
 
getIterationNumber(self)
Gets the current iteration number.
 
getMonitor(self)
Gets the list of monitor functions.
 
getOperator(self)
Gets the matrix associated with the MFN object.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all MFN options in the database.
 
getTolerances(self)
Gets the tolerance and maximum iteration count used by the default MFN convergence tests.
 
getType(self)
Gets the MFN type of this object.
 
reset(self)
Resets the MFN object.
 
setBV(self, BV bv)
Associates a basis vector object to the MFN object.
 
setDimensions(self, ncv)
Sets the dimension of the subspace to be used by the solver.
 
setErrorIfNotConverged(self, flg=True)
Causes solve() to generate an error if the solver has not converged.
 
setFN(self, FN fn)
Associates a math function object to the MFN object.
 
setFromOptions(self)
Sets MFN options from the options database.
 
setMonitor(self, monitor, args=None, kargs=None)
Appends a monitor function to the list of monitors.
 
setOperator(self, Mat A)
Sets the matrix associated with the MFN object.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all MFN options in the database.
 
setTolerances(self, tol=None, max_it=None)
Sets the tolerance and maximum iteration count used by the default MFN convergence tests.
 
setType(self, mfn_type)
Selects the particular solver to be used in the MFN object.
 
setUp(self)
Sets up all the internal data structures necessary for the execution of the eigensolver.
 
solve(self, Vec b, Vec x)
Solves the matrix function problem.
 
solveTranspose(self, Vec b, Vec x)
Solves the transpose matrix function problem.
 
view(self, Viewer viewer=None)
Prints the MFN data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  bv
  fn
  max_it
  tol

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

appendOptionsPrefix(self, prefix)

 

Appends to the prefix used for searching for all MFN options in the database.

Parameters

prefix: string
The prefix string to prepend to all MFN option requests.
Overrides: petsc4py.PETSc.Object.appendOptionsPrefix

create(self, comm=None)

 

Creates the MFN object.

Parameters

comm: Comm, optional.
MPI communicator. If not provided, it defaults to all processes.

destroy(self)

 
Destroys the MFN object.
Overrides: petsc4py.PETSc.Object.destroy

getBV(self)

 

Obtain the basis vector object associated to the MFN object.

Returns

bv: BV
The basis vectors context.

getConvergedReason(self)

 

Gets the reason why the solve() iteration was stopped.

Returns

reason: MFN.ConvergedReason enumerate
Negative value indicates diverged, positive value converged.

getDimensions(self)

 

Gets the dimension of the subspace used by the solver.

Returns

ncv: int
Maximum dimension of the subspace to be used by the solver.

getErrorIfNotConverged(self)

 

Return a flag indicating whether solve() will generate an error if the solver does not converge.

Returns

flg: bool
True indicates you want the error generated.

getFN(self)

 

Obtain the math function object associated to the MFN object.

Returns

fn: FN
The math function context.

getIterationNumber(self)

 

Gets the current iteration number. If the call to solve() is complete, then it returns the number of iterations carried out by the solution method.

Returns

its: int
Iteration number.

getOperator(self)

 

Gets the matrix associated with the MFN object.

Returns

A: Mat
The matrix for which the matrix function is to be computed.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all MFN options in the database.

Returns

prefix: string
The prefix string set for this MFN object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getTolerances(self)

 

Gets the tolerance and maximum iteration count used by the default MFN convergence tests.

Returns

tol: float
The convergence tolerance.
max_it: int
The maximum number of iterations

getType(self)

 

Gets the MFN type of this object.

Returns

type: MFN.Type enumerate
The solver currently being used.
Overrides: petsc4py.PETSc.Object.getType

setBV(self, BV bv)

 

Associates a basis vector object to the MFN object.

Parameters

bv: BV
The basis vectors context.

setDimensions(self, ncv)

 

Sets the dimension of the subspace to be used by the solver.

Parameters

ncv: int
Maximum dimension of the subspace to be used by the solver.

setErrorIfNotConverged(self, flg=True)

 

Causes solve() to generate an error if the solver has not converged.

Parameters

flg: bool
True indicates you want the error generated.

setFN(self, FN fn)

 

Associates a math function object to the MFN object.

Parameters

fn: FN
The math function context.

setFromOptions(self)

 
Sets MFN options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.
Overrides: petsc4py.PETSc.Object.setFromOptions

setOperator(self, Mat A)

 

Sets the matrix associated with the MFN object.

Parameters

A: Mat
The problem matrix.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all MFN options in the database.

Parameters

prefix: string
The prefix string to prepend to all MFN option requests.
Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setTolerances(self, tol=None, max_it=None)

 

Sets the tolerance and maximum iteration count used by the default MFN convergence tests.

Parameters

tol: float, optional
The convergence tolerance.
max_it: int, optional
The maximum number of iterations

setType(self, mfn_type)

 

Selects the particular solver to be used in the MFN object.

Parameters

mfn_type: MFN.Type enumerate
The solver to be used.

solve(self, Vec b, Vec x)

 

Solves the matrix function problem. Given a vector b, the vector x = f(A)*b is returned.

Parameters

b: Vec
The right hand side vector.
x: Vec
The solution.

solveTranspose(self, Vec b, Vec x)

 

Solves the transpose matrix function problem. Given a vector b, the vector x = f(A^T)*b is returned.

Parameters

b: Vec
The right hand side vector.
x: Vec
The solution.

view(self, Viewer viewer=None)

 

Prints the MFN data structure.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.MFN.ConvergedReason-class.html000066400000000000000000000226771454104675500257430ustar00rootroot00000000000000 slepc4py.SLEPc.MFN.ConvergedReason
Package slepc4py :: Module SLEPc :: Class MFN :: Class ConvergedReason
[hide private]
[frames] | no frames]

Class ConvergedReason


Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONVERGED_ITERATING = 0
  CONVERGED_ITS = 2
  CONVERGED_TOL = 1
  DIVERGED_BREAKDOWN = -2
  DIVERGED_ITS = -1
  ITERATING = 0
  __qualname__ = 'MFNConvergedReason'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.MFN.Type-class.html000066400000000000000000000214401454104675500235630ustar00rootroot00000000000000 slepc4py.SLEPc.MFN.Type
Package slepc4py :: Module SLEPc :: Class MFN :: Class Type
[hide private]
[frames] | no frames]

Class Type


MFN type

Action of a matrix function on a vector.

  • KRYLOV: Restarted Krylov solver.
  • EXPOKIT: Implementation of the method in Expokit.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  EXPOKIT = 'expokit'
  KRYLOV = 'krylov'
  __qualname__ = 'MFNType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP-class.html000066400000000000000000005660611454104675500226620ustar00rootroot00000000000000 slepc4py.SLEPc.NEP
Package slepc4py :: Module SLEPc :: Class NEP
[hide private]
[frames] | no frames]

Class NEP


NEP
Nested Classes [hide private]
  CISSExtraction
NEP CISS extraction technique
  Conv
NEP convergence test
  ConvergedReason
NEP convergence reasons
  ErrorType
NEP error type to assess accuracy of computed solutions
  ProblemType
NEP problem type
  Refine
NEP refinement strategy
  RefineScheme
NEP scheme for solving linear systems during iterative refinement
  Stop
NEP stopping test
  Type
NEP type
  Which
NEP desired part of spectrum
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
appendOptionsPrefix(self, prefix)
Appends to the prefix used for searching for all NEP options in the database.
 
applyResolvent(self, omega, Vec v, Vec r, RG rg=None)
Applies the resolvent T^{-1}(z) to a given vector.
 
cancelMonitor(self)
Clears all monitors for a NEP object.
 
computeError(self, int i, etype=None)
Computes the error (based on the residual norm) associated with the i-th computed eigenpair.
 
create(self, comm=None)
Creates the NEP object.
 
destroy(self)
Destroys the NEP object.
 
errorView(self, etype=None, Viewer viewer=None)
Displays the errors associated with the computed solution (as well as the eigenvalues).
 
getBV(self)
Obtain the basis vectors object associated to the eigensolver.
 
getCISSExtraction(self)
Gets the extraction technique used in the CISS solver.
 
getCISSKSPs(self)
Retrieve the array of linear solver objects associated with the CISS solver.
 
getCISSRefinement(self)
Gets the values of various refinement parameters in the CISS solver.
 
getCISSSizes(self)
Gets the values of various size parameters in the CISS solver.
 
getCISSThreshold(self)
Gets the values of various threshold parameters in the CISS solver.
 
getConverged(self)
Gets the number of converged eigenpairs.
 
getConvergedReason(self)
Gets the reason why the solve() iteration was stopped.
 
getConvergenceTest(self)
Return the method used to compute the error estimate used in the convergence test.
 
getDS(self)
Obtain the direct solver associated to the eigensolver.
 
getDimensions(self)
Gets the number of eigenvalues to compute and the dimension of the subspace.
 
getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)
Gets the i-th solution of the eigenproblem as computed by solve().
 
getErrorEstimate(self, int i)
Returns the error estimate associated to the i-th computed eigenpair.
 
getFunction(self)
Returns the function to compute the nonlinear Function T(lambda) and the matrix.
 
getInterpolInterpolation(self)
Gets the tolerance and maximum degree when building the interpolation polynomial.
 
getInterpolPEP(self)
Retrieve the polynomial eigensolver object associated with the nonlinear eigensolver.
 
getIterationNumber(self)
Gets the current iteration number.
 
getJacobian(self)
Returns the function to compute the Jacobian T'(lambda) and the matrix.
 
getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None)
Gets the i-th left eigenvector as computed by solve().
 
getMonitor(self)
Gets the list of monitor functions.
 
getNArnoldiKSP(self)
Retrieve the linear solver object associated with the nonlinear eigensolver.
 
getNArnoldiLagPreconditioner(self)
Indicates how often the preconditioner is rebuilt.
 
getNLEIGSEPS(self)
Retrieve the linear eigensolver object associated with the nonlinear eigensolver.
 
getNLEIGSFullBasis(self)
Gets the flag that indicates if NLEIGS is using the full-basis variant.
 
getNLEIGSInterpolation(self)
Gets the tolerance and maximum degree when building the interpolation via divided differences.
 
getNLEIGSKSPs(self)
Retrieve the array of linear solver objects associated with the NLEIGS solver.
 
getNLEIGSLocking(self)
Gets the locking flag used in the NLEIGS method.
 
getNLEIGSRKShifts(self)
Gets the list of shifts used in the Rational Krylov method.
 
getNLEIGSRestart(self)
Gets the restart parameter used in the NLEIGS method.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all NEP options in the database.
 
getProblemType(self)
Gets the problem type from the NEP object.
 
getRG(self)
Obtain the region object associated to the eigensolver.
 
getRIIConstCorrectionTol(self)
Returns the constant tolerance flag.
 
getRIIDeflationThreshold(self)
Returns the threshold value that controls deflation.
 
getRIIHermitian(self)
Returns the flag about using the Hermitian version of the scalar nonlinear equation.
 
getRIIKSP(self)
Retrieve the linear solver object associated with the nonlinear eigensolver.
 
getRIILagPreconditioner(self)
Indicates how often the preconditioner is rebuilt.
 
getRIIMaximumIterations(self)
Gets the maximum number of inner iterations of RII.
 
getRefine(self)
Gets the refinement strategy used by the NEP object, and the associated parameters.
 
getRefineKSP(self)
Obtain the KSP object used by the eigensolver in the refinement phase.
 
getSLPDeflationThreshold(self)
Returns the threshold value that controls deflation.
 
getSLPEPS(self)
Retrieve the linear eigensolver object associated with the nonlinear eigensolver.
 
getSLPEPSLeft(self)
Retrieve the left eigensolver.
 
getSLPKSP(self)
Retrieve the linear solver object associated with the nonlinear eigensolver.
 
getSplitOperator(self)
Returns the operator of the nonlinear eigenvalue problem in split form.
 
getSplitPreconditioner(self)
Returns the operator of the split preconditioner.
 
getStoppingTest(self)
Gets the stopping function.
 
getTarget(self)
Gets the value of the target.
 
getTolerances(self)
Gets the tolerance and maximum iteration count used by the default NEP convergence tests.
 
getTrackAll(self)
Returns the flag indicating whether all residual norms must be computed or not.
 
getTwoSided(self)
Returns the flag indicating whether a two-sided variant of the algorithm is being used or not.
 
getType(self)
Gets the NEP type of this object.
 
getWhichEigenpairs(self)
Returns which portion of the spectrum is to be sought.
 
reset(self)
Resets the NEP object.
 
setBV(self, BV bv)
Associates a basis vectors object to the eigensolver.
 
setCISSExtraction(self, extraction)
Sets the extraction technique used in the CISS solver.
 
setCISSRefinement(self, inner=None, blsize=None)
Sets the values of various refinement parameters in the CISS solver.
 
setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)
Sets the values of various size parameters in the CISS solver.
 
setCISSThreshold(self, delta=None, spur=None)
Sets the values of various threshold parameters in the CISS solver.
 
setConvergenceTest(self, conv)
Specifies how to compute the error estimate used in the convergence test.
 
setDS(self, DS ds)
Associates a direct solver object to the eigensolver.
 
setDimensions(self, nev=None, ncv=None, mpd=None)
Sets the number of eigenvalues to compute and the dimension of the subspace.
 
setFromOptions(self)
Sets NEP options from the options database.
 
setFunction(self, function, Mat F=None, Mat P=None, args=None, kargs=None)
Sets the function to compute the nonlinear Function T(lambda) as well as the location to store the matrix.
 
setInitialSpace(self, space)
Sets the initial space from which the eigensolver starts to iterate.
 
setInterpolInterpolation(self, tol=None, deg=None)
Sets the tolerance and maximum degree when building the interpolation polynomial.
 
setInterpolPEP(self, PEP pep)
Associate a polynomial eigensolver object to the nonlinear eigensolver.
 
setJacobian(self, jacobian, Mat J=None, args=None, kargs=None)
Sets the function to compute the Jacobian T'(lambda) as well as the location to store the matrix.
 
setMonitor(self, monitor, args=None, kargs=None)
Appends a monitor function to the list of monitors.
 
setNArnoldiKSP(self, KSP ksp)
Associate a linear solver object to the nonlinear eigensolver.
 
setNArnoldiLagPreconditioner(self, lag)
Determines when the preconditioner is rebuilt in the nonlinear solve.
 
setNLEIGSEPS(self, EPS eps)
Associate a linear eigensolver object to the nonlinear eigensolver.
 
setNLEIGSFullBasis(self, fullbasis=True)
Choose between TOAR-basis (default) and full-basis variants of the NLEIGS method.
 
setNLEIGSInterpolation(self, tol=None, deg=None)
Sets the tolerance and maximum degree when building the interpolation via divided differences.
 
setNLEIGSLocking(self, lock)
Choose between locking and non-locking variants of the NLEIGS method.
 
setNLEIGSRKShifts(self, shifts)
Sets a list of shifts to be used in the Rational Krylov method.
 
setNLEIGSRestart(self, keep)
Sets the restart parameter for the NLEIGS method, in particular the proportion of basis vectors that must be kept after restart.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all NEP options in the database.
 
setProblemType(self, problem_type)
Specifies the type of the eigenvalue problem.
 
setRG(self, RG rg)
Associates a region object to the eigensolver.
 
setRIIConstCorrectionTol(self, cct)
Sets a flag to keep the tolerance used in the linear solver constant.
 
setRIIDeflationThreshold(self, deftol)
Sets the threshold value used to switch between deflated and non-deflated iteration.
 
setRIIHermitian(self, herm)
Sets a flag to indicate if the Hermitian version of the scalar nonlinear equation must be used by the solver.
 
setRIIKSP(self, KSP ksp)
Associate a linear solver object to the nonlinear eigensolver.
 
setRIILagPreconditioner(self, lag)
Determines when the preconditioner is rebuilt in the nonlinear solve.
 
setRIIMaximumIterations(self, its)
Sets the maximum number of inner iterations to be used in the RII solver.
 
setRefine(self, ref, npart=None, tol=None, its=None, scheme=None)
Sets the refinement strategy used by the NEP object, and the associated parameters.
 
setSLPDeflationThreshold(self, deftol)
Sets the threshold value used to switch between deflated and non-deflated iteration.
 
setSLPEPS(self, EPS eps)
Associate a linear eigensolver object to the nonlinear eigensolver.
 
setSLPEPSLeft(self, EPS eps)
Associate a linear eigensolver object to the nonlinear eigensolver, used to compute left eigenvectors in the two-sided variant of SLP.
 
setSLPKSP(self, KSP ksp)
Associate a linear solver object to the nonlinear eigensolver.
 
setSplitOperator(self, A, f, structure=None)
Sets the operator of the nonlinear eigenvalue problem in split form.
 
setSplitPreconditioner(self, P, structure=None)
Sets the operator in split form from which to build the preconditioner to be used when solving the nonlinear eigenvalue problem in split form.
 
setStoppingTest(self, stopping, args=None, kargs=None)
Sets a function to decide when to stop the outer iteration of the eigensolver.
 
setTarget(self, target)
Sets the value of the target.
 
setTolerances(self, tol=None, maxit=None)
Sets the tolerance and maximum iteration count used in convergence tests.
 
setTrackAll(self, trackall)
Specifies if the solver must compute the residual of all approximate eigenpairs or not.
 
setTwoSided(self, twosided)
Sets the solver to use a two-sided variant so that left eigenvectors are also computed.
 
setType(self, nep_type)
Selects the particular solver to be used in the NEP object.
 
setUp(self)
Sets up all the internal data structures necessary for the execution of the eigensolver.
 
setWhichEigenpairs(self, which)
Specifies which portion of the spectrum is to be sought.
 
solve(self)
Solves the eigensystem.
 
valuesView(self, Viewer viewer=None)
Displays the computed eigenvalues in a viewer.
 
vectorsView(self, Viewer viewer=None)
Outputs computed eigenvectors to a viewer.
 
view(self, Viewer viewer=None)
Prints the NEP data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  bv
  ds
  max_it
  problem_type
  rg
  target
  tol
  track_all
  which

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

appendOptionsPrefix(self, prefix)

 

Appends to the prefix used for searching for all NEP options in the database.

Parameters

prefix: string
The prefix string to prepend to all NEP option requests.
Overrides: petsc4py.PETSc.Object.appendOptionsPrefix

applyResolvent(self, omega, Vec v, Vec r, RG rg=None)

 

Applies the resolvent T^{-1}(z) to a given vector.

Parameters

omega: scalar
Value where the resolvent must be evaluated.
v: Vec
Input vector.
r: Vec
Placeholder for the result vector.
rg: RG object, optional
Region.

computeError(self, int i, etype=None)

 

Computes the error (based on the residual norm) associated with the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.
etype: NEP.ErrorType enumerate
The error type to compute.

Returns

error: real
The error bound, computed in various ways from the residual norm ||T(lambda)x||_2 where lambda is the eigenvalue and x is the eigenvector.

create(self, comm=None)

 

Creates the NEP object.

Parameters

comm: Comm, optional.
MPI communicator. If not provided, it defaults to all processes.

destroy(self)

 
Destroys the NEP object.
Overrides: petsc4py.PETSc.Object.destroy

errorView(self, etype=None, Viewer viewer=None)

 

Displays the errors associated with the computed solution (as well as the eigenvalues).

Parameters

etype: NEP.ErrorType enumerate, optional
The error type to compute.
viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

Notes

By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ASCII_INFO_DETAIL then a table with eigenvalues and corresponding errors is printed.

getBV(self)

 

Obtain the basis vectors object associated to the eigensolver.

Returns

bv: BV
The basis vectors context.

getCISSExtraction(self)

 

Gets the extraction technique used in the CISS solver.

Returns

extraction: NEP.CISSExtraction enumerate
The extraction technique.

getCISSKSPs(self)

 

Retrieve the array of linear solver objects associated with the CISS solver.

Returns

ksp: list of KSP
The linear solver objects.

Notes

The number of KSP solvers is equal to the number of integration points divided by the number of partitions. This value is halved in the case of real matrices with a region centered at the real axis.

getCISSRefinement(self)

 

Gets the values of various refinement parameters in the CISS solver.

Returns

inner: int
Number of iterative refinement iterations (inner loop).
blsize: int
Number of iterative refinement iterations (blocksize loop).

getCISSSizes(self)

 

Gets the values of various size parameters in the CISS solver.

Returns

ip: int
Number of integration points.
bs: int
Block size.
ms: int
Moment size.
npart: int
Number of partitions when splitting the communicator.
bsmax: int
Maximum block size.
realmats: bool
True if A and B are real.

getCISSThreshold(self)

 

Gets the values of various threshold parameters in the CISS solver.

Returns

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs.

getConverged(self)

 

Gets the number of converged eigenpairs.

Returns

nconv: int
Number of converged eigenpairs.

getConvergedReason(self)

 

Gets the reason why the solve() iteration was stopped.

Returns

reason: NEP.ConvergedReason enumerate
Negative value indicates diverged, positive value converged.

getConvergenceTest(self)

 

Return the method used to compute the error estimate used in the convergence test.

Returns

conv: NEP.Conv
The method used to compute the error estimate used in the convergence test.

getDS(self)

 

Obtain the direct solver associated to the eigensolver.

Returns

ds: DS
The direct solver context.

getDimensions(self)

 

Gets the number of eigenvalues to compute and the dimension of the subspace.

Returns

nev: int
Number of eigenvalues to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)

 

Gets the i-th solution of the eigenproblem as computed by solve(). The solution consists of both the eigenvalue and the eigenvector.

Parameters

i: int
Index of the solution to be obtained.
Vr: Vec, optional
Placeholder for the returned eigenvector (real part).
Vi: Vec, optional
Placeholder for the returned eigenvector (imaginary part).

Returns

e: scalar (possibly complex)
The computed eigenvalue.

getErrorEstimate(self, int i)

 

Returns the error estimate associated to the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.

Returns

error: real
Error estimate.

getFunction(self)

 

Returns the function to compute the nonlinear Function T(lambda) and the matrix.

Parameters

F: Mat
Function matrix
P: Mat
preconditioner matrix (usually the same as the F)
function:
Function evaluation routine

getInterpolInterpolation(self)

 

Gets the tolerance and maximum degree when building the interpolation polynomial.

Returns

tol: float
The tolerance to stop computing polynomial coefficients.
deg: int
The maximum degree of interpolation.

getInterpolPEP(self)

 

Retrieve the polynomial eigensolver object associated with the nonlinear eigensolver.

Returns

pep: PEP
The polynomial eigensolver.

getIterationNumber(self)

 

Gets the current iteration number. If the call to solve() is complete, then it returns the number of iterations carried out by the solution method.

Returns

its: int
Iteration number.

getJacobian(self)

 

Returns the function to compute the Jacobian T'(lambda) and the matrix.

Parameters

J: Mat
Jacobian matrix
jacobian:
Jacobian evaluation routine

getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None)

 

Gets the i-th left eigenvector as computed by solve().

Parameters

i: int
Index of the solution to be obtained.
Wr: Vec
Placeholder for the returned eigenvector (real part).
Wi: Vec, optional
Placeholder for the returned eigenvector (imaginary part).

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()). Eigensolutions are indexed according to the ordering criterion established with setWhichEigenpairs().

Left eigenvectors are available only if the twosided flag was set with setTwoSided().

getNArnoldiKSP(self)

 

Retrieve the linear solver object associated with the nonlinear eigensolver.

Returns

ksp: KSP
The linear solver object.

getNArnoldiLagPreconditioner(self)

 

Indicates how often the preconditioner is rebuilt.

Returns

lag: int
The lag parameter.

getNLEIGSEPS(self)

 

Retrieve the linear eigensolver object associated with the nonlinear eigensolver.

Returns

eps: EPS
The linear eigensolver.

getNLEIGSFullBasis(self)

 

Gets the flag that indicates if NLEIGS is using the full-basis variant.

Returns

fullbasis: bool
True if the full-basis variant must be selected.

getNLEIGSInterpolation(self)

 

Gets the tolerance and maximum degree when building the interpolation via divided differences.

Returns

tol: float
The tolerance to stop computing divided differences.
deg: int
The maximum degree of interpolation.

getNLEIGSKSPs(self)

 

Retrieve the array of linear solver objects associated with the NLEIGS solver.

Returns

ksp: list of KSP
The linear solver objects.

Notes

The number of KSP solvers is equal to the number of shifts provided by the user, or 1 if the user did not provide shifts.

getNLEIGSLocking(self)

 

Gets the locking flag used in the NLEIGS method.

Returns

lock: bool
The locking flag.

getNLEIGSRKShifts(self)

 

Gets the list of shifts used in the Rational Krylov method.

Returns

shifts: array of scalars
The shift values.

getNLEIGSRestart(self)

 

Gets the restart parameter used in the NLEIGS method.

Returns

keep: float
The number of vectors to be kept at restart.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all NEP options in the database.

Returns

prefix: string
The prefix string set for this NEP object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getProblemType(self)

 

Gets the problem type from the NEP object.

Returns

problem_type: NEP.ProblemType enumerate
The problem type that was previously set.

getRG(self)

 

Obtain the region object associated to the eigensolver.

Returns

rg: RG
The region context.

getRIIConstCorrectionTol(self)

 

Returns the constant tolerance flag.

Returns

cct: bool
If True, the KSP relative tolerance is constant.

getRIIDeflationThreshold(self)

 

Returns the threshold value that controls deflation.

Returns

deftol: float
The threshold value.

getRIIHermitian(self)

 

Returns the flag about using the Hermitian version of the scalar nonlinear equation.

Returns

herm: bool
If True, the Hermitian version is used.

getRIIKSP(self)

 

Retrieve the linear solver object associated with the nonlinear eigensolver.

Returns

ksp: KSP
The linear solver object.

getRIILagPreconditioner(self)

 

Indicates how often the preconditioner is rebuilt.

Returns

lag: int
The lag parameter.

getRIIMaximumIterations(self)

 

Gets the maximum number of inner iterations of RII.

Returns

its: int
Maximum inner iterations.

getRefine(self)

 

Gets the refinement strategy used by the NEP object, and the associated parameters.

Returns

ref: NEP.Refine
The refinement type.
npart: int
The number of partitions of the communicator.
tol: real
The convergence tolerance.
its: int
The maximum number of refinement iterations.
scheme: NEP.RefineScheme
Scheme for solving linear systems

getRefineKSP(self)

 

Obtain the KSP object used by the eigensolver in the refinement phase.

Returns

ksp: KSP
The linear solver object.

getSLPDeflationThreshold(self)

 

Returns the threshold value that controls deflation.

Returns

deftol: float
The threshold value.

getSLPEPS(self)

 

Retrieve the linear eigensolver object associated with the nonlinear eigensolver.

Returns

eps: EPS
The linear eigensolver.

getSLPEPSLeft(self)

 

Retrieve the left eigensolver.

Returns

eps: EPS
The linear eigensolver.

getSLPKSP(self)

 

Retrieve the linear solver object associated with the nonlinear eigensolver.

Returns

ksp: KSP
The linear solver object.

getSplitOperator(self)

 

Returns the operator of the nonlinear eigenvalue problem in split form.

Returns

A: sequence of Mat
Coefficient matrices of the split form.
f: sequence of FN
Scalar functions of the split form.
structure: PETSc.Mat.Structure enumerate
Structure flag for matrices.

getSplitPreconditioner(self)

 

Returns the operator of the split preconditioner.

Returns

P: sequence of Mat
Coefficient matrices of the split preconditioner.
structure: PETSc.Mat.Structure enumerate
Structure flag for matrices.

getTarget(self)

 

Gets the value of the target.

Returns

target: float (real or complex)
The value of the target.

Notes

If the target was not set by the user, then zero is returned.

getTolerances(self)

 

Gets the tolerance and maximum iteration count used by the default NEP convergence tests.

Returns

tol: float
The convergence tolerance.
maxit: int
The maximum number of iterations.

getTrackAll(self)

 

Returns the flag indicating whether all residual norms must be computed or not.

Returns

trackall: bool
Whether the solver compute all residuals or not.

getTwoSided(self)

 

Returns the flag indicating whether a two-sided variant of the algorithm is being used or not.

Returns

twosided: bool
Whether the two-sided variant is to be used or not.

getType(self)

 

Gets the NEP type of this object.

Returns

type: NEP.Type enumerate
The solver currently being used.
Overrides: petsc4py.PETSc.Object.getType

getWhichEigenpairs(self)

 

Returns which portion of the spectrum is to be sought.

Returns

which: NEP.Which enumerate
The portion of the spectrum to be sought by the solver.

setBV(self, BV bv)

 

Associates a basis vectors object to the eigensolver.

Parameters

bv: BV
The basis vectors context.

setCISSExtraction(self, extraction)

 

Sets the extraction technique used in the CISS solver.

Parameters

extraction: NEP.CISSExtraction enumerate
The extraction technique.

setCISSRefinement(self, inner=None, blsize=None)

 

Sets the values of various refinement parameters in the CISS solver.

Parameters

inner: int, optional
Number of iterative refinement iterations (inner loop).
blsize: int, optional
Number of iterative refinement iterations (blocksize loop).

setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)

 

Sets the values of various size parameters in the CISS solver.

Parameters

ip: int, optional
Number of integration points.
bs: int, optional
Block size.
ms: int, optional
Moment size.
npart: int, optional
Number of partitions when splitting the communicator.
bsmax: int, optional
Maximum block size.
realmats: bool, optional
True if A and B are real.

Notes

The default number of partitions is 1. This means the internal KSP object is shared among all processes of the NEP communicator. Otherwise, the communicator is split into npart communicators, so that npart KSP solves proceed simultaneously.

setCISSThreshold(self, delta=None, spur=None)

 

Sets the values of various threshold parameters in the CISS solver.

Parameters

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs).

setConvergenceTest(self, conv)

 

Specifies how to compute the error estimate used in the convergence test.

Parameters

conv: NEP.Conv
The method used to compute the error estimate used in the convergence test.

setDS(self, DS ds)

 

Associates a direct solver object to the eigensolver.

Parameters

ds: DS
The direct solver context.

setDimensions(self, nev=None, ncv=None, mpd=None)

 

Sets the number of eigenvalues to compute and the dimension of the subspace.

Parameters

nev: int, optional
Number of eigenvalues to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

setFromOptions(self)

 
Sets NEP options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.
Overrides: petsc4py.PETSc.Object.setFromOptions

setFunction(self, function, Mat F=None, Mat P=None, args=None, kargs=None)

 

Sets the function to compute the nonlinear Function T(lambda) as well as the location to store the matrix.

Parameters

function:
Function evaluation routine
F: Mat
Function matrix
P: Mat
preconditioner matrix (usually the same as F)

setInitialSpace(self, space)

 

Sets the initial space from which the eigensolver starts to iterate.

Parameters

space: Vec or sequence of Vec
The initial space

setInterpolInterpolation(self, tol=None, deg=None)

 

Sets the tolerance and maximum degree when building the interpolation polynomial.

Parameters

tol: float, optional
The tolerance to stop computing polynomial coefficients.
deg: int, optional
The maximum degree of interpolation.

setInterpolPEP(self, PEP pep)

 

Associate a polynomial eigensolver object to the nonlinear eigensolver.

Parameters

pep: PEP
The polynomial eigensolver.

setJacobian(self, jacobian, Mat J=None, args=None, kargs=None)

 

Sets the function to compute the Jacobian T'(lambda) as well as the location to store the matrix.

Parameters

jacobian:
Jacobian evaluation routine
J: Mat
Jacobian matrix

setNArnoldiKSP(self, KSP ksp)

 

Associate a linear solver object to the nonlinear eigensolver.

Parameters

ksp: KSP
The linear solver object.

setNArnoldiLagPreconditioner(self, lag)

 

Determines when the preconditioner is rebuilt in the nonlinear solve.

Parameters

lag: int
0 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within the nonlinear iteration, 2 means every second time the Jacobian is built, etc.

Notes

The default is 1. The preconditioner is ALWAYS built in the first iteration of a nonlinear solve.

setNLEIGSEPS(self, EPS eps)

 

Associate a linear eigensolver object to the nonlinear eigensolver.

Parameters

eps: EPS
The linear eigensolver.

setNLEIGSFullBasis(self, fullbasis=True)

 

Choose between TOAR-basis (default) and full-basis variants of the NLEIGS method.

Parameters

fullbasis: bool
True if the full-basis variant must be selected.

setNLEIGSInterpolation(self, tol=None, deg=None)

 

Sets the tolerance and maximum degree when building the interpolation via divided differences.

Parameters

tol: float, optional
The tolerance to stop computing divided differences.
deg: int, optional
The maximum degree of interpolation.

setNLEIGSLocking(self, lock)

 

Choose between locking and non-locking variants of the NLEIGS method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setNLEIGSRKShifts(self, shifts)

 

Sets a list of shifts to be used in the Rational Krylov method.

Parameters

shifts: array of scalars
Values specifying the shifts.

setNLEIGSRestart(self, keep)

 

Sets the restart parameter for the NLEIGS method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all NEP options in the database.

Parameters

prefix: string
The prefix string to prepend to all NEP option requests.
Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setProblemType(self, problem_type)

 

Specifies the type of the eigenvalue problem.

Parameters

problem_type: NEP.ProblemType enumerate
The problem type to be set.

setRG(self, RG rg)

 

Associates a region object to the eigensolver.

Parameters

rg: RG
The region context.

setRIIConstCorrectionTol(self, cct)

 

Sets a flag to keep the tolerance used in the linear solver constant.

Parameters

cct: bool
If True, the KSP relative tolerance is constant.

setRIIDeflationThreshold(self, deftol)

 

Sets the threshold value used to switch between deflated and non-deflated iteration.

Parameters

deftol: float
The threshold value.

setRIIHermitian(self, herm)

 

Sets a flag to indicate if the Hermitian version of the scalar nonlinear equation must be used by the solver.

Parameters

herm: bool
If True, the Hermitian version is used.

setRIIKSP(self, KSP ksp)

 

Associate a linear solver object to the nonlinear eigensolver.

Parameters

ksp: KSP
The linear solver object.

setRIILagPreconditioner(self, lag)

 

Determines when the preconditioner is rebuilt in the nonlinear solve.

Parameters

lag: int
0 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within the nonlinear iteration, 2 means every second time the Jacobian is built, etc.

setRIIMaximumIterations(self, its)

 

Sets the maximum number of inner iterations to be used in the RII solver. These are the Newton iterations related to the computation of the nonlinear Rayleigh functional.

Parameters

its: int
Maximum inner iterations.

setRefine(self, ref, npart=None, tol=None, its=None, scheme=None)

 

Sets the refinement strategy used by the NEP object, and the associated parameters.

Parameters

ref: NEP.Refine
The refinement type.
npart: int, optional
The number of partitions of the communicator.
tol: real, optional
The convergence tolerance.
its: int, optional
The maximum number of refinement iterations.
scheme: NEP.RefineScheme, optional
Scheme for linear system solves

setSLPDeflationThreshold(self, deftol)

 

Sets the threshold value used to switch between deflated and non-deflated iteration.

Parameters

deftol: float
The threshold value.

setSLPEPS(self, EPS eps)

 

Associate a linear eigensolver object to the nonlinear eigensolver.

Parameters

eps: EPS
The linear eigensolver.

setSLPEPSLeft(self, EPS eps)

 

Associate a linear eigensolver object to the nonlinear eigensolver, used to compute left eigenvectors in the two-sided variant of SLP.

Parameters

eps: EPS
The linear eigensolver.

setSLPKSP(self, KSP ksp)

 

Associate a linear solver object to the nonlinear eigensolver.

Parameters

ksp: KSP
The linear solver object.

setSplitOperator(self, A, f, structure=None)

 

Sets the operator of the nonlinear eigenvalue problem in split form.

Parameters

A: Mat or sequence of Mat
Coefficient matrices of the split form.
f: sequence of FN
Scalar functions of the split form.
structure: PETSc.Mat.Structure enumerate, optional
Structure flag for matrices.

setSplitPreconditioner(self, P, structure=None)

 

Sets the operator in split form from which to build the preconditioner to be used when solving the nonlinear eigenvalue problem in split form.

Parameters

P: Mat or sequence of Mat
Coefficient matrices of the split preconditioner.
structure: PETSc.Mat.Structure enumerate, optional
Structure flag for matrices.

setTarget(self, target)

 

Sets the value of the target.

Parameters

target: float (real or complex)
The value of the target.

Notes

The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with setWhichEigenpairs().

setTolerances(self, tol=None, maxit=None)

 

Sets the tolerance and maximum iteration count used in convergence tests.

Parameters

tol: float, optional
The convergence tolerance.
maxit: int, optional
The maximum number of iterations.

setTrackAll(self, trackall)

 

Specifies if the solver must compute the residual of all approximate eigenpairs or not.

Parameters

trackall: bool
Whether compute all residuals or not.

setTwoSided(self, twosided)

 

Sets the solver to use a two-sided variant so that left eigenvectors are also computed.

Parameters

twosided: bool
Whether the two-sided variant is to be used or not.

setType(self, nep_type)

 

Selects the particular solver to be used in the NEP object.

Parameters

nep_type: NEP.Type enumerate
The solver to be used.

setWhichEigenpairs(self, which)

 

Specifies which portion of the spectrum is to be sought.

Parameters

which: NEP.Which enumerate
The portion of the spectrum to be sought by the solver.

valuesView(self, Viewer viewer=None)

 

Displays the computed eigenvalues in a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

vectorsView(self, Viewer viewer=None)

 

Outputs computed eigenvectors to a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

view(self, Viewer viewer=None)

 

Prints the NEP data structure.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.CISSExtraction-class.html000066400000000000000000000217561454104675500254600ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.CISSExtraction
Package slepc4py :: Module SLEPc :: Class NEP :: Class CISSExtraction
[hide private]
[frames] | no frames]

Class CISSExtraction


NEP CISS extraction technique

  • RITZ: Ritz extraction.
  • HANKEL: Extraction via Hankel eigenproblem.
  • CAA: Communication-avoiding Arnoldi.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CAA = 2
  HANKEL = 1
  RITZ = 0
  __qualname__ = 'NEPCISSExtraction'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.Conv-class.html000066400000000000000000000223431454104675500235540ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.Conv
Package slepc4py :: Module SLEPc :: Class NEP :: Class Conv
[hide private]
[frames] | no frames]

Class Conv


NEP convergence test

  • ABS: Absolute convergence test.
  • REL: Convergence test relative to the eigenvalue.
  • NORM: Convergence test relative to the matrix norms.
  • USER: User-defined convergence test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABS = 0
  NORM = 2
  REL = 1
  USER = 3
  __qualname__ = 'NEPConv'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.ConvergedReason-class.html000066400000000000000000000263671454104675500257450ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.ConvergedReason
Package slepc4py :: Module SLEPc :: Class NEP :: Class ConvergedReason
[hide private]
[frames] | no frames]

Class ConvergedReason


NEP convergence reasons

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONVERGED_ITERATING = 0
  CONVERGED_TOL = 1
  CONVERGED_USER = 2
  DIVERGED_BREAKDOWN = -2
  DIVERGED_ITS = -1
  DIVERGED_LINEAR_SOLVE = -4
  DIVERGED_SUBSPACE_EXHAUSTED = -5
  ITERATING = 0
  __qualname__ = 'NEPConvergedReason'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.ErrorType-class.html000066400000000000000000000217161454104675500246050ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.ErrorType
Package slepc4py :: Module SLEPc :: Class NEP :: Class ErrorType
[hide private]
[frames] | no frames]

Class ErrorType


NEP error type to assess accuracy of computed solutions

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABSOLUTE = 0
  BACKWARD = 2
  RELATIVE = 1
  __qualname__ = 'NEPErrorType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.ProblemType-class.html000066400000000000000000000211661454104675500251130ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.ProblemType
Package slepc4py :: Module SLEPc :: Class NEP :: Class ProblemType
[hide private]
[frames] | no frames]

Class ProblemType


NEP problem type

  • GENERAL: General nonlinear eigenproblem.
  • RATIONAL: NEP defined in split form with all f_i rational.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  GENERAL = 1
  RATIONAL = 2
  __qualname__ = 'NEPProblemType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.Refine-class.html000066400000000000000000000216331454104675500240600ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.Refine
Package slepc4py :: Module SLEPc :: Class NEP :: Class Refine
[hide private]
[frames] | no frames]

Class Refine


NEP refinement strategy

  • NONE: No refinement.
  • SIMPLE: Refine eigenpairs one by one.
  • MULTIPLE: Refine all eigenpairs simultaneously (invariant pair).
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  MULTIPLE = 2
  NONE = 0
  SIMPLE = 1
  __qualname__ = 'NEPRefine'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.RefineScheme-class.html000066400000000000000000000217641454104675500252120ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.RefineScheme
Package slepc4py :: Module SLEPc :: Class NEP :: Class RefineScheme
[hide private]
[frames] | no frames]

Class RefineScheme


NEP scheme for solving linear systems during iterative refinement

  • SCHUR: Schur complement.
  • MBE: Mixed block elimination.
  • EXPLICIT: Build the explicit matrix.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  EXPLICIT = 3
  MBE = 2
  SCHUR = 1
  __qualname__ = 'NEPRefineScheme'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.Stop-class.html000066400000000000000000000207421454104675500235750ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.Stop
Package slepc4py :: Module SLEPc :: Class NEP :: Class Stop
[hide private]
[frames] | no frames]

Class Stop


NEP stopping test

  • BASIC: Default stopping test.
  • USER: User-defined stopping test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  BASIC = 0
  USER = 1
  __qualname__ = 'NEPStop'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.Type-class.html000066400000000000000000000253261454104675500235740ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.Type
Package slepc4py :: Module SLEPc :: Class NEP :: Class Type
[hide private]
[frames] | no frames]

Class Type


NEP type

Nonlinear eigensolvers.

  • RII: Residual inverse iteration.
  • SLP: Successive linear problems.
  • NARNOLDI: Nonlinear Arnoldi.
  • CISS: Contour integral spectrum slice.
  • INTERPOL: Polynomial interpolation.
  • NLEIGS: Fully rational Krylov method for nonlinear eigenproblems.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CISS = 'ciss'
  INTERPOL = 'interpol'
  NARNOLDI = 'narnoldi'
  NLEIGS = 'nleigs'
  RII = 'rii'
  SLP = 'slp'
  __qualname__ = 'NEPType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.NEP.Which-class.html000066400000000000000000000303011454104675500237020ustar00rootroot00000000000000 slepc4py.SLEPc.NEP.Which
Package slepc4py :: Module SLEPc :: Class NEP :: Class Which
[hide private]
[frames] | no frames]

Class Which


NEP desired part of spectrum

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ALL = 10
  LARGEST_IMAGINARY = 5
  LARGEST_MAGNITUDE = 1
  LARGEST_REAL = 3
  SMALLEST_IMAGINARY = 6
  SMALLEST_MAGNITUDE = 2
  SMALLEST_REAL = 4
  TARGET_IMAGINARY = 9
  TARGET_MAGNITUDE = 7
  TARGET_REAL = 8
  USER = 11
  __qualname__ = 'NEPWhich'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP-class.html000066400000000000000000005512571454104675500226650ustar00rootroot00000000000000 slepc4py.SLEPc.PEP
Package slepc4py :: Module SLEPc :: Class PEP
[hide private]
[frames] | no frames]

Class PEP


PEP
Nested Classes [hide private]
  Basis
PEP basis type for the representation of the polynomial
  CISSExtraction
PEP CISS extraction technique
  Conv
PEP convergence test
  ConvergedReason
PEP convergence reasons
  ErrorType
PEP error type to assess accuracy of computed solutions
  Extract
PEP extraction strategy used to obtain eigenvectors of the PEP from the eigenvectors of the linearization
  JDProjection
PEP type of projection to be used in the Jacobi-Davidson solver
  ProblemType
PEP problem type
  Refine
PEP refinement strategy
  RefineScheme
PEP scheme for solving linear systems during iterative refinement
  Scale
PEP scaling strategy
  Stop
PEP stopping test
  Type
PEP type
  Which
PEP desired part of spectrum
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
appendOptionsPrefix(self, prefix)
Appends to the prefix used for searching for all PEP options in the database.
 
cancelMonitor(self)
Clears all monitors for a PEP object.
 
computeError(self, int i, etype=None)
Computes the error (based on the residual norm) associated with the i-th computed eigenpair.
 
create(self, comm=None)
Creates the PEP object.
 
destroy(self)
Destroys the PEP object.
 
errorView(self, etype=None, Viewer viewer=None)
Displays the errors associated with the computed solution (as well as the eigenvalues).
 
getBV(self)
Obtain the basis vectors object associated to the eigensolver.
 
getBasis(self)
Gets the type of polynomial basis used to describe the polynomial eigenvalue problem.
 
getCISSExtraction(self)
Gets the extraction technique used in the CISS solver.
 
getCISSKSPs(self)
Retrieve the array of linear solver objects associated with the CISS solver.
 
getCISSRefinement(self)
Gets the values of various refinement parameters in the CISS solver.
 
getCISSSizes(self)
Gets the values of various size parameters in the CISS solver.
 
getCISSThreshold(self)
Gets the values of various threshold parameters in the CISS solver.
 
getConverged(self)
Gets the number of converged eigenpairs.
 
getConvergedReason(self)
Gets the reason why the solve() iteration was stopped.
 
getConvergenceTest(self)
Return the method used to compute the error estimate used in the convergence test.
 
getDS(self)
Obtain the direct solver associated to the eigensolver.
 
getDimensions(self)
Gets the number of eigenvalues to compute and the dimension of the subspace.
 
getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)
Gets the i-th solution of the eigenproblem as computed by solve().
 
getErrorEstimate(self, int i)
Returns the error estimate associated to the i-th computed eigenpair.
 
getExtract(self)
Gets the extraction technique used by the PEP object.
 
getInterval(self)
Gets the computational interval for spectrum slicing.
 
getIterationNumber(self)
Gets the current iteration number.
 
getJDFix(self)
Gets threshold for changing the target in the correction equation.
 
getJDMinimalityIndex(self)
Returns the maximum allowed value of the minimality index.
 
getJDProjection(self)
Gets the type of projection to be used in the Jacobi-Davidson solver.
 
getJDRestart(self)
Gets the restart parameter used in the Jacobi-Davidson method.
 
getJDReusePreconditioner(self)
Returns the flag for reusing the preconditioner.
 
getLinearEPS(self)
Retrieve the eigensolver object associated to the polynomial eigenvalue solver.
 
getLinearExplicitMatrix(self)
Returns the flag indicating if the matrices A and B for the linearization are built explicitly.
 
getLinearLinearization(self)
Returns the coefficients that define the linearization of a quadratic eigenproblem.
 
getMonitor(self)
Gets the list of monitor functions.
 
getOperators(self)
Gets the matrices associated with the eigenvalue problem.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all PEP options in the database.
 
getProblemType(self)
Gets the problem type from the PEP object.
 
getQArnoldiLocking(self)
Gets the locking flag used in the Q-Arnoldi method.
 
getQArnoldiRestart(self)
Gets the restart parameter used in the Q-Arnoldi method.
 
getRG(self)
Obtain the region object associated to the eigensolver.
 
getRefine(self)
Gets the refinement strategy used by the PEP object, and the associated parameters.
 
getRefineKSP(self)
Obtain the KSP object used by the eigensolver in the refinement phase.
 
getST(self)
Obtain the spectral transformation (ST) object associated to the eigensolver object.
 
getSTOARCheckEigenvalueType(self)
Gets the flag for the eigenvalue type check in spectrum slicing.
 
getSTOARDetectZeros(self)
Gets the flag that enforces zero detection in spectrum slicing.
 
getSTOARDimensions(self)
Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.
 
getSTOARInertias(self)
Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval.
 
getSTOARLinearization(self)
Returns the coefficients that define the linearization of a quadratic eigenproblem.
 
getSTOARLocking(self)
Gets the locking flag used in the STOAR method.
 
getScale(self, Vec Dl=None, Vec Dr=None)
Gets the strategy used for scaling the polynomial eigenproblem.
 
getStoppingTest(self)
Gets the stopping function.
 
getTOARLocking(self)
Gets the locking flag used in the TOAR method.
 
getTOARRestart(self)
Gets the restart parameter used in the TOAR method.
 
getTarget(self)
Gets the value of the target.
 
getTolerances(self)
Gets the tolerance and maximum iteration count used by the default PEP convergence tests.
 
getTrackAll(self)
Returns the flag indicating whether all residual norms must be computed or not.
 
getType(self)
Gets the PEP type of this object.
 
getWhichEigenpairs(self)
Returns which portion of the spectrum is to be sought.
 
reset(self)
Resets the PEP object.
 
setBV(self, BV bv)
Associates a basis vectors object to the eigensolver.
 
setBasis(self, basis)
Specifies the type of polynomial basis used to describe the polynomial eigenvalue problem.
 
setCISSExtraction(self, extraction)
Sets the extraction technique used in the CISS solver.
 
setCISSRefinement(self, inner=None, blsize=None)
Sets the values of various refinement parameters in the CISS solver.
 
setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)
Sets the values of various size parameters in the CISS solver.
 
setCISSThreshold(self, delta=None, spur=None)
Sets the values of various threshold parameters in the CISS solver.
 
setConvergenceTest(self, conv)
Specifies how to compute the error estimate used in the convergence test.
 
setDS(self, DS ds)
Associates a direct solver object to the eigensolver.
 
setDimensions(self, nev=None, ncv=None, mpd=None)
Sets the number of eigenvalues to compute and the dimension of the subspace.
 
setExtract(self, extract)
Specifies the extraction strategy to be used.
 
setFromOptions(self)
Sets PEP options from the options database.
 
setInitialSpace(self, space)
Sets the initial space from which the eigensolver starts to iterate.
 
setInterval(self, inta, intb)
Defines the computational interval for spectrum slicing.
 
setJDFix(self, fix)
Sets the threshold for changing the target in the correction equation.
 
setJDMinimalityIndex(self, flag)
Sets the maximum allowed value for the minimality index.
 
setJDProjection(self, proj)
Sets the type of projection to be used in the Jacobi-Davidson solver.
 
setJDRestart(self, keep)
Sets the restart parameter for the Jacobi-Davidson method, in particular the proportion of basis vectors that must be kept after restart.
 
setJDReusePreconditioner(self, flag)
Sets a flag indicating whether the preconditioner must be reused or not.
 
setLinearEPS(self, EPS eps)
Associate an eigensolver object to the polynomial eigenvalue solver.
 
setLinearExplicitMatrix(self, flag)
Indicate if the matrices A and B for the linearization of the problem must be built explicitly.
 
setLinearLinearization(self, alpha=1.0, beta=0.0)
Set the coefficients that define the linearization of a quadratic eigenproblem.
 
setMonitor(self, monitor, args=None, kargs=None)
Appends a monitor function to the list of monitors.
 
setOperators(self, operators)
Sets the matrices associated with the eigenvalue problem.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all PEP options in the database.
 
setProblemType(self, problem_type)
Specifies the type of the eigenvalue problem.
 
setQArnoldiLocking(self, lock)
Choose between locking and non-locking variants of the Q-Arnoldi method.
 
setQArnoldiRestart(self, keep)
Sets the restart parameter for the Q-Arnoldi method, in particular the proportion of basis vectors that must be kept after restart.
 
setRG(self, RG rg)
Associates a region object to the eigensolver.
 
setRefine(self, ref, npart=None, tol=None, its=None, scheme=None)
Sets the refinement strategy used by the PEP object, and the associated parameters.
 
setST(self, ST st)
Associates a spectral transformation object to the eigensolver.
 
setSTOARCheckEigenvalueType(self, flag)
Sets a flag to check that all the eigenvalues obtained throughout the spectrum slicing computation have the same definite type.
 
setSTOARDetectZeros(self, detect)
Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation.
 
setSTOARDimensions(self, nev=None, ncv=None, mpd=None)
Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.
 
setSTOARLinearization(self, alpha=1.0, beta=0.0)
Set the coefficients that define the linearization of a quadratic eigenproblem.
 
setSTOARLocking(self, lock)
Choose between locking and non-locking variants of the STOAR method.
 
setScale(self, scale, alpha=None, Vec Dl=None, Vec Dr=None, its=None, lbda=None)
Sets the scaling strategy to be used for scaling the polynomial problem before attempting to solve.
 
setStoppingTest(self, stopping, args=None, kargs=None)
Sets a function to decide when to stop the outer iteration of the eigensolver.
 
setTOARLocking(self, lock)
Choose between locking and non-locking variants of the TOAR method.
 
setTOARRestart(self, keep)
Sets the restart parameter for the TOAR method, in particular the proportion of basis vectors that must be kept after restart.
 
setTarget(self, target)
Sets the value of the target.
 
setTolerances(self, tol=None, max_it=None)
Sets the tolerance and maximum iteration count used by the default PEP convergence tests.
 
setTrackAll(self, trackall)
Specifies if the solver must compute the residual of all approximate eigenpairs or not.
 
setType(self, pep_type)
Selects the particular solver to be used in the PEP object.
 
setUp(self)
Sets up all the internal data structures necessary for the execution of the eigensolver.
 
setWhichEigenpairs(self, which)
Specifies which portion of the spectrum is to be sought.
 
solve(self)
Solves the eigensystem.
 
valuesView(self, Viewer viewer=None)
Displays the computed eigenvalues in a viewer.
 
vectorsView(self, Viewer viewer=None)
Outputs computed eigenvectors to a viewer.
 
view(self, Viewer viewer=None)
Prints the PEP data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  bv
  ds
  extract
  max_it
  problem_type
  rg
  st
  target
  tol
  track_all
  which

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

appendOptionsPrefix(self, prefix)

 

Appends to the prefix used for searching for all PEP options in the database.

Parameters

prefix: string
The prefix string to prepend to all PEP option requests.
Overrides: petsc4py.PETSc.Object.appendOptionsPrefix

computeError(self, int i, etype=None)

 

Computes the error (based on the residual norm) associated with the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.
etype: PEP.ErrorType enumerate
The error type to compute.

Returns

error: real
The error bound, computed in various ways from the residual norm ||P(l)x||_2 where l is the eigenvalue and x is the eigenvector.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()).

create(self, comm=None)

 

Creates the PEP object.

Parameters

comm: Comm, optional.
MPI communicator. If not provided, it defaults to all processes.

destroy(self)

 
Destroys the PEP object.
Overrides: petsc4py.PETSc.Object.destroy

errorView(self, etype=None, Viewer viewer=None)

 

Displays the errors associated with the computed solution (as well as the eigenvalues).

Parameters

etype: PEP.ErrorType enumerate, optional
The error type to compute.
viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

Notes

By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ASCII_INFO_DETAIL then a table with eigenvalues and corresponding errors is printed.

getBV(self)

 

Obtain the basis vectors object associated to the eigensolver.

Returns

bv: BV
The basis vectors context.

getBasis(self)

 

Gets the type of polynomial basis used to describe the polynomial eigenvalue problem.

Returns

basis: PEP.Basis enumerate
the basis that was previously set.

getCISSExtraction(self)

 

Gets the extraction technique used in the CISS solver.

Returns

extraction: PEP.CISSExtraction enumerate
The extraction technique.

getCISSKSPs(self)

 

Retrieve the array of linear solver objects associated with the CISS solver.

Returns

ksp: list of KSP
The linear solver objects.

Notes

The number of KSP solvers is equal to the number of integration points divided by the number of partitions. This value is halved in the case of real matrices with a region centered at the real axis.

getCISSRefinement(self)

 

Gets the values of various refinement parameters in the CISS solver.

Returns

inner: int
Number of iterative refinement iterations (inner loop).
blsize: int
Number of iterative refinement iterations (blocksize loop).

getCISSSizes(self)

 

Gets the values of various size parameters in the CISS solver.

Returns

ip: int
Number of integration points.
bs: int
Block size.
ms: int
Moment size.
npart: int
Number of partitions when splitting the communicator.
bsmax: int
Maximum block size.
realmats: bool
True if A and B are real.

getCISSThreshold(self)

 

Gets the values of various threshold parameters in the CISS solver.

Returns

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs.

getConverged(self)

 

Gets the number of converged eigenpairs.

Returns

nconv: int
Number of converged eigenpairs.

getConvergedReason(self)

 

Gets the reason why the solve() iteration was stopped.

Returns

reason: PEP.ConvergedReason enumerate
Negative value indicates diverged, positive value converged.

getConvergenceTest(self)

 

Return the method used to compute the error estimate used in the convergence test.

Returns

conv: PEP.Conv
The method used to compute the error estimate used in the convergence test.

getDS(self)

 

Obtain the direct solver associated to the eigensolver.

Returns

ds: DS
The direct solver context.

getDimensions(self)

 

Gets the number of eigenvalues to compute and the dimension of the subspace.

Returns

nev: int
Number of eigenvalues to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getEigenpair(self, int i, Vec Vr=None, Vec Vi=None)

 

Gets the i-th solution of the eigenproblem as computed by solve(). The solution consists of both the eigenvalue and the eigenvector.

Parameters

i: int
Index of the solution to be obtained.
Vr: Vec, optional
Placeholder for the returned eigenvector (real part).
Vi: Vec, optional
Placeholder for the returned eigenvector (imaginary part).

Returns

e: scalar (possibly complex)
The computed eigenvalue.

getErrorEstimate(self, int i)

 

Returns the error estimate associated to the i-th computed eigenpair.

Parameters

i: int
Index of the solution to be considered.

Returns

error: real
Error estimate.

getExtract(self)

 

Gets the extraction technique used by the PEP object.

Returns

extract: PEP.Extract enumerate
The extraction strategy.

getInterval(self)

 

Gets the computational interval for spectrum slicing.

Returns

inta: float
The left end of the interval.
intb: float
The right end of the interval.

Notes

If the interval was not set by the user, then zeros are returned.

getIterationNumber(self)

 

Gets the current iteration number. If the call to solve() is complete, then it returns the number of iterations carried out by the solution method.

Returns

its: int
Iteration number.

getJDFix(self)

 

Gets threshold for changing the target in the correction equation.

Returns

fix: float
The threshold for changing the target.

getJDMinimalityIndex(self)

 

Returns the maximum allowed value of the minimality index.

Returns

flag: int
The maximum minimality index.

getJDProjection(self)

 

Gets the type of projection to be used in the Jacobi-Davidson solver.

Returns

proj: PEP.JDProjection enumerate
The type of projection.

getJDRestart(self)

 

Gets the restart parameter used in the Jacobi-Davidson method.

Returns

keep: float
The number of vectors to be kept at restart.

getJDReusePreconditioner(self)

 

Returns the flag for reusing the preconditioner.

Returns

flag: bool
The reuse flag.

getLinearEPS(self)

 

Retrieve the eigensolver object associated to the polynomial eigenvalue solver.

Returns

eps: EPS
The linear eigensolver.

getLinearExplicitMatrix(self)

 

Returns the flag indicating if the matrices A and B for the linearization are built explicitly.

Returns

flag: bool
Boolean flag indicating if the matrices are built explicitly.

getLinearLinearization(self)

 

Returns the coefficients that define the linearization of a quadratic eigenproblem.

Returns

alpha: float
First parameter of the linearization.
beta: float
Second parameter of the linearization.

getOperators(self)

 

Gets the matrices associated with the eigenvalue problem.

Returns

operators: tuple of Mat
The matrices associated with the eigensystem.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all PEP options in the database.

Returns

prefix: string
The prefix string set for this PEP object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getProblemType(self)

 

Gets the problem type from the PEP object.

Returns

problem_type: PEP.ProblemType enumerate
The problem type that was previously set.

getQArnoldiLocking(self)

 

Gets the locking flag used in the Q-Arnoldi method.

Returns

lock: bool
The locking flag.

getQArnoldiRestart(self)

 

Gets the restart parameter used in the Q-Arnoldi method.

Returns

keep: float
The number of vectors to be kept at restart.

getRG(self)

 

Obtain the region object associated to the eigensolver.

Returns

rg: RG
The region context.

getRefine(self)

 

Gets the refinement strategy used by the PEP object, and the associated parameters.

Returns

ref: PEP.Refine
The refinement type.
npart: int
The number of partitions of the communicator.
tol: real
The convergence tolerance.
its: int
The maximum number of refinement iterations.
scheme: PEP.RefineScheme
Scheme for solving linear systems

getRefineKSP(self)

 

Obtain the KSP object used by the eigensolver in the refinement phase.

Returns

ksp: KSP
The linear solver object.

getST(self)

 

Obtain the spectral transformation (ST) object associated to the eigensolver object.

Returns

st: ST
The spectral transformation.

getSTOARCheckEigenvalueType(self)

 

Gets the flag for the eigenvalue type check in spectrum slicing.

Returns

flag: bool
Whether the eigenvalue type is checked or not.

getSTOARDetectZeros(self)

 

Gets the flag that enforces zero detection in spectrum slicing.

Returns

detect: bool
The zero detection flag.

getSTOARDimensions(self)

 

Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval.

Returns

nev: int
Number of eigenvalues to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getSTOARInertias(self)

 

Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval.

Returns

shifts: list of float
The values of the shifts used internally in the solver.
inertias: list of int
The values of the inertia in each shift.

getSTOARLinearization(self)

 

Returns the coefficients that define the linearization of a quadratic eigenproblem.

Returns

alpha: float
First parameter of the linearization.
beta: float
Second parameter of the linearization.

getSTOARLocking(self)

 

Gets the locking flag used in the STOAR method.

Returns

lock: bool
The locking flag.

getScale(self, Vec Dl=None, Vec Dr=None)

 

Gets the strategy used for scaling the polynomial eigenproblem.

Parameters

Dl: Vec, optional
Placeholder for the returned left diagonal matrix.
Dr: Vec, optional
Placeholder for the returned right diagonal matrix.

Returns

scale: PEP.Scale enumerate
The scaling strategy.
alpha: real
The scaling factor.
its: int
The number of iteration of diagonal scaling.
lbda: real
Approximation of the wanted eigenvalues (modulus).

getTOARLocking(self)

 

Gets the locking flag used in the TOAR method.

Returns

lock: bool
The locking flag.

getTOARRestart(self)

 

Gets the restart parameter used in the TOAR method.

Returns

keep: float
The number of vectors to be kept at restart.

getTarget(self)

 

Gets the value of the target.

Returns

target: float (real or complex)
The value of the target.

Notes

If the target was not set by the user, then zero is returned.

getTolerances(self)

 

Gets the tolerance and maximum iteration count used by the default PEP convergence tests.

Returns

tol: float
The convergence tolerance.
max_it: int
The maximum number of iterations

getTrackAll(self)

 

Returns the flag indicating whether all residual norms must be computed or not.

Returns

trackall: bool
Whether the solver compute all residuals or not.

getType(self)

 

Gets the PEP type of this object.

Returns

type: PEP.Type enumerate
The solver currently being used.
Overrides: petsc4py.PETSc.Object.getType

getWhichEigenpairs(self)

 

Returns which portion of the spectrum is to be sought.

Returns

which: PEP.Which enumerate
The portion of the spectrum to be sought by the solver.

setBV(self, BV bv)

 

Associates a basis vectors object to the eigensolver.

Parameters

bv: BV
The basis vectors context.

setBasis(self, basis)

 

Specifies the type of polynomial basis used to describe the polynomial eigenvalue problem.

Parameters

basis: PEP.Basis enumerate
the basis to be set.

setCISSExtraction(self, extraction)

 

Sets the extraction technique used in the CISS solver.

Parameters

extraction: PEP.CISSExtraction enumerate
The extraction technique.

setCISSRefinement(self, inner=None, blsize=None)

 

Sets the values of various refinement parameters in the CISS solver.

Parameters

inner: int, optional
Number of iterative refinement iterations (inner loop).
blsize: int, optional
Number of iterative refinement iterations (blocksize loop).

setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False)

 

Sets the values of various size parameters in the CISS solver.

Parameters

ip: int, optional
Number of integration points.
bs: int, optional
Block size.
ms: int, optional
Moment size.
npart: int, optional
Number of partitions when splitting the communicator.
bsmax: int, optional
Maximum block size.
realmats: bool, optional
True if A and B are real.

Notes

The default number of partitions is 1. This means the internal KSP object is shared among all processes of the PEP communicator. Otherwise, the communicator is split into npart communicators, so that npart KSP solves proceed simultaneously.

setCISSThreshold(self, delta=None, spur=None)

 

Sets the values of various threshold parameters in the CISS solver.

Parameters

delta: float
Threshold for numerical rank.
spur: float
Spurious threshold (to discard spurious eigenpairs).

setConvergenceTest(self, conv)

 

Specifies how to compute the error estimate used in the convergence test.

Parameters

conv: PEP.Conv
The method used to compute the error estimate used in the convergence test.

setDS(self, DS ds)

 

Associates a direct solver object to the eigensolver.

Parameters

ds: DS
The direct solver context.

setDimensions(self, nev=None, ncv=None, mpd=None)

 

Sets the number of eigenvalues to compute and the dimension of the subspace.

Parameters

nev: int, optional
Number of eigenvalues to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

setExtract(self, extract)

 

Specifies the extraction strategy to be used.

Parameters

extract: PEP.Extract enumerate
The extraction strategy.

setFromOptions(self)

 
Sets PEP options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.
Overrides: petsc4py.PETSc.Object.setFromOptions

setInitialSpace(self, space)

 

Sets the initial space from which the eigensolver starts to iterate.

Parameters

space: Vec or sequence of Vec
The initial space

setInterval(self, inta, intb)

 

Defines the computational interval for spectrum slicing.

Parameters

inta: float
The left end of the interval.
intb: float
The right end of the interval.

Notes

Spectrum slicing is a technique employed for computing all eigenvalues of symmetric quadratic eigenproblems in a given interval. This function provides the interval to be considered. It must be used in combination with PEP.Which.ALL, see setWhichEigenpairs().

setJDFix(self, fix)

 

Sets the threshold for changing the target in the correction equation.

Parameters

fix: float
Threshold for changing the target.

Notes

The target in the correction equation is fixed at the first iterations. When the norm of the residual vector is lower than the fix value, the target is set to the corresponding eigenvalue.

setJDMinimalityIndex(self, flag)

 

Sets the maximum allowed value for the minimality index.

Parameters

flag: int
The maximum minimality index.

setJDProjection(self, proj)

 

Sets the type of projection to be used in the Jacobi-Davidson solver.

Parameters

proj: PEP.JDProjection enumerate
The type of projection.

setJDRestart(self, keep)

 

Sets the restart parameter for the Jacobi-Davidson method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setJDReusePreconditioner(self, flag)

 

Sets a flag indicating whether the preconditioner must be reused or not.

Parameters

flag: bool
The reuse flag.

setLinearEPS(self, EPS eps)

 

Associate an eigensolver object to the polynomial eigenvalue solver.

Parameters

eps: EPS
The linear eigensolver.

setLinearExplicitMatrix(self, flag)

 

Indicate if the matrices A and B for the linearization of the problem must be built explicitly.

Parameters

flag: bool
Boolean flag indicating if the matrices are built explicitly.

setLinearLinearization(self, alpha=1.0, beta=0.0)

 

Set the coefficients that define the linearization of a quadratic eigenproblem.

Parameters

alpha: float
First parameter of the linearization.
beta: float
Second parameter of the linearization.

setOperators(self, operators)

 

Sets the matrices associated with the eigenvalue problem.

Parameters

operators: sequence of Mat
The matrices associated with the eigensystem.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all PEP options in the database.

Parameters

prefix: string
The prefix string to prepend to all PEP option requests.
Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setProblemType(self, problem_type)

 

Specifies the type of the eigenvalue problem.

Parameters

problem_type: PEP.ProblemType enumerate
The problem type to be set.

setQArnoldiLocking(self, lock)

 

Choose between locking and non-locking variants of the Q-Arnoldi method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setQArnoldiRestart(self, keep)

 

Sets the restart parameter for the Q-Arnoldi method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setRG(self, RG rg)

 

Associates a region object to the eigensolver.

Parameters

rg: RG
The region context.

setRefine(self, ref, npart=None, tol=None, its=None, scheme=None)

 

Sets the refinement strategy used by the PEP object, and the associated parameters.

Parameters

ref: PEP.Refine
The refinement type.
npart: int, optional
The number of partitions of the communicator.
tol: real, optional
The convergence tolerance.
its: int, optional
The maximum number of refinement iterations.
scheme: PEP.RefineScheme, optional
Scheme for linear system solves

setST(self, ST st)

 

Associates a spectral transformation object to the eigensolver.

Parameters

st: ST
The spectral transformation.

setSTOARCheckEigenvalueType(self, flag)

 

Sets a flag to check that all the eigenvalues obtained throughout the spectrum slicing computation have the same definite type.

Parameters

flag: bool
Whether the eigenvalue type is checked or not.

setSTOARDetectZeros(self, detect)

 

Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation.

Parameters

detect: bool
True if zeros must checked for.

Notes

A zero in the factorization indicates that a shift coincides with an eigenvalue.

This flag is turned off by default, and may be necessary in some cases. This feature currently requires an external package for factorizations with support for zero detection, e.g. MUMPS.

setSTOARDimensions(self, nev=None, ncv=None, mpd=None)

 

Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. The meaning of the parameters is the same as in setDimensions().

Parameters

nev: int, optional
Number of eigenvalues to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

setSTOARLinearization(self, alpha=1.0, beta=0.0)

 

Set the coefficients that define the linearization of a quadratic eigenproblem.

Parameters

alpha: float
First parameter of the linearization.
beta: float
Second parameter of the linearization.

setSTOARLocking(self, lock)

 

Choose between locking and non-locking variants of the STOAR method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setScale(self, scale, alpha=None, Vec Dl=None, Vec Dr=None, its=None, lbda=None)

 

Sets the scaling strategy to be used for scaling the polynomial problem before attempting to solve.

Parameters

scale: PEP.Scale enumerate
The scaling strategy.
alpha: real, optional
The scaling factor.
Dl: Vec, optional
The left diagonal matrix.
Dr: Vec, optional
The right diagonal matrix.
its: int, optional
The number of iteration of diagonal scaling.
lbda: real, optional
Approximation of the wanted eigenvalues (modulus).

setTOARLocking(self, lock)

 

Choose between locking and non-locking variants of the TOAR method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setTOARRestart(self, keep)

 

Sets the restart parameter for the TOAR method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setTarget(self, target)

 

Sets the value of the target.

Parameters

target: float (real or complex)
The value of the target.

Notes

The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with setWhichEigenpairs().

setTolerances(self, tol=None, max_it=None)

 

Sets the tolerance and maximum iteration count used by the default PEP convergence tests.

Parameters

tol: float, optional
The convergence tolerance.
max_it: int, optional
The maximum number of iterations

setTrackAll(self, trackall)

 

Specifies if the solver must compute the residual of all approximate eigenpairs or not.

Parameters

trackall: bool
Whether compute all residuals or not.

setType(self, pep_type)

 

Selects the particular solver to be used in the PEP object.

Parameters

pep_type: PEP.Type enumerate
The solver to be used.

setWhichEigenpairs(self, which)

 

Specifies which portion of the spectrum is to be sought.

Parameters

which: PEP.Which enumerate
The portion of the spectrum to be sought by the solver.

valuesView(self, Viewer viewer=None)

 

Displays the computed eigenvalues in a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

vectorsView(self, Viewer viewer=None)

 

Outputs computed eigenvectors to a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

view(self, Viewer viewer=None)

 

Prints the PEP data structure.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Basis-class.html000066400000000000000000000240771454104675500237200ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Basis
Package slepc4py :: Module SLEPc :: Class PEP :: Class Basis
[hide private]
[frames] | no frames]

Class Basis


PEP basis type for the representation of the polynomial

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CHEBYSHEV1 = 1
  CHEBYSHEV2 = 2
  HERMITE = 5
  LAGUERRE = 4
  LEGENDRE = 3
  MONOMIAL = 0
  __qualname__ = 'PEPBasis'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.CISSExtraction-class.html000066400000000000000000000217561454104675500254620ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.CISSExtraction
Package slepc4py :: Module SLEPc :: Class PEP :: Class CISSExtraction
[hide private]
[frames] | no frames]

Class CISSExtraction


PEP CISS extraction technique

  • RITZ: Ritz extraction.
  • HANKEL: Extraction via Hankel eigenproblem.
  • CAA: Communication-avoiding Arnoldi.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CAA = 2
  HANKEL = 1
  RITZ = 0
  __qualname__ = 'PEPCISSExtraction'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Conv-class.html000066400000000000000000000223431454104675500235560ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Conv
Package slepc4py :: Module SLEPc :: Class PEP :: Class Conv
[hide private]
[frames] | no frames]

Class Conv


PEP convergence test

  • ABS: Absolute convergence test.
  • REL: Convergence test relative to the eigenvalue.
  • NORM: Convergence test relative to the matrix norms.
  • USER: User-defined convergence test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABS = 0
  NORM = 2
  REL = 1
  USER = 3
  __qualname__ = 'PEPConv'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.ConvergedReason-class.html000066400000000000000000000253751454104675500257450ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.ConvergedReason
Package slepc4py :: Module SLEPc :: Class PEP :: Class ConvergedReason
[hide private]
[frames] | no frames]

Class ConvergedReason


PEP convergence reasons

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONVERGED_ITERATING = 0
  CONVERGED_TOL = 1
  CONVERGED_USER = 2
  DIVERGED_BREAKDOWN = -2
  DIVERGED_ITS = -1
  DIVERGED_SYMMETRY_LOST = -3
  ITERATING = 0
  __qualname__ = 'PEPConvergedReason'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.ErrorType-class.html000066400000000000000000000217161454104675500246070ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.ErrorType
Package slepc4py :: Module SLEPc :: Class PEP :: Class ErrorType
[hide private]
[frames] | no frames]

Class ErrorType


PEP error type to assess accuracy of computed solutions

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABSOLUTE = 0
  BACKWARD = 2
  RELATIVE = 1
  __qualname__ = 'PEPErrorType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Extract-class.html000066400000000000000000000226321454104675500242640ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Extract
Package slepc4py :: Module SLEPc :: Class PEP :: Class Extract
[hide private]
[frames] | no frames]

Class Extract


PEP extraction strategy used to obtain eigenvectors of the PEP from the eigenvectors of the linearization

  • NONE: Use the first block.
  • NORM: Use the first or last block depending on norm of H.
  • RESIDUAL: Use the block with smallest residual.
  • STRUCTURED: Combine all blocks in a certain way.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  NONE = 1
  NORM = 2
  RESIDUAL = 3
  STRUCTURED = 4
  __qualname__ = 'PEPExtract'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.JDProjection-class.html000066400000000000000000000212171454104675500252020ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.JDProjection
Package slepc4py :: Module SLEPc :: Class PEP :: Class JDProjection
[hide private]
[frames] | no frames]

Class JDProjection


PEP type of projection to be used in the Jacobi-Davidson solver

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  HARMONIC = 0
  ORTHOGONAL = 1
  __qualname__ = 'PEPJDProjection'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.ProblemType-class.html000066400000000000000000000226511454104675500251150ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.ProblemType
Package slepc4py :: Module SLEPc :: Class PEP :: Class ProblemType
[hide private]
[frames] | no frames]

Class ProblemType


PEP problem type

  • GENERAL: No structure.
  • HERMITIAN: Hermitian structure.
  • HYPERBOLIC: QEP with Hermitian matrices, M>0, (x'Cx)^2 > 4(x'Mx)(x'Kx).
  • GYROSCOPIC: QEP with M, K Hermitian, M>0, C skew-Hermitian.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  GENERAL = 1
  GYROSCOPIC = 4
  HERMITIAN = 2
  HYPERBOLIC = 3
  __qualname__ = 'PEPProblemType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Refine-class.html000066400000000000000000000216431454104675500240630ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Refine
Package slepc4py :: Module SLEPc :: Class PEP :: Class Refine
[hide private]
[frames] | no frames]

Class Refine


PEP refinement strategy

  • NONE: No refinement.
  • SIMPLE: Refine eigenpairs one by one.
  • MULTIPLE: Refine all eigenpairs simultaneously (invariant pair).
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  MULTIPLE = 2
  NONE = 0
  SIMPLE = 1
  __qualname__ = 'PEPRefine'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.RefineScheme-class.html000066400000000000000000000217741454104675500252150ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.RefineScheme
Package slepc4py :: Module SLEPc :: Class PEP :: Class RefineScheme
[hide private]
[frames] | no frames]

Class RefineScheme


PEP scheme for solving linear systems during iterative refinement

  • SCHUR: Schur complement.
  • MBE: Mixed block elimination.
  • EXPLICIT: Build the explicit matrix.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  EXPLICIT = 3
  MBE = 2
  SCHUR = 1
  __qualname__ = 'PEPRefineScheme'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Scale-class.html000066400000000000000000000223231454104675500236760ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Scale
Package slepc4py :: Module SLEPc :: Class PEP :: Class Scale
[hide private]
[frames] | no frames]

Class Scale


PEP scaling strategy

  • NONE: No scaling.
  • SCALAR: Parameter scaling.
  • DIAGONAL: Diagonal scaling.
  • BOTH: Both parameter and diagonal scaling.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  BOTH = 3
  DIAGONAL = 2
  NONE = 0
  SCALAR = 1
  __qualname__ = 'PEPScale'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Stop-class.html000066400000000000000000000207421454104675500235770ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Stop
Package slepc4py :: Module SLEPc :: Class PEP :: Class Stop
[hide private]
[frames] | no frames]

Class Stop


PEP stopping test

  • BASIC: Default stopping test.
  • USER: User-defined stopping test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  BASIC = 0
  USER = 1
  __qualname__ = 'PEPStop'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Type-class.html000066400000000000000000000252541454104675500235760ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Type
Package slepc4py :: Module SLEPc :: Class PEP :: Class Type
[hide private]
[frames] | no frames]

Class Type


PEP type

Polynomial eigensolvers.

  • LINEAR: Linearization via EPS.
  • QARNOLDI: Q-Arnoldi for quadratic problems.
  • TOAR: Two-level orthogonal Arnoldi.
  • STOAR: Symmetric TOAR.
  • JD: Polynomial Jacobi-Davidson.
  • CISS: Contour integral spectrum slice.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CISS = 'ciss'
  JD = 'jd'
  LINEAR = 'linear'
  QARNOLDI = 'qarnoldi'
  STOAR = 'stoar'
  TOAR = 'toar'
  __qualname__ = 'PEPType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.PEP.Which-class.html000066400000000000000000000303041454104675500237070ustar00rootroot00000000000000 slepc4py.SLEPc.PEP.Which
Package slepc4py :: Module SLEPc :: Class PEP :: Class Which
[hide private]
[frames] | no frames]

Class Which


PEP desired part of spectrum

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ALL = 10
  LARGEST_IMAGINARY = 5
  LARGEST_MAGNITUDE = 1
  LARGEST_REAL = 3
  SMALLEST_IMAGINARY = 6
  SMALLEST_MAGNITUDE = 2
  SMALLEST_REAL = 4
  TARGET_IMAGINARY = 9
  TARGET_MAGNITUDE = 7
  TARGET_REAL = 8
  USER = 11
  __qualname__ = 'PEPWhich'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.RG-class.html000066400000000000000000001555611454104675500225470ustar00rootroot00000000000000 slepc4py.SLEPc.RG
Package slepc4py :: Module SLEPc :: Class RG
[hide private]
[frames] | no frames]

Class RG


RG
Nested Classes [hide private]
  QuadRule
RG quadrature rule for contour integral methods
  Type
RG type
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
canUseConjugates(self, realmats=True)
Used in contour integral methods to determine whether half of integration points can be avoided (use their conjugates).
 
checkInside(self, a)
Determines if a set of given points are inside the region or not.
 
computeBoundingBox(self)
Determines the endpoints of a rectangle in the complex plane that contains the region.
 
computeContour(self, n)
Computes the coordinates of several points lying on the contour of the region.
 
computeQuadrature(self, quad, n)
Computes the values of the parameters used in a quadrature rule for a contour integral around the boundary of the region.
 
create(self, comm=None)
Creates the RG object.
 
destroy(self)
Destroys the RG object.
 
getComplement(self)
Returns the flag indicating whether the region is complemented or not.
 
getEllipseParameters(self)
Gets the parameters that define the ellipse region.
 
getIntervalEndpoints(self)
Gets the parameters that define the interval region.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all RG options in the database.
 
getPolygonVertices(self)
Gets the parameters that define the interval region.
 
getRingParameters(self)
Gets the parameters that define the ring region.
 
getScale(self)
Gets the scaling factor.
 
getType(self)
Gets the RG type of this object.
 
isAxisymmetric(self, vertical=False)
Determines if the region is symmetric with respect to the real or imaginary axis.
 
isTrivial(self)
Tells whether it is the trivial region (whole complex plane).
 
setComplement(self, comp=True)
Sets a flag to indicate that the region is the complement of the specified one.
 
setEllipseParameters(self, center, radius, vscale=None)
Sets the parameters defining the ellipse region.
 
setFromOptions(self)
Sets RG options from the options database.
 
setIntervalEndpoints(self, a, b, c, d)
Sets the parameters defining the interval region.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all RG options in the database.
 
setPolygonVertices(self, v)
Sets the vertices that define the polygon region.
 
setRingParameters(self, center, radius, vscale, start_ang, end_ang, width)
Sets the parameters defining the ring region.
 
setScale(self, sfactor=None)
Sets the scaling factor to be used when checking that a point is inside the region and when computing the contour.
 
setType(self, rg_type)
Selects the type for the RG object.
 
view(self, Viewer viewer=None)
Prints the RG data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, appendOptionsPrefix, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  complement
  scale

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

canUseConjugates(self, realmats=True)

 

Used in contour integral methods to determine whether half of integration points can be avoided (use their conjugates).

Parameters

realmats: bool, optional
True if the problem matrices are real.

Returns

useconj: bool
Whether it is possible to use conjugates.

checkInside(self, a)

 

Determines if a set of given points are inside the region or not.

Parameters

a: list of float (complex)
The coordinates of the points.

Returns

inside: list of int
Computed result for each point (1=inside, 0=on the contour, -1=outside).

computeBoundingBox(self)

 

Determines the endpoints of a rectangle in the complex plane that contains the region.

Returns

a: float
The left endpoint of the bounding box in the real axis
b: float
The right endpoint of the bounding box in the real axis
c: float
The left endpoint of the bounding box in the imaginary axis
d: float
The right endpoint of the bounding box in the imaginary axis

computeContour(self, n)

 

Computes the coordinates of several points lying on the contour of the region.

Parameters

n: int
The number of points to compute.

Returns

x: list of float (complex)
Computed points.

computeQuadrature(self, quad, n)

 

Computes the values of the parameters used in a quadrature rule for a contour integral around the boundary of the region.

Parameters

quad: RG.QuadRule enumerate
The type of quadrature.
n: int
The number of quadrature points to compute.

Returns

z: list of float (real or complex)
Quadrature points.
zn: list of float (real or complex)
Normalized quadrature points.
w: list of float (real or complex)
Quadrature weights.

create(self, comm=None)

 

Creates the RG object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the RG object.
Overrides: petsc4py.PETSc.Object.destroy

getComplement(self)

 

Returns the flag indicating whether the region is complemented or not.

Returns

flg: bool
Whether the region is complemented or not.

getEllipseParameters(self)

 

Gets the parameters that define the ellipse region.

Returns

center: float (real or complex)
The center.
radius: float
The radius.
vscale: float
The vertical scale.

getIntervalEndpoints(self)

 

Gets the parameters that define the interval region.

Returns

a: float
The left endpoint in the real axis.
b: float
The right endpoint in the real axis.
c: float
The upper endpoint in the imaginary axis.
d: float
The lower endpoint in the imaginary axis.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all RG options in the database.

Returns

prefix: string
The prefix string set for this RG object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getPolygonVertices(self)

 

Gets the parameters that define the interval region.

Returns

v: list of float (complex)
The vertices.

getRingParameters(self)

 

Gets the parameters that define the ring region.

Returns

center: float (real or complex)
The center.
radius: float
The radius.
vscale: float
The vertical scale.
start_ang: float
The right-hand side angle.
end_ang: float
The left-hand side angle.
width: float
The width of the ring.

getScale(self)

 

Gets the scaling factor.

Returns

sfactor: float
The scaling factor.

getType(self)

 

Gets the RG type of this object.

Returns

type: RG.Type enumerate
The inner product type currently being used.
Overrides: petsc4py.PETSc.Object.getType

isAxisymmetric(self, vertical=False)

 

Determines if the region is symmetric with respect to the real or imaginary axis.

Parameters

vertical: bool, optional
True if symmetry must be checked against the vertical axis.

Returns

symm: bool
True if the region is axisymmetric.

isTrivial(self)

 

Tells whether it is the trivial region (whole complex plane).

Returns

flag: bool
True if the region is equal to the whole complex plane, e.g., an interval region with all four endpoints unbounded or an ellipse with infinite radius.

setComplement(self, comp=True)

 

Sets a flag to indicate that the region is the complement of the specified one.

Parameters

comp: bool, optional
Activate/deactivate the complementation of the region.

setEllipseParameters(self, center, radius, vscale=None)

 

Sets the parameters defining the ellipse region.

Parameters

center: float (real or complex)
The center.
radius: float
The radius.
vscale: float, optional
The vertical scale.

setFromOptions(self)

 

Sets RG options from the options database.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setIntervalEndpoints(self, a, b, c, d)

 

Sets the parameters defining the interval region.

Parameters

a: float
The left endpoint in the real axis.
b: float
The right endpoint in the real axis.
c: float
The upper endpoint in the imaginary axis.
d: float
The lower endpoint in the imaginary axis.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all RG options in the database.

Parameters

prefix: string
The prefix string to prepend to all RG option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setPolygonVertices(self, v)

 

Sets the vertices that define the polygon region.

Parameters

v: list of float (complex)
The vertices.

setRingParameters(self, center, radius, vscale, start_ang, end_ang, width)

 

Sets the parameters defining the ring region.

Parameters

center: float (real or complex)
The center.
radius: float
The radius.
vscale: float
The vertical scale.
start_ang: float
The right-hand side angle.
end_ang: float
The left-hand side angle.
width: float
The width of the ring.

setScale(self, sfactor=None)

 

Sets the scaling factor to be used when checking that a point is inside the region and when computing the contour.

Parameters

sfactor: float, optional
The scaling factor (default=1).

setType(self, rg_type)

 

Selects the type for the RG object.

Parameters

rg_type: RG.Type enumerate
The inner product type to be used.

view(self, Viewer viewer=None)

 

Prints the RG data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.RG.QuadRule-class.html000066400000000000000000000211051454104675500242520ustar00rootroot00000000000000 slepc4py.SLEPc.RG.QuadRule
Package slepc4py :: Module SLEPc :: Class RG :: Class QuadRule
[hide private]
[frames] | no frames]

Class QuadRule


RG quadrature rule for contour integral methods

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CHEBYSHEV = 2
  TRAPEZOIDAL = 1
  __qualname__ = 'RGQuadRule'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.RG.Type-class.html000066400000000000000000000223261454104675500234570ustar00rootroot00000000000000 slepc4py.SLEPc.RG.Type
Package slepc4py :: Module SLEPc :: Class RG :: Class Type
[hide private]
[frames] | no frames]

Class Type


RG type
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ELLIPSE = 'ellipse'
  INTERVAL = 'interval'
  POLYGON = 'polygon'
  RING = 'ring'
  __qualname__ = 'RGType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.ST-class.html000066400000000000000000002221601454104675500225530ustar00rootroot00000000000000 slepc4py.SLEPc.ST
Package slepc4py :: Module SLEPc :: Class ST
[hide private]
[frames] | no frames]

Class ST


ST
Nested Classes [hide private]
  MatMode
ST matrix mode
  Type
ST types
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
apply(self, Vec x, Vec y)
Applies the spectral transformation operator to a vector, for instance (A - sB)^-1 B in the case of the shift-and-invert transformation and generalized eigenproblem.
 
applyHermitianTranspose(self, Vec x, Vec y)
Applies the hermitian-transpose of the operator to a vector, for instance B^H(A - sB)^-H in the case of the shift-and-invert transformation and generalized eigenproblem.
 
applyMat(self, Mat x, Mat y)
Applies the spectral transformation operator to a matrix, for instance (A - sB)^-1 B in the case of the shift-and-invert transformation and generalized eigenproblem.
 
applyTranspose(self, Vec x, Vec y)
Applies the transpose of the operator to a vector, for instance B^T(A - sB)^-T in the case of the shift-and-invert transformation and generalized eigenproblem.
 
create(self, comm=None)
Creates the ST object.
 
destroy(self)
Destroys the ST object.
 
getCayleyAntishift(self)
Gets the value of the anti-shift for the Cayley spectral transformation.
 
getFilterDegree(self)
Gets the degree of the filter polynomial.
 
getFilterInterval(self)
Gets the interval containing the desired eigenvalues.
 
getFilterRange(self)
Gets the interval containing all eigenvalues.
 
getKSP(self)
Gets the KSP object associated with the spectral transformation.
 
getMatMode(self)
Gets a flag that indicates how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations.
 
getMatStructure(self)
Gets the internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the matrices.
 
getMatrices(self)
Gets the matrices associated with the eigenvalue problem.
 
getOperator(self)
Returns a shell matrix that represents the operator of the spectral transformation.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all ST options in the database.
 
getPreconditionerMat(self)
Gets the matrix previously set by setPreconditionerMat().
 
getShift(self)
Gets the shift associated with the spectral transformation.
 
getTransform(self)
Gets the flag indicating whether the transformed matrices are computed or not.
 
getType(self)
Gets the ST type of this object.
 
reset(self)
Resets the ST object.
 
restoreOperator(self, Mat op)
Restore the previously seized operator matrix.
 
setCayleyAntishift(self, tau)
Sets the value of the anti-shift for the Cayley spectral transformation.
 
setFilterDegree(self, deg)
Sets the degree of the filter polynomial.
 
setFilterInterval(self, inta, intb)
Defines the interval containing the desired eigenvalues.
 
setFilterRange(self, left, right)
Defines the numerical range (or field of values) of the matrix, that is, the interval containing all eigenvalues.
 
setFromOptions(self)
Sets ST options from the options database.
 
setKSP(self, KSP ksp)
Sets the KSP object associated with the spectral transformation.
 
setMatMode(self, mode)
Sets a flag to indicate how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations.
 
setMatStructure(self, structure)
Sets an internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the two matrices A and B constituting the generalized eigenvalue problem.
 
setMatrices(self, operators)
Sets the matrices associated with the eigenvalue problem.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all ST options in the database.
 
setPreconditionerMat(self, Mat P=None)
Sets the matrix to be used to build the preconditioner.
 
setShift(self, shift)
Sets the shift associated with the spectral transformation.
 
setTransform(self, flag=True)
Sets a flag to indicate whether the transformed matrices are computed or not.
 
setType(self, st_type)
Builds ST for a particular spectral transformation.
 
setUp(self)
Prepares for the use of a spectral transformation.
 
view(self, Viewer viewer=None)
Prints the ST data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, appendOptionsPrefix, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  ksp
  mat_mode
  mat_structure
  shift
  transform

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

apply(self, Vec x, Vec y)

 

Applies the spectral transformation operator to a vector, for instance (A - sB)^-1 B in the case of the shift-and-invert transformation and generalized eigenproblem.

Parameters

x: Vec
The input vector.
y: Vec
The result vector.

applyHermitianTranspose(self, Vec x, Vec y)

 

Applies the hermitian-transpose of the operator to a vector, for instance B^H(A - sB)^-H in the case of the shift-and-invert transformation and generalized eigenproblem.

Parameters

x: Vec
The input vector.
y: Vec
The result vector.

applyMat(self, Mat x, Mat y)

 

Applies the spectral transformation operator to a matrix, for instance (A - sB)^-1 B in the case of the shift-and-invert transformation and generalized eigenproblem.

Parameters

x: Mat
The input matrix.
y: Mat
The result matrix.

applyTranspose(self, Vec x, Vec y)

 

Applies the transpose of the operator to a vector, for instance B^T(A - sB)^-T in the case of the shift-and-invert transformation and generalized eigenproblem.

Parameters

x: Vec
The input vector.
y: Vec
The result vector.

create(self, comm=None)

 

Creates the ST object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the ST object.
Overrides: petsc4py.PETSc.Object.destroy

getCayleyAntishift(self)

 

Gets the value of the anti-shift for the Cayley spectral transformation.

Returns

tau: scalar (possibly complex)
The anti-shift.

getFilterDegree(self)

 

Gets the degree of the filter polynomial.

Returns

deg: int
The polynomial degree.

getFilterInterval(self)

 

Gets the interval containing the desired eigenvalues.

Returns

inta: float
The left end of the interval.
intb: float
The right end of the interval.

getFilterRange(self)

 

Gets the interval containing all eigenvalues.

Returns

left: float
The left end of the interval.
right: float
The right end of the interval.

getKSP(self)

 

Gets the KSP object associated with the spectral transformation.

Returns

ksp: KSP
The linear solver object.

Notes

On output, the internal value of KSP can be NULL if the combination of eigenproblem type and selected transformation does not require to solve a linear system of equations.

getMatMode(self)

 

Gets a flag that indicates how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations.

Returns

mode: ST.MatMode enumerate
The mode flag.

getMatStructure(self)

 

Gets the internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the matrices.

Returns

structure: PETSc.Mat.Structure enumerate
The structure flag.

getMatrices(self)

 

Gets the matrices associated with the eigenvalue problem.

Returns

operators: tuple of Mat
The matrices associated with the eigensystem.

getOperator(self)

 

Returns a shell matrix that represents the operator of the spectral transformation.

Returns

op: Mat
Operator matrix.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all ST options in the database.

Returns

prefix: string
The prefix string set for this ST object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getPreconditionerMat(self)

 

Gets the matrix previously set by setPreconditionerMat().

Returns

P: Mat
The matrix that will be used in constructing the preconditioner.

getShift(self)

 

Gets the shift associated with the spectral transformation.

Returns

shift: scalar (possibly complex)
The value of the shift.

getTransform(self)

 

Gets the flag indicating whether the transformed matrices are computed or not.

Returns

flag: bool
This flag is intended for the case of polynomial eigenproblems solved via linearization. If this flag is False (default) the spectral transformation is applied to the linearization (handled by the eigensolver), otherwise it is applied to the original problem.

getType(self)

 

Gets the ST type of this object.

Returns

type: ST.Type enumerate
The spectral transformation currently being used.
Overrides: petsc4py.PETSc.Object.getType

restoreOperator(self, Mat op)

 

Restore the previously seized operator matrix.

Parameters

op: Mat
Operator matrix previously obtained with getOperator().

setCayleyAntishift(self, tau)

 

Sets the value of the anti-shift for the Cayley spectral transformation.

Parameters

tau: scalar (possibly complex)
The anti-shift.

Notes

In the generalized Cayley transform, the operator can be expressed as OP = inv(A - sigma B)*(A + tau B). This function sets the value of tau. Use setShift() for setting sigma.

setFilterDegree(self, deg)

 

Sets the degree of the filter polynomial.

Parameters

deg: int
The polynomial degree.

setFilterInterval(self, inta, intb)

 

Defines the interval containing the desired eigenvalues.

Parameters

inta: float
The left end of the interval.
intb: float
The right end of the interval.

Notes

The filter will be configured to emphasize eigenvalues contained in the given interval, and damp out eigenvalues outside it. If the interval is open, then the filter is low- or high-pass, otherwise it is mid-pass.

Common usage is to set the interval in EPS with EPS.setInterval().

The interval must be contained within the numerical range of the matrix, see ST.setFilterRange().

setFilterRange(self, left, right)

 

Defines the numerical range (or field of values) of the matrix, that is, the interval containing all eigenvalues.

Parameters

left: float
The left end of the interval.
right: float
The right end of the interval.

Notes

The filter will be most effective if the numerical range is tight, that is, left and right are good approximations to the leftmost and rightmost eigenvalues, respectively.

setFromOptions(self)

 

Sets ST options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setKSP(self, KSP ksp)

 

Sets the KSP object associated with the spectral transformation.

Parameters

ksp: KSP
The linear solver object.

setMatMode(self, mode)

 

Sets a flag to indicate how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations.

Parameters

mode: ST.MatMode enumerate
The mode flag.

Notes

By default (ST.MatMode.COPY), a copy of matrix A is made and then this copy is shifted explicitly, e.g. A <- (A - s B).

With ST.MatMode.INPLACE, the original matrix A is shifted at setUp() and unshifted at the end of the computations. With respect to the previous one, this mode avoids a copy of matrix A. However, a backdraw is that the recovered matrix might be slightly different from the original one (due to roundoff).

With ST.MatMode.SHELL, the solver works with an implicit shell matrix that represents the shifted matrix. This mode is the most efficient in creating the shifted matrix but it places serious limitations to the linear solves performed in each iteration of the eigensolver (typically, only iterative solvers with Jacobi preconditioning can be used).

In the case of generalized problems, in the two first modes the matrix A - s B has to be computed explicitly. The efficiency of this computation can be controlled with setMatStructure().

setMatStructure(self, structure)

 

Sets an internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the two matrices A and B constituting the generalized eigenvalue problem. This function has no effect in the case of standard eigenproblems.

Parameters

structure: PETSc.Mat.Structure enumerate
Either same, different, or a subset of the non-zero sparsity pattern.

Notes

By default, the sparsity patterns are assumed to be different. If the patterns are equal or a subset then it is recommended to set this attribute for efficiency reasons (in particular, for internal AXPY() matrix operations).

setMatrices(self, operators)

 

Sets the matrices associated with the eigenvalue problem.

Parameters

operators: sequence of Mat
The matrices associated with the eigensystem.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all ST options in the database.

Parameters

prefix: string
The prefix string to prepend to all ST option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setPreconditionerMat(self, Mat P=None)

 

Sets the matrix to be used to build the preconditioner.

Parameters

P: Mat, optional
The matrix that will be used in constructing the preconditioner.

setShift(self, shift)

 

Sets the shift associated with the spectral transformation.

Parameters

shift: scalar (possibly complex)
The value of the shift.

Notes

In some spectral transformations, changing the shift may have associated a lot of work, for example recomputing a factorization.

setTransform(self, flag=True)

 

Sets a flag to indicate whether the transformed matrices are computed or not.

Parameters

flag: bool, optional
This flag is intended for the case of polynomial eigenproblems solved via linearization. If this flag is False (default) the spectral transformation is applied to the linearization (handled by the eigensolver), otherwise it is applied to the original problem.

setType(self, st_type)

 

Builds ST for a particular spectral transformation.

Parameters

st_type: ST.Type enumerate
The spectral transformation to be used.

Notes

See ST.Type for available methods. The default is ST.Type.SHIFT with a zero shift. Normally, it is best to use setFromOptions() and then set the ST type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods.

view(self, Viewer viewer=None)

 

Prints the ST data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.ST.MatMode-class.html000066400000000000000000000217551454104675500241070ustar00rootroot00000000000000 slepc4py.SLEPc.ST.MatMode
Package slepc4py :: Module SLEPc :: Class ST :: Class MatMode
[hide private]
[frames] | no frames]

Class MatMode


ST matrix mode

  • COPY: A working copy of the matrix is created.
  • INPLACE: The operation is computed in-place.
  • SHELL: The matrix A-sigma*B is handled as an implicit matrix.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  COPY = 0
  INPLACE = 1
  SHELL = 2
  __qualname__ = 'STMatMode'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.ST.Type-class.html000066400000000000000000000251401454104675500234720ustar00rootroot00000000000000 slepc4py.SLEPc.ST.Type
Package slepc4py :: Module SLEPc :: Class ST :: Class Type
[hide private]
[frames] | no frames]

Class Type


ST types

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CAYLEY = 'cayley'
  FILTER = 'filter'
  PRECOND = 'precond'
  SHELL = 'shell'
  SHIFT = 'shift'
  SINVERT = 'sinvert'
  __qualname__ = 'STType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD-class.html000066400000000000000000004113721454104675500226660ustar00rootroot00000000000000 slepc4py.SLEPc.SVD
Package slepc4py :: Module SLEPc :: Class SVD
[hide private]
[frames] | no frames]

Class SVD


SVD
Nested Classes [hide private]
  Conv
SVD convergence test
  ConvergedReason
SVD convergence reasons
  ErrorType
SVD error type to assess accuracy of computed solutions
  ProblemType
SVD problem type
  Stop
SVD stopping test
  TRLanczosGBidiag
SVD TRLanczos bidiagonalization choices for the GSVD case
  Type
SVD types
  Which
SVD desired part of spectrum
Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
appendOptionsPrefix(self, prefix)
Appends to the prefix used for searching for all SVD options in the database.
 
cancelMonitor(self)
Clears all monitors for an SVD object.
 
computeError(self, int i, etype=None)
Computes the error (based on the residual norm) associated with the i-th singular triplet.
 
create(self, comm=None)
Creates the SVD object.
 
destroy(self)
Destroys the SVD object.
 
errorView(self, etype=None, Viewer viewer=None)
Displays the errors associated with the computed solution (as well as the eigenvalues).
 
getBV(self)
Obtain the basis vectors objects associated to the SVD object.
 
getConverged(self)
Gets the number of converged singular triplets.
 
getConvergedReason(self)
Gets the reason why the solve() iteration was stopped.
 
getConvergenceTest(self)
Return the method used to compute the error estimate used in the convergence test.
 
getCrossEPS(self)
Retrieve the eigensolver object (EPS) associated to the singular value solver.
 
getCrossExplicitMatrix(self)
Returns the flag indicating if A^T*A is built explicitly.
 
getCyclicEPS(self)
Retrieve the eigensolver object (EPS) associated to the singular value solver.
 
getCyclicExplicitMatrix(self)
Returns the flag indicating if H(A) = [ 0 A ; A^T 0 ] is built explicitly.
 
getDS(self)
Obtain the direct solver associated to the singular value solver.
 
getDimensions(self)
Gets the number of singular values to compute and the dimension of the subspace.
 
getImplicitTranspose(self)
Gets the mode used to handle the transpose of the matrix associated with the singular value problem.
 
getIterationNumber(self)
Gets the current iteration number.
 
getLanczosOneSide(self)
Gets if the variant of the Lanczos method to be used is one-sided or two-sided.
 
getMonitor(self)
Gets the list of monitor functions.
 
getOperators(self)
Gets the matrices associated with the singular value problem.
 
getOptionsPrefix(self)
Gets the prefix used for searching for all SVD options in the database.
 
getProblemType(self)
Gets the problem type from the SVD object.
 
getSignature(self)
Gets the signature matrix defining a hyperbolic singular value problem.
 
getSingularTriplet(self, int i, Vec U=None, Vec V=None)
Gets the i-th triplet of the singular value decomposition as computed by solve().
 
getStoppingTest(self)
Gets the stopping function.
 
getTRLanczosExplicitMatrix(self)
Returns the flag indicating if Z=[A;B] is built explicitly.
 
getTRLanczosGBidiag(self)
Returns bidiagonalization choice used in the GSVD TRLanczos solver.
 
getTRLanczosKSP(self)
Retrieve the linear solver object associated with the SVD solver.
 
getTRLanczosLocking(self)
Gets the locking flag used in the thick-restart Lanczos method.
 
getTRLanczosOneSide(self)
Gets if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided.
 
getTRLanczosRestart(self)
Gets the restart parameter used in the thick-restart Lanczos method.
 
getTolerances(self)
Gets the tolerance and maximum iteration count used by the default SVD convergence tests.
 
getTrackAll(self)
Returns the flag indicating whether all residual norms must be computed or not.
 
getType(self)
Gets the SVD type of this object.
 
getValue(self, int i)
Gets the i-th singular value as computed by solve().
 
getVectors(self, int i, Vec U, Vec V)
Gets the i-th left and right singular vectors as computed by solve().
 
getWhichSingularTriplets(self)
Returns which singular triplets are to be sought.
 
isGeneralized(self)
Tells whether the SVD object corresponds to a generalized singular value problem.
 
isHyperbolic(self)
Tells whether the SVD object corresponds to a hyperbolic singular value problem.
 
reset(self)
Resets the SVD object.
 
setBV(self, BV V, BV U=None)
Associates basis vectors objects to the SVD solver.
 
setConvergenceTest(self, conv)
Specifies how to compute the error estimate used in the convergence test.
 
setCrossEPS(self, EPS eps)
Associate an eigensolver object (EPS) to the singular value solver.
 
setCrossExplicitMatrix(self, flag=True)
Indicate if the eigensolver operator A^T*A must be computed explicitly.
 
setCyclicEPS(self, EPS eps)
Associate an eigensolver object (EPS) to the singular value solver.
 
setCyclicExplicitMatrix(self, flag=True)
Indicate if the eigensolver operator H(A) = [ 0 A ; A^T 0 ] must be computed explicitly.
 
setDS(self, DS ds)
Associates a direct solver object to the singular value solver.
 
setDimensions(self, nsv=None, ncv=None, mpd=None)
Sets the number of singular values to compute and the dimension of the subspace.
 
setFromOptions(self)
Sets SVD options from the options database.
 
setImplicitTranspose(self, mode)
Indicates how to handle the transpose of the matrix associated with the singular value problem.
 
setInitialSpaces(self, spaceright=None, spaceleft=None)
Sets the initial spaces from which the SVD solver starts to iterate.
 
setLanczosOneSide(self, flag=True)
Indicate if the variant of the Lanczos method to be used is one-sided or two-sided.
 
setMonitor(self, monitor, args=None, kargs=None)
Appends a monitor function to the list of monitors.
 
setOperator(self, Mat A, Mat B=None)
Sets the matrices associated with the singular value problem.
 
setOperators(self, Mat A, Mat B=None)
Sets the matrices associated with the singular value problem.
 
setOptionsPrefix(self, prefix)
Sets the prefix used for searching for all SVD options in the database.
 
setProblemType(self, problem_type)
Specifies the type of the singular value problem.
 
setSignature(self, Vec omega=None)
Sets the signature matrix defining a hyperbolic singular value problem.
 
setStoppingTest(self, stopping, args=None, kargs=None)
Sets a function to decide when to stop the outer iteration of the eigensolver.
 
setTRLanczosExplicitMatrix(self, flag=True)
Indicate if the matrix Z=[A;B] must be built explicitly.
 
setTRLanczosGBidiag(self, bidiag)
Sets the bidiagonalization choice to use in the GSVD TRLanczos solver.
 
setTRLanczosKSP(self, KSP ksp)
Associate a linear solver object to the SVD solver.
 
setTRLanczosLocking(self, lock)
Choose between locking and non-locking variants of the thick-restart Lanczos method.
 
setTRLanczosOneSide(self, flag=True)
Indicate if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided.
 
setTRLanczosRestart(self, keep)
Sets the restart parameter for the thick-restart Lanczos method, in particular the proportion of basis vectors that must be kept after restart.
 
setTolerances(self, tol=None, max_it=None)
Sets the tolerance and maximum iteration count used by the default SVD convergence tests.
 
setTrackAll(self, trackall)
Specifies if the solver must compute the residual of all approximate singular triplets or not.
 
setType(self, svd_type)
Selects the particular solver to be used in the SVD object.
 
setUp(self)
Sets up all the internal data structures necessary for the execution of the singular value solver.
 
setWhichSingularTriplets(self, which)
Specifies which singular triplets are to be sought.
 
solve(self)
Solves the singular value problem.
 
valuesView(self, Viewer viewer=None)
Displays the computed singular values in a viewer.
 
vectorsView(self, Viewer viewer=None)
Outputs computed singular vectors to a viewer.
 
view(self, Viewer viewer=None)
Prints the SVD data structure.

Inherited from petsc4py.PETSc.Object: __copy__, __deepcopy__, __eq__, __ge__, __gt__, __le__, __lt__, __ne__, __nonzero__, compose, decRef, getAttr, getClassId, getClassName, getComm, getDict, getName, getRefCount, getTabLevel, incRef, incrementTabLevel, query, setAttr, setName, setTabLevel, stateGet, stateIncrease, stateSet, viewFromOptions

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]
  ds
  max_it
  problem_type
  tol
  track_all
  transpose_mode
  which

Inherited from petsc4py.PETSc.Object: classid, comm, fortran, handle, klass, name, prefix, refcount, type

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

appendOptionsPrefix(self, prefix)

 

Appends to the prefix used for searching for all SVD options in the database.

Parameters

prefix: string
The prefix string to prepend to all SVD option requests.
Overrides: petsc4py.PETSc.Object.appendOptionsPrefix

computeError(self, int i, etype=None)

 

Computes the error (based on the residual norm) associated with the i-th singular triplet.

Parameters

i: int
Index of the solution to be considered.
etype: SVD.ErrorType enumerate
The error type to compute.

Returns

e: real
The relative error bound, computed in various ways from the residual norm sqrt(n1^2+n2^2) where n1 = ||A*v-sigma*u||_2, n2 = ||A^T*u-sigma*v||_2, sigma is the singular value, u and v are the left and right singular vectors.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged()).

create(self, comm=None)

 

Creates the SVD object.

Parameters

comm: Comm, optional
MPI communicator; if not provided, it defaults to all processes.

destroy(self)

 
Destroys the SVD object.
Overrides: petsc4py.PETSc.Object.destroy

errorView(self, etype=None, Viewer viewer=None)

 

Displays the errors associated with the computed solution (as well as the eigenvalues).

Parameters

etype: SVD.ErrorType enumerate, optional
The error type to compute.
viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

Notes

By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ASCII_INFO_DETAIL then a table with eigenvalues and corresponding errors is printed.

getBV(self)

 

Obtain the basis vectors objects associated to the SVD object.

Returns

V: BV
The basis vectors context for right singular vectors.
U: BV
The basis vectors context for left singular vectors.

getConverged(self)

 

Gets the number of converged singular triplets.

Returns

nconv: int
Number of converged singular triplets.

Notes

This function should be called after solve() has finished.

getConvergedReason(self)

 

Gets the reason why the solve() iteration was stopped.

Returns

reason: SVD.ConvergedReason enumerate
Negative value indicates diverged, positive value converged.

getConvergenceTest(self)

 

Return the method used to compute the error estimate used in the convergence test.

Returns

conv: SVD.Conv
The method used to compute the error estimate used in the convergence test.

getCrossEPS(self)

 

Retrieve the eigensolver object (EPS) associated to the singular value solver.

Returns

eps: EPS
The eigensolver object.

getCrossExplicitMatrix(self)

 

Returns the flag indicating if A^T*A is built explicitly.

Returns

flag: bool
True if A^T*A is built explicitly.

getCyclicEPS(self)

 

Retrieve the eigensolver object (EPS) associated to the singular value solver.

Returns

eps: EPS
The eigensolver object.

getCyclicExplicitMatrix(self)

 

Returns the flag indicating if H(A) = [ 0 A ; A^T 0 ] is built explicitly.

Returns

flag: bool
True if H(A) is built explicitly.

getDS(self)

 

Obtain the direct solver associated to the singular value solver.

Returns

ds: DS
The direct solver context.

getDimensions(self)

 

Gets the number of singular values to compute and the dimension of the subspace.

Returns

nsv: int
Number of singular values to compute.
ncv: int
Maximum dimension of the subspace to be used by the solver.
mpd: int
Maximum dimension allowed for the projected problem.

getImplicitTranspose(self)

 

Gets the mode used to handle the transpose of the matrix associated with the singular value problem.

Returns

impl: bool
How to handle the transpose (implicitly or not).

getIterationNumber(self)

 

Gets the current iteration number. If the call to solve() is complete, then it returns the number of iterations carried out by the solution method.

Returns

its: int
Iteration number.

getLanczosOneSide(self)

 

Gets if the variant of the Lanczos method to be used is one-sided or two-sided.

Returns

delayed: bool
True if the method is one-sided.

getOperators(self)

 

Gets the matrices associated with the singular value problem.

Returns

A: Mat
The matrix associated with the singular value problem.
B: Mat
The second matrix in the case of GSVD.

getOptionsPrefix(self)

 

Gets the prefix used for searching for all SVD options in the database.

Returns

prefix: string
The prefix string set for this SVD object.
Overrides: petsc4py.PETSc.Object.getOptionsPrefix

getProblemType(self)

 

Gets the problem type from the SVD object.

Returns

problem_type: SVD.ProblemType enumerate
The problem type that was previously set.

getSignature(self)

 

Gets the signature matrix defining a hyperbolic singular value problem.

Returns

omega: Vec
A vector containing the diagonal elements of the signature matrix.

getSingularTriplet(self, int i, Vec U=None, Vec V=None)

 

Gets the i-th triplet of the singular value decomposition as computed by solve(). The solution consists of the singular value and its left and right singular vectors.

Parameters

i: int
Index of the solution to be obtained.
U: Vec
Placeholder for the returned left singular vector.
V: Vec
Placeholder for the returned right singular vector.

Returns

s: float
The computed singular value.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged(). Singular triplets are indexed according to the ordering criterion established with setWhichSingularTriplets().

getTRLanczosExplicitMatrix(self)

 

Returns the flag indicating if Z=[A;B] is built explicitly.

Returns

flag: bool
True if Z=[A;B] is built explicitly.

getTRLanczosGBidiag(self)

 

Returns bidiagonalization choice used in the GSVD TRLanczos solver.

Returns

bidiag: SVD.TRLanczosGBidiag enumerate
The bidiagonalization choice.

getTRLanczosKSP(self)

 

Retrieve the linear solver object associated with the SVD solver.

Returns

ksp: KSP
The linear solver object.

getTRLanczosLocking(self)

 

Gets the locking flag used in the thick-restart Lanczos method.

Returns

lock: bool
The locking flag.

getTRLanczosOneSide(self)

 

Gets if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided.

Returns

delayed: bool
True if the method is one-sided.

getTRLanczosRestart(self)

 

Gets the restart parameter used in the thick-restart Lanczos method.

Returns

keep: float
The number of vectors to be kept at restart.

getTolerances(self)

 

Gets the tolerance and maximum iteration count used by the default SVD convergence tests.

Returns

tol: float
The convergence tolerance.
max_it: int
The maximum number of iterations

getTrackAll(self)

 

Returns the flag indicating whether all residual norms must be computed or not.

Returns

trackall: bool
Whether the solver compute all residuals or not.

getType(self)

 

Gets the SVD type of this object.

Returns

type: SVD.Type enumerate
The solver currently being used.
Overrides: petsc4py.PETSc.Object.getType

getValue(self, int i)

 

Gets the i-th singular value as computed by solve().

Parameters

i: int
Index of the solution to be obtained.

Returns

s: float
The computed singular value.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged(). Singular triplets are indexed according to the ordering criterion established with setWhichSingularTriplets().

getVectors(self, int i, Vec U, Vec V)

 

Gets the i-th left and right singular vectors as computed by solve().

Parameters

i: int
Index of the solution to be obtained.
U: Vec
Placeholder for the returned left singular vector.
V: Vec
Placeholder for the returned right singular vector.

Notes

The index i should be a value between 0 and nconv-1 (see getConverged(). Singular triplets are indexed according to the ordering criterion established with setWhichSingularTriplets().

getWhichSingularTriplets(self)

 

Returns which singular triplets are to be sought.

Returns

which: SVD.Which enumerate
The singular values to be sought (either largest or smallest).

isGeneralized(self)

 

Tells whether the SVD object corresponds to a generalized singular value problem.

Returns

flag: bool
True if two matrices were set with setOperators().

isHyperbolic(self)

 

Tells whether the SVD object corresponds to a hyperbolic singular value problem.

Returns

flag: bool
True if the problem was specified as hyperbolic.

setBV(self, BV V, BV U=None)

 

Associates basis vectors objects to the SVD solver.

Parameters

V: BV
The basis vectors context for right singular vectors.
U: BV
The basis vectors context for left singular vectors.

setConvergenceTest(self, conv)

 

Specifies how to compute the error estimate used in the convergence test.

Parameters

conv: SVD.Conv
The method used to compute the error estimate used in the convergence test.

setCrossEPS(self, EPS eps)

 

Associate an eigensolver object (EPS) to the singular value solver.

Parameters

eps: EPS
The eigensolver object.

setCrossExplicitMatrix(self, flag=True)

 

Indicate if the eigensolver operator A^T*A must be computed explicitly.

Parameters

flag: bool
True if A^T*A is built explicitly.

setCyclicEPS(self, EPS eps)

 

Associate an eigensolver object (EPS) to the singular value solver.

Parameters

eps: EPS
The eigensolver object.

setCyclicExplicitMatrix(self, flag=True)

 

Indicate if the eigensolver operator H(A) = [ 0 A ; A^T 0 ] must be computed explicitly.

Parameters

flag: bool
True if H(A) is built explicitly.

setDS(self, DS ds)

 

Associates a direct solver object to the singular value solver.

Parameters

ds: DS
The direct solver context.

setDimensions(self, nsv=None, ncv=None, mpd=None)

 

Sets the number of singular values to compute and the dimension of the subspace.

Parameters

nsv: int, optional
Number of singular values to compute.
ncv: int, optional
Maximum dimension of the subspace to be used by the solver.
mpd: int, optional
Maximum dimension allowed for the projected problem.

Notes

Use DECIDE for ncv and mpd to assign a reasonably good value, which is dependent on the solution method.

The parameters ncv and mpd are intimately related, so that the user is advised to set one of them at most. Normal usage is the following:

  • In cases where nsv is small, the user sets ncv (a reasonable default is 2 * nsv).
  • In cases where nsv is large, the user sets mpd.

The value of ncv should always be between nsv and (nsv + mpd), typically ncv = nsv + mpd. If nsv is not too large, mpd = nsv is a reasonable choice, otherwise a smaller value should be used.

setFromOptions(self)

 

Sets SVD options from the options database. This routine must be called before setUp() if the user is to be allowed to set the solver type.

Notes

To see all options, run your program with the -help option.

Overrides: petsc4py.PETSc.Object.setFromOptions

setImplicitTranspose(self, mode)

 

Indicates how to handle the transpose of the matrix associated with the singular value problem.

Parameters

impl: bool
How to handle the transpose (implicitly or not).

Notes

By default, the transpose of the matrix is explicitly built (if the matrix has defined the MatTranspose operation).

If this flag is set to true, the solver does not build the transpose, but handles it implicitly via MatMultTranspose().

setInitialSpaces(self, spaceright=None, spaceleft=None)

 

Sets the initial spaces from which the SVD solver starts to iterate.

Parameters

spaceright: sequence of Vec
The right initial space.
spaceleft: sequence of Vec
The left initial space.

setLanczosOneSide(self, flag=True)

 

Indicate if the variant of the Lanczos method to be used is one-sided or two-sided.

Parameters

flag: bool
True if the method is one-sided.

Notes

By default, a two-sided variant is selected, which is sometimes slightly more robust. However, the one-sided variant is faster because it avoids the orthogonalization associated to left singular vectors. It also saves the memory required for storing such vectors.

setOperator(self, Mat A, Mat B=None)

 

Sets the matrices associated with the singular value problem.

Parameters

A: Mat
The matrix associated with the singular value problem.
B: Mat, optional
The second matrix in the case of GSVD; if not provided, a usual SVD is assumed.

setOperators(self, Mat A, Mat B=None)

 

Sets the matrices associated with the singular value problem.

Parameters

A: Mat

The matrix associated with the singular value problem.

B: Mat, optional

The second matrix in the case of GSVD; if not provided, a usual SVD is assumed.

setOptionsPrefix(self, prefix)

 

Sets the prefix used for searching for all SVD options in the database.

Parameters

prefix: string
The prefix string to prepend to all SVD option requests.

Notes

A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen.

For example, to distinguish between the runtime options for two different SVD contexts, one could call:

S1.setOptionsPrefix("svd1_")
S2.setOptionsPrefix("svd2_")
Overrides: petsc4py.PETSc.Object.setOptionsPrefix

setProblemType(self, problem_type)

 

Specifies the type of the singular value problem.

Parameters

problem_type: SVD.ProblemType enumerate
The problem type to be set.

setSignature(self, Vec omega=None)

 

Sets the signature matrix defining a hyperbolic singular value problem.

Parameters

omega: Vec, optional
A vector containing the diagonal elements of the signature matrix.

setTRLanczosExplicitMatrix(self, flag=True)

 

Indicate if the matrix Z=[A;B] must be built explicitly.

Parameters

flag: bool
True if Z=[A;B] is built explicitly.

setTRLanczosGBidiag(self, bidiag)

 

Sets the bidiagonalization choice to use in the GSVD TRLanczos solver.

Parameters

bidiag: SVD.TRLanczosGBidiag enumerate
The bidiagonalization choice.

setTRLanczosKSP(self, KSP ksp)

 

Associate a linear solver object to the SVD solver.

Parameters

ksp: KSP
The linear solver object.

setTRLanczosLocking(self, lock)

 

Choose between locking and non-locking variants of the thick-restart Lanczos method.

Parameters

lock: bool
True if the locking variant must be selected.

Notes

The default is to lock converged singular triplets when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant).

setTRLanczosOneSide(self, flag=True)

 

Indicate if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided.

Parameters

flag: bool
True if the method is one-sided.

Notes

By default, a two-sided variant is selected, which is sometimes slightly more robust. However, the one-sided variant is faster because it avoids the orthogonalization associated to left singular vectors.

setTRLanczosRestart(self, keep)

 

Sets the restart parameter for the thick-restart Lanczos method, in particular the proportion of basis vectors that must be kept after restart.

Parameters

keep: float
The number of vectors to be kept at restart.

Notes

Allowed values are in the range [0.1,0.9]. The default is 0.5.

setTolerances(self, tol=None, max_it=None)

 

Sets the tolerance and maximum iteration count used by the default SVD convergence tests.

Parameters

tol: float, optional
The convergence tolerance.
max_it: int, optional
The maximum number of iterations

Notes

Use DECIDE for max_it to assign a reasonably good value, which is dependent on the solution method.

setTrackAll(self, trackall)

 

Specifies if the solver must compute the residual of all approximate singular triplets or not.

Parameters

trackall: bool
Whether compute all residuals or not.

setType(self, svd_type)

 

Selects the particular solver to be used in the SVD object.

Parameters

svd_type: SVD.Type enumerate
The solver to be used.

Notes

See SVD.Type for available methods. The default is CROSS. Normally, it is best to use setFromOptions() and then set the SVD type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods.

setUp(self)

 

Sets up all the internal data structures necessary for the execution of the singular value solver.

Notes

This function need not be called explicitly in most cases, since solve() calls it. It can be useful when one wants to measure the set-up time separately from the solve time.

setWhichSingularTriplets(self, which)

 

Specifies which singular triplets are to be sought.

Parameters

which: SVD.Which enumerate
The singular values to be sought (either largest or smallest).

valuesView(self, Viewer viewer=None)

 

Displays the computed singular values in a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

vectorsView(self, Viewer viewer=None)

 

Outputs computed singular vectors to a viewer.

Parameters

viewer: Viewer, optional.
Visualization context; if not provided, the standard output is used.

view(self, Viewer viewer=None)

 

Prints the SVD data structure.

Parameters

viewer: Viewer, optional
Visualization context; if not provided, the standard output is used.
Overrides: petsc4py.PETSc.Object.view

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.Conv-class.html000066400000000000000000000232061454104675500235650ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.Conv
Package slepc4py :: Module SLEPc :: Class SVD :: Class Conv
[hide private]
[frames] | no frames]

Class Conv


SVD convergence test

  • ABS: Absolute convergence test.
  • REL: Convergence test relative to the singular value.
  • NORM: Convergence test relative to the matrix norms.
  • MAXIT: No convergence until maximum number of iterations has been reached.
  • USER: User-defined convergence test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABS = 0
  MAXIT = 3
  NORM = 2
  REL = 1
  USER = 4
  __qualname__ = 'SVDConv'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.ConvergedReason-class.html000066400000000000000000000253451454104675500257520ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.ConvergedReason
Package slepc4py :: Module SLEPc :: Class SVD :: Class ConvergedReason
[hide private]
[frames] | no frames]

Class ConvergedReason


SVD convergence reasons

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CONVERGED_ITERATING = 0
  CONVERGED_MAXIT = 3
  CONVERGED_TOL = 1
  CONVERGED_USER = 2
  DIVERGED_BREAKDOWN = -2
  DIVERGED_ITS = -1
  ITERATING = 0
  __qualname__ = 'SVDConvergedReason'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.ErrorType-class.html000066400000000000000000000217251454104675500246170ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.ErrorType
Package slepc4py :: Module SLEPc :: Class SVD :: Class ErrorType
[hide private]
[frames] | no frames]

Class ErrorType


SVD error type to assess accuracy of computed solutions

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  ABSOLUTE = 0
  NORM = 2
  RELATIVE = 1
  __qualname__ = 'SVDErrorType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.ProblemType-class.html000066400000000000000000000220311454104675500251150ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.ProblemType
Package slepc4py :: Module SLEPc :: Class SVD :: Class ProblemType
[hide private]
[frames] | no frames]

Class ProblemType


SVD problem type

  • STANDARD: Standard SVD.
  • GENERALIZED: Generalized singular value decomposition (GSVD).
  • HYPERBOLIC : Hyperbolic singular value decomposition (HSVD).
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  GENERALIZED = 2
  HYPERBOLIC = 3
  STANDARD = 1
  __qualname__ = 'SVDProblemType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.Stop-class.html000066400000000000000000000207421454104675500236070ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.Stop
Package slepc4py :: Module SLEPc :: Class SVD :: Class Stop
[hide private]
[frames] | no frames]

Class Stop


SVD stopping test

  • BASIC: Default stopping test.
  • USER: User-defined stopping test.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  BASIC = 0
  USER = 1
  __qualname__ = 'SVDStop'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html000066400000000000000000000221601454104675500257440ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.TRLanczosGBidiag
Package slepc4py :: Module SLEPc :: Class SVD :: Class TRLanczosGBidiag
[hide private]
[frames] | no frames]

Class TRLanczosGBidiag


SVD TRLanczos bidiagonalization choices for the GSVD case

  • SINGLE: Single bidiagonalization (Qa).
  • UPPER: Joint bidiagonalization, both Qa and Qb in upper bidiagonal form.
  • LOWER: Joint bidiagonalization, Qa lower bidiagonal, Qb upper bidiagonal.
Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  LOWER = 2
  SINGLE = 0
  UPPER = 1
  __qualname__ = 'SVDTRLanczosGBidiag'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.Type-class.html000066400000000000000000000313461454104675500236050ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.Type
Package slepc4py :: Module SLEPc :: Class SVD :: Class Type
[hide private]
[frames] | no frames]

Class Type


SVD types

  • CROSS: Eigenproblem with the cross-product matrix.
  • CYCLIC: Eigenproblem with the cyclic matrix.
  • LAPACK: Wrappers to dense SVD solvers in Lapack.
  • LANCZOS: Lanczos.
  • TRLANCZOS: Thick-restart Lanczos.
  • RANDOMIZED: Iterative RSVD for low-rank matrices.

Wrappers to external SVD solvers (should be enabled during installation of SLEPc)

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  CROSS = 'cross'
  CYCLIC = 'cyclic'
  ELEMENTAL = 'elemental'
  KSVD = 'ksvd'
  LANCZOS = 'lanczos'
  LAPACK = 'lapack'
  PRIMME = 'primme'
  RANDOMIZED = 'randomized'
  SCALAPACK = 'scalapack'
  TRLANCZOS = 'trlanczos'
  __qualname__ = 'SVDType'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.SVD.Which-class.html000066400000000000000000000210231454104675500237150ustar00rootroot00000000000000 slepc4py.SLEPc.SVD.Which
Package slepc4py :: Module SLEPc :: Class SVD :: Class Which
[hide private]
[frames] | no frames]

Class Which


SVD desired part of spectrum

Instance Methods [hide private]

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  LARGEST = 0
  SMALLEST = 1
  __qualname__ = 'SVDWhich'
Properties [hide private]

Inherited from object: __class__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc.Sys-class.html000066400000000000000000000267121454104675500230100ustar00rootroot00000000000000 slepc4py.SLEPc.Sys
Package slepc4py :: Module SLEPc :: Class Sys
[hide private]
[frames] | no frames]

Class Sys


Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)
 
getVersion(type cls, devel=False, date=False, author=False)
 
getVersionInfo(type cls)
 
hasExternalPackage(type cls, package)
 
isFinalized(type cls)
 
isInitialized(type cls)

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

slepc4py-3.19.2/docs/apiref/slepc4py.SLEPc._p_mem-class.html000066400000000000000000000207401454104675500234610ustar00rootroot00000000000000 slepc4py.SLEPc._p_mem
Package slepc4py :: Module SLEPc :: Class _p_mem
[hide private]
[frames] | no frames]

Class _p_mem


Instance Methods [hide private]
a new object with type S, a subtype of T
__new__(S, ...)

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__new__(S, ...)

 
Returns: a new object with type S, a subtype of T
Overrides: object.__new__

slepc4py-3.19.2/docs/apiref/slepc4py.lib-module.html000066400000000000000000000174631454104675500222560ustar00rootroot00000000000000 slepc4py.lib
Package slepc4py :: Package lib
[hide private]
[frames] | no frames]

Package lib

Extension modules for different SLEPc configurations.

SLEPc can be configured with different options (eg. debug/optimized, single/double precisionm, C/C++ compilers, external packages). Each configuration variant is associated to a name, frequently available as an environmental variable named PETSC_ARCH.

This package is a holds all the available variants of the SLEPc extension module built against specific SLEPc configurations. It also provides a convenience function using of the builtin imp module for easily importing any of the available extension modules depending on the value of a user-provided configuration name, the PETSC_ARCH environmental variable, or a configuration file.

Functions [hide private]
 
ImportSLEPc(arch=None)
Import the SLEPc extension module for a given configuration name.
 
getPathArchSLEPc(arch=None)
Undocumented.
Variables [hide private]
  __package__ = 'slepc4py.lib'
slepc4py-3.19.2/docs/apiref/toc-everything.html000066400000000000000000000266341454104675500214320ustar00rootroot00000000000000 Everything

Everything


All Classes

slepc4py.SLEPc.BV
slepc4py.SLEPc.BV.BlockType
slepc4py.SLEPc.BV.MatMultType
slepc4py.SLEPc.BV.OrthogType
slepc4py.SLEPc.BV.RefineType
slepc4py.SLEPc.BV.Type
slepc4py.SLEPc.BVSVDMethod
slepc4py.SLEPc.DS
slepc4py.SLEPc.DS.MatType
slepc4py.SLEPc.DS.ParallelType
slepc4py.SLEPc.DS.StateType
slepc4py.SLEPc.DS.Type
slepc4py.SLEPc.EPS
slepc4py.SLEPc.EPS.Balance
slepc4py.SLEPc.EPS.CISSExtraction
slepc4py.SLEPc.EPS.CISSQuadRule
slepc4py.SLEPc.EPS.Conv
slepc4py.SLEPc.EPS.ConvergedReason
slepc4py.SLEPc.EPS.ErrorType
slepc4py.SLEPc.EPS.Extraction
slepc4py.SLEPc.EPS.LanczosReorthogType
slepc4py.SLEPc.EPS.PowerShiftType
slepc4py.SLEPc.EPS.ProblemType
slepc4py.SLEPc.EPS.Stop
slepc4py.SLEPc.EPS.Type
slepc4py.SLEPc.EPS.Which
slepc4py.SLEPc.FN
slepc4py.SLEPc.FN.CombineType
slepc4py.SLEPc.FN.ParallelType
slepc4py.SLEPc.FN.Type
slepc4py.SLEPc.MFN
slepc4py.SLEPc.MFN.ConvergedReason
slepc4py.SLEPc.MFN.Type
slepc4py.SLEPc.NEP
slepc4py.SLEPc.NEP.CISSExtraction
slepc4py.SLEPc.NEP.Conv
slepc4py.SLEPc.NEP.ConvergedReason
slepc4py.SLEPc.NEP.ErrorType
slepc4py.SLEPc.NEP.ProblemType
slepc4py.SLEPc.NEP.Refine
slepc4py.SLEPc.NEP.RefineScheme
slepc4py.SLEPc.NEP.Stop
slepc4py.SLEPc.NEP.Type
slepc4py.SLEPc.NEP.Which
slepc4py.SLEPc.PEP
slepc4py.SLEPc.PEP.Basis
slepc4py.SLEPc.PEP.CISSExtraction
slepc4py.SLEPc.PEP.Conv
slepc4py.SLEPc.PEP.ConvergedReason
slepc4py.SLEPc.PEP.ErrorType
slepc4py.SLEPc.PEP.Extract
slepc4py.SLEPc.PEP.JDProjection
slepc4py.SLEPc.PEP.ProblemType
slepc4py.SLEPc.PEP.Refine
slepc4py.SLEPc.PEP.RefineScheme
slepc4py.SLEPc.PEP.Scale
slepc4py.SLEPc.PEP.Stop
slepc4py.SLEPc.PEP.Type
slepc4py.SLEPc.PEP.Which
slepc4py.SLEPc.RG
slepc4py.SLEPc.RG.QuadRule
slepc4py.SLEPc.RG.Type
slepc4py.SLEPc.ST
slepc4py.SLEPc.ST.MatMode
slepc4py.SLEPc.ST.Type
slepc4py.SLEPc.SVD
slepc4py.SLEPc.SVD.Conv
slepc4py.SLEPc.SVD.ConvergedReason
slepc4py.SLEPc.SVD.ErrorType
slepc4py.SLEPc.SVD.ProblemType
slepc4py.SLEPc.SVD.Stop
slepc4py.SLEPc.SVD.TRLanczosGBidiag
slepc4py.SLEPc.SVD.Type
slepc4py.SLEPc.SVD.Which
slepc4py.SLEPc.Sys

All Functions

slepc4py.get_include
slepc4py.init
slepc4py.lib.ImportSLEPc
slepc4py.lib.getPathArchSLEPc

All Variables

slepc4py.SLEPc.COMM_NULL
slepc4py.SLEPc.COMM_SELF
slepc4py.SLEPc.COMM_WORLD
slepc4py.SLEPc.DECIDE
slepc4py.SLEPc.DEFAULT
slepc4py.SLEPc.DETERMINE
slepc4py.SLEPc.__arch__
slepc4py.SLEPc.__package__
slepc4py.SLEPc.__pyx_capi__
slepc4py.__credits__
slepc4py.__package__
slepc4py.lib.__package__

[hide private] slepc4py-3.19.2/docs/apiref/toc-slepc4py-module.html000066400000000000000000000025611454104675500222650ustar00rootroot00000000000000 slepc4py

Module slepc4py


Functions

get_include
init

Variables

__credits__
__package__

[hide private] slepc4py-3.19.2/docs/apiref/toc-slepc4py.SLEPc-module.html000066400000000000000000000063261454104675500231750ustar00rootroot00000000000000 SLEPc

Module SLEPc


Classes

BV
BVSVDMethod
DS
EPS
FN
MFN
NEP
PEP
RG
ST
SVD
Sys

Functions

Variables

COMM_NULL
COMM_SELF
COMM_WORLD
DECIDE
DEFAULT
DETERMINE
__arch__
__package__
__pyx_capi__

[hide private] slepc4py-3.19.2/docs/apiref/toc-slepc4py.lib-module.html000066400000000000000000000024561454104675500230350ustar00rootroot00000000000000 lib

Module lib


Functions

ImportSLEPc
getPathArchSLEPc

Variables

__package__

[hide private] slepc4py-3.19.2/docs/apiref/toc.html000066400000000000000000000031211454104675500172320ustar00rootroot00000000000000 Table of Contents

Table of Contents


Everything

Modules

slepc4py
slepc4py.SLEPc
slepc4py.lib

[hide private] slepc4py-3.19.2/docs/index.html000066400000000000000000000261131454104675500163140ustar00rootroot00000000000000 SLEPc for Python

SLEPc for Python

Author: Lisandro Dalcin
Contact: dalcinl@gmail.com

Online Documentation

Discussion and Support

Downloads and Development

Citations

If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project.

Acknowledgments

This project was partially supported by the Extreme Computing Research Center (ECRC), Division of Computer, Electrical, and Mathematical Sciences & Engineering (CEMSE), King Abdullah University of Science and Technology (KAUST).

slepc4py-3.19.2/docs/index.rst000066400000000000000000000033611454104675500161600ustar00rootroot00000000000000================ SLEPc for Python ================ :Author: Lisandro Dalcin :Contact: dalcinl@gmail.com Online Documentation -------------------- + `User Manual (HTML)`_ (generated with Sphinx_). + `User Manual (PDF)`_ (generated with Sphinx_). + `API Reference`_ (generated with Epydoc_). .. _User Manual (HTML): usrman/index.html .. _User Manual (PDF): slepc4py.pdf .. _API Reference: apiref/index.html .. _Sphinx: https://www.sphinx-doc.org/ .. _Epydoc: https://epydoc.sourceforge.net/ Discussion and Support ---------------------- + Mailing Lists: petsc-users@mcs.anl.gov, slepc-maint@upv.es Downloads and Development ------------------------- + Issue Tracker: https://gitlab.com/slepc/slepc/-/issues + Git Repository: https://gitlab.com/slepc/slepc.git + The source code is in ``src/binding/slepc4py`` + Previous source releases: https://pypi.org/project/slepc4py/ Citations --------- If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. http://dx.doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman, and V. Vidal, *SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. http://dx.doi.org/10.1145/1089014.1089019 Acknowledgments --------------- This project was partially supported by the Extreme Computing Research Center (ECRC), Division of Computer, Electrical, and Mathematical Sciences & Engineering (CEMSE), King Abdullah University of Science and Technology (KAUST). slepc4py-3.19.2/docs/slepc4py.1000066400000000000000000000561461454104675500161550ustar00rootroot00000000000000.\" Man page generated from reStructuredText. . .TH "SLEPC4PY" "1" "Sep 05, 2023" "3.1" "SLEPc for Python" .SH NAME slepc4py \- SLEPc for Python . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .INDENT 0.0 .TP .B Authors Lisandro Dalcin, Jose E. Roman .TP .B Contact \fI\%dalcinl@gmail.com\fP, \fI\%jroman@dsic.upv.es\fP .TP .B Web Site \fI\%https://gitlab.com/slepc/slepc\fP .TP .B Date Sep 05, 2023 .UNINDENT .SS Abstract .sp This document describes \fI\%slepc4py\fP, a \fI\%Python\fP port to the \fI\%SLEPc\fP libraries. .sp \fI\%SLEPc\fP is a software package for the parallel solution of large\-scale eigenvalue problems. It can be used for computing eigenvalues and eigenvectors of large, sparse matrices, or matrix pairs, and also for computing singular values and vectors of a rectangular matrix. .sp \fI\%SLEPc\fP relies on \fI\%PETSc\fP for basic functionality such as the representation of matrices and vectors, and the solution of linear systems of equations. Thus, \fI\%slepc4py\fP must be used together with its companion \fI\%petsc4py\fP\&. .SH CONTENTS .SS Overview .sp \fISLEPc for Python\fP (slepc4py) is a Python package that provides convenient access to the functionality of SLEPc. .sp SLEPc [1], [2] implements algorithms and tools for the numerical solution of large, sparse eigenvalue problems on parallel computers. It can be used for linear eigenvalue problems in either standard or generalized form, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve nonlinear eigenvalue problems (polynomial or general). Additionally, SLEPc provides solvers for the computation of the action of a matrix function on a vector. .sp SLEPc is intended for computing a subset of the spectrum of a matrix (or matrix pair). One can for instance approximate the largest magnitude eigenvalues, or the smallest ones, or even those eigenvalues located near a given region of the complex plane. Interior eigenvalues are harder to compute, so SLEPc provides different methodologies. One such method is to use a spectral transformation. Cheaper alternatives are also available. .IP [1] 5 J. E. Roman, C. Campos, L. Dalcin, E. Romero, A. Tomas. SLEPc Users Manual. DSIC\-II/24/02 \- Revision 3.19 D. Sistemas Informaticos y Computacion, Universitat Politecnica de Valencia. 2023. .IP [2] 5 Vicente Hernandez, Jose E. Roman and Vicente Vidal. SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems, ACM Trans. Math. Softw. 31(3), pp. 351\-362, 2005. .SS Features .sp Currently, the following types of eigenproblems can be addressed: .INDENT 0.0 .IP \(bu 2 Standard eigenvalue problem, \fIAx=kx\fP, either for Hermitian or non\-Hermitian matrices. .IP \(bu 2 Generalized eigenvalue problem, \fIAx=kBx\fP, either Hermitian positive\-definite or not. .IP \(bu 2 Partial singular value decomposition of a rectangular matrix, \fIAu=sv\fP\&. .IP \(bu 2 Polynomial eigenvalue problem, \fIP(k)x=0\fP\&. .IP \(bu 2 Nonlinear eigenvalue problem, \fIT(k)x=0\fP\&. .IP \(bu 2 Computing the action of a matrix function on a vector, \fIw=f(alpha A)v\fP\&. .UNINDENT .sp For the linear eigenvalue problem, the following methods are available: .INDENT 0.0 .IP \(bu 2 Krylov eigensolvers, particularly Krylov\-Schur, Arnoldi, and Lanczos. .IP \(bu 2 Davidson\-type eigensolvers, including Generalized Davidson and Jacobi\-Davidson. .IP \(bu 2 Subspace iteration and single vector iterations (inverse iteration, RQI). .IP \(bu 2 Conjugate gradient for the minimization of the Rayleigh quotient. .IP \(bu 2 A contour integral solver. .UNINDENT .sp For singular value computations, the following alternatives can be used: .INDENT 0.0 .IP \(bu 2 Use an eigensolver via the cross\-product matrix \fIA’A\fP or the cyclic matrix \fI[0 A; A’ 0]\fP\&. .IP \(bu 2 Explicitly restarted Lanczos bidiagonalization. .IP \(bu 2 Implicitly restarted Lanczos bidiagonalization (thick\-restart Lanczos). .UNINDENT .sp For polynomial eigenvalue problems, the following methods are available: .INDENT 0.0 .IP \(bu 2 Use an eigensolver to solve the generalized eigenvalue problem obtained after linearization. .IP \(bu 2 TOAR and Q\-Arnoldi, memory efficient variants of Arnoldi for polynomial eigenproblems. .UNINDENT .sp For general nonlinear eigenvalue problems, the following methods can be used: .INDENT 0.0 .IP \(bu 2 Solve a polynomial eigenproblem obtained via polynomial interpolation. .IP \(bu 2 Rational interpolation and linearization (NLEIGS). .IP \(bu 2 Newton\-type methods such as SLP or RII. .UNINDENT .sp Computation of interior eigenvalues is supported by means of the following methodologies: .INDENT 0.0 .IP \(bu 2 Spectral transformations, such as shift\-and\-invert. This technique implicitly uses the inverse of the shifted matrix \fI(A\-tI)\fP in order to compute eigenvalues closest to a given target value, \fIt\fP\&. .IP \(bu 2 Harmonic extraction, a cheap alternative to shift\-and\-invert that also tries to approximate eigenvalues closest to a target, \fIt\fP, but without requiring a matrix inversion. .UNINDENT .sp Other remarkable features include: .INDENT 0.0 .IP \(bu 2 High computational efficiency, by using NumPy and SLEPc under the hood. .IP \(bu 2 Data\-structure neutral implementation, by using efficient sparse matrix storage provided by PETSc. Implicit matrix representation is also available by providing basic operations such as matrix\-vector products as user\-defined Python functions. .IP \(bu 2 Run\-time flexibility, by specifying numerous setting at the command line. .IP \(bu 2 Ability to do the computation in parallel. .UNINDENT .SS Components .sp SLEPc provides the following components, which are mirrored by slepc4py for its use from Python. The first five components are solvers for different classes of problems, while the rest can be considered auxiliary object. .INDENT 0.0 .TP .B EPS The Eigenvalue Problem Solver is the component that provides all the functionality necessary to define and solve an eigenproblem. It provides mechanisms for completely specifying the problem: the problem type (e.g. standard symmetric), number of eigenvalues to compute, part of the spectrum of interest. Once the problem has been defined, a collection of solvers can be used to compute the required solutions. The behaviour of the solvers can be tuned by means of a few parameters, such as the maximum dimension of the subspace to be used during the computation. .TP .B SVD This component is the analog of EPS for the case of Singular Value Decompositions. The user provides a rectangular matrix and specifies how many singular values and vectors are to be computed, whether the largest or smallest ones, as well as some other parameters for fine tuning the computation. Different solvers are available, as in the case of EPS. .TP .B PEP This component is the analog of EPS for the case of Polynomial Eigenvalue Problems. The user provides the coefficient matrices of the polynomial. Several parameters can be specified, as in the case of EPS. It is also possible to indicate whether the problem belongs to a special type, e.g., symmetric or gyroscopic. .TP .B NEP This component covers the case of general nonlinear eigenproblems, T(lambda)x=0. The user provides the parameter\-dependent matrix T via the split form or by means of callback functions. .TP .B MFN This component provides the functionality for computing the action of a matrix function on a vector. Given a matrix A and a vector b, the call MFNSolve(mfn,b,x) computes x=f(A)b, where f is a function such as the exponential. .TP .B ST The Spectral Transformation is a component that provides convenient implementations of common spectral transformations. These are simple transformations that map eigenvalues to different positions, in such a way that convergence to wanted eigenvalues is enhanced. The most common spectral transformation is shift\-and\-invert, that allows for the computation of eigenvalues closest to a given target value. .TP .B BV This component encapsulates the concept of a set of Basis Vectors spanning a vector space. This component provides convenient access to common operations such as orthogonalization of vectors. The BV component is usually not required by end\-users. .TP .B DS The Dense System (or Direct Solver) component, used internally to solve dense eigenproblems of small size that appear in the course of iterative eigensolvers. .TP .B FN A component used to define mathematical functions. This is required by the end\-user for instance to define function T(.) when solving nonlinear eigenproblems with NEP in split form. .UNINDENT .SS Tutorial .sp This tutorial is intended for basic use of slepc4py. For more advanced use, the reader is referred to SLEPc tutorials as well as to slepc4py reference documentation. .SS Commented source of a simple example .sp In this section, we include the source code of example \fBdemo/ex1.py\fP available in the slepc4py distribution, with comments inserted inline. .sp The first thing to do is initialize the libraries. This is normally not required, as it is done automatically at import time. However, if you want to gain access to the facilities for accessing command\-line options, the following lines must be executed by the main script prior to any petsc4py or slepc4py calls: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C import sys, slepc4py slepc4py.init(sys.argv) .ft P .fi .UNINDENT .UNINDENT .sp Next, we have to import the relevant modules. Normally, both PETSc and SLEPc modules have to be imported in all slepc4py programs. It may be useful to import NumPy as well: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C from petsc4py import PETSc from slepc4py import SLEPc import numpy .ft P .fi .UNINDENT .UNINDENT .sp At this point, we can use any petsc4py and slepc4py operations. For instance, the following lines allow the user to specify an integer command\-line argument \fBn\fP with a default value of 30 (see the next section for example usage of command\-line options): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C opts = PETSc.Options() n = opts.getInt(\(aqn\(aq, 30) .ft P .fi .UNINDENT .UNINDENT .sp It is necessary to build a matrix to define an eigenproblem (or two in the case of generalized eigenproblems). The following fragment of code creates the matrix object and then fills the non\-zero elements one by one. The matrix of this particular example is tridiagonal, with value 2 in the diagonal, and \-1 in off\-diagonal positions. See petsc4py documentation for details about matrix objects: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() # first row if rstart == 0: A[0, :2] = [2, \-1] rstart += 1 # last row if rend == n: A[n\-1, \-2:] = [\-1, 2] rend \-= 1 # other rows for i in range(rstart, rend): A[i, i\-1:i+2] = [\-1, 2, \-1] A.assemble() .ft P .fi .UNINDENT .UNINDENT .sp The solver object is created in a similar way as other objects in petsc4py: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C E = SLEPc.EPS(); E.create() .ft P .fi .UNINDENT .UNINDENT .sp Once the object is created, the eigenvalue problem must be specified. At least one matrix must be provided. The problem type must be indicated as well, in this case it is HEP (Hermitian eigenvalue problem). Apart from these, other settings could be provided here (for instance, the tolerance for the computation). After all options have been set, the user should call the \fBsetFromOptions()\fP operation, so that any options specified at run time in the command line are passed to the solver object: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) E.setFromOptions() .ft P .fi .UNINDENT .UNINDENT .sp After that, the \fBsolve()\fP method will run the selected eigensolver, keeping the solution stored internally: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C E.solve() .ft P .fi .UNINDENT .UNINDENT .sp Once the computation has finished, we are ready to print the results. First, some informative data can be retrieved from the solver object: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C Print = PETSc.Sys.Print Print() Print("******************************") Print("*** SLEPc Solution Results ***") Print("******************************") Print() its = E.getIterationNumber() Print("Number of iterations of the method: %d" % its) eps_type = E.getType() Print("Solution method: %s" % eps_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %d" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) .ft P .fi .UNINDENT .UNINDENT .sp For retrieving the solution, it is necessary to find out how many eigenpairs have converged to the requested precision: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C nconv = E.getConverged() Print("Number of converged eigenpairs %d" % nconv) .ft P .fi .UNINDENT .UNINDENT .sp For each of the \fBnconv\fP eigenpairs, we can retrieve the eigenvalue \fBk\fP, and the eigenvector, which is represented by means of two petsc4py vectors \fBvr\fP and \fBvi\fP (the real and imaginary part of the eigenvector, since for real matrices the eigenvalue and eigenvector may be complex). We also compute the corresponding relative errors in order to make sure that the computed solution is indeed correct: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C if nconv > 0: # Create the results vectors vr, wr = A.getVecs() vi, wi = A.getVecs() # Print() Print(" k ||Ax\-kx||/||kx|| ") Print("\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-") for i in range(nconv): k = E.getEigenpair(i, vr, vi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print() .ft P .fi .UNINDENT .UNINDENT .SS Example of command\-line usage .sp Now we illustrate how to specify command\-line options in order to extract the full potential of slepc4py. .sp A simple execution of the \fBdemo/ex1.py\fP script will result in the following output: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py ****************************** *** SLEPc Solution Results *** ****************************** Number of iterations of the method: 4 Solution method: krylovschur Number of requested eigenvalues: 1 Stopping condition: tol=1e\-07, maxit=100 Number of converged eigenpairs 4 k ||Ax\-kx||/||kx|| \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- 3.989739 5.76012e\-09 3.959060 1.41957e\-08 3.908279 6.74118e\-08 3.837916 8.34269e\-08 .ft P .fi .UNINDENT .UNINDENT .sp For specifying different setting for the solver parameters, we can use SLEPc command\-line options with the \fB\-eps\fP prefix. For instance, to change the number of requested eigenvalues and the tolerance: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py \-eps_nev 10 \-eps_tol 1e\-11 .ft P .fi .UNINDENT .UNINDENT .sp The method used by the solver object can also be set at run time: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py \-eps_type subspace .ft P .fi .UNINDENT .UNINDENT .sp All the above settings can also be changed within the source code by making use of the appropriate slepc4py method. Since options can be set from within the code and the command\-line, it is often useful to view the particular settings that are currently being used: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py \-eps_view EPS Object: 1 MPI process type: krylovschur 50% of basis vectors kept after restart using the locking variant problem type: symmetric eigenvalue problem selected portion of the spectrum: largest eigenvalues in magnitude number of eigenvalues (nev): 1 number of column vectors (ncv): 16 maximum dimension of projected problem (mpd): 16 maximum number of iterations: 100 tolerance: 1e\-08 convergence test: relative to the eigenvalue BV Object: 1 MPI process type: svec 17 columns of global length 30 orthogonalization method: classical Gram\-Schmidt orthogonalization refinement: if needed (eta: 0.7071) block orthogonalization method: GS doing matmult as a single matrix\-matrix product DS Object: 1 MPI process type: hep solving the problem with: Implicit QR method (_steqr) ST Object: 1 MPI process type: shift shift: 0 number of matrices: 1 .ft P .fi .UNINDENT .UNINDENT .sp Note that for computing eigenvalues of smallest magnitude we can use the option \fB\-eps_smallest_magnitude\fP, but for interior eigenvalues things are not so straightforward. One possibility is to try with harmonic extraction, for instance to get the eigenvalues closest to 0.6: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py \-eps_harmonic \-eps_target 0.6 .ft P .fi .UNINDENT .UNINDENT .sp Depending on the problem, harmonic extraction may fail to converge. In those cases, it is necessary to specify a spectral transformation other than the default. In the command\-line, this is indicated with the \fB\-st_\fP prefix. For example, shift\-and\-invert with a value of the shift equal to 0.6 would be: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python demo/ex1.py \-st_type sinvert \-eps_target 0.6 .ft P .fi .UNINDENT .UNINDENT .SS Installation .SS Using \fBpip\fP or \fBeasy_install\fP .sp You can use \fBpip\fP to install \fBslepc4py\fP and its dependencies (\fBmpi4py\fP is optional but highly recommended): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ pip install [\-\-user] numpy mpi4py $ pip install [\-\-user] petsc petsc4py $ pip install [\-\-user] slepc slepc4py .ft P .fi .UNINDENT .UNINDENT .sp Alternatively, you can use \fBeasy_install\fP (deprecated): .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ easy_install [\-\-user] slepc4py .ft P .fi .UNINDENT .UNINDENT .sp If you already have working PETSc and SLEPc installs, set environment variables \fBSLEPC_DIR\fP and \fBPETSC_DIR\fP (and perhaps \fBPETSC_ARCH\fP for non\-prefix installs) to appropriate values and next use \fBpip\fP: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ export SLEPC_DIR=/path/to/slepc $ export PETSC_DIR=/path/to/petsc $ export PETSC_ARCH=arch\-linux2\-c\-opt $ pip install [\-\-user] petsc4py slepc4py .ft P .fi .UNINDENT .UNINDENT .SS Using \fBdistutils\fP .SS Requirements .sp You need to have the following software properly installed in order to build \fISLEPc for Python\fP: .INDENT 0.0 .IP \(bu 2 Any \fI\%MPI\fP implementation [1] (e.g., \fI\%MPICH\fP or \fI\%Open MPI\fP), built with shared libraries. .IP \(bu 2 A matching version of \fI\%PETSc\fP built with shared libraries. .IP \(bu 2 A matching version of \fI\%SLEPc\fP built with shared libraries. .IP \(bu 2 \fI\%NumPy\fP package. .IP \(bu 2 \fI\%petsc4py\fP package. .UNINDENT .IP [1] 5 Unless you have appropriately configured and built SLEPc and PETSc without MPI (configure option \fB\-\-with\-mpi=0\fP). .IP [2] 5 You may need to use a parallelized version of the Python interpreter with some MPI\-1 implementations (e.g. MPICH1). .SS Downloading .sp The \fISLEPc for Python\fP package is available for download at the Python Package Index. You can use \fBcurl\fP or \fBwget\fP to get a release tarball. .INDENT 0.0 .IP \(bu 2 Using \fBcurl\fP: .INDENT 2.0 .INDENT 3.5 .sp .nf .ft C $ curl \-LO https://pypi.io/packages/source/s/slepc4py/slepc4py\-X.Y.Z.tar.gz .ft P .fi .UNINDENT .UNINDENT .IP \(bu 2 Using \fBwget\fP: .INDENT 2.0 .INDENT 3.5 .sp .nf .ft C $ wget https://pypi.io/packages/source/s/slepc4py/slepc4py\-X.Y.Z.tar.gz .ft P .fi .UNINDENT .UNINDENT .UNINDENT .SS Building .sp After unpacking the release tarball: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ tar \-zxf slepc4py\-X.Y.tar.gz $ cd slepc4py\-X.Y .ft P .fi .UNINDENT .UNINDENT .sp the distribution is ready for building. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 \fBMac OS X\fP users employing a Python distribution built with \fBuniversal binaries\fP may need to set the environment variables \fBMACOSX_DEPLOYMENT_TARGET\fP, \fBSDKROOT\fP, and \fBARCHFLAGS\fP to appropriate values. As an example, assume your Mac is running \fBSnow Leopard\fP on a \fB64\-bit Intel\fP processor and you want to override the hard\-wired cross\-development SDK in Python configuration, your environment should be modified like this: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ export MACOSX_DEPLOYMENT_TARGET=10.6 $ export SDKROOT=/ $ export ARCHFLAGS=\(aq\-arch x86_64\(aq .ft P .fi .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp Some environment configuration is needed to inform the location of PETSc and SLEPc. You can set (using \fBsetenv\fP, \fBexport\fP or what applies to you shell or system) the environment variables \fBSLEPC_DIR\(ga\fP, \fBPETSC_DIR\fP, and \fBPETSC_ARCH\fP indicating where you have built/installed SLEPc and PETSc: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ export SLEPC_DIR=/usr/local/slepc $ export PETSC_DIR=/usr/local/petsc $ export PETSC_ARCH=arch\-linux2\-c\-opt .ft P .fi .UNINDENT .UNINDENT .sp Alternatively, you can edit the file \fBsetup.cfg\fP and provide the required information below the \fB[config]\fP section: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C [config] slepc_dir = /usr/local/slepc petsc_dir = /usr/local/petsc petsc_arch = arch\-linux2\-c\-opt \&... .ft P .fi .UNINDENT .UNINDENT .sp Finally, you can build the distribution by typing: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python setup.py build .ft P .fi .UNINDENT .UNINDENT .SS Installing .sp After building, the distribution is ready for installation. .sp If you have root privileges (either by log\-in as the root user of by using \fBsudo\fP) and you want to install \fISLEPc for Python\fP in your system for all users, just do: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python setup.py install .ft P .fi .UNINDENT .UNINDENT .sp The previous steps will install the \fBslepc4py\fP package at standard location \fB\fIprefix\fP\fP\fB/lib/python\fP\fIX\fP\fB\&.\fP\fIX\fP\fB/site\-packages\fP\&. .sp If you do not have root privileges or you want to install \fISLEPc for Python\fP for your private use, just do: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ python setup.py install \-\-user .ft P .fi .UNINDENT .UNINDENT .SS Citations .sp If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. .INDENT 0.0 .IP \(bu 2 L. Dalcin, P. Kler, R. Paz, and A. Cosimo, \fIParallel Distributed Computing using Python\fP, Advances in Water Resources, 34(9):1124\-1139, 2011. \fI\%http://dx.doi.org/10.1016/j.advwatres.2011.04.013\fP .IP \(bu 2 V. Hernandez, J.E. Roman, and V. Vidal, \fISLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems\fP, ACM Transactions on Mathematical Software, 31(3):351\-362, 2005. \fI\%http://dx.doi.org/10.1145/1089014.1089019\fP .UNINDENT .SH AUTHOR Lisandro Dalcin .SH COPYRIGHT 2023, Lisandro Dalcin and Jose Roman .\" Generated by docutils manpage writer. . slepc4py-3.19.2/docs/slepc4py.info000066400000000000000000000664611454104675500167510ustar00rootroot00000000000000This is slepc4py.info, produced by makeinfo version 6.5 from slepc4py.texi. SLEPc for Python 3.19.2, Sep 05, 2023 Lisandro Dalcin Copyright © 2023, Lisandro Dalcin and Jose Roman INFO-DIR-SECTION Miscellaneous START-INFO-DIR-ENTRY * slepc4py: (slepc4py.info). SLEPc for Python. END-INFO-DIR-ENTRY Generated by Sphinx 1.6.7.  File: slepc4py.info, Node: Top, Next: Contents, Up: (dir) SLEPc for Python **************** SLEPc for Python 3.19.2, Sep 05, 2023 Lisandro Dalcin Copyright © 2023, Lisandro Dalcin and Jose Roman Authors: Lisandro Dalcin, Jose E. Roman Contact: , Web Site: ‘https://gitlab.com/slepc/slepc’ Date: Sep 05, 2023 Abstract ======== This document describes slepc4py(1), a Python(2) port to the SLEPc(3) libraries. SLEPc(4) is a software package for the parallel solution of large-scale eigenvalue problems. It can be used for computing eigenvalues and eigenvectors of large, sparse matrices, or matrix pairs, and also for computing singular values and vectors of a rectangular matrix. SLEPc(5) relies on PETSc(6) for basic functionality such as the representation of matrices and vectors, and the solution of linear systems of equations. Thus, slepc4py(7) must be used together with its companion petsc4py(8). * Menu: * Contents:: * Index:: — The Detailed Node Listing — Contents * Overview:: * Tutorial:: * Installation:: * Citations:: Overview * Features:: * Components:: Tutorial * Commented source of a simple example:: * Example of command-line usage:: Installation * Using pip or easy_install:: * Using distutils:: Using distutils * Requirements:: * Downloading:: * Building:: * Installing:: ---------- Footnotes ---------- (1) https://gitlab.com/slepc/slepc (2) https://www.python.org (3) https://slepc.upv.es (4) https://slepc.upv.es (5) https://slepc.upv.es (6) https://petsc.org (7) https://gitlab.com/slepc/slepc (8) https://gitlab.com/petsc/petsc  File: slepc4py.info, Node: Contents, Next: Index, Prev: Top, Up: Top 1 Contents ********** * Menu: * Overview:: * Tutorial:: * Installation:: * Citations::  File: slepc4py.info, Node: Overview, Next: Tutorial, Up: Contents 1.1 Overview ============ `SLEPc for Python' (slepc4py) is a Python package that provides convenient access to the functionality of SLEPc. SLEPc (1), (2) implements algorithms and tools for the numerical solution of large, sparse eigenvalue problems on parallel computers. It can be used for linear eigenvalue problems in either standard or generalized form, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve nonlinear eigenvalue problems (polynomial or general). Additionally, SLEPc provides solvers for the computation of the action of a matrix function on a vector. SLEPc is intended for computing a subset of the spectrum of a matrix (or matrix pair). One can for instance approximate the largest magnitude eigenvalues, or the smallest ones, or even those eigenvalues located near a given region of the complex plane. Interior eigenvalues are harder to compute, so SLEPc provides different methodologies. One such method is to use a spectral transformation. Cheaper alternatives are also available. * Menu: * Features:: * Components:: ---------- Footnotes ---------- (1) J. E. Roman, C. Campos, L. Dalcin, E. Romero, A. Tomas. SLEPc Users Manual. DSIC-II/24/02 - Revision 3.19 D. Sistemas Informaticos y Computacion, Universitat Politecnica de Valencia. 2023. (2) Vicente Hernandez, Jose E. Roman and Vicente Vidal. SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems, ACM Trans. Math. Softw. 31(3), pp. 351-362, 2005.  File: slepc4py.info, Node: Features, Next: Components, Up: Overview 1.1.1 Features -------------- Currently, the following types of eigenproblems can be addressed: * Standard eigenvalue problem, `Ax=kx', either for Hermitian or non-Hermitian matrices. * Generalized eigenvalue problem, `Ax=kBx', either Hermitian positive-definite or not. * Partial singular value decomposition of a rectangular matrix, `Au=sv'. * Polynomial eigenvalue problem, `P(k)x=0'. * Nonlinear eigenvalue problem, `T(k)x=0'. * Computing the action of a matrix function on a vector, `w=f(alpha A)v'. For the linear eigenvalue problem, the following methods are available: * Krylov eigensolvers, particularly Krylov-Schur, Arnoldi, and Lanczos. * Davidson-type eigensolvers, including Generalized Davidson and Jacobi-Davidson. * Subspace iteration and single vector iterations (inverse iteration, RQI). * Conjugate gradient for the minimization of the Rayleigh quotient. * A contour integral solver. For singular value computations, the following alternatives can be used: * Use an eigensolver via the cross-product matrix `A’A' or the cyclic matrix `[0 A; A’ 0]'. * Explicitly restarted Lanczos bidiagonalization. * Implicitly restarted Lanczos bidiagonalization (thick-restart Lanczos). For polynomial eigenvalue problems, the following methods are available: * Use an eigensolver to solve the generalized eigenvalue problem obtained after linearization. * TOAR and Q-Arnoldi, memory efficient variants of Arnoldi for polynomial eigenproblems. For general nonlinear eigenvalue problems, the following methods can be used: * Solve a polynomial eigenproblem obtained via polynomial interpolation. * Rational interpolation and linearization (NLEIGS). * Newton-type methods such as SLP or RII. Computation of interior eigenvalues is supported by means of the following methodologies: * Spectral transformations, such as shift-and-invert. This technique implicitly uses the inverse of the shifted matrix `(A-tI)' in order to compute eigenvalues closest to a given target value, `t'. * Harmonic extraction, a cheap alternative to shift-and-invert that also tries to approximate eigenvalues closest to a target, `t', but without requiring a matrix inversion. Other remarkable features include: * High computational efficiency, by using NumPy and SLEPc under the hood. * Data-structure neutral implementation, by using efficient sparse matrix storage provided by PETSc. Implicit matrix representation is also available by providing basic operations such as matrix-vector products as user-defined Python functions. * Run-time flexibility, by specifying numerous setting at the command line. * Ability to do the computation in parallel.  File: slepc4py.info, Node: Components, Prev: Features, Up: Overview 1.1.2 Components ---------------- SLEPc provides the following components, which are mirrored by slepc4py for its use from Python. The first five components are solvers for different classes of problems, while the rest can be considered auxiliary object. EPS: The Eigenvalue Problem Solver is the component that provides all the functionality necessary to define and solve an eigenproblem. It provides mechanisms for completely specifying the problem: the problem type (e.g. standard symmetric), number of eigenvalues to compute, part of the spectrum of interest. Once the problem has been defined, a collection of solvers can be used to compute the required solutions. The behaviour of the solvers can be tuned by means of a few parameters, such as the maximum dimension of the subspace to be used during the computation. SVD: This component is the analog of EPS for the case of Singular Value Decompositions. The user provides a rectangular matrix and specifies how many singular values and vectors are to be computed, whether the largest or smallest ones, as well as some other parameters for fine tuning the computation. Different solvers are available, as in the case of EPS. PEP: This component is the analog of EPS for the case of Polynomial Eigenvalue Problems. The user provides the coefficient matrices of the polynomial. Several parameters can be specified, as in the case of EPS. It is also possible to indicate whether the problem belongs to a special type, e.g., symmetric or gyroscopic. NEP: This component covers the case of general nonlinear eigenproblems, T(lambda)x=0. The user provides the parameter-dependent matrix T via the split form or by means of callback functions. MFN: This component provides the functionality for computing the action of a matrix function on a vector. Given a matrix A and a vector b, the call MFNSolve(mfn,b,x) computes x=f(A)b, where f is a function such as the exponential. ST: The Spectral Transformation is a component that provides convenient implementations of common spectral transformations. These are simple transformations that map eigenvalues to different positions, in such a way that convergence to wanted eigenvalues is enhanced. The most common spectral transformation is shift-and-invert, that allows for the computation of eigenvalues closest to a given target value. BV: This component encapsulates the concept of a set of Basis Vectors spanning a vector space. This component provides convenient access to common operations such as orthogonalization of vectors. The BV component is usually not required by end-users. DS: The Dense System (or Direct Solver) component, used internally to solve dense eigenproblems of small size that appear in the course of iterative eigensolvers. FN: A component used to define mathematical functions. This is required by the end-user for instance to define function T(.) when solving nonlinear eigenproblems with NEP in split form.  File: slepc4py.info, Node: Tutorial, Next: Installation, Prev: Overview, Up: Contents 1.2 Tutorial ============ This tutorial is intended for basic use of slepc4py. For more advanced use, the reader is referred to SLEPc tutorials as well as to slepc4py reference documentation. * Menu: * Commented source of a simple example:: * Example of command-line usage::  File: slepc4py.info, Node: Commented source of a simple example, Next: Example of command-line usage, Up: Tutorial 1.2.1 Commented source of a simple example ------------------------------------------ In this section, we include the source code of example ‘demo/ex1.py’ available in the slepc4py distribution, with comments inserted inline. The first thing to do is initialize the libraries. This is normally not required, as it is done automatically at import time. However, if you want to gain access to the facilities for accessing command-line options, the following lines must be executed by the main script prior to any petsc4py or slepc4py calls: import sys, slepc4py slepc4py.init(sys.argv) Next, we have to import the relevant modules. Normally, both PETSc and SLEPc modules have to be imported in all slepc4py programs. It may be useful to import NumPy as well: from petsc4py import PETSc from slepc4py import SLEPc import numpy At this point, we can use any petsc4py and slepc4py operations. For instance, the following lines allow the user to specify an integer command-line argument ‘n’ with a default value of 30 (see the next section for example usage of command-line options): opts = PETSc.Options() n = opts.getInt('n', 30) It is necessary to build a matrix to define an eigenproblem (or two in the case of generalized eigenproblems). The following fragment of code creates the matrix object and then fills the non-zero elements one by one. The matrix of this particular example is tridiagonal, with value 2 in the diagonal, and -1 in off-diagonal positions. See petsc4py documentation for details about matrix objects: A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() # first row if rstart == 0: A[0, :2] = [2, -1] rstart += 1 # last row if rend == n: A[n-1, -2:] = [-1, 2] rend -= 1 # other rows for i in range(rstart, rend): A[i, i-1:i+2] = [-1, 2, -1] A.assemble() The solver object is created in a similar way as other objects in petsc4py: E = SLEPc.EPS(); E.create() Once the object is created, the eigenvalue problem must be specified. At least one matrix must be provided. The problem type must be indicated as well, in this case it is HEP (Hermitian eigenvalue problem). Apart from these, other settings could be provided here (for instance, the tolerance for the computation). After all options have been set, the user should call the ‘setFromOptions()’ operation, so that any options specified at run time in the command line are passed to the solver object: E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) E.setFromOptions() After that, the ‘solve()’ method will run the selected eigensolver, keeping the solution stored internally: E.solve() Once the computation has finished, we are ready to print the results. First, some informative data can be retrieved from the solver object: Print = PETSc.Sys.Print Print() Print("******************************") Print("*** SLEPc Solution Results ***") Print("******************************") Print() its = E.getIterationNumber() Print("Number of iterations of the method: %d" % its) eps_type = E.getType() Print("Solution method: %s" % eps_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %d" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) For retrieving the solution, it is necessary to find out how many eigenpairs have converged to the requested precision: nconv = E.getConverged() Print("Number of converged eigenpairs %d" % nconv) For each of the ‘nconv’ eigenpairs, we can retrieve the eigenvalue ‘k’, and the eigenvector, which is represented by means of two petsc4py vectors ‘vr’ and ‘vi’ (the real and imaginary part of the eigenvector, since for real matrices the eigenvalue and eigenvector may be complex). We also compute the corresponding relative errors in order to make sure that the computed solution is indeed correct: if nconv > 0: # Create the results vectors vr, wr = A.getVecs() vi, wi = A.getVecs() # Print() Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, vr, vi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print()  File: slepc4py.info, Node: Example of command-line usage, Prev: Commented source of a simple example, Up: Tutorial 1.2.2 Example of command-line usage ----------------------------------- Now we illustrate how to specify command-line options in order to extract the full potential of slepc4py. A simple execution of the ‘demo/ex1.py’ script will result in the following output: $ python demo/ex1.py ****************************** *** SLEPc Solution Results *** ****************************** Number of iterations of the method: 4 Solution method: krylovschur Number of requested eigenvalues: 1 Stopping condition: tol=1e-07, maxit=100 Number of converged eigenpairs 4 k ||Ax-kx||/||kx|| ----------------- ------------------ 3.989739 5.76012e-09 3.959060 1.41957e-08 3.908279 6.74118e-08 3.837916 8.34269e-08 For specifying different setting for the solver parameters, we can use SLEPc command-line options with the ‘-eps’ prefix. For instance, to change the number of requested eigenvalues and the tolerance: $ python demo/ex1.py -eps_nev 10 -eps_tol 1e-11 The method used by the solver object can also be set at run time: $ python demo/ex1.py -eps_type subspace All the above settings can also be changed within the source code by making use of the appropriate slepc4py method. Since options can be set from within the code and the command-line, it is often useful to view the particular settings that are currently being used: $ python demo/ex1.py -eps_view EPS Object: 1 MPI process type: krylovschur 50% of basis vectors kept after restart using the locking variant problem type: symmetric eigenvalue problem selected portion of the spectrum: largest eigenvalues in magnitude number of eigenvalues (nev): 1 number of column vectors (ncv): 16 maximum dimension of projected problem (mpd): 16 maximum number of iterations: 100 tolerance: 1e-08 convergence test: relative to the eigenvalue BV Object: 1 MPI process type: svec 17 columns of global length 30 orthogonalization method: classical Gram-Schmidt orthogonalization refinement: if needed (eta: 0.7071) block orthogonalization method: GS doing matmult as a single matrix-matrix product DS Object: 1 MPI process type: hep solving the problem with: Implicit QR method (_steqr) ST Object: 1 MPI process type: shift shift: 0 number of matrices: 1 Note that for computing eigenvalues of smallest magnitude we can use the option ‘-eps_smallest_magnitude’, but for interior eigenvalues things are not so straightforward. One possibility is to try with harmonic extraction, for instance to get the eigenvalues closest to 0.6: $ python demo/ex1.py -eps_harmonic -eps_target 0.6 Depending on the problem, harmonic extraction may fail to converge. In those cases, it is necessary to specify a spectral transformation other than the default. In the command-line, this is indicated with the ‘-st_’ prefix. For example, shift-and-invert with a value of the shift equal to 0.6 would be: $ python demo/ex1.py -st_type sinvert -eps_target 0.6  File: slepc4py.info, Node: Installation, Next: Citations, Prev: Tutorial, Up: Contents 1.3 Installation ================ * Menu: * Using pip or easy_install:: * Using distutils::  File: slepc4py.info, Node: Using pip or easy_install, Next: Using distutils, Up: Installation 1.3.1 Using `pip' or `easy_install' ----------------------------------- You can use ‘pip’ to install ‘slepc4py’ and its dependencies (‘mpi4py’ is optional but highly recommended): $ pip install [--user] numpy mpi4py $ pip install [--user] petsc petsc4py $ pip install [--user] slepc slepc4py Alternatively, you can use ‘easy_install’ (deprecated): $ easy_install [--user] slepc4py If you already have working PETSc and SLEPc installs, set environment variables ‘SLEPC_DIR’ and ‘PETSC_DIR’ (and perhaps ‘PETSC_ARCH’ for non-prefix installs) to appropriate values and next use ‘pip’: $ export SLEPC_DIR=/path/to/slepc $ export PETSC_DIR=/path/to/petsc $ export PETSC_ARCH=arch-linux2-c-opt $ pip install [--user] petsc4py slepc4py  File: slepc4py.info, Node: Using distutils, Prev: Using pip or easy_install, Up: Installation 1.3.2 Using `distutils' ----------------------- * Menu: * Requirements:: * Downloading:: * Building:: * Installing::  File: slepc4py.info, Node: Requirements, Next: Downloading, Up: Using distutils 1.3.2.1 Requirements .................... You need to have the following software properly installed in order to build `SLEPc for Python': * Any MPI(1) implementation (2) (e.g., MPICH(3) or Open MPI(4)), built with shared libraries. * A matching version of PETSc(5) built with shared libraries. * A matching version of SLEPc(6) built with shared libraries. * NumPy(7) package. * petsc4py(8) package. ---------- Footnotes ---------- (1) https://www.mpi-forum.org (2) Unless you have appropriately configured and built SLEPc and PETSc without MPI (configure option ‘--with-mpi=0’). (3) https://www.mpich.org (4) https://www.open-mpi.org (5) https://petsc.org (6) https://slepc.upv.es (7) https://www.numpy.org (8) https://gitlab.com/petsc/petsc  File: slepc4py.info, Node: Downloading, Next: Building, Prev: Requirements, Up: Using distutils 1.3.2.2 Downloading ................... The `SLEPc for Python' package is available for download at the Python Package Index. You can use ‘curl’ or ‘wget’ to get a release tarball. * Using ‘curl’: $ curl -LO https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz * Using ‘wget’: $ wget https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz  File: slepc4py.info, Node: Building, Next: Installing, Prev: Downloading, Up: Using distutils 1.3.2.3 Building ................ After unpacking the release tarball: $ tar -zxf slepc4py-X.Y.tar.gz $ cd slepc4py-X.Y the distribution is ready for building. Note: `Mac OS X' users employing a Python distribution built with `universal binaries' may need to set the environment variables ‘MACOSX_DEPLOYMENT_TARGET’, ‘SDKROOT’, and ‘ARCHFLAGS’ to appropriate values. As an example, assume your Mac is running `Snow Leopard' on a `64-bit Intel' processor and you want to override the hard-wired cross-development SDK in Python configuration, your environment should be modified like this: $ export MACOSX_DEPLOYMENT_TARGET=10.6 $ export SDKROOT=/ $ export ARCHFLAGS='-arch x86_64' Some environment configuration is needed to inform the location of PETSc and SLEPc. You can set (using ‘setenv’, ‘export’ or what applies to you shell or system) the environment variables ‘SLEPC_DIR`’, ‘PETSC_DIR’, and ‘PETSC_ARCH’ indicating where you have built/installed SLEPc and PETSc: $ export SLEPC_DIR=/usr/local/slepc $ export PETSC_DIR=/usr/local/petsc $ export PETSC_ARCH=arch-linux2-c-opt Alternatively, you can edit the file ‘setup.cfg’ and provide the required information below the ‘[config]’ section: [config] slepc_dir = /usr/local/slepc petsc_dir = /usr/local/petsc petsc_arch = arch-linux2-c-opt ... Finally, you can build the distribution by typing: $ python setup.py build  File: slepc4py.info, Node: Installing, Prev: Building, Up: Using distutils 1.3.2.4 Installing .................. After building, the distribution is ready for installation. If you have root privileges (either by log-in as the root user of by using ‘sudo’) and you want to install `SLEPc for Python' in your system for all users, just do: $ python setup.py install The previous steps will install the ‘slepc4py’ package at standard location ‘`prefix'/lib/python`X'.`X'/site-packages’. If you do not have root privileges or you want to install `SLEPc for Python' for your private use, just do: $ python setup.py install --user  File: slepc4py.info, Node: Citations, Prev: Installation, Up: Contents 1.4 Citations ============= If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, `Parallel Distributed Computing using Python', Advances in Water Resources, 34(9):1124-1139, 2011. ‘http://dx.doi.org/10.1016/j.advwatres.2011.04.013’ * V. Hernandez, J.E. Roman, and V. Vidal, `SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems', ACM Transactions on Mathematical Software, 31(3):351-362, 2005. ‘http://dx.doi.org/10.1145/1089014.1089019’  File: slepc4py.info, Node: Index, Prev: Contents, Up: Top Index ***** [index] * Menu: * ARCHFLAGS: Building. (line 15) * environment variable; ARCHFLAGS: Building. (line 15) * environment variable; MACOSX_DEPLOYMENT_TARGET: Building. (line 14) * environment variable; PETSC_ARCH: Using pip or easy_install. (line 18) * environment variable; PETSC_ARCH <1>: Building. (line 28) * environment variable; PETSC_DIR: Using pip or easy_install. (line 18) * environment variable; PETSC_DIR <1>: Building. (line 27) * environment variable; SDKROOT: Building. (line 15) * environment variable; SLEPC_DIR: Using pip or easy_install. (line 18) * environment variable; SLEPC_DIR‘: Building. (line 27) * MACOSX_DEPLOYMENT_TARGET: Building. (line 14) * PETSC_ARCH: Using pip or easy_install. (line 18) * PETSC_ARCH <1>: Building. (line 28) * PETSC_DIR: Using pip or easy_install. (line 18) * PETSC_DIR <1>: Building. (line 27) * SDKROOT: Building. (line 15) * SLEPC_DIR: Using pip or easy_install. (line 18) * SLEPC_DIR‘: Building. (line 27)  Tag Table: Node: Top350 Ref: index doc571 Ref: 0571 Ref: Top-Footnote-11780 Ref: Top-Footnote-21819 Ref: Top-Footnote-31850 Ref: Top-Footnote-41879 Ref: Top-Footnote-51908 Ref: Top-Footnote-61937 Ref: Top-Footnote-71963 Ref: Top-Footnote-82002 Node: Contents2041 Ref: index slepc-for-python2117 Ref: 12117 Ref: index contents2117 Ref: 22117 Node: Overview2207 Ref: overview overview2279 Ref: 32279 Ref: overview doc2279 Ref: 42279 Ref: Overview-Footnote-13450 Ref: Overview-Footnote-23650 Node: Features3845 Ref: overview features3919 Ref: 53919 Node: Components6771 Ref: overview components6845 Ref: 66845 Node: Tutorial9814 Ref: tutorial doc9907 Ref: 79907 Ref: tutorial tutorial9907 Ref: 89907 Node: Commented source of a simple example10187 Ref: tutorial commented-source-of-a-simple-example10308 Ref: 910308 Node: Example of command-line usage15043 Ref: tutorial example-of-command-line-usage15164 Ref: a15164 Node: Installation18411 Ref: install installation18505 Ref: b18505 Ref: install doc18505 Ref: c18505 Node: Using pip or easy_install18600 Ref: install using-pip-or-easy-install18700 Ref: d18700 Node: Using distutils19508 Ref: install using-distutils19608 Ref: e19608 Node: Requirements19728 Ref: install requirements19814 Ref: f19814 Ref: Requirements-Footnote-120277 Ref: Requirements-Footnote-220311 Ref: Requirements-Footnote-320437 Ref: Requirements-Footnote-420467 Ref: Requirements-Footnote-520500 Ref: Requirements-Footnote-620526 Ref: Requirements-Footnote-720555 Ref: Requirements-Footnote-820585 Node: Downloading20624 Ref: install downloading20727 Ref: 1020727 Node: Building21137 Ref: install building21238 Ref: 1121238 Node: Installing22788 Ref: install installing22869 Ref: 1222869 Node: Citations23448 Ref: citing citations23525 Ref: 1323525 Ref: citing doc23525 Ref: 1423525 Node: Index24170  End Tag Table  Local Variables: coding: utf-8 End: slepc4py-3.19.2/docs/slepc4py.pdf000066400000000000000000004624061454104675500165660ustar00rootroot00000000000000%PDF-1.4 %ÐÔÅØ 1 0 obj << /Length 843 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅNÈW…œ„H¶­ Zí•&¦‹Tàп~3Ú®öz¿™yóœ87?ž×Ûö¯nÝkõâNýehܤü¹=77Uß\®;?:׺vÜ==¨ç¡oÖî¬nËUµêöç;O^uÍû¥u#ëÿ¤Â½í»O ú¨Ûû=Ù˜‰a³?¿ûkLy 6FÑæ/7œö}÷ Ì½ÖÚ–][öH<Si£¦cãݾké¥^Ñ90¡j÷ÍYVôßü¬H^œÎî°êv}0Ÿ«é‹ß<‡ÒrLŸ†Ö ûîͯ_®/Çã»Ck¥ƒÅBµnç«øy·§¦Wý×øæãèTHkÃý›¾u§ã¶qö{sÁ\ë…š×õ"p]ûϞќòº¹KÏÕµÿ u”/‚¹A² )`JbD>`´öØ2ãš™$`¤TY'`”(ZqŠÇÁ¼BJÅŒ )KÒÌŒ%553<Æ,£è(‡hþl™×wBš6„‹0¦Ða™G„+L¤gıè«cŽWÀ c œrn œqœø9çÖÀ–ã°MÜ—8%Ç àŠCMq.â†5„Sâhr›ê›®®AƒáúI‚Öå皎­ú\SåþÈ©¿ÇÀ á]8 é`Y‡7ÑŒ1OÊyeäµñÖzlÃë,d mYĸ”S£SJfß-›1i‰:C&e c4ÎRÆÄÉØˆËÄ$D&™ Ë Æ&+ü¬bLõÉãaÉjÆ çÁbôÍy°üœ£‡+çÁbèÉYB¹ü‘þœõ§Ägý ñYJõYŠYrÖŸb–œõ§x(rÖÁèœõGT“õÌ›ËÁ`F+ƒÙ­L ,C9ô²â?d+þ£¯ÿ¡ÍŠÿÄÿ1£ÿ1—ÿ¡ÓŠÿðÄŠÿ˜×ŠÿT_ü‡~+þCg!þ£o!þƒ_ˆÿàâ?ôâ?åŠÿÄÿ‰/þ?ã«„°øY ñ³â?^ŒBü‡Ÿ¿\–jò‹UPñœŠ{Åð¡âxᇻLöó^U}9pQãóq½÷›Ë0øO}cèÖÇ}¿ïÜõ3tìÈ¢}¿Æ!VOuðÊñË· endstream endobj 2 0 obj << /S /GoTo /D (section.1) >> endobj 5 0 obj (\376\377\000O\000v\000e\000r\000v\000i\000e\000w) endobj 6 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 9 0 obj (\376\377\000F\000e\000a\000t\000u\000r\000e\000s) endobj 10 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 13 0 obj (\376\377\000C\000o\000m\000p\000o\000n\000e\000n\000t\000s) endobj 14 0 obj << /S /GoTo /D (section.2) >> endobj 17 0 obj (\376\377\000T\000u\000t\000o\000r\000i\000a\000l) endobj 18 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 21 0 obj (\376\377\000C\000o\000m\000m\000e\000n\000t\000e\000d\000\040\000s\000o\000u\000r\000c\000e\000\040\000o\000f\000\040\000a\000\040\000s\000i\000m\000p\000l\000e\000\040\000e\000x\000a\000m\000p\000l\000e) endobj 22 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 25 0 obj (\376\377\000E\000x\000a\000m\000p\000l\000e\000\040\000o\000f\000\040\000c\000o\000m\000m\000a\000n\000d\000-\000l\000i\000n\000e\000\040\000u\000s\000a\000g\000e) endobj 26 0 obj << /S /GoTo /D (section.3) >> endobj 29 0 obj (\376\377\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n) endobj 30 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 33 0 obj (\376\377\000U\000s\000i\000n\000g\000\040\000p\000i\000p\000\040\000o\000r\000\040\000e\000a\000s\000y\000\137\000i\000n\000s\000t\000a\000l\000l) endobj 34 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 37 0 obj (\376\377\000U\000s\000i\000n\000g\000\040\000d\000i\000s\000t\000u\000t\000i\000l\000s) endobj 38 0 obj << /S /GoTo /D (section.4) >> endobj 41 0 obj (\376\377\000C\000i\000t\000a\000t\000i\000o\000n\000s) endobj 42 0 obj << /S /GoTo /D (section*.6) >> endobj 45 0 obj (\376\377\000I\000n\000d\000e\000x) endobj 46 0 obj << /S /GoTo /D [47 0 R /Fit] >> endobj 48 0 obj << /Length 586 /Filter /FlateDecode >> stream xÚmTËŽâ0¼ç+¼$æÀà$0Š ‰Ã£­ö ‰a#A%áÀ߯«›ÀÌjDÕå²»«ífðãc;ZæÕÁŽÌ«Ÿ¶­®MfGÑÏ}í q•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0ZÇë²è^œx]fçkn{ÕÿE+{*ʧyÄpg6;5’PìŠîìVž¤pH8$hù—mÚ¢*ß„z•R:")󨺠ÊÖß3‰qŸûX”ysO'Hî)-ò"ëî}³‹³‹ÍÛ[ÛÙ˺s á3 4†{´¢p¿YôdšrýØëKæ‘+ˆ™ÇÞ a }ÀõàíÑ« W€‡Œ{ Fvm734…4˜‡¢´A­«»èGÞÿc Ú¤Þ_86 endstream endobj 49 0 obj << /Length 770 /Filter /FlateDecode >> stream xÚmUËn£0ÝóžE¥Î"±y$UÉ6 É¢5Õh¶)8¤"’,ú÷ãc\W³Ýsß/.7?ž·3ÑôozÆï(yѧþ2Ôz¦vÇèæ¦èëËAwçG­ÝŒÒÓ=yúz«ÏäVmŠMמåMW\=jý_Iê÷¶ó*ˆCn_õŸÙÃfö ¯íùÃ&1yØ+ü­‡SÛw÷$¾£”FÙ5ª? ÅS4¿†!ó1ð¾íšá‹¼!r3Ò´õùŠì»>˜Za¼ý<õaÓíûhµ"ó#<‡O›ËÏhþ44zh»wrû°1p{9?4B“4Z¯I£÷Æ‹©çqwÐd>å?ñ¯É»Ü=ûõó¨‰Ã±K«î}:îj=ìºw­(]“UU­#Ý5ßd¦kò¶u¥Ñ¥¥y že¥ÖÑ*†ƒx12+ƒ¹Sx¦æ,öÌÒ09Ì9Ô)5t´J N¦Š'†™™{fSÉ –2Œ¬Rà̼   KÙÀÒV i‰X¤¤†BÆRs>–^ÿÝ ×.¹¢KäCc†2—ÀÜc4‰&WÀ©o"²¦™ÇÖîq¼ð8^zlã p5u%†=c¾K(œq/‡?–xŒQ±Ôcøc™·/€s/G|¶°£•¨•-mõ„¥•鯝P/S8+8èÂÑ 4fÁR§SYZ"?.ì‚0»1Òшŕ[KŽþòÒñ­¾õÃúPKS6Ò×0ÃÔæ—eÈ;Uކ}Z8~S›gÈ;­ _™õÇàg®v»ói;K¹æÊcÄÌ g‡ÝÌ­oZ ÞÜú¦ ú¶ø’'ü êê„LÄá^ î¥àá^Š$ÜK‘†{)²p/Eî¥X„{)–á^ î¥(½ߎ‡¨> stream xÚmVMoÛ8¼ûWhÒCj~H”\HÉrhSÔÁb¯ŽÄd IJ!Û‡üûÕ¼±Ã¢ØƒõøÞ¼!9ÔÝ_?7¾?¼ÄûUe¿âép»øPßgwwÍ¡»ìãpþcûÛÛÓ·ìçxè6ñœÝ×Íã°;™‚‡îýÒÇ[Ôÿ…ø¶Rêd÷ÏñŸ‡§ï›…ˆçÝù}z“³ eÊäõßq<í÷LUJM롯{°<Íæ×JÙüVûu7ôãµ\ö‚â3m²~ׯOòßí§v1yóq:Çýãðz˜-—Ùü×ôòt?„Í—Ùüiìã¸Þ²û‰Ïô¼¹ïµ35[­²>¾Ni¦ž~l÷1›§>_\é“}~þ8ÆÌȳ&±îÐÇÓqÛÅq;¼ÅÙR©U¶lÛÕ,ýï g¼¼^Cs=…~úk*[4õ¢^Í–¥™žåO×mT·I:/nYº·ãµž1ÚLs*J`#¸lœ ne¼ÀÜ¢ì8W—Ìi+Á‹xAì€=±Ì ÄpM¼n˜?¯™SbZbÄhòÏ`-؃6‚+ÔÒ–µtΘ¸ 7 þÆûXøû €ÉßB[Mþ98hò¯ ›&ÿ ýjòwÐJ7Äà¯É¿”qò/1n„¿^ –ÑÄÈi 1z1–ùMN þ¦ F_ƃ›¡þ¹Ä ÝHþ±ä÷Ä’?K|M,ù愆fý[þ«þÐÜ e‘ÓRÿ©Õ S…xKýúµÂ¿¨e¹‚ä‘ýc­Ä íQ×Rþ–ú+™ëe¿y¬‹¥þ ëhÉ_Ë8ùkôh©¿G_–ü=âsêoSsƒ¹9µµ¨›S[‹<9õ”^rê©%æZ:ä¬kÁ³`Nø‚<åÜ'{¸à>© [AžkZ§&ŽûÜ#¿£Îùä· 9%F-—ËÜ‚µÏ©ì=WC'}•k‰_K—óRV³ᯌÔõÄèQàV ç$¾!–6n/xzjgÿu › endstream endobj 51 0 obj << /Length 1026 /Filter /FlateDecode >> stream xÚm–KoÛ0 ÇïþÞ¡@wÈbK²EÉ ‡=°î©­v;p’C¿ýLÒ2­b‡ü™z”é¿n>ý|ܘnxvù%‰¹óp[·)¿íOÑÍM5´×£ë/ßë\ç½ç¯ñÏqhÝ%¾-ª‡þpù< ~èÛ·kçü¨ÿ²îõÐóØ'¾}r6ßê?›F<.o“‡Æ“OVŒîßn<†þkœ~I1=¨û®Žå9ÚÎ;Å[¿÷Ë¡ïÆy»ø6Rw‡ö2þ·Ç)]˜üø~¾¸ãCÿ2Dwwñö×ä<_ÆwŒæs´ý1vn<ô¯ñíÏÄ×ÓéÍÁÞqÝßÇ{™–™rú¾?ºxË),Ž9|Šž?½Ÿ\LœR`íйóiߺqß¿ºè.Iî㻦¹\ß}𥹢9Ï/íßý8Öß5õdNœžrf=KâʳšXÈÄxΈ—ñ9ñ²¾&^Ößázz_/ë¯ëe¾%^æ—ÀI%À®Ð®s°k°‹f™×ûyé*ïx•7²`?¬Jö#+® rÆuAι.Ț낼㺠\dÃuA¶\är® ØÕ\°Wyã¸UÞÀb•·^å¼:oäÕy#¯ÎyuÞÈ«óF^7ò꼑Wçl8/a9/Qr^8®â¼WyÃù‰†Þ…lf™`…;%»[ mpŒ$[MyX[RŽÞ+Iù¨¥¤ÜL6§Ñ`ÓYÜË 9HKvvI6ä)+²K°k² Ø Ù§šã‡¹Šâ7ð+Š¿€¹Šâ/°×Qe\G…ñ›$Ÿû@if¨Â<„¨½¿`F¿¡ñ‰÷[fô—Ä©÷WÌ诉…÷7ÌàÏ0O‘úùæ*’Ƴ xü÷"ÜE)=+b¿~–ÑúÊsN~¦‰—ýv¼?ÆSðþȆ÷G¶¼?rÉû#W¼?rÍû#7¼?p>çïãËSfôcÊ¥~¹dF¿b†w4ψ}}òœÇkf¿ãþGÁýl¸ÿ‘-÷?rÉý\qÿ#×ÜÿÈ ÷?°žó÷z¢Sfô fˆWKfèUM}k¡5õ­…ÐsßBohÍ:¡çï0οÁÐÿšò¬ ÷4}{ÆCùU¸NµzŽçšVcC6¬¹û ¯&á9&ýà¡öj¯Q¡öš,Ô^“‡Úkt¨½fj¯)Bí5&Ô^S…ÚkêP{MÃÚk®©MCíµ"Ô^+Cíµ*Ô^›…ÚkóP{­µ×îBíµE¨½Ö„Úkm¨½¶ µ×V¡öÚ:Ô^Ûð·µLøÛZ¦¡ö–"ÔÞR†Ú[ªå=™njó îlpÅ\®†íu§[#ÞCñW¿Cï–«êi8Á,üá×ß™~4Ñ?„ãªs endstream endobj 74 0 obj << /Length 1465 /Filter /FlateDecode >> stream xÚíYKÛ6¾ûWè(Ë—H騦› A€¦‰{Jƒ‚–é]¢²äˆÒnößg(RŠ%;‹z»>m.–Dr¾™á çAãè:ÂÑë¾ðóË‚ÀG$’4’£”‰¨Ø->}ÆÑÆßF幈îúU»ˆ‹ žeôqñçÖo«Å/¯RQŽd&I´ÚFŒD¸ˆ„dS­6ѧøã»«÷Å2¡2‹·KŠãºñïïÛ›ºZ~^½‚ò4¥†P‰QBA@‘{˜ºÔÊjOËÉ ´""1.zÚDH…ŒÎQšQOûÎXUmšž»ø]•…©F€åÂÉ»R†ROL³ ¿Þ{œ¾ð/SæH Âˆ ¿L¨½9üðzq$&Ç"°båœyV/ëªÕUk=ø°ßˆâÌ!I¿<žÉ|°g"ð*ÀÁ"Ø,‚1Žÿ¸]ëÆýÞ}7a’ÃG òzž!962CX‚šÞ¼õ²¤8~¥UÛ5zªpô)IÑ2IAÜçúày~!èÙ^IeLérÎɦ¦¥Á´/ëݾ®Ž¼²œÿ4çeÍÉž&‚$±rÎ!ƒ‰Iˆ‡4Ä‘Õ2§q×ÖQåƒ1„_"†Ð1†€£íÀÍô‚3|Úºk íßë­ª0evû2Lé%I㯪˜í `ü¸Ô)·áOè®ÂOÌQ€Å '¥©ÂLgÕõ‘Rœ=óó~ÊFâ‚G›…£ý¦²­*KÕ_ ýðhËKm6í¿¬©®}‘6žCñ‡ÓAˆ½Ù‡5‡ØD ÆFA¡è<†úWfã¨.ïÿ1^ó‰Ò3`¨‰©žy•r–óŠÁ_Î0 ¡9J ž"O¡gyÊÆØ¶kMi²/wyöÓ¾O÷Nůì©â–ç209”>€½4m¼ìƒÑ+?3zA¼ “¨ù¦Úè¯3F)Ä5&Ç. ÷ÓW«iÎ\‹ÉcðC,è‡syI–ÍñXžx°š¤ˆS0'n!•ö˜<„Á…„Ýa£\ýEÀÄ8€bP‘Â&…£úëÚ¶*Ú‘ŠÊ`¥_¸º1Ö›ºè\e¾´-³zED‰k²¹ ñÀ, F› ~èý®¯ýJ½/øÞ5½÷3¿Œ_ U⣿ßcúº›Ù×M¾­ÃóF?މ¿D9Á£4ëF5F[t.°«ÙÀÖŒ^ÓÌ9<îÍA} Ÿ¶Þ¶wnU£ýÈ^ÿºò­ÿØö×;Ô«¦ȨºÈË®/+úE}E£¥j–$‹¯ub UBm®uµä8¾]Ò4Ve76õºÔ;Ð8a®Xiýp¡è:¬ëlß •ç¾k§æ¼fuù#¡Rœ`ë6@Âkµ9ZM„.  Kz}`Ũs­ŒÆ6Áß]‰x§ÚÆÚ†)–úá¯~É^™f˜\$¶öÓ^xñêÉÓØåÀαî'Ä?¡®‡Mç:7M Ì©¼ —q7I€_iüŽ“x8Vg {µúx<ì‰×ʚ¿n»ªp©JÓÞû!Û7þMI¼7÷âím!*©àÅNÌ­– ¤Þpäp‡_xÓŒS#ìx,N˜j0ˆk—#Ø{Û˜ZLé|Ös'NèꦎO.½t6„¶õØÂ x[_kP,HzgÚÿfZ;ö{U™GY×…UÝÚ…rt*ÑöÙË%ÇRò‰í;FÊr”A¦þ_vâ@¦Ì¸ ŽHÆG¢FGÛi^†$š¥GDPxÂ@ð½ ú¯WÒÃýýÁ­4Ô$„€Ã!%ÓZíl}ïnœ3øëfwîæå7UÊ%þ{v÷‡w’qg•„äZÚPtý }Á¡Ã7 Žh'.ÀyßsYŸ­UprH9Nð[³Ñ£d€ÊŒeŠ* Øã¬ï5˜…šƒ³Ûë‰Nî7xó7%¶¥ endstream endobj 47 0 obj << /Type /Page /Contents 74 0 R /Resources 73 0 R /MediaBox [0 0 612 792] /Parent 83 0 R /Annots [ 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R ] >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [71.004 496.222 128.687 505.199] /A << /S /GoTo /D (section.1) >> >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 484.287 144.607 493.134] /A << /S /GoTo /D (subsection.1.1) >> >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 470.275 161.225 481.179] /A << /S /GoTo /D (subsection.1.2) >> >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [71.004 450.394 122.45 459.37] /A << /S /GoTo /D (section.2) >> >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 436.402 270.912 447.306] /A << /S /GoTo /D (subsection.2.1) >> >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 424.446 242.28 435.35] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [71.004 404.566 136.657 413.542] /A << /S /GoTo /D (section.3) >> >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 390.573 213.538 401.587] /A << /S /GoTo /D (subsection.3.1) >> >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [85.948 378.618 170.918 389.632] /A << /S /GoTo /D (subsection.3.2) >> >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [71.004 358.738 126.684 367.714] /A << /S /GoTo /D (section.4) >> >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [71.004 336.82 97.355 345.796] /A << /S /GoTo /D (section*.6) >> >> endobj 63 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [177.932 238.853 215.241 249.756] /Subtype/Link/A<> >> endobj 64 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [225.144 238.853 255.371 249.756] /Subtype/Link/A<> >> endobj 65 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [299.315 238.853 328.984 249.756] /Subtype/Link/A<> >> endobj 66 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [76.384 220.92 106.052 231.824] /Subtype/Link/A<> >> endobj 67 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [76.384 179.077 106.052 189.981] /Subtype/Link/A<> >> endobj 68 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [143.7 179.077 173.368 189.981] /Subtype/Link/A<> >> endobj 69 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [225.851 167.121 263.161 178.025] /Subtype/Link/A<> >> endobj 70 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [432.185 167.121 469.495 178.025] /Subtype/Link/A<> >> endobj 75 0 obj << /D [47 0 R /XYZ 71 757.862 null] >> endobj 76 0 obj << /D [47 0 R /XYZ 72 720 null] >> endobj 81 0 obj << /D [47 0 R /XYZ 72 320.003 null] >> endobj 3 0 obj << /D [47 0 R /XYZ 72 143.743 null] >> endobj 73 0 obj << /Font << /F56 77 0 R /F57 78 0 R /F60 79 0 R /F61 80 0 R /F62 82 0 R >> /ProcSet [ /PDF /Text ] >> endobj 86 0 obj << /Length 2433 /Filter /FlateDecode >> stream xÚÍYIwÛ8¾ûWð6Ô{&C€‹Èž—ƒÛq2J'iÇrç’ô&! .j.±_?@‘å-—¹Hd¡P¨ _@ÏZ[žõîÄÓÿ¿_Ÿ¼z+q“ˆFÖõÊšSkN<×óçÖuf}µ—..ÓÙß×ïO<—z±å¹þ<€ß ެ„¯Þ¡ÈÈMæ~,EÒ¹Í#Ëw#¡P‚µ{øn‡–3`?ýÅõÝ !ÃåéCËGn@éhyQls^ð²mf |›åëªí¦PïÍÊ ÚªÊ5Ϫªq°Ýp¤”]Ák‘²_›*ïZQ•ÈU­š³zFb{ÍOå{h7[V7Zk^ÎÏþ1£!(Ñiú¶®n@?­ J*«Yžó\šj9ç†à!‡7 C4+­Šm×òºqgŽïGö¢…™al§LŠû†#¡›9ÄnfÄæ qð‹’³¹&ÕžzÀ%´lþãZJÓ‚Y!‡‘ Ò8˜ ~r=«Ò-±oa6rÕ\9t0Oš•ó í;e»7¶š©ÈñV¤`6M|4Û#ÚlÏÕ› Ÿ”`¨k”@AË%wU€CÀ¢\#…!ø½J' -¿¼AªŠ¯”ôQ˜‰§Ã¬_jž‚CÖ]®< “ ÖÖâNl@mµ’H?¤µZײ*uT&ŒŸŽňØß¼ÐÛVù}Yh p w‰‰ °™6°îY– ™Èm÷³(´Oq↑.ü!2®Wèu®dYù¸]€‚ÙÉô‘¬ö8Xª'ÌDVôvhü‡Ï«®LLÏ6ÿšuJ[P& m·=wßÂ!$¡g‹“Q”-/3•!‘Ɉh0="\¨MwÓðIJÍÈXÉ4€Åë®3|í­ˆ0B¸Î˜¾e¢6¡ ˆýg©cnÃÊÌ¥Üu)×Kl!Fw™r&ÈW÷çƒ]ú6-Žl]жË4ãaš5§8ÃlPX›B¢”‘S•š3Ôœ KŠÀÀ”FªÑŠL,„基$Jpž۪Ã]ådü›çQ@e¾ïœöÀ óÀ žê„K)¾ïq$ˆ¾W <‘q dJ·¾æŽ‹ó¸Û wÝΡï è»>tòÆwº×Í© Ý8é3mß`:]O4xÔ ½0èp J£Î¥,ßße¾{íMÅÞ‡ )Oæ>ÀGò´=û©ï_¬»/Ïcs£ÍõcºSwNçGu"wNžèøóA5DE–M¦—tzàÉdƒSkâõ1»}½’–³|»Ñ"Τ¦r/ŒÝ`ì(7ucBdž¿•J˜}Ù›÷¬x=Z/°˜ÔØýÊúPYx$LÔ÷9¶" ¾VR‹R¹Í¡Ö)Ên¢³L7Žú¶.«<ú <ðð:ÖŸÕ>ˆ{OÛ oÐh‘5Pd}P]Q¦y—õn<€þ¡´=-ß³´ºÎãˆÆxv g…-Kµ¢€ä5Û%t¿œÄßœ¤õxŽN™ÂB'š»/\›õy爗è}^•ÿíÖ3H.S|Ö5Ëv¥ÃúÝ'n!JQˆŸìpc÷,Wì>‡Xmðퟮj¥À—)x¦»¤ªl«Î¸ švuè»Ù]RìNƒÎTÃ4ÚÇ–ÃÁ¡¶yÂæ=Þ-4xÝ#½Ý#ù«ïëËÉm¡­lOé´®šÆ8ʺ´að¢zÐhGÁ®|ûsû_g G¤ç;H–TªtŸæ"}dÁªnÜ÷P_=-ÿÖÿj}|öþžP#ð]ùt¤”ù¼VôŸæÞ‹»-¨+Z}Ћ·€‡|Œk:¢"l-ïSô†xYŽ/Š_Xr‡íF¤ß=y4µÇ‡'lŠíóz¨æÿ¢°=mO˜“ñðn¨úú™‡ 7-ƒ>@Oa«Ö,‡ÝÁ/eƵ¼»ùsæ‡öÙÕ^-ùìŒ+oÁ‹ªÖ ÄÕí‚©+¿ÛvÔ¦‚¢n®PMY~¸s¯‹Òé||¹¼ËZ±»º›L¦f|-ÖtÛmµÕ›{£,+›#}Ìфӷtãܺ¸>ùçDžx=‹ÈOs„8\+-N¾þíYÐßËk¨$¶nWa‘xî’D@rkyò¹ÿĺÉ|ŽuÎ"ab/€¾È)>pÓÜ#ê ãà7<¸(¦÷.^_¨j_UScØçzìœÉó¾"†öM|ÃòTÎÁl^Wšx¦9¯g18­`ê¶2w÷íDâq­¯Ü?²²c¹fy³\œ;‹Å+¼ò(Ž;øw…—Ç¢Á8Ú>¸F«¤µXЦåÓ‚¥¾¾L+M¹ï³È÷áиAŽ’(ÝuÍ•ƒN­nd\V9tØi)RfîEðÿËŒÈo:9/SÁô…)õ¨ïöáØ…x*lNäÆ |È<5ì_fò¾?å¥êÆ)•WG%lbþSªMcû=Þ§SCCu`‘„»hbaäÇ.ªßäGµHuØ0y™2U…q‚åÛoõÕ¹è‡0ìUþ]´HÀŠAÍG ,wL¬öP/¦ðÆ/5x»ÑVžI®ó‡á ô͆¬ˆò[‡á#k7úqY­Ú[yA«ß}"qΗgN·[3Ǩ&SÏ Ýé»åÝÿÄqB endstream endobj 85 0 obj << /Type /Page /Contents 86 0 R /Resources 84 0 R /MediaBox [0 0 612 792] /Parent 83 0 R /Annots [ 71 0 R 72 0 R ] >> endobj 71 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [98.68 706.884 104.657 719.377] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [105.155 706.884 111.133 719.377] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 87 0 obj << /D [85 0 R /XYZ 71 757.862 null] >> endobj 7 0 obj << /D [85 0 R /XYZ 72 592.324 null] >> endobj 88 0 obj << /D [85 0 R /XYZ 72 108.681 null] >> endobj 89 0 obj << /D [85 0 R /XYZ 72 89.512 null] >> endobj 84 0 obj << /Font << /F61 80 0 R /F56 77 0 R /F62 82 0 R >> /ProcSet [ /PDF /Text ] >> endobj 92 0 obj << /Length 2875 /Filter /FlateDecode >> stream xÚYI“Û6¾çWèHUµ8\DŠJUö¸ãñÔÄéŠT¾$s€(¨… … ãV~ý¼ Éf·íœ°=lï}o‚Åã"X¼ÿ.˜”o÷ßýãÇ4\lým¥‹ýi‘eþ:Λ0ðƒx³Ø¿z¿EQ²üïþßý´Å¯«$¼ÝEçm£Šå*Ün<¨UöT7¥jM]Ù»å* 2ÏvùÇ3OY¦³gsjWª:®Lµ\ÞŸË0ñtÓú0ayû³±<¡Õù¹2tšç™òR˜Ü´Å•Ûž]†žvôgG9\×j­OrLGEçÐG…C7æ / üˆ†üð×év± C›$ÂŽ Þ¬ÚP†2cÈÁhí§áøDÄp–U”^ÝuÃÕ¶æ2¯ËK×jnhó¨åØQâ©¢Ã[UQ[mÛñTÅÅ£Ab¾¨ìÓªffÞ£–ýrw3—‹¸Ö&vgmçnãoàþBàQ°Š²ŸE°gãoãøu´üK5e]™ÏçÅC?frD ‚%Ùðµ/?kuÁj 'ouS¢neæDò"šxz{V-Ó©ÂÊ 4ó6íQ—KS?¬þ‚4’¡4h:Üs"j*Œ9îÇkýÖ÷0ºãË(ð:ígÓžk×hôiLõ8ˆÀšêc­¦“4«4òØh$ßAK·p©šßÕ¡ ž´j»Æ¡ÓTyÑõ÷c‡)^2ú,Ìãy¨d=ЦVœÿ¿A”]åxöë2Mzv\¹ìlñ]ù ½ ®ìþsÿ euSóÜè\×Ç ²ƒ¯ƒô;Õª•m›.G–,Wq¼ñ*ݱMÄÚ,]êŠo§Ž“ŒNƒrj¬ŽïÙr§½(²^Xw‚¤þ¶nÔ£ p‘+š#š2ìqË?Üïw9ÕdzÄv¾„×~ù$_@¼îÌ܇&9F–’aB$²v˜‚ÑÝ´9”·cñqHYT~¬Öݰ—àeÙIв–K>ЊњÅûeÀl;&î,È޳¢ëã«5²µÒ‚…‡+(ØÊSW‘õ±S»æ8ôø¥«V­)J°UÌ–ÍLaÚ9°Zðšætí[u¥nêNÊê¶½iq;*¨HÙú0•þ{¸}#‡ù”cý|3§½¡p©ŠBãÍ?»øQ ÅÁ”50ð¬ó—÷r$é‚e¡¡[9{Ç~–ÊÙC?/ÿÍÛÈeÿ ר+À³­71¶À9pÜq*¨“ÇÁPÃ,÷‡°rª‹¢Fø,šÌL£Ý 0±w ïÏgCø†aÕÈÔÒ4Mݰ΢³ ýB_òõeÞÕmÑpÅê£í îЦ.¹ÆØF•‡M÷îÿƶ·ÆÀ•ÎèK~cc°8غpÎCÔ§Kz4d¾Nº!ÛÅQ‹²Ö9 ½7M †¢´¢ÀçTzÌ5}¨“+AÛ¡‡ceAÓdÕ=ŠU#0®ÿCáÏcæ&ó`©mƒ‰ç»ؽ“(ö#­xeáñÖ»/pÿߘ»žÜ&£ eëV¹aGú•Ô&\£!.&“1S¬ÙØUé\[K"RWV¡Çɼ‘Vf‘8N¨ô"wýX†‰0më õ>´L2>)ö”Å«ÊØÒòdF àm ÝjŒçi³¡]„6c‚׾ŸC+Ï/ŽÓØh¯éÆX]ûpÊ8€-Z¸šjŽ"ÍÒ®r;‘Ÿ…²Ôª²ã'M6›ḛ̀4Zë`ÍÁÈŒ€”تRAÊЕÎB˜g{WéL^Ol»Äs¹û\gۄøNw âç<±?µNCƒ¶Šà¼áfxï>½{Õ¢¡LoC½xdŒ éºÙÞ$k0ª¨¹o‹%Oª°×º‘£Ä¬LtÄ;¸gW(!ü´ ÃÐYNh¿ÓtkhÒÈù4¥ˆŒYäo³íxk .SqÑüU¿)tôa/Ò Ñà Ù!Ô 7û\ \xJÅYÓšárCû0Zòƺ "²ÉT¤ —žbQÛPŸãÍü¦æô,^;û•Âåšäê¡£ [b°Ö÷VÚÊ:>C×gMÎj®ÇÖ¥¬Zßvº) ·Onç:è8]š텣ó*†PçÝóøáY°Ñ‡!ω&”©7å!ä •`ú j$ÁÃýÃl¢D`½‡JI% *½AôJV¢H<åˆ\”h@üPת. %œ8y.A: ½08ŒbQ¤((RègY<ÝX‘ –ƨ–¦h”že­ÑVt*wØò:˜BÇ¥?0:ȆwúrÞ#¬át²÷8Àö~¨¤¤aÄò‡#”/¡Y˜±wŽÁƒ¨ƒì!1eîÍk`ˆ¬á$7ãg#ì5ÕÑäôf„½7µÌÄåÓÌ>’ƒ.êêQVçUÈ=c“nD÷Ï8€¹Ã ð0z¹›»I¾¸Fy¼6µÍë‹É¿ã¿€ñ9W±Ç­Ô$Ôôê÷ò'IZ©ÿ¡ÀŠà¡QÕ¦µdQ¡9Œ4Ñl­ãÔÛcLW¨òpT¸=ý€ø6ÉF@ ³æ½Ã,¨G–¢G=&õEWÇÞ" ŸÒöò¶jÔÔË_ úî³£r,÷à“EÊÁDTþû«ï_#ÁŸ~üøª7~šN%˜%˜eSÅÏœü`hšfdÎÀ[v¶ÿÃ9J¢Nìd­ËõœÝ2&pK2ñ7ë‰$CIâ‘/ɼ÷Ó'qŽú (Ávõ2Œ½72ȯ)B ¥î×"â˜DÅ5àuŸÒ!&ËSuw¸{¢oZK¢dËäO?œèçÇݪ`3Y÷Ä…±³±ç.¤ÌÏcß×ãß X¤dj¿G»ýk0Ê0MÆY0Do·ÿ ôêûeœx£?!¦"Ìa¬Ç0 Ó£/ ]Þ†Sõà»’·RØlüÐ*Ä„5Þ¢„yÈ×µ¿ô}lGo§†èò‹…NjƒŸRšÌpè†yí9;K:ùP+ñ;+³©$ÑÖ\NžR° ƒàÙ˜°ÿf‹$ê/(˜@ÈÅg|KRWnÈwHù(#gšaÌÙI?·¢O2lÏ'Â0`¤Ô¤ú¹>ÒWžd\°¬m¿/‰‚Ïê?“<¶àDèn-—/}ùPºëØ‘ÿ–×9™(O©K¥“ɧXÎ_5~‰ 2ɰ“ÉwÜœÄ^úœûö¬îí§W4ó³p;±óq6~aÊà”¹ºXH`Z-òœ„>ò"t¤H1m(¬žô¿UÖíÀy\Ÿëð7F%IÁm‰ÑÃ>.‰¹1}V¬ù¸È½Ø¶Ùƒ Di‘¬»fšJš–03þ–ßüA;ÿ,}¿ÿîÿL¬ endstream endobj 91 0 obj << /Type /Page /Contents 92 0 R /Resources 90 0 R /MediaBox [0 0 612 792] /Parent 83 0 R >> endobj 93 0 obj << /D [91 0 R /XYZ 71 757.862 null] >> endobj 11 0 obj << /D [91 0 R /XYZ 72 538.526 null] >> endobj 90 0 obj << /Font << /F61 80 0 R /F62 82 0 R /F56 77 0 R /F60 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 96 0 obj << /Length 2465 /Filter /FlateDecode >> stream xÚÍZK“Û8¾çW¨j/rm¬Ô;UsèÙJïfj7“M÷œ:9Ð2íÖ–,yôH§ç×/H€²$»;íÇ<*5m $A€>Ô0gí0矯Øä÷ÇÛWo®#æ¤^‰È¹]9iä¥,vbÎ<æÇÎíÒ¹s¯?̾ÜþÔ/‚|°‚'žùW³¹C7«6ÛªTe‹¯]£–ú)rÛ )Kõ™1Q*|ÛÈö^ÁŸ<“RV]™µyU6Þlî‹È½½Ï±¿µúµËkËwñˆTàƒª\ÎaÛšØUô—M+ËLõÒ€fŽïEaäÌ9÷Ò0D=†ò±^|»ýÌBæÁ²qæ>Ü+iªâk^®ñ¥¬Ê"/•¬ñUåkUnëjQ¨Mƒ¤‡¼½Ç§ï>âCn9m‹¼¥Í«zã,À<gÏàÜ}øëÃé×0°Gü¤mŠñÀóƒHhc̓ÈKDàÌýÄKª*ƼÞù›‡ Ne–2·k«:>ã/Ì™ Ø<渻5¬p[»Ø¼!•ô`J4³°vîB6y†`eœZ­Ðj›Û˜æq…®v!¹×3º¸ž»›ªV8[.¿ÎDèj§Xö _“H÷4©Vr©ê¡dš¶R59 'ÇîÍ¿ß}ÌÆ Ñ|ÙgccG{PEv–äȉÕ0³£"ïeî²Êº ĘԮyž‡™Ç÷½¦ sxü2îñj£e5Ç')]=Ì5ºÀ»±üJÎ7Û‚†”¶Û7ißñ+pô(BÁß—­ñ/,Ü(Ã`Z?áÜq¤¼»}õë+nVp'J=ƹè  R'Û¦AìCºJ{I:µrV¯þ{€{¢È‚J ØxA ñÑGœQ>Q!˜GQ !NDOÃ"ˆ/ŽÁÊOò€_?‚Ÿ/æIPtG>ŽkR]¥^fýTC ?…YèL’0ø#a:ØÈ'¿ZÕÕæT¥Äõ8]ÿ]±hýˆŸ` çΨ‡Mô>„¬ïï2Ñ|n™õý¢øï©?FÚEõ?/Í–Ýf¢þ©i`OC8…ÊSiàÂEêA*8+ h1Äq©äÙ<àÇДrjE®Zlî©ÍlÝVy©Ó‚ï lò`4“%š»Mé+N³dTqâð&–¾AتZÚ«©Å»{=jï—HìØø^½­§R½m¶³ƒVÕ‹[©:˜¶*ËWZ0ßÑÐ ¦æÆD‹´6ka`Üè)²žñÄ]›Ûƒ,c8a߆Yy oM‡—~xed@þK…MKW´HÇ[t´¿i¤ì3|7Õ—RHDíᡤs¨}Ç!Óÿhê°7#]#×»]LëË¡Žöã`¿õtJºËÀNIWpOubq©ŽÓX2Nc¾H<0jºSËðúaRÏâ0ÅœVÿÜ+³Å±qãè–õH÷%]«ö}i:b#B›A"Ê)# ²ùÌüx’/^´®/ÆQéJ¤øÒ¥¤Á²ØÅ+ÉNßÞÈÚ\â%¦×d¼ÆË‹%¾JüÙȶοgî>S˜‰%þ?5 E;5B&¬5RÄ §%tµCª4)R$tÛCX”ñô¥ÝrŸ½Ka®$©iê |¨2åÚäsIi6*]´ê§ZÉÖ$GxAÑ`^@¬ÿƒ|€Ï˜¬aBk>Äh’>•¢3ðõ™ùoª®p6ô~tùi–4Ißb©ôåçÿ$ã;cC°å2—몔…n/ÓÐ~‚±AÚÔK­,iå=ÑGëm' ô9/)ßjnçãè¶jr[Ï|Ïå뫳ø7ª½01ÁþPa:§/¿Ûf×ÐÒ¾ 9{Ÿ_¶Sö‚Å^XÕÐÔ-i[+ÑKxÍÕ¹ÏÏîÍ}¾ý$˵šø)@LýFƒ’ÄRLOðAdX© ýj»ÊÍ7"£xõpôíÀ¤oŸ˜-_={a“þSÚàèƒÿaúiõ¥…Ö^e Î =r}uwD ·Ï–¼êí1LĔɗ‹8äÝY2¼>V†ù ¦qùAÕ§Žuš³üýèÏ,°ÕÉÆõǬגåHs ÛBþE¢ö°<èœåÓñwL z!¯ûcœ}/ÆÞ^6Ðÿ„{qxˆ—ú þ5ÿÃüÔ}W?Ý^Û*ù©ýÔ_‹ öÂ8=«GõÿÅvJ‡>ýý?lÝ€È endstream endobj 95 0 obj << /Type /Page /Contents 96 0 R /Resources 94 0 R /MediaBox [0 0 612 792] /Parent 83 0 R >> endobj 97 0 obj << /D [95 0 R /XYZ 71 757.862 null] >> endobj 15 0 obj << /D [95 0 R /XYZ 72 680.916 null] >> endobj 19 0 obj << /D [95 0 R /XYZ 72 602.141 null] >> endobj 94 0 obj << /Font << /F60 79 0 R /F61 80 0 R /F56 77 0 R /F78 98 0 R /F79 99 0 R /F81 100 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 2473 /Filter /FlateDecode >> stream xÚÕZmsÛ¸þž_Á¹Nf¤Þ™‡7¾¥sÜÖ¹ëMçâÆžé_¦CK°Å_t$eÇÿ¾»À‚¢hÊL%ç$“‹Åb÷ÙÅÌ»õ˜÷ã+Ö=ño}ëÙ—÷?¾âþ…û2Úò;´!9÷ÂÄgòc¥¼Ea8ªHúI{!ó£Hxµön^ýk„O'…/ùÃÿB#În ÐþõòÕ÷ocîÅ~†Ê»¼ñ€sÄ”ŸÀ÷Ë¥w5ûÓü$dlVµ+]Û׺ºoæ.î Ä#HÊ|.í@;-0Ð÷o£¤7 óN8ƒAb;ÈMUïpê¸G-¸ð¾âÌ’>(Œ…—ò9sèKÅCh浪ÓòVï°„Æ_YÀê¦Mëö;Ò.—ÐÈß ¥w"B?NÒEb^eDì&ªŒôŸ‘l§å½êd0™VZrÛi§ÅvâCß4æ·ÏS ÇüpÀF/? 8˜Æ«/¯¬ïhÈOémdû8|òÔ#ø²>ëVøL8yâé!jô‡ŒÓ¦ÑÅu®ÑîÑÌÍ÷1„âãÙeþb?æ¢W˜·„o?ã´’Ø»7”ü#0̽ ÀÂ-‹@IŸÇñ$ FÚŒxâ„O±P‘­ûx ¡ áá´j:ä^¸#BBèP†°tÒ.ÙåJÏODÀfM•ßÍy0C ÆßÕõõ¢µïYcŸ‹Z§­^RciŸ)õÏŠ,O©óýœÃ‡" Þ¶Ì›]FkÝ6 µÆ®oÈ8ž wÍ¢!€¤³DC@áD†Ÿ O£×É7!úˈmIuv«Ë¹b³»¹fi¾1íÑl]Wµ…%*6 q»¦nÍZ/²_zéÏO‚$žE®SG\•D]¤m}ÜÇ †B`¹Ë–Ä,1¨ƒQ39ˆA`§Ú %@ÖvÎgkmX®øvmZ Æ2[áÌÛ|¯ót $á 4µ+ƒ_@´H×›¸eÔí§³sÛ€–ý“®‹¬ÍRê?¦B$%iÑ`Z’ñÙé’5ûñ¦® 7¼n4‰d!pdænÛ¬¼Eib9[T›ç ;]hê+Ѷ'miPfL‚MsVBÊ&ƒ#&ܶ·U ÕujÌ [º.Í¢*Ö›6º6«Jš˜bÉìô¦5Ð ƒ¥yn‰«5‘Ä«t.PA@œàº´ß`n=aF&¿i ó(™5+7s6) œÛÔÓ€îÖSbæÇAä’hç-hý•«QKb_ éºUkP vA!ã¡•¥]¥­}C€y=ؽi³¾›)u©7%qÉ mi3×b´ / í"-©cž•V7'X`ïÌ Wµ±‰SgÝ629Ò0ç.´p £ÄîIý{MâàøÙ”¶ÇcŸTô¬sB@¶º/©˜Âƒ‚@ÂÖ!Q“’ #|ZŒƒ’ E°·s…Btƒ©è`̱Ïï`PF?®JùR*G]èvU`Ýg&vÀ›…ÇìÒ9`•ƒ6r{pÁ—$ü ·Z¯!X>F¿ ÚýßîT`®%®£o+DHÁâϺ­PAÛŠã`ápéžïfÛ‰?;wŸÂù<¥šèf ·8š›IáÇQÔOÞwa’$J²ÈTáËÊä®ð‚‰D™5+“ÅcyO]lø Èñ—į²ßÖ5˜wCÖlò¶1Y)›½Íê¦%ŽMUMVBþ‰{†Im—¸ÃeÚ¦–d‘’„×_Èóõ¶ÃÒö0¹îH^÷…žÀF.ú¢àʇ/ÇrF)gB‹{nTŒ}þùÙåÅ´\áâ¡™˜+Ð\pû5=ó¡Ã # ñÍ))|‡²wnàZìøß J‘ŸÐIF~`¹ÛBúÏOþ9|rð{åõ†øf¤*Ï)QOÀîù’´a£Êlï‹MEmE©‹’øë½ Ó éGà?#,Õ¢9Úøj•øbMªï}ÍÚæ((4-¹¸Õí?ZÚJÿ²)®u=Šñ—]â«™•…"oèpÌ Úì¶›ˆ…/6m}3Ï1† H1ýsÊ·s*$¬¾.~½ZeOf˜ /}‹Š ½ÂÈþÂ$U0³Á¥ŠR4iý°{ªcŠATÀ¬6ÔgUá÷öG±=—r%ÓušÕÄvp"ÿ¶§˜¶Ãc€¤}GI½@cŽj½È G®Ù(XæðQUD~œGªÙðÆbŠRÐÂÝˈIt kðró…±—oX›šm0å+ùµd¨†éÀº5õ'PÑþ^`ÀÃ"x^ *œ¬Ê–3ެB‚5D`•JÎtºXÙ74I|ŽQAšÁ¢nù;' %¥/Y—Œl­/Í„¡)·ã¦î/Ãz÷V+Üã‹!%ã )º|å·±À¼¨—Р,æbÀ¾ÑP–E[¹s1#û*sš²7‚Pz€íF—űáúfˆcáà†A¡Ss©! ¦ñÙš[|æ6D°s9Ï~ÞŠÑŒM’r±Õ]=2oÈ"ÖaÎxL}>ßž&Þeÿ—É‹ì‹ÏKrûF-‚YV¤·YiÃ-´Óþ´]çý Çû-Mfv€Ð^¤é ØQ×·,én‡,ˆvU?~¿H‘ÈÐ4&ˆ¡(ÌËÞ¥(<[Ê5R}ì]Kú÷> endobj 104 0 obj << /D [102 0 R /XYZ 71 757.862 null] >> endobj 101 0 obj << /Font << /F81 100 0 R /F79 99 0 R /F78 98 0 R /F61 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 1981 /Filter /FlateDecode >> stream xÚÕkoã6òûþ ]ÛäkÍ%)êµÀ°wH EÑÛ÷e[™¶ÕÈ’–’ÈïÉ’lgãG_1bQÃápf8O&ÔY8Ôùîížú£Ž|øîsô v°ò `9AL(cŽï ÂãÀIW†¢=‡‘Ã"F<î(éÌ_ýwºÃ > 2Døbžaoµÿ¾yõæÛ0v"pnæNÈ ûs3s>ºÙ|òËÍ÷QÀŽzØ,B1ÌÜ"-‹E'Âì„_fïöv>NJÝ èÆ(ñ5šÇìÂd»Âöoqkî·ø „¡0€|ÐRD¬'…O¼È™2 RGV’/'f‹ÿ(™4ÒŽ›%”¬×ySÛ—L›RÕÏéˆ"éØ’Þ¨oìÒ{u¬ªÞ$6À÷GPqÉXg ÙüO¦õÏÔ§ðËôôÃYËpö×dø”#Éøåø“ÊŠæ9…u}æŒÓ^¹býbä/Y4èóΜuŸžÞ?LïžžÞ<=éÇ)õù|1VùŸ.§;ÿXƒœîÂO ~PÞEÐQø©h^ªç,‹3âó6zf§î †~„³b¤„ÑuÑ’SI±{4DM°×ª2a×™ò€Dq<ÿî"ãêÜ€q•-dQ%™Ò|·Ñ¬‹Ã›ìK¥Jõ!-WÕº‘Wš#Â%,4:>¿ß%E¶JÇ*óïN®Èþú ŸìÿØ8¶Åm”DÅïCv³•ð®ñ^ÇóÑæŸ'¨µÂÝ×_ï,ý<ß#“‚0Ÿµ¼üz4'#цÁë5ã‹sä”Õ18>§›Þë}~¬­ämì• –'ÆWjœz„CÄ?úNÍÞ—EÃû2á…$„€c´ñ• wÕc³Ôš×ã‘2zDD¡]ñÏgöeԌɾ‘ÔõW?¥vÓë2ÇÃ×oðÎJ¯b°yè@²[ׄÀ‡Œãïl÷9ø¶À¦âÇõêV{‚ÞZÛ~f—³NÓ‡w÷j+ *›½µ/bŸÜC™øwê1/7uº\«}+÷1¤ä§µ¬9Ã¥›ÄM’ iîí ¯›²ªŒÕjèg™f —4eþŽÉ) 1ë­’‡¬yÇ(})Sº©–j1`Jw®u_-xîSxÆ,j{³Ã·@Ó¬èoÔ¥Š3hïqOp¦(½xb/¢|”q?Þ'®§‡4 ˆ Å&‹ý°£Ø4âaK; ¡`,:ŒyaÌÄŽÀy·Ø'—½ðq8ý·ÁäP q,„ˆÀYÙYE„lÈþ)E„ {ƒak“ ˜‡¾Õù¦cöXÔæNã%‹ÝY6×Á~.ä9D‘Mƒó‘¹%3 ôŠºÌ7&ƒáD•¨ü]ªËó|“Ë5bšc]K;Àh&i[Ovi[¿ÜgÍr»ïnNBW]mš›ÊªÞ“ §ˆ5µå’Å­”ü™Rþ@4yºUŽM†u“©üfX(¤KsÑ6Ì“Fˆ~þî…-“íu„˜ên´ŠMø² øˆ'Á°õ¥³,X9ñE¸ó‡«ì-¸P’e±€öÉ{Q’µq Îëÿ…Ü`,§=((¡Ží¬Ñý™Á*âP€8‡FëÛP¾Ð]ž4ž/X5?C¸iÐfm;ŸÅÑíãÈVûÀXÿí¯²-¡ÏÏkôžÛv™DœŸjÝÖžÙêòv3ñûÚ½ýS|¤Ù7Uõú¶®’Tžgä[9O7ò3h´0Býól¸€†ür6Î}âGm/f{ÖZ1s“ÛR1X²p„‰¯¶ohʬ3e†¦Ì1!Ì,P§ª¬Q¯ËµJ[ìr†PëJ JÏ;l®˜MŽÍ&‘>‡U¥ÊJeØ ³a×iÖXÝvŸ½> endobj 108 0 obj << /D [106 0 R /XYZ 71 757.862 null] >> endobj 23 0 obj << /D [106 0 R /XYZ 72 519.961 null] >> endobj 105 0 obj << /Font << /F79 99 0 R /F78 98 0 R /F81 100 0 R /F56 77 0 R /F61 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 111 0 obj << /Length 1863 /Filter /FlateDecode >> stream xÚµXmoÛ6þÞ_¡`3Gê]ý¶a[Ñ[·&0tEÁH´ÍUo•d'Þ¯ßy”eG)š8CðDŽÇ{yøÐÜÛxÜ{õ‚#þuÏ o_½þÁŒfg>Áª /Π¹Ï’ÌË+c0L–%©Ÿ¥~âuÊ[¿ø}ƿ翿~ñíO` eY‡ÞõÚK|/á!ˢػ.¼w‹¯–«˜óE{¶MmåBUÍ·êN°ö`'Vªí?쵺]¾¿þì®|Á2‘X?þveµÞÜü£òá¥}vøå·×d¿krÕ÷Æ€à,‰½ Y”Y#áUôåÇîP6û>ßîºQÔNÔ#þµUnÖv¼‘½î­¸'šŽ>ªv°’\ª³b§úAvƒÛÌÔð®×õÆj [e…²É?޳{ÙiYÛoWs®ÁFoJU‘ã¶úCU©¡Ó¹}Tz£ê½,wjŒùlƧ^•°%UbÓ ÚeÊmôµoAµÛU´h)» lö|I Ž&+•ÜÔzØjnõzWݸÀ¹åîYú›G¼V{Ęÿ/´•7宪gRglæ'6ã9£•¼ÓÕŽ^èJÕý½ø@tÿ™Æpš#\§j‹‡×IgÖ™Û‰†“˜›ÞÙá|Îá¡)A±Î]eµâéœbÞÔ{ UJ3äò¥«áÖÚ»ÍYLÊk¬Ô³–ûþÏgmÛ’7· ‘LóÜŸ†lS67²¤ZUõfØZ9˜ Tþ¶Ù4µ,õ¿òØÐVÛ¦ 7òRö½ÎÑW¬VWù¶ÒÅð“ZëZA)¹¸hr¸VªpU„…£Iž¬¢¹unDhï_°‹WWsFŠf„¡JÕ®tÐFQ•” Ð*Õ¨×黕Æ”»|x°.~¸ÎÓ{u±Uí,¨5åþ>Ôž4æ­¶däuÕ–:×´ßßßNCvLƇ~PŸº1s›»º~Þ¢ßêõl]™®2¾ M–`å)„ΞõçLãÇë)‘HY*ü ‘x÷ž{¼X¥Þ­Q¬àßÑŠÒ»Vq4…iz‘ p#—ˆ܉?g#LB–$ÈØ@7¢ì1&NèO,¼ èý Ò…®Rm¨=?Æ"”Jb±n:;•7U»L™â£ÕeçÔÒtüá L ~ØW²,Íy‹³ÇcÕ<ÞÒ˜ËÚjïúqešÖà¤Ý¶£×Ÿ2îãþŒÓ†¹Å>œßgÛAÂÂ4t~c#Œ#q$.À㢈 jéóÅ|xdC€‚®áTÓîi6øbØB”H–²Bݵ¾¡qè¤Þl°~»X]Á–«0‰ojú¦m¾ot©‡9àV CG/¬´•]ÕÔȬŒK-î`¥ƒù LŠÌìÇuádϺ&hŽW?²§(Ž5ÐÄ–ÞÌg>Âã¦émÂ'ßs¿4½û´;Ái7ÛkA„Ì“ó{ˆYÄÏt-BÎ"?xäµàüqj@Ö9¸c1¾Æ&ƒ( ÁØ%6‚‚H° õ/‚1tƒÞÇá@k&¨’P­ª U` æ GSÁ(ÐÉŠí¦ÓŽw§cç*y°ÂÚ4ª.Év¡AFjâç‹n)èèæ8ô¯ÇÕ›žÖÏ%ô ­Žç8Ιֆ±VxÜÊî0]C˜»Œ^Ó¤œk_{ÛA®¤Ð~@ª{hôŠXUd‹ÐÑë­¤I”+Úî˜zžeÖó”:uá¨d]¬Jàƒà~(|ĺÞj™”4D>—æzÓ„LdfÍ3è^h4‡æ€á3Ðí',Î|§ÔvêoÎý;òó'LaÚ*„ëx …p›T Ä ýFX2œd…›Ñ.y€–—u%i‡êì£9㦘h¹…ÇO;LÂ’]Œp³+ ûx£ž}8Ìþ¯Ðè'ÙôÈ)Eš8ò½‰óÿ‚“ý?!/±Aèæ§Àƒì"„ô / Ÿ‚ãÈ´g~à—±‰èýÉ·”è(öDÈ‚0ö]¦ý€žz( R}êÞ»U„·de)¹»À¢õØ´¹ñ18–&$óy<þÃþ æ'é¢Õ­ )†QÉþðAÛ-¬v†_ø3!„6¦ßÿZ Ä› I°EÈlòmM1’Vô`9 ê`gâ×9è& /©÷¥jóºõ¾]X®4NÐ’ Äø sЪ:׎âÕsfÁ4e>Ü2ÈPÕêùõ‚”SRÓdÓÞ¨ŽÔ¶À Ëƒ•;…çúC¿_=/´ 8X,é9ù1p' Ÿ YÄ›;ã KÎþ@i³iÞ­VP,Ýûñ8¶ÇО_²a¯UCŸOÄË-š›ˆdñÉ8LÆg.ã65Áü&¡EÌYš„¡> endobj 112 0 obj << /D [110 0 R /XYZ 71 757.862 null] >> endobj 27 0 obj << /D [110 0 R /XYZ 72 250.296 null] >> endobj 31 0 obj << /D [110 0 R /XYZ 72 211.142 null] >> endobj 109 0 obj << /Font << /F78 98 0 R /F61 80 0 R /F56 77 0 R /F79 99 0 R >> /ProcSet [ /PDF /Text ] >> endobj 124 0 obj << /Length 2245 /Filter /FlateDecode >> stream xÚÍYÝOܸï_‘‡û0#c;¶“Tê[Ø^viá+µÛ­ª0˜¨™$›d ³ý=Çv’IÈ@ؽW•±ÏÇÏçËÔ¹q¨óîm¿ø¯¼qÌàüÝ+æà?˜1ƒÑ™?a—3G…„2üDÎl© ß#¡8L‘ÐSN;ׯþ3B†ÞcÆ|º|µÿ3ìH¨”p.¯Ÿ;>$”ʹœ;Ÿ'ÿšºŠÒIUë¯IVÕQšš™Ï®»ªâò‹ùU¥q1Åzúåò—Ñó‡Â]nÊ€ñ Ù>¡Îþô‹C‰έ^¸ÄÅFÒÔ¹A; Rx„ÁsHŠyŽÏ$0£"!|A|_Âx äBì)4zQÌ Á"\Y‹¨6‹ÐXäøzêz›¬ó•DiGó5þ “E4åtò}Êä$6¾2:ÉËoIvc&ÎŽ./fvk67ƒ‹“£3;g­\íÁOÉ&U\Êq6@9)ólgµYü}Êå$*“è*+4¾†SǼç…DÀÞñ˜·_ÏÍÒžœÒ'4ÍJäì>9æƒuy³ÙFÍLN¹ã2h–fÇTR-3—tRÄå"*Ƹ–Q€¢Þ1çoÿ=rŽâ„+¿Yz—†v–gnQÆPÊïÌL£V`™™:7ߨ(ʼÖ±™0JMW Q³ á8‹Ñ®wµù×Ïòn0Ä=Jh ŽŠ¤áôz^³æµ¾µ»9¨þ=¶>І„39tR"„‹å½“R" ž ûNê®ÈËÚŒ[¤½Ù/¢z±_çûÚG¡¨@ÕeP±}{ ­n{×ÕÓ¶#dÞDålá¦I¶ºãîÌÍ‹úh,=xÀÓj6ÐÓ¾ ßíìµÝkZëmu¼Ï ÑxM $xð<ÏK‚jÏÛ~ C‡×ÚÃJkôþä¹&Jãa¸E¦ô1| cXp{¹v=ÄùìJ0ôo•ößÜ&ó¤ªWu’V}Ê?LQóÜù€"—Ïã?WI£‹ï0p!¸MI›'|š2 3«ÆQÅó¾“ëÇ%ý—…\çiš£Ë»5"ÂT•_×:nE¥]„.2.ÓuÏ™6‡$™ùæå<.ûç^ᱫ$µÑDñÍàD9Q’o§YÃ’%s¶®y6âA}´ùÐE97ÂÀU¹ÚÏr{8—ýuƲ*ÅÜ`°C{ /D{Á½ÒFNX ïÏŽ‡4µB–EªMÕ‰aIÓ÷ûiÊ’Lž[CCŽä{Žà¨|&ˆ‰Ì†Qö0¾tË1êÆä†ìí,£ ½C)ÁH;<-b ˜ûêCfÙ^;6ÞÞ&õÂÂs¸´ØK“« ¸"00> -¼G0`h-£z¶h/¹,e…4ò^ï&¯IøFø,éÿƒhæÎþÓ¢=‰MT‡Õòl=Æf;E7ñ–óùKo“ô¨?ÀÆ®‘Ä…ÊJ€Óp=Fßð~˜£©o³4æhþ(—‹xÄg3Hû¸ºì@X—È\¶$2Æ&16"›ÍIeöÚ …éw’bM3 =7qJKcþÕæk¢Yw¼žœƒ™¹ß+´¼zäžœšÁ¢®‹êõþ~±.’@‰b°VíWùªœÅûÕ~S´÷#ùD~'`#ró×nUèÂnèbçvÍshÙðB¢|ÿÁŒë]Ïo£lx‚?…ƨ){@  x pÌ/€÷-÷ôoÅ;÷á¶ÒàoÇ;x?Àƒìá]Ëû¿‡ù† v†ùshXˆòP ~ý90G6|pé»ÀüÉEq¯É…$Ê–Ä?a5ö´TààºnêºU†Öoɶˆ‹@/Ý×b€RÊݯÅ}@-ø2}-Ná¢ßq¬ãÿëîºß÷Ñ8ïPÞö•‚~è˜ßßõ¬ŽÑ†&¶ÚêeÛ¥x Ûíá±GýXLjˆ$_¬WÏ@=° N OìÙ”‰)Jê¶êIª¼ºßë<´ À:Ùäžiðl~&¼§±)ËÈå6rО$~h]ò‡¼Ž_O]©Øä} 7 ÙäôÂ|?Ž¥Ú SÞ&¡Ø½¬ÌâxY¤¹.CôÆ©È|š¼Ç÷µ…³%þÔ%9z“uR"iÛ¼_e ÷ÿ.¢ÔÒJ2]øñîÞ&ÇËhm6˜ŽŽ0Ư~Ñhd-Üà…/¤ë F¤¼C<úlÆÚW…÷oO/>~=<:;9ýôþèÃå×˃ówG—c}¸\Bµ-­½±Ç ¸Q]Ïëð×óÓÓ1JÀv ¼Ž ²åURå·u v½>9xw1þÆÃÂv%jRSÝ|Îêx¬¼‘L¿N6El™ÏâªÊK{„~ΉÌÛ ´‘~­³MQœÕ5¹íÁ”É<¶]XU-@*÷6Á6‰Ö-Wãe£[“ge^U.ìå ©4/ÌànÌþÚïͶu1Œgy†/c7«R÷'m»ÍXG÷žMã&_¥¶qseÝê2Ÿ'H©kè|Ó½I’ªßš:LÈÑ}°v`BÖo}fãó%„~ßäùœ2t¹úfT/ìSf®€ê—ë½è· î~ÕŠ¾­M¾q9šîw§¾Fîö…pÐöÚhi·KìóoÓËWu× Õl×natEÓIÖ—¿“ËãŠx-„]iºË"yCÇ”à¯{›ÄV+éìõ_`ͪ endstream endobj 123 0 obj << /Type /Page /Contents 124 0 R /Resources 122 0 R /MediaBox [0 0 612 792] /Parent 113 0 R /Annots [ 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R ] >> endobj 114 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [115.407 503.544 135.113 516.037] /Subtype/Link/A<> >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.156 503.544 204.133 516.037] /A << /S /GoTo /D (Hfootnote.3) >> >> endobj 116 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [227.316 503.544 260.86 516.037] /Subtype/Link/A<> >> endobj 117 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [272.148 503.544 315.923 516.037] /Subtype/Link/A<> >> endobj 118 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [187.626 485.611 217.294 496.515] /Subtype/Link/A<> >> endobj 119 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [187.626 467.678 217.294 478.582] /Subtype/Link/A<> >> endobj 120 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [95.91 449.745 128.349 460.649] /Subtype/Link/A<> >> endobj 121 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [95.91 431.813 133.22 442.717] /Subtype/Link/A<> >> endobj 125 0 obj << /D [123 0 R /XYZ 71 757.862 null] >> endobj 35 0 obj << /D [123 0 R /XYZ 72 594.88 null] >> endobj 126 0 obj << /D [123 0 R /XYZ 72 564.337 null] >> endobj 127 0 obj << /D [123 0 R /XYZ 72 418.872 null] >> endobj 128 0 obj << /D [123 0 R /XYZ 72 263.572 null] >> endobj 129 0 obj << /D [123 0 R /XYZ 72 85.817 null] >> endobj 122 0 obj << /Font << /F78 98 0 R /F61 80 0 R /F79 99 0 R /F56 77 0 R /F62 82 0 R /F60 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 134 0 obj << /Length 2416 /Filter /FlateDecode >> stream xÚåY[s›È~ϯàá< ª0b®@ªüàã8Ùì&¯­ÚK%©$“`ÐrìóëO÷ÌŒ²¶äœ—S®„Ñ\>zzº¿î|gáøÎëg~÷Ä¿zá˜ÆùëgÔÁ?è1Ñž¿¡§SGEħð s’k(N¢ txHB)œ:sæÏ~ÁñïIcžÿž=›¾‚õ!‰”ÎlîÌ |A"©œYê|pÿ5ñ”ï»Ùí²ª[Ó~w|òþâÏÏ/OÏÞ¾ÿëÝ鯳ϳãó×§³#ê5ù4û =hG2܉qñò—ó÷ïgGÓÁühçüãó“Ÿ^½=~}qôÑç×É•¸ Õg%°‘F·¾­øÓY_¯ 9ÊúzýðÉwR±B盞y ÿ¬– 甼‚†a€Šr' ÄQ߃ A ¡½ÅŠ?c·‘nÐÁ0¼!tYô‘UxU™¢NFÆ”52%5²‹ê:›xLr7+'Âwoòº*¯³²5IU~ô}¶XÕq›W%v27oÌ`™ei–šv[™g^ΫúÚÌk¯,tQ%ÝrîVsó<;]$ff\Z˜‹·§g ™xœFî_J}·Z™)Il—7™•í£/ýU“— 4?𥨷MÁ"¢„%è]š¬¼1óêàpèJ®§=Aò„’Dúø ?‘f¦uû€E¨5`UO`½ï~»ŠAh!#7^.‹¿|sN¬F6##°Uµ­>^@äTÃAqDáJoý>¦ $àÙV㪎d4‚®a*X£çeš£Áe€¡ ö³:3Í;cN¾{OhoB¥k‡.±c•í4/›6. cÚ¾±IÓ´vêÛ}¡yo¿ð2dBa$pê‡Få3Ð-ÝÖ&q4]5õ=·˜6E¶L.:#è,³¶yôƯÈËÕ-ó¯Z¶šžz÷4‡`¬ƒåDfP*‚}ÂÌh@RýYf;.Ú¬.Á{IŒw%Ñgd /Í[Ó²„ï»3ŠlÄ·)Æy—WK’ÌcŒ¡ £õÌÎó–u…BÝäi¶õÒ:û{•×k¯5¨ ;àßYQáž¾m–ÈùÀS| þÍóŧ1ñ@á”n6’à›žšDñ ÜbB¹= #HˆQt¿Û®ªIàsš×fDøÎæ?Üì°Äp>x”GY­Xa¶©`:X2£<âí÷×k6:a'jŠû¿WÏN¢7êÑÅÃ#ô£î©Çv>ÈõîmUG•ƒ ’ƒV¯£ÙƒÖo)“ìa1O±hßÈÛ£±ÝQÓ’Ú®È{Æ:nB^Šè Ø‹b¨ z²Ø+Dˆåú\_å%äß¶ë45ÝŠ~iÞ´unF{AïÎN»[B:üäáIP„ÜOTA¡ž(<  bl..ïÚ+Ü!¶M ±¼3¿.µfÉ{{Úmgv‡;mõŒµÉðf« †/Ô^ׄ‚‰úPUq\¡¨aˆíÎs{hP¤ ­Ú‡3 ¬U¿1å”-Ô»WlùPƒÜZÙrïxiè–ÅÂóY½¹ ÀŒ0N­Ì«zjitbHºHÀYX{3Ÿxœ+ãzØ–ŠœK·®ªÖŒ-k“'çíÂø+{ìÇ»‰,1kóýŸEµðòÒ Äv®Þ 66°«f½°š›Ék€],‚-ø¬ËGWi5’´2pÐMÒj.Ug×½Mc–L±ÜµòàE>­ò,2ë'ξ ~ôo³5jöƒD“nUõÆ“G.f€É©ÜTôÚc4×"[g‹¢é꯱¶òeÕØò$­žš9 ‰`ì‡ 炨(z öNho ìíjo <ÃÒ’HD(cüÉÂ5‡4ÌìõÉ WF°@fX Z5¦Œsi›ßr´JlåêÚãÑ¿w” 2 4Úx2ŽwüNMuwjË8ù/¬DxÝhä׎ëÔüêîa5VØÇ¢,"Buå6ìhžßŽHÇ´«§E~9]ö|x€©$ d7÷Ï4EÖ99ÚŸþ¡»æZ¢QŒø`{ƒÛ&o3Ïê¨QfÀ²8ží4ñoâà 5K+ó,«v×Ý¢avs}q?``ÿšÂ:Ô ë€W ¢×3ÆÀñäèq'Ù‚lîÊç=Qê¡Ðúr¹Í:Žý0,#Ǹö#–AÙ@ƒð‘ «xžÕ‡°mo‡{³í!–)YÉ"b[#ø¾»¿í›xR}#ËÖg ?ñ‚QŸ¥–¼~…óÁ“pÈ'y«i³ù§ü“^Úc‰@t~MãXа~¨Û—Y¦[jQæxqš¯‡AíõðŒÍcYW_²d=¦?)a«€,·ÙZ`1ã$N³ëÜ °\]¹‰è¹!X9¬m2»&ùZš Ò"KÙö[æš’¶K™{YܺÊLòÍG—.E·RoЇ™÷GÆäöeêÿ­þ º/ã"ÉQtLPÏ&”RWî/8¡ð];vnœ!ÅÆÿ±½&É…îc»ê¤jòëêùX6 U¾ Ý—¯³IˆWN­(²ÂŠÓ¯=2‹}R]/WF ø “®av±/ 9QŠõ¾¡´Ç©¡Û2Ñ5èº0ÿÐÒ´™M«9°—ê¾OÚ9Ï`oXj)š ¬H"Ìø_PÊLæ‘cÀ³ötÃMÃÉDè@,Ú3¶;g@*ä^µíòÅtšÞ’´Ê Ø7ˆ¹˜BŽD}ª¦_HœÞ˜8ÖÖYCô‹°N |Ô1/Ô9ȃŒâ÷ ¤,úüÃÈý ?Y”i†G-w&§v伺ŽKÛk :kŸ( õ4.Æ Î&Tƒ¨ú’©0pÍò&‰ üÚj~u¯GæšÆmnCðΪøŠßJp‚fl˜ò‘ªÂÖ°8Y~Лå Ô`Vzæ¸i á@‚ars+t7Žî6Ò­à¥×ci‹ôû¶Æ¸€­€ïœ¼3³ V¸qÙĉ!=Ý«ù žïb?«àM±î¹¨æ­9ä:³xœ¢µqmmórIÁJÙÄ£æ…LΗû˜œ/¾crTH›ÚM<‚úaäCp0Ïh<2Ø'„éÿ!Ihø endstream endobj 133 0 obj << /Type /Page /Contents 134 0 R /Resources 132 0 R /MediaBox [0 0 612 792] /Parent 113 0 R /Annots [ 130 0 R 131 0 R 137 0 R ] >> endobj 130 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [239.84 140.615 442.19 151.519] /Subtype/Link/A<> >> endobj 131 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [436.499 110.727 540.996 121.631] /Subtype/Link/A<> >> endobj 137 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [95.91 100.71 170.132 109.676] /Subtype/Link/A<> >> endobj 135 0 obj << /D [133 0 R /XYZ 71 757.862 null] >> endobj 136 0 obj << /D [133 0 R /XYZ 72 426.909 null] >> endobj 39 0 obj << /D [133 0 R /XYZ 72 238.494 null] >> endobj 43 0 obj << /D [133 0 R /XYZ 72 101.706 null] >> endobj 132 0 obj << /Font << /F78 98 0 R /F61 80 0 R /F79 99 0 R /F56 77 0 R /F62 82 0 R /F81 100 0 R >> /ProcSet [ /PDF /Text ] >> endobj 158 0 obj << /Length 416 /Filter /FlateDecode >> stream xÚíVÑNÂ0}ßWÜÇ-‘Òvm·>" ÁMÖ !ˆ‚†0ƒ~¾· †c jâK»ÜõžsîmOS @¡æÐüLW@ W>޾b0Ã[ÁvÍ95N±*0A|¡8˜{8(͉ðC0è¸õé`è1é¾z]ÓØ¢*VC½žM¡À%JfÉ%›T¬"™&Z!¶½\Ñ.ŸU›%OP·–žd„ÓÐj Ž"T™ü|åCÙ¨nHûL#š-ë‰öJN­šùhö8 §ÏÞ‚cîqéög£þíxh€a:—˜ˆØR«˜…´5†Ö¼§W½J”4c3®[Ñ…éOû( /îQȓȤåž-ò0ðïÊÔ_Y©·µÊ´rÞ¶{Çv<¦©%O3JØ|+ô›ƒ4)ïÝÂÊeënívp¨À&{.œdï…óï«Û}Ž¢—çsoóîCù}¸kŽŒóä0ü¤ÀìKA |Op7q:]  7,¾áe±hB!#Œ!u.ß_[‚ÆxV£*í kãI endstream endobj 157 0 obj << /Type /Page /Contents 158 0 R /Resources 156 0 R /MediaBox [0 0 612 792] /Parent 113 0 R /Annots [ 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R ] >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [134.814 649.747 141.788 659.934] /A << /S /GoTo /D (page.8) >> >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [154.739 601.084 161.713 611.271] /A << /S /GoTo /D (page.8) >> >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [252.741 589.129 259.715 599.316] /A << /S /GoTo /D (page.8) >> >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.465 577.174 165.439 587.361] /A << /S /GoTo /D (page.8) >> >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [168.428 577.174 175.402 587.361] /A << /S /GoTo /D (page.9) >> >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.945 565.219 154.919 575.406] /A << /S /GoTo /D (page.8) >> >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [157.907 565.219 164.881 575.406] /A << /S /GoTo /D (page.9) >> >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [141.42 553.264 148.393 563.45] /A << /S /GoTo /D (page.8) >> >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.945 541.309 154.919 551.495] /A << /S /GoTo /D (page.8) >> >> endobj 147 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.262 529.353 158.236 539.54] /A << /S /GoTo /D (page.9) >> >> endobj 148 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [232.816 492.646 239.79 502.832] /A << /S /GoTo /D (page.8) >> >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.54 455.938 145.514 466.125] /A << /S /GoTo /D (page.8) >> >> endobj 150 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [148.503 455.938 155.477 466.125] /A << /S /GoTo /D (page.9) >> >> endobj 151 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.02 443.983 134.993 454.17] /A << /S /GoTo /D (page.8) >> >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [137.982 443.983 144.956 454.17] /A << /S /GoTo /D (page.9) >> >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.494 406.243 128.468 416.43] /A << /S /GoTo /D (page.8) >> >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.02 394.288 134.993 404.475] /A << /S /GoTo /D (page.8) >> >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [131.337 382.333 138.311 392.52] /A << /S /GoTo /D (page.9) >> >> endobj 159 0 obj << /D [157 0 R /XYZ 71 757.862 null] >> endobj 156 0 obj << /Font << /F56 77 0 R /F89 160 0 R /F61 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 162 0 obj [667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667] endobj 163 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 164 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 165 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 166 0 obj [500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj 167 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350] endobj 168 0 obj [333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] endobj 169 0 obj [278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556] endobj 170 0 obj [278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556] endobj 171 0 obj << /Length1 1606 /Length2 8249 /Length3 0 /Length 9068 /Filter /FlateDecode >> stream xÚ­teTœ[“5îÁ¥ƒww× !Hpèn ±†¦q‚CÐàîšàšà®Áƒw‚; ¹wfÞY÷›_3ïg­§äìÚU»Îaz®­Ë) ‚Z• NpN^.1€&ÄÑÊÍUê¤Î)užœ‚XLLò0°%uR°„ƒÅ`@ ðñxEEE±˜òPg/ÄÆ`Ñ{eÀÊÎÎñ/ÏŸ€•×FžNºBlœ/ž~ÜÁPgG°ü â}P ÀmÁkˆ ¯¥ýFUSÀ¢¬©P;a–m7+ ‚\Á¬k( àð·B@?­¹r=aɺ,®Î` äéØvþâ8ƒaŽW×§Ä`³t‚?Í@œ€n ?žüÖп9àOŽO±'0m¨+܃8ÃOUµ”þæ ·µ„ÿ©í y  ÖO™ (ÐíOKÅž`ž¢pKˆ“+ö„ÿ©e€ ®Î–^OµŸÀœa¿h¸¹BœlþÅ€ÛXÂ@`W×'˜'ì?ÓùWŸ€ÿÖ½¥³³ƒ×_§¡eýÜì`Í…ÅË÷TªmqÂâþ³(ªNÖP/Ïß~›óÆÜÁ°¿ÄòggXŸHX‚ N^Ø‹[ * `ùß©Ìõïùß ñ¿Eà‹¼ÿ7qÿ©Ñ»Äÿ×ûüOh%7MKǧøû<½0P€:àÏóÿåZ:B¼þ‡ì&€ÿfø?¨Â-ŸÆ ëdó$ÏßNˆ«Ä Ò†À¶kK‡§ýå×sa'ð“–ÀÉËÃóØk[ÐÞéÏÐÿ@ÿdþ$Ï_¼¹Uuµ”e•Ùÿùšþ•¥ý¤:üµ—ó±ÿèC ú/㆜ÔàÃ)Ààä‰ðD„yßþÕþ‚áý—­a ‡A<ÆO-óðþÕø|ÿ²Lÿ£è„‚þl‰.ÜÒ ô´XÿåøºÁ`OzþuןþOû¯ƒ=Á@¬…9(P<Ä.-3^C–;0ª`ÜÓÅ‹<êü¡þuQA@´Ó?-|U´Üâ¡:”«a\ìw³×ì¾ó¯M5¶­¡.RæÎðÏ|ê· ¬Ý„Ë/Z…Ù·‚¸Í>à¦DûϨÿ@1âÑßZÕyeVò€F3ÞÊÃ8¾f `p/ a¼rÆó¦ÖÅ>k#h@ ª)Ü?x‘¸{}ÅÜ÷ep ¿óµ{“Š='“IÜ’Ì/yÿyÜËvQüzç.솷ÁÖõ%¶]wx£Šû°×äˆ)²K° ¶§w¨aü,§½Õˆ³.“—ñÝuSÏoåG6:“¬GOZŸŠÖÊWY©F䨖˜7WKâA$µìîDUÓÅ]28á;|üät†½ç펮Q„Ïöérøep7cРaUëë…”BJ~„@Å¡S' wÇ¢½±¡È ¯ \f†ÔÒd:5ÏèH-¡d×Þ.%´ðas„‡ß÷bP‹bÙ¦PwË_¦ašì†§K€-—ûЛe³!‡½÷dégêÕ -‡£tÀ‚dÜÞZ_•‰h?ìp¢€êYGp}ZÎ2ÐÐg0I.ç™L­É>//{ûeèî>—pÑ£g<7Ü"î2šv{øE:öNÒï"4îµ€²V«ïEƒ8…˜®ßot‡¥L4Š“ÐK·âæÀ¡õñÃMéjDþ‡ÈF~Ùˆ˜yeGç‚RßXé*‚Ò4”ð»ØS41…~§çí*ÊŸäªQÆ»'gÙi× Ä§ÍH¹9¾ž1&áú}j .9¾bÔGm¥EÑ…¨]À^¡.Лßñe¶ÏˆrŽÄTØáE­£Æ{¸ùq÷¾‘Ix%þ…îð°ŠÙØ\xiawªàޤ"&ûqâ¹ÿµˆ–LŽýD—²ý§±Ãæ,¹—•lî^Ø­im `Kþ%û¤A{%γé®[ºYŽ•w^å¬â?kJ7º£CßDÊÛãñˆ ³2å(}o±0æ {.‹!fS@<¾níîÿD6—ûÞ$U»ïËXâP Gl¡§öÐ÷ø² .ŒÕ,¢7¦(cbDL?Ê,!o&iJŽb²ãŒ4þ0Œû£ž³Ñ¦`ý–«6» Ÿ.Ý`˜žD¹HýÓ·lüMµØu¾†¶»…R,×-"Èaô‹±íôðiÚÔ·fã ýó ¿Övnµ™HJŸf‘æ˜ ]Šo—’å·ø¬J÷~è¨D¥ßä¤Jˆ²ñº¨~ýjYߨ~K¢ù*þN†l¾¹qÕ„Àw3 äoO@ä»`ç,¶LÖ"»x‰ª ¢œwÂÝPïIýhFóL»xF°ª½˜¶Œƒ™hy–ŸH¼÷n5íAÁIwl©sßë@ë—tõŒúÌ-ž@µ{1­êtÚÛ­’…¨Š|ñ±vÒ-WÈê`V6C)~­ÿéeGA-yŸ0±ÁíÑé)XÀs*þÒìþ5Û=¨výM©\SQS—;Ã’D ¬¬Ux%U‰DÖ-‡[›t r}è¶`ñ=y¨‡ÙÄâgÁî¿*2ä â:^Ò‰þº§ÔNIYýL„Ï[ç\!{Dsr^"Z‰sÅ­\Ï¿)¹¯^•Ì#ü)"ãÚqù¬è‡ãV·]Yòz±wWvrµ}úìQcz'Âáçþ®ó(#ÿ=¦¥íˆ£‚âN™tÈ’¿6íhµr»)õ‹;!óƒ#$ñEΧy¼c;æ‡h­ž™½>Õ5eÓ6„”Ü×wF/foœ×åOj¨_¿SêŠöתÀIk¨eÎ/cÿ‘’èÚ…ÌsK`µIŶrpdÀfìé8úã‚­þ]n†‘¬/#¢B›úûÊ ‘M$½À¦¶¿uÔ3¿× ‹„eø5ò{ä L‚[èäí®½ú’{†DòLP_®ìø\Wo†œ¢¢7>ޱW$ÜxKêæ›OÄ_h;`M£Ø4åóFß,º£)2éÍeæäaE1ãˆb¢‚cüàˆâÝœš‚šŠ- ÙAæXð½IŸ›Ö:8&\ðY$ûêF“.m°@,%ÒÉOÞ°:ÍGa‰ì Ôe>²!û¶¯¢PÃCLú3•fŵõxýU%ž‹+ë7A]ãŸxû²F}YAMWs0Ó¡în_̼òÀ¡ÝåÙG¿¼q®dƒ¼EÿtïOHŒLœú„ù)—Á„{z@šÏ*8룕«§|Ib?õ~!]ýâdWú|ïˆês®U¿Ï!SéuëÄšÑ{eUü“¢[Ûh$Pú¸.„È ¨îr£–¹·ÇþVL¦XáY³„Ír‘þZÓkÑ“åúÅ ºi©Õe,áßÄàú4Ӟŷ~¶–‰ÂäÆ+]xÖ]³Z‰µÅu–ù‰sšb‡ã!_Ïf’B¢å—’-6í7¢ð¥Ök÷.M °Oõ!uò<ø‡þóYB3;BYÂMîIJSîbt× #Ó}ýI·Óã{Bn,ÜþÏR!Ý^¥Õ™*ž ¹‚}µác;sS3› § mšûcÑÓÃ2žŠ«øxÇ­"Iôi:AÝû«ÓI’ø¥Ïãñ š*Ú—ChÆÕ¢ÒwÍŒ@=¯‰W¢u¹Lú둜ǟ…IèÇ&a@“Yçì^±á¢p¶ŽUFþ¾·F»;n­¼"ÃNòö’gšo*…‰}Tù<]ö.,é#EÂÍ·ŽQ5Œ¶Dbu]mÙ3æ† D~Ù§Om½çÃ@å]@s+JN••LÞGÖö±Äïo¸+G/K½"$Bý2?\ÝØÐ¢"à-N¡»+™âü©a!Ím2(üºA®ÎCØçKŸ 1¦îì¶Ëw] ˽`>ŸäMäÀÉQ³{î‘n -î¸Íò±Ñ¡ŠV¥µYÛ‘¡{û¸Œ¯Ù’;À´y[ ´ßr‹P³°ÂB­WÚ~{Ê?>Š»O¾j„)½;âíaKä4YÙ/Hª{‹¼IѳÃâaßAb'‡mΧŒÞ“óH÷fÀz:h³F˜ªqLbþ˜Äùƒ–Zwy²g>±=œ[кKËmòtð)uHéß›–»Älʺ°á J³Ëp87ºÍÊ: |<þÀô.kxá“Þ°Š}·á+yЦØ?QUkª™|̽ê¨UÊB¿Ð:‰‘d&^¯ ÍÔXçšï×ÅŠªl]ÇÀøŸ'rÅ+ 8¡òƒjq.›_МÎ×”†g;T” t²Ð»}¹\wMósš”sQ(Ž_ë´ˆº “œžìéyÈY­Eiÿ¼æf¯ÿôã4!º5<7º™®Ë¦e¨é%'UÐ:p.Ä2dF*½/¾£³,ò¦ËèU™Ô¤_9¥PÝàP)w7Õr/¹ˆ”Áÿ—·á>Ž·èJÙ#ü<̤=û¡¸kñ=¿®÷Œó®bbÀ<6–*†Ïº(ýi±Àó‹rÿ´ÀdãïXÓ¿VéÕ ”O°ÂÖúQß#¸ð•¤Eî!—Œ¹GÊ%IÜ{HI«ƒŽÚƒ·k=LÖò²MX½Š¢1p%Å<üÙjÆg·w¦,Êvü/ÖmìünQj(,Ç ‹±‹Zä…00âö¨¸šr‘ãƒ:¢úÚ·ë"›#ì­=éÖïSjS ·ûª-p¹Íý¾é¬ Ó“†Ö¿ieT{Ð|¯ú ­~hQo•ðÚ®I$ÀÆL?+¥§6(É/‰âqe „ÉÐf”ªîMcmb*h“ëH8(ÉœHoäcI·¶oç4Üj ¶nËIRâ«Þ‚,tJ ¢yÔ¹^#Lâ¾$î uýø8æxŸuíwâ«pu±i6ÑË5´Óσ§ý›hù•Åk>r@uxL}D›ÕQ9íLVN¬µù>#7‹hïP8;¡°‘‚ò8µÎ1þ’œ“ÀŽU¾WêŽÑ ¡ï¦­Á»G÷cÇÚó\ì°@á@åÔ™ÀŒMW²ê+#Œ â_ÆÓûä‡cÜÓoJpÞ ñq̱fÒŽ£ÄR¤Xv#·=+Öé‹õB‘ /±åÚTðìr%Ö(&"å!96µvH#+ð‹ #­Ö:“= ÔO/‹éi»klÐãOõÒ||œ+ÁÀ¾®(ñ{rÑ›íÄŠ…yÊÞOÛ›†ÄÃær]r8ê–8o¨>}™°PÓ`>6,¯4Üóh¦fìRGW¼§¢¬Â“ÿQ?Wȵfl‰c†—BHÛÂÓèPHY_űÍáÛª{Öf§Ão=ã¨ð"RµÃ_—#ï Ðì—™aÖÂëÂ5{á(íá½É^ëÀ—9ÿá;IH3ŽùÏ¥¬)rÌÉëhq¤ö ÐRj EÛœ>-™ðÁN¯¿}è$JÅ §9çU%î¥öwXÔƒk®è´7Ӥ¦ÉɯÙ$ÏÞ$êØZE7*Í`¢RÍî?öŽt²°ý\`³#S`{ÿŽ-ò%+Û¦×R¯/“ˆûñTQ¼Ov5uôÕ3ð7kÍÆùÇÆºHa™PÉg Ì”ô„ ô¨;ox$š­£ ÊåÙ *[(ú*xµ™[—°Í¾'‰Ý>`ʶü°Y¢#íÊ–·Ã6 Q™”à °Š·A 1Ô|õuð:І°r¾ª!ù¼yÉÁ”ùVœbM6‚ª+XME¶X¢»sv/Y’߯ŭM™ Ei`ùd‹:DVlûê?:DëQˆ}«?úžïD7¡ô•±? ô-*§sõ±I‰á‹*ziµäŸ´•If[E¼¼¢QI·H_QîÇß'K !­L¹¡Í\CŠ~÷Ž}i²HòU~*ªJ”V>®«kã{[{ýž!ÝùeBë][X´-ŒÃK¶¼Úh”Åðé·÷x‡I‹bl^rçPÎÝü®C8SÍ(§euCwšj_6ˆ?Š«¡Dà|­úø.ã#é^µ«W“Ãk/éWYZ¾,Uc²ØþR« A…Y >m/Í¥£Ï{°Þ#‰­©ÅŸÒÔ–Õ†çÖØïç¯æ™ 4 —®(‰×µö=F¦Òé×ã>6Ͳt ×8ú>(:™tÚ÷þð!ßÓ>)]µa9,¬(gÍ)÷Åë¿“nŒ³ x6Üó›­°˜®Y­ ÅEJœÄû by‡ÀJ×”ÐÞuOÿÂÞ„Y¨;½äzUлØò1Ö äEgÛ'™ó5þs£mëD¾:z›Ò³¤žUgÜqy+ƒvæÅ›  ñµS îð²˜þ5ûÍXB÷cÜ,™IÒÚö‚t·Å@cݯr øúG{y.L–:‹ ¼¨„x”ì|~/¯Eq«´`ƒ²”8-:ÕŸü©¶2EóÕÈ}Ìç™A('ýS{P… šçˆ*|$ETqeÚS€ŠÂÒRµûsX‚ÐÆW2äïËg´‰ ÉáAàm6Ïí â#SY6Û:äãkcÚäÛÞ=Ø[÷!¢sëJgá‡i®p[ìý‡ìYLg<‰ST gº0q;¶ Q±Éí´•þ2Q·mq—P‡Çô7‡Ñ'/W6¶WŒÁ"zëqR©^W‡n)C«ïñ›Ëˆ“¢/„ðVñ*j¦u´Âc…ì£58Ý7>rT¶ôµ#o_uT¸žù‡±} =Ô—{œ5)27,ǰÍÅ;Ä®æzóæãÁRÁzï¢ÄûnœÏ+ØùLé°Ö—ݱ¼âãoüŒËü5WÜEÀz)¾øE”œcñœÄ]$mn„!÷Ò„-ã ¬çaßýµˆZŸŽ‹ ˜ñb:3šÜJ-–õ¬s­¼`qòh[ò©ç»ÉêêœÖNA’}O2ÒWÜ_’VÃדÇȃ®¾¿xl—)ûñt¬Æ®BAM$<0×+‹Ã¤h"•ñ|Æ!„yUù苳>«Ü>æ%Žú× ÇA{óLœgüG/§U‡Ugcè+ÑnùõR k: Î-»f Ž&~ úÆ´áù»ƒf G6©«Y÷ÎG²iøNÑÍí–ÃS_µ]Õ  pŒ ÉtjYoŠÛ;³P=†¼GÎ…¥zºdŒø÷¡ð ÿ sD¨Œ5‹ÎR`‘àÖÎÍ#0Ÿ…ôSÃÝuT£Û»|cÏÐîš™½ýp„dUØgÙ+”;™k¦½AX¨JüÒ&èÕ\xÑ/v¿£8?v<61tiŽÐ%KP°²‰ý¨LòxµömÆW;˜.ÄçÛðv ßÞ¶óÂ@RÙžSQ_NÇï:Æ/©y£¬Ý²Æ*„ߊø€)B¶¼]å $ ã¹²bÄ&„ #Ï=–1{»%À¥¬†SìÀ2ðáî&+Œ”…#d  ZG‚K€„`zƒwô´Òq…5_®1Fµñ)‘ŒŒå˜˜÷­TrÞ/‘Qas¼%ÆåUR„cQØœjX>RGP ÞPÔ¿ iŽ8„¯ \çô[ αS ìÓ’„ˆc‹ÏQò—·Ý›Ýì–JqO±›Û¿š»a&ã Må'Ö@aáFNýF»ä=TÈœÊùa´üþBÉ@N4'×wêÑ%‹„9ðuH‹SÀ‡(–è*#~Üh­Œ‹xÕî:GŒˆ¦ø ÄF5¼7Ž‚.=Ïs<ôÞú¿"/¬²ùV¦q,@x½%-Ó<ÉÂŽÑxFÏ*q× pÍÚ/JñÀúŠ0ƒAb\½© óÁ™:ÞTÝx˜ÌËáLú¢*¢è¨.8rB/ò: –&½GŸªO ÓÈjïÿ9]¥˜`Ac´ò\$Á=^YºñZ¾X#^Lkd«y!a¹PÙŽÑ=V'B;—iV4!‹j‡¶‡ÆW$åKªw¶È{nUJãJ!(ûP×»@ÏÏ£Ž>° BóÚ’ìþ^K§I¤Ç¬¿ƒÚаV¦"ÔŒäyHS)ÏT˜`lÂäÉ{¦xÖ§ïWUßÿÄx÷.Œ £nÁå³BfžFâkÖÑôÏù¨4À«á8žgézfÀ—¯Nšš¤ŽM†uê@ˆ}Æm1›_ë¶e™K_ìËÚs§2cÜt´„\b&²é{ÕŽ‚{÷2Õ¤–Þ÷Ûwœ5“}ÜÝöæ“3æûŽd2`-o{œêw+ˆ»V}Y"(3R0T@*¾(çSì`šFtŸÔ55@#ùê•íû·Ö*¼úoç)vC˜b÷<4ý8ÜÚ.Hñy^y¢™3³Ã²Ó‡½W·ö€Û'¸§››*ÊSRñU¢„+ž´Å0¹Ö=Αž)¹ç]¡V+2D-ÇüK®†²Âàðœ½_w„Åòs‚QeÐÇ3¬V è¾/fe„¶Êq3Ƚ°¡@‡–^òAó–ê¥Ü”4 ÇüÙ¬]A¥ˆœÄ¶*°FŸ$@=Ap=Ö4ñœˆ»ƒ¬‹¡#”…!èžüõ:¯w«åÂYº ÷Æ,nýÙµÛÄÒu1L¶·Æ0øw£·.—eå‘ïÌb…éør<ËËXüßæž¤g’*rÆ·@ó&>†Qmj¢Ò—ù˜\NŠ·Ip—QÌìôñ¸’ß{ÙŒ…‹Nbœû¤RׇË)‚·Ùf|ý8Ì>]{|äš ‹~й6UyÖäˆC8¢-‹ýýèL³‚Ÿì£þÇ/k´_"”•y©C;«GG¬ŽÐæ°«ËÞ,‘³ž‹wÃQ]0übÁ#¤mÒm)ãTúÕ»)öÔ.iá4&TÓÝå‹õr³v„”e?‚ÐÚYM8KÜ·;<ŠØßÃÁ‚Î=%Î MX —ýEñ…”Ÿ¾É9#]@¦ÜswŒ1‘)³þÒÛœCüVJúEFPç‹÷æL¬¬æÌu3r—lÝש±fBVä}º/È+JB?æ õr~ØvO2ÓOàÿÉÈ¡:ÆPx‹mã% O7¼ åêf6œ’ò¢#½.75½\L›Ê噸*šš(`Ñ¿¥Uú‰°„g—$RÇšMtlloÍ¡KT?:¬+»ªdêdjÈ õþîJ…7¸:y·ž¯¾sòˆŸìY©q™–óÄõa"iÖÂù1ÕI†}ÚŽôD„êç’D’«©O‘Ôjhx¨å¼M‡Õ}Ÿ·†Çl#~ߤûü®à£ØG â€1Úéµöyˆ‚ïÄRÓþÎüµKSV[$Igó~¨H1!ëÞL>µeùA¸ðµ¡@åIE°Ö¡e}¤ùvCÀ/æ|#!iõòK£ª€ø$½’"¯¸"çÐDÓ afmnG¼ƒ,F…£æËZÏ:ݺÁþ—Ƕçõü/ ›Ûý¦Z”Äz²æ|—6Ê÷ÆŽžÄ™˜ÝÕÓ߇qoiUmØVºçŒS¿¬/’L›™Uœr“wd 4ËKiH±¬ì±‘ÓœüÂaºÑêàvþ­_+F¦áá¬f½Õ‹ ýXáÏvÊÒ ÃUóòQYËþ®ìn‡R2|ÕQ*Aiµ%Þ$Ól½¤‡Š‡jLŸØ%Óç…þS«€„½y›ñ³¢D$·fNÕæ©diL,ØÕŠ3“ˆqWe4®Ð…cçF6'Mn<,“Gm z&¢‘ëãd]Yµ@ýÁ©€ÆŒî•0{Ôâ4º›ô¤Œü¸xaƒKØ`ʼë¹2c⮺ÔÜ“Ñ~uXáQjw)ÔQ£Á'ÀŒÛÂC&LõÛk»Œ"î̶ Vòt“OM¦”ºÆçó ÈHÓ—éŸ8½ƒ,Döy°3oj›ÄÚŒ²Þº•$IRØÉ’q¦«Õµ"1Õ ³“ßíƒJÛpșق‚ÆŠÄ#ui™zФgÜ ¤1*¥¡4sH™zz’J}:Ù—å(q¼`®>U $1 Xû,Îàñì;4ë ±¼Oî1C¼’í¡ç§3Ô‚rlëÃÝß6c-'+¢k+Ç´œR]ªÌ­•tƒ®|uYîà/$Ýó«gôhÐ’8ƒ&—¿z…ÚÆžäœ6E‰÷wÖgä_Œ%ˆF]ê`~k_Ì­+ÿž}j…KÙMI*Ça&ì8¢ÕáógKQ´²3ÑÓ"¨ž¤pe#¹Ù> ˜-eÜu”§28ÝÁ ‹™¤GµXÍù^JmûUí­Q{ûC†Õú–¢™µBåXYü³‘_ΪºÃŒò·xkçÏv?ÎÎPmðS›÷óÙ¯²œ# å(­Ÿö˜R+ÔÇ/êÞ1{Õ"D:çgeîÅ6Vu¤mŸÝrøá“foé KX¹a׆þI›<ú@Q†=ŒŠAC½²C×ìÒó}~ëœóVZ‚ãè[aq‡Hð¨;×ì·Dkr8ùq"S€z¾5|Ý’«ÍP/ƒˆw5Þ0ÆbÄ'õ.´„s%Æv€v5ªºäá(ƒ§ö™^³%{.0µ¦­Ot-Ø/¸žWïpÝ„“•Ø*µÆ'[t+©\Ÿšç"Î^_ôÙ~•âåäÐMs S°æµÓžÎ½™ôy.yM„• þ¨•:cK”7òJ|s'zVÏy4«Ô³D ä´BÓµÑåsåþ’Ò{1¨9«“õp܇ ¦w£É5iV\µ…Š$×–ˆØä|ÃÒH ¤°hÈÈ"@ÚìÕéë±mšƒdÔðžrixÊÇYtÞÞî6Ü…䯙0.4#JFï.F]Ü/¾”õ=³7Ù8ýe‘äw@Š–ýÌrÑ#b¹û uÝî¹8¦,*ýǰÏ\,—÷l”WVH¹ÛC¢]Ï‹ÈçË¿J®ð¡¿¹Ê„ªK|GÐC›ùߦ ‘Ðýez²^Ë螥²³ûbu5X‹ÄCΑ®á%»'/j2—²‘Ž4‘Ú8ÿör„xnŒ*†ÑHp­…0±Ð“^tó×Wm-LAå‹üðâ2…övüeíø©5>üñíªmeÈ޽Y(1É5ˆ¹f‰Hû‘¸Zæ·c Ó"¿ˆÿÁsÕ_Úø æÎ·‰}"§…M7ævÃNÔ‡{YºE<ÿ;W endstream endobj 172 0 obj << /Type /FontDescriptor /FontName /ISOGAG+NimbusMonL-Bold /Flags 4 /FontBBox [-43 -278 681 871] /Ascent 623 /CapHeight 552 /Descent -126 /ItalicAngle 0 /StemV 101 /XHeight 439 /CharSet (/a/c/d/e/f/four/g/i/l/m/n/o/p/r/s/t/u/underscore/v/w/x/y) /FontFile 171 0 R >> endobj 173 0 obj << /Length1 1612 /Length2 17701 /Length3 0 /Length 18541 /Filter /FlateDecode >> stream xÚ¬»cx¥_³&ÛfgǶm§cvŒ«c³cÛ¶mÛ¶m;餓éßûΙ3×ùÏÿËÌù°¯k¯ªZwÝUw­õìçÃ&'VT¡6±3JØÙ:Ñ330ñä-lŒœ¿ÛÙÊÑ+Íœìpää¢@C' ;[1C' @hXXÌÜÜÜpäQ;{w 3s'•š²5--ÝZþ ¹ÿ‡çïNG 3[Åß/.@k;{ ­Ó_ˆÿë*@ ÀÉ0µ°Dµ¤å%T’òjI -ÐÁРèldma ³0Ú:©¦vë/Æv¶&ÿ”æÈðKØ`p´[üÝt3Úÿã¢Øl,ÿ~X8Ì mþöÀÉ`aklílò¿vS»²w°ûaó×÷LÑÎÑÉÑØÁÂÞ ð7«¢˜Ä¿y:™:ý“ÛÑâ¯`gú7ÒÄÎØùŸ’þåû ó×ëdhaëpº9ý“Ë0±p´·6tÿ›û/˜½ƒÅ¿h8;ZØšý':€ÐÌÐÁÄèèøæ/ö?ÝùÏ:ÿ[õ†ööÖîÿÚm÷¯¨ÿÅÁÂÉhmÊÇÌò7§±ÓßÜf¶pŒÿ Š´­©€™éßvgûÿð¹þÕ ªf†ú/ C;[kw€ ÐŽQÞÎéoJÕÿÊ ÿ}"ÿ7Hüß"ð‹¼ÿoâþWþ·Cüÿzžÿ+´„³µµ¼¡Íßø÷ø{ÃØäÿÜ1Ö†ÿŸpC k÷ÿÆÿ¨ü7Éÿi'ÿͶ5û+Ó¿Žn@E 'cs€©¡õßNýË®fkt°¶°þUô_ÍÐ331ýŸª¹…±•í?­gÿ· hkò_Éÿé_Ô5ÄU¿+Óþ×;õ_QеwRu·ÿKì–òÝÎä-þÁ±sxÒÿ=ô,¬œŽ¿ ¹˜™½ÿÙþÃüŸëï†Nní¿%31ÿ«ðÿùùÏ•î·5¶3ùgVTœ mMþŽ×ÿ2üã6vvpø«ê¿Nüß‚ÿcý¯AÝ€ÆpkËvƼ¿,S3Òœj±s†'Å´û{™Á‡ƒìKT óýªíz|SCw¹+ >j‚§y>ÛÜ—ÎíÿÊÐöbYSö$¯ó¼I©ûòQ·(:8iõJÓ.4"=oåv ~p0©íM*)ë@Nw°:ÀܼPû‘ºäûa=Û#ù§ÔÇ`v¢4‚ Õœ_P$œ¾Ç‰‹º{`Ó{²°ôÉߟXgâJ…qÉgù5-×Svü|TåÒ¥;À4¶;Ùh»Ê³¤”w¦,Š;etöÍÛå8Ô¡10¶|c©¢~¶y¨Q-²ŽævÛ%ÑH^ÿ(Ã0+oœÎö+qðW¯›Ä_Ý € ²K ã§‘ êÝ©oäE- ûXŠ*¨^®<_.v‡õ^еŽóx^;ªe±F’?¼¿X ÄjØEú©Ðî¤î¥Þ7‘œZn3yHDÉžö¸ñkDM#›«tˆø·¢%–ÝD>$?Fß—±½,w@tvá½+–.Äd3‘Ðâ-T¯‘k¹5åzÐÛÙ>„êO­½ñ °Ê'Øx7í(×—ÂRuýð ]áÖæ£4‘x¸­é?A3aÐnubu Y“ƒ¹2¢ÖÍ"Á¦BíW|u=Xèƒfü¬yålQùÒ`£wç,–6„”AÇT/•²“OG6²‹(ƒw…dƒÞ8$î¬G®GÉ7¤ŸS¿éeEóЈ’†äe3åS°Dê©;^Œ®ýM}ÓÌ»Ö?BB­‹jÍ£ìßS®]©”3ä‘u>ûF§m‡;ÞÛÒY—Úʳ$` ®n“md|•Û–V9ªÀˆ1ÝÌ `3>d+fí½¾¥x©@ê¹ePn<'W;yÌEh ²úA^)p¾UÏhû7`Im¯œ°Ü RÜ!­)ž´§½4§qÕ =/‰6·Æ:%ryïø‡³rË3€Ä 8Iò;º‡ˆ~+w|zº»©Í™—“…èü¹ýˆ3;AÂ3ßôþ³·šåFþܨÕëyÒ‰…ºp‡¿Ñ(‰è˜°‹-ŽÀÕ^÷vÛÅéP¸ÀœIÌÖhLòreE»?® ×4› éYÿÕÏ•cVRÈEHPà¾ì…Ò§6F«U†$}ÔFfŸ$ùó’,3ˆ-•½`ßG⩳¿mpÁ·mõÜɉÖe:…L¢F6ŸÿuÔlûbéD1Xú» » EÅ~¦2”ÞZpDÙµhgætníÀ,NNsÉÈùÃ`øÇw µXél¼¶Üî6äÆ)\XÁ`Œ‡õ&’ü‰ ø@,5øìD 4#^zµ¡Ü6¡Ncé-MÃôi¸Àéýõƒ¼Î/B!¦GAÖ×/Ijµq^§ñcG%äe¦÷×.æˆ}àU”¯*¡9+„íd1ò”øf(vçZï7 {³7æ _BöëçdIͦâ=—5ªöˆÍTæ¼]„x³4®ñëÉH¤Ì’zmA(Ã-Ÿ#¬’}lk¥ßÇúv…dU·¶8p—ýÎ}`b5ôQ©[<_`œ$èm,ܘ±ÞÇ䜇¡}ú󆋸WÓx“ài,¡S­”ä$úØ¿.ôèË ’î!fò3wËcÂæ+ª?³ u¢¬ƒ†LZøØ)’jÒ6¹ ¦1z çv^bL‘l6:¶þ@ÜÞÉéϺc×a3©%Ós˜ÿX(†T¸ Ù«ÍÅY1#7>„­ÂCôŸ-yVŠ5¹ŒÇ•R=)³]éNde vâf%¯…PË]äcÔŽþ8r›Zð“™våÃ1A•$¦Yˆ˜¥CaOŠz”Ó³bE(‚ÆòDù9¯¾%^{]â-`v$„º¶ù:g+ó\oѾ;±ãב×4N•ë™x ùGÊy-˶…-±X=uY´Þë8ä*»Å²§É 4!H €Ðµ×1h¬ßÝ‹%àÀéSïüø—áR0¿¶•5„É€ÜEâ¤`ŸÚÂ×Îëà Æ$¥/·ÊušjŽ)…%!öd–› [‚z!>†er4ð.”g¿mAaæ5uÚsºïÙënü- «Êtá€cââGáÒ¯{LqúÕ¬–­§Z41…SÿxüŠ´(ýÞö•Ìç)óV¸‚G~±#é¨ É†5(îÔ1—ÂxŒnÈ7Ñô d¤ÒëâÙ-áW-NíäŠØšI±¢>—­§(ù°éS¯ð‘H…!Ý,ÓÐ!¦*ˆpÎ|ƒIs°Æª‹ í Õ\¬2ù®®Ç|PöÛ>é©ÑïDƬì×Pšx\ø! ‹‚ßÖ„˜ø=BùýÓ"• µCãÅ;’xE«ð6œŽb*š‹Ê'̜߃ð`G{WÉbkü³0›G[nSǪ!Ñde¨Y7ôà·Ô+a´VpÞ’.<‘§ª˜\%NgVçÞYÑ :Â`( k¥:3YÇ¿ Ï[¦§2*“E,+Ñ&©ÝŒîÈKâ¬@AóÞ”­”Τrƒ–Ï8Í0?RÄHË*/ k64&"Ú†å‰È8I0tæOTPjvk‡êr²«û'2ssè!0\ÏW‚p˜T»àÙ‰^æ¡h)ÍA.«©ôÌqj@luQeÌã½Z¶,ÏtŒ¦úžW+w^éààÏ®~ «&!äÃŒ'6¼9£í^N.ñÍ—~ùpù!O4 f%Õ£r5h‹^h¯ôƒ–—AfñùHc†ápeÈpyZ`èøÒ<ëF s½uµAŒlYÊWöjÒB–GÐpÎNœ:Ýû¼%Ëý‰(€ §àX;´ ­CúÑ7¡Tgžc¢ ߨ#›i°<êûì¹6ªy‚þ-ñaû‡ïÄ!*·[4söImÆÕ俦&Àví]¸î &"[õK­}ÃÔ»ôÖÉËØï䟢¼’MOäÍökÎ1¬$p UIS]Q="}߆+’¬zLkO ø¼3‡­ÀnÖˆ¦èõÒ|˜x|Ô,î·Ý¢…92˜-–\o$¸ëÞ â[Ø[æ(twN´Ê|æk™o4x¤N/švM変¡M*­sÏ©½­OŠ|ÛþüUü%ýß¹–¯;ŠgCøš;Ñ…%™YTc¡šVFÙQp &—ÌF§s’±xë/^Aźú‹]«ŒÐHGsPòÔwEàìâ™Ó8> “NcÒ‘î‰Ì:NŒå¤V?XQ™ _Øê† ÚÍï'†£šÉjTÔG*°¾.}ª½çbIo2%k^©ZÌGß_ùÄ"a¡yŸˆ>ÉÎv_Ã^d'G¦ŠÝ – ©[nÇ”ul£¤Ì`­ã_4!‘Âb»5íôóPlzòÞzõr¸KÉŸ¹lò¥ìn]J±i0A-JºFÊÝb»”=\JîÐPª{§0«K˜½¬q?J9[{›%±¾é°Ð•”1@tIEçÎÇËÈú²—BõahY M!W»׃ Còßh,ƾʪղ˜DWÐw5ç¨Çà aèû:`h2ÖäŽò±!FI$zjÊcH»a?J¨) DêfcÍÐ@a|‰Ë÷™'¡è¿„çá%ΞڇÁgH?°¤ù¥Bͦ‰*š@\bxªïoªË¿æVÅ&RCêQM¶ðµá "ô¸õDò°.ðªÊ¼îK6qU,Øàj3ä}Y^— ‘ã…­òlƒ1Ãì€QåÜ(c––ã‘Êü¿…»'ó%~:)gê´Är d9_²±FÎõ\©“¦Ar#]öëæ_î ¼ƒ^ÜÐLðû¤äí‘* ë2×VtµœŽ”áàíülÂMñeÆògà;g¨fÞ(gcÒä! ö¿.oaЗ V­ôVG ÙücÉž‡,ñˆˆêW÷‘W¢¸»åáâõ[‰ÛÁ&ªgÎ9ÇbéÒ~¹•Àö.\­ybºC¹Õ6õÍÙÚyÙOáWâiSi«eÜÂ¥i%ÏhÖu#!tó_UÙ¢Ü"ŘÌˆ/4æ&B%ÏO§0ü¿­‚Ÿ/ÁÉ:Vð1 zJØÔ¥óBS^–X¶Ø´Õ-¡žw|ßXŸwDÞªÍLf‘Žß F@–MÊ—ëT””3ò¥h-foª„Y¦ƒ#ƒ¾™š/•z£2TRõV 9W~¢ Œ6еœlJþd©¶žˆs9Öâ eÛ—òЮ.ÇrÏz¦U? ?û]fíWUÌ´¾‹´Q†¾YË‹B¬ù@æRd”HÕu]ãö ]—¥K0WMþæÃ)NùÃÇ‹þ&ÜÒ&Ä,³:äÏ „,mûO-}YI$©Bþ®sÛ ˆŽñ˜ž[B€Ä·_ƒ³­ž›†4÷çöz®Õ#æ¶ÜÕV7¡ŽûÂæx]Njo»>ˆ áŒ/Ǥ~1²þŸsVCð€«wqFS•MùÐûÛ„}pÏžh)ÐuvHë\x„ëYHûL¥û ·¨Šð{”æ×³¹µ1MxO‚âôæøåAjiß1-uA3rÑð&äwŒ£ÖßÜÂ\š§ù"á‚:ÄTÏ<Ø÷ Ü`ÉDÂ,üÖ×Ä”Ì|4—¬ƒ (e Þé¦HF#xÜývk{×$ÅÊ¢¡&Âu¶L…~/í_ÄÐt,<š0y¥F•⛯5FõtÅ~ùkD´­­!_ä¢vˆo¦øDò@Œã2—ššª²@s)þÎ—áÆ·¨Ê×NÂî¿úÕO¨šiA’ÙÎ bûÀؿ͂uIÊoîrjüÍÕAû£‚㓵Â;ós¼¡šÜ®—±ªIO Y_|å‘c„þgývgˆu´Ézä,ÖáG²¬¥9G8rk¢¸Góç¾!¼&úÅFÓœ ´R\ú4;Gbø¾V|`¿Ð3 Üœü·jûéü•¡ºÖÈ÷"Ò%¯ÉÒ1â÷T>gm0(K{·Gj¹w¾„ÀŦ-a8$æ\ÀÃüº–Äb­·ÿNréžAü8dȃ÷Èj;oýáÛ![3¨ö.ˆdýŒÄ ôÀŸº÷µ¬DF„’ÞàT öôî4LcêùmG‰§ ŒŒ;T``?˜ÒæX¥ù "Ú鮤8.4 Á¬à] “?9¾K0¸w½S5 .Ψ°È,TµhØ›‘í6.`è)- ÷ÛÕÑÉ)¢É‹ájUOz8®·àì/ô)!|Š 8š°„纯ls[‘Ù+Ó„·EhR#áÉȃ²yÅ×KAR8»Ù4ˆbÏ¥áó´WÇ‘·D·E” è½D߬‘l¬æjË6Ø£œ…n&§Žxvƒ>7ƒ.ÄîoÆí(Ž_ú©>c¤K¯h°ý° ‘FÝvÉ7yðñßO6q Ì#5–§OçN3fnÙn«_wœðš+ÒÑö;AsFªð)JP­ Ï ‹ +_,`6ÆpÍË9Ú³Í;†lÛÏèˆMøÓ–fD°Éf_‡k¡öä—}›­CÚùa ’æzö³×þýHœÊä!òÒ?Yô¸ó’¯†\|³[kO¸…¡B[ü~­ ô+u|È‚Ï%™¡Rj r–>­J6-ňªõçû=áÌAÍî3ÚÖpÖ‹´bwÙÛÒ>ç…íFé 4ΛGÔ¥:uî¦]ð“ƒrä@RTaŽ´ý‰äH‹r8g áõŽ»»ªÊü64éväˆD*î~)ìJ/(Z"ŒX)Ô*ˆ2¤‚KÕÀÆæMV¹<¶—–#m.H¾±—Eßf#ŒÝ·ð;£©þÓðÛÌhÓâûèÏPv`‹;ËÆ™1c[hc¾à¸þ=ÐÒbŽ"AsGjÝ2š(©F¤>*Ë_Án bü‘žjÔ§Åpº– 0Õ~O8ä()|HKö7‘Áøí#\«dÀ7^:÷3@¼ù)2Ӽ봛,`X^r ãx¿ˆ÷DÄ uY{™ñÏœ¢«úûbg­ •¬Ú¶fLÂO>¿*r+(ßœ”«ðDxik¥¦Úu׆ÿ»ïn…¹ c&–yÁ^ÑEðóý.5UèãU qfº-´øù„ßï¼riw|mÃ.!/…‘ó`‰ºlkff …·)Œ ªæ|²¯ÂvèZijÙŒÔò+b0ˆß6ìž^¾g q¬‘JOÐ,Î[›±‹Sxj¤ó¹\kEyP¹“”&Ç‘ •&ôü°÷:“” D¤„Ž9Õ°“íïÕ s‘ñMR^Uª«¤Š¯KŸšHôTêÏœ .g::ÕnÇ[¶CËê™GiqûmÈÄ#s*óxǤ(¥¶NJëÎ1‰’:Ȉ“,À9ž•$wæ„Ì|ðßÿDrŸØb d ooGµÖÃmäåU½`ä<Ψ.¦<”æÚõ'»œ>R™¡û\É Õ™ÖBáÀÔ•‡çÐ[#àÝÖ'Õt_ÊمٓvõâþqSЇLo&dÎR@ÁVídÿš›?ï‚ ^ÆŸƒêîë¸à„e€éwý.NÞ“Õ®fQ#w¡¢ŸêQû CÞæ1,„WGæã]s÷ÈjÓÒÂô“[IIŠ™i}a7¾Á²ê~¤t´Ìäå¨áñ<-¤ß%¤Õ…µ½ ˜©›j2´:rðCpÊ¿Éòþ>sÐ-&RÀ­þ$˜%Ü Õ}¶÷ñ›µÊ˜t+[‹ >¹³U"?ìkºñ|ÁçyQÑUfŒÐ’ˆ'Ô[{isvW¤ªŽ&Èzˬ5¿L«}Ò2Ôк\— =·äò{Wn›­šþÝÛxî“Ašx˜ñ Ó9wnl3|À/gëAsÐ-âMå½_Ë UÚdÕxŽGhl¦ Zj¨’¾`6/þÆ´¼ro‹ƒ3M!ÅŸ&Ïß1k…œwG¯|äÞi? «]¿ªBz v;ajUupf9tÏAœÑ­‘ìl’9(ÁkÕº*ÓðmL~p±×_3s„33¯„}F÷ç¾¼­Å2 lî_EÏô@áfþfMTï¶EÈêæcP¸`WåÂá>ÍBD–fªP©/ýöÍW4VÇ!±(—:âFu>œiÂö}«,°M@Jr²á»j@N33Ì4òŽD¶Éðä…:¸ÆÍzc£ªp´2`zr@|öÖœÎ[?C$¦µ©[ö|îêÍ Ùikòl P¶àÝ×úQÅ/A0¢üÆ(aÍt2úçœ?“…Ö¡µqm:×§4E®å<è™Ó5%—ùЬ¨ „ŒÒZ?}Ùdç^ià oÇ^ŠÌ‰˜ \#î"ª_Noô¾I=kd£(ÇÛ2ú6Xº–;wª’ªØšXdL¢ŠûûÙàhN;¦D'’+¥&ú· œÁÅÕNùb ¸¬b)γ6ôס tM;:“ñ¹Hð$0³úax,0i’-¯Ï—ô“bY/‚ç¯c«¡`Ûêõ]øÒ"lÃfíÕðÊ´Ó°~C}‡z ã>±‚8Ä»TÙ·bW–·|…¢ü°R¦5?¹Uß¼E­,6FçŸhlôò¶÷²¸¾¥úY¨ë{ÃKd @Ûc¯Þ娹5rÚ7ƒÆ Õû´çf7 ?Q?Y f6oµ4òW”p¾$F1#¹Ûñx'/¯Rî’&B:äܶ€&CVbe‡áJ'Ç~! ]ÂÞˆÎöêø ¦Äz‚ì8lZ«=Ø4è`.úåÕ³·ô |uÂļC§qEC‚ ¶5V¥à-Wˆ÷P(´…©è#›lm2÷ëO Pî"må0)õBÚgÁÊ%éã…åñ·ˆËý—ñ C¥E{@/óm±X ~˜ŠØ¿ ?2ÀoPÝnHàw$$‚“ ǽ3ž€S$ÇHŠJÙJºAôÂ>§!2'Ó~72:;CùàçŽyZhƒ ¤…Äö«-fuy'õ ¶þ‘ÙÅ~/% 1µs?µêø¤—ñ“Ý’z«fG>ú 6¯;FŒ!0/…´‚åbi³BcäðDèáŠÁˈÂm½Æ1û¶ ‹LH‰Ç7kèZ‚o´DQq©þhàTpÆŽx8΃ÆiД›­ ±ÿ*³½õi£0ìøVeZL!æ•É7nDší g“JJ²Q$.Þ̸Œ1 bŠéµµiæG„xŠ…¢« }J$Ïr{%ßmœˆGÜU°¯p8î6³B‹bÛ¦}ÎjqÊ:"¹T´~«ä2YÈÄQõ=¬íš¤‰ù3ÎP}ª¿#4ŽÛZä{%¢ôž ¨“(‰õ‡.ʳ0 ì”r:4©jX¸õÍ'a¡õ¼Ö»pãØAW‘2d דp,¬ó+­Æ?OÁU@¡Ç¸ÁMÙ¡ÃeÏíËö6òóíO2Ü/å†ü€_¾‚øe`£"<ª8ÁD,J…š$Cœâÿ5Åt·ÀÊT§4ÔÝÔ?ú:øÑ¹«À< M–ðÇÓ+ÿ Nõ{«Š~^Þr5“ü-&ª;P ™×$µP±Ä#¤ˆM°=ÂÜDâ I•8Pø ì2в«R¿œŽÍ¬¯Ó‰e€ØKÊSé=l}¸zxŠ/câ Ÿ§eSr[6””ˆÖìõ·ø‡&Јx@„ÇX|;Á‡÷qóVM„•ÂëW¼åΜnõžBdîò¥ÉÛÿHùÛaÉ_¼ŒEäñ{‹(ÔŽ–¶kºPë€Ï>}P )+;âÁwè£ËHËÂA(àPW’5@5s³ì£ÿç°È#QÒ LÀ­b]ü5ˆžŠÚ ì»ÙX¤o§)\ò*]¿GóáÍf%[;]Õ*›ÀVÔª·éŸÄâ‰ÑZÇ3fúÚÍ¿ÌúÂi¹ÿV_¶ÿæ§‚ˆýpävÉD£cüĉõé,…î¯rúö³Qð²{šoLÇÕP£ÞD-xïö¸BÌ¥Fï\º‘î*|ÁÇ;ñ¹wœú5Ñ'€‹­Þ9Á5üº«¼ŸŒšô|Œìà8%gÅe‘ãÎUÿxaNü‘ «±žÌ¢Z—æÍƒxÕÑJ·5þaM\,>R}¦|ÚJî§ j­}—[Œœ]‘©çѼ¾¯ÎÚÄ5™Nÿ9N4‚Å tζâ½µdß‚¤Í¶ÜÄnFƒÛ?» ‡9¬Wa€íïKõ8ÿ¼º‰2;:9álpé|Aù`~È-Ĉá»ê–ŸŸµŸ¤!âõvìKò;Z¶'¹{Àlü„Üø)R|²ÑñB$²–ÔIøü5î}7Rµ°˜$9áÚ“6Œ*TBþ¤›¤« Ù¬ŽЪóL¸+—ÑØX«º¨Áí¥::†ð­`ÙâûÿJI°89%×^Hš¤7Á Ëʯ"$k!.{iÅLž)±MYó¤v…haßÊ8go]£7œh³®g}F½ýd¸áIg$‹¤Á`ÇdÖÅ]b]eÐÞ¬öß«þÊE’Áíʤ«fU+3½e^tÒCagˆ&³}ÿþìÚZ±KQ„î±ýàÝ-…;õ¨®?.·^O @¢ ö̼kÈóMãYg ={k!6óˆ4ù £?óAþB=²¡m=ä$XÝð+ô&-A/,uÀ3ikA%—v$G×=0˜FfëïØù»’–¡Wkd¡N”Óý"Óñ˜¡*81Y:ßýýð‰Ü“Ëy,õ~Ta „CÓY%!·ûŸÿ’hí^xêö¥*:ášÌ§¨z~g±Ê]\õÑ{'<¸t?Jy6ñåÝZÙTÑ„ ›S'¨æš›—){Ð,ÿJhS—i®Ìº|K—¢Ô3­CO,“ˆ`ªðv•#“¬$Ôo­î4ñ/“³]:ŸWƒ¿»)ß ŒþÆ!æ‘(,¤0Õ³ ih± ôØxÚ oDë{W¡¬ÿ™¯o‘6Ân§ Ômçé".ôîñbû>÷m{§ÄôbsÜ|Em ¬Í(£ U0ñ7ù I³xíÆ ‚¢òM}ò.ǘxU”r¼ µÄÍk~V*aÖÉòÝ¿ÆD+¬æt+G¬kZçtóq$ô–Õ· {¶W‘=ʨ¥37í·°£6€¸È¨«±à(,xHÖ‹ß0HÍÌ2O¡ Ñ*ÓÓ…^ãËw¢°Á| aÞ@böʇ±Hž+ÅžÿÃqkhñë1xÐP¥)„ø‘ÜèpgÉD}”÷]ÞDÁ»orÌrÛ£Rß/j¯QëúDżHUy5¬Yʲ&C –2>‹å7¡¶0+¶pØâ î\>d?våfN7mï¼°Éäñ7%È‚GÛ ò¡ù@æÛH¯×bS0Ý…µ*(ûÓ½ö7œ¢_`ì?«&º„úÍÞÖ@Ê€GáÎαÀ{k\â?fXà÷4`t00EÀOªdU‚ž9Ø‚œk;ð5ìÛÑ!+¶ö E7c º'—{÷O:Êü×¾¶»qÏ8iMcq-wÈþrVï^çbMåßñódJUfY?ÏœJ\&1÷õ é[Èf³n­MgÌÆ¦ˆxT‘¯™Ìgµ§Å·û),'«o/Ù‡mÅuö-y„&îÒ±DÌ!m{ö;©“§Ã;5 ÞEV'0ª..€¨qòz¸9°tÈ„i!ª¯‹ |Hc,ëA²M§/m”±nHšxïQ™QÆka¾\TùGû)yy×Q¿ÚÞÉ?ôä¿VRÓ†;¯‹X¡†ãbì•Úo ì½†ÚÿöL=ûyèe$§ßäõÅvMSHíNjVuòÌÈpó‚žUÊe¹‚&‡šE}…Žžül‡ÇÐÕ™õ>29~zS©Ú c±YßÁm‰ZÕ{r€éb_N“šòø‘O|úþü'ç‰w}†–Ó4–º¼xmzý¶dØ©ÆðåÝœUäëVë¦$¬à"f¼mÛ"^óʨӪp‚r:‘õŒÝýЇ÷î ˆŒ¢ ˆ}výƒxÌ,Ï)|YÇlw $øŽ ¬žDÙDλÝì®vÆ÷"sªìtûïéÕÌËlb{mã¾hÖèº í¨[õÝW¡ƒ=åÔ–d5deÚò´Ù¢»Îq%*”)Ž\=yvÞ-2Ï«-v6ÂCMÈo #?RÒÊݬ¹ÉÚæpM³Ç}^B|ª{W36GÆLîv,|Ÿ¦++<$†ÔZÍYÓøŠjOMHìÙ‚¥"$ääŒ Âüþè„௱5+|øÌc¢ýÜ¥c6Pæ>ñ+zkª½ÔëQ>åÝ7¿ÜùŠšƒÄ•]˜tó^©°ÊsIƯ9=´ïØ©î .’Ô GR‡ò˜™_·è&º©[N8‹6…sƒ/îr$!a¸ä®fîÑCŒ;’^bèHœÏ(}É&fç”›òi4ç{ÚŠ[,Á ß*x¡$ØŸ˜›Ý·Þÿ3›jíŠt°xœ­ Ù³F†ô\ï}ÜK|€¦¼Ž`u” É9ÕêõKQ'·¤2·Cß+œ3SÛTäJTê¼™f=ÃMùóigêä 3!r]5F5ëOîÊÝ=cï› ìÚú@Éyùó‘ëWø`%ÛÀâðh¼,ÎEÐÜɡάJóohP2­…iO³ ;06Þ³o¨ÅŠÜ`N~ð«?«8( qc-ÍÎ÷DfFùHïå:$ªí†ŽðžíO#PîØÙ”ƒWµ€mÕOå¬Ñ縅 >|{Ÿ_fçVã/ç›÷ŽN„zèÔŸ&¿€æþƒ1Ÿ#’,¸ƒIöÂþƒ¯šJ`ø1„e9á¦+90êWë¯J¨÷ìá.0‹dpvQ_‰<4¦‚ß´5äŽDi ßRÁœFë%ÒBCèü©+ŽTÏì×YíÉ\W¶é(eïeìØI1?ÔÛQß4A~)åÅ«1𰥓ÜýôÝý¢ î|©C›Àí½ÙÂÌ!P¨8_ÎkdƱÜtNjɂB®m_È?%œñEèO…|zbªºcþVÀåµðAýÕç5 ¿§Ji(·FñõqçßyaIööR 3ì&p–ó˜Êâ«Ñs†S­AWž×",ÒÝʽ„ÌϨl/Ñ®ü½Ø~Rß)Àã…"Í× $Ì?Z0ˆOåÏß®ÐC q×SG™§¾¬±2!0ß§0èb~Å7d2áj` –ïÉXÜKÛi í 0BNVðL#®ŒTãÃÙ“½/[•îô0[¶fjgE•u£Ö*A¸)Öé+ÈkÅÆy(K,¬'`ðÑÂîª ¸Ø_ œýržÍ™²`Æå-œ¡8Ñn°‘‰öÓ•ïú ^Ožš\„e*¤XÄ—bþ¬*#.;ÃVÏK¸•;x¦]¸<27¸û4Cóó»ýwZF­Cƒß-i“öë›"¾ë§¢-5Õzº¼\uTG&ñÚ¿Û{Hø@9ÛÔ„8˜cÀg'r™»½ìß ó­éÚÄe°ùuݺžD ÈU~úø|Þ48š"Ä}‰Ü(Ïj^–ætè»o³XÕÕ5‚öü}v(Sé~Âg\Þ (ŠÊ?o_“•£;[ Zþ5Í/ЊµÝ€ÙÞ³¢áðxBjFZ/÷±ÒÌœ„6Cîby“AÒ¬§Bסn–C ñGÀ)¥_qع±¥r"«JI\*h&©Àcë@?kn (Éêo‡0ä–´E®¹í«±I¢Ù› n|ŒÏÜtǨçø/Þï¹,$Å6±ÇESÏQúÿ(qG]–OcÍ 7êtg¾!î—•nfÚ <±…ðrÒÝZÎ’ÞD<¥_ƒ½ŸIß´«®nè”ê¢M8Œîé.Òè÷Ã¥ãöYÍQ<^#Y¹<'>~IIM8à{*ÓRkwHQL%ݧÝð_Ϙd{烾ŠmÅ0`Û *ž(4Ï·žBëŠ ñ­(&$eõ™xBžÖ_îÒ@âNÌ£Ž¶q$#¨Dž-k:ûëGÉ‹‘6ÊY—憽èFÆR ”œ½ØTee~‹–Z_= ¾"•ÅŸêÿEªèÚ7,ëÓ0µ÷z<Ë5%¹1ÌÖo÷ ½€qPÐN÷¤DpÌnl½·8gëª^6Èw`ù]o¨¶n2gh&=gU7¯°¥Ù?W‘òþ¿Çn€žifåNW…u[Ÿ²F4²oöÌ"ÒL~é³þ‡¼¾ïMÖ¯}Faº7ìtbñ ¯¿¿kdŠ€ÀqðårGÏÀÜw^9f„–&å¯ÖT×;Rdª¯ªˆ€ª•Ûô»Þˆ®¦V¼7jwñ„5¯¥½½¨*9­²c!µW變úAŸNYÀÁ¦¯û/ZGIËë„üqrI–oqEbÛ~<æ ”EÒm]9m' ãêdoTs•$N­ö¶ÝV—KGŽŽ3­âVò¥¸@s–zdÌ ý±<øì†i9¹)VÞÍÁož@lˆL, Wý°å™}bLËÔoÚe¶÷w´`xéï}#iFb»$ÁåwœE…ë\èÛïì h’cx½ÎVzò§ÒP6}ñàj:AýR$‹VQù9D¹ªÖí ÎÇ‚ôäõbjp„¬•ôü~¢ñR0UA?šwõ<Èh¥— Xwž /(¤6ç<ä˜~í¾zʧ£™w§†Þ®ÎTñú8Ÿ÷µf\Y=0žh&ýªªðö¯% QÒ¼¢³Pá{™Þ(ÉTÉÚ¾ý*œ&^˜G=–>,c9áYi—#&Ôí»'UjÊ’1wä‚E~[¦Í8âƒÚ`ÈM“Mè)ìcÔÔ¸xÓnÞ *ë*eˆóû3yÖá§3íðn%èesÌTëè–ÅV…ö°ÛIJ×xB}Iˆ N ÈyÔØLP3"¨WÂ.ŸåÌ ü{U 9Öa÷„Oޏ&"–â Æ±O3•á׋NV¢yÒ—Æ*0Ä«…š“äª"Ä` IÃRi-܉U5º1S°óoëôƒG\Ô#òÊÚŸŒR”‚î ò¡ bguâ!ÌR˜èpÆ»%Ð*ƒ|1UöæöEŸG)Ëè~¸” ‡Æ ïßzãFëXva8oÁS1nàÄaímyí°3¤B®®$ ÛWXi\Y)·ÅØÇäˆðe>ÂO)kWOlóX^ìѾæ1+“Æžés¥P«°Gü¨",m^bË;Ië3³Rl%¢Z´\ô™M„Ðý Ë…ù5H,vxëÒ’L>IÝ󜑸²+Y¯^Ÿ/Ü­ѱòÎìoÉÅûîºþ5Ÿ–Ôõ&‹¹Õc9…“˜™z.°—<#å!x6áž§öS{ŒMꆴ¼Ž„Kí[BjºÇ4:4C?ÞNì ˆ©ñ‹GrkÜT[ÑËî«ÇíÂÒzýÞ7ûi~÷çƒòÞýê3æQ Žn9ڞχøª¨o+ÎíR²e¥P—±Ò Þ2³ Ù¯á–M“‚µÞ`0êÌ7J§ÑåÜwºÍÂw}‹Ý¯°©º?W4³’wþ±dr7é¡.(˜¯ÿÅAÍhÊ̇ ½jCÑqæe{EðK؄䋊N"Іdª[æ~õþj¾v sÅ §5IЬ¡)ê"^Pÿé íäEªžB&.Р®ÏàÔŽ–â‡Êüí›” t¯ôÐ^ûýð–q\9½W¥˜/‘¥¯=…G¼iÁëØR…0ëï<<îDrJ•Ìø2´;C÷üÓe/ÛÔT]æÁÂüg]o™>=6ç]y-øŒ°U +úç o‹í³pv+Ïok3eUÌÔ_bnË­bª6„=¸ÒnqÍ*òXwÏMCJv‰^9-ÙÓõpIJ²°1|Cfgëtq8~|ü}‰†+òŸjRŸaw­qsÇv÷Î ¾ 7›„¾ø½oðøÒFçgøâ”¹ß‚4D5Z¡‘} å•cwDÁªüd(Õq¿‡ôšÕ!±2sô<ͪDÁdd xð½N7‘ J˜Ržéë•ÆYÙˆp‚ ÍTwÞ°5Õ©¿X¢‹ÕôÄV{IÑpGã@ž8¡8æ­ó*ïù~MïüVW\¶a—âmºS£ÄHäÍÙÈùÕî-À k£+×°Ÿø¡¬»ArPÔdµôµâ¶K).ƒ—LZÂø3rí¦"$?:Ù¥¼§êÛŠ˜®…´sS­I¸—kùÃlÀ+p¿Ü$—»Rz¡@ÕÝà(Xé6•z~Tq–±ãq=ƒ—¦-~Þ ÷‰Â²‹+œöê€ÛÞ¹¨ÏݯâךSÂ%oƦóq0ì§nüöÊþ­[Ð(n™dVCc»¦øŸáÀ¤¥‘4¸X¿ÒÓ6<&i"fó®\ fô#eXÿ¸ß»ó,}æ²¶Æo̜͗Yâë ‹(&EbŒëö¢uão ÒŸ¨î‚é· VÇK ž &.‚ðšÔÁ[Õ‘ߪé;ûï<6'@`áC¾;b«¿^ÿéµ~N©þs9¤ããä–íÿÐ$è3ø PßnðlðÝûÕ@Eß#ß°³néïö4gyÀ$ý í\¨ä¥ßììBZLÝròÂM>º1m0Õ+]¡sOàØÊŒ¯U¶Í”ð½ œ¢NßFôÒNf³xTI^iõ"\¨* ½þؘÉ5¿5{R•Êèñ ÍkiWÀJþÌ^žK•θáxï¢ÜMFKé Ç€dz16ºb°°Ç‚‰WÀ,(Nc¿è¾Ki'AJ¬Ü݇½šß–‹Âf#ô§„vc¦D†ù^«ðî‘õæí€BÐJ'6#†®·K˜¨o8lÜQ/³O×`U`ÇîÍÑûˆ²e8mør¶G9,O')&CدÎ^+Ûò€ŠÀ ]¦Iä÷–,³Ñ”ñ®–i Ž'¡Ÿ¶:ªI5] ß fk…ŸñìéYM¨Äkwƒ 2Y—“ná}Ñö [’Lôµ=‘@=vâìLT¸–oSl>1Í·¹“ÇÌ E?m “„…1óLeö̱ͽÂÜO‘Qè$­Ói'WLŠ!ëRÚ²F^tB3EvCc÷ ³ê_>.CîZÌnÝÅN³$…Ì=ævçRšf9Ç·:t÷êSi)TÎØ“ÙR[q\×ø8¨‘ÁÞZ™EïÁÁÆvfç3Qº.Ubˆ _›¿/†B=/ ´¹—FäDyzEŽAVi1—/¾?#T°Õ*x†œ{wÕdêÐOH¯p#H“ÖQ©­E$Pë©’D‘U\ÿãObI .ß/ÓTعž,ù÷Ñ>RM>CÊz· C™YoÓG¿dœ8 ·&‘/‘“¯öŠw¨ePÙÕ´¡$«š“_4Y@°f²ØÇ©rUŠ¿¢ë¶±ê—{iý—üLk8¥¹eÐðœcÂ7w#Jq¡…Æ~dŸ5£”q†<ÿ€D£¡@g6»Ö´=yKˆnS^¡'/KsxœÍ㳿±¨ ÐÄ` ÄC°òO·nrˆÙÕ×é~ѹ&ƒÄ³R_T…âë&’€ì6á%Ayè†Ä»O6B/ œ7¯.}¹ñR|LwÒ+ë¡£Q4±;n®uúEàÕsË$hyH%ðz{œ¥7"…ùh!gÂûø>ó‰ÞëòÅ]¯êNc!¬†¢Æy—Ï·°OzÝ Àö-›|0÷µá%7ªj1pÜ6g¡vAynúR_鬽£Ð4hWMˆ$M]Í·~œA•{kÈ. ÄìÇò§%&ʨýD˜¥Ø>Œ}°¿-bsÖ Nùÿ²ç‡…’o—½d.[ûIÿ,Õ¬®þ-©•N±¶¯üÔI[Ç€£´\ÀC0c?¹ÑÁ+Ÿ°Œû§,ÿQ3±3âGbJûXîÕÓî净­Ä•‘ÚèO_"ø/eQ æ´·EŠ+í¼a» eKl LÅÃæN¢lÈeÌŽaÊ%,±+,ãh›Î»QFï™)—=Ì©ùd#%– ð%öáå$YÓk‘cLv)÷ïñ,å›%ÄœæzbEk‰¦­˜õË]ÂïeI´ ‰9˜ØfKn§GxÝ«v«Ùòû,1¤‰ãl1Onù„/„Ez+%ÓÌ ¿¿«6DüF‘ ŽÿbøÌòA!·H‘%]£´tž>éBàE”¬>IbnÖ pv3 -h™Ùp °Wé”ÓOψä§Ãˆâ›ê³ý"T±r»ºÒæïäw¡}fô8k&96D¶yfèð2×ñ9’”la,ù)¿~‡<ñÒ­ Ó;KÀÖ«8>ò¶Œ<[/rÄw˜zÂó+Õê›-Cª¹.˜µ#C(Ñ?·%sưÌÅèAuM{Ô’ÊwâoÞ;ŽXºt|ç ˜`ÀlÏ_9«­Op_§×KÔ3™¹!6qÊ ¯.…TC4MD÷ׇ–«ÝŠ‚nmc˜W™þbg½¿Ù” í;¹û|§ s0ëèŸáU‰§‹@æ§Å{ÓÕ1û0MÍdó™NŽ\s…%u®w_JV…Ó*W®ªÙ›Å8P-ì¤6È9”ü¬¯ë¢Žiô—†Jʃ<§µ$,ÖǤ©ÃcÔø=ŒYDÔ¾>ôÞ²¾Íd„á¹ pL$-5´bM+Ñ„ Õðµ-Y>Û)£ P÷¥…ýÒ90εg¤Îê’óòž; O1¼`o/…9G,Ê…úJʸó) #\óð/¿ƒÑmSǰûœpüKLdT‰µ–ìÌ$ ç²Ü UÖ)µ‡ ”¯ r¯$`èv„‡øšl!B¯3Þ¹½½#'†»õ2檾íÀEð5,ej^;A d‚PƒL¶rÇT})Jì™§š^F¶ØÃ<0Ì6ó½îùÞYÿeì Y°~î4rõ&ÅBVç8×sa£ Ž=J!SÉÞ¥¬®UèœeÇ®[|X˜¥®Ù&}B¯ x_$‡L›óªè*ï¥fˆ¬¼¿X"o>¶øN¯3 ÀmäãUiçµÆ€¡:u!¦Ñm Œ>ÌÃW š>óà¿™ £AX ꛿¼åu´\v0¢Pa|õY¿„Èô†zC ó>/ÊŸöMø8Žé ×Ȩ@¾ƒÈnO~Zyñ–'‡_Ó¿—£Š7³NÛ(ÿ®÷Ç™äk£ÇŠÐþÍ\·Ë‘ 3êᎥ• è9T¡¥ÿ,•K/1ïÅV– ]–AÚUø)ä>ìÍ õŒûÝ¡I eä5ãÝH4³%5°½FEøÁ¹/U`оHùÖƒ¸_ *7š c†ÈjwÖo©X …‹Ý³.þx¦žÂ|A«ûìÓ{qä"™Ý~Ö†%î4Ž3l{†üöDü9ŽÅ}fíÂ]Ó©g“='¸GZ{šÉ›Ž9¯™'†]Ø ŒxѬq7ÿ@„oU.ð ™-ëŸî Àºn\À-ó€½0õ›.Fµ¾Gß±°BÊ$†«zø®Û¼tJN­ÿf ^èm9É™:àýdë?s€grrr’ªØ[A†ä*çlØ£N‹ï“¡kAñ–Où„’ Y{,3‡ÿ¨z·È½_ÑWdþytšé`dG¨BßÙÌFß\ ü²¡Ý&j^sI‡µJ¡Õ < e²èhŽhp†ÝFV&Ÿ3O:k=;¾=ÈÅ>æïDÅ_=W§=ô )vVw  á¬å6vû¹z±vÛ"àÉJÂ’÷ê»·TS­²^ÓSú»¨…'‹ýüŠø )þ¿ê¿ÿRÖ£«¤©í}â#°†}3‘×¼…3]°´·3§þ}kO<°í3»'ŒÎÓ„F]çnoÙð~ëÏ•”-äÔNp)A%ö!íõY­±qU¯ÍÚà÷¦ ÙrÙ½®ÑŽééÐQ Ê\RZ|{hq¬§ËçÁ(vÓ{p((À¡+Ýè{÷‡Ÿxl®1ÝÜF•ütáýe•ÛŠ¶k)™)•X˽Jléп,9py{#˜Œâo™|Ô9âäæ>ÄgDáWL»ˆHxÕÛ_ôªTïq5±…d\Xà\ƒbÁ6i$Eãn ²wÀ2bˆ_]ß96P‡ x‡HÄÖoì‰;Ý#[}òÑêM+ÖUgÀ±Ð™ÎäWv ù4Bà²dËjpÿ¹Gϲ tw âóSšiw~ Ò–’­ö-t.š¯¬òÐx=}ƒ-‚¡˜ÔÅýZJ²^z¶Àâ5 rªUÓâÁ¶JìJnMAAE¦®êÓýûÍÀùDôËÕv¹%à 2Ý ^ŒGüU¾ÒþG«‘Uh‘–èkâ³9G®®ËR‹S~cÎOA˜”‚Àן”n„ãüï­z˜_F'–†àV=°]l½¢Ë7¨Mäñz;Q÷ÁÊâgYSå5¡êµ~=”–'".,ÜܽFÕš“ZT|3عÃûbÖê<õ'¸,ùÖn³¿À­ÃôyŒ>ô¥‘|×m“™šjþïáÔôŽw"p‚ ~#B_;]ûôÖ 5¼—¡~mY—JÙ¢¿!×;%‚–£ïžñw1¥úL‹­ƒhý„:ÙͲ[>]:‰]ûf¬LK˧ã1áe£tk7¯XÜ[ë@ÊV˜¤x endstream endobj 174 0 obj << /Type /FontDescriptor /FontName /WESPMR+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z/a/asterisk/b/bar/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/grave/greater/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quotesingle/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 173 0 R >> endobj 175 0 obj << /Length1 1630 /Length2 8284 /Length3 0 /Length 9118 /Filter /FlateDecode >> stream xÚ­teX”]×6-!Ý=4Hƒtwww0Ä3´t*Ý!Ò%Ò-ÝÝ „4HI|èýÄ{Üßóë}Ÿ3ǵ׹ֹâ\{ÓQ©k±JX;[eÁPVN6A€*ÈÉÒ¢â VfÕÚº«Y:‚Ï*”Ð rK[@‚= 5@hàâp  Ò¤œ]¼Ý@¶vP£Ž¦33Ë¿-¿]–ÞÿDž#! [0€þùÃèèìâCŸ)þ×Z@ jØ€)5uU9£œª@ºY8ÔÝŸ[±(ƒ¬€` `ãìpüë°r[ƒ~·a{æ’€, è9 èetù ±\€nN äù‚lÝ,ÀÐç@ °•£»õïží6Î rqs~öpzÆžÉÔ!Pˆ•È xΪ.-ûWP; èïÜÐ3 p¶yö´v¶rÿÝÒì™æ…Z€Àèý˰A\-¼Ÿs?“¹¸þ”ámÿ] À hkáfí„@žiž¹Oçß}þG÷..ŽÞ¢ÿxý«t´aCåäzÎi}Îm £²ÿ^°3€“ã/»µ»Ë?1 ÛŸ1þÞ¦ç",¬ÁŽÞk  *»ª3ô9%€ñ§2ÛOäÿ‚Äÿÿ+òþßÄý»Fÿãÿ_ïóß©eÝU-œžà¯GðüÊ8”¿ßG 7Àï·ÆÕøÿ…Y8½ÿCàßõ€û¾¿Ã P‹ç¡H€mŸ…aåäbãøË ‚È‚¼€Öê ¨•ÀÆÂñyfì:`k ›# |ÖöÏXŸƒ88þ†iÛ¬À¿Eàù ‚­ÿ^þ³\ŠgWV”ÕV“aþO/ìOõçM€j{»ÿH£§âlý¯ÃoIIg/€/+/'€•‹›ÀÇ÷ÀÏÉé÷2þ¡áü÷YÅêòq°qppžÿÿùû÷Éäo42`+gëß›£µ[?/Û¿ ¿a+w7·gÿÜÿç¦ÿyþ³ö@ Ð uiÞÙJ(Ô>ý}´š0g`LÚ¨§‹~ Ì¥¤N»0?°Ò¹3 =rCà“ù}U[ý„àãgï/‡.ÛŠ¯v†º:S'yd~4LÝùØkô­|Ì;Áì¦%èGzѾ§sÊ놼º;›cš¦Å÷Hä­Ünȧ×L4ùx´W.þViµqømXõ08Õ‡GôIû×W }Ãý?»·I™³ãPè„,ýS©’¡Þæn—uVˆw|ž›B!XåðlGÉÍÑ~CPÊSƒ~‰_‰È`¾üF{"ºŒi€ì>èG­®á¢¼@ÊyÙ¦‰žzŽãÔ=7¶M|”g E™®1¨±¥M”²¤J©%q˜lY´!^xÚH‰É°8ª¶^›Q=†­òâGgRd3¡ÄOo­~`Š¥kB.}÷ê •°Oã¦Â^ Ý×jöðn¢œÕS4¼¸xx5£³åqü Ne£pNÃÓΖš ›=ðaÚY5¸câÍ1ÖÎôaŒ%X·UPšãÊ3,Ûš¨ž9»â"ƒ1i€¿ÛìêØ[hšQ‡Qãw˜!›ûplø•â¡©+^¬n­TðÊ~¶6¥&ŠR;±ÓP¶ÁÕ(Ók°ÙÖÍ`@LIÏ(¦Ý˜F}¯ÙEf½jð c•“ÊÜAŠ?¡¼C 2¦ÛêRòˆâYcgÝÃæjK6Ýâü€\Þ0ë i¬ÖáLÿPþßgõuÀóM{ÐrB}‚íTšµ(UãÚ»‰ÛQyC”’ÛäÀ; íeù«,ÀPð»TŸÜxºô=èDZôÖòòǹÁ.V§OJ”i–9Ìþ¨=$mf/E¬>†ª LsÄÆ²ÅÝ´„ª>õÐi˜±ì+¨^¿KjÞ—]yù‰nÏ¥íÞ(¤¸ÊbxÉŒGŒ¦ñtx\çÓd£›zócõ£ÆjR{ådRJƵwüf’¾¤®Ï;±$,ò‡ltÀ0—ƒBºv[ÓàèxNFlª£=Ãp@ “ÌmæÇðØU|ŠAÊÞ¡(µ¥ñöÖÂÝ1ᛓÆ#&`×§W]5o‡¨ÌBrЇ}7¼ŒÛ cð7Q%:kOOÒ߬DØöY”¤«ÏµfÚ¬ùηæ¥é i¹Þ ÅñÏ‘ëŸrr„­?˜vœ†Ì§vÝ14ƒä|¨{EðDÇê¢]ÔZ(¨)ÅéŽ6Q6-…vì‰JÂ>ۜ߸áã#¶¸2Ùm(–å´æ‹ú)ùõº†ØöýÊk§Ž’ôj¨»lÙOÓõ(€Þxgê5Ã$'%:øb¾ n7BÂOùÅ0\ãªÞc×ÍÙ¼Gdn‡Ln¤¢%NmÿåeœŒ) |øPÇ©oÙc¦ƒ<ÂapÎðGmåöÒõ Ж˜@!Ž4mÞ}oƒÂ‹ÙZ0® NÀ/–"6 ‰Øµ¼Äן‡7›'n^Û¼ IyÉ×¾'é¯ÞäçŠs“d+øÍäšRM~ñ¬{Ís:û¸ÐÕ_¿v±ÄïPÜ‘öPýøIšÕH©¥Œǹû.mïÕ¦ñDôû×B†_÷ëj0§_4Ö¸Àút1ôqOË›<á§ó€EM§ÚM¹ÓJ Ñ9ñôð±11®/Ü])½¶~ä çjÑÝò„Áø;Ò íÍv[š¬6¤Áõ› ^â»Ù©ø>¸Fð~T;,2V ÊË&múmÏ‹TŸL)ùlé•Ï;i´ëT³-ëB—Cã‹°'¢¶+~e#ÍâÚÓØ¤ uâ÷Ñ©lÌši\ÁÒ¸%TÄ3òŠtý°Œ$¯[ /\X4½çúð4°@÷W=éyÛ3”ëq–õ¶}þÝœÇÙp§@L~ÝÈÏw†o•9øø3”ñQ²CôÑÝÄ÷PœC6fvÙÉPvW³²K´ª3 ?ÏOfswM®©zAû¶íظeÕ—i'»Ë]Ý4”\Ž%³+}˜ß—OæÉ›&˜z2œUîªô`8Ô¼m¦Œ!ÍM!i#®Â5z°ÙLú "e„æÛÙ iy€Œ–|å!r¿´ß ÆÃç÷…Srñ ð¿ác´ZþêŸÔ&˜Ç•^7Öqu«ÂG:Gfyq-–"ƒ8:èÀ@käýëÙUŸ{«œ#ã=)©¨Ù© Pò¸ã»ê"s¨g½k¨êÚ¯- ú¹Ú¨$Z¤^º¼pmÜs—ÁÑòËã~öó‡ycêÂ@Kr9œÑ-¡É¥h+”£¢#]³3µ'Ê?&“„´¬6náÀ,.Á0ŠÕi‚F <§LÖ6ŸØz+!€iUg ?r¿i[¥°„`Ë<öÁâ>eÏ„o‰gCbd ÿ÷ݸ_¢!Á/ìÑ®™íj‡Tê%ÌaJ™}¼8×°¾š Þ=!E þD.Yï×b8ž46„¥äèltw÷†QW‘ pJÒHݤ…Ä_¿jÔ×o6ô¤Ê ä$Žç_zá,{¹ û>Vcï$/c6‹eÕ3àÄ?(ÄÆƒ& ²Ÿøfå"»×l§¯íÂ×»æJK€ÞXh•a<£ÜýCq"¯=Qj¡ãýЉµæ»é éÍø2Wn0O‹³yhäi\CœfŸÖÒ5wèøíw{ZÖ‹‚€ŽdT8 ÂK!'§“!Þ]KúõÛœq„ªµ›8žÍ0‹4³Þ†ËbO]̰Õl}òþΰ¬˜{®PO“¶>ºeÉ;CÛ:ü>p±«ð%²Eöe9µêhdD~ šðųnw|æTnÂÉocT<…iâÇîb²©²Ó­pΧ­ã…GR¡áXnOùá-! ºäóÃ^º^iÓE🠛Âqß±¤ä[,wdwÛÅÆH˜[‡³­SÂ4Âü?oÓ‚î-'qk9ãäHÃXèÐý>Ì8÷뙞Éæ~{Ú¬}Yâ¬%)®C”ÃÓ£ q[œ>.*`Y§û¦˜‚¤+¾É/)åϳ±—s¡“ &mg¥þÞJQ|×e#š×h¤èíç_²>Õ€5þR—ã:}«\¤_Ô[_-_È¿Çæžø‰PÑ«e®Hsdï™mã÷küäÄ+xBcóQ‰5öÊ¢¹—¢Ý   *?ŸKN,w6!­z{‘u“•û`Þóñˆ1ÁÙ5^PÃÁ4¸0¢%ƒF—<'Î*T4òã ÓdÄA n©UøZE Xp|U÷heå¡Bá…'Òõ¾oý;(Þ‡x4\^q ‹Ûø'-ŽÀ'íG½,©_#×fùÛxúèkÛ™“BU²Aïð¢‹8•|Ò¤ïu3ñ¤C½†4+ç[Øœ[ó†æNõPKW†¬tÏ jö–#·ì\⻆ ý‹­dý/X×Ùç—ßç>ÕÙLˆ¹ûÇŽFêf§›¬Oœ0 1c då¡åû‡e·}@ÅP>Óüù±NjªöÉùTBjç®iNçË×/UF?@ŠÐMCYÚÉUõf z²Õ†orÍÔ«œ¯Ð[¹jP5µðÒ±`¼è¾ó†7ºqµB< »F]«ËÚøõ Aªœò,?ÏÞc3¢ÇKШW•.:Ø ¨…ï,yïþŒ:ÿpÑœ…‚œ;…ÄвÄóFDkò'¦ù’7ý5 ‰‹ìv3I—Æ{^FVs¬®"¡ù"5)‘2Nç+¯Aä)kn‰k-¥õ„å…ØKz1Mâ0!ÿÃ’üƒ›Œú„Ub±’WúØ»Fä±fƒ$63¬(§ú_y‚ÖÞËrþOÉô´¹—ηvñ3; äò¯VÖØ¨RÔY¢ú 7šŠÞ¸˜ô¬Ln¦Ôû±HÍ<ÉÈ&OGrΖ\× N8ÅÖ ÜÍÑ/‹jÐuƒ|÷òFEËN{×P•_N¬ï;æ³ß›Zjj3àO«º6¯O£% ƉRöm—C´%Q¯æ›l½Õ¦ˆÝ®}uvŸÊÈÓW¿ðÙšû“6Ä%½{OâÈPúæÀbcíS1B…R‡ŒrÏF9Ÿ¨ïÒkšN ½ƒ¥öã’˜w·Üí¸ÛtŸ´òñ?OEÄæA¶#­æS ] R+ëq'ëóš wT‰9÷ŸÞ-¤.ê\êæöë[ñÏ‚óãÂ…5- ìârN¤2À‚ß©'g+”‹X^‰wòEp^>>hLÂ2v ßùÎñKe9›t¶ÈXÅ õW€é/öÑoƒ6Kýìƒö&Ã+RYö˜å`0u…ý9¬:p¨£¸…Á#¹~¹Œ"äGòånd%¨öÌu> ) Ç/aCy°sêÖ.!(*yÛÆâP’+®ƨl®Žž¥Ñ:S¶ô‚sC°ªû&„ÒžåÅP–tnéË…Æeoøqm¢Ïsók_I‹×Æ8ù±Ÿ¾³ë1.çï®D~{)9×Zwó¶4l£ƒ­îm@k¹Nüõ8-y¼{ù Ž{€f.ñ2q>î“;0’®K ­bL¤÷»8‡²q“*“ûðDä´Ÿ2÷-ìݾ°E$Ð2ö éÅúÌ›‘sÏU¾Û‡ Ž™¨ãºhíq…ž‚SøÐˆ*<Ÿ7®ïÜýeó:0:”o•)>‡“‡ g”„ºØ»Ô$¥ Žð¡±Žv‹U¿c^º¿#Ç7K‘$¹5"1dƒ™D? ±É§e¬2‘b¼B ›ÕEO?2uÀþFÃÅÝ6Pœè+7IkÒr’KÓx‰‘+Ò‚ [±/rÍ_He¤(‰uîšñ”-RHÞî„+¶óz%Ö÷îçCG«Æ{³>NC?"†m©Xë^à1e4âi˜ä:DçjJÑÐ#qú„›ŽÎoe’9?ÛŒÒvD¤x•õñû6mÀYãÕ€>y2îö¥lTZz^-›[ž mŒæ\…þq}'aŽaOÃgªÀ”†Xä:g›²ê×°YøºUj^öýyêD1*¡àká]ù¶@%>q*þöÂJû=µ¬÷¹c[|ëØb‚~ št¡ ëà–Gz¦¥ŠþYCÃ=ó3Gs§U—â>ø¶,E×<áøýý.¡ð©¡óJÅЂˆ,w/Ó[†˨xD$H\ИuÏz—ê›WCý e1b›æü ¥“®ps‹-,Ôcƒš9Å·„ÚÕ7ø wàÕ/st™÷ ŸbÅÇÑ}*<‰² ¢† ¢°–Qfk@—[foS’½ÊBÉÌ|$¦Õ dºF¾íQ¼&N©~çMC¼Èéë¹ZzZ¿pPÊq€…žtŒHåÌ/þÒHa•ÖFd¡ž?E̶’þ,1&­§Ä+ù…'¯²¹uñW(Ü«Kg)’þ¨¦½·eĪóGXA;¬šÁ£†WÎf1Ÿs|^µL&ø d¢©á"ñ¯ntšI¿Ínyp?½݀Gc^iîeÐFœ,a(ùµ¢¤»Ë¨û‘Gè1/†~2%ªÔùÀ!µ€1<úŠ,Njµ—†sVíŠÔ”6Ñ1ó@-it–0ȵÛÍœwSw|@aŠw™?iYÛÒö•¥…¯±hAHËO5ççU«äe*uMI=†ÉÍe´”°qÑ.qø®t3¡kΨZ†Õ+åq®5áX%ÃUàL'O–Ü5œæª@A”uUÂçóÎ «m6|:;öHR…SÓ•9Ô%”• 4ó_—[:ØH¾{;ßd™AÑ=mïSÀÖ—]@ 1 y¯„©hŸß& ¤VB+¬á‹@©“à;Ú–+Ž#ÉŽ*(Ýþ™ççÁMC›E D¢%•Õ MŒcLëÌÍYÁ³ÐCëØ1<¯œFARã2ünüÍËd!D*æíëÉ6rIs<×@ÁÇ ø‡ï”^'ùiHgÅwÿO‹¯!yêì£Ì~¼í3ºb|f›Ù!¹…ækroyiÏlQ÷‚†ˆã£ˆªOøàËײ(ïŒc¨”x2*ÔÁ‘Ú’*§ß3&û¶U¿|G,eìWÝ=¨õ¾>Ç=iùÒ¨ ô}øóëæ×óq*éqž*oD¬”èz&;÷"S 锸ÜÍaªà=ÝÏNMš‘üù?®Š‘F&è—ù”ú Ü™Û L«(õÓL‘;ljã>°Æ&9l£T•“d²Ðhç[{¿2uàl<,('¿ß}éJQ;ÑöºîMNE~*³ªùµÍ–SvÝ;χ®’NcÃéâÞ'NؾkÆ-<˜óñ„ÞÝíÍ× ëóïÆ÷b«wÑÄ]ì“­©>Ñ/8‰–²üèAòk8È„yQF9"ãIi!¦]·«=’Öà3L fáœDâ ”ì:?\+”%ê"“[7ÊÝ4Ä•þÞP8ܽ÷/Äêæ1o¾qD ¼ Í8X?9cæ Ý9Š˜Ü1/Îï~T\fÑv³§¹é\̳uŸûò+iîn²ÐÔNBÊ=ŒÍ´Z.1V_•ºk1Ð"¡Ôd«­óÄÞàs‘Ü¢.¨ÎRl@èñ…«¡Õû…®e‚k5£3„÷åéŠâRŒñ`°À†7ÄËCùç8¼÷Æ)á˜ì#2¬£ˆ±Ò¥€ÓR_/ׇÉÒð;è+ú`'Æ›=®äù泯‚ÆzyK!šý_òø!M6/ýòT­‰’qmG ŸúM •ºSþuÅdɸQ3Vê¹GÙàˤ¬“4ÍÂL±@ž• ÍÁ:Áªä«YQÿO­¨¤ŸÜ¦-gù_ß9›Ô‘d ò=$kc˜}Id×`¹R,ù*W¬ƒoäz*‚ÆnnÂ4skµ'5˜e·&LÇ-ÃC<¶ãƒ‰¥Í§x,®ðóS"-okUá­«ãÐ5'Ž$óŠÎ€ %‡oùƒ¨ïXŽ÷!Ð[#ƒ¶ãŒR„ÔH)KdÿêÜ\¡•—äx÷¶°²b 2×¶Zª*£ž¹ B³Šmk.¨eަn\ ÷yœó8ìo. SXKÅ]#õ]JZ¹«÷ãê×ÑÄ¢ïg2×Ê0kkÝB*’c“ v”ç`ã‹óN­‡ bL/An.ß‘#ý¹Ú›i äÈpúâõt£›1˜Â{1ÙŠUð½1±® ³n=å‚÷qᛎ­XwVÜrŒ> endobj 177 0 obj << /Length1 1608 /Length2 9126 /Length3 0 /Length 9951 /Filter /FlateDecode >> stream xÚ­veT\Ñ’up‡àNww÷à îÐ 4ÖÐݸA‚;·à‚ww'@€OnÉ›™7ë}ókæý¸kÝSUg×®ÚuνŒ´Zºœ²@ˆ5è%ÄÎÉËÅ#Ð;[»Ãt­\Ô9å N@À“Q“‘Q ²‚ƒ!. VpÀ(€l||^QQQLF€<ÄÕ ¶³‡Xôt XÙÙ9þiù°öþOÏÓNØÎÀôôâr‚¸:ƒ\àOÿëº nØ‚@ùWZF*šJ%M=€Èµrh¹[;mê` Ä °…@NÿXl .@ðŸÒ`\OX²0€æ ²?myÙ€\ÿ¸8® ¨3{z€a;¨• ü©pìbãäüCàÉn ùKÈ yŠp~ò=iA`p˜ ì ÙYLr‹B`q–ráøW!¢˜m÷IİMØÇo¾Eæˆ#ìÁçu¾öô‘÷=Q{°ÄËHËOÕÒC U”Ö “vg®KõWDÈô9µRËo Šê¬•‡M g®RjJÅÁ¥È&˜«Œ ’—Ï~`ã±ðøõ_”›çôJýÛÜíÅÌ:§Ñõ¤x [áA¥Sµ Av×'Ée:­ gÙAÂéÞuº&LØKÕ–ú…?ýjœG¯e“É©A€Lâ|•T™ïÆ=˜Ð*úû13Fé‚™ u{:r^´Ü´†ÜÞÀÊÐ Ð%¥~þ÷–>–ü‚·‘¼å6,eƒ#@þH:Ñ_~ˆwËâ‰jÝáŸ=4e »ÆÝ|n«±r¬ß‰5æÛË©ÏGoFô0TN©¸>ÐÍ7ݰ )úGÔLùT¿éš kú ¶“ÁͶÒåâXÈ ÌI"zç‚P~¥¾ã¸Ûq'.È5mÓú=Âú<´Ñ;ÐãIs˜ Æ¿e˽?‹¶D1?î$1uã.–ÔH:§Á Ü‰±{«¤’4ÆRsâZ’âw* <ž”{O»«Ä–’—&)y´"iöŒãMÒ$zn1CNí‚»‘|l\ýƒV &•hìÉ=Q">a—®/d$Ü(ð¥m’šÜÀÔ;\­ô/¿üçQ*í B‘:{ 5!ç~¾€w¯i§Û½òw0ô‡f[DI[¬ò‘—NYÌ…6²ìö‡ïŠØG ÄóÚÇjw&¢®J5ŹYz@U8ê €GÓT1‹îŸ¼Æ7¦ÍæÒ㾘mûYLÁQî;GáÀZø oÎ8ª ùæfžŠ4ßû¿|tõÀ¸QÄ]æÃù[R •²‡á–Kîùú*r­Æ‚Ç xŸJ­¸áö‹xûX8ä”i±N,ÁåÓÂLuTÔK·pº‰Ñɪu³ðì¢6ÌŒ8¨šeg´½þîšzã ð1¼µ,âå°>7™µï†ó7æf•½c/ r3q©§ôÑ’= «ó9gEñäR¯ƒà>׉o ”¾!Ô13eú‹ŠG)p´â™o‚BØêG[¹–ø‘ЋV†ý/ã”ТPKí¡1ˆÂa3j7¨YÏÌIä·Ÿ½üî1Á‡F°ã-jêº\æ½X6¾äâîésYfZÄá=¬KÝ]±÷y×x}žÃû8£ä¦.cpÒ)>]3ÎuN +ÒLÌ×0mù›ß-'[ª"jxŒ«àÄ×¢g"2s üJ/É=4îŽhÍxnw±§#e^I&5{ò žÁ¹ÔÞ0¼ü+(C{‘t3¨OCd=x24,àdö2L¯2=¦¥ ÇŒÿuN:€×ŸwRÓ©3æáýøhD¡Y×ÓwvÊ%þNû«—ÿUÉ39•­D„I©$É\Â¥°µjåc7Ì1VÓ‚ÙeKG@sÑê·²Kè4Q|¯#{e‘˘'a‰Û Áž8ÍDÛ†ÐÑXÐ\fhþîF¬,ªb‰°„TBDõ¡3ž˜®5­ž´ae뾫bÒç¾Ó`Áûr2b¦Á2Ýfç›)ñƒ/~ÝÑq —þ¤Qö­`òZ»TÐ÷PŸ\&àÄ).¤Ë®{<±²aë¡÷cËGÊI¦an¼¬5«9Æg5¦nËf)Z ¦)!Úw¿²“Áç,Ám#ð3_P4òïã¦Æ›Ѫ…ãb&T—ÏïÛ®©øX’@µcÖ1µ*í`“ZMÁ­àÞ,=äçûì Ñº½ÖË6Èô°“˜‰ù Ϟͯ ÑýBÑ!2 öîÖô0(HÔ=îÁ-ØX1Y-¦»Œ­Z‰(E±þ4Œ ê[Áï%'¹ ·ïÛwð×:ò~ƒž÷Ź7·ß©²[&§ Ó=_èrî|Á)AŠöE÷ÊÍü¹ZBªƒ¡V#×ÿö±Ôöe¡ÖÉÊé¹áðya’¤Ë﵊mýœ*[Nrm´B[D¶[(QÌ|?ï¾ðÚ¹ç—ÊHjÕ«mqáû+ÊGz5Ág­‹DîœhòèÏ}fСeÔò„X«¬5?ˆgõ‹0'ª}PÈQ¡ö~aö6üc¹÷‚MºYW±15ÆA[5Ý'q”ÄW"Ô{ä2tÝîxy¦ÃÔ&~—$‡VƒãèÓ‹QÉ·ñÜYb晪>jK~NEñÅ­üBܯ”+ö4ÂÖè ríX”DqÄEΠڢvKv'0h‰ZµÚ¦ç«ÁÛFd( Ô„Òð^‹Õós{|–ûbWBýñîL*V×8ÄÅ‚ß2·b:Ð9î·,â¹°|rïêì÷z­wOh4Ÿ ½O@¨ú÷V:i¬°à§ly >}ˆf` 4fÒüZ[ôkÄÄë¨ñ/³†ˆ—Ã:‘=fS˜ïBù7mcqÃ;6¢^WÏz--‡M‘býT–ÞˆÊÒãBÚ g¢èò°ÌKõø¥°™pòøÿF¬WM%Õ_u¢Zªã n í®w'Sµ-Ùë6K¿ÿîýBOõlÎã)AÕü{ñ¼Ë˜‰ë¡A ea­‘%6¡šw´çTðöfÎ1Þ>‰ÉÈvéè]LEoÕùÜ^Ö¸é;Uëý1‘V¥ßš“ G(îèܾ-ÖK^ˆxvMÕØ2žkâr‹Áž–ã]Ga"+åU†4ß{æ9¶ÇÀý“ëÏ…ãfÐŒ‰tLÔ“ë ×J†JN…]ÊfÀþ÷­k¼âÔúËí(Â9 )û;½)êZíWÔÔ4¸2;bÁÇÏt¸ÜB7A…ï~ªee˜äºÖ>O*l¢û†¤‘·ý”é$80ʬYëBt¥"+Ü`OÉýXÜ)Á´Å´O{<¸Çë#%Œ?þ &_JòM§ŠŸÑ_;y+ªXºÄX÷L–2ò‹¹Õhäð _»ÏÕÅÄ@ügg%’鎹òT‰É·qwZ|®i¸\Ÿì,ê-UȦÆ-ö!L2Å4¬#„‡G¸€ÏÍŒïÆƒ©Ý¤PPo ôËó½@„æ‹Nά¶×Äã²Þnè!Wám|›÷ RGû—ûcAâÉ =iµŽDŒJn›'c(˜"<³Ä"_œu{] swˆ7ß‹yõ%†D+8 %VL‘=KT{cŒîÖh¢Ydî  °gd\GÏaBje†ŠT‘Š|ŒÜÄ~¸Û?ž!ñ'´®HbA¥^{õH mw°àf½ò‹w{Öð!k§çW®©ç—ZÒvèo:{ÿæ‰çcáÛ‡ƒyñµŠ†ƒw¸¶¯ŠýãJ¶‹¾û(s5 SPc„¿É>` zQÓT`ƺ0Ô,àñ1NqÛ.ÖöÄÌ _U%|ØÉ&Ë÷ƼÀcgH/ ¤YX/ûáâú(Ž4ˆ‚ÄÊõ¦‚ϰus1;¸­Ÿz¹õ† _å†/™­?˜wíÜ훿ï9‘vQ/Ó=¢è0ë²UNû•d,Ê’ Õ#a;äßÍ_+åáËí-°.êÕŒä5Â=Ãë £àŸ’UÝ©ù˜§=oKt3$R `’Êb†hRn}ÍÒIZχêGuq\i#‘Û03Ý+²TEô~qÏ%Ö¾}B­ zeHÄwR£Þ•™TäÌ9MÓ\SǪ¥RÕý ãköA8«ßÛûÔs¡Æä£ZNëE4 pžbpšÕZðžòù–³’ "ôÕ&ö|ÂGÚô€–oûº÷!«Öqþ×ZÚÏìšR…~¨{ºÒæ7³­-ðļwéBÇÑ*­Ä)»Ýé3˜¬³¥fÔøZb".óCõꬪ¾Eà kmNÛÔa¸ˆæ‡é½ÒãDç¬vdq<‰»‰ÄÒ#ÚyÒ³p*áwÓ!bù§J(¯Dç‰øß„"}¾¾Ì¢¦@éŸ[È¥}£-”À©ì͌٤Å÷老§xPä ÃW7!|J‹¼áø=\/6¨Â»wË ùœÀ:¥¿ã!*_á` ©.r"¦Ð$Ž}™xÛC"?I|>¼‘Á‹¶¬luzÝô*¿˜Üð;V´ wîµµ ñ¤$ {]çóûuW}t7»#3}JÓùXTðÖÁÚñÝa«7dh¤_„ó,D*mÛšàÙÎN‘à°BšóóB=}}Îoªô.©I¦Œ O¤Ï³",& Œ¼yÄJ v³záß[±BR¾öðù=39”¼üº¢=>+­‡Ùklìiý@çåôÂk"5šždúÑBVpo_²™v׋úûçrh&ÒÝѨ‡–¡G®ÊrPƒžÃgŠ™î°ªÅSÊHI%/î^·o£ÊiÒ:“€—Ä>€ðmÜ7ezX>–m9Ε¼NF¹1¹±¥Ž@óÌi´ÖÕ‘Ç€îéµjqbV d­i÷EˆÖ^V"à1ÊTÀ-¼GÞ™ø¢ Zœ“w )ZÐ|B¼ü‚elÆSÏÛiîal¹K÷N7Äpæ¦íí®í’|Jr„“~ˆªß­¢#?Ú‡Óvi?SÝO¿$Î(¬Œ¢EOÁo\c¬2µIòž7×­àß”Q=U%Õ©¢?­ÅWh 9êÈ=Š0ÖÖU$±ý¸ùTÍ9ž§zl—‰rPî¥{Ȉhé"×Ü`r¿nü¼HgwfxØP•nEZÖ6G u£QrR™Dc¶]9ܨEÒ@"ú- ´õH$Žò`r!¦¿YýFd·ˆÐ+—ÙÎrê]I¨Þ#Dó-/üJÞA@ÃpÚЂ1wLYæÔhñÛLOÚ³ÃÓ?9k®Î½bÿª¯ˆBeÆHß•#»j~|+¨…ÕÊ^ü-©¢dzbHûþ‰²D*¾Õ¹ »›‚ß¶+ ýàhŽÆý™7;“$÷Ê»Ò@%9C˜£Ô$zbÝN+Cj{fÊåŸ2mM®FK÷¡ù#K¤ÛGŠFȆ<‘FïX:ìòêŠ?†Œ óìóÇrœÆQáH ´¡›) ©"Bm2lƒÏÙ¯›æ¶¾Rùõ€žŽœrÜõ g倭A`çñM{·segêUù”/ÇèâWëÔ"Ñ(Ìá\õô/âBLÅë³h«…¬-ݘJAäÙGŸø(/~f1ÀW8ºmdE§z›hºûf‹jmV¸¥SǾv*Ù²ïìD„õ©ùI±¿S<è߀6ÍYv\*72<ž’¬ Š„)X>ŽéàÆÒ›-t/P "Œ2z“áW×GåG .ðÏþ¼Î3U@úÜÿ!à-Ue#áûL¤#nÅ„™™˜ç…؉ãÙ£ü–{oˆ¿ÔÕmòœÔ¾â,8ží6$€íVáL,,PŽà“ª3I}¹D™î²ú6eïF}`ï©ÏgÑ;ah£êE/¡o: 0öݯ™gsfÞb±šÅ&­× Õíxɵ ¹"\Š—ëøz퉘›ÆTæ”vvx†Ìni§…V¼¿n¤úv·ë‰…=7ë?`j›©º"¿X©c¹a׌ô¬­C@ÏDþøiý£Sw*`ó0C}SGV£¥-‡MÔø(Ò˜6uÜzrðqÀÈfl %áôi¥Æ¼­ëcʼÀ&hxÈã$/±ƒúð˜]XJ Ê|]$»“D‹Ü¡H‡ Ãè3¬óë…¶Á¦±«3Ʀ‘eåaæoRIÎýcĈ^ˆÐ¼GÂh÷;1ÊŽñ÷:A#9æT:"Z§Zóœ-çHK ÂŽ ˜óP SãäTÕ2{=c B t'êØµCB fl #šï~5ð‰‰¤èUö[ų!» ü¾%6ˆ„‡—%ü;¨BÊ#5ýÊÖµ9ÊÇmïœi;ËÉ1E8 ,¡zQ¬˜Œ‹ÚYM½>>¾òLñŒãŽ›½àá`YLÔq:ò½‚ÔÑn•µÿ·ƒµŸß£#1ŒMëÑÖEé´ÙüH»R§MYE~•ÅlÓÀ!̽s,2¹ÕíŠãv?­1Ⱦ‹ÕC«{r„ç½ÁvòCòË?—nîgn 1C‚D¨*5‡‘œ,bç´4ƒÉöo±N²Œ6J}58jkÈïVÉÂ,*SÚNë ¨7ôz¡Æ/O y]Hz¼±JßSHékÐRÊ ò?gá°wÑ«…;ÙÓc¹ÛÌìæ´žÓ€ÑoýQTäÞ#n§¨…øõàˆQç¼dd$;5"ýD«ýM»JüPÝJƒœn¡©þ¥dKT“ð°˜"š‰RlS-­¤mN‡.+¿Ií§ÓLgòrxhCöê”ÜU4ê3¥aÆz¤5¹ö\gþÅrØuOä)Ô–h5]ìM´æ¹"C‚ð¸w¿½î–0yeÇ&K!-pªöà~ån!osÕÛ$ a*¢éQ6UGÑáq?IsÂ…2ñ!OqveØ{ª'mM]uÜ€„;'e:f¬€³É|º-5—³ZàœèI!}ˆë.åùÙ1Y î¥I³üÍ—A®žƒ³;ÿÚºr5Æ\{,»A0ZSÁæëdðf§mÃÒ´3³T3Å᨜À $E kÝX¦Ú - [ì0§G¡¸ý`Ã2uq•þrU…kŽU<ûr SšÚBIٵܫãí¼k6ÉŒD¨Ý"òmèë¼ÎÒƒ€töŠæ‹q«HǤHX ©(Úµ¬Êü9ƒ~ÇÃ*oV1ë+;@MÄåˆâÞQ‡æ• ZVB‰¤mÇK¤T‹+3Ød«?'uQeËÑ&v»—߃޺}åàþDª5@’7Pª±>Dâ‚/xüC1“’ðžãW!À\–uL×Êîásƺw­^µ+‚ù_GÆ)¡VíÖ±IS£½/&~Ó…½rõþPwF¾(L3/çá#ת ÙÎ0“Û::¾ rxcMÄ#Ï|¼ŒïÕ9Mã#yLXú¤r„Ä|‚ã¯öUØÅá„btgÿ¡–ÎG–Òm¥p¥ úÄ©Oaå† Bºt#çá>O ìݺ¶‰Ú³.ÁáŸ2]ZÅE´@Þrõ þýCמ‰}A‰NÃÅJ>¤àªP³·û}|ºÛ¸Ù}…6ñplê\cxôÐ*Áסº- H|WWj¶^ÖéèN¿k•ýCÉúµ£F—´¹Û/FUIw5°¹2N$‚Ò®n²ÀÏÄ Å1>  o íÄ™¼&Z—1µqðÛ—å‹Ù«‹ ¹\§#Üű‹Óî_?>NeÜØxï/ Hdr–ÃG2ðœ7ÍTÉåJÀŒPç´ …õÒé—ïW“ïË‹(Ä” Ïzåî~¿Ð­§Ë9†ê’ìnÑ}¢ ïüñþ4ù }”Rßç%aìk6ÿ’Db“S±·§«rÇþo07€X8ìwTQ-Â’“Ðt NåÛ˜ÈÂû÷ì÷~SÖ¾&ªHÜBó™ÉèÒ ï$‚x(›Ìj‘¼Cë±ò/?±Y9ÔÁ–h5p†OK!§÷dÏÔE÷Òš8ãï³ð4•ÏüXãç]!m˜|é–"—ò•“†Ïs;òm¦Bïæ‡ÛŒäu:¾+Ìž¥!¦‰kõ×pd¤§î}K'“åtJ˜&¹áù¶'ˆß3´Œa†º÷þäÝ*Av—|èä;T¤i)äµÏúj®*Ã1 K÷vgÛú•v¯AÇÇés‚xƒhv÷‘ ÝÃvà¬$U8´¿búr‚èœu›¹§e­'WËÀµ×¼FyÎù=;bi×ÈÍ*±)ÔÞaT”“úþÀ]S0¬Rp¼í¨Z«tvÔÆGz–c!ñn|q:ÂþÅi…««v[©p«âlÅËsF=šð_fRL†1ѦïÖsç—ÌÌk¹óµœ1¡­ØeéÇ_ÞèñœõÔµm˜f&ȯh'•ŠÓÑÜ^yÆq¾À¨XBÖb¶˜,StúQY× ¬Ð³£_àbCO/[XááHô9ú)Fk… ùáÎQAƒ©}z^?›1­ìPj{a8´áŽ•—Œ&„ø­þ L^ïÍ¢ÿø’5{¿`•aôÁ ¥µØ;¸ÉÃâŸ+š,Y1å&Á÷Ù7_ž>_avdrΔD¨ã§ÉµzgÕ©²ñG Á;¯I7/uE9“ú6Ñï‚ë̉°\öq)ÈÇZEÇ;t¹6R‚ Æ3¶™ØœS#Þ†å}K#Úmö{µšhUZe`»\Ñç.N¡8Ó¡úrþ‡¿}¯WŸŸƒ•ËËO3Óâ ¨ÇÀ2A?ö<Ôgé | ­6Z»Õ_ÉF‹-WÔwý3£bv¥r3ß"{*6bsÛª{™+z”h+ÃLBôUç[pXa0÷ÑoTaEæ÷˜S¾ ±rÅÁ69jòƒ.+nƒõº‰M.4û”Ò×s:×Q²\²ü“ÒBÏ]ÊA™¾ž À’–†þrç§¢(.JCœ ?éy;¼í-ƒÛ4”lm?¨]JxtY›Ù5ÙW¶o®shäx•äÍl{ˆsz:%n<Ý·¡^F6K9‡§ðİvc»×[€çKJ> endobj 179 0 obj << /Length1 1625 /Length2 6358 /Length3 0 /Length 7163 /Filter /FlateDecode >> stream xÚ­TeX”í¶¦[ºAî¶èîîš``˜™!¥E@Bº¤‘N¥»Qº¤‘’ðŒ~gï}®ïì_çì3×»Ö½Ö½òYœlz†ò ¸XC ˆ Ët nžHC{˜–€ RGÙCh@‚ˆ“S¶GAà0%{X` ”À@€¨(@DFF†ˆ w÷E@œœQncS>>þi~›|ÿ =‘'€ ýá†ÂÝÝÀ0šâÿìhPÎ`€# (êꙫ머UuŒª`.BÏÓ ´ @0 æ8Âè_‡ ¿KC ¢¹ä‘{Ò „ ÝÀ>@°ûoˆàF¸AHô7‚8!ìa(tPp„z‚~'€Ö;Âÿ$䎀£-ÜКLŽD!ˆ; €Žª§¤òWž(g{ÔïØHÀÑ– 8ÐówI04 EÙC`H ìƒúË AîP{_tl4™;ò' O$æô¯ ø°“=#‘h4÷ïîü«NÀÿ¨ÞÞÝêûÇþÇêŸ9@PH0ÔQHDˆBÇv‚Àˆ„~/‹:ÌþKòtÿæFüi÷ïáA'a‚à¾Ø‘HHŽB‡pÿߦ,øŸò`Äÿ‘ÿGÆûÿîßgô?ñÿ÷=ÿZÅ Õ±wC/À_G€¾2H€à÷ü>4àÿr±wƒ@}ÿÓß MÁ%ú›ëïØ_Ôò0'ôDDD…ÿRC*0H‚:í¡èfýÑÃ@`£‡ú§Ÿh'‘¿aFΠ+ìw÷%eþ@`èï¹£çô's!-sssS¾wZÿXê¡Weäëüwj¦ÚpÐ?…ß< pÀS))€€˜° @DDX #!ðobþ!ù—¬mB@|–‚ÂÂ"ôÿ?~ÿ’¬ÿF£ ÂA¿—Æe¡÷쟊ß0Ð@÷ÏÓG—ýùÏÆƒÁ>` Ñ×Ïpàƒ0—ÔŒ4T]N߈’eW‡v_¸{Q­ÑÛ¼à x{PjIJL™Ýue¸`ݘìm³ïôŽûͺïÆ@-ô~{2x?—9àOgÅ×)¾P!›¢;ißM£ŸLi-áXH ›l¬ŒèØ^ãÝû † 88ç ¾ç•LÍqæNL©‰¥i!¯Ã ¬ÊßùΕ°u~v¿g°¿¯·ý·s‰/;–ó=]`Ò["Ê×ñ£xã-P!›•>ÊìÀ¼¬ä îàÀÙg’»ë¼oúHl)Ø08¥øq[Ctìnµµgm=S5{uhGÒëj6 ×±©#tß á‚ñv"°\—ý°á%¬Gó«£_E7÷u™²K“Ö Ïˆ»Ë™Tì~&óÈw@æIC¯YNí%nù.½È,šlÕ A¶o¥Íš¡ïE}1tJš2œÔ»#‰=ewìíTŒ$7Ä.Þ”‡èš8³“pU¹x-y½-²‚“ä»É4^Êu–HJ=ºCv¬òi;2*RÓÞ©ž¼ó˜‡%Ä0>qÕÏr7Yœ*:54VÏtM1ERù¶.¦ªÔ‹f#Vjalxm0µo_Èád§5^lvÜN¦¨‹GÎçz’Å*êA+9Ó:1®ŸOÖ7Sɲ|–Y“ר›Iù²¿ÿáuò(Àà¾QQO 4Br·. H÷µ^Ó‚{poƒ=)nÛg…"jj°zÌô¹%8ÅSuoÜ~%X7[çPˆõi.YLóoÇÙ깤¨UiÚý”¿êâ}iý3ìpÒÇÄËBP&ìÕ •C­1ë¹Ä®#ò>QX¬˜¥ &ñ§E;Ï l|sÕw¦ú§;:ËdÞo8Es g»/ª}’Ú*¡ôÑßBÇ[w úÙ {^õñ)ÚØ)¥¬4¦0sýª;º8 '»¹Ùm„É#W<¾¶íðùµ‰ø•1§ qqxÑ·q¦øeh‚J„6'£lW¶W}ŽJ(VbÂÁ‘LoU•^y_ÞR™4‚Wé·^wë]¿«?ƒ5 P³ãd4PÙ&ì¶Ôx).ç_—ÒW%s'ÏŠþâs¯aü1a¶|®bà¬ù$Ãf§Š%oÍç1^] ϯÃ)”rÆñ-ó;Û½²tޝÙÕBާ¦éŸÀ§>s!l]ê?—® Ç3¤VSÖ!îЊ F«tq1¬‡Ë£¶9Ñ}Š/):‚jWƒ°Hú›©VȤmUfû±°^fún—nÞÑgtÎ?Þ¤µ¾gþކ¿\©í†Àª`¼˜G;Ä¥‘1ÛÏD§ *­#qÖ‰?  eƒ÷ØcÓá=䮤o"\G¢‹7¬I 6ëºy+üIJ.›NÌœ]ÂÉYŽ¡ËO¤jê¯~¥éV´Ì¤ѸÕÓN¦ñ­¨}êuXƬھdŒ”Dçn˜G»n¯wfäzq_¤ÕõêÛ‘ãD˜¿˜n†vÕùùæIù§/îôv”Õ¸Ç=b‰P˜0>•Õ<Õ{/ñKETÛà÷áÛÊfZö·Re><ßôZµRMûL¯ª+€ÐQD¿K(•@=Ëë]ÈŸ´ÍÇlj¸+pL# +9]¿w©úZpŒ¥Ããó;2¬3 ^U‘!ã·¥zškid ›¢|ó!6¤e‹)¾§^Ÿ³iF |#uFI0£Hgùxx$h¸^V.$ëmèÜÈ…ìÄììr0gÎ÷ÙÄ›‰GÔ)“M‡2 .Æ”êey);˜7îé=y>–˜àŠ1_³¤Ükb >î§Õ_œê0ϾQ ¸;ñ^>žbf?«ö“†ø|ÂŽhÉ«»¹Ù;vûeûWŒ-|·XE¶½Wj¢¡ÓfYI„¼Cê €<ðS˜‰~cL5»M0]ž(%°B5ä¾@±c¤þ^ý¡Êa #‡QIѺ¶I¤Šx„­3£ËØÛ“Já(àþ=^_#ø‚õ;Ü ð’#',ù×ñ­µõD·Àu°Ü+Olœí+¼4òv>žÞFv¡ødjà Ûíxå+Ç)y »Pmªódƒj†}cÀÓGéÖªÏ^$ß.Z‡¸g1É&*}ëµ…ø-Û]ŠÔF3¹-ßc““qd=XgšÀ™äP”ƒ³8áN°LzøåV—¦$‹KÕsÕ¿—ýX0ÔÙ¦cñ©µMèÑ}¥¾MqÿzW9íƒÔð×––2ÑüǸÝßóˆº9둵wJâu¬_®è8ŽEû¾d  ÄK­)¥Þù†ÖJºhõªGŸ1½½£OèQ м&£®Ì1Ìbù¦-·¨üˆ{B_8>Μºæ©îÆD™À˜TŠütw_ÏsðK©-ŠÅnÁµkù,Ü!Óc]9Fógn¥f> séA…/däH„»ã…/FÖ¨Þ=EIœ|üÁ>Ý0`2~>Täh%Æ®èy›KcUXü1w?g4 ÐÙ•ž8@aÕaù[¾ s¨Þék5Ô\÷ éß¡Ýz1ÀÝlÊý•#™ª?ídàðÆ·Ü{9ï:ÿ!óñ9O%²ØŠZî'·ðÀ1Ñé#le^wSæ„3á»^øc’pEüÍ ?âU¼þÑgö¿îìÙñø±gšykÞ‹º¾l‚„:·jkF‹•} O–H,R+äHo¿È% 9xVèHá°>ÓyûKá ov™zzš=¾5Çäû]’KMDžŸ;-Õ-áyg!W÷pQ²ï <ªaà5 b(zd"ûÁ"çÞ`I*÷o)­¶]þï],á+øecÕŽã.ã¬"¢ j¯é>WxÒ¥ˆHŸ;vìÓ[7½Pž³X)o\“–b)ù†I:gì…yBt\+UG)ºëßs˜ïkh2BLÃݪ¤=Qu0{æTBOGùâ˜~¤Üö3 ÁBwÆÍ/ó0xM›á¼ÌBq ãK­M9'øÏ/òÆù[%U‘$¦zÔsœö8^Ê7Že¥ouCœýë-KʧÞn‡¹fE…nô_‘»@%åèÜ'Y5uïUK‘@x*º0²¤Ïzé€{ÁÈÃòP_g2“MÌ Ó¯g+½Z¸ÆK²sZ~m!ûF–2ðÏéy.Wr·Ü$„.JZ<ƒ²&M,;ž ç—oI#¾´—3Æ;\_›-vÂ% ß\²f1´.$VKãDé’Ïh†‡1ÝCƒRiCR:ø5Ê_K‡L¯ó¸'Ð>KQÕ¼Ž„ÜœŠ®šqÝqËLÅ3Êñ¶È{ÎÚ¿‘gÑ{wØ”!ÔNÎÄæªqb ƒ’ ÇŽ\¼Y|Ñ~'kO”0„Çr·hyžC™*yÕiV÷àÙi”J_¯nÖÓ’Gbi-×Sû–UáR{ »i#÷—ÁopÂÊ“ ®f/Dl°’øuCÛý[»õ'âÚó:›0}¯?3c¯ ÝJNkíM:D'%3b¾#íIñÑÿåçÅK€¹ÒV(Qô¸/ˆ«'ß9±‡’Ä®t ÔåO¿ZToáqÃiÿ ÐLùJå•yœ“6"¼«„¿»UûRSû]Ðk ,uÕG”ªN·]wÞ{¹kò&– ÅlV0 4]FËqä7Í_tªTE¬¸%6pëWâ0##¶ÞÝ#4.,é<«^“¼üôôƈm$A[=ÿìÍq«iõ.aáãÜ!|‚¤ ½Â¸ @«àЋL1â;Ùñ¸÷⺠ZŽ\UT¾ÖyÕǤÚr÷£NæïÙÙÛâvGÔBô:ØV1IŽÌmíRâïIGØZØŸ¼¿?ª›åfÇ`S®h¼¹°Þ:v³¶ 5gxIfºð¿ ¥“c¬ÚxUôÖ}Dº³ªÁ1š§<&Ì5iêœàÖV|/JØ _Ш¹Eôòö#åö »Ô¤‡˜ï¶ˆ‹=¬’ÎQ1Å·¶jØ7Wú1éjñ(ßVuÏAëg±’Ö÷Æ©7-Î#râ­>uuœÍ‚{›$.=Ljâù–&yͯWñ‡F1Œl¤ô–LüÝçW7òzϘÝòkéEìzç ×R_™ž«Ú>ìá+©žÅwšÍã\àP¦6湆›¿ #˜`ÀáXÓpTY&¡ûB¼ó3{Ç|™H( QÃÀÉͤ·“Cî¾ÝÝ üÚsl î”2Ñþ<Äþ­œ„xÑíˆ7^ËÞž©Äú m)nBå属ØÜŽ™P”UHs“KõJãr‡Ú†|>™MHÚÇýf”`ÕYÛÝ"úû-8õoîû$})ýFÀ£(eIí¼ÏvhßÇÈD£(HCí¨ ÷Þ߇ÝM'fÄ’f¿¥rë^MÖš`a³œ9 ‹“e¯Ø ³‡ÂóB9ä~n3Æ|A½†‡ºMÛè ¶!ØJüZ«FzÀ/«üÔÍLüùÖ¶éš =.–õ6ŽñÖiTVfoºô “»+;(Ç(½÷t9-è:–Ú+.ÎaHæea—ŸÄkÌÌ/¾)¹ ‹F?pÝ¡ü j}\›ªÛ´˜¬î|dâÑ,K. ©SoP*œ'•K¢’Cçy/h6NMSÔ±…Œ{ïÅ:Ó=ÎbÝßaËáÝÀᤷá%ÝiO‘TÂÔ1Í(¿iœ½È´&îºçlj¥]w)1óð¥Øðe»õ~÷}êß¹ƒâÃsCØC+é©rq«“9‚äo¶_*±¼$Ù8`Ùã ß5è‚YÆ8Œ´áV<ôÀ$(š–•cÿÉÙ0sUrdÖ‘÷Y?šýÇÊbʤleï û."ü*õ©‡Œð iŸèu¬í1+„«¡OGôþ%†ü¤~“R¢¿\ý—~‹Ù'Œ–¹?,ͶŸ <š“`çÞùæ°ºqrø9ZùâèaÝæXŸ­ù÷ÉçEß0˜óæû0kù†×A‹8'¶?$ñeæÒß–ƪҧ ô—6*¢OÍŠ·ÆŸÓÀJß.ꕦñŒ#é;„H¤“äù<ê@ý:z IEŒŽkiÐ’‰!©ÎàÏ"GrÅÎÛ‘1BÓ[™þÝÚÀ‰Û+]-]ñãÀ[{P e~²ô•B…9ëNõ#>E‹ìp&³/¶º`1ðB=ˆOì´…ó²ò J¡Œù•åíÉB–-·j {;L¡¶šó)#~‰½ ÑúÏÈØo à‘ÁS}à)Ü¡R7žÁ¤åiæÏxµÄyûYƒˆ…[S½fŒœòxÔà.íÊ G¶Îš×‹jü±õ†Ob>·`·p•€Ÿ¸àMËEOH·¼ŸÍþÚ/Eš=FĘ®ãšÉ !lHï2ü ýN“ìÄ;Kf2‹7´ÕGøTŸ¬Áβ,Gæm'^Štpj½¸°¼¥rD™„0œÆÅ•÷•(¹Ä’W®’XlŒÓ#“ò9Nµ\Žçí|8f$v4oV>NùZîñøËÔ›Ë)×8rp>§ÏËwÁ¼9L¦7០u¨$¢‹V¦z]çLc@ç*B eIÁÚXõæW5}[^x¨šM¢ýÃùÜ·6^âÝÌ×xäýçãj¿lÖûvx5ÒÕ¢ Ì|ÂʲњÖ÷ªbMeÝÎ×èÂnÖx¿ÊÚúå˜ÖJ:3vY©“›”Ã!ùý²2W*¯÷=e–š:ßn1öÈn\Ìúöu‘(½¹ÀÏðv6‘Z0s-‹ëš±™¹Çðt ¤PN€± èeúézªÒ‚š†+ñâúïéwº ætÞ^¬ 7|ÙÆäq@ac„Õ¡,nÖµqT@i†ãÒvè¹jðœfU'gÐ*Ô"?0óÀùRõÐåˆê£ìTÅd˜tV®¤Œ4ñò=®ÈbY%(ÚÉÄ4^»ÛùCyhÞ¨ŸÍ¾6fRN¼Ä½É2ª×Z‹ôtWÊ,.Ô³ .†¬Œò´ëïmo^nš>R+«;^LÍà >h-Œd&W¸Á ã®~WúZyÑwÂ,„k<ò!¢>È8ä™Åz`5¯×#ùÉÓ@I[,ï2Ó3ÞÎ]vÏ@Âò–LµõRȇ@ð“‹Œü© |ŽÖÂB—«iö*©L:ºž¯Ì-"Øò˜á«L:éy3–³ÓôüÖ±kŸÕ&Ú ÑЕ3YNJtßZ_ÂrõIŒÒ%,’{¾tCa˜ ºG5ËEx—'­zjªQ„:žêó5Ô»Â$ŽòXZ¢1Œ÷Þðeã2y´„uÐN*•Uiêø‰Ü‡ÄoÎçk²Hœ%ñPsy8¹ñ1ýX ”ô4ÉÞjF®3Ú•>3‘X~!Î+ˆÅ¼_8çôÓBr©ãÀOÚøã¾ÙAA{„½'²C”t¢¸¤S]¶›Áè¡d0†Xý<ؤnÄ¿EàT#igÿÚnfq$¦úìá“„ å¡=È®M¥íYY\Ç˨º4ÊÜï½Ê¼ u,ŠÃLbmì& +_–Ò·Ší-½Åfîp訊Þ+¼”~­RÔ>ú©ªC.-™7Å|â•W¿P-ÏÁò2¥bü!N#ŸÂþhI×ŪvË endstream endobj 180 0 obj << /Type /FontDescriptor /FontName /LYYYWB+NimbusSanL-BoldItal /Flags 4 /FontBBox [-177 -309 1107 953] /Ascent 722 /CapHeight 722 /Descent -217 /ItalicAngle -12 /StemV 145 /XHeight 532 /CharSet (/R/a/e/l/nine/one/period/s/three/two) /FontFile 179 0 R >> endobj 181 0 obj << /Length1 1144 /Length2 1887 /Length3 0 /Length 2612 /Filter /FlateDecode >> stream xÚuS{7€ {ûƒt>€‚x2FGg Äc‚ßÑ(áÌÉ<]È<”ßÂàÞd`†pX"ÖŠˆÇ¡k¬ù—@„CHˆ…$$r˜ŒR.…Ïa^ŸÍfB Õä"|äZÙ÷Yg„-à@tÐßê¸ÁÐÐè‚#@¤à ¸€\ˆºè"d"ìùL¨„;ƒ´hê|,‰Fv¥B¼ùv}Ç&šš²idÅL¸4ä™n@ u…©Îk^€‹™Ÿ™ Ä)hSÓÅs‹†‘88ñ;˜ÁÔ…–¨|¶éVŠáƒ›\þF!Ì7Œò<Ö KÀš` ÆS¦ó)·Øà‰›‡É05)‘°™É“ ˆþ0‰\r,ð8|0)ñ‰î08@…(< ¤£×ðM…AÚç½7™Ç⬠‹°óß×Uz¡Tf ¾…ûY `êëìNòw2\Üû×(''•4Æm´ŒÍ¬ð¨SPEÞ|±"‰ ý]öÛáM0 Ÿ G'ö¥øXÃE]è/vðO%„Q@@ÿ›IB±x,êô‡ûWóüƒÿW -ÎáÆg2ú×ÿÜ8€vμ€ùÞ™dÎwádÄüËÅàgŸÿM<2¢8Âtæ×1A\7(¤’ …ñÙŸñ­0uáÅ$„ Í¿YÀ‡Ç-â¶0 J4 r¹¨û(¦.Jé S*Óê?2‡ú˜§)|Ï¡g¿ìiZ ƃÌ ¡X§F]Jm˜­pT‰3þã–y«åÖ™O| ̦ø¨É’¥èb‹‚7VGs]H »² o ñ=‡T\lŒ‹&85šH)¬JSXâ!T~arÙÆ‡(;)­ßû'¶U9k¿Ò±ÓÏœ×=&4Kf‚t윻ö «“ÕfƒÇžÆøJª¨—œ)]æûT´°æý®W¾Ìýˆ’}M.ب]{Él¾ZuûÞæ`™ªoW•6*ìèµ9Éá“ûö¸cx—&#U‚Š7›º¯š½g4z:4‰7KÏ×›2í’ùø{‡AŸ¬¤Òá,µaÙåJJ=)x/–õ EZ%§ÿ—¶ÆÛú²V÷Œáã‘åqZéŠóòµ•ø^Rî¿ ÍÖt™u4ÞChSô°ý©íŠ 5mïr¶‰Xk‡ï„u>‰uniò|4Ú%v1T]ÌO5)?¼+Ö©z¾sS@ĵ3',Ý3ë,¢Žgm&*w¬‚’›ÊåfKk<ÏSë ˜®ûƒ©d¦-q@yô¯RKâu¶á¡~Á'÷XTù«$¼ßìd¬á¡.¨eFvåñqcï&­ôR.ͤµ`à™ÕõüÖ"ÝW/C9lB:Þù¥êR µú»UJ;ÙªjÀ¦ù¯ÈaªëR…ÎJ å{¸?ëɘý x¸ïJò–Âþa:ðSþþ}²¿èùˆ-?¬d1ö±Ì®%Ù’YxD's_›ÌîŸTl_3Úí/æ¬ö|«Pa¾cótBQäq[Ÿ.‰mz³ç~kâ_~˲ÛË6–m H è3Ò—®I©1.X2íug”¼:#*WÜ‘îù9í„bVíÚ?Ñm—§Œ+Ü0-[¾ü ” 8*ð ‚¥)w£<8D¹ÇµšŸê_Ò{2K/ÌTÉón£6ÇT!¶cäÔÔL‘ìíÇ~}kP¶>³†=q{dT!³9pQh½¾Ñ¶å×4ÙÐÕRØ´;5è¢Lxe—¢vÄÁû=Û·$Œ—ú:D«²ŽþéWœ½{ÿ˜x_¹©µ¾ÂÁ0IsÝëÞ^L›¬|ÏðÖK‰è&ˆ•ýv+·èð]¿˜Î§$â)’¬sº(èµø3Ì,F©hîƒHì Œ ãXmÝDä}_©ž)õçb¹ki¯ù!uKÙssw~)Ôu¥è_4o˜Õ}»4ˆ8ØZjǽzèŠÖ«5…aj;o^Ú“+6ÞR~r5àA&ËzÄ#ª{8÷]]¶óÜÀ›RM¿{ Gže÷åd‹é]/á<ÙÙ)™×;Y1tÁBG5ýHÉÉú2)3ÜËóç?Юº Ö¢6HÎIÒ]5¬rÆÉÛ†¶ló¬ù¾âѽ\µÊeèg>´kÛ2ûx6uÅyAÆe$¥Áòü’Õãý“¤•¥òô4´c'ÿ¸47A¤Y=p{·Äã,ÎÔsª!¸%Ö‘Û ¤-zuR+Aö§·Xt\ˆù± /95ÂúÆÒkòîÍòCŠ^­¢ÍGïž‹¶Å¿ÀçîÓ8 ‡»Ç9®Ê×ɪI [Þ;`;ÌõÃ"”œÉ%œˆD•Ëâ›×‹“~°±1;5$t&„ÄÝ¥Äþ¥¦"f—‚åV‡ÈcFxú‡*¬.´*ÜK“Q¶º­Ì u]§ÑÐqÔ‰Ö=™ž#¬–7ù1B³R6xìçŸYÛ~ñ–ñ€<ß–€?eý¸?ø.þô‹å¸>õ¹@U=§BßèAZŠ–w½aÎÊ虤CCbÄžù±AùAö³ÀtÈËõ~ÖO0G‹ÒñœÂÓ¶oÚ×™3ð=~Ý-ÙLäHýG-ÝMkwƒ}nP™•ÕÍuk^Œ€ù!Å….O¶ºRï»M_Óò=iÿþå#§ý¾Ó3šÌëe&@+˾4xØÃn£1ºðB³Bò¸oç3¥*Ð=“õôŒ¥Ú@û¬>vŽw\¾à®RŒÎS¹ØHV¸âž£5§ã¡@†”''qjRÉIÕîÜc¹2»Òã•z%ÿÁ ø½yòvó)öŸÓ¾!µpÒÙ¾þŒY5äæö½|ÿÇã½öIì)¹±Nl½ègã&^•õõ5Wª‚òß\€“òq¹kS)+C»—Þ™:zÞÿdSÔ}ý8å䌆½K˜Órøá‘´F âãL÷~® MPý_ï7 _ endstream endobj 182 0 obj << /Type /FontDescriptor /FontName /OCGPRB+NimbusSanL-Regu /Flags 4 /FontBBox [-174 -285 1001 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle 0 /StemV 85 /XHeight 523 /CharSet (/A/E/M/P/S) /FontFile 181 0 R >> endobj 183 0 obj << /Length1 1626 /Length2 11862 /Length3 0 /Length 12695 /Filter /FlateDecode >> stream xÚ­xeP\í–.îwkÜÝ5¸;ÁI —FƒkBpww×@àîÜ‚»†Ë÷9s¦ÎûgîüØUû]ú¬õ¬wíªMK©®Å*aî` ’u°‡°r²qTÁv¦®.švª‚ʬ* s0àM΋BK+å BÀöÒ@H  2HƒÌ\\NAAAZ€”ƒ£§3ØÒ `ÐÖÔedffù—ä/€©ç?5ož.`K{ÝÛ‹ÈÖÁÑdy ñ?vÔ+Àl H©©ë+¨ÊäTµr {3Рîjj 6(ƒÍ@ö. F€…ƒ3Àö€™ƒ½9ø¯Ò\ØÞbI¸€GøÍ äarüKÅp9Û]\ÞÞ`€¥3ÐòÖˆlofëjþ€7¹…Ã߀Þ,ìÞtoÁÔ\ .fÎ`Gà-«º´ì?pB¬€¿r»€ßÔ‹7Ks3׿Jú[÷æM ‚í]ä¯\¦ €9ØÅÑèù–û-˜£3øo®.`{Ë!`8ƒ,Îæ¶ —·0o±ÿêοêü—ꎎ¶ž{;ümõŸÀ­ '×[N3È[nK°= û_³¢`oáàäø‡ÜÜÕñŸ:7óß bøkfß@Íìm=æ vUÈ[JÃÿŒe¶ÿ=’ÿ(þ_!ø…Þÿ?rÿ£ÿr‰ÿï󿇖uµµUÚ½ À?v àmÉío{  økѸÚý_.@;°­çÿËéß­uAÿ@+é`kþï:ð­%ö–o´p°qüCv‘{€ÌÕÁ3+€Ðö­_˵íÍAζ`{Я·ÀÊÉÁñoºV`3û¿àý‡ doþïðߨú<»¶ºž®† ó³\ÿ6TÈOÇ7lÿQŠŠƒùþ #)éàøÌÊÉ'`åæá|»{o€ù8|þ›”âü×Yq{ ßêæàü»úÿxþuúøoadìÍÌÿ-ÐÞümÒþSð—ÚÌÕÙùà¿/ÿ[Õÿ<ÿ=ó È eqÎÁL8Ø:%=RCÝ?*mØÝÉ ÛâX\ÿ¡ ϿʡÃ/åˆ`¹Ésu[øПž¿Ž_v™v;ñmé;’@§¹¤>ÔŒ]yX«t­ü̻쟊ÑSëF|>›U^‡3àãÐÙÝÕÐüTôŒ@6ÞÊíŒtvÇèOí–çKsëøÎ×,¹.¯ ³ »&ÿè7]üÁÝ-}ïÐ@_Ç|× sV42­0À7ñˆ2âiâ|]oöþÑßJ{ÈÕÑ@qQŠ-Ö¼±%MÅ¢r•É/½‡¹RmóWuÕí•J¢NàÇI»Û"i ×êƒéZ9'¸¦ÞÞ_dPõ1i”¥ðÚ1w‘¸°¡½[”I~^öxEf†¯–8_¡X)àJ”Ê{6õÖ ÇXÏÜÊšK G²•ë(›M;i'Þ <Þv-³ ä!Bb2]ŽZ-лí;FÅgížÖo¡>þ1ˆºŽmôΈ©^·à—CõÙ(g—.è{_—~xñÍŠ)ÄøEÇ »crŰ]ZÑuýFãÅê)«ñÝp ÃY¥7ÉL0å’ ‚i=¦;³» nN7Á$^‹FlÖBO0†Ñ„,餄Û=ΚDô=SóÝ1xs‡¤Öû¡K–c±ßOÊ)AOcî[(-$ÿ ädhûÕŒ@}ù²CîÃÇ:عø—×ínÂŽOøëæ>±¬&Wã"u’9`_“­ ŠãÅ»¨¥bˆ þçð?¿bß„•˜.’ªïÔ6¶V{ÈCýˆP¢¶´üÎŒÇÒeUÿ#jpú.ËÅ‹«{UDEÍñÄl„ÍŒpÑê<ü•ÐËÆEI³þ^?nËõÏÂ<Uø³/zÆ·RIó–Úˆ•a¤Võ^$rÃÜbÜ3èÈ6¢%|¼ÛÐÏ-QCOëTÁÌŒtN9¢Œ ¸þ3zà‹Î[’ÜøK=ëòVÌ:èpð‰ýµ¢Ò%œVQH>c¨œ5¿ŸqÖýæZTaœ‰œè:uùu.[“[!’ìÔt²´P |KJu( Œ'kÊϵvzþÃI§1u"Q¥~ZŸ9Jü/q”%tÇ€ ©#·5·Õl_âJ®{%öOÕ"YÏ•xëGÖ%rHtšWzëK³*~Óçg‚xËRõ1D²GEKx$³ª±‡¹Î»¬!Ö+µÑ2•T¨|‰`qñòÊ+'_´‡NÍÄÙù­†–€ÁwÒÃ̽Ï÷HG¡‰e;wW¹¶6W*„b+.XüäM€Ïœ[šä(«Ö— » ‡iΪ£ct*TÜ­§Ê1RVBU'6æ35pªñ±‡‡ó†äI7ß]»Þ„Ôíá¥Úbµ*-ÑÒ¸0ò¶|´ÂÍ ²Dž¸7=Ðf‚¸OÇgÓä ï ¨y¨úͤŽÊµÒÁˆ$U {軨ñ{Yß÷Eê!ôKtÑî0?NÐr*õOÑøéw¸Ó ÜA9I?&G’¢J>cfº¥BñÈ;EHâĶ©¢.ï?ë­tŸ£_»ðŒÉ±« S‡5ÑOL\øº?/ñ¨î]fBõо´…I¶Ê78ù£ð! Ÿ(vT,šegfUH¹õq°}ùYÁ>âögB¸L–p¾ìKB!y¿· ÜU*ü^¦æªÂ}¤jçÝÖ†¹¡½øÑH²<üƒ —ºñœÑZŸ~Gª*PÂKLÙŒŸ%‰:™,¶ yzbÁH•˜ô‚y½¹Á\ñ"-ÜÖ´¤z/[ŽY˜úZ÷»JîlSfdDU©k¾›&#¢ÔïÀ+ÆÒiD¨¨…Ÿ/œrÛ‹+|­KŒê\px@Ü(Rx 0„€Öϵ4H÷,û«ídYòQ\†¢1do9æ!ÜÍKÊ’Œ[?wFä瑸¸Xõúe‹|BFñ»˜›ê+¿´; „¸zƒþ¿T/D_Êè4’L]°ÖkE`¾ôãë3º”f1r¹‘ÁÆ@Ò„3êÒ”åÜñyîòZ¿Rnw{jœõG¸'³‹ó›+Û} (–XVñðÁÕ ãæõÄh©ðƒ/¶ó·€ýâ“Ò{†q#ÞDùñé´)¥Y/’œšqgæ¶KÚ/ßÚf©†¦Ü¡¸c'Ú’r®2?÷Öé¼JuÍ÷ÏëN%€¸hø<ŽUD†µçM?Z¨š™ú"üÈp™_|©6Pq¯Ð×ÚâyO(Q0¿½ûwá¥|‚zKL¤­ÇO`jBšÜ2…’ŽVæ__&ZŠ¡…cœqp¬ûSbÙ0Lj(ÉIK„»S•äé¡b®qÕ !º_QÀ4Óû=‰PMŽüÆ\K¦¹M}{d’ò`êŽÀÊÓÀiJxõ£l­§M9'…Ÿ ¿ãr%’ä 6…à¸/ÝS¤…6„Ô~` ž×¿Ó•Çœ~-¦Ok¯ˆÁúf¹W…ǬUyÂgóË=å¼ µ?*yrt¾¨r3¢s0AΜ2Ñ#Ø"$&E¦;§Õùf`0°©Ãó`œ•F> Á0- 螨ÑÎÓ k:ÊÈøpÏm¬=žTÜ^BMºO*Þ(ˆ·ÕÂÖéð9QûáNUNí¡bçta:ÏFó¼ïûðAÈz2㚺ó`þ—Wã ¶¿Dqîñsœä†XwaÄ›+»ÏûÅD«måžâ¾†içª5n>©Ö >i±âYsnÇøŒzîÕõ/;ÁÛ,>Q—½Ž!bð&úLßË„fÍ×u¹è„*ð'Зñf¦C9êG¡e\:†y­¹µ[âÊ`Ú EåÍ®k4I¶cN;Œí å`ë ·”µÀ¯Í±Úû*Çꈻt¥d¦½;]!1ÜЃÈÂLA&ÿDM¿&Ž"¡æå_AÑœ/K‹¾…°¿`~£EÁJ±„3‘íÖ«ÊŒjêÐ0\ý.^9· ²ùæGü(ÆoB«…W§ŠŒú¡T»~ŸÓ(.DÊ^Ïj_ç,Ï”ÿâJ Ð1îù9ï+‹œ•9tMÙÑݽz5Y3Ó¨IPbiwK,î̼)ä!ÙzÅH$DäÅ…§íÃTðÑžØcøYÇw±"æ.ëò!ËŒâfÚ`æºD¸è„‹ƒI%´sÚâúJÈ_¿OïÊ3àZ[ñ»¼ªH>êB¤Nxû°óièŠ.Ðôö4H¼Øú”•E"Xº­)~mغ§ÛBçû¿LjY§ê~—Ç›ßàɺjÊE°?˜÷Y~âÍa¿M¥þ¹°R„Ãêö])ÎÛ’ÚÛ@V_G©Ž!ø›TÁÜ÷j@?~aðë%=­l5åÙJYÊð]#ïÝ¢ùwÿi°%Ëtjì¡sJ%ÄÓ®Kž'ºêTØÞ}¤YYW·:æÆÿǾ†`óëãƒ!€¿:~„çsÆ£<ÆuQ4†W‘FÝÍŸ5ýNí¾9$?ŠÍmºDcÚvQ‰€AصmÛlú$8Gm»¾qO*ìjºî€ÂcEf`_6Kõ×ù9ËYÿ¨ìÁË@œÝžö^hyöJë¯ËÑŽúãÞâõ‰9¡ ì ¸WóÕég3I¡8ò2î2&Érc±Ô“ÅM²”Þ`iïû~„ÁÐh:10õ8R®Üð-)ñ…Gp©ÙRÍ­ µñ„lc¹×VJGß¿‡ÐúÁ+´FÇvä ÊCY¯úðu¥q¯VˆôhÃfX¢q8aí¿]|šƒÄŒäÇ?s’>MÌË Áý3çÓèÝfÀ§·ët´(Þs3®_ƒôçºêó ˆù†á÷IBxML¶¸áu~‹Móü8Qˆþf<·–ÄÚ.?ÜiŽ%²Í`ˆªÐ­ñ¼çé>`©å—S•ôë°Xt?Íç͵ŽÝ8Æ. "QÆ2{¨xÙá’zkÊZâêÒVDW?˜3S§#³$™o¿{÷ÙE(²#0òºseSšÉ;¤¦bÔ—ô.ãKÑ’ÉS¢¸O+F‘^I#v:”†sÏÅj†ŒSÉ¿Ô?Ñ•ve­(¹F¸iVDWñ!“B·éÝ7~! œN x ð“—îC¿[Ê÷§ü:mE1¼GÂâRÂÈÈܳÜ;ùß®°ÿ2Û­­ñ‰›Ìˆêì†ÉW·Ô×jÔOæNU\é]¢ååÌw­ôÁ§¶_ÎUÌöDkÛò‹_t£Þ†‘à#>¬=I¾ V6®ïb_ŠyˆÉÿ“åÌÓ°W| —<MùûÉrëÓ²eç5HÊ#üi¹¹™‚zŸ>$®Ù"xûY¾Pœ6Pä„‹ašFÉôyÈ pVߟ(gNà$`£ö ¦‡®î™‘ž‡“˜±Æ¥3«ÿ\ùà$V.ÕÍ >c:#¢”ddÖÎÃ|nR#ñAã8n ÁO¥BÅ4e… 4Äü‚Ûõu,JÇ m£‡½³Z,¶È%a—°,(¹™ ©à:å…‚MæÞ˜‰‡ˆ8÷»JmóʩߣäÑ?ãAñ‘eè!?s•!˜a~T3(o¯ù‘Êøµ„f«ÊOBX úñòªD®ښòõ;¬`EDpغÁ³dQ¦ÄðQ×ì  $Ù%¢W{˜“ƒE†ý!ëàKvÚÆ¬ñF .`S Ç É€ká+÷•ɘêiÿé,ÂXµ‡šæA§¨Ð'ÅÏlO´cÄ{ËLä&–¸„¶1@^ס V®_óŠ>Ö"wqà¶¿•3$ô·óeÛÇç¤qjnxz`äÔ÷€Ö" KÚ£xZduåYþþ”´‰ì”ÃVÌ–óƒ‚àÙ¹/VbÓÍêŠÒçá—¡–tæ0›ø”…EÔÕ%° @Á')³Îû¦Ó±¢¶µo°ößÃÄJýüéù{,‚¬‚TaŒæ$ŒÔì4Ðwêt¬)n?”ô(_G,:Û^dÊ#ÚbÑ ¡b ,<y:"G;¹©¯uÑ…”ÜÎãŽ>¸K!Ä_vº•› Æb6ˆå¶¡à•; áØüœÛ «O(46¯ÒH„Ek#Ö‹×YÜI5ÏœEyíc·‘ Dúù2Ÿ¾ÐÛ¿'¨¸ÏT:JgÝü=>øÝ…ºÛ/É‹¦Käx}è’ïX%¾’òÁwzê´>(˜ë§6ý+S¯ŸÖÒ íÚz¢Îae‚/R1ë¢n/&ÝgqcW¾zœ’å.˜fÉ»¯hZ¬Ùöå’˜ÄG#ëüèSEüÝJ]¶Î²ÃóõûŽ÷ºtu+¦;ˆwÎäc»èÇÌ:_§¢4šÍ ÿãâ;JÏÊ%[fœ1·Ç´µè¼‡Øõe}Že£Ö¢Mçä!¥µÆÕ0¡#Áññèã)-ÄŒË9çë7££Y¸^•~Rþ"½ì4®ÿ ˜èþü«2( èè߈´iõz=]ÕÚö\£âÖ­üSÛ±æ%^ªKº˜J)œ‡æÒ5+bªG¢‚›®zB€ê+K:²ìJ:²®} ÌÀ4JÈVr¤ØÉJ²MTæ&´£Q²ŽÑ—©ÄX¤—[à—¹½ÿ§È%{—Ywíáï¯7JèíåÁEÌ”ª9:T<´j{êê#CŸéUIƒŽº¬5g›³K_(3=51åwteë 1˜U_™vQL%§œ_PINåï ¢’8¥S,u|ÿB$$ _BWHñ€æµb†Ÿ±M%ß¹[àê7k­¡¨ïª«½NË~KšNpšÚãê>-&ƒo‚»ˆh/ÒšÕ±0#ý3À UïXËiBŠíÀë~àµOJU8ûÀ_ö¼+;-‹÷æÿ²Gÿ¡ªvÓx ^XWÏlÏ2cÖßÐÊ”9iÁOËWm ÌôZ1[kwb7èìCBŠ “Õ|cl ™^©‘· ¥bÞïÅ- –{ЏJ`Á©Z©J>¹©ÃÌ©M–C̈y©á ©•¸¼¹¢©qeŠ™àøà‰÷1e7†U+|»æ@>§…ª|í,ý^V -¥ûÎ¸Žš<—ý’yûUùÕ2v¤¨­f"Ôãþùž„Ë ‡cʯG[Qçļ%˜:i(Xµ€t/ ~iiÊ!⯻±àÑÎéA™fmTEž±¢vJcÞaðGÄTéÊ7ãõõí.Má6Ã,”fÓkS!8æ·?pæ!UG›SyD~nhi| ›«ÛÉ=J•9ضÎù©eÿถÙlÀë°YÎ÷Uâ{ù⇎2WÏå”Nôq’@åÃ(1i㫪"²ƒ¼ÉU$CìÊK¦uC±Ïxµ²È´ž@†cå-Ù…ð£nœF¥RÜ]¶}{á}¯•ù  ˆóZ’?uhÜ–ãSYÆa #ÇìwrâÜ{Er£³Ò%×±€K[Æ@w û°»peÖ}fôOÕµ™ðqÛ'³¡Ëbœâ½Tò^QéÊõv&b‘ÈäòÖw$ã¥Ó˜º‰QÈ7WÐï–ïqJí¸·±øc]œ°|`B&¡ô•㢛§ÉD¹™ãè†Ãxú‚;vïŽ ¥;›§›¼¥#‹Çi¿éyà¾6à<'Êœ®oÞunŽèܨE&©ø°×@9„En%¹O>PüQÅnù8ô 6>®‚tžž]‰Ñ¢1©¶Ùjá÷š#TœN¨H,“ÞUâ8™MýfzzŠyøb— нÀ#\¯ß»=;'Ë|¿w’»ÿã'Öe¡Òªj$ò‰cµéo±&¤V])ùnv4íN8ð‚´Òs5´÷AygÛ:j¬,¿š¹²î ï”Ï?¬±5œ)ÍÓ4ÖÎŽlã Û@-°r°y²Þ_½ØG=ðå ‹´R9*ó}ße“4¯EdxóžâªõÅÉßšIQEe$Ëéû#—ªx˜"b•£ËÝZ¦V3xçPP~æ%ÿвšdp¹’5Îj¬#U-ÔÿÓ~çÁ3'º„”kJJšîf¤k&àʳLKv~56†¬Ki(`˜M¬ t~æ<â-÷g”j4ý6dt¬ÖjÚ' ¨— FOBB,(¿wSò`e+ýŠtÐ)–åzb–U•êæW’ãonÁW~W#Cþþ|5Óæ'ú®JŒ[üGËͰ÷¢ð?/°WõÝ3Ì‘ïXXÅ_æøÍÑ›ÇÄŠùýl»á¨ýo‰üùø…†r»™÷ÅÏœ2IéïHÔ9„Ÿ¸j½ë×€ãŒÞÄéþ³ñ3íYe ÅëÏ@áA6øóGßÖ ¤Š%UqÖV?ƒbÝ]KÐ"…3q;–µ88šˆ¤µÿ‚øá³0x³4^Ƈ ìÝY±1†Jÿ °œÉجïyàÑ #—GÿUD> „Gx=—t'þvð,ºžÄl{UàùÝöéÅ5»QHüwN³ã©}LŽ£÷Q{¤|øç?ËîN_¡vn šÇÚ8Àƒ=i5± "Xî®j<7Ê@|£J_PB U51+&W»j‚ž´úàe“™Ø9N㣙ù¬Ùα/}61–”XÉÝZñ=@®ß—ï%/°£ûY‘ÜÉ Qù4²Š¹Ëï·¡å÷«Ô»Í†’û›Š³vô§½›$î…S#hÆ<ر9´J›çñ­[MÄð\º Q;¾t±N9ùN‡qc‚'…¿ÑÅ}i5ŠÈÎw†ÍçâÊæf¬«}N´}‘riYÜÓ”fK6⌜!^‡-È·|7·Ñ)5faÉ…a9¯!¾ß«Æ¡ŒK2³a‡ú ánQÈÕ?`ÆŽ¶Bí¤…¿ÐèºÕ]ËÄl|Ë ›–ð~mSQ¸éš/ì„/µB ·Gý™Ç²6Ï2¶$ª«Ñ#fØtÆòÜWóÿÓòLjwQˆ%ÿæT÷šcÓ“ª.c¡r±N嶇 jׯ¾z}@ô½Yξ3`|ò,2¯[¯!a};FÄsäFýÔ×<ßJé=ókCºÿýuÁänôÐI`‡ìpѲi7âSñþän'U€pȨ»¯£¼aìB¦7Á6u[ J5ýÒÇã’ÁS¢œz¬«?hr°W¶•g‰æÅ[›eЬö#÷1Ç‚¹ék¯Lp„šááõ>MçvÐÇ<îÿ©é”ó)2üz³ÿmdšI½?€;±už(q&X´ßûÂ7ÕóPƒG·8O ±â8n²0dÂâ@îž·¨uƒ£qZYú‚øÌAY4Å9M†‹‹£ô„9Õ,l÷ýoŸšNc8åš¶1@Â5½~$—i¾K eN±çlŸñšTñÕ&Ç‚æ|ðÄ­¢VÌù%ލ«> LÚªbòZ¸Š5é‘-'³D-mC]6zqžò#Nö©± -MÉBýJžÂ!ΉþÀV£áÖïoÉ "Ù›p›çÒ¸¢ê]¶^KJBñtqÀq²´ÞääA©¦,«ÔZ´5Ž1 îˆIw› ºïrÏçùµ½H„_—tS…f6¢ªÙ×ý²'ºmŠë¼ª@…¨‰ÿ£”ö†]ªÆAŸÍEךˆû³*‘3±«ò¶:çôÀ"ÚšËÇ ÍŸý8m#nBÔ´™8¦†Ñ@h„ ÞöRq§i¤ÑM/ñÉŠF)l½ÉmüªÀæ+óE@ˆ›’ãšuKZ³#o¾´Š¹0ñ–ñzó¨yåJ­ë8…’æd’_ЦXk¹L…ÒŸ_K ŒšLÅ–Ù#K¸Öè8œ­,ªÉº¼ªƒ(^÷ùäÍqLlÐ瘔ûyÜ»SVÀH4ÕÛo¯Rõpacáù3LO—^]³ëÏ 1ÜŃuðXtTɨû˨¨7Ûïd}_,Vî·ñY€xæPrE®ÄaáÜgÞФ)?ˆ®™–/1ønª0Ñgq¸l;Ûû\×ÜIîVÆÍÑ‚¡×ŠQèÑ:™‚•¯¡·õ]Fu`ü–Ì B¡1U×É2tº½6C7;â€;»™¼4õ?%ùó–άÛçÈzÁ×M¿üBqÏ‘ËA:Ì1® ŠSOgîÌ )¬“S YB µbƲÁjü–⛪åÚtöÊb¥™ÇŒ:¡÷IÝ5YÂÝðsÙòf©zê ±SJÂv0ž“¹æë4>ž=¨x5ºÝ1@W9R΄NGšgÎÖÃh¤·3g$ æVþçÇw_4ïZ ³î$Nb•]dÕGiœ~h£ÃBÑ1«¨—2‚Õü«$÷Âód"…'¤V8ž:IÁò¨ÿóßm° ¯wÆ'홵ðñã)ù~bµ¬òXö4/!³M2㦠j>9®x޵@êH v󰵟áP…IãwcÕ†Çù?·æ˜m• åžc4Q;qîö{,ÌìÇ¿'>žSÓq˜Ü‰€#bÛ‡jq°Ê·òy¯3 Ù‘ÀBn¤Ù¬wôCl•ÿµù"o~3~ÂÐúÄ‚K“ƒûe•gönÁÛãedJ3}ÅŽ®6zõoq£ Ç!§ZM‚Ȩ·eÁa<C EÞö­ÄN‚©¨@¶{½—ƒæ.M‚ÑtSÓ‡¸é*¢'ÚxËöLl'c ]jéuÿ¥BÓ¤ØèÔXö¤;€Î+ãíƒ?¶.™h‡dãÓSƒµ»•f¦Šr&[ÛäHw÷JzÁ…]^nk•’`‹úYF[ "oÝQ¨ˆËLןˆùxüÕ²rÜ£Â6‰=-ûËNµ¼P_ ÙwNzw‰ˆ˜ÜNDó°°Ð}ð‹QílZ¤(²º$Ê9¾cb¢`J6…uxèÒ…ý½Õ¯Švˆ%6øÐ~ÞrDœ0ëc”¾qâP9÷'ˆ~„×´åb‰èNnÏ4/ô%lB ˜}µþRúD¿˜ fa$r+”|½$ˬü²þh·!‰äÈ÷ˆÿéAllÅFXq=Iô4„5+çcÚ˰; ﯌__h P›|ÒO¦*]G¹8ŸH€tAü¢ïV6õÈ ¼-~£ð'ôe©³ñµ¢/)÷¬ø!göRŠ`Ú&ª&ä©(fzrâ‰Ê/’Zµ¡UZªm*„WíCïK…¤gÝ0ØÔ)„äh¼ON{Ò¡Œ4yJ·Ïv!A4‚‰Ôøeó³%ˆdüÍ»Ñ`áãwµŒx­F_RxŸÈ¤µ]““ó-}¤ÜìlZn–GgAOM‡*P—Á{ɤ¿Ï@Ü …ï:XZ·”0ä·“[óùuøÔ´ØV€–@È/.´®ÜN«{ñÑB.DòÌ.ÔŽö U²(½-;ýõ&¨Sxµþ@ýÛ—(ޱ|€ªÊI¸…’ðÜö ^ rYÉ;Úà;Ïš¼•䓿6'+. Œ=ä±1ÒÉŒ—?ê²bW_t·¾×ÕÖKÒ•¸†éÆH?_Ÿ±`õáq˜T¼ç&Sk=ÆÜùi°‚6+²iî}‡Ž_ýXU\š=±ž³”X ,Í„O›éöÈÿýÛÖëÔžæéIwv T\gshÊ~üß¶x˜h$#è"à–³ 0Œ- µZBAk/noqä™Ú””ºY¨zH{²¤<­‹jÀò) iS}#¯q©)å€t¶:Ýê&Åå-"÷ïxÚkƒˆõ`ý Æ8¾Ø£5lêbÌÐá<±Oéú¢ubqZ°&±HL:ÅŸÍE‰"hé煮 pg¤K¸gvÎ3h$Qc ©4ü®ÒêÈ :ÞÂ)¯P«º5ìB¥™ÍwŸÔø;Q·Šî(î"$"á\äã¼êeuK…ãûÌÌ5Û¨mRÏG¯ŸŠ,,ã¯q=:iëRNë-G¨X¹ß;|5RÐð‚u¨ßÈ&êÉÜÚ„ežÜ5•Ð×J"Gpý¢œDŸãiz²‘×>©×thDj·;5¿?¬µcÜF³BãzÎ#fjJϘ—Ý7JÂÉûWää? ­èÛ6ô~7źôƒbɼU&ÍSÌ4RìøU4fcHW"\QYU´wŸZ㟔žº»-Ñ+3Z­-<¿÷…|·–ÅÔS:á·bÙJ5\–Ç}îq誠1™†‚:.OÓÏ‘ìš2RBÌ(·IIá÷gƒK<ƒ.»Ó•*ÇÓ5NY±2³^Wâí§îXº²—NÍ?5šµ½†Ìƒ„‡NoL'†g²‹¼—Åi”Œ¼ ©5ªvX’µõ‡ÏÌ5…£0 í0X´v<ƒ¡ó8uf°’ÂøtÎ^Š#‹ùbîJdÓÙR•§pă”¾L·X²Kà·¿Hgò|bûeIõ©o¹~Hå÷‰É#=ùGVS^8M¹ÄoŸ—©¸Þo 2ß:Ûʬ¶Þ)÷ðÒ,äù‹ß#ªê½ÖÖ>S&Š¥¢…ùS–ú7Š*ãÆ a«~¯"Xdb–Àn ˜ÄŒ‹Cãf0 Û¶JÍÀ_?YyÝDtç¢ÏÙ¥2‘ 3†Ï#>ø-âH%ÏÀ~7ò?z´-ñBfþ™“ÙÈŸ±Ú~Ãn¨cÕŸäï²IKáAãilv%e2žóõöSí/¢—wŸM-ëÓ}‘ZP`££„ÊլЊØüd¶±ŸŠv´Kz‡x‡rØGˆ5ö»fÊ€L‚òLk#L¢çFÎÃ!ƒî¯5†°Ô¾Šöí XBr7Më:MaÚ1­"BTÚÀŒ&–ÎöÕ´92­GÜi4ÂZc\jwùöz¿¸ÁæFA¬ò°fУPT¿žÒ]°]p,H.Ò`{Þ‘ZSÇ7%Ü]ÿrG©¬Àœó³´ò‚æ¹q¤ÆÄ÷î½Rì2¦ãÊ«}úI†Ö[Fæ&WŽ8Qxá²pèÞ¡#ͱ Ÿ¼_’ÑÆ9± §Óé³…®<ÖÐßP‰sÿ`ð£¡!ätMÁ*£‘|ùê(å;`Hk0F7©ø¨žã7G0z³èr[ù†ûd'¦ç¸„gûk·3”—Á‰7´N7©ƒ§ÿÊîÕáGf0 <äS-s5ÕCäí9²öð’܃u,o©±Ú–g¡žxˆš•–ƒ'‚Tÿ4½Œè¼Ý]f±½Ê}3|n 'Ü |Ð-wœ½èf%Þ†Lèæi£Æ•äkfŸ5aÌ´öÖ¯öšýïüå|¬ ?\Å&JV"/uãF_(¾ËäX†•P’H2ÂÒšàÎzäùJ”¯ 0!cJñº'&ŸŸÙe¨#8‰|PËÀ7õKÁSÚÇM|X½ Ç$>¾GÅq‘Ò8J½V¸NúÝ‚ÚiÀÃWˆi+ÿÿJI  endstream endobj 184 0 obj << /Type /FontDescriptor /FontName /UPXWQM+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/B/C/D/E/F/I/L/M/N/O/P/S/T/V/X/a/b/c/colon/d/e/four/hyphen/i/l/n/nine/o/one/p/r/s/seven/six/t/three/two/u/underscore/v/w/x/y/zero) /FontFile 183 0 R >> endobj 185 0 obj << /Length1 1630 /Length2 17141 /Length3 0 /Length 17986 /Filter /FlateDecode >> stream xÚ¬·ct¥]·&ÛvvlÛÎŽ*VŶŠ*¶íŠmÛIŶQ±Í¯ž÷íÓ§ÇùºÿtŸ{Œ{M\×\sEA¢¨Â bbod*ioçÂÀÂÈÌ ·´5ruV¶·•·ç‘cP65wü•sÀQPˆ9™ºXÚÛ‰º˜ò4LMâ¦ÆVV @ÌÞÁÓÉÒÜÂ@­¦¬ACGGÿŸ’LFžÿ¡ùëélin üûáfjcï`kjçòâÿÚQÅÔàba 0³´1ˆ)(~—–¨òj ©©“¡ @ÑÕÈÆÒ giljçlJ0³wØüû0¶·3±ü§4gÆ¿X"ÎC€³ƒ©±å_7ScS‡TôS'[Kgç¿ßKg€¹“¡Ë߸Ø,íŒm\MþIà¯ÜÌþ_ 98Ùÿµ°ý«û ¦hïìâlìdéàøUQ\òßyºXºüÛÙò¯`oö×ÒÄÞØõŸ’þ¥û óWëbhiç p1õpù'–‘)ÀÄÒÙÁÆÐóoì¿`N–ÿJÃÕÙÒÎü?3 8™š:™Ø˜:;ÿ…ù‹ýOwþ³NÀÿR½¡ƒƒç¿¼íÿeõ?s°tq6µ1c„caýÓØåolsK;8¦fEÚÎÌÀÂüo¹‰«ÃèÜLþÕ êf†æo†&öv6žS38&y{—¿!Ôÿw,3þ÷‘üß@ñ Áÿ-ôþ¿‘û_9ú_.ñÿë}þ¯Ð’®66ò†¶àß;ðwÉÚþî€àŸEccèôÿó1´µ´ñü?yýWk Ó§û“v1üÛ;ó¿Ô032ÿ[hé,iéaj¢hébl03´ùÛ³ÉÕìLLl,íLÿrû¯¶X˜™ÿ‹NÕÂÒØÚî8þ­2µ3ù¯ü¥ë_ù3I«+Ê*)Ñýoì¿ ÿ‚‹ª§ÃßÜþG5ßìMþçáQQ{€7 '7€•›åïýû›+»Ïÿ&ä¿€XþóüÍÐÅÉÒ ý·nf–Uÿ?~ÿyÒý/0vÆö&ÿŒŽŠ‹¡ÉßiûŸ‚ÔÆ®NNIþ×ø[õœÿ5÷¦¦¦Æp«KöÆ|AVi™é.µØ¹ÃâÚý½,àÃÁ% ª…¿ü«í{üÒÂvx* Þk‚§x?Û<O>dhG{±l¨zRL/ó |Èhú~¡nRvpÑþdÒ+AL?Óˆò¾ZÛ†ÐâdV?ÜPRÖ+~‡"œê`s‚¹z¢ñ'sûåAþè€äkœZ‹Ù‰Ò‚V[pzF™xüôH5862<ÔsÙw€O— KÁgˆí›|J’äâiàtß`ü ùêÆå\¹˜Õ¢Qš¨æî…ÿ¶äJLþ³ƒÎ’~ÁFdþ%ºÏ,¼d+ë~ÃZ˜ HOü[lZUF¯®sIúl…sí¼^7Í:s…'Æþ¨1r ˜FVȱõ‰ªN-,5¸©o"¥ÎÌ’®ô]=R`š‹½OˆBB)R¸Ö¬Û+n(ªÔ¦m#1o”t.ÅÝ»d½–í®î4 ŽŸˆóBÓúe‹wa<†¿Ku_€”Ê ÆÈçù²'k} -Õ 56ÒkGëìTàgµ‹¦döDpî%ñf¯Ø±ö(Ý„ÔòS~#†xDX#ÍÇ Õ¢ÉŒ>è3™3ÛœÈTkÂÖø:´"q´ÍêŸó#$lÁbVvýäÞ'7 ÅÞÀÔýÀ’*Ü7òÚ"))öa¸¹e.ÆååVa’íw-~¹ö6y'ƒbŸ-ÒqhHwؘvƒÊZO‰³(4²5®&ÔHEWìRj’Á/óÈuóPµÞz”ËR·7•£Ðˆâ“ýA×S4!«Ðò“ª/’˯â°E± )Õö¨sVGytótÀ`yø¥È&¢hæ¹×DG¾¹(Ôx®"E‡Œ`³5QÆÑÊÙS†3É“_ó…h­¹xLP`È«z?¸d·csÖ·ó°Äbßñ¼]7ì³¢ƒy» TÏ®Åø¼»¶RNª¸íä ÆO†ª’•ÂX2G^ÙŸóxMöç­‰ŒÂ6“f<žkXù 53qD»¼oL$q¯äùŠG¡€‹Q'&Þïß_¾âí\GßÁ+.#µ†Ï°ú¥ WS¢# ªmuæ<™¦ˆ({Ì ¼M+¼â’‰ Ø4"¿à"pß`ȇâ6ŒV0µ†žV7Š˜ôö:E0ÇÏ%$£zj&ˆ˜g¶ÛŒc²ÇŽô]c‘?<6ÙõèQujŠ£©U¢¾ÑBß>óÆPæÅý|h4Ñ8â¯wl lŒ›jÛýL«_+mIÚ×éŒ4\EP^SÏk!¾¡ÆG4_˜ŸäÒñ4|µƒaÆáÁÑà«Lñ©UÞÝÇó-h)s<˜…ˆ"‰3´÷h@G)‡‹•À@:x½P ÃQe×½w&œc£CöÓ ´zô¦­ÇÉ›K›Œ;[HÞÓ@Ä:Yº7òu0=Åû Ozº#sàð<^$Ðê†HªQLáùí¤Í@ˆIg&€Ky‹îP[*…>H®¢¥{!àÍb¨ß7n/“}/„anR]Òcp’¨ç8aÖ…ÿÇíÍçf2¢³®‡%Œ[=ÉɦŸ}àBWûµt Ù ˆ;ŒÒ‘ãs˜¾”Å š|'TLâ‚ÚB¾¾ï&¼±Ýa7PQÂNöFç±I @¬Î=ž˜ÿÙµ9•¼&ªf4(Ä{ó·Ìœ)õ„KFMy9¤hµ†¾k¯QŸ5²íZ™¼Oþ)²AfXkN…qw‰ÔL\§%w¢N«ž÷ƒ¢Pè»I²¾ƒÒ5VK½K =WPsSC1½ŸP_o *GZû†´][ëiUÙQ—‘?éão²Q;—ï|]’¥ßFãqË&¦ÞØÐ+Jº¦÷˜J Œˆ¯“g.ÌqÚÅšˆ›šCÃèzÝöñN½\|Áèû¤Òebô òsÅ`áÉÙŸ(«Lb0k‰i•U6Ÿ°#Nª3VYB€ûÅrýOu÷4ðßäf¢ ³(Ãà¡Ë_•â ßÖÈd< …&k"ç`ܶÑöD}™Âvó~Ó>Óé}÷΢j¾©ö sœ1A„›ÿ¦zn/ÐTA¡÷Hðî§ÃYÜî‡$møÐšcM ¨WžËGsÈD÷Èü»~8‹Rw±Ro_.œ‚­—ƒŸÌÛW?ÐsâØ¿F7Î/@¶žž%©NQ½:´Ü_X/{Ç ×öÎö~c§³ÝG©‹RZh@=T˜Žš/©QH‘‘Ä_‡T¿0O¯x@·jRÛÚÁf;ÚÙ[ÄT{!å )|üsžüê†Aº|¿Bð çsmòCĵìMÀ—˜Mw},€£2°òN­FO½Æw&(óÏ•CP¼<1©Þe NÜoÏ’9T¸ lj¢S î.~;! IßÒ…Á‰EF±Ef7 '–úp8Z7§KF¡k·e’]éb …ã–ñ¯“ ¼,î\²þ,/KC«›ëŠj‚÷]GŽŠœ’¢(:qd”EâwÈiÙÈÍZ}:±ß,<*“¸yöI§°6¢n¡Ç'§Å«¿A¤KUå­˜ éÉ…T¢’Ûš¿²ºåuV0/mñQ3œœIå ‰ü.V1€ñìž~‹õæ!€G²y P©q§%ÊbÙ`+‘Ž)t4 ;…ðŠ}¤%T”ÀÙSOU¾âû \•Y^‚ABH"å£9Ï‘X¯‚Ìð†"rØš%sB‚½>gý¢¡ ÌP¾™û(iU²¿£Ñ0ÑE0?äêí2l·.Ä< I§\÷÷|šØÀßµtî”È=#éüÒŠS±»¿(Ÿ{jÙ¾têu' äÙ»éÚ`© ǹ¶¼P”ã= Ö`ÝôµÚÌïÍÊ*7¾…ó rëÌ‘+§Yµ¬åà®Õz›0†Ts^‡Î ¢¿×Ò×ד'þÃJ+¿C¼¹k\È(n½·Å"ÛÙf5ª«—1Ù‚“%Ç'²¥¸h mµ3[‘¿3å7_·Ì“â«ö7û')6ÿÃìÀÁ~×¾¼ôÊñÞòËÐÓÿ£»Šxhñ+¥1÷n›C­ñÌ÷!±’Œ”>wÞpwrÈ&otƒ »¹TxÛ\²#°€RY¾½íäSdøØú:ãæS#é€f?áO°jR‚*C8™¨V¾5c ¡î;®u¼sE~ pâ Bs›YJôŽÈÞùA“rŒ‚ÄGƒSFoi•ù+ ÞHô °ºmú&šL=º%•oîÚˆ[µ³ç)…¾îÌ[`î²z¸_õwØùŸxÒ9aÔߘÎùÑ£¼bé¼’=øý4i,“'ÁÓô”Âôåù ëxÊx^g±B…†e:G¤üƒo¡TÛw1x;íùYÃÖ!àlO Àþk5\¼9÷©>tÀ3ÜVâÜÚ¨²µbèwŽÀïY["ä1i¥HT*Ô?.‡KV2øu}Rî}“éLÙ„tÉ«R% ó¼v³*þÍùçÍðâGWQ]µNgµD_gãï|£QN6³Ê %P³ß?¹²ê>Ä6åôžã çœôT'ÜðpÄuÁ,\íJ²pGp¿ãä'®ë~Ÿ†¥ÿ¹ÓT3˜pÿf2bY_‹•<—OWÁŸhé|[¸™±,|<¥Â IÝ‹^ЬcH+=ø{˜~¦NFò€Ë'âÏ÷ç{[2îðù mºFM+/&ý;64[+©ÀåæyІ*S*g.¦:ëÜŽãnb*êj°*^…î¦^Û!×…`íâ˜k) ½kû‚ÊOãθ°øþz¹,¯ÐßÑ䯈\r1‡i™7N" ¡ô—dþP3‘z‰¤…´‡}}Òó1>Eítâ#ð€‹O ¦#ëF¾´mÔôŒ§-0'IÐ߶͘7‡‰P¨Ô{”IÉ[XØœY ›?Ó(‘SÈ->&«|pÓ•Ûõ S좣;¢VéŠ+™@ÝJ«NyÙËäÝ>ŽäŠ ®ù‹VÜu™ËQͳ»ÔðÛNj°5 <:.¼Ьø?š‘Z@QóBËú°·¬Jè̵Ù_Ć©©èÒgì+ÓQ§±–Ç‚¼ÈáqÚDMGÊ1qõ{ Í&pÕ`m­¶!ñ”·D­Óm ³|éFø‘{{ò-ò¼Gè4âÕˆägíHáû"U¡¿z@‹QH˜çö5!z#§§0€hŸ5¬‰“yyïC­{Þísè¢åc Ì„}§¢\Ú­êªÞ?7@ÌŸº)Á*éõU„zàt1„“vxÆKPÄYo}‰Í’|#óå`8ZH{›ý¤ðѯZ6D_y\רk%ÃdsFàÚÆŠÕF”îG P#ša§úMGe]ÄU¢ä^懾#äÈ%u¾ûh·c®íܽ¨Ô–YóéT©äw;^£$Ãd¡"†EîùÁ›±62kl/K)>$øŒø%¾~^Ú3·†Íª…ïIµÙ¯¹¹Mã˜uf‘üÀsZ-Ð0tѬÁ¥òØù"³ì9þŸdtêœC‚R9±UíF†äˆt»r'†ö ƒ(UIô_׆O#ؤmÇhÎ'õL„¹h©¸ØF*Ÿ4Ï#[GÌ'ªKà[öÚiÛ9ŒÝº[Žî\V/CÒÜÌÔ‹bq¡Î%‰)K"nPzh6Ö ®eÖˆ]¶ mÞµÒ7Å<Þm-˜ƒ²á&x’*°o“ºŠ³sˆ(Bsh9­’nKÈ‹êð¾‘G4Ž%NAQsž5«¯M¹HÅ©ß"=1vÛE¢yd@^ÍÀXp%©ßNmlƒ!{íÍv"ì|àhût*Ö© ßXœYDüÅ$û(EÄÏgq\¯× ß²äBOMЄé8Q—í+±úl—ãu䨯Ӽ8úOø.X>pö3»687ü.Ü~`³éê{[ejypà:Ï@ì1ŽEHæ«wÏt?®l¡ŸÎ¶"}Õ[õåf²h;sƒ& 3ŸæÙFঠäýËòÐ¥2±Ÿcª56ÜYt?S6½Y ÏÉÏP-iíôükCpj ÕÉ.VÖšyF÷j}^B >1)pè`Î!—$ ONêœ<ƒ¬9%žããÐ×R,¾e’'im妭™ºòŒƒÁ«òïÙ=ØóK£:E~ïûƒªd›-4\ãuà²Á½Ïój0¢ú¡|B¿Á»¶BÄ@[±“½«µƒl9×aÚ&½â 6haMZgÍä<=ûDƒª'®,~Ç=‡ît¿‰ TŽÚ§ˆ^ ¯*dAÀÙ QûöÈúÂJ[ÖpM%ƒ·Ü¿-™SV *Ø¡ñ›!í´7•¯)岑À¯¼‰Y _BÎkìLÉt`ÝK¦9›²©':®+úÅIåÏ¥\îà®iȼÉQËÑ?ïe®8ÇÔzÁwGô¾Ó™Sª@j0‡Á“<οŠ\&…`|VËâ£Ê/DÍÖKzX‹Žº–yâ é-N™)÷ÁXœ@i;¿V|T.Y/<_ þ;\ó‚©Çñ÷× þQl«x‹ ¦‰.õš(A5:AÂǹ©ù<3ÂÊ;eÂ_ÚŽRU8ô§Ð_ ›\u)¤Ñ¼H;ýCʇt+ Çâ&H<'f¤x؉ÇðM1ÉgÎõ'ò €õ*Ãõ‚YwœöàÊM°ó'ß/‡ÌtöÀq40X"R öÇo¢ ôŸ•Ž…ºpLúwâ§Nì¿5|U ȹe]ÑÍÌöR†.4ÌP‡mÄ¡wàlc×ê{¬eóO¹¥§žÒÓz{5f(¿+O+†«µAÐOa™-ƒÿåZ:ƒéÛ©J:E¢Ì;”ùØó·*y÷:ˆœ(þ[ÚÈÓªe\´äÉH/Óv!›ú¢kU蹂[ñœ"»'9m]MÉ‚‘8CI,ʦsàæ®Œ™¥hæ³ÊDÈÚP™CƒO·ôÂ’5ˆx†gPÛim,+— K0ò^Pƒ*ÌLJ ñ¾]%¹³ˆŒÏ±_$œæÆ‡ŸöÇ R’%ܬa*µ¹1ÖN‹Ôüî)“$¶?-‰',ükè«,¿ X²Í ·\d‘b2g(›RVÞÏH:´åö ÙÅWn¼«›Oûá{z¹• ¯.¼½×ÒSZ¹šÙ—3,*°ÙGÍ,ú$—µ++{œuƒEp)¨>e·ªH[”ãMz„YŒ§Nzl’/J#÷ïòÐp(—g÷tyÝËmÅ\Fì°ë¤ò†bÔ¡`á¦DG:úÚˆýu, ±Yå'V´ð`Ëð‹ÄzJÃ9$ƒ°ÒZ)¼¹f@Ò;äza£ª£eÍ£ÇZD³ïƲ^(T^*ª´î­]a²&+>†~y?ÒÃ+á)ŒÈê"Yb†%ß‚=á±NæûĵäÍ&™!r&±õŽÀæ¬î€í õøåQÁ¶²–§ü1„O ±ß31õ$OƬ'½m°z‹C½ ßÐ,Ý#²PŸ>´_‚éšÒ£©€*dJŒ_Û·RVBûg­" YXëÀlB ä7½ÞYz»qƒ'¬#7çY ×5WÈ|N»Ó> F;±?Cˆ35Ì’?ÄvÓ`Và9í‚Þ®*T°^îð ·n¥ ø–SAE«Q¸ð_ŒÌ½Ón²i›?˜I2¬¢ÃæÛ¥=¥.j(üyjÝ䌽.tü1bwaG7û´¨ª¼ y/Ó‚x&\Úž®pTb †ˆŒv0JöÃÒ@Û½”ÉbŒ!Ÿð雲xÄ‹®ý“Bõy³‘kaæÞ±¼‘äƒa–ú/ÈiŽÃf­Òb±ä¥åäuë¢b)„³Ps”nÆqä²—¯Žî]¡„wñ]>ÛžÆ?7é@Ivê½E¿¯I8.|º·®º ¦AO z:œŒV.;ÙÉ¡…õ+ÞúÁ…v í{{“›•öY!ç9øƒHv*§tQk–>]¥û]¦¥1aZ95ýì,%΃¼‘4œ©§ÓdÅeƒ8\rÿŸp ”˜oa”+W¼Lˆºi‚ƒˆÁîgéÅgÄtÅ›ÍùRÚàà@)«÷*˜ ”AnTùÓymGi­àiãí;{¾_[ôV´vËämÚBÂÂ}bcç¦l{fž¶ñ²vûŒTÁök'+-­QÁÒ­XƒâFÏÝ‚ý‡Æð‹Um&I-†ƒDÛ&XžYÍ&f{žÈ•ÿPW_uWßlì:ý CÄ»ó¦µ+:ËÆã8û³ {DUwÝ’>Z 07€B‚ QÍku~n™$oããHŸv»Â ­ß ÌŸ(H¸Uñ~˜8WrW£§hŒ`ë|°á ð`n…šAÌ\,«céÙ'Zð»£æö˜NÔŠÉcÕm«…G¤‘³lÉ)^·§š4JŸ}Òä…Õ—3×o%YÚî™DèŽvš•ÝÙ,)þ>JÚRÆ_…cÕ¤bñ÷]ç:¯h‹ OîýgÊ× jÌ;¸©l¥ì…,fÙ³Å$IØ•„Þ]. œˆà‘êÊ|Ýa²P½±ê-êcä g“¸«M  úJ[TT*x›¹I¹ä‹ó…`=›p¢]UQ(<¬Ñë/Gi;‚²á¿¬~w#›o~[=ÖBù¢ó þ5îR)=6 †© qÓ¬$“°íŸf¬Ý&t‚`mô,xÒi—z}d5­2Åá¾óOËGÍqÚOÉØ>þ¾ƒ(Ç6¿¿¸øP+ÚÐÖ–,7©Êê-_™ ¾=ÃözΚ‚•wM=ÏŸ|8D¡ƒDÒ|[XÍfŠLÔR{~DEňM£© n0»Œ˜y–þ`ÔíûG pÄMB|)NStòB'âR×¥{a¸pL1SšÓQ«rf}ï‚k§‚s:)Ÿá%ÓtÀ˜™µ×™ä¨,/ÿ#ÓÛ^d;\º´•S 6,g7¢$(ÍÙk3>¡ôhõ÷.ÍÍ&¥9ÏPÃÁË-IJ óïþ€”¯¬×1:9±5‰m€EÕ[˜ã³1œ¡ZY8öžÃ—uBؽð !„P`‚æòçhU' [ßÌZßµ“lýÎ2S”áe¨Lyá3<ˆÆàÕrÞŒ T¬ÁVÂÅ„ïí’î%lÐhyŠë/>JT×Xm$±!Ž`›Ìü‚SsßÇìÀ³Ê¡‰]åf®¦‡}hU½¥- ;ígÓè·NeWÒ/°ºé4œ¶ZlP§ÁÖ 12½x½1NÇV(Äê͚œġ]Wà¶Ù7 ,³…ëÙþ;9·è_ï¸A}ð$‡Z:àŠùºÙ½CùÃe…×&Ø~<Ï+;\œðîÜÑZ9£øwgÒMݹ|^ôdÖº™o£càÓ–<´¨-[|6]l¹­xOìã|Ðx~P+€ÅBРûd[i*Å0U;7©‘ÂK/¡ù‘?ºY(ön 4FðÚP†gˆä”Úmy¯­ØæcÈgùG´©8îûÍySùwŽ bn‘Ùk¹¤•ô`R7½d0¶_Ã),"?i2y->3%&Ëèm°qC3Ô12<áf€„P@¡5rey#{Qü_†k¤Öm¢!‡WUkƆ„ˆðoýzGs*ž(olW3z`ÖR½óßjaÜÐ@5 &-¿Kû mk|ôö4ë‚-´A¥û¨ x ÇñíÝý¦­ô®{ÑþäóºªL•ö˜s43¯°:ÉéáIË[²íK$F'øvåAü'’I{‘ZòÁˆBœè˜BnÇ»„àþÝÊÄ&”CGÿGìOjšŠ«¯jw~ŒWíwïÝ‘.ïõ’:qý«®;IŒƒZ8%Ý&DL~6®=¢F¦üVÓ²ßDT/Y·Â”„P¹1úì–qÞ“54*;¦–Λku׊¼l‡ù}íÓ/…ZÙ5"?æ¨h§m:ûï›:ÞTº•%›¦À(ã}Ìå—Eå‚ç›ÇRå™~2ðn´©Žd')û›é^ÈTdErL€„Z.qZÝÉÌÔý\1bÙœlMÒÛ§¦>RÚwG¼~·Š—h×%Åð?’ÌÚîÏzó¸)`R*]©ð÷Ý6(©]Y ĺý*è Ê¡fÞÔf ‚2éг²§zìq'aWAú³¦éY¦ÄHvÞ7”,`0«mÊgõ ÎŒãBZ½Dîʦ2Ž3÷ O°Îîut¶G–P[-‰Ç£X“§>ß0ÌuCšg@$ÂÈYW9ìx>&Cß°d``Ó8¨hõÌJ‘࣮ƒ§ï±·Ã Ì{Ô Õ –sZjr]Öw+2v·ëãÎaï·Œ=ýÌgÚ®ù׆Eû¡éýC¢_Ò+V¤”W#¯Ú´¶]Ø L“ëCŠ}_S0FX˜§–ßÖ £ªW0§Ô:±"`oÉ æÈg£×5Ž^Xræ…¦ÿ¤§í~>‘|r&7`ÆÈ$0ŠAÀ]+Æ ­º¬ëª*¾›Ä uð A†%6€wÉÒW¥PˆUd•«¸ó`ƒ+ˆÈíÁÁò;ª Õû}á]pl£—±½d&&5RZÕúFŒà9TËÖX+ìI¨æS€'ù¡OD¥ÔÅßÈXÝÛsgÖ•¼cØýA¬7ן4 dOtÐÇ_> v’\f´šàÚ‰¸Úmjú+§ßJ0=®ÊJy÷ü<xYÜç«°ù\¾—Ó^u–ñ´œ\BTt *è¿°“°R—°§KUçó¼ Ñêöø¾ÝZÊ/:„ sdmH¬Ê"ßî$”DÙÄj·°ªÝ¯MNï\ÌRI§]ã"Ôõ$cUÔ®žxÛ÷9èç´³âu4f ï&4ø¬ôC~¾(,u ýx4ÿ§-Ì ßéÍøwyÆ“œÄXðÑ j#Lfí¯%×°ù)Ïð8_ÿ N¨FÔöËßÓFZu :Oü_ÔüË¢CÝ]Û `”¼^ àHÚCç=;9·ù™ò…D› ZÎøO¬|Sy. ÔW7ãÊ€ÝXAg¾l°Ýë& Üåñ ì5î©ÉÌú)ŒßW6Œõϰ•ž ÄÞkmºÉAîãRFé ‡“>!8³0â1<…Ç›j ´%* Å"iŸ‚ÿñº3™–f=¿Ë¡ÅãïF›M@>ø*9QÍÒ° ı7ë„MæƒzÉ”»)zõœN¸@Á ÔûH€ÚÜ\а ëùÉùÔ`X]öû³ÉÁ\$k¥ˆžàÎàj¦s³)*\¾K.Àæ¨Ô¢}É'G'œN¿ÿ´ÈÎ[ @u¯,¢Ëz:i¾z²çÁæ9lò]°¨_«×x3-p¬ù;Ψó9åi ‘•̼ödî­È\‘#a“³ž0î,S'«³.¥%0£Œ:~ W±ä-ÈåΟOwrÒËCŸµ›¦¯[åØbúú5c¾šòÞúÀQÞ"dLÖ9µ7vbŒ1§2†YJèï7 ¬6EºožBØääi60W"0îPÅqÇä»ã>£ú;ÌÀçÙÒpÛI„ù‹Ñf~@ÛŽæ%9xbµRø K<º_)ÐÕiY [“qð­#­Þµ«n SŸÆd¿qÑçÓ,ÏîôVbÐönê¦A‘€ ¡HO‰‘©¢Ðè™}yt_«1,øwëˆÛ $ †Í«…ÃÈ•)¢¶ÏåÍÂú5)”1þ…PmWzzÄÁÌÊ©0»mæ#u ÏP¯6¹ª–H /Âí{<ªÎ-ýOHÛHÉ?ST¿K å|X'eªZ-dãמ³ØN؉*ì>‘ ¼wÉÿ±6àƒ¹“v¯®ëÂ)¸fÝn“šq¯”ÖÑ ~På#ˆ­û•6‚#bŠ!ŒÔè²÷&êÞNÙí2¬Q—^ ÒQ¶ì¨ûNâCÇK|$׺7ãº/UŠ•íÁÄŽutœ&'P6ÆLõ³kSŸ<)ë,\+˜7ÚYœ­ .‘<ËP_FvŒ‹™AðÐ*3Õ/ äœ‰PU5],80—y¾9 *µô%ËqôsŒ¼¶iµR¯Ëîa›ºö#UŸ«´KêÊúñ¦¿ÚƒŠl n#~¾çQ%&£ÕckýÛé’•E¥·;pÞ»ä.eî³Lû糬ÞP²9h‚´b©Œ!ãÝ¡´xæñ<™e¼Ø@¿‹ë^ iÔ›š]±7Ã’E|ˆ}ç#™v1âÞñøhÌ.Ø CxÓZœÞ؈x[_üSíü˜'E† ÿ'ÂOÆYð®»@ëùnŠNë“9«¶@ÌuzEúýðëLЧ¶6¥ƒ¹tB–ãrW-ISœhOa½íÖ2”N,6ñmü¢'òÎYê"fá÷m réb½¦œ#Ç1­Œ°ML ö›gtL`;ÌĘ¿r+Šˆ¿Åló·r8e'ìðø³ŽDn7{H¥tQ°;ø¨ÓsQw ˆˆa¦W©Š”™Ã+Æ$ÏÄ£h °s­ÄëýF†Ö¤ëÈNƒ¦õl܉Pfé4LÉâí°×TŽ1ñ^ÙøLïæbąͯù‚0¸?AÐDÖ‚$ ×ÍÆ[ëx=‘~q²oŽO_ÒQÌUÕ ¸MƒìÂÔ ¶ ;Š…Ò=$Š©‘¦f]6)Ë!Ù°–‡ùÁK 7ÛÓ ’Þ‚ê³ÈÌZ *¼“ýÆ¿mp™­{ˆ È Vñ¶¶½« oƒýÙÖxá@U<`âeá’5)>"…½ic”×>û¶^wðæ}‚î8çÐÍÑÝ!Ü2ÇôróÆa–=rCˆšÄÁ:÷ëtyÀƒÂH=SwY§'ß.·`­âã´Lâ…$}²D²4J²¾þ¦ïï—…1–NX´ÆõÉWÆáóåJG¤JöãK:ð/Œo8Å®ñrĦíð¾Ú„ˆ*-ï¨âÞ€¢Þª÷x³Œ<¶âfI”ª€ôü⟉B!_‡‹/¶ê‚0ÛƒEOßlsç)OP}™ƒµ¾Ž¨ ðo´]WCS÷`Ÿ¥ÿ2¥Ú~¼AÏÚë­ây„Øa õÃyyB`hDZïìøAN À^r,¦gP½£Ì-}¹ƒBÜýƒƒeÀižA‹›òeß+D¹n€”&‹b”ÚXÜ{‰J÷nM½ËUÚ{!xŽïØÎPÈþ3i¥–c¡WCh–ì© v‹O¬å6ßð¬ël”“ëHÕÇ‘ýaU'£“Ã9üÃ)T.Yáñç£~™›ü%[‡ˆ õŒb$ªöpVjZÝg"÷©b_ù‹<±X´º°iõ0LNP,P¼Ó~Ú`êW5Bœ™^Gß┃GméˆUñXÚâ4$¶·Õ[±‹ä¾ˆb½”Œ‡çnž•½»þJ(NÔ&/ÈPÕêÿɃ‡,!é}‚$èk§Ò7€0—Â;˜ädÊÔ7¿aûoàm9/ð“0sª¹”_7ܰ6"_¢8Z÷’vËe¯4¬‡sÛs'>ãAü¾át£ê9¿!M.4[Ò1"™ÍÛõ]¶ f¹e¤élNø=XhCåq¸îÜq“÷Ô;B1 +o©Ia»Åo0¥écÁ!u0–Xé¥9xEÛT²¡?—6x< G À¾¾uǵ¨Ç0?½Ú7³oÐ[È—›‰Èºmv*|w7µf4e½™¥fgœ æ]¸úBF»~Z¦·Š®.RÑ"c=ˆ•õvbô¤§½¨ogƒ_ÆÄ#GÑ !•Ö  x”ÕÔÑzŸøâñ`Dë¢oÉèB¾¸Ùc“‚n¦õ‹;’ùa@x_³<„ŠÐ5þy.>¾¬!Žƒ–ßµ(£)T…a@D®Mdçk ]rS¿mlŠKÕ»‰eŒ&ùï¯'·,¬gº×õ9%Î,(Ým«~ÛÜÎiÔL~5"Jçmcwä@),äp¼–Œþ)ˆÈØÚYU¦[&Lrv:t¼(ygQj¡^MÃkjxùøy¨|-cµ#±.²˜û9:~tc²tûCFèzV&ä¤à;‘Gh–L¼ƒ¯N¶Ã÷âìñ‚aôlÍ“¥ìñŠfüÅ| td©7Tܪy«yâ¼,–‹r}dó|dT‹æô‘•ªÓòñ•MÕá_ìM¼ý‘A?ì­Is·ƒNK­æÈ‰RyKg¾ ~J£iÏ“<¾ÆŒªŽçoͺصY¶ôËæ–Ü=ò嵤'!cE*†øl[ºe·ZÉ`Ý>ÏÓEu0×­¥î~s¤qD…KrUéÕ/Û¤”Zæ-¼D€/Æ>ÒÚYÒÑl5D÷[¬éãT4P™¥›&ŽÙˆ º:œ“T¦omÛbæE(y’NU݇ £^`¼1úÙ÷w»›ÄÈ;³výŠúI ,% e0‡û£0c&ù&!ðwÓJÝÆõÍ2úðt¤žÅ%mØ9ÅB²÷RýYXfá/úî~A†ë4éôüß4×öÛ¿±8Á*×ueñ윫Úë×yP]UœŠ÷Xåzàá@úžéÑ÷/9ò6gÀƒ‚ưϽ™;»ãœë¦•„êù>ÆßJá™È÷nrJ;:îTgSQ‰é1®«Àw]ïiçVÉ}±5DüO&ó‚à{º·¤kÍY.),$©€Ë¾mã¦`ß~Ä؆™ØÐëe¤ŸÌ¶t2¿½1öÔ#çj éñ Çq|ÔÚ‹Ú £“ߊ¿î(°Ø¦ñ¢éÜ Ú§œ\,)×c#é‚¿õ’@•ïoH@‰ÔkN³j½LöI2­‡ØïuÓ„)‘ñHMC*PûS?±³ ›ÙøaÂa,€:=n n’ùù‹Ž Õ™ÁÜ,Õ‚,m­E˜„sƒ¢(%χi§bý¶Ã*ýIÇ~Eg4ɸ+˜w@–ºÉQ¦ßDŒ?äWºäá‚Ù.Šg‚¾“¶<+´ªô¦£»#t¯‚`(k²>·j…šþñÁ„κÓ”_…à— i×÷7„¢ÃuF÷LEüÉ„Ã+Šp÷+íÞöË­;›ê¯k¯-dïbôèò*^DäãÒvP(•Aæ%ÌÃõþ<æì{{Û×ÒMYõãqÞËE‹²EQ•-<#Ú?r^侂Ƞ*§§éç¦áù˜ê¥ÉºW ¤é»¼=Ý¡U^ùäŽcE]“Ðôa3£n=Žª1ªu´J[·â^*³ïúTMK$¯Á3;# ±« Û„Ô@”Ѓ Ý„ud1.`Ëlõå`°r«.ú&“ V"f‰×ƦóG’ˆ›²TÔæ:—·.Zž)0À_U\À<7–±ugY˜âjÏÍwœ†Ör¦Å¶$:^¬0e°h” ­•´Ê¢Øâ“4¾ÝþCVø|.Œ ±rðcpbmÅE§S(˜9Ûj9âN)Ub—gT5óÙÃ@o´Ú›ËRÄ«õF³±­„mÍzõ¥Í·VÜ*r}²_Í}ȎЊ䟪ßorPï™)ù‰™–bÏ4oØÑOÒúºDŒ+ X=]9Ž™ ºÜ ¸srØ;S—ìoSiÂýüÓG‹Ë¬,è$ƒYýô±¦oÝ22ðÆ [ïAaÕûÔ€_9èX‰%øÍżGzj/ñhwmÙ4j5( ã„ÓEe¨Dމ² 9ð-P·1±zúñ) .hŸßg}9‰Œö”Mù(M¯V½Á;Ѷ­Hõ;NìÒßœ¸mª`±nò,ëlE4ëC¡-ÔƒP¼'÷¬B>“;¨oj!ë ª®&ÓÍ”öl¢Å[ݸ:O†œÛ¹²ónµ¸S(9”MЙ.ý;J“í©ÈÊF£–ñõ4b÷k û&WYí0©â1ÛH…"#†ò“šøgÞÛÓƒq\Ò1L΄|:C®Ðùì|ÌágU)Iϱ}-<„ŒßYàÊD5w\1DY'Z­¯àÕ¿TäÔÏø›Ô#0œÝ¿ØÂ H uÍ_¦Œ˜Œ[A”d×SúÁb ±ÝäÄ"E@¹3³š×wkx½ð¤ OÌä‡t Xßw±ÊƒdôÆCµ#ãE}aLÐü`£FÏ,å^0Þþ øXÍkH˜Û­ù¾>…`ðF̾¡±ç9Óù2Ÿ GˆÂ½}M$jòk$8Ú0iÜqÝúÃ%Y EVªG †~BZJ@¹Â‘¹Öª>ÇX,•†AÔL/!ïw%š?âÇ7ÑVG™²—x“­¦ \ù:vgärðMÍÏñYá]O}“CmÇ`EãÄU«è›ðöØ×çç¾OJÆ,ÛK;ò§ïb‚O=ì1;üÌnÔYýKGöü²÷¹|µ'ž¹/¨ßn÷4˜Ë1Šé*ôSHgo)¬Ù)‘<‹!6O» [FÈÆ"×ûSªÃE%£Šê"–™A¤€ˆˆÖžFÞŸ4 嬄9§‰¸•ã(ܢ̄a²[_NýÓÎ¥¾äÕt¶ÊXü3BÄÉzb“³þz&¿ÐƒlF ò œÎ •îW¹ÂA¯‹ÛûïîÔÕs„÷`Ž•¨@¥c¯z˜€jZí=Ü/Wa×`üíë.úÀñLª÷Ó:‚ ±HƒÛTF¡L~|…ZòÝ®ËCezrBbT™Çá&·’¯îÆ3.?è ¦G=^(øÂÝ!ñàð+K.d3‘?¾¿Â¥f’¢/Ó¾‹pnB0³Nð|øÄ6èYªå4ôÎ.®UÉ)ºB¢"dÙ®³Þ×DW!wðŸ"ÌA—¢»mpŸ¿è BöÜz´•ë& ×~KÊ1däÝ›F&‘~‘n)Ȫ”® š‚Þ”Òl*qâÄfŸ¡;üU/ÞŠÆCdű*q´`šiÏmÈÕϬaÁ‰ û‘Äã^ˆÇáxºæiUÊ]ýã§Ô>§C`Òs*Óªñ´J8º iõž"Kð¸æ@ý€`o«‡£¯•çØÇˆ¥ãF{á¶üyØøK ŸJ‹T¯r^ã3—Sæpz*F‰"yž¡Ü=Ì.ÊâK˜{z¦g,ó¹_º@»!¥c:$ÀM2òèÆ1­Ðb~œ™‰m@ hsM™QéÙªj´ºƒÕGþ| …hçı!šµ¯óÎŽ¨.{µhà|–»ÞaaaˆÒD_gÄ”`°58·»±G¹c>Ö ‡qd¿ÐÁ¼œ:M%!ð ÷ùþ:µvCÃäÌ{ „BÚ3ú”˜>$:Žu@vON&z -¸DÙiN)#×Ê¥ìG“1½‹mc¾q {KZꉡ˵Ýš¥L¶šê&µ†L* ­g3`—¡(GÙË\ŒÍ’‡Uª³®¼|¬zºÄQø ýøb¥Ó:!±ªœ3ѵðÜ¥3¢ãùd­ø=ˆg›Z„$`ÒTkmðö66å´ù&ÝEÕ8cÇ´,eXIû˜ï—˜J*²[Ž÷APÛXÏäñÚ@O}(h%`™\¬m…r“Ie؈ַoem=©’§A'ÔäH™YÊéÁH0¤Úß„G„ $–Zá–V2б*c'à@ó¿ôX°ìÿÀ®ÅŒæÈ$\HÂÁHsìJPÂäÁ³•¼fFgA|,A{¼¤¦22ŸYrÂsI™ó²ÑçŒ3ê fâyëâ)&@,.pÓ¿VZüiQ—Y7SSö™P‹×ÏgTÓ-º  v ‚®i×1¦”°]~"ˆ®ïù§Þ^ÏÃiµú#„ùH{p[Þ(d_…S)]Äýy8ÛI¨þøѧ ô*S’ÆÝÿIPÿrŠò϶P8Ú1šÒ0îüî1ˆû|W—oÂmê³3œ¯ì¶ê‚© rõÖ¬JU›w»«6­ès˜Ê`B.={áÕOò"ê)¡ÄýÃÍŠ<èö)Xá~Oø^mÎáÌ-§ßmì è×Utz)›%ø¹Ý´·÷Ξ#­Ñ2)1}а•Ó´ôÛ¨o­~ŠRc?¢™õ7L*y\>(ìsÿi¶ëR9=TujõC»çͼ*3Ò/†[槆ÍR‰~‹éÅ/“J’V,Z#âœÊÃÛ?RŒô~dûÞ㬿93a eunŸ¾‰%9«5‰pLâŽtèð®]hÄÔ”W3ÙiOTÂ~Á0>ÎE¦Ôrö Dm_«ˆû´ai³Lå*ZgÎà¯ø3ã„€`pÈÑŽÎ4Ê„’UdÖ¸Ÿîï1ž#OA>=Æ‘¯"çÔŽ Ã$½ˆHoÆ"uM ½­2w¸­è·}—Ã̯ŠJ.޾q™9ܤiµõÒ>ã¤,é€V…8z#¥·MÆÆR"{YîS…•úÊ‘eh“˜UÔ†G°‡Ñè•»›÷uö²lïHµröfÀ D¯èܶ*†'ÕO}euH*‚‚X[´o\QübsßN'zL wGH(fžÀÓô ‡8‰(ñX;O¬©çÝIqsKd¡ó¢ðó<WШG,@€­õÙ`â„ýÊ]ë‰Ño©, Ì’BÜÐD^ÆÊL w]ÄtÓl÷ñ¢$€:hñzèç.?{ÎË-ˆ6寧ûôà'¿)]%”CS@]G‚>ø¿ñ:•©eOŸóv›öôþ(~îmh^5š?c“ÄoAÅý”¬%~i±ä&ØË#§kÈC˜Ðý&´Sý™¨ëè0b­žÓô§K5´geIrf©z ;ÓeA/vµÆúì‘:lXhìL [7ž!E=‹ñïåNË๯")Uª}©ƒÈÓQ Gx.ù÷iv3÷¾¹ËèèTõ§!›·â¸¡îÐ}íû•‘…'kësËÃ&bÞ³'-µÒú"‹`LQ¾%#&ûdÞÇu+5ª¬QÂÈÓ„®´©‹~yÜÓ]ËCÆ7 ÆPÛŒ÷+ oŠ ´–'Ê~Ë·â÷Ç‚Í7ëiò-ÆùTzÐj0ô L•„°äþ&‘ºzÕ?ùÕ’P¨j[hÆš:oÐÓˆ‡i¦ÝÁ7¥·Í„Hí{>ìø\§ ¢53¯"Ú!“%P.6®;oŽÅ(jÅ2+JçÑ”ú‚ò«½.ñQ+âCý:›XÙ"8JS‚ÅwîU>2‡ºý(vþ”ÍLž–Xï‘ÛËeŽ{ëFû”ºîñß%“éWd³ÖãBÜÅëm0õ‘(f²Û°éŸª5VØé_E&ð¡Ô·aßAQH`@wÎ %s!RæÛrØ»Ç3ºxÀÞ¸yšº¢ =w+-Ñ ×û+ÝÁ·›ÎÏk0Ï…*Æ—àöÒ`"¼7p´0jx+*9»UJ!ùœËEµ8¿*”ÝøÄà± bô¯q,¤C‡°‹òGM½"BÇ5Û y$ms¤17Õ5îå%P.ä@!®$éôCt Úͪ¼ú J`¬40=ÕY&ž°ˆâ’\c+Ú®DÚà®Wó äHÅj¥I¶ Ñr›l—NWV—°OóæöT,OË*¼’aÙ}nn`Si³l‰I—Š}¹¶>b¡õ`á-Õ:ðŽV\îȺW+ýá"$¬ÉÙ×u|iï…­ùðÜì ’j¹U½›J 8Â\©#•Qƒ¾”µÕk½¸3Îé,2·’Æ£7D‹1˜€äÊÃ].ßßõ0Ð÷w>QHÔånc7Ë*»ì-”®RÓÈüý0—EÙ_gµ`_W9:Büttµ*³<Ó›ÿOîž*RG¬_¸®¼dUk!U‡CUû©°4^.ìéu'§Ã $·Nýùð¬¦ýG}j›·9?voLÍ·ÞŸ§[DÏì£ZΡ´ß®Nîí1{·§Ôëžaä‰áªŽb1Ô}„ñ@‘Ƈâ¹ûʶÛËþ+“5šË ‹PUÎÜ£Ïs®¤,J2vQîzR(½‚AØß3ìjàè¬ëæ.$»tiX‘¯çHæÕ6;H!«Àté­¸¾]3†;Í*1–'±J©­%üûss³‰+Ò–©ó(HÍ/Ù ïa©ÝÕ)Ùc3nCMM¥‹ÄÍÅ«ê±ã§ ö ŠÿŸˆ](®î@0/]¾º¤S°°°6\oiª0ræ³²…0£¬šÌy¨>3r­м+¤|œמâÆ`n¸ Z­xE}[(W³ÍêçpbÓšuí[xÄ–B]o:\ŸcaÏ ãø43:®ã³}+L¦_ˆsÌcÈÔø”LÐU øÛ4~CÂ5™FŒ›¶éÊø ¿ïÉLèÕ’”¨áÔ ì÷±,£ê+)"[ŽÙ¹ bww»wªÏ>â[‡œrƒ(Áæé{üCþ¼Öf¸<·Æ•k)`jÑkØJòá©­J¯Õ ýÑäªQåk—!“+Â7Fó®ë%PŽÙ¶«y0É?× “÷ض¸ßuË2ß ~ìÎÙßœ.+.çâÙËP0´úbv endstream endobj 186 0 obj << /Type /FontDescriptor /FontName /IVPKQQ+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/b/bullet/c/colon/comma/d/e/eight/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quoteleft/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 185 0 R >> endobj 187 0 obj << /Length1 1647 /Length2 12130 /Length3 0 /Length 12983 /Filter /FlateDecode >> stream xÚ­xeT]Ý’-îÜåÁàîÁÝá'8Ü-‚wîîî‚»»÷Ç÷ݾ}{Ü÷úO¿þ±÷Ø«æªYUkÖªqÆ¡"WVc5·7JÙؘۙYùJ [SgU{[%{^&U ¥‹,ØÄðŽq"QQ‰;MÀ {; 0 4HÍìì6^^^$*€¸½ƒ‡ÈÒ  ÕPÕ¢c``ü—å¯-S"ïžÎ K;õû‡+ÐÆÞÁh~§ø;ª°`²Ä?+ëÈ*Ih¥•4Ò@; Ó{Ê.¦6 3€È hç ¤XØ;lþ±˜ÙÛ™ƒþ*Í™ùKÔ`pvšÞÝ€îf@‡¿ F€ÐÉäìüþ 9,LìÀïg¶€ìÌl\ÌÿJàÝnaÿwBNöï;lß±w2e{g°³™È xª,!õ<ÁV&à¿b;ƒÞa€½ÅûNs{3—¿Jú{§yGÁ& ;gèþ+–)`rv°1ñxýNæàú; gå¿2`8-MœÌm€ÎÎï4ïÜοêü—êMl<þö¶ÿ{׿;m,˜‘ØØßcšßc[‚ìXþêY; {ë?ìæ.ÿÄ\Ní_=C÷ž„‰¹½ÀhÄ¢d~  ýŸ©Ìü¿'òÿ‚Äÿ+ÿ¯Èûÿ'î¿kô_.ñÿï}þwj)%Û÷øÇœ¼;Àû¬(þ66&N€¿Èìÿr5±ÙxüwÎÿ¾[ ø¬ÿƒóßᄵ³|Wˆ‰“™óf³Èh® ›Y,LlÞïo»†9ÐÉd|ùïó}wbeý7LÝ dfm÷—œÿ€€væÿ^ûnWÀ¢¨¤¨¥.ÎðßLÛ¿7+¿wXÝÃøHZŠöæÿ¹ø‹JLÌÞàÅÄÆÅ `bçf}¿Œïב—Ãçÿöo"¶­MÀN w€+3++àýýÏç_+ƒ£‘´3³7ÿ«ÔÀ&væï­÷Ÿ†¿`3'§wÅÿžï•ÿsý÷%ÝfH‹söfüÁ_’ÓRÀUxYcz=]lÐ!…µêy¹þö~É¡¼¥ÆÏ•!Ìu|¯Í¿^väèw‡ºpmh:g9Ä>”tݹ«Ô­Ü »,†…¨)ÇZ^ç³ ë0º\¬š»›c*ª†Ïp$­ŸœÎïèü)]sý±?Þ: ùš%ÕDã´¡×A`Vý<:¦þqpwKÓ7<8Ðßy Û½CÄHÅo‚ç›pDö0vº®5{…}tåvAvCõÂJyq¡ °£H¶¯öœ~`÷§m-¼ šÐKr®]´ªcõ<¸¶¤|#yNåöª¢Œ2ûúç}§‡ÿæ+qƒœFj»«¶ÿMíB"ª· í§ÔY÷?&ÙZ&ÚVüRK´ªË$iÈj·b.* ~„Øq9ó౜©ÎH²ÊùîÚ|;IšØƒ§8¸Üáu\·™oÅAõq„O6ÁT˜ž±Y‡·'Nbªj,BGÕ˹¬¥_#þx>×XqËøN¨bw`å`MûöÉ–Az^²Ü5²5TäJ˜^uµãg.qM…”sAýÈ yJP¹Þ=„ÑŠŠ¼¨(ØDDÿ Ðõ’¬šºV(I*xfÆ;o2-­Å뜚VÿŠ PBlN¯˜Dc¦‚êk<Ô‚,Ó< E1ó’0oû{¾®^#>Ç:’Ž×8ÉCôœÄ‹b.Q~§™¯)š¬Òq°€–ÞŠ#¤)öfª 4rxfEQ(ÅYÒBË[;‹*_Ï•,M")~ ®—a«(Dè¡®Þ4ÄÃïú©öënÈpõÂﶃ}Ý]>×óÌRÄþ—ù˜Šn¨¼„P³´Ï#%Ÿû&„Î'1ëÕžu´¿ÇQKs»=j2&&ò©ç…y¾7Ëùæ]Ú eÓDå1ìÚ–×U‰wº“Õã*~ŒíÌåE`ޏËÖo æå+f!A¬$]‚Àõšƒó­AåòØåD.»ª• ¸LÜP>KÉf†du½-éË¢‡=q‡¶"9ˆp#(ÂæYVuoÓj@äv4G‚Q Ü.¾fë¢cL^ï ^©µµhñÀ#N±ÍôkÔ?^Ûž¦fÉv/P·tu5‰’ӜڔñëúÞ—±ÕŸS ,ƒ59*£²ô´ ýi‘>“ý0Ԡ§A6Ã9žl®¤Zæ·µL|ž Áøi¬[ûBÕ†%¶üÉ(ãùu1š™g]ˆ< -ó1º[ »YFhe½µõusðz c¨%¬°Ä%ìžìfG­â¥È>4¥ áiÒ(Y$Ý‘°wÊFÑWðtÒ£U4XØ]·î+¿Ç¢-ú?íªúDªm|‘ˆ¯É¸hZ¡˜èL ŸìB·NicòúÊ$Ïdyç ; JŠ3±Ú]ðô×<çÒðŽ…9°ôìÜ/ï|ì' ç-üM7c© B&-áh¹2~ÉëÃïYWë¢ã„¢ñuùQßó·GבgØé¼åÏüÉT…¢¤æaÉÏåû090H‡tN–·X;<>“ï9‘Ã,pÌbŒÈç c$Þ|p™žlt”Òˆ‰!I^bH2‚ b*ò÷ ×Q6·rúù–ð©R§—U¾[¨~+Ö`üNHN$¨¥x7Ú †xý–rÎUñÓ‹`‹”?Ü0sœÛ³›—ý¡“¦z¨eö‹^4ÒÌõΣü)•0X€s²I¿Œ—Çn-ÏÎæ÷d#1’•zý)Z‹ ž–ýDô«‰£±(šFšµÉ§5õ1Ñ­Ð’R k™‰]2(³>Mìʺ©,‰Öè~ }•ôŸRMl 2åq,Hþ`hE•ŒRª9ûz_ïAõÖgÄbÊÓ±OD—™¬œÁ‡™—´QPµœ¡ $üô]¥ð6í—Ô&¹ G;Í=ÜwâC*6Ì3†Y¡06 åð_}» ªöW8F–4·9šÄŸk“©-ßd¿ã}tCš’Ebá·Tž˜sŽ/õÑÛþ&ÆÄMÅþâ:~}gþ©ÎÑÀÅÂß«´ü-ªÓ¦Nžº7U1ò÷`5cäK?íú:5Çï\é3ůÌv … “)Ô™û2š+<©ª=ƒ³añ“Î$an2hëˆÌÇe›¾%žr^¨¼›ˆ$Æš¬zV‘Ð(ƒ-í5IC¯w…[Ý>Ž*ÇhŸ­,Ê N¢o{/qI¹öoÕ7ŸQSS…[d~†ƒWSÌÁÊ’’«ŒDn† e$yúIÍCÌÉ—8cŸŸ„Úi…•ý¢Q>ekAQ¶0Bh'D(ÂF]-8°6ô~hß‚ƒ¿Ä¥2¥ÿRÑðžÚÂ\î© Ö/LÅÏK] Ê8œJô}TIšÓEb:×0+>>á×%Z …utîâ ”Bìùõ‡©Ê5ŸÕÖká1" ™§µœ¢&ÌÆ<æèÙeôvd鋵—L ó$™ñ¸ ­!R©ìrçË\ÝóÏúΦæs¸MSØlrŸkøÃša±ÊÀÀ§æbcOÖ5%Ûâ·À+!zE­Ðuzò’mÝt,» Xíqé™+»iCÒR~Â)êø°ò•¶O?¿é$0»*Á•æÌ÷ËZ1uñ<ê ë•`i´»%62€¢“7œmÝ5R÷£§T1'Â~½6ø¸ ÊÝ;mbÌMa„¹mRLVðÅ’w“sjÌ¢v«¦ÿèÂF°æbùpŠý™ Nÿ›éQZ·ŒÛaUÀpˆÒg|Q”+Ü ÎêH3qŒ]·²·ÁxeÂ$ùVd•Åf0l‰-¹Z§«°ºÜÏ‚ºöLVù¬P“›Ôëä…"‹$Ÿ&ç³q9ä>Þú$ ì” *[•Tƒ7œw—ΛÒÓNë·WoÄ…6÷œ"àÉ9hž1ªÅ.ûêå›í]C-â»°3»ù%²Fçç\;t4墘g¡© p$Érvm½~w†sŒ–»ð˜¥ªô€JJ6hwX´ S ±øÑÛn ‹Âï)é]ÛŒöø4ø}Ì‘EIuåö]?h•®|QåØ(é(Ì}cým:"xn8kµ7Þ¨ã'@ÍïÏīҰem4ÃJӹئ?2#Iï·›O3S¼Ú=´›Cw8^ÌÉ©à'VŽïÑk FmJÚ,FĨ‘' è·À‡âó[¶NÐð ò Â_ó¦p§Ñi«£Í_w}îÀ8¹™W]žîÒP”Ð!ˆ“ÝÖ•ürÖ’“}­O2ô^mMÚ †®¡ç.wu|ýµ‹ÈU5aÇ%o*Jj{ç#'sæÉ”Š÷2SA ø³ñÒ˜/ñ±å…ÄдÈxÐ{½78Sû{å· ã2¶¬2ý èPøîÉdPi™Y¼}M ½ç×Å¥DvPïªgÁ“ï"¾4ÅËaü·ÚáÆÕ²Q§ì'2&ñƒ‡õ¡aD>øÙÍ×Ò‰Ÿ¹…«YŸ=T«Âu—`Ʊ4*íOöºV#bb=»ùHÉ+Óð3ÆÛ¹ù¼—|îýk¦H­z…¶ƒÈA˜Q6*.wÖ ó&ÉAK„ý&¡5ÝÙÂ$É“ùœ“›¤p£/PXÔTuÁÛϧˆ‘"ôC·?aË£öÉzǵSœUX;Õ.M“µ‚ÊZyÉõ¢é«dœŸPªŸH¡Dôÿrøà˫殓r¬ 0Z²v=²Ã—Ü Ç¶U:Ë“’bJÚáË| =‘B¼Â╼ԄpöXšz³É`Lwã]˜½5²@:Æl?^™FêÙ{¾œÌàÞ#¡¼£ºß>®A±:roŽj…õ³‘„{h0Ýgè.ÍÕz/Ü¢?…X©“Ù^%º?qµöVi&³#`÷=¦”á¸XÍÁN9oSˆüI)äs‘ÛÃpã`J g5ýƒ¯Í¨S—$¤”U½RÆŸ;±\ñ‚ý” Ýn;шþýJz TÔ‡ëæ ggfŸ¦Ú*lôô9Ss¼÷Zbò Œ…åÚ¶¦YUº=Ðä*“ƒú«+¡7aDgo¬àgMv—| U43á¬&»Y)’ÅÐý m¸ ‘OKz#Ãã3`Ddg(Ã1“Ȉ C¬1v¿½«Àßdàïd}Q¬ò„3w/à>˜%M²`LZÈñç|½†zeCb^µR¶¯Í“´Óüå¶2ZêBPÿ@ë˜óª…·²5’vÎªÒ ÉëYûÒñI:kx#ƒÏ¨ äj¦VÈ'Î>‡tJ@’d@)pžæ…ÿ• b;°ÜÑ0Â;oÔáÄàjZc|IÂßt6<ÎÛ=éÇòym'­09;ŽLk$ løî}ë¼ ðtœ„_Nz¹Õý+ª!9õŒ xÚî­H*áÊÔL*îÈ–.i¼Aïá·=ý‚ô?Ó%.ÌÏÜø^E¼¾äßùV@ðû(¿[7˜xYÙæ“µn1Yƒ˜[nÆå·Ùrü‚Ì4 ¾sûÎ/¸„oJýCVüᯠ0׆áÖSWZtìGíîD½ûŽÙ’_ÓÆvˆÈ1H,ÀÅ.ùÓí3î.J.%ݘhô⸂À´ÂÞM¡ø‘!|ùBä¸õ.¤aÛ E3¸‰‚/¾)Z‡n b­]!$qü„-d‡üÍ=@[«±?çæ0èÊÖÇó89÷Ó’šUs d=*$<}&C`uHoZ¦Mà/,õàí×g¨¶2êŸKÁ5"ñEã÷’À¥ÄÄùŸ…Çm'·¿ö¦ŒÁÂ`U.ÁœÐ €j³º¹00îDî[Ñ)…®ÅTÚ×B‹‰u®„í×+0fD‰ŠůÇr©sô¼••ÄÇ (ó†±ÂÎ0:åƒ¸Ä ÕuÄ‚ÁæW£kôdÃõGw ¦³j,Þk¸»Ã›`ËãÝXì=dÅ—Ha=Æu­ü£»ºÓ ò°:Ф¯áÓ.&ß$n^ž‹:xÔSqv~/1e¶Ø© …¤Á?ÉÓ˜-ÄâýÙŒ=HP`èºXIØKæh(DLÓØS®2ËŽ~o'_Çà8–܉ַÕ)zlAà¿%ѽoÖ²º‘ãaËz–à¢æÃ²Ù.áê0h§~-»™ïÀTp*¬ð¡ˆº”¢‘Öt5GÔóp%/ÌϨCNp…6#§ý–úPuË˼UØ$¬ÂëÎÚNçHÀw‰Û<èXÅöVÝTð ¢_†Ns ù~ù:ßÉú'eŸ•6ìÏ o{2h _^ÔÒ´xZÙcÎäFš»QK„¢IÔ3h=%Ê_LÖÖápê‰i½U6`Ehëmv½|Éyã +•ÄuæËç|`D¯Ynܘ…Î*Ý Oqä ò#Rð©€(A±pHô³Xº Töf´†Íµgò-GÔ™&ÖU6&þó ¡ÃÁyqƒkÄÙ/y÷ÈÝyÍQÃMÔÏ’pç÷fYù­<ÝÒd˜¯Ÿ"?½s²ÈâH M•\ð.üˆ)ÓËÕœi΋ýŒfy¿X{¼9x«^ç^ÒŠÄdЉ¶:døB5X1Õ(v’XÇëŸÿ+´—îìƒ,ç°E«xPŒçÃÌ4Ø~«=ƒÒÚûþLÿ8'¹+U9SrÒ?ãc¬O*튪£ád«¹%s9¬‚ì°0)Põ¥¡Á=¶à'«S$s·Ðáà^Uº<á?}éÜœtÕ¡@òŸ²Î÷.ÛeÞ”7Ú—Óã¥f\¡KÉÿU¸®÷ì Åû«yãþi·W8F"^ÔNðr ÷Ãb¯¤;(^EŸb¹ÑÌÌ]£Y°jÍ’èó':÷ÅxóY;V™r>U¸ÔHˆ )ÈHûMQ‚KRT峞X§¢· æT±ËgO“ë…<uaºŽÐ8þ¿0Ƥ‰çºnw‚þ:‡lx 5ŸÎHbéÅ•X&ìÿoC{Êܥ暵æ~ú%69"Ý×¼¾ö9â^£Åw6¸™­ñWóÖWå8qTªÜÙïmæq^%7ÚãÛÖ®›q\†¢b²ØttqÍ5˜=¹ðƒ¬D¾ŽÆà-ʯ’Ä€iƒ//†L4‡|ç0—aSýªð©F6Eœsæ5)›Gú‰&’¡ò]j˜ëkr¹¸Ô:@$Å¥#žÁ XT¬ñ'Ðwø¿¾}”0ëZ"L—ó9#ôˆé¯ZàMl¯ S>woå8ɯU±gG;U.È—µÙYÿˆÑ(ÖªË/Ñ×=ütú+¡õöÎ2j-6 ¸¨¥÷i†qýÕÅ•š=_H=Û?»Ç âBR×iïþ%[ïòuÁvö"ðÁP¹üf~Ÿ6iWYþ §…—š“3qHsJ¢’~¿Sµmì×ǘ¹¼„ŽOê¤À»¤ ¥Ýò¸*PëM×Cs3Bàå5Bã_ÑXèλvþ¬Ý(ŒË`jò=4w:„íú˜^“¬îÉ€ÙAo%•õs²n:TeÁ‹ÏØ%mV9#c¿˜¢ì×"™Ÿœ³*èɦöùsÃW³Ð™’ Úï"—79Vœ‹)wÞj8\P.}ro€©d £%>ÂßbjĶb vÿÔ¿ž¸ÝEÌ¡FŸHÉt*I³·”ý)x=Ÿ×r7|•ÍùêˆfZ;Ég˜ê›;ÝšLšMKªN]å2Ž ØŒ†U.}·2 ÇÞø%ŠW†õç®b:äY!ý(œä!Ѻ?†}-ß’z¥ v*¯«¯âÁV3O©’¼ú+2ËÕ‚®ø×/_à¾(^EOö„OëŒr©·~+–¡×†ÉrŒO%¼ÿŠ…oòªçDòÙKö-­¾Ô`«w§ñM€ƒÄ2ík7‰GšÇUzƒ™™/´“ 4URseNí;Š% NÃó„†RfX>{JŒ1žÜ°Äñí)$rËtq6Îôy ¸Ž+Ò\ qaFÍ&Ù¸®rl{×´«›ómëy'B±®ò© ì‡p(ªú¦»a¡;{±á³[5Õbã5$ƒÜÎ$¿]¸åíòs…‰2Ijr£Z%,üÕø:¤ý+ŸZßÕ£l”ܲ¶aüŒö‚ƒ@üF²¤—å~–ŒØÍé¯fù¹–A«ëî)y¾@ç îùúg’ÛòDêQØf(ê’kŽ%#þ1Vºe^DC{)¦Å[TðZ*ÞO.¼ ï²C:·†èúœñ_Íl%FôH*šM8j`_q{UþýÀ‡ÙæÜ(y)Læ%?Q‡žµ¯®ï?+¤÷EEµ«ÝØÒ9>©# éÁÒ>f}ŸÌ¬RãÛíT.yX_ÀwÉñ£´¿‘H›Ý*k¿¦ñ5ëo0¹´³Œ¹Ò%E¡¡Ü{Îs•°?º y1¦XÉÏîD~dˆš'Žã—Úþ¼§•×^jãLöí~Þäˆi^âÕQ‘䘢ün‰ú9l@79hœáTœiºÄNxÕK ×Rv&'”žžK•<Áß%'E»o†x’PõMZDé–¤Þ"Š«Ó"ïè,{¯Š[Öç ‚7m<†nòq¦a / MÕ×9ÖmÛã<›MÈcÜã— Æç˜´`²>c\Þ5ò©’“ÛYÍ´‹çè7ÉHD8[Ʊ PU\çéHãxÈlôöL4ýd ¿g¸ÓàX\USbs°Þ¸š¿.Ä3îD•§»Ov^Ž]í¹Œ´ì<ñ1œ¥ tâÓÃ}g—Y™ðüE¼â,µ7¼œBù¨ùÙ,<¯í Ù‘Ð G¦›èù—ÔúånäœüV6HØ…5úæmb/ª 'FEæ»be” áÄÄþGx^d&Ì! NP§ úU¹Oð »Á´˜d<6Ì;O¬Ì¡ù\|ÑwNo±Äè=Ö®mÎØQ¡zÃFZÅv"&Dšî\㢞òÍô £êe» "²Ð“Æ RXš"ïC“ÕÒ\ÙRùJßGëIOB²[' z‹È5¤›ñ0‡³oþs™T£ŒÈµUÃ’8)Éy%J,ì›þϺ*û7Ð!}9è®R>º¥ÁmYeBÑIÞ8h}³±Õ„Zß°X[o@gnŠÊë÷2ö€0hvxbvÿÇFÉ,ÆÛèk1¦ÉŸA*õ%ÌmÉj@È8rì¾£¡Ë‰-ñ ËzfÔ©õö’’3”E×@)RdãÏz¨þTLš9‰ªWœOŠK™D3ùúŠ:­O~†O”,£Ûƒ4K¿JD}Ê„K]âéP V`,4’eÔ;ÔIb¹4aàÛ¡žsåc°1Õ;Ã!ù:C¶¸n'̇U§Kà‚ѪÙ‡Väù1¹T_ûšÑ K_¸Z÷;^ö;tÛŽ ¦V+d–2i¿*ÔÅŠÍ_ª³Ï|üá“ñ<Ò@M!| »˜Ššv±GE ͸ÏJO猱dzOØÇõkÝO‚BÇáôX÷æ —nú1sªŠ|ËË,hÿ쵟/¥eûRkŽžáÃ|j*€‰wfÈE*ìÍf‹ñ£º\á³ nFúÍRA[5¼ªÃÅ¢À+ͳ[âþ7KwˆXsò¬nÅ6‡ƒ 0¥«¤ä¢‹¹E l9¶"c– .iBPo.‰x+jwÊø*oÔ"†J mxh ¼VGŽHµ8ø‘©€ZïÏ0[S;“gð¢P°{Ýfª=Õm ¥LƒðõE!Ésò#D¨û½¢F¸*5“Mõ÷e#13ûì_{‹§Ž/Á6¥Î¹ÊNUA‹¾nõPAüI&¨4>‰c‹¿?([Ñpq! §Rïk49Æ´­%j UZ|?]ë?ößv}µ«ªÍŒ`ލpst|þÎ6Ö {Öh ‘5|Ù«ýþe•8Ó*ä!Ú.ýÌ€B¼¹]Vg eM‚kF@ÂW{Kª >ˆSºùOÎs‹t=#zâ¨íìòÛTlWäP%­=êíÂð—òJ1çZ°<áVE¶ û~‹FcΜ²½SÉÆõ¤ç'bÕߢæÂG8HÍ‘¦ÙUΉ²ôO bŸ=QÏ­-Tm—{Šz(R[áÔpK¡†Uý9òhfìz n»wòåY¶#ÖtîâtƒûRÚÎÒ”úlEÓ¶}JºM|\Ñì,P£Õ9¥ßÈ3oõÓ÷”wn,Ÿêðf™–Œ¯"ûG ãBÚØP’‹u0SúFB–Úì «cX(¹¹<öb~Auà1o«“Ó×´›À¡9vé1bý;"Å«äÈÞ†Éh·Ë<øá}³oK8ŸD§` t/Òl–Ž3kTïŽ6@l|áh,ò… Nªä¨»©û^pÃÒ®Äh SX>f¾ÑOØ^a¸÷á©ùŒ þ$­¨áÌ×ÖGp¨]^5½/ŒìS÷aôbZò×ÞQmø˜cm®~Í×+Z/ae2UÉp”«Õ~‚;B[lÖ,Og7ŠÓêgŸ¼áæ;{ôbá Í*ã^a3½ñ Óø;Xg®´¥Ù~,¡î›ÔYEÿ‰Iź/¥=ô)gدBÓÖƒ ÇH/&2*åé–ec˜Tˇ°ÕÒx¤¸<ßœcS¹ÈÚ…‰;M\IûhqȽÐd·(Ón|¤8ìhÙ¼÷KÜÈ‚wçt·Òd¨D|™škqHg/e7èá”îG‘¡ @…~E±Í°¡×iç…Se ö+2&X’Ýá6­MzÙPÉÜ‹›®Í'n£Xá^ަ¥·òû´´U”K9LØ΄i]ÌsAÚ[ äÏãÙcwÄ@è²Ú4*¬;É –°˜q¶µ§Ê„É0xüÖmÏͱ¤£©8ó‘ÜõÄÏÝŸŒ›nøÎ÷ø²ºªiçé•Ã…SˆqiŸ£?emį‚Ž-€7_n³QúS"ð8ƒŽ™¥øÝ–1]yÄ-5¼7ä.!èGv®w3Ìæ ]äy—®ö|]ý¥žHxdW)Ýq)õ¸˜èÏ’Lt™GÔNÌ-4Km親SƒdHã%wsnížDŸ0L\µqHb÷@1ÄõÀ°¿Ÿ±‚qýÒdvSý½°à‡Ÿ9ßïUtœ8v»·2£ãÅà”^R6ºŽŸjBâµ Òpêdx!hüô`–B´4Ì žpb£Ì‰-$K¶åŽˆYï>Ë1:êÆt^L—\NýÄ[®Õˆüe¼kâH{ïtŠÒT4h%MÑuÇ>ÓßêÀ¿–Ù…Íe~’§Í…(G+y ÒY¨‚ÿÚ]ÕEÒ¶é³§¶îèCr£n´Ö}Êè…céf’Ìíåd~T‚U6yŽP Ù*”½®úÌ«%²F$cmº2)|™©‰•¹CêoÚHMÕû‘Þ—S,(¢ ˆ’i¶:U¸F(g.m‘:(ufžQ(™AêÅÓÇúe“ uÁÿêq¥^'M<¿aêÙ,BíOõBÐõÉTàÌWmü¾œGõ£_û\iUc‘Wuç¤hÒuÝ F2$„˜ÛÏvPu Zcf±•åË_Ç:Ë$¡Ó{¿FtŸ—¦‚êþ ñÆì(…é/~º?iŸ¢±™´CŒ÷kµ*,¸¬(VøèÓ°cßBf¢½â»ëJWuEî>ûáLÞLLôhúàr;¦§ÄBóÕ¦M<¤x5Qа±ÖŽË•kú$5õ;\Ë;Gá$Ù ±Þ²±ŒFðä0›¦ÐÚø›DE¦¸n¾Yl¯iÎH[Ÿ&ÎêÜ™} ŸŸa«¼ ¢\$M3/¯L,#¨žXéËÙ‹X]î\Š èDþËÀ·Õ¦Œ.isWîžßAŽž–Hؼz]ÆŒBp dP$æ,Çy1Í,ýé9î „\)¬l‡#Î…i/Õ2Õå<®¬œë‹ÅƃÅQHÃô"ÛëœâÆÖ¤î¼!ž$3.˜:û‚ô3æ8¶™Hê'ÀABOTÆ:CYYy e{Ž騀­DGv°¾c}Ê-Ÿtÿª%éjTŽæÛ±€[¼Å{œ÷Õ‘Î'òãa=ÌqJƒì—KýïxzZ®²°¥aƒ;«²dž>-1"viÿ™Ì.Q¬]Ú<9ð‘>ÅVLþÝŸXãoøãÌ·‚GðÎdw^±§¿‘08XÏ„-ÜZ‡x Þ)¯HV&wB)§IÄòB 8³k€±è’ð͔Þ¸ë,BϪÿAd¥šB}W…\uÿ)xñaIðeì÷Wêú‹¸ÉfRFLSH= º/éБMÒ]…YâpöyJò[ê™ÐÆx×}DÑoÇõƒòC»Ù‚F$É.Üô‹sl½¯ñî=ߦ§¸UÉ}'‚MP‰PfJ‡”™‹¬[xrNöÇPÐ þiï™9ý•bVø™®µ4ŒbêÍ —·¨ù3õê‡öÅûá«­ ,Ø ›{ûP‚D8@¯’?Ó½lÊ´½ lA¤Û•¸9¨W?Û1Á&¹ùš´õ¨_7`,Ì–¸ãxr·È¢Fˆ²Í‡Z­%OÄÌÓ‹CBÙîS}š ºn³ŸU¡½¼TDefç錷ޒZŠ^—E“66pi:¢é¨(¢C"àâ ,¬ ˇS*_q ‹_”`(!«‚0ð[ÚKØ·Ý>@™>¶rlß¾4|‹Ô°i‚«>ú®úL©ßr2†ï"^&¹ÐjÒ¦~9A'}a<¯”¯«*žhù½W3S„þŒ6¢ì >YDñyõÝú! Mæ}×õA©tl·k-Nuq#iFùj~9ˆ=Âõ«ž0§‰#SÓ_ÛkID&Y2d5 ê-AæŽÜÅ\zëÌ×» ÞjL³óƒ,HM£Àjã×öš”2Ÿ’˧(pÃKPª BsòdʯÑN½ÍÓ?oÅ‹xRiè—tZÙaÑKhkK'ÅJ‡…Î`ë¨_^Ó ÊuZ¨%Ü›ï™?¶>&¨éURW¥êCFQ÷mч?ŒT}PŠ^t"ºVLAªSšàâD¬ƒ•ñnP[ëô©>µ à-›Ø7—^J3{µ÷Åñì`¿\rXi:íÖ¯B‹7ò„6»àÊ&:å-š#«š@>X}"QD&‚áC¤Ûwã´ƒAŠ…uÃnt¿–Åϱmn7»+I¿ÿ.ùfŽ[ÙP6ÏÞ£®ÏÖ¾"_ó‚’úGJúô”„é“~ɹ^ÂöÂTPŸ¦æGPg)¤ÐÒe.k»<—e&auÖ1º2³VtùHL MSe|ƒ¡(œZ˜D¾ù2Î(ÄæÉï磬'$Zó ¾…ú/†;ë–KFbgÇz³d‰Çhé o'߉Z[3%gzª«ŽíÂ9¨¦:_EéºælöÙb}¦ùù|¾^ا8eT9} S2xåžHü¡:ùèqíè 9†%åDÄ÷XSvÑ-öcõͯ;9”Ì0¬^LÔ£Üh÷$¬No)µÛ•'k¶D5@MR¡åñ_º3ðÏ~†ú?kc°l¶bg_éôu;qªÔTVôÕ*Zr¸øÙÈ +JkÇqõy²Üsd|?Ö•æ­²7ò.?VWL“ «‰$ÝgŒCŽd$öÛFu~)?kcÂE þs‹Ž)iæQ_BMO¬²D¯—©7:Ah³óëòü1Új–Ú©16?[ ÙŒõ¦ö…zÎcë¹£«§Iä#¹Æï/A§å0ý¨&2@*Ò"Ò;™Å%ÖÌ‹©$kf|zj9/ä×Ö•dø£Xâ/þ·Ïgç+mþó ýfËdÐ]øŒ!±a«óÄ­ä%0FŸy&-öû§•ö–_÷[Q]fq ¼„ªñµ5³ JÑ èZ‹-ƒÇ Ñò…|l­4¾<öMŒoø‰ŽÇ?lW$N™£%^Åq”o•u–¶ix]?ÿø*‚,B‹ä"%µ_•´)sl%÷àY¬viÿh—Y(,?ê¨LÊQõ«ù¼ÚÜÔÀ½K–4Æ%£Ã$is¶#z ›8fe[©äÜzÙ—jF0‡8,µa¥­ãëÃ;°>Ÿ—k°~šž¥‡l;á zýÁMnüüøÄÿøýî0™uÜ~Šé>ÝÌ&â"‘Ž…Éy_fÖë6Ó?Híu¾9Ž`“¿®§›ÍhSg*×»ËGýL]ú‚&)³§ëF öº8±Eòéš$(‹%KÁý¦Î†ðCn×Pfçæ+¦B3ÒŸ·RK«§ó¾¿„œªr®ö BÛ5„UåŸË‡ áÚü“D]…Æ;‡Í-„x£¢jVk#]Á•¸ž‰ÚI*(³6ßê@{Q$yg„úÅ©³¿·­„¸¿Ÿèzë÷ð™äiÅP¿Q{0A…üBÄC’l˜’ùŒÂ ¬¸®øŽ;‘82@zé+UãŒéMTtÑ™nþµâÈìüý¨u)ÎO ;þz³èãªÚ › *N—·@ %®7~›PZ“p»Ìw”fìZŠgù{êÂ*¯Ø,⸱âL‘Œ3És‚ͼ`L‡PŒ4Ù?ý.ö“¡0¥xdÝ4ý“kÚ]Ä}ÈÒ¼4Ž®Ÿ|+Ë…ÿ~1¨ endstream endobj 188 0 obj << /Type /FontDescriptor /FontName /MNMWTC+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 669 /CapHeight 669 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/A/B/C/D/E/I/L/P/S/T/a/b/bracketleft/bracketright/c/colon/d/e/equal/f/fl/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/quoteright/r/s/semicolon/t/u/v/w/x/y/zero) /FontFile 187 0 R >> endobj 161 0 obj << /Type /Encoding /Differences [2/fi/fl 30/grave/quotesingle 33/exclam/quotedbl/numbersign/dollar/percent 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal/greater 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 95/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 124/bar 149/bullet] >> endobj 99 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ISOGAG+NimbusMonL-Bold /FontDescriptor 172 0 R /FirstChar 52 /LastChar 121 /Widths 164 0 R /Encoding 161 0 R >> endobj 98 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WESPMR+NimbusMonL-Regu /FontDescriptor 174 0 R /FirstChar 30 /LastChar 124 /Widths 165 0 R /Encoding 161 0 R >> endobj 100 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LJFTOE+NimbusMonL-ReguObli /FontDescriptor 176 0 R /FirstChar 35 /LastChar 120 /Widths 163 0 R /Encoding 161 0 R >> endobj 77 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RVCSXX+NimbusSanL-Bold /FontDescriptor 178 0 R /FirstChar 44 /LastChar 121 /Widths 170 0 R /Encoding 161 0 R >> endobj 78 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LYYYWB+NimbusSanL-BoldItal /FontDescriptor 180 0 R /FirstChar 46 /LastChar 115 /Widths 169 0 R /Encoding 161 0 R >> endobj 160 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OCGPRB+NimbusSanL-Regu /FontDescriptor 182 0 R /FirstChar 65 /LastChar 83 /Widths 162 0 R /Encoding 161 0 R >> endobj 79 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UPXWQM+NimbusRomNo9L-Medi /FontDescriptor 184 0 R /FirstChar 45 /LastChar 121 /Widths 168 0 R /Encoding 161 0 R >> endobj 80 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IVPKQQ+NimbusRomNo9L-Regu /FontDescriptor 186 0 R /FirstChar 2 /LastChar 149 /Widths 167 0 R /Encoding 161 0 R >> endobj 82 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MNMWTC+NimbusRomNo9L-ReguItal /FontDescriptor 188 0 R /FirstChar 3 /LastChar 121 /Widths 166 0 R /Encoding 161 0 R >> endobj 83 0 obj << /Type /Pages /Count 6 /Parent 189 0 R /Kids [47 0 R 85 0 R 91 0 R 95 0 R 102 0 R 106 0 R] >> endobj 113 0 obj << /Type /Pages /Count 4 /Parent 189 0 R /Kids [110 0 R 123 0 R 133 0 R 157 0 R] >> endobj 189 0 obj << /Type /Pages /Count 10 /Kids [83 0 R 113 0 R] >> endobj 190 0 obj << /Type /Outlines /First 4 0 R /Last 44 0 R /Count 5 >> endobj 44 0 obj << /Title 45 0 R /A 42 0 R /Parent 190 0 R /Prev 40 0 R >> endobj 40 0 obj << /Title 41 0 R /A 38 0 R /Parent 190 0 R /Prev 28 0 R /Next 44 0 R >> endobj 36 0 obj << /Title 37 0 R /A 34 0 R /Parent 28 0 R /Prev 32 0 R >> endobj 32 0 obj << /Title 33 0 R /A 30 0 R /Parent 28 0 R /Next 36 0 R >> endobj 28 0 obj << /Title 29 0 R /A 26 0 R /Parent 190 0 R /Prev 16 0 R /Next 40 0 R /First 32 0 R /Last 36 0 R /Count -2 >> endobj 24 0 obj << /Title 25 0 R /A 22 0 R /Parent 16 0 R /Prev 20 0 R >> endobj 20 0 obj << /Title 21 0 R /A 18 0 R /Parent 16 0 R /Next 24 0 R >> endobj 16 0 obj << /Title 17 0 R /A 14 0 R /Parent 190 0 R /Prev 4 0 R /Next 28 0 R /First 20 0 R /Last 24 0 R /Count -2 >> endobj 12 0 obj << /Title 13 0 R /A 10 0 R /Parent 4 0 R /Prev 8 0 R >> endobj 8 0 obj << /Title 9 0 R /A 6 0 R /Parent 4 0 R /Next 12 0 R >> endobj 4 0 obj << /Title 5 0 R /A 2 0 R /Parent 190 0 R /Next 16 0 R /First 8 0 R /Last 12 0 R /Count -2 >> endobj 191 0 obj << /Names [(Doc-Start) 76 0 R (Hfootnote.1) 88 0 R (Hfootnote.2) 89 0 R (Hfootnote.3) 129 0 R (page.1) 75 0 R (page.10) 159 0 R] /Limits [(Doc-Start) (page.10)] >> endobj 192 0 obj << /Names [(page.2) 87 0 R (page.3) 93 0 R (page.4) 97 0 R (page.5) 104 0 R (page.6) 108 0 R (page.7) 112 0 R] /Limits [(page.2) (page.7)] >> endobj 193 0 obj << /Names [(page.8) 125 0 R (page.9) 135 0 R (section*.1) 81 0 R (section*.6) 43 0 R (section.1) 3 0 R (section.2) 15 0 R] /Limits [(page.8) (section.2)] >> endobj 194 0 obj << /Names [(section.3) 27 0 R (section.4) 39 0 R (subsection.1.1) 7 0 R (subsection.1.2) 11 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R] /Limits [(section.3) (subsection.2.2)] >> endobj 195 0 obj << /Names [(subsection.3.1) 31 0 R (subsection.3.2) 35 0 R (subsubsection*.2) 126 0 R (subsubsection*.3) 127 0 R (subsubsection*.4) 128 0 R (subsubsection*.5) 136 0 R] /Limits [(subsection.3.1) (subsubsection*.5)] >> endobj 196 0 obj << /Kids [191 0 R 192 0 R 193 0 R 194 0 R 195 0 R] /Limits [(Doc-Start) (subsubsection*.5)] >> endobj 197 0 obj << /Dests 196 0 R >> endobj 198 0 obj << /Type /Catalog /Pages 189 0 R /Outlines 190 0 R /Names 197 0 R /PageMode/UseOutlines /OpenAction 46 0 R >> endobj 199 0 obj << /Author(\376\377\000L\000i\000s\000a\000n\000d\000r\000o\000\040\000D\000a\000l\000c\000i\000n)/Title(\376\377\000S\000L\000E\000P\000c\000\040\000f\000o\000r\000\040\000P\000y\000t\000h\000o\000n)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20230905125341+02'00') /ModDate (D:20230905125341+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj xref 0 200 0000000000 65535 f 0000000015 00000 n 0000000937 00000 n 0000011376 00000 n 0000150928 00000 n 0000000982 00000 n 0000001048 00000 n 0000014554 00000 n 0000150858 00000 n 0000001098 00000 n 0000001164 00000 n 0000017929 00000 n 0000150786 00000 n 0000001215 00000 n 0000001292 00000 n 0000020798 00000 n 0000150662 00000 n 0000001338 00000 n 0000001405 00000 n 0000020853 00000 n 0000150588 00000 n 0000001456 00000 n 0000001678 00000 n 0000026099 00000 n 0000150514 00000 n 0000001729 00000 n 0000001910 00000 n 0000028388 00000 n 0000150389 00000 n 0000001956 00000 n 0000002043 00000 n 0000028444 00000 n 0000150315 00000 n 0000002094 00000 n 0000002258 00000 n 0000032520 00000 n 0000150241 00000 n 0000002309 00000 n 0000002414 00000 n 0000036262 00000 n 0000150153 00000 n 0000002460 00000 n 0000002532 00000 n 0000036318 00000 n 0000150078 00000 n 0000002579 00000 n 0000002631 00000 n 0000007927 00000 n 0000002679 00000 n 0000003345 00000 n 0000004195 00000 n 0000005276 00000 n 0000008180 00000 n 0000008330 00000 n 0000008485 00000 n 0000008640 00000 n 0000008788 00000 n 0000008943 00000 n 0000009096 00000 n 0000009246 00000 n 0000009401 00000 n 0000009556 00000 n 0000009706 00000 n 0000009855 00000 n 0000010032 00000 n 0000010201 00000 n 0000010368 00000 n 0000010533 00000 n 0000010699 00000 n 0000010861 00000 n 0000011038 00000 n 0000014195 00000 n 0000014346 00000 n 0000011430 00000 n 0000006382 00000 n 0000011215 00000 n 0000011270 00000 n 0000148687 00000 n 0000148857 00000 n 0000149201 00000 n 0000149374 00000 n 0000011321 00000 n 0000149546 00000 n 0000149722 00000 n 0000014717 00000 n 0000014061 00000 n 0000011548 00000 n 0000014499 00000 n 0000014608 00000 n 0000014663 00000 n 0000017984 00000 n 0000017766 00000 n 0000014811 00000 n 0000017874 00000 n 0000020908 00000 n 0000020635 00000 n 0000018090 00000 n 0000020743 00000 n 0000148342 00000 n 0000148172 00000 n 0000148512 00000 n 0000023761 00000 n 0000023593 00000 n 0000021039 00000 n 0000023704 00000 n 0000026155 00000 n 0000025931 00000 n 0000023869 00000 n 0000026042 00000 n 0000028500 00000 n 0000028219 00000 n 0000026275 00000 n 0000028331 00000 n 0000149834 00000 n 0000031121 00000 n 0000031294 00000 n 0000031448 00000 n 0000031616 00000 n 0000031788 00000 n 0000031953 00000 n 0000032121 00000 n 0000032288 00000 n 0000032802 00000 n 0000030933 00000 n 0000028607 00000 n 0000032463 00000 n 0000032575 00000 n 0000032632 00000 n 0000032689 00000 n 0000032746 00000 n 0000035578 00000 n 0000035773 00000 n 0000036374 00000 n 0000035430 00000 n 0000032933 00000 n 0000036148 00000 n 0000036205 00000 n 0000035962 00000 n 0000037271 00000 n 0000037420 00000 n 0000037569 00000 n 0000037718 00000 n 0000037867 00000 n 0000038016 00000 n 0000038165 00000 n 0000038314 00000 n 0000038461 00000 n 0000038610 00000 n 0000038758 00000 n 0000038906 00000 n 0000039054 00000 n 0000039203 00000 n 0000039350 00000 n 0000039498 00000 n 0000039646 00000 n 0000039794 00000 n 0000039999 00000 n 0000037003 00000 n 0000036506 00000 n 0000039942 00000 n 0000149031 00000 n 0000147708 00000 n 0000040095 00000 n 0000040190 00000 n 0000040553 00000 n 0000040852 00000 n 0000041251 00000 n 0000041718 00000 n 0000042285 00000 n 0000042613 00000 n 0000042912 00000 n 0000043243 00000 n 0000052431 00000 n 0000052714 00000 n 0000071376 00000 n 0000071932 00000 n 0000081170 00000 n 0000081491 00000 n 0000091562 00000 n 0000091921 00000 n 0000099204 00000 n 0000099475 00000 n 0000102207 00000 n 0000102445 00000 n 0000115261 00000 n 0000115624 00000 n 0000133731 00000 n 0000134207 00000 n 0000147311 00000 n 0000149935 00000 n 0000150004 00000 n 0000151036 00000 n 0000151217 00000 n 0000151376 00000 n 0000151550 00000 n 0000151754 00000 n 0000151988 00000 n 0000152100 00000 n 0000152138 00000 n 0000152265 00000 n trailer << /Size 200 /Root 198 0 R /Info 199 0 R /ID [<69B8ADA731B6C752B0DE14D385C59282> <69B8ADA731B6C752B0DE14D385C59282>] >> startxref 152772 %%EOF slepc4py-3.19.2/docs/source/000077500000000000000000000000001454104675500156145ustar00rootroot00000000000000slepc4py-3.19.2/docs/source/Makefile000066400000000000000000000011411454104675500172510ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx SPHINXPROJ = petsc4py SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) slepc4py-3.19.2/docs/source/abstract.txt000066400000000000000000000012231454104675500201560ustar00rootroot00000000000000.. topic:: Abstract This document describes slepc4py_, a Python_ port to the SLEPc_ libraries. SLEPc_ is a software package for the parallel solution of large-scale eigenvalue problems. It can be used for computing eigenvalues and eigenvectors of large, sparse matrices, or matrix pairs, and also for computing singular values and vectors of a rectangular matrix. SLEPc_ relies on PETSc_ for basic functionality such as the representation of matrices and vectors, and the solution of linear systems of equations. Thus, slepc4py_ must be used together with its companion petsc4py_. .. Local Variables: .. mode: rst .. End: slepc4py-3.19.2/docs/source/citing.rst000066400000000000000000000011301454104675500176160ustar00rootroot00000000000000Citations ========= If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. http://dx.doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman, and V. Vidal, *SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. http://dx.doi.org/10.1145/1089014.1089019 slepc4py-3.19.2/docs/source/conf.py000066400000000000000000000143421454104675500171170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # SLEPc for Python documentation build configuration file, created by # sphinx-quickstart on Sun Oct 1 15:52:05 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) def get_version(): import sys, os, re here = os.path.dirname(__file__) pardir = [os.path.pardir] * 2 topdir = os.path.join(here, *pardir) srcdir = os.path.join(topdir, 'src') with open(os.path.join(srcdir, 'slepc4py', '__init__.py')) as f: m = re.search(r"__version__\s*=\s*'(.*)'", f.read()) return m.groups()[0] pkg_version = get_version() # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] templates_path = [] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The main toctree document. main_doc = 'index' # General information about the project. project = u'SLEPc for Python' copyright = u'2023, Lisandro Dalcin and Jose Roman' author = u'Lisandro Dalcin' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = pkg_version[:3] # The full version, including alpha/beta/rc tags. release = pkg_version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] html_static_path = [] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars # html_sidebars = { # '**': [ # 'about.html', # 'navigation.html', # 'relations.html', # needs 'show_related': True theme option to display # 'searchbox.html', # 'donate.html', # ] # } # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'slepc4py-man' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', 'papersize': 'a4', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', #'printmodindex': '', #'printindex': '', #'preamble' : '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('manual', 'slepc4py.tex', project, author, 'howto'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (main_doc, 'slepc4py', project, [author], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (main_doc, 'slepc4py', project, author, 'slepc4py', project+u'.', 'Miscellaneous'), ] # -- Options for Epub output ---------------------------------------------- # Bibliographic Dublin Core info. epub_title = project epub_author = author epub_publisher = author epub_copyright = copyright # The unique identifier of the text. This can be a ISBN number # or the project homepage. # # epub_identifier = '' # A unique identification for the text. # # epub_uid = '' # A list of files that should not be packed into the epub file. epub_exclude_files = ['search.html'] slepc4py-3.19.2/docs/source/contents.rst000066400000000000000000000000001454104675500201710ustar00rootroot00000000000000slepc4py-3.19.2/docs/source/index.rst000066400000000000000000000004741454104675500174620ustar00rootroot00000000000000================ SLEPc for Python ================ :Authors: Lisandro Dalcin, Jose E. Roman :Contact: dalcinl@gmail.com, jroman@dsic.upv.es :Web Site: https://gitlab.com/slepc/slepc :Date: |today| .. include:: abstract.txt Contents ======== .. include:: toctree.txt .. include:: links.txt slepc4py-3.19.2/docs/source/install.rst000066400000000000000000000077011454104675500200210ustar00rootroot00000000000000Installation ============ Using **pip** or **easy_install** --------------------------------- You can use :program:`pip` to install :mod:`slepc4py` and its dependencies (:mod:`mpi4py` is optional but highly recommended):: $ pip install [--user] numpy mpi4py $ pip install [--user] petsc petsc4py $ pip install [--user] slepc slepc4py Alternatively, you can use :program:`easy_install` (deprecated):: $ easy_install [--user] slepc4py If you already have working PETSc and SLEPc installs, set environment variables :envvar:`SLEPC_DIR` and :envvar:`PETSC_DIR` (and perhaps :envvar:`PETSC_ARCH` for non-prefix installs) to appropriate values and next use :program:`pip`:: $ export SLEPC_DIR=/path/to/slepc $ export PETSC_DIR=/path/to/petsc $ export PETSC_ARCH=arch-linux2-c-opt $ pip install [--user] petsc4py slepc4py Using **distutils** ------------------- Requirements ^^^^^^^^^^^^ You need to have the following software properly installed in order to build *SLEPc for Python*: * Any MPI_ implementation [#]_ (e.g., MPICH_ or `Open MPI`_), built with shared libraries. * A matching version of PETSc_ built with shared libraries. * A matching version of SLEPc_ built with shared libraries. * NumPy_ package. * petsc4py_ package. .. [#] Unless you have appropriately configured and built SLEPc and PETSc without MPI (configure option ``--with-mpi=0``). .. [#] You may need to use a parallelized version of the Python interpreter with some MPI-1 implementations (e.g. MPICH1). .. include:: links.txt Downloading ^^^^^^^^^^^ The *SLEPc for Python* package is available for download at the Python Package Index. You can use :program:`curl` or :program:`wget` to get a release tarball. * Using :program:`curl`:: $ curl -LO https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz * Using :program:`wget`:: $ wget https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz Building ^^^^^^^^ After unpacking the release tarball:: $ tar -zxf slepc4py-X.Y.tar.gz $ cd slepc4py-X.Y the distribution is ready for building. .. note:: **Mac OS X** users employing a Python distribution built with **universal binaries** may need to set the environment variables :envvar:`MACOSX_DEPLOYMENT_TARGET`, :envvar:`SDKROOT`, and :envvar:`ARCHFLAGS` to appropriate values. As an example, assume your Mac is running **Snow Leopard** on a **64-bit Intel** processor and you want to override the hard-wired cross-development SDK in Python configuration, your environment should be modified like this:: $ export MACOSX_DEPLOYMENT_TARGET=10.6 $ export SDKROOT=/ $ export ARCHFLAGS='-arch x86_64' Some environment configuration is needed to inform the location of PETSc and SLEPc. You can set (using :command:`setenv`, :command:`export` or what applies to you shell or system) the environment variables :envvar:`SLEPC_DIR``, :envvar:`PETSC_DIR`, and :envvar:`PETSC_ARCH` indicating where you have built/installed SLEPc and PETSc:: $ export SLEPC_DIR=/usr/local/slepc $ export PETSC_DIR=/usr/local/petsc $ export PETSC_ARCH=arch-linux2-c-opt Alternatively, you can edit the file :file:`setup.cfg` and provide the required information below the ``[config]`` section:: [config] slepc_dir = /usr/local/slepc petsc_dir = /usr/local/petsc petsc_arch = arch-linux2-c-opt ... Finally, you can build the distribution by typing:: $ python setup.py build Installing ^^^^^^^^^^ After building, the distribution is ready for installation. If you have root privileges (either by log-in as the root user of by using :command:`sudo`) and you want to install *SLEPc for Python* in your system for all users, just do:: $ python setup.py install The previous steps will install the :mod:`slepc4py` package at standard location :file:`{prefix}/lib/python{X}.{X}/site-packages`. If you do not have root privileges or you want to install *SLEPc for Python* for your private use, just do:: $ python setup.py install --user slepc4py-3.19.2/docs/source/links.txt000066400000000000000000000007431454104675500175010ustar00rootroot00000000000000.. _MPI: https://www.mpi-forum.org .. _MPICH: https://www.mpich.org .. _Open MPI: https://www.open-mpi.org .. _PETSc: https://petsc.org .. _SLEPc: https://slepc.upv.es .. _Python: https://www.python.org .. _NumPy: https://www.numpy.org .. _mpi4py: https://github.com/mpi4py/mpi4py .. _petsc4py: https://gitlab.com/petsc/petsc .. _slepc4py: https://gitlab.com/slepc/slepc .. Local Variables: .. mode: rst .. End: slepc4py-3.19.2/docs/source/make.bat000066400000000000000000000014461454104675500172260ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=python -msphinx ) set SOURCEDIR=. set BUILDDIR=_build set SPHINXPROJ=petsc4py if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The Sphinx module was not found. Make sure you have Sphinx installed, echo.then set the SPHINXBUILD environment variable to point to the full echo.path of the 'sphinx-build' executable. Alternatively you may add the echo.Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd slepc4py-3.19.2/docs/source/manual.rst000066400000000000000000000002001454104675500176130ustar00rootroot00000000000000================ SLEPc for Python ================ .. include:: abstract.txt .. include:: toctree.txt .. include:: links.txt slepc4py-3.19.2/docs/source/overview.rst000066400000000000000000000163121454104675500202170ustar00rootroot00000000000000Overview ======== *SLEPc for Python* (slepc4py) is a Python package that provides convenient access to the functionality of SLEPc. SLEPc [1]_, [2]_ implements algorithms and tools for the numerical solution of large, sparse eigenvalue problems on parallel computers. It can be used for linear eigenvalue problems in either standard or generalized form, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve nonlinear eigenvalue problems (polynomial or general). Additionally, SLEPc provides solvers for the computation of the action of a matrix function on a vector. SLEPc is intended for computing a subset of the spectrum of a matrix (or matrix pair). One can for instance approximate the largest magnitude eigenvalues, or the smallest ones, or even those eigenvalues located near a given region of the complex plane. Interior eigenvalues are harder to compute, so SLEPc provides different methodologies. One such method is to use a spectral transformation. Cheaper alternatives are also available. .. [1] J. E. Roman, C. Campos, L. Dalcin, E. Romero, A. Tomas. SLEPc Users Manual. DSIC-II/24/02 - Revision 3.19 D. Sistemas Informaticos y Computacion, Universitat Politecnica de Valencia. 2023. .. [2] Vicente Hernandez, Jose E. Roman and Vicente Vidal. SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems, ACM Trans. Math. Softw. 31(3), pp. 351-362, 2005. .. include:: links.txt Features -------- Currently, the following types of eigenproblems can be addressed: * Standard eigenvalue problem, *Ax=kx*, either for Hermitian or non-Hermitian matrices. * Generalized eigenvalue problem, *Ax=kBx*, either Hermitian positive-definite or not. * Partial singular value decomposition of a rectangular matrix, *Au=sv*. * Polynomial eigenvalue problem, *P(k)x=0*. * Nonlinear eigenvalue problem, *T(k)x=0*. * Computing the action of a matrix function on a vector, *w=f(alpha A)v*. For the linear eigenvalue problem, the following methods are available: * Krylov eigensolvers, particularly Krylov-Schur, Arnoldi, and Lanczos. * Davidson-type eigensolvers, including Generalized Davidson and Jacobi-Davidson. * Subspace iteration and single vector iterations (inverse iteration, RQI). * Conjugate gradient for the minimization of the Rayleigh quotient. * A contour integral solver. For singular value computations, the following alternatives can be used: * Use an eigensolver via the cross-product matrix *A'A* or the cyclic matrix *[0 A; A' 0]*. * Explicitly restarted Lanczos bidiagonalization. * Implicitly restarted Lanczos bidiagonalization (thick-restart Lanczos). For polynomial eigenvalue problems, the following methods are available: * Use an eigensolver to solve the generalized eigenvalue problem obtained after linearization. * TOAR and Q-Arnoldi, memory efficient variants of Arnoldi for polynomial eigenproblems. For general nonlinear eigenvalue problems, the following methods can be used: * Solve a polynomial eigenproblem obtained via polynomial interpolation. * Rational interpolation and linearization (NLEIGS). * Newton-type methods such as SLP or RII. Computation of interior eigenvalues is supported by means of the following methodologies: * Spectral transformations, such as shift-and-invert. This technique implicitly uses the inverse of the shifted matrix *(A-tI)* in order to compute eigenvalues closest to a given target value, *t*. * Harmonic extraction, a cheap alternative to shift-and-invert that also tries to approximate eigenvalues closest to a target, *t*, but without requiring a matrix inversion. Other remarkable features include: * High computational efficiency, by using NumPy and SLEPc under the hood. * Data-structure neutral implementation, by using efficient sparse matrix storage provided by PETSc. Implicit matrix representation is also available by providing basic operations such as matrix-vector products as user-defined Python functions. * Run-time flexibility, by specifying numerous setting at the command line. * Ability to do the computation in parallel. Components ---------- SLEPc provides the following components, which are mirrored by slepc4py for its use from Python. The first five components are solvers for different classes of problems, while the rest can be considered auxiliary object. :EPS: The Eigenvalue Problem Solver is the component that provides all the functionality necessary to define and solve an eigenproblem. It provides mechanisms for completely specifying the problem: the problem type (e.g. standard symmetric), number of eigenvalues to compute, part of the spectrum of interest. Once the problem has been defined, a collection of solvers can be used to compute the required solutions. The behaviour of the solvers can be tuned by means of a few parameters, such as the maximum dimension of the subspace to be used during the computation. :SVD: This component is the analog of EPS for the case of Singular Value Decompositions. The user provides a rectangular matrix and specifies how many singular values and vectors are to be computed, whether the largest or smallest ones, as well as some other parameters for fine tuning the computation. Different solvers are available, as in the case of EPS. :PEP: This component is the analog of EPS for the case of Polynomial Eigenvalue Problems. The user provides the coefficient matrices of the polynomial. Several parameters can be specified, as in the case of EPS. It is also possible to indicate whether the problem belongs to a special type, e.g., symmetric or gyroscopic. :NEP: This component covers the case of general nonlinear eigenproblems, T(lambda)x=0. The user provides the parameter-dependent matrix T via the split form or by means of callback functions. :MFN: This component provides the functionality for computing the action of a matrix function on a vector. Given a matrix A and a vector b, the call MFNSolve(mfn,b,x) computes x=f(A)b, where f is a function such as the exponential. :ST: The Spectral Transformation is a component that provides convenient implementations of common spectral transformations. These are simple transformations that map eigenvalues to different positions, in such a way that convergence to wanted eigenvalues is enhanced. The most common spectral transformation is shift-and-invert, that allows for the computation of eigenvalues closest to a given target value. :BV: This component encapsulates the concept of a set of Basis Vectors spanning a vector space. This component provides convenient access to common operations such as orthogonalization of vectors. The BV component is usually not required by end-users. :DS: The Dense System (or Direct Solver) component, used internally to solve dense eigenproblems of small size that appear in the course of iterative eigensolvers. :FN: A component used to define mathematical functions. This is required by the end-user for instance to define function T(.) when solving nonlinear eigenproblems with NEP in split form. slepc4py-3.19.2/docs/source/toctree.txt000066400000000000000000000001651454104675500200240ustar00rootroot00000000000000.. toctree:: :maxdepth: 2 overview tutorial install citing .. Local Variables: .. mode: rst .. End: slepc4py-3.19.2/docs/source/tutorial.rst000066400000000000000000000175141454104675500202210ustar00rootroot00000000000000Tutorial ======== This tutorial is intended for basic use of slepc4py. For more advanced use, the reader is referred to SLEPc tutorials as well as to slepc4py reference documentation. Commented source of a simple example ------------------------------------ In this section, we include the source code of example ``demo/ex1.py`` available in the slepc4py distribution, with comments inserted inline. The first thing to do is initialize the libraries. This is normally not required, as it is done automatically at import time. However, if you want to gain access to the facilities for accessing command-line options, the following lines must be executed by the main script prior to any petsc4py or slepc4py calls:: import sys, slepc4py slepc4py.init(sys.argv) Next, we have to import the relevant modules. Normally, both PETSc and SLEPc modules have to be imported in all slepc4py programs. It may be useful to import NumPy as well:: from petsc4py import PETSc from slepc4py import SLEPc import numpy At this point, we can use any petsc4py and slepc4py operations. For instance, the following lines allow the user to specify an integer command-line argument ``n`` with a default value of 30 (see the next section for example usage of command-line options):: opts = PETSc.Options() n = opts.getInt('n', 30) It is necessary to build a matrix to define an eigenproblem (or two in the case of generalized eigenproblems). The following fragment of code creates the matrix object and then fills the non-zero elements one by one. The matrix of this particular example is tridiagonal, with value 2 in the diagonal, and -1 in off-diagonal positions. See petsc4py documentation for details about matrix objects:: A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() # first row if rstart == 0: A[0, :2] = [2, -1] rstart += 1 # last row if rend == n: A[n-1, -2:] = [-1, 2] rend -= 1 # other rows for i in range(rstart, rend): A[i, i-1:i+2] = [-1, 2, -1] A.assemble() The solver object is created in a similar way as other objects in petsc4py:: E = SLEPc.EPS(); E.create() Once the object is created, the eigenvalue problem must be specified. At least one matrix must be provided. The problem type must be indicated as well, in this case it is HEP (Hermitian eigenvalue problem). Apart from these, other settings could be provided here (for instance, the tolerance for the computation). After all options have been set, the user should call the ``setFromOptions()`` operation, so that any options specified at run time in the command line are passed to the solver object:: E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) E.setFromOptions() After that, the ``solve()`` method will run the selected eigensolver, keeping the solution stored internally:: E.solve() Once the computation has finished, we are ready to print the results. First, some informative data can be retrieved from the solver object:: Print = PETSc.Sys.Print Print() Print("******************************") Print("*** SLEPc Solution Results ***") Print("******************************") Print() its = E.getIterationNumber() Print("Number of iterations of the method: %d" % its) eps_type = E.getType() Print("Solution method: %s" % eps_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %d" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) For retrieving the solution, it is necessary to find out how many eigenpairs have converged to the requested precision:: nconv = E.getConverged() Print("Number of converged eigenpairs %d" % nconv) For each of the ``nconv`` eigenpairs, we can retrieve the eigenvalue ``k``, and the eigenvector, which is represented by means of two petsc4py vectors ``vr`` and ``vi`` (the real and imaginary part of the eigenvector, since for real matrices the eigenvalue and eigenvector may be complex). We also compute the corresponding relative errors in order to make sure that the computed solution is indeed correct:: if nconv > 0: # Create the results vectors vr, wr = A.getVecs() vi, wi = A.getVecs() # Print() Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, vr, vi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print() Example of command-line usage ----------------------------- Now we illustrate how to specify command-line options in order to extract the full potential of slepc4py. A simple execution of the ``demo/ex1.py`` script will result in the following output:: $ python demo/ex1.py ****************************** *** SLEPc Solution Results *** ****************************** Number of iterations of the method: 4 Solution method: krylovschur Number of requested eigenvalues: 1 Stopping condition: tol=1e-07, maxit=100 Number of converged eigenpairs 4 k ||Ax-kx||/||kx|| ----------------- ------------------ 3.989739 5.76012e-09 3.959060 1.41957e-08 3.908279 6.74118e-08 3.837916 8.34269e-08 For specifying different setting for the solver parameters, we can use SLEPc command-line options with the ``-eps`` prefix. For instance, to change the number of requested eigenvalues and the tolerance:: $ python demo/ex1.py -eps_nev 10 -eps_tol 1e-11 The method used by the solver object can also be set at run time:: $ python demo/ex1.py -eps_type subspace All the above settings can also be changed within the source code by making use of the appropriate slepc4py method. Since options can be set from within the code and the command-line, it is often useful to view the particular settings that are currently being used:: $ python demo/ex1.py -eps_view EPS Object: 1 MPI process type: krylovschur 50% of basis vectors kept after restart using the locking variant problem type: symmetric eigenvalue problem selected portion of the spectrum: largest eigenvalues in magnitude number of eigenvalues (nev): 1 number of column vectors (ncv): 16 maximum dimension of projected problem (mpd): 16 maximum number of iterations: 100 tolerance: 1e-08 convergence test: relative to the eigenvalue BV Object: 1 MPI process type: svec 17 columns of global length 30 orthogonalization method: classical Gram-Schmidt orthogonalization refinement: if needed (eta: 0.7071) block orthogonalization method: GS doing matmult as a single matrix-matrix product DS Object: 1 MPI process type: hep solving the problem with: Implicit QR method (_steqr) ST Object: 1 MPI process type: shift shift: 0 number of matrices: 1 Note that for computing eigenvalues of smallest magnitude we can use the option ``-eps_smallest_magnitude``, but for interior eigenvalues things are not so straightforward. One possibility is to try with harmonic extraction, for instance to get the eigenvalues closest to 0.6:: $ python demo/ex1.py -eps_harmonic -eps_target 0.6 Depending on the problem, harmonic extraction may fail to converge. In those cases, it is necessary to specify a spectral transformation other than the default. In the command-line, this is indicated with the ``-st_`` prefix. For example, shift-and-invert with a value of the shift equal to 0.6 would be:: $ python demo/ex1.py -st_type sinvert -eps_target 0.6 slepc4py-3.19.2/docs/usrman/000077500000000000000000000000001454104675500156215ustar00rootroot00000000000000slepc4py-3.19.2/docs/usrman/_sources/000077500000000000000000000000001454104675500174435ustar00rootroot00000000000000slepc4py-3.19.2/docs/usrman/_sources/citing.rst.txt000066400000000000000000000011301454104675500222630ustar00rootroot00000000000000Citations ========= If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. http://dx.doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman, and V. Vidal, *SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. http://dx.doi.org/10.1145/1089014.1089019 slepc4py-3.19.2/docs/usrman/_sources/contents.rst.txt000066400000000000000000000000001454104675500226360ustar00rootroot00000000000000slepc4py-3.19.2/docs/usrman/_sources/index.rst.txt000066400000000000000000000004741454104675500221270ustar00rootroot00000000000000================ SLEPc for Python ================ :Authors: Lisandro Dalcin, Jose E. Roman :Contact: dalcinl@gmail.com, jroman@dsic.upv.es :Web Site: https://gitlab.com/slepc/slepc :Date: |today| .. include:: abstract.txt Contents ======== .. include:: toctree.txt .. include:: links.txt slepc4py-3.19.2/docs/usrman/_sources/install.rst.txt000066400000000000000000000077011454104675500224660ustar00rootroot00000000000000Installation ============ Using **pip** or **easy_install** --------------------------------- You can use :program:`pip` to install :mod:`slepc4py` and its dependencies (:mod:`mpi4py` is optional but highly recommended):: $ pip install [--user] numpy mpi4py $ pip install [--user] petsc petsc4py $ pip install [--user] slepc slepc4py Alternatively, you can use :program:`easy_install` (deprecated):: $ easy_install [--user] slepc4py If you already have working PETSc and SLEPc installs, set environment variables :envvar:`SLEPC_DIR` and :envvar:`PETSC_DIR` (and perhaps :envvar:`PETSC_ARCH` for non-prefix installs) to appropriate values and next use :program:`pip`:: $ export SLEPC_DIR=/path/to/slepc $ export PETSC_DIR=/path/to/petsc $ export PETSC_ARCH=arch-linux2-c-opt $ pip install [--user] petsc4py slepc4py Using **distutils** ------------------- Requirements ^^^^^^^^^^^^ You need to have the following software properly installed in order to build *SLEPc for Python*: * Any MPI_ implementation [#]_ (e.g., MPICH_ or `Open MPI`_), built with shared libraries. * A matching version of PETSc_ built with shared libraries. * A matching version of SLEPc_ built with shared libraries. * NumPy_ package. * petsc4py_ package. .. [#] Unless you have appropriately configured and built SLEPc and PETSc without MPI (configure option ``--with-mpi=0``). .. [#] You may need to use a parallelized version of the Python interpreter with some MPI-1 implementations (e.g. MPICH1). .. include:: links.txt Downloading ^^^^^^^^^^^ The *SLEPc for Python* package is available for download at the Python Package Index. You can use :program:`curl` or :program:`wget` to get a release tarball. * Using :program:`curl`:: $ curl -LO https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz * Using :program:`wget`:: $ wget https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz Building ^^^^^^^^ After unpacking the release tarball:: $ tar -zxf slepc4py-X.Y.tar.gz $ cd slepc4py-X.Y the distribution is ready for building. .. note:: **Mac OS X** users employing a Python distribution built with **universal binaries** may need to set the environment variables :envvar:`MACOSX_DEPLOYMENT_TARGET`, :envvar:`SDKROOT`, and :envvar:`ARCHFLAGS` to appropriate values. As an example, assume your Mac is running **Snow Leopard** on a **64-bit Intel** processor and you want to override the hard-wired cross-development SDK in Python configuration, your environment should be modified like this:: $ export MACOSX_DEPLOYMENT_TARGET=10.6 $ export SDKROOT=/ $ export ARCHFLAGS='-arch x86_64' Some environment configuration is needed to inform the location of PETSc and SLEPc. You can set (using :command:`setenv`, :command:`export` or what applies to you shell or system) the environment variables :envvar:`SLEPC_DIR``, :envvar:`PETSC_DIR`, and :envvar:`PETSC_ARCH` indicating where you have built/installed SLEPc and PETSc:: $ export SLEPC_DIR=/usr/local/slepc $ export PETSC_DIR=/usr/local/petsc $ export PETSC_ARCH=arch-linux2-c-opt Alternatively, you can edit the file :file:`setup.cfg` and provide the required information below the ``[config]`` section:: [config] slepc_dir = /usr/local/slepc petsc_dir = /usr/local/petsc petsc_arch = arch-linux2-c-opt ... Finally, you can build the distribution by typing:: $ python setup.py build Installing ^^^^^^^^^^ After building, the distribution is ready for installation. If you have root privileges (either by log-in as the root user of by using :command:`sudo`) and you want to install *SLEPc for Python* in your system for all users, just do:: $ python setup.py install The previous steps will install the :mod:`slepc4py` package at standard location :file:`{prefix}/lib/python{X}.{X}/site-packages`. If you do not have root privileges or you want to install *SLEPc for Python* for your private use, just do:: $ python setup.py install --user slepc4py-3.19.2/docs/usrman/_sources/manual.rst.txt000066400000000000000000000002001454104675500222600ustar00rootroot00000000000000================ SLEPc for Python ================ .. include:: abstract.txt .. include:: toctree.txt .. include:: links.txt slepc4py-3.19.2/docs/usrman/_sources/overview.rst.txt000066400000000000000000000163121454104675500226640ustar00rootroot00000000000000Overview ======== *SLEPc for Python* (slepc4py) is a Python package that provides convenient access to the functionality of SLEPc. SLEPc [1]_, [2]_ implements algorithms and tools for the numerical solution of large, sparse eigenvalue problems on parallel computers. It can be used for linear eigenvalue problems in either standard or generalized form, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve nonlinear eigenvalue problems (polynomial or general). Additionally, SLEPc provides solvers for the computation of the action of a matrix function on a vector. SLEPc is intended for computing a subset of the spectrum of a matrix (or matrix pair). One can for instance approximate the largest magnitude eigenvalues, or the smallest ones, or even those eigenvalues located near a given region of the complex plane. Interior eigenvalues are harder to compute, so SLEPc provides different methodologies. One such method is to use a spectral transformation. Cheaper alternatives are also available. .. [1] J. E. Roman, C. Campos, L. Dalcin, E. Romero, A. Tomas. SLEPc Users Manual. DSIC-II/24/02 - Revision 3.19 D. Sistemas Informaticos y Computacion, Universitat Politecnica de Valencia. 2023. .. [2] Vicente Hernandez, Jose E. Roman and Vicente Vidal. SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems, ACM Trans. Math. Softw. 31(3), pp. 351-362, 2005. .. include:: links.txt Features -------- Currently, the following types of eigenproblems can be addressed: * Standard eigenvalue problem, *Ax=kx*, either for Hermitian or non-Hermitian matrices. * Generalized eigenvalue problem, *Ax=kBx*, either Hermitian positive-definite or not. * Partial singular value decomposition of a rectangular matrix, *Au=sv*. * Polynomial eigenvalue problem, *P(k)x=0*. * Nonlinear eigenvalue problem, *T(k)x=0*. * Computing the action of a matrix function on a vector, *w=f(alpha A)v*. For the linear eigenvalue problem, the following methods are available: * Krylov eigensolvers, particularly Krylov-Schur, Arnoldi, and Lanczos. * Davidson-type eigensolvers, including Generalized Davidson and Jacobi-Davidson. * Subspace iteration and single vector iterations (inverse iteration, RQI). * Conjugate gradient for the minimization of the Rayleigh quotient. * A contour integral solver. For singular value computations, the following alternatives can be used: * Use an eigensolver via the cross-product matrix *A'A* or the cyclic matrix *[0 A; A' 0]*. * Explicitly restarted Lanczos bidiagonalization. * Implicitly restarted Lanczos bidiagonalization (thick-restart Lanczos). For polynomial eigenvalue problems, the following methods are available: * Use an eigensolver to solve the generalized eigenvalue problem obtained after linearization. * TOAR and Q-Arnoldi, memory efficient variants of Arnoldi for polynomial eigenproblems. For general nonlinear eigenvalue problems, the following methods can be used: * Solve a polynomial eigenproblem obtained via polynomial interpolation. * Rational interpolation and linearization (NLEIGS). * Newton-type methods such as SLP or RII. Computation of interior eigenvalues is supported by means of the following methodologies: * Spectral transformations, such as shift-and-invert. This technique implicitly uses the inverse of the shifted matrix *(A-tI)* in order to compute eigenvalues closest to a given target value, *t*. * Harmonic extraction, a cheap alternative to shift-and-invert that also tries to approximate eigenvalues closest to a target, *t*, but without requiring a matrix inversion. Other remarkable features include: * High computational efficiency, by using NumPy and SLEPc under the hood. * Data-structure neutral implementation, by using efficient sparse matrix storage provided by PETSc. Implicit matrix representation is also available by providing basic operations such as matrix-vector products as user-defined Python functions. * Run-time flexibility, by specifying numerous setting at the command line. * Ability to do the computation in parallel. Components ---------- SLEPc provides the following components, which are mirrored by slepc4py for its use from Python. The first five components are solvers for different classes of problems, while the rest can be considered auxiliary object. :EPS: The Eigenvalue Problem Solver is the component that provides all the functionality necessary to define and solve an eigenproblem. It provides mechanisms for completely specifying the problem: the problem type (e.g. standard symmetric), number of eigenvalues to compute, part of the spectrum of interest. Once the problem has been defined, a collection of solvers can be used to compute the required solutions. The behaviour of the solvers can be tuned by means of a few parameters, such as the maximum dimension of the subspace to be used during the computation. :SVD: This component is the analog of EPS for the case of Singular Value Decompositions. The user provides a rectangular matrix and specifies how many singular values and vectors are to be computed, whether the largest or smallest ones, as well as some other parameters for fine tuning the computation. Different solvers are available, as in the case of EPS. :PEP: This component is the analog of EPS for the case of Polynomial Eigenvalue Problems. The user provides the coefficient matrices of the polynomial. Several parameters can be specified, as in the case of EPS. It is also possible to indicate whether the problem belongs to a special type, e.g., symmetric or gyroscopic. :NEP: This component covers the case of general nonlinear eigenproblems, T(lambda)x=0. The user provides the parameter-dependent matrix T via the split form or by means of callback functions. :MFN: This component provides the functionality for computing the action of a matrix function on a vector. Given a matrix A and a vector b, the call MFNSolve(mfn,b,x) computes x=f(A)b, where f is a function such as the exponential. :ST: The Spectral Transformation is a component that provides convenient implementations of common spectral transformations. These are simple transformations that map eigenvalues to different positions, in such a way that convergence to wanted eigenvalues is enhanced. The most common spectral transformation is shift-and-invert, that allows for the computation of eigenvalues closest to a given target value. :BV: This component encapsulates the concept of a set of Basis Vectors spanning a vector space. This component provides convenient access to common operations such as orthogonalization of vectors. The BV component is usually not required by end-users. :DS: The Dense System (or Direct Solver) component, used internally to solve dense eigenproblems of small size that appear in the course of iterative eigensolvers. :FN: A component used to define mathematical functions. This is required by the end-user for instance to define function T(.) when solving nonlinear eigenproblems with NEP in split form. slepc4py-3.19.2/docs/usrman/_sources/tutorial.rst.txt000066400000000000000000000175141454104675500226660ustar00rootroot00000000000000Tutorial ======== This tutorial is intended for basic use of slepc4py. For more advanced use, the reader is referred to SLEPc tutorials as well as to slepc4py reference documentation. Commented source of a simple example ------------------------------------ In this section, we include the source code of example ``demo/ex1.py`` available in the slepc4py distribution, with comments inserted inline. The first thing to do is initialize the libraries. This is normally not required, as it is done automatically at import time. However, if you want to gain access to the facilities for accessing command-line options, the following lines must be executed by the main script prior to any petsc4py or slepc4py calls:: import sys, slepc4py slepc4py.init(sys.argv) Next, we have to import the relevant modules. Normally, both PETSc and SLEPc modules have to be imported in all slepc4py programs. It may be useful to import NumPy as well:: from petsc4py import PETSc from slepc4py import SLEPc import numpy At this point, we can use any petsc4py and slepc4py operations. For instance, the following lines allow the user to specify an integer command-line argument ``n`` with a default value of 30 (see the next section for example usage of command-line options):: opts = PETSc.Options() n = opts.getInt('n', 30) It is necessary to build a matrix to define an eigenproblem (or two in the case of generalized eigenproblems). The following fragment of code creates the matrix object and then fills the non-zero elements one by one. The matrix of this particular example is tridiagonal, with value 2 in the diagonal, and -1 in off-diagonal positions. See petsc4py documentation for details about matrix objects:: A = PETSc.Mat().create() A.setSizes([n, n]) A.setFromOptions() A.setUp() rstart, rend = A.getOwnershipRange() # first row if rstart == 0: A[0, :2] = [2, -1] rstart += 1 # last row if rend == n: A[n-1, -2:] = [-1, 2] rend -= 1 # other rows for i in range(rstart, rend): A[i, i-1:i+2] = [-1, 2, -1] A.assemble() The solver object is created in a similar way as other objects in petsc4py:: E = SLEPc.EPS(); E.create() Once the object is created, the eigenvalue problem must be specified. At least one matrix must be provided. The problem type must be indicated as well, in this case it is HEP (Hermitian eigenvalue problem). Apart from these, other settings could be provided here (for instance, the tolerance for the computation). After all options have been set, the user should call the ``setFromOptions()`` operation, so that any options specified at run time in the command line are passed to the solver object:: E.setOperators(A) E.setProblemType(SLEPc.EPS.ProblemType.HEP) E.setFromOptions() After that, the ``solve()`` method will run the selected eigensolver, keeping the solution stored internally:: E.solve() Once the computation has finished, we are ready to print the results. First, some informative data can be retrieved from the solver object:: Print = PETSc.Sys.Print Print() Print("******************************") Print("*** SLEPc Solution Results ***") Print("******************************") Print() its = E.getIterationNumber() Print("Number of iterations of the method: %d" % its) eps_type = E.getType() Print("Solution method: %s" % eps_type) nev, ncv, mpd = E.getDimensions() Print("Number of requested eigenvalues: %d" % nev) tol, maxit = E.getTolerances() Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit)) For retrieving the solution, it is necessary to find out how many eigenpairs have converged to the requested precision:: nconv = E.getConverged() Print("Number of converged eigenpairs %d" % nconv) For each of the ``nconv`` eigenpairs, we can retrieve the eigenvalue ``k``, and the eigenvector, which is represented by means of two petsc4py vectors ``vr`` and ``vi`` (the real and imaginary part of the eigenvector, since for real matrices the eigenvalue and eigenvector may be complex). We also compute the corresponding relative errors in order to make sure that the computed solution is indeed correct:: if nconv > 0: # Create the results vectors vr, wr = A.getVecs() vi, wi = A.getVecs() # Print() Print(" k ||Ax-kx||/||kx|| ") Print("----------------- ------------------") for i in range(nconv): k = E.getEigenpair(i, vr, vi) error = E.computeError(i) if k.imag != 0.0: Print(" %9f%+9f j %12g" % (k.real, k.imag, error)) else: Print(" %12f %12g" % (k.real, error)) Print() Example of command-line usage ----------------------------- Now we illustrate how to specify command-line options in order to extract the full potential of slepc4py. A simple execution of the ``demo/ex1.py`` script will result in the following output:: $ python demo/ex1.py ****************************** *** SLEPc Solution Results *** ****************************** Number of iterations of the method: 4 Solution method: krylovschur Number of requested eigenvalues: 1 Stopping condition: tol=1e-07, maxit=100 Number of converged eigenpairs 4 k ||Ax-kx||/||kx|| ----------------- ------------------ 3.989739 5.76012e-09 3.959060 1.41957e-08 3.908279 6.74118e-08 3.837916 8.34269e-08 For specifying different setting for the solver parameters, we can use SLEPc command-line options with the ``-eps`` prefix. For instance, to change the number of requested eigenvalues and the tolerance:: $ python demo/ex1.py -eps_nev 10 -eps_tol 1e-11 The method used by the solver object can also be set at run time:: $ python demo/ex1.py -eps_type subspace All the above settings can also be changed within the source code by making use of the appropriate slepc4py method. Since options can be set from within the code and the command-line, it is often useful to view the particular settings that are currently being used:: $ python demo/ex1.py -eps_view EPS Object: 1 MPI process type: krylovschur 50% of basis vectors kept after restart using the locking variant problem type: symmetric eigenvalue problem selected portion of the spectrum: largest eigenvalues in magnitude number of eigenvalues (nev): 1 number of column vectors (ncv): 16 maximum dimension of projected problem (mpd): 16 maximum number of iterations: 100 tolerance: 1e-08 convergence test: relative to the eigenvalue BV Object: 1 MPI process type: svec 17 columns of global length 30 orthogonalization method: classical Gram-Schmidt orthogonalization refinement: if needed (eta: 0.7071) block orthogonalization method: GS doing matmult as a single matrix-matrix product DS Object: 1 MPI process type: hep solving the problem with: Implicit QR method (_steqr) ST Object: 1 MPI process type: shift shift: 0 number of matrices: 1 Note that for computing eigenvalues of smallest magnitude we can use the option ``-eps_smallest_magnitude``, but for interior eigenvalues things are not so straightforward. One possibility is to try with harmonic extraction, for instance to get the eigenvalues closest to 0.6:: $ python demo/ex1.py -eps_harmonic -eps_target 0.6 Depending on the problem, harmonic extraction may fail to converge. In those cases, it is necessary to specify a spectral transformation other than the default. In the command-line, this is indicated with the ``-st_`` prefix. For example, shift-and-invert with a value of the shift equal to 0.6 would be:: $ python demo/ex1.py -st_type sinvert -eps_target 0.6 slepc4py-3.19.2/docs/usrman/_static/000077500000000000000000000000001454104675500172475ustar00rootroot00000000000000slepc4py-3.19.2/docs/usrman/_static/ajax-loader.gif000066400000000000000000000012411454104675500221230ustar00rootroot00000000000000GIF89aòÿÿÿU|ÆÖßN€U|l–®Š«¾™¶Æ!þCreated with ajaxload.info!ù !ÿ NETSCAPE2.0,3ºÜþ0ÊIkc:œN˜f E±1º™Á¶.`ÄÂqÐ-[9ݦ9 JkçH!ù ,4ºÜþNŒ! „ »°æŠDqBQT`1 `LE[¨|µußía€ ×â†C²%$*!ù ,6º2#+ÊAÈÌ”V/…côNñIBa˜«pð ̳½ƨ+YíüƒÃ2©dŸ¿!ù ,3ºb%+Ê2†‘ìœV_…‹¦ …! 1D‡aªF‚°ÑbR]ó=08,Ȥr9L!ù ,2ºr'+JçdðóL &vÃ`\bT”…„¹hYB)ÏÊ@é<Ã&,ȤR’!ù ,3º Â9ãtç¼Úž0Çà!.B¶ÊW¬¢1  sa»°5÷•0° ‰»Ÿm)J!ù ,2ºÜþð ÙœU]šîÚqp•`ˆÝaœÝ4–…AFÅ0`›¶ Â@›1€ÂÖΑ!ù ,2ºÜþ0ÊI«eBÔœ)×à ŽÇq10©Ê°®PÂaVÚ¥ ub‚ž[;slepc4py-3.19.2/docs/usrman/_static/basic.css000066400000000000000000000243011454104675500210420ustar00rootroot00000000000000/* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; word-wrap: break-word; overflow-wrap : break-word; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox input[type="text"] { width: 170px; } img { border: 0; max-width: 100%; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; margin-left: auto; margin-right: auto; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable ul { margin-top: 0; margin-bottom: 0; list-style-type: none; } table.indextable > tbody > tr > td > ul { padding-left: 0em; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- domain module index --------------------------------------------------- */ table.modindextable td { padding: 2px; border-collapse: collapse; } /* -- general body styles --------------------------------------------------- */ div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: auto; -ms-hyphens: auto; -webkit-hyphens: auto; hyphens: auto; } a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink, caption:hover > a.headerlink, p.caption:hover > a.headerlink, div.code-block-caption:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.align-center { margin-left: auto; margin-right: auto; } table caption span.caption-number { font-style: italic; } table caption span.caption-text { } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- figures --------------------------------------------------------------- */ div.figure { margin: 0.5em; padding: 0.5em; } div.figure p.caption { padding: 0.3em; } div.figure p.caption span.caption-number { font-style: italic; } div.figure p.caption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ table.field-list td, table.field-list th { border: 0 !important; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .field-name { -moz-hyphens: manual; -ms-hyphens: manual; -webkit-hyphens: manual; hyphens: manual; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, span.highlighted { background-color: #fbe54e; } rect.highlighted { fill: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .optional { font-size: 1.3em; } .sig-paren { font-size: larger; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } div.code-block-caption { padding: 2px 5px; font-size: small; } div.code-block-caption code { background-color: transparent; } div.code-block-caption + div > div.highlight > pre { margin-top: 0; } div.code-block-caption span.caption-number { padding: 0.1em 0.3em; font-style: italic; } div.code-block-caption span.caption-text { } div.literal-block-wrapper { padding: 1em 1em 0; } div.literal-block-wrapper div.highlight { margin: 0; } code.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } code.descclassname { background-color: transparent; } code.xref, a code { background-color: transparent; font-weight: bold; } h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } span.eqno a.headerlink { position: relative; left: 0px; z-index: 1; } div.math:hover a.headerlink { visibility: visible; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }slepc4py-3.19.2/docs/usrman/_static/classic.css000066400000000000000000000100621454104675500214010ustar00rootroot00000000000000/* * classic.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- classic theme. * * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #1c4e63; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #133f52; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #ffffff; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #ffffff; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #ffffff; } div.sphinxsidebar a { color: #98dbcc; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } /* -- hyperlink styles ------------------------------------------------------ */ a { color: #355f7c; text-decoration: none; } a:visited { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #f2f2f2; font-weight: normal; color: #20435c; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li, div.body blockquote { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } code { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #ede; } .warning code { background: #efc2c2; } .note code { background: #d6d6d6; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } div.code-block-caption { color: #efefef; background-color: #1c4e63; }slepc4py-3.19.2/docs/usrman/_static/comment-bright.png000066400000000000000000000013641454104675500227000ustar00rootroot00000000000000‰PNG  IHDRóÿa»IDATx…“Àä<†ß™¤ÝýmÛ¶mÛ¶q¶mÛ¶mÛ¶m£ÚMæš=û‰óD¡¹8ÈãôtÙ·\{óïÕÙôÛ56ýÿj¥Ÿ>QnÝ~3úœŠ»sÌDš{ÛÞúo»­S+Ù»»Ø€=’·Çnù³Ónù¡ÍWÂ?ÚîXumŽùóA•ÅHóIµ%pHsåc‘æ‰ÖYoã¤ošíØ_{‰µµZ)48sõÚ³ïßöÛ—ßðû„Ê8YüYsóàj3ÄÁ4ä¶s^¸#Ç’ûðtË‹q˜kZà´ÜœwíÝ¿´ßµ>ŽÂ!¸«áù8ŽßpVnü{úÕ·ü=ån$ªûp\å^;=’;µwPIEND®B`‚slepc4py-3.19.2/docs/usrman/_static/comment-close.png000066400000000000000000000014751454104675500225310ustar00rootroot00000000000000‰PNG  IHDRóÿaIDATxmΜõ8†ñ÷$íkó³mÛ¶mÛ¶mÛ¶mÛ¶ÝAïMÎfp×ÿþž:€Oæ®'eð$Q¹qÏ —ÿ´aáÑO[ú¤Bæ3‡Uß÷9þO²Ög+Å‚-¾81dû‡w=7¿ç«ßq“¥ï¸öü×1¹¼¾ûCëKa”~ ±Ê¼Žû<ÎÔeÍ›è‰ÝgË'ÝyÃ{ÝråGn°ä×_öžë.|Ë5½Õ­Ì„Y‡¹ ²l›Ï•§¶¥]’Õ‚‘´ÓíÒÉ…®O4”‚ƒlØ!AÁ@@àwã²ônŸíy½^¤òÂxa*ž;1’u¾SºÑüWºÝ¦O<þ*ë‰7˜g>bž~ŸyÞž»ü mNÖ³É\£(Žtëë›:+ó¼tU&>9Z}æëOã®k=îŠæ®ÛwÔˆ=Žîe€ãûhjo OÚî÷àSd̳m#Ï(®2ôÚ®‰Šöˆ&ë!Q&Çô<þþ­iá_~ëð Yþ ¡»=º¼¨KâeߨOÄ™Ó Ó)Ó\Ó/&þí—f§¾û½ÙñdðåÇÀ’øUû¶Ì@Æøw‘Ôyq€#ý9½IEND®B`‚slepc4py-3.19.2/docs/usrman/_static/comment.png000066400000000000000000000012011454104675500214110ustar00rootroot00000000000000‰PNG  IHDRóÿaHIDATx…Œ_ÆçÚVTÛVܰŽQǵ«FT7ªm»]ïì<ÍMƒÚí½=ç>$ë“|¹ü~\>&nM²õðáKÿ<+W ú¬7‚¶â¯­zÉ« Ÿ–ÉÏ?Œwâê‹!«¶ž8_ÑO­ ÙðÞ§4—&‡ ¢MËSê'Ÿ±­/Ò›ñïœ=rÖ¼`ŸÂVÈ0!©¸?t'$Ý#°'‚äP`¤•iawPáÚœºÁ÷ƒ¬?DãqÙÌ.`Ž ¡lZ%9A Ð{EÒº !;eš`fšT]’P]ZCD‰­ÌX¤2e)ן§Ûr¯y­OZs߂Ј {š1<¦”†*€Bx‘µôᯠà`Êã²û(¬B4ƒš2|šÖk@°•àÀ=¯P¦A¿™ÙÈše;  HÍ­²U‚íà`¿Bõ£¹‡ÅÒ@(é”IàÁÏšRÝ ©áF¸"¨aí(.Î |R*wãÎÞZB/bZ÷ f‡ÏM¦Q+ˆ¨d!ŠÍÚ!06«•ê5.÷‹Ä9Eq+@3 Ù‰ª©VSˈêd8£â˜Ì;ŸÐ&KpHh0€f;€±ÊhãY¹,]|ïÁLcne!Ý¿fë‰KcJâFiyÒüŒöüSO‚hëמ%ws ÅèívaÿºJ{¨ÁßÚ£;/S3ï½Î ?q¥¢cáC¯Ó\ƒq¯H­ø¯xíÑñsem¹±‚k2n= 0 && !jQuery(node.parentNode).hasClass(className)) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.className = className; } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { var bbox = span.getBBox(); var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); var parentOfText = node.parentNode.parentNode; addItems.push({ "parent": node.parentNode, "target": rect}); } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this, addItems); }); } } var addItems = []; var result = this.each(function() { highlight(this, addItems); }); for (var i = 0; i < addItems.length; ++i) { jQuery(addItems[i].parent).before(addItems[i].target); } return result; }; /* * backward compatibility for jQuery.browser * This will be supported until firefox bug is fixed. */ if (!jQuery.browser) { jQuery.uaMatch = function(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; jQuery.browser = {}; jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; } /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated === 'undefined') return string; return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); if (!body.length) { body = $('body'); } window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this === '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); }, initOnKeyListeners: function() { $(document).keyup(function(event) { var activeElementType = document.activeElement.tagName; // don't navigate when in search box or textarea if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); if (prevHref) { window.location.href = prevHref; return false; } case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } } } }); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); });slepc4py-3.19.2/docs/usrman/_static/down-pressed.png000066400000000000000000000003361454104675500223710ustar00rootroot00000000000000‰PNG  IHDRóÿa¥IDATxcØÏÌ@ëJ@lK†f[^g%_â æÁ£‰ªæ HºäK þÄ¿øâD އ²AåþÔb3݈ÿCüGÇhr.¸œx¤€¾‚/`X€ø WüƒÊ± Ý2 ¯ ØeÄFÑ+,.xEJ ñ¨Íÿ lARÊ $ÛW›T?‚0iÝ„)1€mƒÎ¿ÏaUï°IEND®B`‚slepc4py-3.19.2/docs/usrman/_static/down.png000066400000000000000000000003121454104675500207200ustar00rootroot00000000000000‰PNG  IHDRµú7ê‘IDATx­Œµ¡ƒP@ï—îû ì@IÇß—`&˜"z6xK@kbÏ¢x•s]…éÁM ˆ:ÇŠ/ž+£g¾Pdç2G³eÃ~߸J“_÷c S_Åå— S%exdUú¡]õ(UHüàò>‘&—…´Á;4Úùi‡ã$•n˜3—> ûy”céñ„¯d„ÚIEND®B`‚slepc4py-3.19.2/docs/usrman/_static/file.png000066400000000000000000000004361454104675500206770ustar00rootroot00000000000000‰PNG  IHDRóÿaåIDATx­“ƒR…÷){…l× Û¶ÙfÛ=@®å œ:¿¹¾3ßú~箄þþþ¹òòrX$AðX-öD ~ñýý òóó€Ç‰(ŠP%¾€8<<9:: ãøøØP•êO&’$é Øl~‚X÷ìãûæ&ȽÖEWÀ^4µwQ}ÂÎö^ü˜Ô÷Í£¾ ‹¨iê©ïš0/H/é@F)éDzq+’ój”[žSU5¾€Ìèhš¦/ð¿oY– G&Lfs|£¡»»{Íêßøß3%¸U+S°é`AFÒIEND®B`‚slepc4py-3.19.2/docs/usrman/_static/jquery.js000066400000000000000000010133721454104675500211330ustar00rootroot00000000000000/*! * jQuery JavaScript Library v3.2.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2017-09-03T00:14Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. var arr = []; var document = window.document; var getProto = Object.getPrototypeOf; var slice = arr.slice; var concat = arr.concat; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; function DOMEval( code, doc ) { doc = doc || document; var script = doc.createElement( "script" ); script.text = code; doc.head.appendChild( script ).parentNode.removeChild( script ); } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.2.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android <=4.0 only // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && Array.isArray( src ) ? src : []; } else { clone = src && jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isFunction: function( obj ) { return jQuery.type( obj ) === "function"; }, isWindow: function( obj ) { return obj != null && obj === obj.window; }, isNumeric: function( obj ) { // As of jQuery 3.0, isNumeric is limited to // strings and numbers (primitives or objects) // that can be coerced to finite numbers (gh-2662) var type = jQuery.type( obj ); return ( type === "number" || type === "string" ) && // parseFloat NaNs numeric-cast false positives ("") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN !isNaN( obj - parseFloat( obj ) ); }, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { /* eslint-disable no-unused-vars */ // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { return false; } return true; }, type: function( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; }, // Evaluates a script in a global context globalEval: function( code ) { DOMEval( code ); }, // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 13 // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // Support: Android <=4.0 only trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var tmp, args, proxy; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: Date.now, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.3 * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-08-08 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, disabledAncestor = addCombinator( function( elem ) { return elem.disabled === true && ("form" in elem || "label" in elem); }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // ID selector if ( (m = match[1]) ) { // Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && (elem = newContext.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !compilerCache[ selector + " " ] && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { if ( nodeType !== 1 ) { newContext = context; newSelector = selector; // qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE <=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", (nid = expando) ); } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[i] = "#" + nid + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement("fieldset"); try { return !!fn( el ); } catch (e) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && disabledAncestor( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) if ( preferredDoc !== document && (subWindow = document.defaultView) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( el ) { el.className = "i"; return !el.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( el ) { el.appendChild( document.createComment("") ); return !el.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; }); // ID filter and find if ( support.getById ) { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( (elem = elems[i++]) ) { node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( el ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll(":enabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll(":disabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return (sel + "").replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( (oldCache = uniqueCache[ key ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; if ( !context && elem.ownerDocument !== document ) { setDocument( elem ); xml = !documentIsHTML; } while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( el ) { return el.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Simple selector that can be filtered directly, removing non-Elements if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } // Complex selector, compare the two sets, removing non-Elements qualifier = jQuery.filter( qualifier, elements ); return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; } ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( nodeName( elem, "iframe" ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( jQuery.isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( jQuery.isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, jQuery.isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, jQuery.isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, jQuery.isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ jQuery.camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ jQuery.camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( jQuery.camelCase ); } else { key = jQuery.camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. jQuery.contains( elem.ownerDocument, elem ) && jQuery.css( elem, "display" ) === "none"; }; var swap = function( elem, options, callback, args ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale = 1, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Make sure we update the tween properties later on valueParts = valueParts || []; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; do { // If previous iteration zeroed out, double until we get *something*. // Use string for doubling so we don't accidentally see scale as unchanged below scale = scale || ".5"; // Adjust and apply initialInUnit = initialInUnit / scale; jQuery.style( elem, prop, initialInUnit + unit ); // Update scale, tolerating zero or NaN from tween.cur() // Break the loop if scale is unchanged or perfect, or if we've just had enough. } while ( scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations ); } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); var rscriptType = ( /^$|\/(?:java|ecma)script/i ); // We have to close these tags to support XHTML (#13200) var wrapMap = { // Support: IE <=9 only option: [ 1, "" ], // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; // Support: IE <=9 only wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, contains, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; } )(); var documentElement = document.documentElement; var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 only // See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = {}; } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { // Make a writable jQuery.Event from the native event object var event = jQuery.event.fix( nativeEvent ); var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: jQuery.isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { this.focus(); return false; } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var /* eslint-disable max-len */ // See https://github.com/eslint/eslint/issues/3229 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, /* eslint-enable */ // Support: IE <=10 - 11, Edge 12 - 13 // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( ">tbody", elem )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[ 1 ]; } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.access( src ); pdataCur = dataPriv.set( dest, pdataOld ); events = pdataOld.events; if ( events ) { delete pdataCur.handle; pdataCur.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = concat.apply( [], args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( isFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html.replace( rxhtmlTag, "<$1>" ); }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = jQuery.contains( elem.ownerDocument, elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rmargin = ( /^margin/ ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } div.style.cssText = "box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%"; div.innerHTML = ""; documentElement.appendChild( container ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = divStyle.marginLeft === "2px"; boxSizingReliableVal = divStyle.width === "4px"; // Support: Android 4.0 - 4.3 only // Some styles come back with percentage values, even though they shouldn't div.style.marginRight = "50%"; pixelMarginRightVal = divStyle.marginRight === "4px"; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute"; container.appendChild( div ); jQuery.extend( support, { pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelMarginRight: function() { computeStyleTests(); return pixelMarginRightVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }, cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style; // Return a css property mapped to a potentially vendor prefixed property function vendorPropName( name ) { // Shortcut for names that are not vendor prefixed if ( name in emptyStyle ) { return name; } // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a property mapped along what jQuery.cssProps suggests or to // a vendor prefixed property. function finalPropName( name ) { var ret = jQuery.cssProps[ name ]; if ( !ret ) { ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; } return ret; } function setPositiveNumber( elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { var i, val = 0; // If we already have the right measurement, avoid augmentation if ( extra === ( isBorderBox ? "border" : "content" ) ) { i = 4; // Otherwise initialize for horizontal or vertical properties } else { i = name === "width" ? 1 : 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin, so add it if we want it if ( extra === "margin" ) { val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); } if ( isBorderBox ) { // border-box includes padding, so remove it if we want content if ( extra === "content" ) { val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // At this point, extra isn't border nor margin, so remove border if ( extra !== "margin" ) { val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } else { // At this point, extra isn't content, so add padding val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // At this point, extra isn't content nor padding, so add border if ( extra !== "padding" ) { val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } return val; } function getWidthOrHeight( elem, name, extra ) { // Start with computed style var valueIsBorderBox, styles = getStyles( elem ), val = curCSS( elem, name, styles ), isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // Computed unit is not pixels. Stop here and return. if ( rnumnonpx.test( val ) ) { return val; } // Check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] ); // Fall back to offsetWidth/Height when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) if ( val === "auto" ) { val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; } // Normalize "", auto, and prepare for extra val = parseFloat( val ) || 0; // Use the active box-sizing model to add/subtract irrelevant styles return ( val + augmentWidthOrHeight( elem, name, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: { "float": "cssFloat" }, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = jQuery.camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) if ( type === "number" ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = jQuery.camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( i, name ) { jQuery.cssHooks[ name ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, name, extra ); } ) : getWidthOrHeight( elem, name, extra ); } }, set: function( elem, value, extra ) { var matches, styles = extra && getStyles( elem ), subtract = extra && augmentWidthOrHeight( elem, name, extra, jQuery.css( elem, "boxSizing", false, styles ) === "border-box", styles ); // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ name ] = value; value = jQuery.css( elem, name ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( !rmargin.test( prefix ) ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = jQuery.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 13 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = jQuery.camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( jQuery.isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = jQuery.proxy( result.stop, result ); } return result; } } jQuery.map( props, createTween, animation ); if ( jQuery.isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( jQuery.isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || jQuery.isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( jQuery.isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue && type !== false ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = jQuery.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( jQuery.isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } if ( typeof value === "string" && value ) { classes = value.match( rnothtmlwhite ) || []; while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( jQuery.isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } if ( typeof value === "string" && value ) { classes = value.match( rnothtmlwhite ) || []; while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value; if ( typeof stateVal === "boolean" && type === "string" ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( jQuery.isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( type === "string" ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = value.match( rnothtmlwhite ) || []; while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, isFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; } ); jQuery.fn.extend( { hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } } ); support.focusin = "onfocusin" in window; // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = jQuery.now(); var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && jQuery.type( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = jQuery.isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( jQuery.isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; } } match = responseHeaders[ key.toLowerCase() ]; } return match == null ? null : match; }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 13 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available, append data to url if ( s.data ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( jQuery.isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery._evalUrl = function( url ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, "throws": true } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( jQuery.isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( jQuery.isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var isFunction = jQuery.isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain requests if ( s.crossDomain ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "

Citations¶

If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project.

slepc4py-3.19.2/docs/usrman/contents.html000066400000000000000000000061341454104675500203500ustar00rootroot00000000000000 <no title> — SLEPc for Python 3.19.2 documentation
slepc4py-3.19.2/docs/usrman/genindex.html000066400000000000000000000122151454104675500203110ustar00rootroot00000000000000 Index — SLEPc for Python 3.19.2 documentation slepc4py-3.19.2/docs/usrman/index.html000066400000000000000000000157361454104675500176320ustar00rootroot00000000000000 SLEPc for Python — SLEPc for Python 3.19.2 documentation

SLEPc for Python¶

Authors:Lisandro Dalcin, Jose E. Roman
Contact:dalcinl@gmail.com, jroman@dsic.upv.es
Web Site:https://gitlab.com/slepc/slepc
Date:Sep 05, 2023

Abstract

This document describes slepc4py, a Python port to the SLEPc libraries.

SLEPc is a software package for the parallel solution of large-scale eigenvalue problems. It can be used for computing eigenvalues and eigenvectors of large, sparse matrices, or matrix pairs, and also for computing singular values and vectors of a rectangular matrix.

SLEPc relies on PETSc for basic functionality such as the representation of matrices and vectors, and the solution of linear systems of equations. Thus, slepc4py must be used together with its companion petsc4py.

slepc4py-3.19.2/docs/usrman/install.html000066400000000000000000000324221454104675500201600ustar00rootroot00000000000000 Installation — SLEPc for Python 3.19.2 documentation

Installation¶

Using pip or easy_install¶

You can use pip to install slepc4py and its dependencies (mpi4py is optional but highly recommended):

$ pip install [--user] numpy mpi4py
$ pip install [--user] petsc petsc4py
$ pip install [--user] slepc slepc4py

Alternatively, you can use easy_install (deprecated):

$ easy_install [--user] slepc4py

If you already have working PETSc and SLEPc installs, set environment variables SLEPC_DIR and PETSC_DIR (and perhaps PETSC_ARCH for non-prefix installs) to appropriate values and next use pip:

$ export SLEPC_DIR=/path/to/slepc
$ export PETSC_DIR=/path/to/petsc
$ export PETSC_ARCH=arch-linux2-c-opt
$ pip install [--user] petsc4py slepc4py

Using distutils¶

Requirements¶

You need to have the following software properly installed in order to build SLEPc for Python:

  • Any MPI implementation [1] (e.g., MPICH or Open MPI), built with shared libraries.
  • A matching version of PETSc built with shared libraries.
  • A matching version of SLEPc built with shared libraries.
  • NumPy package.
  • petsc4py package.
[1]Unless you have appropriately configured and built SLEPc and PETSc without MPI (configure option --with-mpi=0).
[2]You may need to use a parallelized version of the Python interpreter with some MPI-1 implementations (e.g. MPICH1).

Downloading¶

The SLEPc for Python package is available for download at the Python Package Index. You can use curl or wget to get a release tarball.

  • Using curl:

    $ curl -LO https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz
    
  • Using wget:

    $ wget https://pypi.io/packages/source/s/slepc4py/slepc4py-X.Y.Z.tar.gz
    

Building¶

After unpacking the release tarball:

$ tar -zxf slepc4py-X.Y.tar.gz
$ cd slepc4py-X.Y

the distribution is ready for building.

Note

Mac OS X users employing a Python distribution built with universal binaries may need to set the environment variables MACOSX_DEPLOYMENT_TARGET, SDKROOT, and ARCHFLAGS to appropriate values. As an example, assume your Mac is running Snow Leopard on a 64-bit Intel processor and you want to override the hard-wired cross-development SDK in Python configuration, your environment should be modified like this:

$ export MACOSX_DEPLOYMENT_TARGET=10.6
$ export SDKROOT=/
$ export ARCHFLAGS='-arch x86_64'

Some environment configuration is needed to inform the location of PETSc and SLEPc. You can set (using setenv, export or what applies to you shell or system) the environment variables SLEPC_DIR`, PETSC_DIR, and PETSC_ARCH indicating where you have built/installed SLEPc and PETSc:

$ export SLEPC_DIR=/usr/local/slepc
$ export PETSC_DIR=/usr/local/petsc
$ export PETSC_ARCH=arch-linux2-c-opt

Alternatively, you can edit the file setup.cfg and provide the required information below the [config] section:

[config]
slepc_dir  = /usr/local/slepc
petsc_dir  = /usr/local/petsc
petsc_arch = arch-linux2-c-opt
...

Finally, you can build the distribution by typing:

$ python setup.py build

Installing¶

After building, the distribution is ready for installation.

If you have root privileges (either by log-in as the root user of by using sudo) and you want to install SLEPc for Python in your system for all users, just do:

$ python setup.py install

The previous steps will install the slepc4py package at standard location prefix/lib/pythonX.X/site-packages.

If you do not have root privileges or you want to install SLEPc for Python for your private use, just do:

$ python setup.py install --user
slepc4py-3.19.2/docs/usrman/manual.html000066400000000000000000000132301454104675500177630ustar00rootroot00000000000000 SLEPc for Python — SLEPc for Python 3.19.2 documentation

SLEPc for Python¶

Abstract

This document describes slepc4py, a Python port to the SLEPc libraries.

SLEPc is a software package for the parallel solution of large-scale eigenvalue problems. It can be used for computing eigenvalues and eigenvectors of large, sparse matrices, or matrix pairs, and also for computing singular values and vectors of a rectangular matrix.

SLEPc relies on PETSc for basic functionality such as the representation of matrices and vectors, and the solution of linear systems of equations. Thus, slepc4py must be used together with its companion petsc4py.

slepc4py-3.19.2/docs/usrman/objects.inv000066400000000000000000000005031454104675500177660ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: SLEPc for Python # Version: 3.1 # The remainder of this file is compressed using zlib. xÚuŽM Â0F÷9E. àVĸ z˜Œm ‘fZííµùÁt—yóòͧ-[¬¥g³6¤åb%u ˆ['w–[B/4!²/ÌÄ¢»A’lÙÁVÔ€ ¼‚ìÔ Ü¤gõÃô_-eÎŒËq_iy§NV#7„Ù³r®ÔÊ‘aE«°W…ÉŸì–ÌÊq‘ñ߉Lï •§ºÁÂs~$³¨ŸÓ$<¨N7exd©OÜWªÁ=SgËî™Eûš&ñý|žFslepc4py-3.19.2/docs/usrman/overview.html000066400000000000000000000311451454104675500203610ustar00rootroot00000000000000 Overview — SLEPc for Python 3.19.2 documentation

Overview¶

SLEPc for Python (slepc4py) is a Python package that provides convenient access to the functionality of SLEPc.

SLEPc [1], [2] implements algorithms and tools for the numerical solution of large, sparse eigenvalue problems on parallel computers. It can be used for linear eigenvalue problems in either standard or generalized form, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve nonlinear eigenvalue problems (polynomial or general). Additionally, SLEPc provides solvers for the computation of the action of a matrix function on a vector.

SLEPc is intended for computing a subset of the spectrum of a matrix (or matrix pair). One can for instance approximate the largest magnitude eigenvalues, or the smallest ones, or even those eigenvalues located near a given region of the complex plane. Interior eigenvalues are harder to compute, so SLEPc provides different methodologies. One such method is to use a spectral transformation. Cheaper alternatives are also available.

[1]J. E. Roman, C. Campos, L. Dalcin, E. Romero, A. Tomas. SLEPc Users Manual. DSIC-II/24/02 - Revision 3.19 D. Sistemas Informaticos y Computacion, Universitat Politecnica de Valencia. 2023.
[2]Vicente Hernandez, Jose E. Roman and Vicente Vidal. SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems, ACM Trans. Math. Softw. 31(3), pp. 351-362, 2005.

Features¶

Currently, the following types of eigenproblems can be addressed:

  • Standard eigenvalue problem, Ax=kx, either for Hermitian or non-Hermitian matrices.
  • Generalized eigenvalue problem, Ax=kBx, either Hermitian positive-definite or not.
  • Partial singular value decomposition of a rectangular matrix, Au=sv.
  • Polynomial eigenvalue problem, P(k)x=0.
  • Nonlinear eigenvalue problem, T(k)x=0.
  • Computing the action of a matrix function on a vector, w=f(alpha A)v.

For the linear eigenvalue problem, the following methods are available:

  • Krylov eigensolvers, particularly Krylov-Schur, Arnoldi, and Lanczos.
  • Davidson-type eigensolvers, including Generalized Davidson and Jacobi-Davidson.
  • Subspace iteration and single vector iterations (inverse iteration, RQI).
  • Conjugate gradient for the minimization of the Rayleigh quotient.
  • A contour integral solver.

For singular value computations, the following alternatives can be used:

  • Use an eigensolver via the cross-product matrix A’A or the cyclic matrix [0 A; A’ 0].
  • Explicitly restarted Lanczos bidiagonalization.
  • Implicitly restarted Lanczos bidiagonalization (thick-restart Lanczos).

For polynomial eigenvalue problems, the following methods are available:

  • Use an eigensolver to solve the generalized eigenvalue problem obtained after linearization.
  • TOAR and Q-Arnoldi, memory efficient variants of Arnoldi for polynomial eigenproblems.

For general nonlinear eigenvalue problems, the following methods can be used:

  • Solve a polynomial eigenproblem obtained via polynomial interpolation.
  • Rational interpolation and linearization (NLEIGS).
  • Newton-type methods such as SLP or RII.

Computation of interior eigenvalues is supported by means of the following methodologies:

  • Spectral transformations, such as shift-and-invert. This technique implicitly uses the inverse of the shifted matrix (A-tI) in order to compute eigenvalues closest to a given target value, t.
  • Harmonic extraction, a cheap alternative to shift-and-invert that also tries to approximate eigenvalues closest to a target, t, but without requiring a matrix inversion.

Other remarkable features include:

  • High computational efficiency, by using NumPy and SLEPc under the hood.
  • Data-structure neutral implementation, by using efficient sparse matrix storage provided by PETSc. Implicit matrix representation is also available by providing basic operations such as matrix-vector products as user-defined Python functions.
  • Run-time flexibility, by specifying numerous setting at the command line.
  • Ability to do the computation in parallel.

Components¶

SLEPc provides the following components, which are mirrored by slepc4py for its use from Python. The first five components are solvers for different classes of problems, while the rest can be considered auxiliary object.

EPS:The Eigenvalue Problem Solver is the component that provides all the functionality necessary to define and solve an eigenproblem. It provides mechanisms for completely specifying the problem: the problem type (e.g. standard symmetric), number of eigenvalues to compute, part of the spectrum of interest. Once the problem has been defined, a collection of solvers can be used to compute the required solutions. The behaviour of the solvers can be tuned by means of a few parameters, such as the maximum dimension of the subspace to be used during the computation.
SVD:This component is the analog of EPS for the case of Singular Value Decompositions. The user provides a rectangular matrix and specifies how many singular values and vectors are to be computed, whether the largest or smallest ones, as well as some other parameters for fine tuning the computation. Different solvers are available, as in the case of EPS.
PEP:This component is the analog of EPS for the case of Polynomial Eigenvalue Problems. The user provides the coefficient matrices of the polynomial. Several parameters can be specified, as in the case of EPS. It is also possible to indicate whether the problem belongs to a special type, e.g., symmetric or gyroscopic.
NEP:This component covers the case of general nonlinear eigenproblems, T(lambda)x=0. The user provides the parameter-dependent matrix T via the split form or by means of callback functions.
MFN:This component provides the functionality for computing the action of a matrix function on a vector. Given a matrix A and a vector b, the call MFNSolve(mfn,b,x) computes x=f(A)b, where f is a function such as the exponential.
ST:The Spectral Transformation is a component that provides convenient implementations of common spectral transformations. These are simple transformations that map eigenvalues to different positions, in such a way that convergence to wanted eigenvalues is enhanced. The most common spectral transformation is shift-and-invert, that allows for the computation of eigenvalues closest to a given target value.
BV:This component encapsulates the concept of a set of Basis Vectors spanning a vector space. This component provides convenient access to common operations such as orthogonalization of vectors. The BV component is usually not required by end-users.
DS:The Dense System (or Direct Solver) component, used internally to solve dense eigenproblems of small size that appear in the course of iterative eigensolvers.
FN:A component used to define mathematical functions. This is required by the end-user for instance to define function T(.) when solving nonlinear eigenproblems with NEP in split form.
slepc4py-3.19.2/docs/usrman/search.html000066400000000000000000000067041454104675500177630ustar00rootroot00000000000000 Search — SLEPc for Python 3.19.2 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

slepc4py-3.19.2/docs/usrman/searchindex.js000066400000000000000000000154321454104675500204610ustar00rootroot00000000000000Search.setIndex({docnames:["citing","contents","index","install","manual","overview","tutorial"],envversion:52,filenames:["citing.rst","contents.rst","index.rst","install.rst","manual.rst","overview.rst","tutorial.rst"],objects:{},objnames:{},objtypes:{},terms:{"12f":6,"12g":6,"34269e":6,"41957e":6,"74118e":6,"76012e":6,"case":[5,6],"class":5,"default":6,"export":3,"final":3,"function":[2,4,5],"import":6,"public":0,"try":6,"while":5,EPS:[5,6],For:[5,6],One:[5,6],Sys:6,The:[3,5,6],These:5,Use:5,Using:[2,4],_steqr:6,abil:5,about:6,abov:6,academ:0,access:[5,6],acknowledg:0,acm:[0,5],action:5,addition:5,address:5,advanc:[0,6],advwatr:0,after:[3,5,6],algorithm:5,all:[3,5,6],allow:[5,6],alpha:5,alreadi:3,also:[2,4,5,6],altern:[3,5],analog:5,ani:[3,6],apart:6,appear:5,appli:3,appropri:[3,6],approxim:5,arch:3,archflag:3,argument:6,argv:6,arithmet:5,arnoldi:5,assembl:6,assum:3,author:2,automat:6,auxiliari:5,avail:[3,5,6],basi:[5,6],basic:[2,4,5,6],been:[0,5,6],behaviour:5,being:6,belong:5,below:3,bidiagon:5,binari:3,bit:3,block:6,both:6,build:6,built:3,call:[5,6],callback:5,campo:5,can:[2,3,4,5,6],cfg:3,chang:6,cheap:5,cheaper:5,citat:[2,4],cite:0,classic:6,closest:[5,6],code:6,coeffici:5,collect:5,column:6,com:2,command:[2,4,5],comment:[2,4],common:5,companion:[2,4],complet:5,complex:[5,6],compon:[2,4],comput:[0,2,4,5,6],computacion:5,computeerror:6,concept:5,condit:6,config:3,configur:3,conjug:5,consid:5,contact:2,contour:5,conveni:5,converg:[5,6],correct:6,correspond:6,cosimo:0,could:6,cours:5,cover:5,creat:6,cross:[3,5],curl:3,current:[5,6],cyclic:5,dalcin:[0,2,5],dalcinl:2,data:[5,6],date:2,davidson:5,decomposit:5,defin:[5,6],definit:5,demo:6,dens:5,depend:[3,5,6],deprec:3,describ:[2,4],detail:6,develop:3,diagon:6,differ:[5,6],dimens:[5,6],direct:5,distribut:[0,3,6],distutil:[2,4],document:[2,4,6],doi:0,doing:6,done:6,dsic:[2,5],dure:5,each:6,easy_instal:[2,4],edit:3,effici:5,eigenpair:6,eigenproblem:[5,6],eigensolv:[5,6],eigenvalu:[0,2,4,5,6],eigenvector:[2,4,6],either:[3,5],element:6,els:6,emploi:3,encapsul:5,end:5,enhanc:5,environ:3,eps:6,eps_harmon:6,eps_nev:6,eps_smallest_magnitud:6,eps_target:6,eps_tol:6,eps_typ:6,eps_view:6,equal:6,equat:[2,4],error:6,eta:6,even:5,ex1:6,exampl:[2,3,4],execut:6,explicitli:5,exponenti:5,extract:[5,6],facil:6,fact:0,fail:6,featur:[2,4],few:5,file:3,fill:6,find:6,fine:5,finish:6,first:[5,6],five:5,flexibl:[0,5],follow:[3,5,6],form:5,fragment:6,from:[5,6],full:6,gain:6,gener:[5,6],get:[3,6],getconverg:6,getdimens:6,geteigenpair:6,getint:6,getiterationnumb:6,getownershiprang:6,gettoler:6,gettyp:6,getvec:6,gitlab:2,given:5,global:6,gmail:2,gradient:5,gram:6,gyroscop:5,hard:3,harder:5,harmon:[5,6],has:[5,6],have:[3,6],hep:6,here:6,hermitian:[5,6],hernandez:[0,5],high:5,highli:3,hood:5,how:[5,6],howev:6,http:[0,2,3],illustr:6,imag:6,imaginari:6,implement:[3,5],implicit:[5,6],implicitli:5,includ:[5,6],inde:6,index:3,indic:[3,5,6],inform:[3,6],informatico:5,init:6,initi:6,inlin:6,insert:6,instal:[2,4],instanc:[5,6],integ:6,integr:5,intel:3,intend:[5,6],interest:5,interior:[5,6],intern:[5,6],interpol:5,interpret:3,invers:5,invert:[5,6],iter:[5,6],its:[2,3,4,5,6],jacobi:5,jose:[2,5],jroman:2,just:3,kbx:5,keep:6,kept:6,kler:0,krylov:5,krylovschur:6,lambda:5,lanczo:5,larg:[2,4,5],largest:[5,6],last:6,lead:0,least:6,length:6,leopard:3,lib:3,librari:[2,3,4,6],like:3,line:[2,4,5],linear:[2,4,5],linux2:3,lisandro:2,local:3,locat:[3,5],lock:6,log:3,mac:3,macosx_deployment_target:3,magnitud:[5,6],mai:[3,6],main:6,make:6,mani:[5,6],manual:5,map:5,mat:6,match:3,math:5,mathemat:[0,5],matmult:6,matric:[2,4,5,6],matrix:[2,4,5,6],maximum:[5,6],maxit:6,mean:[5,6],mechan:5,memori:5,method:[5,6],methodolog:5,mfn:5,mfnsolv:5,minim:5,mirror:5,modifi:3,modul:6,more:6,most:5,mpd:6,mpi4pi:3,mpi:[3,6],mpich1:3,mpich:3,must:[2,4,6],nconv:6,ncv:6,necessari:[5,6],need:[3,6],nep:5,neutral:5,nev:6,newton:5,next:[3,6],nleig:5,non:[3,5,6],nonlinear:5,normal:6,note:6,now:6,number:[5,6],numer:5,numpi:[3,5,6],object:[5,6],obtain:5,off:6,often:6,onc:[5,6],one:6,ones:5,open:3,oper:[5,6],opt:[3,6],option:[3,6],order:[3,5,6],org:0,orthogon:[5,6],other:[5,6],out:6,output:6,overrid:3,overview:[2,4],packag:[2,3,4,5],pair:[2,4,5],parallel:[0,2,3,4,5],paramet:[5,6],part:[5,6],partial:5,particular:6,particularli:5,pass:6,path:3,paz:0,pep:5,perhap:3,petsc4pi:[2,3,4,6],petsc:[2,3,4,5,6],petsc_arch:3,petsc_dir:3,pip:[2,4],plane:5,pleas:0,point:6,politecnica:5,polynomi:5,port:[2,4],portion:6,posit:[5,6],possibl:[5,6],potenti:6,precis:6,prefix:[3,6],previou:3,print:6,prior:6,privat:3,privileg:3,problem:[0,2,4,5,6],problemtyp:6,process:6,processor:3,product:[5,6],program:6,project:[0,6],properli:3,provid:[3,5,6],pypi:3,python:[0,3,5,6],quotient:5,rang:6,ration:5,rayleigh:5,reader:6,readi:[3,6],real:[5,6],recommend:3,rectangular:[2,4,5],refer:6,refin:6,region:5,rel:6,releas:3,relev:6,reli:[2,4],remark:5,rend:6,repres:6,represent:[2,4,5],request:6,requir:[5,6],resourc:0,rest:5,restart:[5,6],result:6,retriev:6,revis:5,rii:5,roman:[0,2,5],romero:5,root:3,row:6,rqi:5,rstart:6,run:[3,5,6],scalabl:[0,5],scale:[2,4],schmidt:6,schur:5,script:6,sdk:3,sdkroot:3,section:[3,6],see:6,select:6,sep:2,set:[3,5,6],setenv:3,setfromopt:6,setoper:6,setproblemtyp:6,setsiz:6,setup:[3,6],sever:5,share:3,shell:3,shift:[5,6],should:[3,6],signific:0,similar:6,simpl:[2,4,5],sinc:6,singl:[5,6],singular:[2,4,5],sinvert:6,sistema:5,site:[2,3],size:5,slepc4pi:[2,3,4,5,6],slepc:[0,3,5,6],slepc_dir:3,slp:5,small:5,smallest:[5,6],snow:3,softw:5,softwar:[0,2,3,4],solut:[0,2,4,5,6],solv:[5,6],solver:[5,6],some:[3,5,6],sourc:[2,3,4],space:5,span:5,spars:[2,4,5],special:5,specifi:[5,6],spectral:[5,6],spectrum:[5,6],split:5,st_:6,st_type:6,standard:[3,5],step:3,stop:6,storag:5,store:6,straightforward:6,structur:5,subset:5,subspac:[5,6],sudo:3,support:5,sure:6,svd:5,svec:6,symmetr:[5,6],sys:6,system:[2,3,4,5],tar:3,tarbal:3,target:5,techniqu:5,test:6,than:6,thi:[2,3,4,5,6],thick:5,thing:6,those:[5,6],thu:[2,4],time:[5,6],toar:5,togeth:[2,4],tol:6,toler:6,toma:5,tool:5,toolkit:[0,5],tran:5,transact:0,transform:[5,6],tri:5,tridiagon:6,tune:5,tutori:[2,4],two:6,type:[3,5,6],under:5,univers:3,universitat:5,unless:3,unpack:3,upv:2,usag:[2,4],use:[3,5,6],used:[2,4,5,6],useful:6,user:[3,5,6],uses:5,using:[0,3,5,6],usr:3,usual:5,valencia:5,valu:[2,3,4,5,6],variabl:3,variant:[5,6],vector:[2,4,5,6],version:3,via:5,vicent:5,vidal:[0,5],view:6,wai:[5,6],want:[3,5,6],water:0,web:2,well:[5,6],wget:3,what:3,when:5,where:[3,5],whether:5,which:[5,6],wire:3,within:6,without:[3,5],work:3,would:6,x86_64:3,you:[3,6],your:3,zero:6,zxf:3},titles:["Citations","<no title>","SLEPc for Python","Installation","SLEPc for Python","Overview","Tutorial"],titleterms:{"abstract":[2,4],Using:3,build:3,citat:0,command:6,comment:6,compon:5,content:2,distutil:3,download:3,easy_instal:3,exampl:6,featur:5,instal:3,line:6,overview:5,pip:3,python:[2,4],requir:3,simpl:6,slepc:[2,4],sourc:6,tutori:6,usag:6}})slepc4py-3.19.2/docs/usrman/tutorial.html000066400000000000000000000552661454104675500203700ustar00rootroot00000000000000 Tutorial — SLEPc for Python 3.19.2 documentation

Tutorial¶

This tutorial is intended for basic use of slepc4py. For more advanced use, the reader is referred to SLEPc tutorials as well as to slepc4py reference documentation.

Commented source of a simple example¶

In this section, we include the source code of example demo/ex1.py available in the slepc4py distribution, with comments inserted inline.

The first thing to do is initialize the libraries. This is normally not required, as it is done automatically at import time. However, if you want to gain access to the facilities for accessing command-line options, the following lines must be executed by the main script prior to any petsc4py or slepc4py calls:

import sys, slepc4py
slepc4py.init(sys.argv)

Next, we have to import the relevant modules. Normally, both PETSc and SLEPc modules have to be imported in all slepc4py programs. It may be useful to import NumPy as well:

from petsc4py import PETSc
from slepc4py import SLEPc
import numpy

At this point, we can use any petsc4py and slepc4py operations. For instance, the following lines allow the user to specify an integer command-line argument n with a default value of 30 (see the next section for example usage of command-line options):

opts = PETSc.Options()
n = opts.getInt('n', 30)

It is necessary to build a matrix to define an eigenproblem (or two in the case of generalized eigenproblems). The following fragment of code creates the matrix object and then fills the non-zero elements one by one. The matrix of this particular example is tridiagonal, with value 2 in the diagonal, and -1 in off-diagonal positions. See petsc4py documentation for details about matrix objects:

A = PETSc.Mat().create()
A.setSizes([n, n])
A.setFromOptions()
A.setUp()

rstart, rend = A.getOwnershipRange()

# first row
if rstart == 0:
    A[0, :2] = [2, -1]
    rstart += 1
# last row
if rend == n:
    A[n-1, -2:] = [-1, 2]
    rend -= 1
# other rows
for i in range(rstart, rend):
    A[i, i-1:i+2] = [-1, 2, -1]

A.assemble()

The solver object is created in a similar way as other objects in petsc4py:

E = SLEPc.EPS(); E.create()

Once the object is created, the eigenvalue problem must be specified. At least one matrix must be provided. The problem type must be indicated as well, in this case it is HEP (Hermitian eigenvalue problem). Apart from these, other settings could be provided here (for instance, the tolerance for the computation). After all options have been set, the user should call the setFromOptions() operation, so that any options specified at run time in the command line are passed to the solver object:

E.setOperators(A)
E.setProblemType(SLEPc.EPS.ProblemType.HEP)
E.setFromOptions()

After that, the solve() method will run the selected eigensolver, keeping the solution stored internally:

E.solve()

Once the computation has finished, we are ready to print the results. First, some informative data can be retrieved from the solver object:

Print = PETSc.Sys.Print

Print()
Print("******************************")
Print("*** SLEPc Solution Results ***")
Print("******************************")
Print()

its = E.getIterationNumber()
Print("Number of iterations of the method: %d" % its)

eps_type = E.getType()
Print("Solution method: %s" % eps_type)

nev, ncv, mpd = E.getDimensions()
Print("Number of requested eigenvalues: %d" % nev)

tol, maxit = E.getTolerances()
Print("Stopping condition: tol=%.4g, maxit=%d" % (tol, maxit))

For retrieving the solution, it is necessary to find out how many eigenpairs have converged to the requested precision:

nconv = E.getConverged()
Print("Number of converged eigenpairs %d" % nconv)

For each of the nconv eigenpairs, we can retrieve the eigenvalue k, and the eigenvector, which is represented by means of two petsc4py vectors vr and vi (the real and imaginary part of the eigenvector, since for real matrices the eigenvalue and eigenvector may be complex). We also compute the corresponding relative errors in order to make sure that the computed solution is indeed correct:

if nconv > 0:
    # Create the results vectors
    vr, wr = A.getVecs()
    vi, wi = A.getVecs()
    #
    Print()
    Print("        k          ||Ax-kx||/||kx|| ")
    Print("----------------- ------------------")
    for i in range(nconv):
        k = E.getEigenpair(i, vr, vi)
        error = E.computeError(i)
        if k.imag != 0.0:
            Print(" %9f%+9f j %12g" % (k.real, k.imag, error))
        else:
            Print(" %12f      %12g" % (k.real, error))
    Print()

Example of command-line usage¶

Now we illustrate how to specify command-line options in order to extract the full potential of slepc4py.

A simple execution of the demo/ex1.py script will result in the following output:

$ python demo/ex1.py

******************************
*** SLEPc Solution Results ***
******************************

Number of iterations of the method: 4
Solution method: krylovschur
Number of requested eigenvalues: 1
Stopping condition: tol=1e-07, maxit=100
Number of converged eigenpairs 4

    k          ||Ax-kx||/||kx||
----------------- ------------------
     3.989739        5.76012e-09
     3.959060        1.41957e-08
     3.908279        6.74118e-08
     3.837916        8.34269e-08

For specifying different setting for the solver parameters, we can use SLEPc command-line options with the -eps prefix. For instance, to change the number of requested eigenvalues and the tolerance:

$ python demo/ex1.py -eps_nev 10 -eps_tol 1e-11

The method used by the solver object can also be set at run time:

$ python demo/ex1.py -eps_type subspace

All the above settings can also be changed within the source code by making use of the appropriate slepc4py method. Since options can be set from within the code and the command-line, it is often useful to view the particular settings that are currently being used:

$ python demo/ex1.py -eps_view

EPS Object: 1 MPI process
  type: krylovschur
    50% of basis vectors kept after restart
    using the locking variant
  problem type: symmetric eigenvalue problem
  selected portion of the spectrum: largest eigenvalues in magnitude
  number of eigenvalues (nev): 1
  number of column vectors (ncv): 16
  maximum dimension of projected problem (mpd): 16
  maximum number of iterations: 100
  tolerance: 1e-08
  convergence test: relative to the eigenvalue
BV Object: 1 MPI process
  type: svec
  17 columns of global length 30
  orthogonalization method: classical Gram-Schmidt
  orthogonalization refinement: if needed (eta: 0.7071)
  block orthogonalization method: GS
  doing matmult as a single matrix-matrix product
DS Object: 1 MPI process
  type: hep
  solving the problem with: Implicit QR method (_steqr)
ST Object: 1 MPI process
  type: shift
  shift: 0
  number of matrices: 1

Note that for computing eigenvalues of smallest magnitude we can use the option -eps_smallest_magnitude, but for interior eigenvalues things are not so straightforward. One possibility is to try with harmonic extraction, for instance to get the eigenvalues closest to 0.6:

$ python demo/ex1.py -eps_harmonic -eps_target 0.6

Depending on the problem, harmonic extraction may fail to converge. In those cases, it is necessary to specify a spectral transformation other than the default. In the command-line, this is indicated with the -st_ prefix. For example, shift-and-invert with a value of the shift equal to 0.6 would be:

$ python demo/ex1.py -st_type sinvert -eps_target 0.6
slepc4py-3.19.2/setup.cfg000066400000000000000000000003001454104675500151760ustar00rootroot00000000000000[config] slepc_dir = $SLEPC_DIR petsc_dir = $PETSC_DIR petsc_arch = $PETSC_ARCH [build] debug = 0 [sdist] force_manifest = 1 [nosetests] where = test [egg_info] tag_build = tag_date = 0 slepc4py-3.19.2/setup.py000077500000000000000000000176611454104675500151140ustar00rootroot00000000000000#!/usr/bin/env python # Author: Lisandro Dalcin # Contact: dalcinl@gmail.com import re import os import sys try: import setuptools except ImportError: setuptools = None topdir = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(0, os.path.join(topdir, 'conf')) pyver = sys.version_info[:2] if pyver < (2, 6) or (3, 0) <= pyver < (3, 2): raise RuntimeError("Python version 2.6, 2.7 or >= 3.2 required") if pyver == (2, 6) or pyver == (3, 2): sys.stderr.write( "WARNING: Python %d.%d is not supported.\n" % pyver) PNAME = 'SLEPc' EMAIL = 'slepc-maint@upv.es' PLIST = [PNAME, 'PETSc'] # -------------------------------------------------------------------- # Metadata # -------------------------------------------------------------------- def F(string): return string.format( Name=PNAME, name=PNAME.lower(), pyname=PNAME.lower()+'4py', ) def get_name(): return F('{pyname}') def get_version(): try: return get_version.result except AttributeError: pass pkg_init_py = os.path.join(F('{pyname}'), '__init__.py') with open(os.path.join(topdir, 'src', pkg_init_py)) as f: m = re.search(r"__version__\s*=\s*'(.*)'", f.read()) version = m.groups()[0] get_version.result = version return version def description(): return F('{Name} for Python') def long_description(): with open(os.path.join(topdir, 'DESCRIPTION.rst')) as f: return f.read() url = F('https://gitlab.com/{name}/{name}') pypiroot = F('https://pypi.io/packages/source') pypislug = F('{pyname}')[0] + F('/{pyname}') tarball = F('{pyname}-%s.tar.gz' % get_version()) download = '/'.join([pypiroot, pypislug, tarball]) classifiers = """ License :: OSI Approved :: BSD License Operating System :: POSIX Intended Audience :: Developers Intended Audience :: Science/Research Programming Language :: C Programming Language :: C++ Programming Language :: Cython Programming Language :: Python Programming Language :: Python :: 2 Programming Language :: Python :: 3 Programming Language :: Python :: Implementation :: CPython Topic :: Scientific/Engineering Topic :: Software Development :: Libraries :: Python Modules Development Status :: 5 - Production/Stable """.strip().split('\n') keywords = """ scientific computing parallel computing MPI """.strip().split('\n') platforms = """ POSIX Linux macOS FreeBSD """.strip().split('\n') metadata = { 'name' : get_name(), 'version' : get_version(), 'description' : description(), 'long_description' : long_description(), 'url' : url, 'download_url' : download, 'classifiers' : classifiers, 'keywords' : keywords + PLIST, 'license' : 'BSD-2-Clause', 'platforms' : platforms, 'author' : 'Lisandro Dalcin', 'author_email' : 'dalcinl@gmail.com', 'maintainer' : F('{Name} Team'), 'maintainer_email' : EMAIL, } metadata.update({ 'requires': ['numpy'], }) metadata_extra = { 'long_description_content_type': 'text/x-rst', } # -------------------------------------------------------------------- # Extension modules # -------------------------------------------------------------------- def sources(): src = dict( source=F('{pyname}/{Name}.pyx'), depends=[ F('{pyname}/*.pyx'), F('{pyname}/*.pxd'), F('{pyname}/{Name}/*.pyx'), F('{pyname}/{Name}/*.pxd'), F('{pyname}/{Name}/*.pxi'), ], workdir='src', ) return [src] def extensions(): from os import walk from glob import glob from os.path import join # depends = [] glob_join = lambda *args: glob(join(*args)) for pth, dirs, files in walk('src'): depends += glob_join(pth, '*.h') depends += glob_join(pth, '*.c') for pkg in map(str.lower, reversed(PLIST)): if (pkg.upper()+'_DIR') in os.environ: pd = os.environ[pkg.upper()+'_DIR'] pa = os.environ.get('PETSC_ARCH', '') depends += glob_join(pd, 'include', '*.h') depends += glob_join(pd, 'include', pkg, 'private', '*.h') depends += glob_join(pd, pa, 'include', '%sconf.h' % pkg) # include_dirs = [] numpy_include = os.environ.get('NUMPY_INCLUDE') if numpy_include is not None: numpy_includes = [numpy_include] else: try: import numpy numpy_includes = [numpy.get_include()] except ImportError: numpy_includes = [] include_dirs.extend(numpy_includes) if F('{pyname}') != 'petsc4py': try: import petsc4py petsc4py_includes = [petsc4py.get_include()] except ImportError: petsc4py_includes = [] include_dirs.extend(petsc4py_includes) # ext = dict( name=F('{pyname}.lib.{Name}'), sources=[F('src/{pyname}/{Name}.c')], depends=depends, include_dirs=[ 'src', F('src/{pyname}/include'), ] + include_dirs, define_macros=[ ('MPICH_SKIP_MPICXX', 1), ('OMPI_SKIP_MPICXX', 1), ('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION'), ], ) return [ext] # -------------------------------------------------------------------- # Setup # -------------------------------------------------------------------- def get_release(): suffix = os.path.join('src', 'binding', F('{pyname}')) if not topdir.endswith(os.path.join(os.path.sep, suffix)): return True release = 1 rootdir = os.path.abspath(os.path.join(topdir, *[os.path.pardir]*3)) version_h = os.path.join(rootdir, 'include', F('{name}version.h')) release_macro = '%s_VERSION_RELEASE' % F('{name}').upper() version_re = re.compile(r"#define\s+%s\s+([-]*\d+)" % release_macro) if os.path.exists(version_h) and os.path.isfile(version_h): with open(version_h, 'r') as f: release = int(version_re.search(f.read()).groups()[0]) return bool(release) def requires(pkgname, major, minor, release=True): minor = minor + int(not release) devel = '' if release else '.dev0' vmin = "%s.%s%s" % (major, minor, devel) vmax = "%s.%s" % (major, minor + 1) return "%s>=%s,<%s" % (pkgname, vmin, vmax) def run_setup(): setup_args = metadata.copy() vstr = setup_args['version'].split('.')[:2] x, y = tuple(map(int, vstr)) release = get_release() if not release: setup_args['version'] = "%d.%d.0.dev0" %(x, y+1) if setuptools: setup_args['zip_safe'] = False setup_args['install_requires'] = ['numpy'] for pkg in map(str.lower, PLIST): PKG_DIR = os.environ.get(pkg.upper() + '_DIR') if not (PKG_DIR and os.path.isdir(PKG_DIR)): package = requires(pkg, x, y, release) setup_args['install_requires'] += [package] if F('{pyname}') != 'petsc4py': package = requires('petsc4py', x, y, release) setup_args['install_requires'] += [package] setup_args.update(metadata_extra) # conf = __import__(F('conf{name}')) conf.setup( packages=[ F('{pyname}'), F('{pyname}.lib'), ], package_dir={'' : 'src'}, package_data={ F('{pyname}'): [ F('{Name}.pxd'), F('{Name}*.h'), F('include/{pyname}/*.h'), F('include/{pyname}/*.i'), ], F('{pyname}.lib'): [ F('{name}.cfg'), ], }, cython_sources=[ src for src in sources() ], ext_modules=[ conf.Extension(**ext) for ext in extensions() ], **setup_args ) # -------------------------------------------------------------------- def main(): run_setup() if __name__ == '__main__': main() # -------------------------------------------------------------------- slepc4py-3.19.2/src/000077500000000000000000000000001454104675500141535ustar00rootroot00000000000000slepc4py-3.19.2/src/lib-slepc/000077500000000000000000000000001454104675500160255ustar00rootroot00000000000000slepc4py-3.19.2/src/lib-slepc/compat.h000066400000000000000000000002211454104675500174540ustar00rootroot00000000000000#ifndef SLEPC4PY_COMPAT_H #define SLEPC4PY_COMPAT_H #if !defined(PETSC_USE_COMPLEX) #endif /*PETSC_USE_COMPLEX*/ #endif /*SLEPC4PY_COMPAT_H*/ slepc4py-3.19.2/src/lib-slepc/custom.h000066400000000000000000000013531454104675500175120ustar00rootroot00000000000000#ifndef SLEPC4PY_CUSTOM_H #define SLEPC4PY_CUSTOM_H #ifndef PETSC_ERR_PYTHON #define PETSC_ERR_PYTHON ((PetscErrorCode)(-1)) #endif #undef __FUNCT__ #define __FUNCT__ "SlepcInitializePackageAll" static PetscErrorCode SlepcInitializePackageAll(void) { PetscFunctionBegin; PetscCall(EPSInitializePackage()); PetscCall(SVDInitializePackage()); PetscCall(PEPInitializePackage()); PetscCall(NEPInitializePackage()); PetscCall(LMEInitializePackage()); PetscCall(MFNInitializePackage()); PetscCall(STInitializePackage()); PetscCall(BVInitializePackage()); PetscCall(DSInitializePackage()); PetscCall(FNInitializePackage()); PetscCall(RGInitializePackage()); PetscFunctionReturn(PETSC_SUCCESS); } #endif/*SLEPC4PY_CUSTOM_H*/ slepc4py-3.19.2/src/slepc4py.egg-info/000077500000000000000000000000001454104675500174105ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py.egg-info/PKG-INFO000066400000000000000000000047311454104675500205120ustar00rootroot00000000000000Metadata-Version: 2.1 Name: slepc4py Version: 3.19.2 Summary: SLEPc for Python Home-page: https://gitlab.com/slepc/slepc Author: Lisandro Dalcin Author-email: dalcinl@gmail.com Maintainer: SLEPc Team Maintainer-email: slepc-maint@upv.es License: BSD-2-Clause Download-URL: https://pypi.io/packages/source/s/slepc4py/slepc4py-3.19.2.tar.gz Description: SLEPc for Python ================ Python bindings for SLEPc. Install ------- If you have a working MPI implementation and the ``mpicc`` compiler wrapper is on your search path, it highly recommended to install ``mpi4py`` first:: $ pip install mpi4py Ensure you have NumPy installed:: $ pip install numpy and finally:: $ pip install petsc petsc4py slepc slepc4py Citations --------- If SLEPc for Python been significant to a project that leads to an academic publication, please acknowledge that fact by citing the project. * L. Dalcin, P. Kler, R. Paz, and A. Cosimo, *Parallel Distributed Computing using Python*, Advances in Water Resources, 34(9):1124-1139, 2011. https://doi.org/10.1016/j.advwatres.2011.04.013 * V. Hernandez, J.E. Roman and V. Vidal. *SLEPc: A Scalable and Flexible Toolkit for the Solution of Eigenvalue Problems*, ACM Transactions on Mathematical Software, 31(3):351-362, 2005. https://doi.org/10.1145/1089014.1089019 Keywords: scientific computing,parallel computing,MPI,SLEPc,PETSc Platform: POSIX Platform: Linux Platform: macOS Platform: FreeBSD Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: POSIX Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: Programming Language :: C Classifier: Programming Language :: C++ Classifier: Programming Language :: Cython Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Development Status :: 5 - Production/Stable Requires: numpy Description-Content-Type: text/x-rst slepc4py-3.19.2/src/slepc4py.egg-info/SOURCES.txt000066400000000000000000000255601454104675500213040ustar00rootroot00000000000000CHANGES.rst DESCRIPTION.rst LICENSE.rst MANIFEST.in README.rst setup.cfg setup.py conf/__init__.py conf/confpetsc.py conf/confslepc.py conf/cythonize.py conf/cythonize.sh conf/epydoc.cfg conf/epydocify.py demo/ex1.py demo/ex10.py demo/ex11.py demo/ex12.py demo/ex13.py demo/ex2.py demo/ex3.py demo/ex4.py demo/ex5.py demo/ex6.py demo/ex7.py demo/ex8.py demo/ex9.py demo/makefile docs/CHANGES.html docs/LICENSE.html docs/index.html docs/index.rst docs/slepc4py.1 docs/slepc4py.info docs/slepc4py.pdf docs/apiref/api-objects.txt docs/apiref/class-tree.html docs/apiref/class_hierarchy_for__p_mem.png docs/apiref/class_hierarchy_for_balance.png docs/apiref/class_hierarchy_for_basis.png docs/apiref/class_hierarchy_for_blocktype.png docs/apiref/class_hierarchy_for_bv.png docs/apiref/class_hierarchy_for_bvsvdmetho.png docs/apiref/class_hierarchy_for_cissextrac.png docs/apiref/class_hierarchy_for_cissextrac_2.png docs/apiref/class_hierarchy_for_cissextrac_3.png docs/apiref/class_hierarchy_for_cissquadru.png docs/apiref/class_hierarchy_for_combinetyp.png docs/apiref/class_hierarchy_for_conv.png docs/apiref/class_hierarchy_for_conv_2.png docs/apiref/class_hierarchy_for_conv_3.png docs/apiref/class_hierarchy_for_conv_4.png docs/apiref/class_hierarchy_for_convergedr.png docs/apiref/class_hierarchy_for_convergedr_2.png docs/apiref/class_hierarchy_for_convergedr_3.png docs/apiref/class_hierarchy_for_convergedr_4.png docs/apiref/class_hierarchy_for_convergedr_5.png docs/apiref/class_hierarchy_for_ds.png docs/apiref/class_hierarchy_for_eps.png docs/apiref/class_hierarchy_for_errortype.png docs/apiref/class_hierarchy_for_errortype_2.png docs/apiref/class_hierarchy_for_errortype_3.png docs/apiref/class_hierarchy_for_errortype_4.png docs/apiref/class_hierarchy_for_extract.png docs/apiref/class_hierarchy_for_extraction.png docs/apiref/class_hierarchy_for_fn.png docs/apiref/class_hierarchy_for_jdprojecti.png docs/apiref/class_hierarchy_for_lanczosreo.png docs/apiref/class_hierarchy_for_matmode.png docs/apiref/class_hierarchy_for_matmulttyp.png docs/apiref/class_hierarchy_for_mattype.png docs/apiref/class_hierarchy_for_mfn.png docs/apiref/class_hierarchy_for_nep.png docs/apiref/class_hierarchy_for_orthogtype.png docs/apiref/class_hierarchy_for_parallelty.png docs/apiref/class_hierarchy_for_parallelty_2.png docs/apiref/class_hierarchy_for_pep.png docs/apiref/class_hierarchy_for_powershift.png docs/apiref/class_hierarchy_for_problemtyp.png docs/apiref/class_hierarchy_for_problemtyp_2.png docs/apiref/class_hierarchy_for_problemtyp_3.png docs/apiref/class_hierarchy_for_problemtyp_4.png docs/apiref/class_hierarchy_for_quadrule.png docs/apiref/class_hierarchy_for_refine.png docs/apiref/class_hierarchy_for_refine_2.png docs/apiref/class_hierarchy_for_refinesche.png docs/apiref/class_hierarchy_for_refinesche_2.png docs/apiref/class_hierarchy_for_refinetype.png docs/apiref/class_hierarchy_for_rg.png docs/apiref/class_hierarchy_for_scale.png docs/apiref/class_hierarchy_for_st.png docs/apiref/class_hierarchy_for_statetype.png docs/apiref/class_hierarchy_for_stop.png docs/apiref/class_hierarchy_for_stop_2.png docs/apiref/class_hierarchy_for_stop_3.png docs/apiref/class_hierarchy_for_stop_4.png docs/apiref/class_hierarchy_for_svd.png docs/apiref/class_hierarchy_for_sys.png docs/apiref/class_hierarchy_for_trlanczosg.png docs/apiref/class_hierarchy_for_type.png docs/apiref/class_hierarchy_for_type_10.png docs/apiref/class_hierarchy_for_type_2.png docs/apiref/class_hierarchy_for_type_3.png docs/apiref/class_hierarchy_for_type_4.png docs/apiref/class_hierarchy_for_type_5.png docs/apiref/class_hierarchy_for_type_6.png docs/apiref/class_hierarchy_for_type_7.png docs/apiref/class_hierarchy_for_type_8.png docs/apiref/class_hierarchy_for_type_9.png docs/apiref/class_hierarchy_for_which.png docs/apiref/class_hierarchy_for_which_2.png docs/apiref/class_hierarchy_for_which_3.png docs/apiref/class_hierarchy_for_which_4.png docs/apiref/crarr.png docs/apiref/epydoc.css docs/apiref/epydoc.js docs/apiref/frames.html docs/apiref/help.html docs/apiref/identifier-index.html docs/apiref/index.html docs/apiref/module-tree.html docs/apiref/redirect.html docs/apiref/slepc4py-module.html docs/apiref/slepc4py.SLEPc-module.html docs/apiref/slepc4py.SLEPc.BV-class.html docs/apiref/slepc4py.SLEPc.BV.BlockType-class.html docs/apiref/slepc4py.SLEPc.BV.MatMultType-class.html docs/apiref/slepc4py.SLEPc.BV.OrthogType-class.html docs/apiref/slepc4py.SLEPc.BV.RefineType-class.html docs/apiref/slepc4py.SLEPc.BV.Type-class.html docs/apiref/slepc4py.SLEPc.BVSVDMethod-class.html docs/apiref/slepc4py.SLEPc.DS-class.html docs/apiref/slepc4py.SLEPc.DS.MatType-class.html docs/apiref/slepc4py.SLEPc.DS.ParallelType-class.html docs/apiref/slepc4py.SLEPc.DS.StateType-class.html docs/apiref/slepc4py.SLEPc.DS.Type-class.html docs/apiref/slepc4py.SLEPc.EPS-class.html docs/apiref/slepc4py.SLEPc.EPS.Balance-class.html docs/apiref/slepc4py.SLEPc.EPS.CISSExtraction-class.html docs/apiref/slepc4py.SLEPc.EPS.CISSQuadRule-class.html docs/apiref/slepc4py.SLEPc.EPS.Conv-class.html docs/apiref/slepc4py.SLEPc.EPS.ConvergedReason-class.html docs/apiref/slepc4py.SLEPc.EPS.ErrorType-class.html docs/apiref/slepc4py.SLEPc.EPS.Extraction-class.html docs/apiref/slepc4py.SLEPc.EPS.LanczosReorthogType-class.html docs/apiref/slepc4py.SLEPc.EPS.PowerShiftType-class.html docs/apiref/slepc4py.SLEPc.EPS.ProblemType-class.html docs/apiref/slepc4py.SLEPc.EPS.Stop-class.html docs/apiref/slepc4py.SLEPc.EPS.Type-class.html docs/apiref/slepc4py.SLEPc.EPS.Which-class.html docs/apiref/slepc4py.SLEPc.FN-class.html docs/apiref/slepc4py.SLEPc.FN.CombineType-class.html docs/apiref/slepc4py.SLEPc.FN.ParallelType-class.html docs/apiref/slepc4py.SLEPc.FN.Type-class.html docs/apiref/slepc4py.SLEPc.MFN-class.html docs/apiref/slepc4py.SLEPc.MFN.ConvergedReason-class.html docs/apiref/slepc4py.SLEPc.MFN.Type-class.html docs/apiref/slepc4py.SLEPc.NEP-class.html docs/apiref/slepc4py.SLEPc.NEP.CISSExtraction-class.html docs/apiref/slepc4py.SLEPc.NEP.Conv-class.html docs/apiref/slepc4py.SLEPc.NEP.ConvergedReason-class.html docs/apiref/slepc4py.SLEPc.NEP.ErrorType-class.html docs/apiref/slepc4py.SLEPc.NEP.ProblemType-class.html docs/apiref/slepc4py.SLEPc.NEP.Refine-class.html docs/apiref/slepc4py.SLEPc.NEP.RefineScheme-class.html docs/apiref/slepc4py.SLEPc.NEP.Stop-class.html docs/apiref/slepc4py.SLEPc.NEP.Type-class.html docs/apiref/slepc4py.SLEPc.NEP.Which-class.html docs/apiref/slepc4py.SLEPc.PEP-class.html docs/apiref/slepc4py.SLEPc.PEP.Basis-class.html docs/apiref/slepc4py.SLEPc.PEP.CISSExtraction-class.html docs/apiref/slepc4py.SLEPc.PEP.Conv-class.html docs/apiref/slepc4py.SLEPc.PEP.ConvergedReason-class.html docs/apiref/slepc4py.SLEPc.PEP.ErrorType-class.html docs/apiref/slepc4py.SLEPc.PEP.Extract-class.html docs/apiref/slepc4py.SLEPc.PEP.JDProjection-class.html docs/apiref/slepc4py.SLEPc.PEP.ProblemType-class.html docs/apiref/slepc4py.SLEPc.PEP.Refine-class.html docs/apiref/slepc4py.SLEPc.PEP.RefineScheme-class.html docs/apiref/slepc4py.SLEPc.PEP.Scale-class.html docs/apiref/slepc4py.SLEPc.PEP.Stop-class.html docs/apiref/slepc4py.SLEPc.PEP.Type-class.html docs/apiref/slepc4py.SLEPc.PEP.Which-class.html docs/apiref/slepc4py.SLEPc.RG-class.html docs/apiref/slepc4py.SLEPc.RG.QuadRule-class.html docs/apiref/slepc4py.SLEPc.RG.Type-class.html docs/apiref/slepc4py.SLEPc.ST-class.html docs/apiref/slepc4py.SLEPc.ST.MatMode-class.html docs/apiref/slepc4py.SLEPc.ST.Type-class.html docs/apiref/slepc4py.SLEPc.SVD-class.html docs/apiref/slepc4py.SLEPc.SVD.Conv-class.html docs/apiref/slepc4py.SLEPc.SVD.ConvergedReason-class.html docs/apiref/slepc4py.SLEPc.SVD.ErrorType-class.html docs/apiref/slepc4py.SLEPc.SVD.ProblemType-class.html docs/apiref/slepc4py.SLEPc.SVD.Stop-class.html docs/apiref/slepc4py.SLEPc.SVD.TRLanczosGBidiag-class.html docs/apiref/slepc4py.SLEPc.SVD.Type-class.html docs/apiref/slepc4py.SLEPc.SVD.Which-class.html docs/apiref/slepc4py.SLEPc.Sys-class.html docs/apiref/slepc4py.SLEPc._p_mem-class.html docs/apiref/slepc4py.lib-module.html docs/apiref/toc-everything.html docs/apiref/toc-slepc4py-module.html docs/apiref/toc-slepc4py.SLEPc-module.html docs/apiref/toc-slepc4py.lib-module.html docs/apiref/toc.html docs/source/Makefile docs/source/abstract.txt docs/source/citing.rst docs/source/conf.py docs/source/contents.rst docs/source/index.rst docs/source/install.rst docs/source/links.txt docs/source/make.bat docs/source/manual.rst docs/source/overview.rst docs/source/toctree.txt docs/source/tutorial.rst docs/usrman/citing.html docs/usrman/contents.html docs/usrman/genindex.html docs/usrman/index.html docs/usrman/install.html docs/usrman/manual.html docs/usrman/objects.inv docs/usrman/overview.html docs/usrman/search.html docs/usrman/searchindex.js docs/usrman/tutorial.html docs/usrman/_sources/citing.rst.txt docs/usrman/_sources/contents.rst.txt docs/usrman/_sources/index.rst.txt docs/usrman/_sources/install.rst.txt docs/usrman/_sources/manual.rst.txt docs/usrman/_sources/overview.rst.txt docs/usrman/_sources/tutorial.rst.txt docs/usrman/_static/ajax-loader.gif docs/usrman/_static/basic.css docs/usrman/_static/classic.css docs/usrman/_static/comment-bright.png docs/usrman/_static/comment-close.png docs/usrman/_static/comment.png docs/usrman/_static/default.css docs/usrman/_static/doctools.js docs/usrman/_static/down-pressed.png docs/usrman/_static/down.png docs/usrman/_static/file.png docs/usrman/_static/jquery.js docs/usrman/_static/minus.png docs/usrman/_static/plus.png docs/usrman/_static/pygments.css docs/usrman/_static/searchtools.js docs/usrman/_static/sidebar.js docs/usrman/_static/underscore.js docs/usrman/_static/up-pressed.png docs/usrman/_static/up.png docs/usrman/_static/websupport.js src/lib-slepc/compat.h src/lib-slepc/custom.h src/slepc4py/SLEPc.pxd src/slepc4py/SLEPc.py src/slepc4py/SLEPc.pyx src/slepc4py/__init__.pxd src/slepc4py/__init__.py src/slepc4py/__main__.py src/slepc4py.egg-info/PKG-INFO src/slepc4py.egg-info/SOURCES.txt src/slepc4py.egg-info/dependency_links.txt src/slepc4py.egg-info/not-zip-safe src/slepc4py.egg-info/requires.txt src/slepc4py.egg-info/top_level.txt src/slepc4py/SLEPc/BV.pyx src/slepc4py/SLEPc/CAPI.pyx src/slepc4py/SLEPc/DS.pyx src/slepc4py/SLEPc/EPS.pyx src/slepc4py/SLEPc/FN.pyx src/slepc4py/SLEPc/MFN.pyx src/slepc4py/SLEPc/NEP.pyx src/slepc4py/SLEPc/PEP.pyx src/slepc4py/SLEPc/RG.pyx src/slepc4py/SLEPc/SLEPc.pyx src/slepc4py/SLEPc/ST.pyx src/slepc4py/SLEPc/SVD.pyx src/slepc4py/SLEPc/Sys.pyx src/slepc4py/SLEPc/allocate.pxi src/slepc4py/SLEPc/arraynpy.pxi src/slepc4py/SLEPc/slepcbv.pxi src/slepc4py/SLEPc/slepcds.pxi src/slepc4py/SLEPc/slepceps.pxi src/slepc4py/SLEPc/slepcfn.pxi src/slepc4py/SLEPc/slepcmfn.pxi src/slepc4py/SLEPc/slepcmpi.pxi src/slepc4py/SLEPc/slepcnep.pxi src/slepc4py/SLEPc/slepcpep.pxi src/slepc4py/SLEPc/slepcrg.pxi src/slepc4py/SLEPc/slepcst.pxi src/slepc4py/SLEPc/slepcsvd.pxi src/slepc4py/SLEPc/slepcsys.pxi src/slepc4py/include/slepc4py/slepc4py.h src/slepc4py/include/slepc4py/slepc4py.i src/slepc4py/lib/__init__.py src/slepc4py/lib/slepc.cfg test/runtests.py test/test_object.pyslepc4py-3.19.2/src/slepc4py.egg-info/dependency_links.txt000066400000000000000000000000011454104675500234560ustar00rootroot00000000000000 slepc4py-3.19.2/src/slepc4py.egg-info/not-zip-safe000066400000000000000000000000011454104675500216360ustar00rootroot00000000000000 slepc4py-3.19.2/src/slepc4py.egg-info/requires.txt000066400000000000000000000000331454104675500220040ustar00rootroot00000000000000numpy petsc4py<3.20,>=3.19 slepc4py-3.19.2/src/slepc4py.egg-info/top_level.txt000066400000000000000000000000111454104675500221320ustar00rootroot00000000000000slepc4py slepc4py-3.19.2/src/slepc4py/000077500000000000000000000000001454104675500157165ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py/SLEPc.pxd000066400000000000000000000041331454104675500173420ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com # ----------------------------------------------------------------------------- cdef extern from "": struct _p_ST ctypedef _p_ST* SlepcST "ST" struct _p_BV ctypedef _p_BV* SlepcBV "BV" struct _p_DS ctypedef _p_DS* SlepcDS "DS" struct _p_FN ctypedef _p_FN* SlepcFN "FN" struct _p_RG ctypedef _p_RG* SlepcRG "RG" struct _p_EPS ctypedef _p_EPS* SlepcEPS "EPS" struct _p_SVD ctypedef _p_SVD* SlepcSVD "SVD" struct _p_PEP ctypedef _p_PEP* SlepcPEP "PEP" struct _p_NEP ctypedef _p_NEP* SlepcNEP "NEP" struct _p_MFN ctypedef _p_MFN* SlepcMFN "MFN" # ----------------------------------------------------------------------------- from petsc4py.PETSc cimport Object ctypedef public api class ST(Object) [ type PySlepcST_Type, object PySlepcSTObject, ]: cdef SlepcST st ctypedef public api class BV(Object) [ type PySlepcBV_Type, object PySlepcBVObject, ]: cdef SlepcBV bv ctypedef public api class DS(Object) [ type PySlepcDS_Type, object PySlepcDSObject, ]: cdef SlepcDS ds ctypedef public api class FN(Object) [ type PySlepcFN_Type, object PySlepcFNObject, ]: cdef SlepcFN fn ctypedef public api class RG(Object) [ type PySlepcRG_Type, object PySlepcRGObject, ]: cdef SlepcRG rg ctypedef public api class EPS(Object) [ type PySlepcEPS_Type, object PySlepcEPSObject, ]: cdef SlepcEPS eps ctypedef public api class SVD(Object) [ type PySlepcSVD_Type, object PySlepcSVDObject, ]: cdef SlepcSVD svd ctypedef public api class PEP(Object) [ type PySlepcPEP_Type, object PySlepcPEPObject, ]: cdef SlepcPEP pep ctypedef public api class NEP(Object) [ type PySlepcNEP_Type, object PySlepcNEPObject, ]: cdef SlepcNEP nep ctypedef public api class MFN(Object) [ type PySlepcMFN_Type, object PySlepcMFNObject, ]: cdef SlepcMFN mfn # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc.py000066400000000000000000000004051454104675500171750ustar00rootroot00000000000000ARCH = None from slepc4py.lib import ImportSLEPc # noqa: E402 from slepc4py.lib import ImportPETSc # noqa: E402 SLEPc = ImportSLEPc(ARCH) PETSc = ImportPETSc(ARCH) PETSc._initialize() SLEPc._initialize() del SLEPc, PETSc del ImportSLEPc, ImportPETSc del ARCH slepc4py-3.19.2/src/slepc4py/SLEPc.pyx000066400000000000000000000007241454104675500173710ustar00rootroot00000000000000#cython: language_level=3str #cython: embedsignature=True #cython: annotation_typing=False #cython: cdivision=True #cython: auto_pickle=False #cython: always_allow_keywords=True #cython: allow_none_for_extension_args=False #cython: autotestdict=False #cython: warn.multiple_declarators=False #cython: optimize.use_switch=False #cython: binding=False #from __future__ import annotations from __future__ import absolute_import cimport cython include "SLEPc/SLEPc.pyx" slepc4py-3.19.2/src/slepc4py/SLEPc/000077500000000000000000000000001454104675500166245ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py/SLEPc/BV.pyx000066400000000000000000001217601454104675500177040ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class BVType(object): """ BV type """ MAT = S_(BVMAT) SVEC = S_(BVSVEC) VECS = S_(BVVECS) CONTIGUOUS = S_(BVCONTIGUOUS) TENSOR = S_(BVTENSOR) class BVOrthogType(object): """ BV orthogonalization types - `CGS`: Classical Gram-Schmidt. - `MGS`: Modified Gram-Schmidt. """ CGS = BV_ORTHOG_CGS MGS = BV_ORTHOG_MGS class BVOrthogRefineType(object): """ BV orthogonalization refinement types - `IFNEEDED`: Reorthogonalize if a criterion is satisfied. - `NEVER`: Never reorthogonalize. - `ALWAYS`: Always reorthogonalize. """ IFNEEDED = BV_ORTHOG_REFINE_IFNEEDED NEVER = BV_ORTHOG_REFINE_NEVER ALWAYS = BV_ORTHOG_REFINE_ALWAYS class BVOrthogBlockType(object): """ BV block-orthogonalization types - `GS`: Gram-Schmidt. - `CHOL`: Cholesky. - `TSQR`: Tall-skinny QR. - `TSQRCHOL`: Tall-skinny QR with Cholesky. - `SVQB`: SVQB. """ GS = BV_ORTHOG_BLOCK_GS CHOL = BV_ORTHOG_BLOCK_CHOL TSQR = BV_ORTHOG_BLOCK_TSQR TSQRCHOL = BV_ORTHOG_BLOCK_TSQRCHOL SVQB = BV_ORTHOG_BLOCK_SVQB class BVMatMultType(object): """ BV mat-mult types - `VECS`: Perform a matrix-vector multiply per each column. - `MAT`: Carry out a Mat-Mat product with a dense matrix. """ VECS = BV_MATMULT_VECS MAT = BV_MATMULT_MAT class BVSVDMethod(object): """ BV methods for computing the SVD - `REFINE`: Based on the SVD of the cross product matrix S'*S, with refinement. - `QR`: Based on the SVD of the triangular factor of qr(S). - `QR_CAA`: Variant of QR intended for use in cammunication-avoiding Arnoldi. """ REFINE = BV_SVD_METHOD_REFINE QR = BV_SVD_METHOD_QR QR_CAA = BV_SVD_METHOD_QR_CAA # ----------------------------------------------------------------------------- cdef class BV(Object): """ BV """ Type = BVType OrthogType = BVOrthogType OrthogRefineType = BVOrthogRefineType RefineType = BVOrthogRefineType OrthogBlockType = BVOrthogBlockType BlockType = BVOrthogBlockType MatMultType = BVMatMultType def __cinit__(self): self.obj = &self.bv self.bv = NULL def view(self, Viewer viewer=None): """ Prints the BV data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( BVView(self.bv, vwr) ) def destroy(self): """ Destroys the BV object. """ CHKERR( BVDestroy(&self.bv) ) self.bv = NULL return self def create(self, comm=None): """ Creates the BV object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcBV newbv = NULL CHKERR( BVCreate(ccomm, &newbv) ) CHKERR( SlepcCLEAR(self.obj) ); self.bv = newbv return self def createFromMat(self, Mat A): """ Creates a basis vectors object from a dense Mat object. Parameters ---------- A: Mat A dense tall-skinny matrix. """ cdef SlepcBV newbv = NULL CHKERR( BVCreateFromMat(A.mat, &newbv) ) CHKERR( SlepcCLEAR(self.obj) ); self.bv = newbv return self def createMat(self): """ Creates a new Mat object of dense type and copies the contents of the BV object. Returns ------- mat: the new matrix. """ cdef Mat mat = Mat() CHKERR( BVCreateMat(self.bv, &mat.mat) ) return mat def duplicate(self): """ Duplicate the BV object with the same type and dimensions. """ cdef BV bv = type(self)() CHKERR( BVDuplicate(self.bv, &bv.bv) ) return bv def duplicateResize(self, m): """ Creates a new BV object of the same type and dimensions as an existing one, but with possibly different number of columns. Parameters ---------- m: int The number of columns. """ cdef BV bv = type(self)() cdef PetscInt ival = asInt(m) CHKERR( BVDuplicateResize(self.bv, ival, &bv.bv) ) return bv def copy(self, BV result=None): """ Copies a basis vector object into another one. Parameters ---------- result: `BV`, optional The copy. """ if result is None: result = type(self)() if result.bv == NULL: CHKERR( BVDuplicate(self.bv, &result.bv) ) CHKERR( BVCopy(self.bv, result.bv) ) return result def setType(self, bv_type): """ Selects the type for the BV object. Parameters ---------- bv_type: `BV.Type` enumerate The inner product type to be used. """ cdef SlepcBVType cval = NULL bv_type = str2bytes(bv_type, &cval) CHKERR( BVSetType(self.bv, cval) ) def getType(self): """ Gets the BV type of this object. Returns ------- type: `BV.Type` enumerate The inner product type currently being used. """ cdef SlepcBVType bv_type = NULL CHKERR( BVGetType(self.bv, &bv_type) ) return bytes2str(bv_type) def setSizes(self, sizes, m): """ Sets the local and global sizes, and the number of columns. Parameters ---------- sizes: int or two-tuple of int The global size ``N`` or a two-tuple ``(n, N)`` with the local and global sizes. m: int The number of columns. Notes ----- Either ``n`` or ``N`` (but not both) can be ``PETSc.DECIDE`` or ``None`` to have it automatically set. """ cdef PetscInt n=0, N=0 cdef PetscInt ival = asInt(m) BV_Sizes(sizes, &n, &N) CHKERR( BVSetSizes(self.bv, n, N, ival) ) def setSizesFromVec(self, Vec w, m): """ Sets the local and global sizes, and the number of columns. Local and global sizes are specified indirectly by passing a template vector. Parameters ---------- w: Vec The template vector. m: int The number of columns. """ cdef PetscInt ival = asInt(m) CHKERR( BVSetSizesFromVec(self.bv, w.vec, ival) ) def getSizes(self): """ Returns the local and global sizes, and the number of columns. Returns ------- sizes: two-tuple of int The local and global sizes ``(n, N)``. m: int The number of columns. """ cdef PetscInt n=0, N=0, m=0 CHKERR( BVGetSizes(self.bv, &n, &N, &m) ) return ((toInt(n), toInt(N)), toInt(m)) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all BV options in the database. Parameters ---------- prefix: string The prefix string to prepend to all BV option requests. Notes ----- A hyphen (``-``) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( BVSetOptionsPrefix(self.bv, cval) ) def getOptionsPrefix(self): """ Gets the prefix used for searching for all BV options in the database. Returns ------- prefix: string The prefix string set for this BV object. """ cdef const_char *prefix = NULL CHKERR( BVGetOptionsPrefix(self.bv, &prefix) ) return bytes2str(prefix) def setFromOptions(self): """ Sets BV options from the options database. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( BVSetFromOptions(self.bv) ) # def getOrthogonalization(self): """ Gets the orthogonalization settings from the BV object. Returns ------- type: `BV.OrthogType` enumerate The type of orthogonalization technique. refine: `BV.OrthogRefineType` enumerate The type of refinement. eta: float Parameter for selective refinement (used when the refinement type is `BV.OrthogRefineType.IFNEEDED`). block: `BV.OrthogBlockType` enumerate The type of block orthogonalization . """ cdef SlepcBVOrthogType val1 = BV_ORTHOG_CGS cdef SlepcBVOrthogRefineType val2 = BV_ORTHOG_REFINE_IFNEEDED cdef SlepcBVOrthogBlockType val3 = BV_ORTHOG_BLOCK_GS cdef PetscReal rval = PETSC_DEFAULT CHKERR( BVGetOrthogonalization(self.bv, &val1, &val2, &rval, &val3) ) return (val1, val2, toReal(rval), val3) def setOrthogonalization(self, otype=None, refine=None, eta=None, block=None): """ Specifies the method used for the orthogonalization of vectors (classical or modified Gram-Schmidt with or without refinement), and for the block-orthogonalization (simultaneous orthogonalization of a set of vectors). Parameters ---------- otype: `BV.OrthogType` enumerate, optional The type of orthogonalization technique. refine: `BV.OrthogRefineType` enumerate, optional The type of refinement. eta: float, optional Parameter for selective refinement. block: `BV.OrthogBlockType` enumerate, optional The type of block orthogonalization. Notes ----- The default settings work well for most problems. The parameter `eta` should be a real value between ``0`` and ``1`` (or `DEFAULT`). The value of `eta` is used only when the refinement type is `BV.OrthogRefineType.IFNEEDED`. When using several processors, `BV.OrthogType.MGS` is likely to result in bad scalability. If the method set for block orthogonalization is GS, then the computation is done column by column with the vector orthogonalization. """ cdef SlepcBVOrthogType val1 = BV_ORTHOG_CGS cdef SlepcBVOrthogRefineType val2 = BV_ORTHOG_REFINE_IFNEEDED cdef SlepcBVOrthogBlockType val3 = BV_ORTHOG_BLOCK_GS cdef PetscReal rval = PETSC_DEFAULT CHKERR( BVGetOrthogonalization(self.bv, &val1, &val2, &rval, &val3) ) if otype is not None: val1 = otype if refine is not None: val2 = refine if block is not None: val3 = block if eta is not None: rval = asReal(eta) CHKERR( BVSetOrthogonalization(self.bv, val1, val2, rval, val3) ) def getMatMultMethod(self): """ Gets the method used for the `matMult()` operation. Returns ------- method: `BV.MatMultType` enumerate The method for the `matMult()` operation. """ cdef SlepcBVMatMultType val = BV_MATMULT_MAT CHKERR( BVGetMatMultMethod(self.bv, &val) ) return val def setMatMultMethod(self, method): """ Specifies the method used for the `matMult()` operation. Parameters ---------- method: `BV.MatMultType` enumerate The method for the `matMult()` operation. """ cdef SlepcBVMatMultType val = method CHKERR( BVSetMatMultMethod(self.bv, val) ) # def getMatrix(self): """ Retrieves the matrix representation of the inner product. Returns ------- mat: the matrix of the inner product """ cdef Mat mat = Mat() cdef PetscBool indef = PETSC_FALSE CHKERR( BVGetMatrix(self.bv, &mat.mat, &indef) ) CHKERR( PetscINCREF(mat.obj) ) return (mat, toBool(indef)) def setMatrix(self, Mat mat or None, bint indef): """ Sets the bilinear form to be used for inner products. Parameters ---------- mat: Mat or None The matrix of the inner product. indef: bool, optional Whether the matrix is indefinite """ cdef PetscMat m = NULL if mat is None else mat.mat cdef PetscBool tval = PETSC_TRUE if indef else PETSC_FALSE CHKERR( BVSetMatrix(self.bv, m, tval) ) def applyMatrix(self, Vec x, Vec y): """ Multiplies a vector with the matrix associated to the bilinear form. Parameters ---------- x: Vec The input vector. y: Vec The result vector. Notes ----- If the bilinear form has no associated matrix this function copies the vector. """ CHKERR( BVApplyMatrix(self.bv, x.vec, y.vec) ) def setActiveColumns(self, l, k): """ Specify the columns that will be involved in operations. Parameters ---------- l: int The leading number of columns. k: int The active number of columns. """ cdef PetscInt ival1 = asInt(l) cdef PetscInt ival2 = asInt(k) CHKERR( BVSetActiveColumns(self.bv, ival1, ival2) ) def getActiveColumns(self): """ Returns the current active dimensions. Returns ------- l: int The leading number of columns. k: int The active number of columns. """ cdef PetscInt l=0, k=0 CHKERR( BVGetActiveColumns(self.bv, &l, &k) ) return (toInt(l), toInt(k)) def scaleColumn(self, j, alpha): """ Scale column j by alpha Parameters ---------- j: int column number to be scaled. alpha: float scaling factor. """ cdef PetscInt ival = asInt(j) cdef PetscScalar sval = asScalar(alpha) CHKERR( BVScaleColumn(self.bv, ival, sval) ) def scale(self, alpha): """ Multiply the entries by a scalar value. Parameters ---------- alpha: float scaling factor. Notes ----- All active columns (except the leading ones) are scaled. """ cdef PetscScalar sval = asScalar(alpha) CHKERR( BVScale(self.bv, sval) ) def insertVec(self, j, Vec w): """ Insert a vector into the specified column. Parameters ---------- j: int The column to be overwritten. w: Vec The vector to be copied. """ cdef PetscInt ival = asInt(j) CHKERR( BVInsertVec(self.bv, ival, w.vec) ) def insertVecs(self, s, W, bint orth): """ Insert a set of vectors into specified columns. Parameters ---------- s: int The first column to be overwritten. W: Vec or sequence of Vec. Set of vectors to be copied. orth: Flag indicating if the vectors must be orthogonalized. Returns ------- m: int Number of linearly independent vectors. Notes ----- Copies the contents of vectors W into self(:,s:s+n), where n is the length of W. If orthogonalization flag is set then the vectors are copied one by one then orthogonalized against the previous one. If any are linearly dependent then it is discared and the value of m is decreased. """ if isinstance(W, Vec): W = [W] cdef PetscInt ival = asInt(s) cdef PetscVec *ws = NULL cdef Py_ssize_t i = 0, ns = len(W) cdef tmp = allocate(ns*sizeof(PetscVec),&ws) for i in range(ns): ws[i] = (W[i]).vec cdef PetscInt m = ns cdef PetscBool tval = PETSC_TRUE if orth else PETSC_FALSE CHKERR( BVInsertVecs(self.bv, ival, &m, ws, tval) ) return toInt(m) def insertConstraints(self, C): """ Insert a set of vectors as constraints. Parameters ---------- C: Vec or sequence of Vec. Set of vectors to be inserted as constraints. Returns ------- nc: int Number of linearly independent vectors. Notes ----- The constraints are relevant only during orthogonalization. Constraint vectors span a subspace that is deflated in every orthogonalization operation, so they are intended for removing those directions from the orthogonal basis computed in regular BV columns. """ if isinstance(C, Vec): C = [C] cdef PetscVec *cs = NULL cdef Py_ssize_t i = 0, nc = len(C) cdef tmp = allocate(nc*sizeof(PetscVec),&cs) for i in range(nc): cs[i] = (C[i]).vec cdef PetscInt m = nc CHKERR( BVInsertConstraints(self.bv, &m, cs) ) return toInt(m) def setNumConstraints(self, nc): """ Sets the number of constraints. Parameters ---------- nc: int The number of constraints. """ cdef PetscInt val = asInt(nc) CHKERR( BVSetNumConstraints(self.bv, val) ) def getNumConstraints(self): """ Gets the number of constraints. Returns ------- nc: int The number of constraints. """ cdef PetscInt val = 0 CHKERR( BVGetNumConstraints(self.bv, &val) ) return toInt(val) def createVec(self): """ Creates a new Vec object with the same type and dimensions as the columns of the basis vectors object. Returns ------- v: Vec New vector. """ cdef Vec v = Vec() CHKERR( BVCreateVec(self.bv, &v.vec) ) return v def copyVec(self, j, Vec v): """ Copies one of the columns of a basis vectors object into a Vec. Parameters ---------- j: int The column number to be copied. v: Vec A vector. """ cdef PetscInt ival = asInt(j) CHKERR( BVCopyVec(self.bv, ival, v.vec) ) def copyColumn(self, j, i): """ Copies the values from one of the columns to another one. Parameters ---------- j: int The number of the source column. i: int The number of the destination column. """ cdef PetscInt ival1 = asInt(j) cdef PetscInt ival2 = asInt(i) CHKERR( BVCopyColumn(self.bv, ival1, ival2) ) def setDefiniteTolerance(self, deftol): """ Sets the tolerance to be used when checking a definite inner product. Parameters ---------- deftol: float The tolerance. """ cdef PetscReal val = asReal(deftol) CHKERR( BVSetDefiniteTolerance(self.bv, val) ) def getDefiniteTolerance(self): """ Gets the tolerance to be used when checking a definite inner product. Returns ------- deftol: float The tolerance. """ cdef PetscReal val = 0 CHKERR( BVGetDefiniteTolerance(self.bv, &val) ) return toReal(val) def dotVec(self, Vec v): """ Computes multiple dot products of a vector against all the column vectors of a BV. Parameters ---------- v: Vec A vector. Returns ------- m: array of scalars The computed values. Notes ----- This is analogue to VecMDot(), but using BV to represent a collection of vectors. The result is m = X^H*y, so m_i is equal to x_j^H y. Note that here X is transposed as opposed to BVDot(). If a non-standard inner product has been specified with BVSetMatrix(), then the result is m = X^H*B*y. """ l, k = self.getActiveColumns() cdef PetscScalar* mval = NULL cdef tmp = allocate((k - l)*sizeof(PetscScalar), &mval) CHKERR( BVDotVec(self.bv, v.vec, mval) ) cdef object m = None m = array_s(k - l, mval) return m def dotColumn(self, j): """ Computes multiple dot products of a column against all the column vectors of a BV. Parameters ---------- j: int The index of the column. Returns ------- m: array of scalars The computed values. """ cdef PetscInt ival = asInt(j) l, k = self.getActiveColumns() cdef PetscScalar* mval = NULL cdef tmp = allocate((k - l)*sizeof(PetscScalar), &mval) CHKERR( BVDotColumn(self.bv, ival, mval) ) cdef object m = None m = array_s(k - l, mval) return m def getColumn(self, j): """ Returns a Vec object that contains the entries of the requested column of the basis vectors object. Parameters ---------- j: int The index of the requested column. Returns ------- v: Vec The vector containing the jth column. Notes ----- Modifying the returned Vec will change the BV entries as well. """ cdef Vec v = Vec() cdef PetscInt ival = asInt(j) CHKERR( BVGetColumn(self.bv, j, &v.vec) ) CHKERR( PetscINCREF(v.obj) ) return v def restoreColumn(self, j, Vec v): """ Restore a column obtained with `getColumn()`. Parameters ---------- j: int The index of the requested column. v: Vec The vector obtained with `getColumn()`. Notes ----- The arguments must match the corresponding call to `getColumn()`. """ cdef PetscInt ival = asInt(j) CHKERR( PetscObjectDereference(v.vec) ) CHKERR( BVRestoreColumn(self.bv, ival, &v.vec) ) def getMat(self): """ Returns a Mat object of dense type that shares the memory of the basis vectors object. Returns ------- A: Mat The matrix Notes ----- The returned matrix contains only the active columns. If the content of the Mat is modified, these changes are also done in the BV object. The user must call `restoreMat()` when no longer needed. """ cdef Mat A = Mat() CHKERR( BVGetMat(self.bv, &A.mat) ) CHKERR( PetscINCREF(A.obj) ) return A def restoreMat(self, Mat A): """ Restores the Mat obtained with `getMat()`. Parameters ---------- A: Mat The matrix obtained with `getMat()`. Notes ----- A call to this function must match a previous call of `getMat()`. The effect is that the contents of the Mat are copied back to the BV internal data structures. """ CHKERR( PetscObjectDereference(A.mat) ) CHKERR( BVRestoreMat(self.bv, &A.mat) ) def dot(self, BV Y): """ Computes the 'block-dot' product of two basis vectors objects. M = Y^H*X (m_ij = y_i^H x_j) or M = Y^H*B*X Parameters ---------- Y: BV Left basis vectors, can be the same as self, giving M = X^H X. Returns ------- M: Mat The resulting matrix. Notes ----- This is the generalization of VecDot() for a collection of vectors, M = Y^H*X. The result is a matrix M whose entry m_ij is equal to y_i^H x_j (where y_i^H denotes the conjugate transpose of y_i). X and Y can be the same object. If a non-standard inner product has been specified with setMatrix(), then the result is M = Y^H*B*X. In this case, both X and Y must have the same associated matrix. Only rows (resp. columns) of M starting from ly (resp. lx) are computed, where ly (resp. lx) is the number of leading columns of Y (resp. X). """ cdef BV X = self cdef PetscInt ky=0, kx=0 CHKERR( BVGetActiveColumns(Y.bv, NULL, &ky) ) CHKERR( BVGetActiveColumns(X.bv, NULL, &kx) ) cdef Mat M = Mat().createDense((ky, kx), comm=COMM_SELF).setUp() CHKERR( BVDot(X.bv, Y.bv, M.mat) ) return M def matProject(self, Mat A or None, BV Y): """ Computes the projection of a matrix onto a subspace. M = Y^H A X Parameters ---------- A: Mat or None Matrix to be projected. Y: BV Left basis vectors, can be the same as self, giving M = X^H A X. Returns ------- M: Mat Projection of the matrix A onto the subspace. """ cdef BV X = self cdef PetscInt kx=0, ky=0 CHKERR( BVGetActiveColumns(X.bv, NULL, &kx) ) CHKERR( BVGetActiveColumns(Y.bv, NULL, &ky) ) cdef PetscMat Amat = NULL if A is None else A.mat cdef Mat M = Mat().createDense((ky, kx), comm=COMM_SELF).setUp() CHKERR( BVMatProject(X.bv, Amat, Y.bv, M.mat) ) return M def matMult(self, Mat A, BV Y=None): """ Computes the matrix-vector product for each column, Y = A*V. Parameters ---------- A: Mat The matrix. Returns ------- Y: BV The result. Notes ----- Only active columns (excluding the leading ones) are processed. It is possible to choose whether the computation is done column by column or using dense matrices using the options database keys: -bv_matmult_vecs -bv_matmult_mat The default is bv_matmult_mat. """ cdef MPI_Comm comm = PetscObjectComm(self.bv) cdef SlepcBVType bv_type = NULL cdef PetscInt n=0, N=0, m=0 cdef SlepcBVOrthogType val1 = BV_ORTHOG_CGS cdef SlepcBVOrthogRefineType val2 = BV_ORTHOG_REFINE_IFNEEDED cdef SlepcBVOrthogBlockType val3 = BV_ORTHOG_BLOCK_GS cdef PetscReal rval = PETSC_DEFAULT if Y is None: Y = BV() if Y.bv == NULL: CHKERR( BVGetType(self.bv, &bv_type) ) CHKERR( MatGetLocalSize(A.mat, &n, NULL) ) CHKERR( MatGetSize(A.mat, &N, NULL) ) CHKERR( BVGetSizes(self.bv, NULL, NULL, &m) ) CHKERR( BVGetOrthogonalization(self.bv, &val1, &val2, &rval, &val3) ) CHKERR( BVCreate(comm, &Y.bv) ) CHKERR( BVSetType(Y.bv, bv_type) ) CHKERR( BVSetSizes(Y.bv, n, N, m) ) CHKERR( BVSetOrthogonalization(Y.bv, val1, val2, rval, val3) ) CHKERR( BVMatMult(self.bv, A.mat, Y.bv) ) return Y def matMultHermitianTranspose(self, Mat A, BV Y=None): """ Computes the matrix-vector product with the conjugate transpose of a matrix for each column, Y=A^H*V. Parameters ---------- A: Mat The matrix. Returns ------- Y: BV The result. Notes ----- Only active columns (excluding the leading ones) are processed. As opoosed to matMult(), this operation is always done by column by column, with a sequence of calls to MatMultHermitianTranspose(). """ cdef MPI_Comm comm = PetscObjectComm(self.bv) cdef SlepcBVType bv_type = NULL cdef PetscInt n=0, N=0, m=0 cdef SlepcBVOrthogType val1 = BV_ORTHOG_CGS cdef SlepcBVOrthogRefineType val2 = BV_ORTHOG_REFINE_IFNEEDED cdef SlepcBVOrthogBlockType val3 = BV_ORTHOG_BLOCK_GS cdef PetscReal rval = PETSC_DEFAULT if Y is None: Y = BV() if Y.bv == NULL: CHKERR( BVGetType(self.bv, &bv_type) ) CHKERR( MatGetLocalSize(A.mat, NULL, &n) ) CHKERR( MatGetSize(A.mat, NULL, &N) ) CHKERR( BVGetSizes(self.bv, NULL, NULL, &m) ) CHKERR( BVGetOrthogonalization(self.bv, &val1, &val2, &rval, &val3) ) CHKERR( BVCreate(comm, &Y.bv) ) CHKERR( BVSetType(Y.bv, bv_type) ) CHKERR( BVSetSizes(Y.bv, n, N, m) ) CHKERR( BVSetOrthogonalization(Y.bv, val1, val2, rval, val3) ) CHKERR( BVMatMultHermitianTranspose(self.bv, A.mat, Y.bv) ) return Y def matMultColumn(self, Mat A, j): """ Computes the matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A*v_j. Parameters ---------- A: Mat The matrix. j: int Index of column. """ cdef PetscInt ival = asInt(j) CHKERR( BVMatMultColumn(self.bv, A.mat, ival) ) def matMultTransposeColumn(self, Mat A, j): """ Computes the transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^T*v_j. Parameters ---------- A: Mat The matrix. j: int Index of column. """ cdef PetscInt ival = asInt(j) CHKERR( BVMatMultTransposeColumn(self.bv, A.mat, ival) ) def matMultHermitianTransposeColumn(self, Mat A, j): """ Computes the conjugate-transpose matrix-vector product for a specified column, storing the result in the next column: v_{j+1}=A^H*v_j. Parameters ---------- A: Mat The matrix. j: int Index of column. """ cdef PetscInt ival = asInt(j) CHKERR( BVMatMultHermitianTransposeColumn(self.bv, A.mat, ival) ) def mult(self, alpha, beta, BV X, Mat Q): """ Computes Y = beta*Y + alpha*X*Q. Parameters ---------- alpha: scalar Coefficient that multiplies X. beta: scalar Coefficient that multiplies Y. X: BV Input basis vectors. Q: Mat, optional Input matrix, if not given the identity matrix is assumed. """ cdef PetscScalar sval1 = asScalar(alpha) cdef PetscScalar sval2 = asScalar(beta) cdef PetscMat Qmat = NULL if Q is None else Q.mat CHKERR( BVMult(self.bv, sval1, sval2, X.bv, Qmat) ) def multInPlace(self, Mat Q, s, e): """ Update a set of vectors as V(:,s:e-1) = V*Q(:,s:e-1). Parameters ---------- Q: Mat A sequential dense matrix. s: int First column to be overwritten. e: int Last column to be overwritten. """ cdef PetscInt ival1 = asInt(s) cdef PetscInt ival2 = asInt(e) CHKERR( BVMultInPlace(self.bv, Q.mat, ival1, ival2) ) def multColumn(self, alpha, beta, j, q): """ Computes y = beta*y + alpha*X*q, where y is the j-th column. Parameters ---------- alpha: scalar Coefficient that multiplies X. beta: scalar Coefficient that multiplies y. j: int The column index. q: Array of scalar Input coefficients. """ cdef PetscScalar sval1 = asScalar(alpha) cdef PetscScalar sval2 = asScalar(beta) cdef PetscInt ival = asInt(j) cdef PetscInt nq = 0 cdef PetscScalar* qval = NULL cdef tmp = iarray_s(q, &nq, &qval) cdef PetscInt l=0, k=0 CHKERR( BVGetActiveColumns(self.bv, &l, &k) ) assert nq == k-l CHKERR( BVMultColumn(self.bv, sval1, sval2, ival, qval) ) def multVec(self, alpha, beta, Vec y, q): """ Computes y = beta*y + alpha*X*q. Parameters ---------- alpha: scalar Coefficient that multiplies X. beta: scalar Coefficient that multiplies y. y: Vec Input/output vector. q: Array of scalar Input coefficients. """ cdef PetscScalar sval1 = asScalar(alpha) cdef PetscScalar sval2 = asScalar(beta) cdef PetscInt nq = 0 cdef PetscScalar* qval = NULL cdef tmp = iarray_s(q, &nq, &qval) cdef PetscInt l=0, k=0 CHKERR( BVGetActiveColumns(self.bv, &l, &k) ) assert nq == k-l CHKERR( BVMultVec(self.bv, sval1, sval2, y.vec, qval) ) def normColumn(self, int j, norm_type=None): """ Computes the matrix norm of the BV. Parameters ---------- j: int Index of column. norm_type: `PETSc.NormType` enumerate The norm type. Returns ------- norm: float Notes ----- The norm of V[j] is computed (NORM_1, NORM_2, or NORM_INFINITY). If a non-standard inner product has been specified with BVSetMatrix(), then the returned value is ``sqrt(V[j]'* B*V[j])``, where B is the inner product matrix (argument 'type' is ignored). """ cdef PetscNormType ntype = PETSC_NORM_2 if norm_type is not None: ntype = norm_type cdef PetscReal norm = 0 CHKERR( BVNormColumn(self.bv, j, ntype, &norm) ) return toReal(norm) def norm(self, norm_type=None): """ Computes the matrix norm of the BV. Parameters ---------- norm_type: `PETSC.NormType` enumerate The norm type. Returns ------- norm: float Notes ----- All active columns (except the leading ones) are considered as a matrix. The allowed norms are NORM_1, NORM_FROBENIUS, and NORM_INFINITY. This operation fails if a non-standard inner product has been specified with BVSetMatrix(). """ cdef PetscNormType ntype = PETSC_NORM_FROBENIUS if norm_type is not None: ntype = norm_type cdef PetscReal norm = 0 CHKERR( BVNorm(self.bv, ntype, &norm) ) return toReal(norm) def resize(self, m, copy=True): """ Change the number of columns. Parameters ---------- m: int The new number of columns. copy: bool A flag indicating whether current values should be kept. Notes ----- Internal storage is reallocated. If copy is True, then the contents are copied to the leading part of the new space. """ cdef PetscInt ival = asInt(m) cdef PetscBool tval = PETSC_TRUE if copy else PETSC_FALSE CHKERR( BVResize(self.bv, ival, tval) ) def setRandom(self): """ Set the active columns of the BV to random numbers. Notes ----- All active columns (except the leading ones) are modified. """ CHKERR( BVSetRandom(self.bv) ) def setRandomNormal(self): """ Set the active columns of the BV to random numbers (with normal distribution). Notes ----- All active columns (except the leading ones) are modified. """ CHKERR( BVSetRandomNormal(self.bv) ) def setRandomSign(self): """ Set the entries of a BV to values 1 or -1 with equal probability. Notes ----- All active columns (except the leading ones) are modified. """ CHKERR( BVSetRandomSign(self.bv) ) def setRandomColumn(self, j): """ Set one column of the BV to random numbers. Parameters ---------- j: int Column number to be set. """ cdef PetscInt ival = asInt(j) CHKERR( BVSetRandomColumn(self.bv, ival) ) def setRandomCond(self, condn): """ Set the columns of a BV to random numbers, in a way that the generated matrix has a given condition number. Parameters ---------- condn: float Condition number. """ cdef PetscReal rval = asReal(condn) CHKERR( BVSetRandomCond(self.bv, rval) ) def setRandomContext(self, Random rnd): """ Sets the `PETSc.Random` object associated with the BV, to be used in operations that need random numbers. Parameters ---------- rnd: `PETSc.Random` The random number generator context. """ CHKERR( BVSetRandomContext(self.bv, rnd.rnd) ) def getRandomContext(self): """ Gets the `PETSc.Random` object associated with the BV. Returns ------- rnd: `PETSc.Random` The random number generator context. """ cdef Random rnd = Random() CHKERR( BVGetRandomContext(self.bv, &rnd.rnd) ) CHKERR( PetscINCREF(rnd.obj) ) return rnd def orthogonalizeVec(self, Vec v): """ Orthogonalize a vector with respect to a set of vectors. Parameters ---------- v: Vec Vector to be orthogonalized, modified on return. Returns ------- norm: float The norm of the resulting vector. lindep: bool Flag indicating that refinement did not improve the quality of orthogonalization. Notes ----- This function applies an orthogonal projector to project vector ``v`` onto the orthogonal complement of the span of the columns of the BV. This routine does not normalize the resulting vector. """ cdef PetscReal norm = 0 cdef PetscBool ldep = PETSC_FALSE CHKERR( BVOrthogonalizeVec(self.bv, v.vec, NULL, &norm, &ldep) ) return (toReal(norm), toBool(ldep)) def orthogonalizeColumn(self, j): """ Orthogonalize one of the column vectors with respect to the previous ones. Parameters ---------- j: int Index of the column to be orthogonalized. Returns ------- norm: float The norm of the resulting vector. lindep: bool Flag indicating that refinement did not improve the quality of orthogonalization. Notes ----- This function applies an orthogonal projector to project vector ``V[j]`` onto the orthogonal complement of the span of the columns ``V[0..j-1]``, where ``V[.]`` are the vectors of the BV. The columns ``V[0..j-1]`` are assumed to be mutually orthonormal. This routine does not normalize the resulting vector. """ cdef PetscInt ival = asInt(j) cdef PetscReal norm = 0 cdef PetscBool ldep = PETSC_FALSE CHKERR( BVOrthogonalizeColumn(self.bv, ival, NULL, &norm, &ldep) ) return (toReal(norm), toBool(ldep)) def orthonormalizeColumn(self, j, replace=False): """ Orthonormalize one of the column vectors with respect to the previous ones. This is equivalent to a call to `orthogonalizeColumn()` followed by a call to `scaleColumn()` with the reciprocal of the norm. Parameters ---------- j: int Index of the column to be orthonormalized. replace: bool, optional Whether it is allowed to set the vector randomly. Returns ------- norm: float The norm of the resulting vector. lindep: bool Flag indicating that refinement did not improve the quality of orthogonalization. """ cdef PetscInt ival = asInt(j) cdef PetscBool bval = PETSC_FALSE if replace is not None: bval = asBool(replace) cdef PetscReal norm = 0 cdef PetscBool ldep = PETSC_FALSE CHKERR( BVOrthonormalizeColumn(self.bv, ival, bval, &norm, &ldep) ) return (toReal(norm), toBool(ldep)) def orthogonalize(self, Mat R=None, **kargs): """ Orthogonalize all columns (except leading ones), that is, compute the QR decomposition. Parameters ---------- R: Mat, optional A sequential dense matrix. Notes ----- The output satisfies ``V0 = V*R`` (where V0 represent the input V) and ``V'*V = I``. """ if kargs: self.setOrthogonalization(**kargs) cdef PetscMat Rmat = NULL if R is None else R.mat CHKERR( BVOrthogonalize(self.bv, Rmat) ) # ----------------------------------------------------------------------------- del BVType del BVOrthogType del BVOrthogRefineType del BVOrthogBlockType del BVMatMultType # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/CAPI.pyx000066400000000000000000000075651454104675500201170ustar00rootroot00000000000000# ----------------------------------------------------------------------------- cdef inline int setref(void *d, void *s) except -1: cdef PetscObject *dest = d cdef PetscObject source = s CHKERR( PetscINCREF(&source) ) dest[0] = source return 0 # ----------------------------------------------------------------------------- # -- ST -- cdef api object PySlepcST_New(SlepcST arg): cdef ST retv = ST() setref(&retv.st, arg) return retv cdef api SlepcST PySlepcST_Get(object arg) except ? NULL: cdef SlepcST retv = NULL cdef ST ob = arg retv = ob.st return retv # ----------------------------------------------------------------------------- # -- BV -- cdef api object PySlepcBV_New(SlepcBV arg): cdef BV retv = BV() setref(&retv.bv, arg) return retv cdef api SlepcBV PySlepcBV_Get(object arg) except ? NULL: cdef SlepcBV retv = NULL cdef BV ob = arg retv = ob.bv return retv # ----------------------------------------------------------------------------- # -- DS -- cdef api object PySlepcDS_New(SlepcDS arg): cdef DS retv = DS() setref(&retv.ds, arg) return retv cdef api SlepcDS PySlepcDS_Get(object arg) except ? NULL: cdef SlepcDS retv = NULL cdef DS ob = arg retv = ob.ds return retv # ----------------------------------------------------------------------------- # -- FN -- cdef api object PySlepcFN_New(SlepcFN arg): cdef FN retv = FN() setref(&retv.fn, arg) return retv cdef api SlepcFN PySlepcFN_Get(object arg) except ? NULL: cdef SlepcFN retv = NULL cdef FN ob = arg retv = ob.fn return retv # ----------------------------------------------------------------------------- # -- RG -- cdef api object PySlepcRG_New(SlepcRG arg): cdef RG retv = RG() setref(&retv.rg, arg) return retv cdef api SlepcRG PySlepcRG_Get(object arg) except ? NULL: cdef SlepcRG retv = NULL cdef RG ob = arg retv = ob.rg return retv # ----------------------------------------------------------------------------- # -- EPS -- cdef api object PySlepcEPS_New(SlepcEPS arg): cdef EPS retv = EPS() setref(&retv.eps, arg) return retv cdef api SlepcEPS PySlepcEPS_Get(object arg) except ? NULL: cdef SlepcEPS retv = NULL cdef EPS ob = arg retv = ob.eps return retv # ----------------------------------------------------------------------------- # -- SVD -- cdef api object PySlepcSVD_New(SlepcSVD arg): cdef SVD retv = SVD() setref(&retv.svd, arg) return retv cdef api SlepcSVD PySlepcSVD_Get(object arg) except ? NULL: cdef SlepcSVD retv = NULL cdef SVD ob = arg retv = ob.svd return retv # ----------------------------------------------------------------------------- # -- PEP -- cdef api object PySlepcPEP_New(SlepcPEP arg): cdef PEP retv = PEP() setref(&retv.pep, arg) return retv cdef api SlepcPEP PySlepcPEP_Get(object arg) except ? NULL: cdef SlepcPEP retv = NULL cdef PEP ob = arg retv = ob.pep return retv # ----------------------------------------------------------------------------- # -- NEP -- cdef api object PySlepcNEP_New(SlepcNEP arg): cdef NEP retv = NEP() setref(&retv.nep, arg) return retv cdef api SlepcNEP PySlepcNEP_Get(object arg) except ? NULL: cdef SlepcNEP retv = NULL cdef NEP ob = arg retv = ob.nep return retv # ----------------------------------------------------------------------------- # -- MFN -- cdef api object PySlepcMFN_New(SlepcMFN arg): cdef MFN retv = MFN() setref(&retv.mfn, arg) return retv cdef api SlepcMFN PySlepcMFN_Get(object arg) except ? NULL: cdef SlepcMFN retv = NULL cdef MFN ob = arg retv = ob.mfn return retv # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/DS.pyx000066400000000000000000000505301454104675500176770ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class DSType(object): """ DS type """ HEP = S_(DSHEP) NHEP = S_(DSNHEP) GHEP = S_(DSGHEP) GHIEP = S_(DSGHIEP) GNHEP = S_(DSGNHEP) NHEPTS = S_(DSNHEPTS) SVD = S_(DSSVD) HSVD = S_(DSHSVD) GSVD = S_(DSGSVD) PEP = S_(DSPEP) NEP = S_(DSNEP) class DSStateType(object): """ DS state types - `RAW`: Not processed yet. - `INTERMEDIATE`: Reduced to Hessenberg or tridiagonal form (or equivalent). - `CONDENSED`: Reduced to Schur or diagonal form (or equivalent). - `TRUNCATED`: Condensed form truncated to a smaller size. """ RAW = DS_STATE_RAW INTERMEDIATE = DS_STATE_INTERMEDIATE CONDENSED = DS_STATE_CONDENSED TRUNCATED = DS_STATE_TRUNCATED class DSMatType(object): """ To refer to one of the matrices stored internally in DS - `A`: first matrix of eigenproblem/singular value problem. - `B`: second matrix of a generalized eigenproblem. - `C`: third matrix of a quadratic eigenproblem. - `T`: tridiagonal matrix. - `D`: diagonal matrix. - `Q`: orthogonal matrix of (right) Schur vectors. - `Z`: orthogonal matrix of left Schur vectors. - `X`: right eigenvectors. - `Y`: left eigenvectors. - `U`: left singular vectors. - `V`: right singular vectors. - `W`: workspace matrix. """ A = DS_MAT_A B = DS_MAT_B C = DS_MAT_C T = DS_MAT_T D = DS_MAT_D Q = DS_MAT_Q Z = DS_MAT_Z X = DS_MAT_X Y = DS_MAT_Y U = DS_MAT_U V = DS_MAT_V W = DS_MAT_W class DSParallelType(object): """ DS parallel types - `REDUNDANT`: Every process performs the computation redundantly. - `SYNCHRONIZED`: The first process sends the result to the rest. - `DISTRIBUTED`: Used in some cases to distribute the computation among processes. """ REDUNDANT = DS_PARALLEL_REDUNDANT SYNCHRONIZED = DS_PARALLEL_SYNCHRONIZED DISTRIBUTED = DS_PARALLEL_DISTRIBUTED # ----------------------------------------------------------------------------- cdef class DS(Object): """ DS """ Type = DSType StateType = DSStateType MatType = DSMatType ParallelType = DSParallelType def __cinit__(self): self.obj = &self.ds self.ds = NULL def view(self, Viewer viewer=None): """ Prints the DS data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( DSView(self.ds, vwr) ) def destroy(self): """ Destroys the DS object. """ CHKERR( DSDestroy(&self.ds) ) self.ds = NULL return self def reset(self): """ Resets the DS object. """ CHKERR( DSReset(self.ds) ) def create(self, comm=None): """ Creates the DS object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcDS newds = NULL CHKERR( DSCreate(ccomm, &newds) ) CHKERR( SlepcCLEAR(self.obj) ); self.ds = newds return self def setType(self, ds_type): """ Selects the type for the DS object. Parameters ---------- ds_type: `DS.Type` enumerate The direct solver type to be used. """ cdef SlepcDSType cval = NULL ds_type = str2bytes(ds_type, &cval) CHKERR( DSSetType(self.ds, cval) ) def getType(self): """ Gets the DS type of this object. Returns ------- type: `DS.Type` enumerate The direct solver type currently being used. """ cdef SlepcDSType ds_type = NULL CHKERR( DSGetType(self.ds, &ds_type) ) return bytes2str(ds_type) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all DS options in the database. Parameters ---------- prefix: string The prefix string to prepend to all DS option requests. Notes ----- A hyphen (``-``) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( DSSetOptionsPrefix(self.ds, cval) ) def getOptionsPrefix(self): """ Gets the prefix used for searching for all DS options in the database. Returns ------- prefix: string The prefix string set for this DS object. """ cdef const_char *prefix = NULL CHKERR( DSGetOptionsPrefix(self.ds, &prefix) ) return bytes2str(prefix) def setFromOptions(self): """ Sets DS options from the options database. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( DSSetFromOptions(self.ds) ) def duplicate(self): """ Duplicate the DS object with the same type and dimensions. """ cdef DS ds = type(self)() CHKERR( DSDuplicate(self.ds, &ds.ds) ) return ds # def allocate(self, ld): """ Allocates memory for internal storage or matrices in DS. Parameters ---------- ld: int Leading dimension (maximum allowed dimension for the matrices, including the extra row if present). """ cdef PetscInt val = asInt(ld) CHKERR( DSAllocate(self.ds, val) ) def getLeadingDimension(self): """ Returns the leading dimension of the allocated matrices. Returns ------- ld: int Leading dimension (maximum allowed dimension for the matrices). """ cdef PetscInt val = 0 CHKERR( DSGetLeadingDimension(self.ds, &val) ) return toInt(val) def setState(self, state): """ Change the state of the DS object. Parameters ---------- state: `DS.StateType` enumerate The new state. Notes ----- The state indicates that the dense system is in an initial state (raw), in an intermediate state (such as tridiagonal, Hessenberg or Hessenberg-triangular), in a condensed state (such as diagonal, Schur or generalized Schur), or in a truncated state. This function is normally used to return to the raw state when the condensed structure is destroyed. """ cdef SlepcDSStateType val = state CHKERR( DSSetState(self.ds, val) ) def getState(self): """ Returns the current state. Returns ------- state: `DS.StateType` enumerate The current state. """ cdef SlepcDSStateType val = DS_STATE_RAW CHKERR( DSGetState(self.ds, &val) ) return val def setParallel(self, pmode): """ Selects the mode of operation in parallel runs. Parameters ---------- pmode: `DS.ParallelType` enumerate The parallel mode. """ cdef SlepcDSParallelType val = pmode CHKERR( DSSetParallel(self.ds, val) ) def getParallel(self): """ Gets the mode of operation in parallel runs. Returns ------- pmode: `DS.ParallelType` enumerate The parallel mode. """ cdef SlepcDSParallelType val = DS_PARALLEL_REDUNDANT CHKERR( DSGetParallel(self.ds, &val) ) return val def setDimensions(self, n=None, l=None, k=None): """ Resize the matrices in the DS object. Parameters ---------- n: int, optional The new size. l: int, optional Number of locked (inactive) leading columns. k: int, optional Intermediate dimension (e.g., position of arrow). Notes ----- The internal arrays are not reallocated. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 if n is not None: ival1 = asInt(n) if l is not None: ival2 = asInt(l) if k is not None: ival3 = asInt(k) CHKERR( DSSetDimensions(self.ds, ival1, ival2, ival3) ) def getDimensions(self): """ Returns the current dimensions. Returns ------- n: int The new size. l: int Number of locked (inactive) leading columns. k: int Intermediate dimension (e.g., position of arrow). t: int Truncated length. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 cdef PetscInt ival4 = 0 CHKERR( DSGetDimensions(self.ds, &ival1, &ival2, &ival3, &ival4) ) return (toInt(ival1), toInt(ival2), toInt(ival3), toInt(ival4)) def setBlockSize(self, bs): """ Selects the block size. Parameters ---------- bs: int The block size. """ cdef PetscInt val = bs CHKERR( DSSetBlockSize(self.ds, val) ) def getBlockSize(self): """ Gets the block size. Returns ------- bs: int The block size. """ cdef PetscInt val = 0 CHKERR( DSGetBlockSize(self.ds, &val) ) return val def setMethod(self, meth): """ Selects the method to be used to solve the problem. Parameters ---------- meth: int An index identifying the method. """ cdef PetscInt val = meth CHKERR( DSSetMethod(self.ds, val) ) def getMethod(self): """ Gets the method currently used in the DS. Returns ------- meth: int Identifier of the method. """ cdef PetscInt val = 0 CHKERR( DSGetMethod(self.ds, &val) ) return val def setCompact(self, comp): """ Switch to compact storage of matrices. Parameters ---------- comp: bool True means compact storage. Notes ----- Compact storage is used in some `DS` types such as `DS.Type.HEP` when the matrix is tridiagonal. This flag can be used to indicate whether the user provides the matrix entries via the compact form (the tridiagonal `DS.MatType.T`) or the non-compact one (`DS.MatType.A`). The default is ``False``. """ cdef PetscBool val = asBool(comp) CHKERR( DSSetCompact(self.ds, val) ) def getCompact(self): """ Gets the compact storage flag. Returns ------- comp: bool The flag. """ cdef PetscBool val = PETSC_FALSE CHKERR( DSGetCompact(self.ds, &val) ) return toBool(val) def setExtraRow(self, ext): """ Sets a flag to indicate that the matrix has one extra row. Parameters ---------- ext: bool True if the matrix has extra row. Notes ----- In Krylov methods it is useful that the matrix representing the direct solver has one extra row, i.e., has dimension (n+1)*n . If this flag is activated, all transformations applied to the right of the matrix also affect this additional row. In that case, (n+1) must be less or equal than the leading dimension. The default is ``False``. """ cdef PetscBool val = asBool(ext) CHKERR( DSSetExtraRow(self.ds, val) ) def getExtraRow(self): """ Gets the extra row flag. Returns ------- comp: bool The flag. """ cdef PetscBool val = PETSC_FALSE CHKERR( DSGetExtraRow(self.ds, &val) ) return toBool(val) def setRefined(self, ref): """ Sets a flag to indicate that refined vectors must be computed. Parameters ---------- ref: bool True if refined vectors must be used. Notes ----- Normally the vectors returned in `DS.MatType.X` are eigenvectors of the projected matrix. With this flag activated, `vectors()` will return the right singular vector of the smallest singular value of matrix At-theta*I, where At is the extended (n+1)xn matrix and theta is the Ritz value. This is used in the refined Ritz approximation. The default is ``False``. """ cdef PetscBool val = asBool(ref) CHKERR( DSSetRefined(self.ds, val) ) def getRefined(self): """ Gets the refined vectors flag. Returns ------- comp: bool The flag. """ cdef PetscBool val = PETSC_FALSE CHKERR( DSGetRefined(self.ds, &val) ) return toBool(val) def truncate(self, n, trim=False): """ Truncates the system represented in the DS object. Parameters ---------- n: int The new size. trim: bool, optional A flag to indicate if the factorization must be trimmed. """ cdef PetscInt val = asInt(n) cdef PetscBool flg = asBool(trim) CHKERR( DSTruncate(self.ds, val, flg) ) def updateExtraRow(self): """ Performs all necessary operations so that the extra row gets up-to-date after a call to `solve()`. """ CHKERR( DSUpdateExtraRow(self.ds) ) def getMat(self, matname): """ Returns the requested matrix as a sequential dense Mat object. Parameters ---------- matname: `DS.MatType` enumerate The requested matrix. """ cdef SlepcDSMatType mname = matname cdef Mat mat = Mat() CHKERR( DSGetMat(self.ds, mname, &mat.mat) ) CHKERR( PetscINCREF(mat.obj) ) return mat def restoreMat(self, matname, Mat mat): """ Restore the previously seized matrix. Parameters ---------- matname: `DS.MatType` enumerate The selected matrix. mat: Mat The matrix previously obtained with `getMat()`. """ cdef SlepcDSMatType mname = matname CHKERR( PetscObjectDereference(mat.mat) ) CHKERR( DSRestoreMat(self.ds, mname, &mat.mat) ) def setIdentity(self, matname): """ Copy the identity on the active part of a matrix. Parameters ---------- matname: `DS.MatType` enumerate The requested matrix. """ cdef SlepcDSMatType mname = matname CHKERR( DSSetIdentity(self.ds, mname) ) # def cond(self): """ Compute the inf-norm condition number of the first matrix. Returns ------- cond: real Condition number. """ cdef PetscReal rval = 0 CHKERR( DSCond(self.ds, &rval) ) return toReal(rval) # def setSVDDimensions(self, m): """ Sets the number of columns of a `DS` of type `SVD`. Parameters ---------- m: int The number of columns. """ cdef PetscInt val = asInt(m) CHKERR( DSSVDSetDimensions(self.ds, val) ) def getSVDDimensions(self): """ Gets the number of columns of a `DS` of type `SVD`. Returns ------- m: int The number of columns. """ cdef PetscInt val = 0 CHKERR( DSSVDGetDimensions(self.ds, &val) ) return toInt(val) def setHSVDDimensions(self, m): """ Sets the number of columns of a `DS` of type `HSVD`. Parameters ---------- m: int The number of columns. """ cdef PetscInt val = asInt(m) CHKERR( DSHSVDSetDimensions(self.ds, val) ) def getHSVDDimensions(self): """ Gets the number of columns of a `DS` of type `HSVD`. Returns ------- m: int The number of columns. """ cdef PetscInt val = 0 CHKERR( DSHSVDGetDimensions(self.ds, &val) ) return toInt(val) def setGSVDDimensions(self, m, p): """ Sets the number of columns and rows of a `DS` of type `GSVD`. Parameters ---------- m: int The number of columns. p: int The number of rows for the second matrix. """ cdef PetscInt val1 = asInt(m) cdef PetscInt val2 = asInt(p) CHKERR( DSGSVDSetDimensions(self.ds, val1, val2) ) def getGSVDDimensions(self): """ Gets the number of columns and rows of a `DS` of type `GSVD`. Returns ------- m: int The number of columns. p: int The number of rows for the second matrix. """ cdef PetscInt val1 = 0 cdef PetscInt val2 = 0 CHKERR( DSGSVDGetDimensions(self.ds, &val1, &val2) ) return (toInt(val1), toInt(val2)) def setPEPDegree(self, deg): """ Sets the polynomial degree of a `DS` of type `PEP`. Parameters ---------- deg: int The polynomial degree. """ cdef PetscInt val = asInt(deg) CHKERR( DSPEPSetDegree(self.ds, val) ) def getPEPDegree(self): """ Gets the polynomial degree of a `DS` of type `PEP`. Returns ------- deg: int The polynomial degree. """ cdef PetscInt val = 0 CHKERR( DSPEPGetDegree(self.ds, &val) ) return toInt(val) def setPEPCoefficients(self, pbc): """ Sets the polynomial basis coefficients of a `DS` of type `PEP`. Parameters ---------- pbc: array of float Coefficients. """ cdef PetscInt na = 0 cdef PetscReal *a = NULL cdef object tmp1 = iarray_r(pbc, &na, &a) CHKERR( DSPEPSetCoefficients(self.ds, a) ) def getPEPCoefficients(self): """ Gets the polynomial basis coefficients of a `DS` of type `PEP`. Returns ------- pbc: array of float Coefficients. """ cdef PetscInt np = 0 cdef PetscReal *coeff = NULL CHKERR( DSPEPGetDegree(self.ds, &np) ) CHKERR( DSPEPGetCoefficients(self.ds, &coeff) ) cdef object ocoeff = None try: ocoeff = array_r(3*(np+1), coeff) finally: CHKERR( PetscFree(coeff) ) return ocoeff # property state: def __get__(self): return self.getState() def __set__(self, value): self.setState(value) property parallel: def __get__(self): return self.getParallel() def __set__(self, value): self.setParallel(value) property block_size: def __get__(self): return self.getBlockSize() def __set__(self, value): self.setBlockSize(value) property method: def __get__(self): return self.getMethod() def __set__(self, value): self.setMethod(value) property compact: def __get__(self): return self.getCompact() def __set__(self, value): self.setCompact(value) property extra_row: def __get__(self): return self.getExtraRow() def __set__(self, value): self.setExtraRow(value) property refined: def __get__(self): return self.getRefined() def __set__(self, value): self.setRefined(value) # ----------------------------------------------------------------------------- del DSType del DSStateType del DSMatType del DSParallelType # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/EPS.pyx000066400000000000000000002647101454104675500200270ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class EPSType(object): """ EPS type Native sparse eigensolvers. - `POWER`: Power Iteration, Inverse Iteration, RQI. - `SUBSPACE`: Subspace Iteration. - `ARNOLDI`: Arnoldi. - `LANCZOS`: Lanczos. - `KRYLOVSCHUR`: Krylov-Schur (default). - `GD`: Generalized Davidson. - `JD`: Jacobi-Davidson. - `RQCG`: Rayleigh Quotient Conjugate Gradient. - `LOBPCG`: Locally Optimal Block Preconditioned Conjugate Gradient. - `CISS`: Contour Integral Spectrum Slicing. - `LYAPII`: Lyapunov inverse iteration. - `LAPACK`: Wrappers to dense eigensolvers in Lapack. Wrappers to external eigensolvers (should be enabled during installation of SLEPc) - `ARPACK`: - `TRLAN`: - `BLOPEX`: - `PRIMME`: - `FEAST`: - `SCALAPACK`: - `ELPA`: - `ELEMENTAL`: - `EVSL`: """ # provided implementations POWER = S_(EPSPOWER) SUBSPACE = S_(EPSSUBSPACE) ARNOLDI = S_(EPSARNOLDI) LANCZOS = S_(EPSLANCZOS) KRYLOVSCHUR = S_(EPSKRYLOVSCHUR) GD = S_(EPSGD) JD = S_(EPSJD) RQCG = S_(EPSRQCG) LOBPCG = S_(EPSLOBPCG) CISS = S_(EPSCISS) LYAPII = S_(EPSLYAPII) LAPACK = S_(EPSLAPACK) # with external libraries ARPACK = S_(EPSARPACK) TRLAN = S_(EPSTRLAN) BLOPEX = S_(EPSBLOPEX) PRIMME = S_(EPSPRIMME) FEAST = S_(EPSFEAST) SCALAPACK = S_(EPSSCALAPACK) ELPA = S_(EPSELPA) ELEMENTAL = S_(EPSELEMENTAL) EVSL = S_(EPSEVSL) class EPSProblemType(object): """ EPS problem type - `HEP`: Hermitian eigenproblem. - `NHEP`: Non-Hermitian eigenproblem. - `GHEP`: Generalized Hermitian eigenproblem. - `GNHEP`: Generalized Non-Hermitian eigenproblem. - `PGNHEP`: Generalized Non-Hermitian eigenproblem with positive definite ``B``. - `GHIEP`: Generalized Hermitian-indefinite eigenproblem. """ HEP = EPS_HEP NHEP = EPS_NHEP GHEP = EPS_GHEP GNHEP = EPS_GNHEP PGNHEP = EPS_PGNHEP GHIEP = EPS_GHIEP class EPSExtraction(object): """ EPS extraction technique - `RITZ`: Standard Rayleigh-Ritz extraction. - `HARMONIC`: Harmonic extraction. - `HARMONIC_RELATIVE`: Harmonic extraction relative to the eigenvalue. - `HARMONIC_RIGHT`: Harmonic extraction for rightmost eigenvalues. - `HARMONIC_LARGEST`: Harmonic extraction for largest magnitude (without target). - `REFINED`: Refined extraction. - `REFINED_HARMONIC`: Refined harmonic extraction. """ RITZ = EPS_RITZ HARMONIC = EPS_HARMONIC HARMONIC_RELATIVE = EPS_HARMONIC_RELATIVE HARMONIC_RIGHT = EPS_HARMONIC_RIGHT HARMONIC_LARGEST = EPS_HARMONIC_LARGEST REFINED = EPS_REFINED REFINED_HARMONIC = EPS_REFINED_HARMONIC class EPSBalance(object): """ EPS type of balancing used for non-Hermitian problems - `NONE`: None. - `ONESIDE`: One-sided balancing. - `TWOSIDE`: Two-sided balancing. - `USER`: User-provided balancing matrices. """ NONE = EPS_BALANCE_NONE ONESIDE = EPS_BALANCE_ONESIDE TWOSIDE = EPS_BALANCE_TWOSIDE USER = EPS_BALANCE_USER class EPSErrorType(object): """ EPS error type to assess accuracy of computed solutions - `ABSOLUTE`: Absolute error. - `RELATIVE`: Relative error. - `BACKWARD`: Backward error. """ ABSOLUTE = EPS_ERROR_ABSOLUTE RELATIVE = EPS_ERROR_RELATIVE BACKWARD = EPS_ERROR_BACKWARD class EPSWhich(object): """ EPS desired part of spectrum - `LARGEST_MAGNITUDE`: Largest magnitude (default). - `SMALLEST_MAGNITUDE`: Smallest magnitude. - `LARGEST_REAL`: Largest real parts. - `SMALLEST_REAL`: Smallest real parts. - `LARGEST_IMAGINARY`: Largest imaginary parts in magnitude. - `SMALLEST_IMAGINARY`: Smallest imaginary parts in magnitude. - `TARGET_MAGNITUDE`: Closest to target (in magnitude). - `TARGET_REAL`: Real part closest to target. - `TARGET_IMAGINARY`: Imaginary part closest to target. - `ALL`: All eigenvalues in an interval. - `USER`: User defined selection. """ LARGEST_MAGNITUDE = EPS_LARGEST_MAGNITUDE SMALLEST_MAGNITUDE = EPS_SMALLEST_MAGNITUDE LARGEST_REAL = EPS_LARGEST_REAL SMALLEST_REAL = EPS_SMALLEST_REAL LARGEST_IMAGINARY = EPS_LARGEST_IMAGINARY SMALLEST_IMAGINARY = EPS_SMALLEST_IMAGINARY TARGET_MAGNITUDE = EPS_TARGET_MAGNITUDE TARGET_REAL = EPS_TARGET_REAL TARGET_IMAGINARY = EPS_TARGET_IMAGINARY ALL = EPS_ALL USER = EPS_WHICH_USER class EPSConv(object): """ EPS convergence test - `ABS`: Absolute convergence test. - `REL`: Convergence test relative to the eigenvalue. - `NORM`: Convergence test relative to the matrix norms. - `USER`: User-defined convergence test. """ ABS = EPS_CONV_ABS REL = EPS_CONV_REL NORM = EPS_CONV_NORM USER = EPS_CONV_USER class EPSStop(object): """ EPS stopping test - `BASIC`: Default stopping test. - `USER`: User-defined stopping test. """ BASIC = EPS_STOP_BASIC USER = EPS_STOP_USER class EPSConvergedReason(object): """ EPS convergence reasons - `CONVERGED_TOL`: All eigenpairs converged to requested tolerance. - `CONVERGED_USER`: User-defined convergence criterion satisfied. - `DIVERGED_ITS`: Maximum number of iterations exceeded. - `DIVERGED_BREAKDOWN`: Solver failed due to breakdown. - `DIVERGED_SYMMETRY_LOST`: Lanczos-type method could not preserve symmetry. - `CONVERGED_ITERATING`: Iteration not finished yet. """ CONVERGED_TOL = EPS_CONVERGED_TOL CONVERGED_USER = EPS_CONVERGED_USER DIVERGED_ITS = EPS_DIVERGED_ITS DIVERGED_BREAKDOWN = EPS_DIVERGED_BREAKDOWN DIVERGED_SYMMETRY_LOST = EPS_DIVERGED_SYMMETRY_LOST CONVERGED_ITERATING = EPS_CONVERGED_ITERATING ITERATING = EPS_CONVERGED_ITERATING class EPSPowerShiftType(object): """ EPS Power shift type. - `CONSTANT`: Constant shift. - `RAYLEIGH`: Rayleigh quotient. - `WILKINSON`: Wilkinson shift. """ CONSTANT = EPS_POWER_SHIFT_CONSTANT RAYLEIGH = EPS_POWER_SHIFT_RAYLEIGH WILKINSON = EPS_POWER_SHIFT_WILKINSON class EPSLanczosReorthogType(object): """ EPS Lanczos reorthogonalization type - `LOCAL`: Local reorthogonalization only. - `FULL`: Full reorthogonalization. - `SELECTIVE`: Selective reorthogonalization. - `PERIODIC`: Periodic reorthogonalization. - `PARTIAL`: Partial reorthogonalization. - `DELAYED`: Delayed reorthogonalization. """ LOCAL = EPS_LANCZOS_REORTHOG_LOCAL FULL = EPS_LANCZOS_REORTHOG_FULL SELECTIVE = EPS_LANCZOS_REORTHOG_SELECTIVE PERIODIC = EPS_LANCZOS_REORTHOG_PERIODIC PARTIAL = EPS_LANCZOS_REORTHOG_PARTIAL DELAYED = EPS_LANCZOS_REORTHOG_DELAYED class EPSCISSQuadRule(object): """ EPS CISS quadrature rule - `TRAPEZOIDAL`: Trapezoidal rule. - `CHEBYSHEV`: Chebyshev points. """ TRAPEZOIDAL = EPS_CISS_QUADRULE_TRAPEZOIDAL CHEBYSHEV = EPS_CISS_QUADRULE_CHEBYSHEV class EPSCISSExtraction(object): """ EPS CISS extraction technique - `RITZ`: Ritz extraction. - `HANKEL`: Extraction via Hankel eigenproblem. """ RITZ = EPS_CISS_EXTRACTION_RITZ HANKEL = EPS_CISS_EXTRACTION_HANKEL # ----------------------------------------------------------------------------- cdef class EPS(Object): """ EPS """ Type = EPSType ProblemType = EPSProblemType Extraction = EPSExtraction Balance = EPSBalance ErrorType = EPSErrorType Which = EPSWhich Conv = EPSConv Stop = EPSStop ConvergedReason = EPSConvergedReason PowerShiftType = EPSPowerShiftType LanczosReorthogType = EPSLanczosReorthogType CISSQuadRule = EPSCISSQuadRule CISSExtraction = EPSCISSExtraction def __cinit__(self): self.obj = &self.eps self.eps = NULL def view(self, Viewer viewer=None): """ Prints the EPS data structure. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( EPSView(self.eps, vwr) ) def destroy(self): """ Destroys the EPS object. """ CHKERR( EPSDestroy(&self.eps) ) self.eps = NULL return self def reset(self): """ Resets the EPS object. """ CHKERR( EPSReset(self.eps) ) def create(self, comm=None): """ Creates the EPS object. Parameters ---------- comm: MPI_Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcEPS neweps = NULL CHKERR( EPSCreate(ccomm, &neweps) ) CHKERR( SlepcCLEAR(self.obj) ); self.eps = neweps return self def setType(self, eps_type): """ Selects the particular solver to be used in the EPS object. Parameters ---------- eps_type: `EPS.Type` enumerate The solver to be used. Notes ----- See `EPS.Type` for available methods. The default is `EPS.Type.KRYLOVSCHUR`. Normally, it is best to use `setFromOptions()` and then set the EPS type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods. """ cdef SlepcEPSType cval = NULL eps_type = str2bytes(eps_type, &cval) CHKERR( EPSSetType(self.eps, cval) ) def getType(self): """ Gets the EPS type of this object. Returns ------- type: `EPS.Type` enumerate The solver currently being used. """ cdef SlepcEPSType eps_type = NULL CHKERR( EPSGetType(self.eps, &eps_type) ) return bytes2str(eps_type) def getOptionsPrefix(self): """ Gets the prefix used for searching for all EPS options in the database. Returns ------- prefix: string The prefix string set for this EPS object. """ cdef const_char *prefix = NULL CHKERR( EPSGetOptionsPrefix(self.eps, &prefix) ) return bytes2str(prefix) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all EPS options in the database. Parameters ---------- prefix: string The prefix string to prepend to all EPS option requests. Notes ----- A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. For example, to distinguish between the runtime options for two different EPS contexts, one could call:: E1.setOptionsPrefix("eig1_") E2.setOptionsPrefix("eig2_") """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( EPSSetOptionsPrefix(self.eps, cval) ) def appendOptionsPrefix(self, prefix): """ Appends to the prefix used for searching for all EPS options in the database. Parameters ---------- prefix: string The prefix string to prepend to all EPS option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( EPSAppendOptionsPrefix(self.eps, cval) ) def setFromOptions(self): """ Sets EPS options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( EPSSetFromOptions(self.eps) ) # def getProblemType(self): """ Gets the problem type from the EPS object. Returns ------- problem_type: `EPS.ProblemType` enumerate The problem type that was previously set. """ cdef SlepcEPSProblemType val = EPS_NHEP CHKERR( EPSGetProblemType(self.eps, &val) ) return val def setProblemType(self, problem_type): """ Specifies the type of the eigenvalue problem. Parameters ---------- problem_type: `EPS.ProblemType` enumerate The problem type to be set. Notes ----- Allowed values are: Hermitian (HEP), non-Hermitian (NHEP), generalized Hermitian (GHEP), generalized non-Hermitian (GNHEP), and generalized non-Hermitian with positive semi-definite B (PGNHEP). This function must be used to instruct SLEPc to exploit symmetry. If no problem type is specified, by default a non-Hermitian problem is assumed (either standard or generalized). If the user knows that the problem is Hermitian (i.e. ``A=A^H``) or generalized Hermitian (i.e. ``A=A^H``, ``B=B^H``, and ``B`` positive definite) then it is recommended to set the problem type so that eigensolver can exploit these properties. """ cdef SlepcEPSProblemType val = problem_type CHKERR( EPSSetProblemType(self.eps, val) ) def isGeneralized(self): """ Tells whether the EPS object corresponds to a generalized eigenvalue problem. Returns ------- flag: bool True if two matrices were set with `setOperators()`. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSIsGeneralized(self.eps, &tval) ) return toBool(tval) def isHermitian(self): """ Tells whether the EPS object corresponds to a Hermitian eigenvalue problem. Returns ------- flag: bool True if the problem type set with `setProblemType()` was Hermitian. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSIsHermitian(self.eps, &tval) ) return toBool(tval) def isPositive(self): """ Tells whether the EPS object corresponds to an eigenvalue problem type that requires a positive (semi-) definite matrix B. Returns ------- flag: bool True if the problem type set with `setProblemType()` was positive. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSIsPositive(self.eps, &tval) ) return toBool(tval) def getBalance(self): """ Gets the balancing type used by the EPS object, and the associated parameters. Returns ------- balance: `EPS.Balance` enumerate The balancing method iterations: int Number of iterations of the balancing algorithm cutoff: real Cutoff value """ cdef SlepcEPSBalance val = EPS_BALANCE_ONESIDE cdef PetscInt ival = 0 cdef PetscReal rval = 0 CHKERR( EPSGetBalance(self.eps, &val, &ival, &rval) ) return (val, toInt(ival), toReal(rval)) def setBalance(self, balance=None, iterations=None, cutoff=None): """ Specifies the balancing technique to be employed by the eigensolver, and some parameters associated to it. Parameters ---------- balance: `EPS.Balance` enumerate The balancing method iterations: int Number of iterations of the balancing algorithm cutoff: real Cutoff value """ cdef SlepcEPSBalance val = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT cdef PetscReal rval = PETSC_DEFAULT if balance is not None: val = balance if iterations is not None: ival = asInt(iterations) if cutoff is not None: rval = asReal(cutoff) CHKERR( EPSSetBalance(self.eps, val, ival, rval) ) def getExtraction(self): """ Gets the extraction type used by the EPS object. Returns ------- extraction: `EPS.Extraction` enumerate The method of extraction. """ cdef SlepcEPSExtraction val = EPS_RITZ CHKERR( EPSGetExtraction(self.eps, &val) ) return val def setExtraction(self, extraction): """ Sets the extraction type used by the EPS object. Parameters ---------- extraction: `EPS.Extraction` enumerate The extraction method to be used by the solver. Notes ----- Not all eigensolvers support all types of extraction. See the SLEPc documentation for details. By default, a standard Rayleigh-Ritz extraction is used. Other extractions may be useful when computing interior eigenvalues. Harmonic-type extractions are used in combination with a *target*. See `setTarget()`. """ cdef SlepcEPSExtraction val = extraction CHKERR( EPSSetExtraction(self.eps, val) ) def getWhichEigenpairs(self): """ Returns which portion of the spectrum is to be sought. Returns ------- which: `EPS.Which` enumerate The portion of the spectrum to be sought by the solver. """ cdef SlepcEPSWhich val = EPS_LARGEST_MAGNITUDE CHKERR( EPSGetWhichEigenpairs(self.eps, &val) ) return val def setWhichEigenpairs(self, which): """ Specifies which portion of the spectrum is to be sought. Parameters ---------- which: `EPS.Which` enumerate The portion of the spectrum to be sought by the solver. Notes ----- Not all eigensolvers implemented in EPS account for all the possible values. Also, some values make sense only for certain types of problems. If SLEPc is compiled for real numbers `EPS.Which.LARGEST_IMAGINARY` and `EPS.Which.SMALLEST_IMAGINARY` use the absolute value of the imaginary part for eigenvalue selection. """ cdef SlepcEPSWhich val = which CHKERR( EPSSetWhichEigenpairs(self.eps, val) ) def getTarget(self): """ Gets the value of the target. Returns ------- target: float (real or complex) The value of the target. Notes ----- If the target was not set by the user, then zero is returned. """ cdef PetscScalar sval = 0 CHKERR( EPSGetTarget(self.eps, &sval) ) return toScalar(sval) def setTarget(self, target): """ Sets the value of the target. Parameters ---------- target: float (real or complex) The value of the target. Notes ----- The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with `setWhichEigenpairs()`. """ cdef PetscScalar sval = asScalar(target) CHKERR( EPSSetTarget(self.eps, sval) ) def getInterval(self): """ Gets the computational interval for spectrum slicing. Returns ------- inta: float The left end of the interval. intb: float The right end of the interval. Notes ----- If the interval was not set by the user, then zeros are returned. """ cdef PetscReal inta = 0 cdef PetscReal intb = 0 CHKERR( EPSGetInterval(self.eps, &inta, &intb) ) return (toReal(inta), toReal(intb)) def setInterval(self, inta, intb): """ Defines the computational interval for spectrum slicing. Parameters ---------- inta: float The left end of the interval. intb: float The right end of the interval. Notes ----- Spectrum slicing is a technique employed for computing all eigenvalues of symmetric eigenproblems in a given interval. This function provides the interval to be considered. It must be used in combination with `EPS.Which.ALL`, see `setWhichEigenpairs()`. """ cdef PetscReal rval1 = asReal(inta) cdef PetscReal rval2 = asReal(intb) CHKERR( EPSSetInterval(self.eps, rval1, rval2) ) # def getTolerances(self): """ Gets the tolerance and maximum iteration count used by the default EPS convergence tests. Returns ------- tol: float The convergence tolerance. max_it: int The maximum number of iterations """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( EPSGetTolerances(self.eps, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setTolerances(self, tol=None, max_it=None): """ Sets the tolerance and maximum iteration count used by the default EPS convergence tests. Parameters ---------- tol: float, optional The convergence tolerance. max_it: int, optional The maximum number of iterations Notes ----- Use `DECIDE` for maxits to assign a reasonably good value, which is dependent on the solution method. """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if max_it is not None: ival = asInt(max_it) CHKERR( EPSSetTolerances(self.eps, rval, ival) ) def getTwoSided(self): """ Returns the flag indicating whether a two-sided variant of the algorithm is being used or not. Returns ------- twosided: bool Whether the two-sided variant is to be used or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGetTwoSided(self.eps, &tval) ) return toBool(tval) def setTwoSided(self, twosided): """ Sets the solver to use a two-sided variant so that left eigenvectors are also computed. Parameters ---------- twosided: bool Whether the two-sided variant is to be used or not. """ cdef PetscBool tval = asBool(twosided) CHKERR( EPSSetTwoSided(self.eps, tval) ) def getPurify(self): """ Returns the flag indicating whether purification is activated or not. Returns ------- purify: bool Whether purification is activated or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGetPurify(self.eps, &tval) ) return toBool(tval) def setPurify(self, purify=True): """ Activate or deactivate eigenvector purification. Parameters ---------- purify: bool, optional True to activate purification (default). """ cdef PetscBool tval = asBool(purify) CHKERR( EPSSetPurify(self.eps, tval) ) def getConvergenceTest(self): """ Return the method used to compute the error estimate used in the convergence test. Returns ------- conv: EPS.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcEPSConv conv = EPS_CONV_REL CHKERR( EPSGetConvergenceTest(self.eps, &conv) ) return conv def setConvergenceTest(self, conv): """ Specifies how to compute the error estimate used in the convergence test. Parameters ---------- conv: EPS.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcEPSConv tconv = conv CHKERR( EPSSetConvergenceTest(self.eps, tconv) ) def getTrueResidual(self): """ Returns the flag indicating whether true residual must be computed explicitly or not. Returns ------- trueres: bool Whether the solver compute all residuals or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGetTrueResidual(self.eps, &tval) ) return toBool(tval) def setTrueResidual(self, trueres): """ Specifies if the solver must compute the true residual explicitly or not. Parameters ---------- trueres: bool Whether compute the true residual or not. """ cdef PetscBool tval = asBool(trueres) CHKERR( EPSSetTrueResidual(self.eps, tval) ) def getTrackAll(self): """ Returns the flag indicating whether all residual norms must be computed or not. Returns ------- trackall: bool Whether the solver compute all residuals or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGetTrackAll(self.eps, &tval) ) return toBool(tval) def setTrackAll(self, trackall): """ Specifies if the solver must compute the residual of all approximate eigenpairs or not. Parameters ---------- trackall: bool Whether compute all residuals or not. """ cdef PetscBool tval = asBool(trackall) CHKERR( EPSSetTrackAll(self.eps, tval) ) def getDimensions(self): """ Gets the number of eigenvalues to compute and the dimension of the subspace. Returns ------- nev: int Number of eigenvalues to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( EPSGetDimensions(self.eps, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def setDimensions(self, nev=None, ncv=None, mpd=None): """ Sets the number of eigenvalues to compute and the dimension of the subspace. Parameters ---------- nev: int, optional Number of eigenvalues to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. Notes ----- Use `DECIDE` for `ncv` and `mpd` to assign a reasonably good value, which is dependent on the solution method. The parameters `ncv` and `mpd` are intimately related, so that the user is advised to set one of them at most. Normal usage is the following: + In cases where `nev` is small, the user sets `ncv` (a reasonable default is 2 * `nev`). + In cases where `nev` is large, the user sets `mpd`. The value of `ncv` should always be between `nev` and (`nev` + `mpd`), typically `ncv` = `nev` + `mpd`. If `nev` is not too large, `mpd` = `nev` is a reasonable choice, otherwise a smaller value should be used. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nev is not None: ival1 = asInt(nev) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( EPSSetDimensions(self.eps, ival1, ival2, ival3) ) def getST(self): """ Obtain the spectral transformation (`ST`) object associated to the eigensolver object. Returns ------- st: ST The spectral transformation. """ cdef ST st = ST() CHKERR( EPSGetST(self.eps, &st.st) ) CHKERR( PetscINCREF(st.obj) ) return st def setST(self, ST st): """ Associates a spectral transformation object to the eigensolver. Parameters ---------- st: ST The spectral transformation. """ CHKERR( EPSSetST(self.eps, st.st) ) def getBV(self): """ Obtain the basis vector objects associated to the eigensolver. Returns ------- bv: BV The basis vectors context. """ cdef BV bv = BV() CHKERR( EPSGetBV(self.eps, &bv.bv) ) CHKERR( PetscINCREF(bv.obj) ) return bv def setBV(self, BV bv): """ Associates a basis vectors object to the eigensolver. Parameters ---------- bv: BV The basis vectors context. """ CHKERR( EPSSetBV(self.eps, bv.bv) ) def getDS(self): """ Obtain the direct solver associated to the eigensolver. Returns ------- ds: DS The direct solver context. """ cdef DS ds = DS() CHKERR( EPSGetDS(self.eps, &ds.ds) ) CHKERR( PetscINCREF(ds.obj) ) return ds def setDS(self, DS ds): """ Associates a direct solver object to the eigensolver. Parameters ---------- ds: DS The direct solver context. """ CHKERR( EPSSetDS(self.eps, ds.ds) ) def getRG(self): """ Obtain the region object associated to the eigensolver. Returns ------- rg: RG The region context. """ cdef RG rg = RG() CHKERR( EPSGetRG(self.eps, &rg.rg) ) CHKERR( PetscINCREF(rg.obj) ) return rg def setRG(self, RG rg): """ Associates a region object to the eigensolver. Parameters ---------- rg: RG The region context. """ CHKERR( EPSSetRG(self.eps, rg.rg) ) def getOperators(self): """ Gets the matrices associated with the eigenvalue problem. Returns ------- A: Mat The matrix associated with the eigensystem. B: Mat The second matrix in the case of generalized eigenproblems. """ cdef Mat A = Mat() cdef Mat B = Mat() CHKERR( EPSGetOperators(self.eps, &A.mat, &B.mat) ) CHKERR( PetscINCREF(A.obj) ) if B.mat: CHKERR( PetscINCREF(B.obj) ) return (A, B) else: return (A, None) def setOperators(self, Mat A, Mat B=None): """ Sets the matrices associated with the eigenvalue problem. Parameters ---------- A: Mat The matrix associated with the eigensystem. B: Mat, optional The second matrix in the case of generalized eigenproblems; if not provided, a standard eigenproblem is assumed. """ cdef PetscMat Bmat = B.mat if B is not None else NULL CHKERR( EPSSetOperators(self.eps, A.mat, Bmat) ) def setDeflationSpace(self, space): """ Add vectors to the basis of the deflation space. Parameters ---------- space: a Vec or an array of Vec Set of basis vectors to be added to the deflation space. Notes ----- When a deflation space is given, the eigensolver seeks the eigensolution in the restriction of the problem to the orthogonal complement of this space. This can be used for instance in the case that an invariant subspace is known beforehand (such as the nullspace of the matrix). The vectors do not need to be mutually orthonormal, since they are explicitly orthonormalized internally. These vectors do not persist from one `solve()` call to the other, so the deflation space should be set every time. """ if isinstance(space, Vec): space = [space] cdef PetscVec* vs = NULL cdef Py_ssize_t i = 0, ns = len(space) cdef tmp = allocate(ns*sizeof(PetscVec),&vs) for i in range(ns): vs[i] = (space[i]).vec CHKERR( EPSSetDeflationSpace(self.eps, ns, vs) ) # def setInitialSpace(self, space): """ Sets the initial space from which the eigensolver starts to iterate. Parameters ---------- space: Vec or sequence of Vec The initial space Notes ----- Some solvers start to iterate on a single vector (initial vector). In that case, the other vectors are ignored. In contrast to `setDeflationSpace()`, these vectors do not persist from one `solve()` call to the other, so the initial space should be set every time. The vectors do not need to be mutually orthonormal, since they are explicitly orthonormalized internally. Common usage of this function is when the user can provide a rough approximation of the wanted eigenspace. Then, convergence may be faster. """ if isinstance(space, Vec): space = [space] cdef PetscVec *vs = NULL cdef Py_ssize_t i = 0, ns = len(space) cdef tmp = allocate(ns*sizeof(PetscVec),&vs) for i in range(ns): vs[i] = (space[i]).vec CHKERR( EPSSetInitialSpace(self.eps, ns, vs) ) def setLeftInitialSpace(self, space): """ Sets the left initial space from which the eigensolver starts to iterate. Parameters ---------- space: Vec or sequence of Vec The left initial space Notes ----- Left initial vectors are used to initiate the left search space in two-sided eigensolvers. Users should pass here an approximation of the left eigenspace, if available. The same comments in `setInitialSpace()` are applicable here. """ if isinstance(space, Vec): space = [space] cdef PetscVec *vs = NULL cdef Py_ssize_t i = 0, ns = len(space) cdef tmp = allocate(ns*sizeof(PetscVec),&vs) for i in range(ns): vs[i] = (space[i]).vec CHKERR( EPSSetLeftInitialSpace(self.eps, ns, vs) ) # def setStoppingTest(self, stopping, args=None, kargs=None): """ Sets a function to decide when to stop the outer iteration of the eigensolver. """ if stopping is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__stopping__', (stopping, args, kargs)) CHKERR( EPSSetStoppingTestFunction(self.eps, EPS_Stopping, NULL, NULL) ) else: self.set_attr('__stopping__', None) CHKERR( EPSSetStoppingTestFunction(self.eps, EPSStoppingBasic, NULL, NULL) ) def getStoppingTest(self): """ Gets the stopping function. """ return self.get_attr('__stopping__') # def setArbitrarySelection(self, arbitrary, args=None, kargs=None): """ Sets a function to look for eigenvalues according to an arbitrary selection criterion. This criterion can be based on a computation involving the current eigenvector approximation. """ if arbitrary is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__arbitrary__', (arbitrary, args, kargs)) ctx = self.get_attr('__arbitrary__') CHKERR( EPSSetArbitrarySelection(self.eps, EPS_Arbitrary, ctx) ) else: self.set_attr('__arbitrary__', None) CHKERR( EPSSetArbitrarySelection(self.eps, NULL, NULL) ) # def setEigenvalueComparison(self, comparison, args=None, kargs=None): """ Specifies the eigenvalue comparison function when `setWhichEigenpairs()` is set to `EPS.Which.USER`. """ if comparison is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__comparison__', (comparison, args, kargs)) ctx = self.get_attr('__comparison__') CHKERR( EPSSetEigenvalueComparison(self.eps, EPS_Comparison, ctx) ) else: self.set_attr('__comparison__', None) CHKERR( EPSSetEigenvalueComparison(self.eps, NULL, NULL) ) def setMonitor(self, monitor, args=None, kargs=None): """ Appends a monitor function to the list of monitors. """ if monitor is None: return cdef object monitorlist = self.get_attr('__monitor__') if monitorlist is None: monitorlist = [] self.set_attr('__monitor__', monitorlist) CHKERR( EPSMonitorSet(self.eps, EPS_Monitor, NULL, NULL) ) if args is None: args = () if kargs is None: kargs = {} monitorlist.append((monitor, args, kargs)) def getMonitor(self): """ Gets the list of monitor functions. """ return self.get_attr('__monitor__') def cancelMonitor(self): """ Clears all monitors for an `EPS` object. """ CHKERR( EPSMonitorCancel(self.eps) ) self.set_attr('__monitor__', None) # def setUp(self): """ Sets up all the internal data structures necessary for the execution of the eigensolver. Notes ----- This function need not be called explicitly in most cases, since `solve()` calls it. It can be useful when one wants to measure the set-up time separately from the solve time. """ CHKERR( EPSSetUp(self.eps) ) def solve(self): """ Solves the eigensystem. """ CHKERR( EPSSolve(self.eps) ) def getIterationNumber(self): """ Gets the current iteration number. If the call to `solve()` is complete, then it returns the number of iterations carried out by the solution method. Returns ------- its: int Iteration number. """ cdef PetscInt ival = 0 CHKERR( EPSGetIterationNumber(self.eps, &ival) ) return toInt(ival) def getConvergedReason(self): """ Gets the reason why the `solve()` iteration was stopped. Returns ------- reason: `EPS.ConvergedReason` enumerate Negative value indicates diverged, positive value converged. """ cdef SlepcEPSConvergedReason val = EPS_CONVERGED_ITERATING CHKERR( EPSGetConvergedReason(self.eps, &val) ) return val def getConverged(self): """ Gets the number of converged eigenpairs. Returns ------- nconv: int Number of converged eigenpairs. Notes ----- This function should be called after `solve()` has finished. """ cdef PetscInt ival = 0 CHKERR( EPSGetConverged(self.eps, &ival) ) return toInt(ival) def getEigenvalue(self, int i): """ Gets the i-th eigenvalue as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. Returns ------- e: scalar (possibly complex) The computed eigenvalue. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). Eigenpairs are indexed according to the ordering criterion established with `setWhichEigenpairs()`. """ cdef PetscScalar sval1 = 0 cdef PetscScalar sval2 = 0 CHKERR( EPSGetEigenvalue(self.eps, i, &sval1, &sval2) ) return toComplex(sval1, sval2) def getEigenvector(self, int i, Vec Vr, Vec Vi=None): """ Gets the i-th eigenvector as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. Vr: Vec Placeholder for the returned eigenvector (real part). Vi: Vec, optional Placeholder for the returned eigenvector (imaginary part). Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). Eigenpairs are indexed according to the ordering criterion established with `setWhichEigenpairs()`. """ cdef PetscVec vecr = Vr.vec cdef PetscVec veci = Vi.vec if Vi is not None else NULL CHKERR( EPSGetEigenvector(self.eps, i, vecr, veci) ) def getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None): """ Gets the i-th left eigenvector as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. Wr: Vec Placeholder for the returned eigenvector (real part). Wi: Vec, optional Placeholder for the returned eigenvector (imaginary part). Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). Eigensolutions are indexed according to the ordering criterion established with `setWhichEigenpairs()`. Left eigenvectors are available only if the twosided flag was set with `setTwoSided()`. """ cdef PetscVec vecr = Wr.vec cdef PetscVec veci = Wi.vec if Wi is not None else NULL CHKERR( EPSGetLeftEigenvector(self.eps, i, vecr, veci) ) def getEigenpair(self, int i, Vec Vr=None, Vec Vi=None): """ Gets the i-th solution of the eigenproblem as computed by `solve()`. The solution consists of both the eigenvalue and the eigenvector. Parameters ---------- i: int Index of the solution to be obtained. Vr: Vec Placeholder for the returned eigenvector (real part). Vi: Vec Placeholder for the returned eigenvector (imaginary part). Returns ------- e: scalar (possibly complex) The computed eigenvalue. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). Eigenpairs are indexed according to the ordering criterion established with `setWhichEigenpairs()`. """ cdef PetscScalar sval1 = 0 cdef PetscScalar sval2 = 0 cdef PetscVec vecr = Vr.vec if Vr is not None else NULL cdef PetscVec veci = Vi.vec if Vi is not None else NULL CHKERR( EPSGetEigenpair(self.eps, i, &sval1, &sval2, vecr, veci) ) return toComplex(sval1, sval2) def getInvariantSubspace(self): """ Gets an orthonormal basis of the computed invariant subspace. Returns ------- subspace: list of Vec Basis of the invariant subspace. Notes ----- This function should be called after `solve()` has finished. The returned vectors span an invariant subspace associated with the computed eigenvalues. An invariant subspace ``X`` of ``A` satisfies ``A x`` in ``X`` for all ``x`` in ``X`` (a similar definition applies for generalized eigenproblems). """ cdef PetscInt i = 0, ncv = 0 cdef PetscVec v = NULL, *isp = NULL cdef list subspace = [] CHKERR( EPSGetConverged(self.eps, &ncv) ) if ncv == 0: return subspace cdef PetscMat A = NULL CHKERR( EPSGetOperators(self.eps, &A, NULL) ) CHKERR( MatCreateVecs(A, &v, NULL) ) cdef Vec V = None cdef object tmp = allocate(ncv*sizeof(PetscVec),&isp) for i in range(ncv): if i == 0: isp[0] = v if i >= 1: CHKERR( VecDuplicate(v, &isp[i]) ) V = Vec(); V.vec = isp[i]; subspace.append(V) CHKERR( EPSGetInvariantSubspace(self.eps, isp) ) return subspace # def getErrorEstimate(self, int i): """ Returns the error estimate associated to the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. Returns ------- e: real Error estimate. Notes ----- This is the error estimate used internally by the eigensolver. The actual error bound can be computed with `computeError()`. """ cdef PetscReal rval = 0 CHKERR( EPSGetErrorEstimate(self.eps, i, &rval) ) return toReal(rval) def computeError(self, int i, etype=None): """ Computes the error (based on the residual norm) associated with the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. etype: `EPS.ErrorType` enumerate The error type to compute. Returns ------- e: real The error bound, computed in various ways from the residual norm ``||Ax-kBx||_2`` where ``k`` is the eigenvalue and ``x`` is the eigenvector. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). """ cdef SlepcEPSErrorType et = EPS_ERROR_RELATIVE cdef PetscReal rval = 0 if etype is not None: et = etype CHKERR( EPSComputeError(self.eps, i, et, &rval) ) return toReal(rval) def errorView(self, etype=None, Viewer viewer=None): """ Displays the errors associated with the computed solution (as well as the eigenvalues). Parameters ---------- etype: `EPS.ErrorType` enumerate, optional The error type to compute. viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. Notes ----- By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ``ASCII_INFO_DETAIL`` then a table with eigenvalues and corresponding errors is printed. """ cdef SlepcEPSErrorType et = EPS_ERROR_RELATIVE if etype is not None: et = etype cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( EPSErrorView(self.eps, et, vwr) ) def valuesView(self, Viewer viewer=None): """ Displays the computed eigenvalues in a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( EPSValuesView(self.eps, vwr) ) def vectorsView(self, Viewer viewer=None): """ Outputs computed eigenvectors to a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( EPSVectorsView(self.eps, vwr) ) # def setPowerShiftType(self, shift): """ Sets the type of shifts used during the power iteration. This can be used to emulate the Rayleigh Quotient Iteration (RQI) method. Parameters ---------- shift: `EPS.PowerShiftType` enumerate The type of shift. Notes ----- This call is only relevant if the type was set to `EPS.Type.POWER` with `setType()`. By default, shifts are constant (`EPS.PowerShiftType.CONSTANT`) and the iteration is the simple power method (or inverse iteration if a shift-and-invert transformation is being used). A variable shift can be specified (`EPS.PowerShiftType.RAYLEIGH` or `EPS.PowerShiftType.WILKINSON`). In this case, the iteration behaves rather like a cubic converging method as RQI. """ cdef SlepcEPSPowerShiftType val = shift CHKERR( EPSPowerSetShiftType(self.eps, val) ) def getPowerShiftType(self): """ Gets the type of shifts used during the power iteration. Returns ------- shift: `EPS.PowerShiftType` enumerate The type of shift. """ cdef SlepcEPSPowerShiftType val = EPS_POWER_SHIFT_CONSTANT CHKERR( EPSPowerGetShiftType(self.eps, &val) ) return val def setArnoldiDelayed(self, delayed): """ Activates or deactivates delayed reorthogonalization in the Arnoldi iteration. Parameters ---------- delayed: bool True if delayed reorthogonalization is to be used. Notes ----- This call is only relevant if the type was set to `EPS.Type.ARNOLDI` with `setType()`. Delayed reorthogonalization is an aggressive optimization for the Arnoldi eigensolver than may provide better scalability, but sometimes makes the solver converge less than the default algorithm. """ cdef PetscBool val = asBool(delayed) CHKERR( EPSArnoldiSetDelayed(self.eps, val) ) def getArnoldiDelayed(self): """ Gets the type of reorthogonalization used during the Arnoldi iteration. Returns ------- delayed: bool True if delayed reorthogonalization is to be used. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSArnoldiGetDelayed(self.eps, &tval) ) return toBool(tval) def setLanczosReorthogType(self, reorthog): """ Sets the type of reorthogonalization used during the Lanczos iteration. Parameters ---------- reorthog: `EPS.LanczosReorthogType` enumerate The type of reorthogonalization. Notes ----- This call is only relevant if the type was set to `EPS.Type.LANCZOS` with `setType()`. """ cdef SlepcEPSLanczosReorthogType val = reorthog CHKERR( EPSLanczosSetReorthog(self.eps, val) ) def getLanczosReorthogType(self): """ Gets the type of reorthogonalization used during the Lanczos iteration. Returns ------- reorthog: `EPS.LanczosReorthogType` enumerate The type of reorthogonalization. """ cdef SlepcEPSLanczosReorthogType val = \ EPS_LANCZOS_REORTHOG_LOCAL CHKERR( EPSLanczosGetReorthog(self.eps, &val) ) return val # def setKrylovSchurRestart(self, keep): """ Sets the restart parameter for the Krylov-Schur method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( EPSKrylovSchurSetRestart(self.eps, val) ) def getKrylovSchurRestart(self): """ Gets the restart parameter used in the Krylov-Schur method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( EPSKrylovSchurGetRestart(self.eps, &val) ) return toReal(val) def setKrylovSchurLocking(self, lock): """ Choose between locking and non-locking variants of the Krylov-Schur method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( EPSKrylovSchurSetLocking(self.eps, val) ) def getKrylovSchurLocking(self): """ Gets the locking flag used in the Krylov-Schur method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSKrylovSchurGetLocking(self.eps, &tval) ) return toBool(tval) def setKrylovSchurPartitions(self, npart): """ Sets the number of partitions for the case of doing spectrum slicing for a computational interval with the communicator split in several sub-communicators. Parameters ---------- npart: int The number of partitions. Notes ----- By default, npart=1 so all processes in the communicator participate in the processing of the whole interval. If npart>1 then the interval is divided into npart subintervals, each of them being processed by a subset of processes. """ cdef PetscInt val = asInt(npart) CHKERR( EPSKrylovSchurSetPartitions(self.eps, val) ) def getKrylovSchurPartitions(self): """ Gets the number of partitions of the communicator in case of spectrum slicing. Returns ------- npart: int The number of partitions. """ cdef PetscInt val = 0 CHKERR( EPSKrylovSchurGetPartitions(self.eps, &val) ) return toInt(val) def setKrylovSchurDetectZeros(self, detect): """ Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation. Parameters ---------- detect: bool True if zeros must checked for. Notes ----- A zero in the factorization indicates that a shift coincides with an eigenvalue. This flag is turned off by default, and may be necessary in some cases, especially when several partitions are being used. This feature currently requires an external package for factorizations with support for zero detection, e.g. MUMPS. """ cdef PetscBool val = asBool(detect) CHKERR( EPSKrylovSchurSetDetectZeros(self.eps, val) ) def getKrylovSchurDetectZeros(self): """ Gets the flag that enforces zero detection in spectrum slicing. Returns ------- detect: bool The zero detection flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSKrylovSchurGetDetectZeros(self.eps, &tval) ) return toBool(tval) def setKrylovSchurDimensions(self, nev=None, ncv=None, mpd=None): """ Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. The meaning of the parameters is the same as in `setDimensions()`. Parameters ---------- nev: int, optional Number of eigenvalues to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nev is not None: ival1 = asInt(nev) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( EPSKrylovSchurSetDimensions(self.eps, ival1, ival2, ival3) ) def getKrylovSchurDimensions(self): """ Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. Returns ------- nev: int Number of eigenvalues to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( EPSKrylovSchurGetDimensions(self.eps, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def getKrylovSchurSubcommInfo(self): """ Gets information related to the case of doing spectrum slicing for a computational interval with multiple communicators. Returns ------- k: int Number of the subinterval for the calling process. n: int Number of eigenvalues found in the k-th subinterval. v: Vec A vector owned by processes in the subcommunicator with dimensions compatible for locally computed eigenvectors. Notes ----- This function is only available for spectrum slicing runs. The returned Vec should be destroyed by the user. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef Vec vec = Vec() CHKERR( EPSKrylovSchurGetSubcommInfo(self.eps, &ival1, &ival2, &vec.vec) ) return (toInt(ival1), toInt(ival2), vec) def getKrylovSchurSubcommPairs(self, int i, Vec V): """ Gets the i-th eigenpair stored internally in the multi-communicator to which the calling process belongs. Parameters ---------- i: int Index of the solution to be obtained. V: Vec Placeholder for the returned eigenvector. Returns ------- e: scalar The computed eigenvalue. Notes ----- The index ``i`` should be a value between ``0`` and ``n-1``, where ``n`` is the number of vectors in the local subinterval, see `getKrylovSchurSubcommInfo()`. """ cdef PetscScalar sval = 0 cdef PetscVec vec = V.vec if V is not None else NULL CHKERR( EPSKrylovSchurGetSubcommPairs(self.eps, i, &sval, vec) ) return toScalar(sval) def getKrylovSchurSubcommMats(self): """ Gets the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs. Returns ------- A: Mat The matrix associated with the eigensystem. B: Mat The second matrix in the case of generalized eigenproblems. Notes ----- This is the analog of `getOperators()`, but returns the matrices distributed differently (in the subcommunicator rather than in the parent communicator). These matrices should not be modified by the user. """ cdef Mat A = Mat() cdef Mat B = Mat() CHKERR( EPSKrylovSchurGetSubcommMats(self.eps, &A.mat, &B.mat) ) CHKERR( PetscINCREF(A.obj) ) CHKERR( PetscINCREF(B.obj) ) return (A, B) def updateKrylovSchurSubcommMats(self, s=1.0, a=1.0, Mat Au=None, t=1.0, b=1.0, Mat Bu=None, structure=None, globalup=False): """ Update the eigenproblem matrices stored internally in the subcommunicator to which the calling process belongs. Parameters ---------- s: float (real or complex) Scalar that multiplies the existing A matrix. a: float (real or complex) Scalar used in the axpy operation on A. Au: Mat, optional The matrix used in the axpy operation on A. t: float (real or complex) Scalar that multiplies the existing B matrix. b: float (real or complex) Scalar used in the axpy operation on B. Bu: Mat, optional The matrix used in the axpy operation on B. structure: `PETSc.Mat.Structure` enumerate Either same, different, or a subset of the non-zero sparsity pattern. globalup: bool Whether global matrices must be updated or not. Notes ----- This function modifies the eigenproblem matrices at subcommunicator level, and optionally updates the global matrices in the parent communicator. The updates are expressed as ``A <-- s*A + a*Au``, ``B <-- t*B + b*Bu``. It is possible to update one of the matrices, or both. The matrices `Au` and `Bu` must be equal in all subcommunicators. The `structure` flag is passed to the `PETSc.Mat.axpy()` operations to perform the updates. If `globalup` is True, communication is carried out to reconstruct the updated matrices in the parent communicator. """ cdef PetscMat Amat = Au.mat if Au is not None else NULL cdef PetscMat Bmat = Bu.mat if Bu is not None else NULL cdef PetscMatStructure vstr = matstructure(structure) cdef PetscBool tval = globalup CHKERR( EPSKrylovSchurUpdateSubcommMats(self.eps, s, a, Amat, t, b, Bmat, vstr, tval) ) def setKrylovSchurSubintervals(self, subint): """ Sets the subinterval boundaries for spectrum slicing with a computational interval. Parameters ---------- subint: list of float Real values specifying subintervals Notes ----- This function must be called after setKrylovSchurPartitions(). For npart partitions, the argument subint must contain npart+1 real values sorted in ascending order: subint_0, subint_1, ..., subint_npart, where the first and last values must coincide with the interval endpoints set with EPSSetInterval(). The subintervals are then defined by two consecutive points: [subint_0,subint_1], [subint_1,subint_2], and so on. """ cdef PetscBool match = PETSC_FALSE CHKERR( PetscObjectTypeCompare(self.eps, EPSKRYLOVSCHUR, &match) ) if match == PETSC_FALSE: return cdef PetscReal *subintarray = NULL cdef Py_ssize_t i = 0, n = len(subint) cdef PetscInt nparts = 0 CHKERR( EPSKrylovSchurGetPartitions(self.eps, &nparts) ) assert n >= nparts cdef tmp = allocate(n*sizeof(PetscReal),&subintarray) for i in range(n): subintarray[i] = asReal(subint[i]) CHKERR( EPSKrylovSchurSetSubintervals(self.eps, subintarray) ) def getKrylovSchurSubintervals(self): """ Returns the points that delimit the subintervals used in spectrum slicing with several partitions. Returns ------- subint: list of float Real values specifying subintervals """ cdef PetscReal *subintarray = NULL cdef PetscInt nparts = 0 CHKERR( EPSKrylovSchurGetPartitions(self.eps, &nparts) ) CHKERR( EPSKrylovSchurGetSubintervals(self.eps, &subintarray) ) cdef object subint = None try: subint = array_r(nparts+1, subintarray) finally: CHKERR( PetscFree(subintarray) ) return subint def getKrylovSchurInertias(self): """ Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval. Returns ------- shifts: list of float The values of the shifts used internally in the solver. inertias: list of int The values of the inertia in each shift. """ cdef PetscReal *shiftsarray = NULL cdef PetscInt *inertiasarray = NULL cdef PetscInt n = 0 CHKERR(EPSKrylovSchurGetInertias(self.eps, &n, &shiftsarray, &inertiasarray)) cdef object shifts = None cdef object inertias = None try: shifts = array_r(n, shiftsarray) inertias = array_i(n, inertiasarray) finally: CHKERR( PetscFree(shiftsarray) ) CHKERR( PetscFree(inertiasarray) ) return (shifts, inertias) def getKrylovSchurKSP(self): """ Retrieve the linear solver object associated with the internal `EPS` object in case of doing spectrum slicing for a computational interval. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( EPSKrylovSchurGetKSP(self.eps, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp # def setGDKrylovStart(self, krylovstart=True): """ Activates or deactivates starting the search subspace with a Krylov basis. Parameters ---------- krylovstart: bool True if starting the search subspace with a Krylov basis. """ cdef PetscBool val = asBool(krylovstart) CHKERR( EPSGDSetKrylovStart(self.eps, val) ) def getGDKrylovStart(self): """ Gets a flag indicating if the search subspace is started with a Krylov basis. Returns ------- krylovstart: bool True if starting the search subspace with a Krylov basis. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGDGetKrylovStart(self.eps, &tval) ) return toBool(tval) def setGDBlockSize(self, bs): """ Sets the number of vectors to be added to the searching space in every iteration. Parameters ---------- bs: int The number of vectors added to the search space in every iteration. """ cdef PetscInt ival = asInt(bs) CHKERR( EPSGDSetBlockSize(self.eps, ival) ) def getGDBlockSize(self): """ Gets the number of vectors to be added to the searching space in every iteration. Returns ------- bs: int The number of vectors added to the search space in every iteration. """ cdef PetscInt ival = 0 CHKERR( EPSGDGetBlockSize(self.eps, &ival) ) return toInt(ival) def setGDRestart(self, minv=None, plusk=None): """ Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration. Parameters ---------- minv: int, optional The number of vectors of the search subspace after restart. plusk: int, optional The number of vectors saved from the previous iteration. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT if minv is not None: ival1 = asInt(minv) if plusk is not None: ival2 = asInt(plusk) CHKERR( EPSGDSetRestart(self.eps, ival1, ival2) ) def getGDRestart(self): """ Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration. Returns ------- minv: int The number of vectors of the search subspace after restart. plusk: int The number of vectors saved from the previous iteration. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 CHKERR( EPSGDGetRestart(self.eps, &ival1, &ival2) ) return (toInt(ival1), toInt(ival2)) def setGDInitialSize(self, initialsize): """ Sets the initial size of the searching space. Parameters ---------- initialsize: int The number of vectors of the initial searching subspace. """ cdef PetscInt ival = asInt(initialsize) CHKERR( EPSGDSetInitialSize(self.eps, ival) ) def getGDInitialSize(self): """ Gets the initial size of the searching space. Returns ------- initialsize: int The number of vectors of the initial searching subspace. """ cdef PetscInt ival = 0 CHKERR( EPSGDGetInitialSize(self.eps, &ival) ) return toInt(ival) def setGDBOrth(self, borth): """ Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems. Parameters ---------- borth: bool Whether to B-orthogonalize the search subspace. """ cdef PetscBool tval = asBool(borth) CHKERR( EPSGDSetBOrth(self.eps, tval) ) def getGDBOrth(self): """ Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems. Returns ------- borth: bool Whether to B-orthogonalize the search subspace. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGDGetBOrth(self.eps, &tval) ) return toBool(tval) def setGDDoubleExpansion(self, doubleexp): """ Activate a variant where the search subspace is expanded with K*[A*x B*x] (double expansion) instead of the classic K*r, where K is the preconditioner, x the selected approximate eigenvector and r its associated residual vector. Parameters ---------- doubleexp: bool True if using double expansion. """ cdef PetscBool val = asBool(doubleexp) CHKERR( EPSGDSetDoubleExpansion(self.eps, val) ) def getGDDoubleExpansion(self): """ Gets a flag indicating whether the double expansion variant has been activated or not. Returns ------- doubleexp: bool True if using double expansion. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSGDGetDoubleExpansion(self.eps, &tval) ) return toBool(tval) # def setJDKrylovStart(self, krylovstart=True): """ Activates or deactivates starting the search subspace with a Krylov basis. Parameters ---------- krylovstart: bool True if starting the search subspace with a Krylov basis. """ cdef PetscBool val = asBool(krylovstart) CHKERR( EPSJDSetKrylovStart(self.eps, val) ) def getJDKrylovStart(self): """ Gets a flag indicating if the search subspace is started with a Krylov basis. Returns ------- krylovstart: bool True if starting the search subspace with a Krylov basis. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSJDGetKrylovStart(self.eps, &tval) ) return toBool(tval) def setJDBlockSize(self, bs): """ Sets the number of vectors to be added to the searching space in every iteration. Parameters ---------- bs: int The number of vectors added to the search space in every iteration. """ cdef PetscInt ival = asInt(bs) CHKERR( EPSJDSetBlockSize(self.eps, ival) ) def getJDBlockSize(self): """ Gets the number of vectors to be added to the searching space in every iteration. Returns ------- bs: int The number of vectors added to the search space in every iteration. """ cdef PetscInt ival = 0 CHKERR( EPSJDGetBlockSize(self.eps, &ival) ) return toInt(ival) def setJDRestart(self, minv=None, plusk=None): """ Sets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration. Parameters ---------- minv: int, optional The number of vectors of the search subspace after restart. plusk: int, optional The number of vectors saved from the previous iteration. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT if minv is not None: ival1 = asInt(minv) if plusk is not None: ival2 = asInt(plusk) CHKERR( EPSJDSetRestart(self.eps, ival1, ival2) ) def getJDRestart(self): """ Gets the number of vectors of the search space after restart and the number of vectors saved from the previous iteration. Returns ------- minv: int The number of vectors of the search subspace after restart. plusk: int The number of vectors saved from the previous iteration. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 CHKERR( EPSJDGetRestart(self.eps, &ival1, &ival2) ) return (toInt(ival1), toInt(ival2)) def setJDInitialSize(self, initialsize): """ Sets the initial size of the searching space. Parameters ---------- initialsize: int The number of vectors of the initial searching subspace. """ cdef PetscInt ival = asInt(initialsize) CHKERR( EPSJDSetInitialSize(self.eps, ival) ) def getJDInitialSize(self): """ Gets the initial size of the searching space. Returns ------- initialsize: int The number of vectors of the initial searching subspace. """ cdef PetscInt ival = 0 CHKERR( EPSJDGetInitialSize(self.eps, &ival) ) return toInt(ival) def setJDFix(self, fix): """ Sets the threshold for changing the target in the correction equation. Parameters ---------- fix: float The threshold for changing the target. Notes ----- The target in the correction equation is fixed at the first iterations. When the norm of the residual vector is lower than the fix value, the target is set to the corresponding eigenvalue. """ cdef PetscReal val = asReal(fix) CHKERR( EPSJDSetFix(self.eps, val) ) def getJDFix(self): """ Gets the threshold for changing the target in the correction equation. Returns ------- fix: float The threshold for changing the target. """ cdef PetscReal val = 0 CHKERR( EPSJDGetFix(self.eps, &val) ) return toReal(val) def setJDConstCorrectionTol(self, constant): """ Deactivates the dynamic stopping criterion that sets the `KSP` relative tolerance to `0.5**i`, where `i` is the number of `EPS` iterations from the last converged value. Parameters ---------- constant: bool If False, the `KSP` relative tolerance is set to `0.5**i`. """ cdef PetscBool tval = asBool(constant) CHKERR( EPSJDSetConstCorrectionTol(self.eps, tval) ) def getJDConstCorrectionTol(self): """ Returns the flag indicating if the dynamic stopping is being used for solving the correction equation. Returns ------- constant: bool Flag indicating if the dynamic stopping criterion is not being used. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSJDGetConstCorrectionTol(self.eps, &tval) ) return toBool(tval) def setJDBOrth(self, borth): """ Selects the orthogonalization that will be used in the search subspace in case of generalized Hermitian problems. Parameters ---------- borth: bool Whether to B-orthogonalize the search subspace. """ cdef PetscBool tval = asBool(borth) CHKERR( EPSJDSetBOrth(self.eps, tval) ) def getJDBOrth(self): """ Returns the orthogonalization used in the search subspace in case of generalized Hermitian problems. Returns ------- borth: bool Whether to B-orthogonalize the search subspace. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSJDGetBOrth(self.eps, &tval) ) return toBool(tval) # def setRQCGReset(self, nrest): """ Sets the reset parameter of the RQCG iteration. Every nrest iterations, the solver performs a Rayleigh-Ritz projection step. Parameters ---------- nrest: int The number of iterations between resets. """ cdef PetscInt val = asInt(nrest) CHKERR( EPSRQCGSetReset(self.eps, val) ) def getRQCGReset(self): """ Gets the reset parameter used in the RQCG method. Returns ------- nrest: int The number of iterations between resets. """ cdef PetscInt val = 0 CHKERR( EPSRQCGGetReset(self.eps, &val) ) return toInt(val) def setLOBPCGBlockSize(self, bs): """ Sets the block size of the LOBPCG method. Parameters ---------- bs: int The block size. """ cdef PetscInt ival = asInt(bs) CHKERR( EPSLOBPCGSetBlockSize(self.eps, ival) ) def getLOBPCGBlockSize(self): """ Gets the block size used in the LOBPCG method. Returns ------- bs: int The block size. """ cdef PetscInt ival = 0 CHKERR( EPSLOBPCGGetBlockSize(self.eps, &ival) ) return toInt(ival) def setLOBPCGRestart(self, restart): """ Sets the restart parameter for the LOBPCG method. The meaning of this parameter is the proportion of vectors within the current block iterate that must have converged in order to force a restart with hard locking. Parameters ---------- restart: float The percentage of the block of vectors to force a restart. Notes ----- Allowed values are in the range [0.1,1.0]. The default is 0.9. """ cdef PetscReal val = asReal(restart) CHKERR( EPSLOBPCGSetRestart(self.eps, val) ) def getLOBPCGRestart(self): """ Gets the restart parameter used in the LOBPCG method. Returns ------- restart: float The restart parameter. """ cdef PetscReal val = 0 CHKERR( EPSLOBPCGGetRestart(self.eps, &val) ) return toReal(val) def setLOBPCGLocking(self, lock): """ Choose between locking and non-locking variants of the LOBPCG method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- This flag refers to soft locking (converged vectors within the current block iterate), since hard locking is always used (when nev is larger than the block size). """ cdef PetscBool val = asBool(lock) CHKERR( EPSLOBPCGSetLocking(self.eps, val) ) def getLOBPCGLocking(self): """ Gets the locking flag used in the LOBPCG method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSLOBPCGGetLocking(self.eps, &tval) ) return toBool(tval) def setLyapIIRanks(self, rkc=None, rkl=None): """ Set the ranks used in the solution of the Lyapunov equation. Parameters ---------- rkc: int, optional The compressed rank. rkl: int, optional The Lyapunov rank. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT if rkc is not None: ival1 = asInt(rkc) if rkl is not None: ival2 = asInt(rkl) CHKERR( EPSLyapIISetRanks(self.eps, ival1, ival2) ) def getLyapIIRanks(self): """ Return the rank values used for the Lyapunov step. Returns ------- rkc: int The compressed rank. rkl: int The Lyapunov rank. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 CHKERR( EPSLyapIIGetRanks(self.eps, &ival1, &ival2) ) return (toInt(ival1), toInt(ival2)) # def setCISSExtraction(self, extraction): """ Sets the extraction technique used in the CISS solver. Parameters ---------- extraction: `EPS.CISSExtraction` enumerate The extraction technique. """ cdef SlepcEPSCISSExtraction val = extraction CHKERR( EPSCISSSetExtraction(self.eps, val) ) def getCISSExtraction(self): """ Gets the extraction technique used in the CISS solver. Returns ------- extraction: `EPS.CISSExtraction` enumerate The extraction technique. """ cdef SlepcEPSCISSExtraction val = EPS_CISS_EXTRACTION_RITZ CHKERR( EPSCISSGetExtraction(self.eps, &val) ) return val def setCISSQuadRule(self, quad): """ Sets the quadrature rule used in the CISS solver. Parameters ---------- quad: `EPS.CISSQuadRule` enumerate The quadrature rule. """ cdef SlepcEPSCISSQuadRule val = quad CHKERR( EPSCISSSetQuadRule(self.eps, val) ) def getCISSQuadRule(self): """ Gets the quadrature rule used in the CISS solver. Returns ------- quad: `EPS.CISSQuadRule` enumerate The quadrature rule. """ cdef SlepcEPSCISSQuadRule val = EPS_CISS_QUADRULE_TRAPEZOIDAL CHKERR( EPSCISSGetQuadRule(self.eps, &val) ) return val def setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False): """ Sets the values of various size parameters in the CISS solver. Parameters ---------- ip: int, optional Number of integration points. bs: int, optional Block size. ms: int, optional Moment size. npart: int, optional Number of partitions when splitting the communicator. bsmax: int, optional Maximum block size. realmats: bool, optional True if A and B are real. Notes ----- The default number of partitions is 1. This means the internal `KSP` object is shared among all processes of the `EPS` communicator. Otherwise, the communicator is split into npart communicators, so that `npart` `KSP` solves proceed simultaneously. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT cdef PetscInt ival4 = PETSC_DEFAULT cdef PetscInt ival5 = PETSC_DEFAULT cdef PetscBool bval = asBool(realmats) if ip is not None: ival1 = asInt(ip) if bs is not None: ival2 = asInt(bs) if ms is not None: ival3 = asInt(ms) if npart is not None: ival4 = asInt(npart) if bsmax is not None: ival5 = asInt(bsmax) CHKERR( EPSCISSSetSizes(self.eps, ival1, ival2, ival3, ival4, ival5, bval) ) def getCISSSizes(self): """ Gets the values of various size parameters in the CISS solver. Returns ------- ip: int Number of integration points. bs: int Block size. ms: int Moment size. npart: int Number of partitions when splitting the communicator. bsmax: int Maximum block size. realmats: bool True if A and B are real. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 cdef PetscInt ival4 = 0 cdef PetscInt ival5 = 0 cdef PetscBool bval = PETSC_FALSE CHKERR( EPSCISSGetSizes(self.eps, &ival1, &ival2, &ival3, &ival4, &ival5, &bval) ) return (toInt(ival1), toInt(ival2), toInt(ival3), toInt(ival4), toInt(ival5), toBool(bval)) def setCISSThreshold(self, delta=None, spur=None): """ Sets the values of various threshold parameters in the CISS solver. Parameters ---------- delta: float Threshold for numerical rank. spur: float Spurious threshold (to discard spurious eigenpairs). """ cdef PetscReal rval1 = PETSC_DEFAULT cdef PetscReal rval2 = PETSC_DEFAULT if delta is not None: rval1 = asReal(delta) if spur is not None: rval2 = asReal(spur) CHKERR( EPSCISSSetThreshold(self.eps, rval1, rval2) ) def getCISSThreshold(self): """ Gets the values of various threshold parameters in the CISS solver. Returns ------- delta: float Threshold for numerical rank. spur: float Spurious threshold (to discard spurious eigenpairs. """ cdef PetscReal delta = 0 cdef PetscReal spur = 0 CHKERR( EPSCISSGetThreshold(self.eps, &delta, &spur) ) return (toReal(delta), toReal(spur)) def setCISSRefinement(self, inner=None, blsize=None): """ Sets the values of various refinement parameters in the CISS solver. Parameters ---------- inner: int, optional Number of iterative refinement iterations (inner loop). blsize: int, optional Number of iterative refinement iterations (blocksize loop). """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT if inner is not None: ival1 = asInt(inner) if blsize is not None: ival2 = asInt(blsize) CHKERR( EPSCISSSetRefinement(self.eps, ival1, ival2) ) def getCISSRefinement(self): """ Gets the values of various refinement parameters in the CISS solver. Returns ------- inner: int Number of iterative refinement iterations (inner loop). blsize: int Number of iterative refinement iterations (blocksize loop). """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 CHKERR( EPSCISSGetRefinement(self.eps, &ival1, &ival2) ) return (toInt(ival1), toInt(ival2)) def setCISSUseST(self, usest): """ Sets a flag indicating that the CISS solver will use the `ST` object for the linear solves. Parameters ---------- usest: bool Whether to use the `ST` object or not. """ cdef PetscBool tval = asBool(usest) CHKERR( EPSCISSSetUseST(self.eps, tval) ) def getCISSUseST(self): """ Gets the flag for using the `ST` object in the CISS solver. Returns ------- usest: bool Whether to use the `ST` object or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( EPSCISSGetUseST(self.eps, &tval) ) return toBool(tval) def getCISSKSPs(self): """ Retrieve the array of linear solver objects associated with the CISS solver. Returns ------- ksp: list of `KSP` The linear solver objects. Notes ----- The number of `KSP` solvers is equal to the number of integration points divided by the number of partitions. This value is halved in the case of real matrices with a region centered at the real axis. """ cdef PetscInt i = 0, n = 0 cdef PetscKSP *p = NULL CHKERR( EPSCISSGetKSPs(self.eps, &n, &p) ) return [ref_KSP(p[i]) for i from 0 <= i &self.fn self.fn = NULL def view(self, Viewer viewer=None): """ Prints the FN data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( FNView(self.fn, vwr) ) def destroy(self): """ Destroys the FN object. """ CHKERR( FNDestroy(&self.fn) ) self.fn = NULL return self def create(self, comm=None): """ Creates the FN object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcFN newfn = NULL CHKERR( FNCreate(ccomm, &newfn) ) CHKERR( SlepcCLEAR(self.obj) ); self.fn = newfn return self def setType(self, fn_type): """ Selects the type for the FN object. Parameters ---------- fn_type: `FN.Type` enumerate The inner product type to be used. """ cdef SlepcFNType cval = NULL fn_type = str2bytes(fn_type, &cval) CHKERR( FNSetType(self.fn, cval) ) def getType(self): """ Gets the FN type of this object. Returns ------- type: `FN.Type` enumerate The inner product type currently being used. """ cdef SlepcFNType fn_type = NULL CHKERR( FNGetType(self.fn, &fn_type) ) return bytes2str(fn_type) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all FN options in the database. Parameters ---------- prefix: string The prefix string to prepend to all FN option requests. Notes ----- A hyphen (``-``) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( FNSetOptionsPrefix(self.fn, cval) ) def getOptionsPrefix(self): """ Gets the prefix used for searching for all FN options in the database. Returns ------- prefix: string The prefix string set for this FN object. """ cdef const_char *prefix = NULL CHKERR( FNGetOptionsPrefix(self.fn, &prefix) ) return bytes2str(prefix) def setFromOptions(self): """ Sets FN options from the options database. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( FNSetFromOptions(self.fn) ) def duplicate(self, comm=None): """ Duplicate the FN object copying all parameters, possibly with a different communicator. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to the object's communicator. """ cdef MPI_Comm ccomm = def_Comm(comm, PetscObjectComm(self.fn)) cdef FN fn = type(self)() CHKERR( FNDuplicate(self.fn, ccomm, &fn.fn) ) return fn # def evaluateFunction(self, x): """ Computes the value of the function f(x) for a given x. Parameters ---------- x: scalar Value where the function must be evaluated. Returns ------- y: scalar The result of f(x). """ cdef PetscScalar sval = 0 CHKERR( FNEvaluateFunction(self.fn, x, &sval) ) return toScalar(sval) def evaluateDerivative(self, x): """ Computes the value of the derivative f'(x) for a given x. Parameters ---------- x: scalar Value where the derivative must be evaluated. Returns ------- y: scalar The result of f'(x). """ cdef PetscScalar sval = 0 CHKERR( FNEvaluateDerivative(self.fn, x, &sval) ) return toScalar(sval) def evaluateFunctionMat(self, Mat A, Mat B=None): """ Computes the value of the function f(A) for a given matrix A. Parameters ---------- A: Mat Matrix on which the function must be evaluated. B: Mat, optional Placeholder for the result. Returns ------- B: Mat The result of f(A). """ if B is None: B = A.duplicate() CHKERR( FNEvaluateFunctionMat(self.fn, A.mat, B.mat) ) return B def evaluateFunctionMatVec(self, Mat A, Vec v=None): """ Computes the first column of the matrix f(A) for a given matrix A. Parameters ---------- A: Mat Matrix on which the function must be evaluated. Returns ------- v: Vec The first column of the result f(A). """ if v is None: v = A.createVecs('left') CHKERR( FNEvaluateFunctionMatVec(self.fn, A.mat, v.vec) ) return v def setScale(self, alpha=None, beta=None): """ Sets the scaling parameters that define the matematical function. Parameters ---------- alpha: scalar (possibly complex), optional Inner scaling (argument), default is 1.0. beta: scalar (possibly complex), optional Outer scaling (result), default is 1.0. """ cdef PetscScalar aval = 1.0 cdef PetscScalar bval = 1.0 if alpha is not None: aval = asScalar(alpha) if beta is not None: bval = asScalar(beta) CHKERR( FNSetScale(self.fn, aval, bval) ) def getScale(self): """ Gets the scaling parameters that define the matematical function. Returns ------- alpha: scalar (possibly complex) Inner scaling (argument). beta: scalar (possibly complex) Outer scaling (result). """ cdef PetscScalar aval = 0, bval = 0 CHKERR( FNGetScale(self.fn, &aval, &bval) ) return (toScalar(aval), toScalar(bval)) def setMethod(self, meth): """ Selects the method to be used to evaluate functions of matrices. Parameters ---------- meth: int An index identifying the method. Notes ----- In some `FN` types there are more than one algorithms available for computing matrix functions. In that case, this function allows choosing the wanted method. If `meth` is currently set to 0 and the input argument of `FN.evaluateFunctionMat()` is a symmetric/Hermitian matrix, then the computation is done via the eigendecomposition, rather than with the general algorithm. """ cdef PetscInt val = asInt(meth) CHKERR( FNSetMethod(self.fn, val) ) def getMethod(self): """ Gets the method currently used for matrix functions. Returns ------- meth: int An index identifying the method. """ cdef PetscInt val = 0 CHKERR( FNGetMethod(self.fn, &val) ) return toInt(val) def setParallel(self, pmode): """ Selects the mode of operation in parallel runs. Parameters ---------- pmode: `FN.ParallelType` enumerate The parallel mode. """ cdef SlepcFNParallelType val = pmode CHKERR( FNSetParallel(self.fn, val) ) def getParallel(self): """ Gets the mode of operation in parallel runs. Returns ------- pmode: `FN.ParallelType` enumerate The parallel mode. """ cdef SlepcFNParallelType val = FN_PARALLEL_REDUNDANT CHKERR( FNGetParallel(self.fn, &val) ) return val # def setRationalNumerator(self, alpha): """ Sets the coefficients of the numerator of the rational function. Parameters ---------- alpha: array of scalars Coefficients. """ cdef PetscInt na = 0 cdef PetscScalar *a = NULL cdef object tmp1 = iarray_s(alpha, &na, &a) CHKERR( FNRationalSetNumerator(self.fn, na, a) ) def getRationalNumerator(self): """ Gets the coefficients of the numerator of the rational function. Returns ------- alpha: array of scalars Coefficients. """ cdef PetscInt np = 0 cdef PetscScalar *coeff = NULL CHKERR( FNRationalGetNumerator(self.fn, &np, &coeff) ) cdef object ocoeff = None try: ocoeff = array_s(np, coeff) finally: CHKERR( PetscFree(coeff) ) return ocoeff def setRationalDenominator(self, alpha): """ Sets the coefficients of the denominator of the rational function. Parameters ---------- alpha: array of scalars Coefficients. """ cdef PetscInt na = 0 cdef PetscScalar *a = NULL cdef object tmp1 = iarray_s(alpha, &na, &a) CHKERR( FNRationalSetDenominator(self.fn, na, a) ) def getRationalDenominator(self): """ Gets the coefficients of the denominator of the rational function. Returns ------- alpha: array of scalars Coefficients. """ cdef PetscInt np = 0 cdef PetscScalar *coeff = NULL CHKERR( FNRationalGetDenominator(self.fn, &np, &coeff) ) cdef object ocoeff = None try: ocoeff = array_s(np, coeff) finally: CHKERR( PetscFree(coeff) ) return ocoeff def setCombineChildren(self, comb, FN f1, FN f2): """ Sets the two child functions that constitute this combined function, and the way they must be combined. Parameters ---------- comb: `FN.CombineType` enumerate How to combine the functions (addition, multiplication, division, composition). f1: FN First function. f2: FN Second function. """ cdef SlepcFNCombineType val = comb CHKERR( FNCombineSetChildren(self.fn, val, f1.fn, f2.fn) ) def getCombineChildren(self): """ Gets the two child functions that constitute this combined function, and the way they must be combined. Returns ------- comb: `FN.CombineType` enumerate How to combine the functions (addition, multiplication, division, composition). f1: FN First function. f2: FN Second function. """ cdef SlepcFNCombineType comb cdef FN f1 = FN() cdef FN f2 = FN() CHKERR( FNCombineGetChildren(self.fn, &comb, &f1.fn, &f2.fn) ) CHKERR( PetscINCREF(f1.obj) ) CHKERR( PetscINCREF(f2.obj) ) return (comb, f1, f2) def setPhiIndex(self, k): """ Sets the index of the phi-function. Parameters ---------- k: int The index. """ cdef PetscInt val = asInt(k) CHKERR( FNPhiSetIndex(self.fn, val) ) def getPhiIndex(self): """ Gets the index of the phi-function. Returns ------- k: int The index. """ cdef PetscInt val = 0 CHKERR( FNPhiGetIndex(self.fn, &val) ) return toInt(val) # property method: def __get__(self): return self.getMethod() def __set__(self, value): self.setMethod(value) property parallel: def __get__(self): return self.getParallel() def __set__(self, value): self.setParallel(value) # ----------------------------------------------------------------------------- del FNType del FNCombineType del FNParallelType # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/MFN.pyx000066400000000000000000000275141454104675500200170ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class MFNType(object): """ MFN type Action of a matrix function on a vector. - `KRYLOV`: Restarted Krylov solver. - `EXPOKIT`: Implementation of the method in Expokit. """ KRYLOV = S_(MFNKRYLOV) EXPOKIT = S_(MFNEXPOKIT) class MFNConvergedReason(object): CONVERGED_TOL = MFN_CONVERGED_TOL CONVERGED_ITS = MFN_CONVERGED_ITS DIVERGED_ITS = MFN_DIVERGED_ITS DIVERGED_BREAKDOWN = MFN_DIVERGED_BREAKDOWN CONVERGED_ITERATING = MFN_CONVERGED_ITERATING ITERATING = MFN_CONVERGED_ITERATING # ----------------------------------------------------------------------------- cdef class MFN(Object): """ MFN """ Type = MFNType ConvergedReason = MFNConvergedReason def __cinit__(self): self.obj = &self.mfn self.mfn = NULL def view(self, Viewer viewer=None): """ Prints the MFN data structure. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( MFNView(self.mfn, vwr) ) def destroy(self): """ Destroys the MFN object. """ CHKERR( MFNDestroy(&self.mfn) ) self.mfn = NULL return self def reset(self): """ Resets the MFN object. """ CHKERR( MFNReset(self.mfn) ) def create(self, comm=None): """ Creates the MFN object. Parameters ---------- comm: Comm, optional. MPI communicator. If not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcMFN newmfn = NULL CHKERR( MFNCreate(ccomm, &newmfn) ) CHKERR( SlepcCLEAR(self.obj) ); self.mfn = newmfn return self def setType(self, mfn_type): """ Selects the particular solver to be used in the MFN object. Parameters ---------- mfn_type: `MFN.Type` enumerate The solver to be used. """ cdef SlepcMFNType cval = NULL mfn_type = str2bytes(mfn_type, &cval) CHKERR( MFNSetType(self.mfn, cval) ) def getType(self): """ Gets the MFN type of this object. Returns ------- type: `MFN.Type` enumerate The solver currently being used. """ cdef SlepcMFNType mfn_type = NULL CHKERR( MFNGetType(self.mfn, &mfn_type) ) return bytes2str(mfn_type) def getOptionsPrefix(self): """ Gets the prefix used for searching for all MFN options in the database. Returns ------- prefix: string The prefix string set for this MFN object. """ cdef const_char *prefix = NULL CHKERR( MFNGetOptionsPrefix(self.mfn, &prefix) ) return bytes2str(prefix) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all MFN options in the database. Parameters ---------- prefix: string The prefix string to prepend to all MFN option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( MFNSetOptionsPrefix(self.mfn, cval) ) def appendOptionsPrefix(self, prefix): """ Appends to the prefix used for searching for all MFN options in the database. Parameters ---------- prefix: string The prefix string to prepend to all MFN option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( MFNAppendOptionsPrefix(self.mfn, cval) ) def setFromOptions(self): """ Sets MFN options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. """ CHKERR( MFNSetFromOptions(self.mfn) ) def getTolerances(self): """ Gets the tolerance and maximum iteration count used by the default MFN convergence tests. Returns ------- tol: float The convergence tolerance. max_it: int The maximum number of iterations """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( MFNGetTolerances(self.mfn, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setTolerances(self, tol=None, max_it=None): """ Sets the tolerance and maximum iteration count used by the default MFN convergence tests. Parameters ---------- tol: float, optional The convergence tolerance. max_it: int, optional The maximum number of iterations """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if max_it is not None: ival = asInt(max_it) CHKERR( MFNSetTolerances(self.mfn, rval, ival) ) def getDimensions(self): """ Gets the dimension of the subspace used by the solver. Returns ------- ncv: int Maximum dimension of the subspace to be used by the solver. """ cdef PetscInt ival = 0 CHKERR( MFNGetDimensions(self.mfn, &ival) ) return toInt(ival) def setDimensions(self, ncv): """ Sets the dimension of the subspace to be used by the solver. Parameters ---------- ncv: int Maximum dimension of the subspace to be used by the solver. """ cdef PetscInt ival = asInt(ncv) CHKERR( MFNSetDimensions(self.mfn, ival) ) def getFN(self): """ Obtain the math function object associated to the MFN object. Returns ------- fn: FN The math function context. """ cdef FN fn = FN() CHKERR( MFNGetFN(self.mfn, &fn.fn) ) CHKERR( PetscINCREF(fn.obj) ) return fn def setFN(self, FN fn): """ Associates a math function object to the MFN object. Parameters ---------- fn: FN The math function context. """ CHKERR( MFNSetFN(self.mfn, fn.fn) ) def getBV(self): """ Obtain the basis vector object associated to the MFN object. Returns ------- bv: BV The basis vectors context. """ cdef BV bv = BV() CHKERR( MFNGetBV(self.mfn, &bv.bv) ) CHKERR( PetscINCREF(bv.obj) ) return bv def setBV(self, BV bv): """ Associates a basis vector object to the MFN object. Parameters ---------- bv: BV The basis vectors context. """ CHKERR( MFNSetBV(self.mfn, bv.bv) ) def getOperator(self): """ Gets the matrix associated with the MFN object. Returns ------- A: Mat The matrix for which the matrix function is to be computed. """ cdef Mat A = Mat() CHKERR( MFNGetOperator(self.mfn, &A.mat) ) CHKERR( PetscINCREF(A.obj) ) return A def setOperator(self, Mat A): """ Sets the matrix associated with the MFN object. Parameters ---------- A: Mat The problem matrix. """ CHKERR( MFNSetOperator(self.mfn, A.mat) ) # def setMonitor(self, monitor, args=None, kargs=None): """ Appends a monitor function to the list of monitors. """ if monitor is None: return cdef object monitorlist = self.get_attr('__monitor__') if monitorlist is None: monitorlist = [] self.set_attr('__monitor__', monitorlist) CHKERR( MFNMonitorSet(self.mfn, MFN_Monitor, NULL, NULL) ) if args is None: args = () if kargs is None: kargs = {} monitorlist.append((monitor, args, kargs)) def getMonitor(self): """ Gets the list of monitor functions. """ return self.get_attr('__monitor__') def cancelMonitor(self): """ Clears all monitors for an `MFN` object. """ CHKERR( MFNMonitorCancel(self.mfn) ) self.set_attr('__monitor__', None) # def setUp(self): """ Sets up all the internal data structures necessary for the execution of the eigensolver. """ CHKERR( MFNSetUp(self.mfn) ) def solve(self, Vec b, Vec x): """ Solves the matrix function problem. Given a vector b, the vector x = f(A)*b is returned. Parameters ---------- b: Vec The right hand side vector. x: Vec The solution. """ CHKERR( MFNSolve(self.mfn, b.vec, x.vec) ) def solveTranspose(self, Vec b, Vec x): """ Solves the transpose matrix function problem. Given a vector b, the vector x = f(A^T)*b is returned. Parameters ---------- b: Vec The right hand side vector. x: Vec The solution. """ CHKERR( MFNSolveTranspose(self.mfn, b.vec, x.vec) ) def getIterationNumber(self): """ Gets the current iteration number. If the call to `solve()` is complete, then it returns the number of iterations carried out by the solution method. Returns ------- its: int Iteration number. """ cdef PetscInt ival = 0 CHKERR( MFNGetIterationNumber(self.mfn, &ival) ) return toInt(ival) def getConvergedReason(self): """ Gets the reason why the `solve()` iteration was stopped. Returns ------- reason: `MFN.ConvergedReason` enumerate Negative value indicates diverged, positive value converged. """ cdef SlepcMFNConvergedReason val = MFN_CONVERGED_ITERATING CHKERR( MFNGetConvergedReason(self.mfn, &val) ) return val def setErrorIfNotConverged(self, flg=True): """ Causes `solve()` to generate an error if the solver has not converged. Parameters ---------- flg: bool True indicates you want the error generated. """ cdef PetscBool tval = flg CHKERR( MFNSetErrorIfNotConverged(self.mfn, tval) ) def getErrorIfNotConverged(self): """ Return a flag indicating whether `solve()` will generate an error if the solver does not converge. Returns ------- flg: bool True indicates you want the error generated. """ cdef PetscBool tval = PETSC_FALSE CHKERR( MFNGetErrorIfNotConverged(self.mfn, &tval) ) return toBool(tval) # property tol: def __get__(self): return self.getTolerances()[0] def __set__(self, value): self.setTolerances(tol=value) property max_it: def __get__(self): return self.getTolerances()[1] def __set__(self, value): self.setTolerances(max_it=value) property fn: def __get__(self): return self.getFN() def __set__(self, value): self.setBV(value) property bv: def __get__(self): return self.getFN() def __set__(self, value): self.setBV(value) # ----------------------------------------------------------------------------- del MFNType del MFNConvergedReason # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/NEP.pyx000066400000000000000000001667721454104675500200330ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class NEPType(object): """ NEP type Nonlinear eigensolvers. - `RII`: Residual inverse iteration. - `SLP`: Successive linear problems. - `NARNOLDI`: Nonlinear Arnoldi. - `CISS`: Contour integral spectrum slice. - `INTERPOL`: Polynomial interpolation. - `NLEIGS`: Fully rational Krylov method for nonlinear eigenproblems. """ RII = S_(NEPRII) SLP = S_(NEPSLP) NARNOLDI = S_(NEPNARNOLDI) CISS = S_(NEPCISS) INTERPOL = S_(NEPINTERPOL) NLEIGS = S_(NEPNLEIGS) class NEPProblemType(object): """ NEP problem type - `GENERAL`: General nonlinear eigenproblem. - `RATIONAL`: NEP defined in split form with all f_i rational. """ GENERAL = NEP_GENERAL RATIONAL = NEP_RATIONAL class NEPErrorType(object): """ NEP error type to assess accuracy of computed solutions - `ABSOLUTE`: Absolute error. - `RELATIVE`: Relative error. - `BACKWARD`: Backward error. """ ABSOLUTE = NEP_ERROR_ABSOLUTE RELATIVE = NEP_ERROR_RELATIVE BACKWARD = NEP_ERROR_BACKWARD class NEPWhich(object): """ NEP desired part of spectrum - `LARGEST_MAGNITUDE`: Largest magnitude (default). - `SMALLEST_MAGNITUDE`: Smallest magnitude. - `LARGEST_REAL`: Largest real parts. - `SMALLEST_REAL`: Smallest real parts. - `LARGEST_IMAGINARY`: Largest imaginary parts in magnitude. - `SMALLEST_IMAGINARY`: Smallest imaginary parts in magnitude. - `TARGET_MAGNITUDE`: Closest to target (in magnitude). - `TARGET_REAL`: Real part closest to target. - `TARGET_IMAGINARY`: Imaginary part closest to target. - `ALL`: All eigenvalues in a region. - `USER`: User defined selection. """ LARGEST_MAGNITUDE = NEP_LARGEST_MAGNITUDE SMALLEST_MAGNITUDE = NEP_SMALLEST_MAGNITUDE LARGEST_REAL = NEP_LARGEST_REAL SMALLEST_REAL = NEP_SMALLEST_REAL LARGEST_IMAGINARY = NEP_LARGEST_IMAGINARY SMALLEST_IMAGINARY = NEP_SMALLEST_IMAGINARY TARGET_MAGNITUDE = NEP_TARGET_MAGNITUDE TARGET_REAL = NEP_TARGET_REAL TARGET_IMAGINARY = NEP_TARGET_IMAGINARY ALL = NEP_ALL USER = NEP_WHICH_USER class NEPConvergedReason(object): """ NEP convergence reasons - `CONVERGED_TOL`: All eigenpairs converged to requested tolerance. - `CONVERGED_USER`: User-defined convergence criterion satisfied. - `DIVERGED_ITS`: Maximum number of iterations exceeded. - `DIVERGED_BREAKDOWN`: Solver failed due to breakdown. - `DIVERGED_LINEAR_SOLVE`: Inner linear solve failed. - `DIVERGED_SUBSPACE_EXHAUSTED`: Run out of space for the basis in an unrestarted solver. - `CONVERGED_ITERATING`: Iteration not finished yet. """ CONVERGED_TOL = NEP_CONVERGED_TOL CONVERGED_USER = NEP_CONVERGED_USER DIVERGED_ITS = NEP_DIVERGED_ITS DIVERGED_BREAKDOWN = NEP_DIVERGED_BREAKDOWN DIVERGED_LINEAR_SOLVE = NEP_DIVERGED_LINEAR_SOLVE DIVERGED_SUBSPACE_EXHAUSTED = NEP_DIVERGED_SUBSPACE_EXHAUSTED CONVERGED_ITERATING = NEP_CONVERGED_ITERATING ITERATING = NEP_CONVERGED_ITERATING class NEPRefine(object): """ NEP refinement strategy - `NONE`: No refinement. - `SIMPLE`: Refine eigenpairs one by one. - `MULTIPLE`: Refine all eigenpairs simultaneously (invariant pair). """ NONE = NEP_REFINE_NONE SIMPLE = NEP_REFINE_SIMPLE MULTIPLE = NEP_REFINE_MULTIPLE class NEPRefineScheme(object): """ NEP scheme for solving linear systems during iterative refinement - `SCHUR`: Schur complement. - `MBE`: Mixed block elimination. - `EXPLICIT`: Build the explicit matrix. """ SCHUR = NEP_REFINE_SCHEME_SCHUR MBE = NEP_REFINE_SCHEME_MBE EXPLICIT = NEP_REFINE_SCHEME_EXPLICIT class NEPConv(object): """ NEP convergence test - `ABS`: Absolute convergence test. - `REL`: Convergence test relative to the eigenvalue. - `NORM`: Convergence test relative to the matrix norms. - `USER`: User-defined convergence test. """ ABS = NEP_CONV_ABS REL = NEP_CONV_REL NORM = NEP_CONV_NORM USER = NEP_CONV_USER class NEPStop(object): """ NEP stopping test - `BASIC`: Default stopping test. - `USER`: User-defined stopping test. """ BASIC = NEP_STOP_BASIC USER = NEP_STOP_USER class NEPCISSExtraction(object): """ NEP CISS extraction technique - `RITZ`: Ritz extraction. - `HANKEL`: Extraction via Hankel eigenproblem. - `CAA`: Communication-avoiding Arnoldi. """ RITZ = NEP_CISS_EXTRACTION_RITZ HANKEL = NEP_CISS_EXTRACTION_HANKEL CAA = NEP_CISS_EXTRACTION_CAA # ----------------------------------------------------------------------------- cdef class NEP(Object): """ NEP """ Type = NEPType ProblemType = NEPProblemType ErrorType = NEPErrorType Which = NEPWhich ConvergedReason = NEPConvergedReason Refine = NEPRefine RefineScheme = NEPRefineScheme Conv = NEPConv Stop = NEPStop CISSExtraction = NEPCISSExtraction def __cinit__(self): self.obj = &self.nep self.nep = NULL def view(self, Viewer viewer=None): """ Prints the NEP data structure. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( NEPView(self.nep, vwr) ) def destroy(self): """ Destroys the NEP object. """ CHKERR( NEPDestroy(&self.nep) ) self.nep = NULL return self def reset(self): """ Resets the NEP object. """ CHKERR( NEPReset(self.nep) ) def create(self, comm=None): """ Creates the NEP object. Parameters ---------- comm: Comm, optional. MPI communicator. If not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcNEP newnep = NULL CHKERR( NEPCreate(ccomm, &newnep) ) CHKERR( SlepcCLEAR(self.obj) ); self.nep = newnep return self def setType(self, nep_type): """ Selects the particular solver to be used in the NEP object. Parameters ---------- nep_type: `NEP.Type` enumerate The solver to be used. """ cdef SlepcNEPType cval = NULL nep_type = str2bytes(nep_type, &cval) CHKERR( NEPSetType(self.nep, cval) ) def getType(self): """ Gets the NEP type of this object. Returns ------- type: `NEP.Type` enumerate The solver currently being used. """ cdef SlepcNEPType nep_type = NULL CHKERR( NEPGetType(self.nep, &nep_type) ) return bytes2str(nep_type) def getOptionsPrefix(self): """ Gets the prefix used for searching for all NEP options in the database. Returns ------- prefix: string The prefix string set for this NEP object. """ cdef const_char *prefix = NULL CHKERR( NEPGetOptionsPrefix(self.nep, &prefix) ) return bytes2str(prefix) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all NEP options in the database. Parameters ---------- prefix: string The prefix string to prepend to all NEP option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( NEPSetOptionsPrefix(self.nep, cval) ) def appendOptionsPrefix(self, prefix): """ Appends to the prefix used for searching for all NEP options in the database. Parameters ---------- prefix: string The prefix string to prepend to all NEP option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( NEPAppendOptionsPrefix(self.nep, cval) ) def setFromOptions(self): """ Sets NEP options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. """ CHKERR( NEPSetFromOptions(self.nep) ) def getProblemType(self): """ Gets the problem type from the `NEP` object. Returns ------- problem_type: `NEP.ProblemType` enumerate The problem type that was previously set. """ cdef SlepcNEPProblemType val = NEP_GENERAL CHKERR( NEPGetProblemType(self.nep, &val) ) return val def setProblemType(self, problem_type): """ Specifies the type of the eigenvalue problem. Parameters ---------- problem_type: `NEP.ProblemType` enumerate The problem type to be set. """ cdef SlepcNEPProblemType val = problem_type CHKERR( NEPSetProblemType(self.nep, val) ) def getWhichEigenpairs(self): """ Returns which portion of the spectrum is to be sought. Returns ------- which: `NEP.Which` enumerate The portion of the spectrum to be sought by the solver. """ cdef SlepcNEPWhich val = NEP_LARGEST_MAGNITUDE CHKERR( NEPGetWhichEigenpairs(self.nep, &val) ) return val def setWhichEigenpairs(self, which): """ Specifies which portion of the spectrum is to be sought. Parameters ---------- which: `NEP.Which` enumerate The portion of the spectrum to be sought by the solver. """ cdef SlepcNEPWhich val = which CHKERR( NEPSetWhichEigenpairs(self.nep, val) ) def getTarget(self): """ Gets the value of the target. Returns ------- target: float (real or complex) The value of the target. Notes ----- If the target was not set by the user, then zero is returned. """ cdef PetscScalar sval = 0 CHKERR( NEPGetTarget(self.nep, &sval) ) return toScalar(sval) def setTarget(self, target): """ Sets the value of the target. Parameters ---------- target: float (real or complex) The value of the target. Notes ----- The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with `setWhichEigenpairs()`. """ cdef PetscScalar sval = asScalar(target) CHKERR( NEPSetTarget(self.nep, sval) ) def getTolerances(self): """ Gets the tolerance and maximum iteration count used by the default NEP convergence tests. Returns ------- tol: float The convergence tolerance. maxit: int The maximum number of iterations. """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( NEPGetTolerances(self.nep, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setTolerances(self, tol=None, maxit=None): """ Sets the tolerance and maximum iteration count used in convergence tests. Parameters ---------- tol: float, optional The convergence tolerance. maxit: int, optional The maximum number of iterations. """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if maxit is not None: ival = asInt(maxit) CHKERR( NEPSetTolerances(self.nep, rval, ival) ) def getConvergenceTest(self): """ Return the method used to compute the error estimate used in the convergence test. Returns ------- conv: NEP.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcNEPConv conv = NEP_CONV_REL CHKERR( NEPGetConvergenceTest(self.nep, &conv) ) return conv def setConvergenceTest(self, conv): """ Specifies how to compute the error estimate used in the convergence test. Parameters ---------- conv: NEP.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcNEPConv tconv = conv CHKERR( NEPSetConvergenceTest(self.nep, tconv) ) def getRefine(self): """ Gets the refinement strategy used by the NEP object, and the associated parameters. Returns ------- ref: NEP.Refine The refinement type. npart: int The number of partitions of the communicator. tol: real The convergence tolerance. its: int The maximum number of refinement iterations. scheme: NEP.RefineScheme Scheme for solving linear systems """ cdef SlepcNEPRefine ref = NEP_REFINE_NONE cdef PetscInt npart = 1 cdef PetscReal tol = PETSC_DEFAULT cdef PetscInt its = PETSC_DEFAULT cdef SlepcNEPRefineScheme scheme = NEP_REFINE_SCHEME_MBE CHKERR( NEPGetRefine(self.nep, &ref, &npart, &tol, &its, &scheme) ) return (ref, toInt(npart), toReal(tol), toInt(its), scheme) def setRefine(self, ref, npart=None, tol=None, its=None, scheme=None): """ Sets the refinement strategy used by the NEP object, and the associated parameters. Parameters ---------- ref: NEP.Refine The refinement type. npart: int, optional The number of partitions of the communicator. tol: real, optional The convergence tolerance. its: int, optional The maximum number of refinement iterations. scheme: NEP.RefineScheme, optional Scheme for linear system solves """ cdef SlepcNEPRefine tref = ref cdef PetscInt tnpart = 1 cdef PetscReal ttol = PETSC_DEFAULT cdef PetscInt tits = PETSC_DEFAULT cdef SlepcNEPRefineScheme tscheme = NEP_REFINE_SCHEME_MBE if npart is not None: tnpart = asInt(npart) if tol is not None: ttol = asReal(tol) if its is not None: tits = asInt(its) if scheme is not None: tscheme = scheme CHKERR( NEPSetRefine(self.nep, tref, tnpart, ttol, tits, tscheme) ) def getRefineKSP(self): """ Obtain the `KSP` object used by the eigensolver in the refinement phase. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( NEPRefineGetKSP(self.nep, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp def getTrackAll(self): """ Returns the flag indicating whether all residual norms must be computed or not. Returns ------- trackall: bool Whether the solver compute all residuals or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPGetTrackAll(self.nep, &tval) ) return toBool(tval) def setTrackAll(self, trackall): """ Specifies if the solver must compute the residual of all approximate eigenpairs or not. Parameters ---------- trackall: bool Whether compute all residuals or not. """ cdef PetscBool tval = trackall CHKERR( NEPSetTrackAll(self.nep, tval) ) def getDimensions(self): """ Gets the number of eigenvalues to compute and the dimension of the subspace. Returns ------- nev: int Number of eigenvalues to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( NEPGetDimensions(self.nep, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def setDimensions(self, nev=None, ncv=None, mpd=None): """ Sets the number of eigenvalues to compute and the dimension of the subspace. Parameters ---------- nev: int, optional Number of eigenvalues to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nev is not None: ival1 = asInt(nev) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( NEPSetDimensions(self.nep, ival1, ival2, ival3) ) def getBV(self): """ Obtain the basis vectors object associated to the eigensolver. Returns ------- bv: BV The basis vectors context. """ cdef BV bv = BV() CHKERR( NEPGetBV(self.nep, &bv.bv) ) CHKERR( PetscINCREF(bv.obj) ) return bv def setBV(self, BV bv): """ Associates a basis vectors object to the eigensolver. Parameters ---------- bv: BV The basis vectors context. """ CHKERR( NEPSetBV(self.nep, bv.bv) ) def getRG(self): """ Obtain the region object associated to the eigensolver. Returns ------- rg: RG The region context. """ cdef RG rg = RG() CHKERR( NEPGetRG(self.nep, &rg.rg) ) CHKERR( PetscINCREF(rg.obj) ) return rg def setRG(self, RG rg): """ Associates a region object to the eigensolver. Parameters ---------- rg: RG The region context. """ CHKERR( NEPSetRG(self.nep, rg.rg) ) def getDS(self): """ Obtain the direct solver associated to the eigensolver. Returns ------- ds: DS The direct solver context. """ cdef DS ds = DS() CHKERR( NEPGetDS(self.nep, &ds.ds) ) CHKERR( PetscINCREF(ds.obj) ) return ds def setDS(self, DS ds): """ Associates a direct solver object to the eigensolver. Parameters ---------- ds: DS The direct solver context. """ CHKERR( NEPSetDS(self.nep, ds.ds) ) # def setInitialSpace(self, space): """ Sets the initial space from which the eigensolver starts to iterate. Parameters ---------- space: Vec or sequence of Vec The initial space """ if isinstance(space, Vec): space = [space] cdef PetscVec *vs = NULL cdef Py_ssize_t i = 0, ns = len(space) cdef tmp = allocate(ns*sizeof(PetscVec),&vs) for i in range(ns): vs[i] = (space[i]).vec CHKERR( NEPSetInitialSpace(self.nep, ns, vs) ) # def setStoppingTest(self, stopping, args=None, kargs=None): """ Sets a function to decide when to stop the outer iteration of the eigensolver. """ if stopping is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__stopping__', (stopping, args, kargs)) CHKERR( NEPSetStoppingTestFunction(self.nep, NEP_Stopping, NULL, NULL) ) else: self.set_attr('__stopping__', None) CHKERR( NEPSetStoppingTestFunction(self.nep, NEPStoppingBasic, NULL, NULL) ) def getStoppingTest(self): """ Gets the stopping function. """ return self.get_attr('__stopping__') # def setMonitor(self, monitor, args=None, kargs=None): """ Appends a monitor function to the list of monitors. """ if monitor is None: return cdef object monitorlist = self.get_attr('__monitor__') if monitorlist is None: monitorlist = [] self.set_attr('__monitor__', monitorlist) CHKERR( NEPMonitorSet(self.nep, NEP_Monitor, NULL, NULL) ) if args is None: args = () if kargs is None: kargs = {} monitorlist.append((monitor, args, kargs)) def getMonitor(self): """ Gets the list of monitor functions. """ return self.get_attr('__monitor__') def cancelMonitor(self): """ Clears all monitors for a `NEP` object. """ CHKERR( NEPMonitorCancel(self.nep) ) self.set_attr('__monitor__', None) # def setUp(self): """ Sets up all the internal data structures necessary for the execution of the eigensolver. """ CHKERR( NEPSetUp(self.nep) ) def solve(self): """ Solves the eigensystem. """ CHKERR( NEPSolve(self.nep) ) def getIterationNumber(self): """ Gets the current iteration number. If the call to `solve()` is complete, then it returns the number of iterations carried out by the solution method. Returns ------- its: int Iteration number. """ cdef PetscInt ival = 0 CHKERR( NEPGetIterationNumber(self.nep, &ival) ) return toInt(ival) def getConvergedReason(self): """ Gets the reason why the `solve()` iteration was stopped. Returns ------- reason: `NEP.ConvergedReason` enumerate Negative value indicates diverged, positive value converged. """ cdef SlepcNEPConvergedReason val = NEP_CONVERGED_ITERATING CHKERR( NEPGetConvergedReason(self.nep, &val) ) return val def getConverged(self): """ Gets the number of converged eigenpairs. Returns ------- nconv: int Number of converged eigenpairs. """ cdef PetscInt ival = 0 CHKERR( NEPGetConverged(self.nep, &ival) ) return toInt(ival) def getEigenpair(self, int i, Vec Vr=None, Vec Vi=None): """ Gets the i-th solution of the eigenproblem as computed by `solve()`. The solution consists of both the eigenvalue and the eigenvector. Parameters ---------- i: int Index of the solution to be obtained. Vr: Vec, optional Placeholder for the returned eigenvector (real part). Vi: Vec, optional Placeholder for the returned eigenvector (imaginary part). Returns ------- e: scalar (possibly complex) The computed eigenvalue. """ cdef PetscScalar sval1 = 0 cdef PetscScalar sval2 = 0 cdef PetscVec vecr = Vr.vec if Vr is not None else NULL cdef PetscVec veci = Vi.vec if Vi is not None else NULL CHKERR( NEPGetEigenpair(self.nep, i, &sval1, &sval2, vecr, veci) ) return toComplex(sval1, sval2) def getLeftEigenvector(self, int i, Vec Wr, Vec Wi=None): """ Gets the i-th left eigenvector as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. Wr: Vec Placeholder for the returned eigenvector (real part). Wi: Vec, optional Placeholder for the returned eigenvector (imaginary part). Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). Eigensolutions are indexed according to the ordering criterion established with `setWhichEigenpairs()`. Left eigenvectors are available only if the twosided flag was set with `setTwoSided()`. """ cdef PetscVec vecr = Wr.vec cdef PetscVec veci = Wi.vec if Wi is not None else NULL CHKERR( NEPGetLeftEigenvector(self.nep, i, vecr, veci) ) def getErrorEstimate(self, int i): """ Returns the error estimate associated to the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. Returns ------- error: real Error estimate. """ cdef PetscReal rval = 0 CHKERR( NEPGetErrorEstimate(self.nep, i, &rval) ) return toReal(rval) def computeError(self, int i, etype=None): """ Computes the error (based on the residual norm) associated with the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. etype: `NEP.ErrorType` enumerate The error type to compute. Returns ------- error: real The error bound, computed in various ways from the residual norm ``||T(lambda)x||_2`` where ``lambda`` is the eigenvalue and ``x`` is the eigenvector. """ cdef SlepcNEPErrorType et = NEP_ERROR_RELATIVE cdef PetscReal rval = 0 if etype is not None: et = etype CHKERR( NEPComputeError(self.nep, i, et, &rval) ) return toReal(rval) def errorView(self, etype=None, Viewer viewer=None): """ Displays the errors associated with the computed solution (as well as the eigenvalues). Parameters ---------- etype: `NEP.ErrorType` enumerate, optional The error type to compute. viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. Notes ----- By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ``ASCII_INFO_DETAIL`` then a table with eigenvalues and corresponding errors is printed. """ cdef SlepcNEPErrorType et = NEP_ERROR_RELATIVE if etype is not None: et = etype cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( NEPErrorView(self.nep, et, vwr) ) def valuesView(self, Viewer viewer=None): """ Displays the computed eigenvalues in a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( NEPValuesView(self.nep, vwr) ) def vectorsView(self, Viewer viewer=None): """ Outputs computed eigenvectors to a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( NEPVectorsView(self.nep, vwr) ) # def setFunction(self, function, Mat F=None, Mat P=None, args=None, kargs=None): """ Sets the function to compute the nonlinear Function T(lambda) as well as the location to store the matrix. Parameters ---------- function: Function evaluation routine F: Mat Function matrix P: Mat preconditioner matrix (usually the same as F) """ cdef PetscMat Fmat = F.mat if F is not None else NULL cdef PetscMat Pmat = P.mat if P is not None else Fmat if function is not None: if args is None: args = () if kargs is None: kargs = {} context = (function, args, kargs) self.set_attr('__function__', context) CHKERR( NEPSetFunction(self.nep, Fmat, Pmat, NEP_Function, context) ) else: CHKERR( NEPSetFunction(self.nep, Fmat, Pmat, NULL, NULL) ) def getFunction(self): """ Returns the function to compute the nonlinear Function T(lambda) and the matrix. Parameters ---------- F: Mat Function matrix P: Mat preconditioner matrix (usually the same as the F) function: Function evaluation routine """ cdef Mat F = Mat() cdef Mat P = Mat() CHKERR( NEPGetFunction(self.nep, &F.mat, &P.mat, NULL, NULL) ) CHKERR( PetscINCREF(F.obj) ) CHKERR( PetscINCREF(P.obj) ) cdef object function = self.get_attr('__function__') return (F, P, function) def setJacobian(self, jacobian, Mat J=None, args=None, kargs=None): """ Sets the function to compute the Jacobian T'(lambda) as well as the location to store the matrix. Parameters ---------- jacobian: Jacobian evaluation routine J: Mat Jacobian matrix """ cdef PetscMat Jmat = J.mat if J is not None else NULL if jacobian is not None: if args is None: args = () if kargs is None: kargs = {} context = (jacobian, args, kargs) self.set_attr('__jacobian__', context) CHKERR( NEPSetJacobian(self.nep, Jmat, NEP_Jacobian, context) ) else: CHKERR( NEPSetJacobian(self.nep, Jmat, NULL, NULL) ) def getJacobian(self): """ Returns the function to compute the Jacobian T'(lambda) and the matrix. Parameters ---------- J: Mat Jacobian matrix jacobian: Jacobian evaluation routine """ cdef Mat J = Mat() CHKERR( NEPGetJacobian(self.nep, &J.mat, NULL, NULL) ) CHKERR( PetscINCREF(J.obj) ) cdef object jacobian = self.get_attr('__jacobian__') return (J, jacobian) def setSplitOperator(self, A, f, structure=None): """ Sets the operator of the nonlinear eigenvalue problem in split form. Parameters ---------- A: Mat or sequence of Mat Coefficient matrices of the split form. f: sequence of FN Scalar functions of the split form. structure: `PETSc.Mat.Structure` enumerate, optional Structure flag for matrices. """ if isinstance(A, Mat): A = [A] if isinstance(f, FN): f = [f] cdef PetscMat *As = NULL cdef SlepcFN *Fs = NULL cdef Py_ssize_t i = 0, n = len(A) cdef PetscMatStructure mstr = matstructure(structure) assert n == len(f) cdef tmp1 = allocate(n*sizeof(PetscMat),&As) cdef tmp2 = allocate(n*sizeof(SlepcFN),&Fs) for i in range(n): As[i] = (A[i]).mat Fs[i] = (f[i]).fn CHKERR( NEPSetSplitOperator(self.nep, n, As, Fs, mstr) ) def getSplitOperator(self): """ Returns the operator of the nonlinear eigenvalue problem in split form. Returns ------- A: sequence of Mat Coefficient matrices of the split form. f: sequence of FN Scalar functions of the split form. structure: `PETSc.Mat.Structure` enumerate Structure flag for matrices. """ cdef Mat A cdef FN f cdef PetscMat mat = NULL cdef SlepcFN fn = NULL cdef PetscInt i=0, n=0 cdef PetscMatStructure mstr CHKERR( NEPGetSplitOperatorInfo(self.nep, &n, &mstr) ) cdef object matrices = [] cdef object functions = [] for i in range(n): CHKERR( NEPGetSplitOperatorTerm(self.nep, i, &mat, &fn) ) A = Mat(); A.mat = mat; CHKERR( PetscINCREF(A.obj) ) f = FN(); f.fn = fn; CHKERR( PetscINCREF(f.obj) ) matrices.append(A) functions.append(f) return (matrices, functions, mstr) def setSplitPreconditioner(self, P, structure=None): """ Sets the operator in split form from which to build the preconditioner to be used when solving the nonlinear eigenvalue problem in split form. Parameters ---------- P: Mat or sequence of Mat Coefficient matrices of the split preconditioner. structure: `PETSc.Mat.Structure` enumerate, optional Structure flag for matrices. """ if isinstance(P, Mat): P = [P] cdef PetscMat *Ps = NULL cdef Py_ssize_t i = 0, n = len(P) cdef PetscMatStructure mstr = matstructure(structure) cdef tmp1 = allocate(n*sizeof(PetscMat),&Ps) for i in range(n): Ps[i] = (P[i]).mat CHKERR( NEPSetSplitPreconditioner(self.nep, n, Ps, mstr) ) def getSplitPreconditioner(self): """ Returns the operator of the split preconditioner. Returns ------- P: sequence of Mat Coefficient matrices of the split preconditioner. structure: `PETSc.Mat.Structure` enumerate Structure flag for matrices. """ cdef Mat P cdef PetscMat mat = NULL cdef PetscInt i=0, n=0 cdef PetscMatStructure mstr CHKERR( NEPGetSplitPreconditionerInfo(self.nep, &n, &mstr) ) cdef object matrices = [] for i in range(n): CHKERR( NEPGetSplitPreconditionerTerm(self.nep, i, &mat) ) P = Mat(); P.mat = mat; CHKERR( PetscINCREF(P.obj) ) matrices.append(P) return (matrices, mstr) def getTwoSided(self): """ Returns the flag indicating whether a two-sided variant of the algorithm is being used or not. Returns ------- twosided: bool Whether the two-sided variant is to be used or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPGetTwoSided(self.nep, &tval) ) return toBool(tval) def setTwoSided(self, twosided): """ Sets the solver to use a two-sided variant so that left eigenvectors are also computed. Parameters ---------- twosided: bool Whether the two-sided variant is to be used or not. """ cdef PetscBool tval = asBool(twosided) CHKERR( NEPSetTwoSided(self.nep, tval) ) def applyResolvent(self, omega, Vec v, Vec r, RG rg=None): """ Applies the resolvent T^{-1}(z) to a given vector. Parameters ---------- omega: scalar Value where the resolvent must be evaluated. v: Vec Input vector. r: Vec Placeholder for the result vector. rg: `RG` object, optional Region. """ cdef PetscScalar sval = asScalar(omega) cdef SlepcRG region = rg.rg if rg is not None else NULL CHKERR( NEPApplyResolvent(self.nep, region, sval, v.vec, r.vec) ) # def setRIILagPreconditioner(self, lag): """ Determines when the preconditioner is rebuilt in the nonlinear solve. Parameters ---------- lag: int 0 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within the nonlinear iteration, 2 means every second time the Jacobian is built, etc. """ cdef PetscInt ival = asInt(lag) CHKERR( NEPRIISetLagPreconditioner(self.nep, ival) ) def getRIILagPreconditioner(self): """ Indicates how often the preconditioner is rebuilt. Returns ------- lag: int The lag parameter. """ cdef PetscInt ival = 0 CHKERR( NEPRIIGetLagPreconditioner(self.nep, &ival) ) return toInt(ival) def setRIIConstCorrectionTol(self, cct): """ Sets a flag to keep the tolerance used in the linear solver constant. Parameters ---------- cct: bool If True, the `KSP` relative tolerance is constant. """ cdef PetscBool val = asBool(cct) CHKERR( NEPRIISetConstCorrectionTol(self.nep, val) ) def getRIIConstCorrectionTol(self): """ Returns the constant tolerance flag. Returns ------- cct: bool If True, the `KSP` relative tolerance is constant. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPRIIGetConstCorrectionTol(self.nep, &tval) ) return toBool(tval) def setRIIMaximumIterations(self, its): """ Sets the maximum number of inner iterations to be used in the RII solver. These are the Newton iterations related to the computation of the nonlinear Rayleigh functional. Parameters ---------- its: int Maximum inner iterations. """ cdef PetscInt ival = asInt(its) CHKERR( NEPRIISetMaximumIterations(self.nep, ival) ) def getRIIMaximumIterations(self): """ Gets the maximum number of inner iterations of RII. Returns ------- its: int Maximum inner iterations. """ cdef PetscInt ival = 0 CHKERR( NEPRIIGetMaximumIterations(self.nep, &ival) ) return toInt(ival) def setRIIHermitian(self, herm): """ Sets a flag to indicate if the Hermitian version of the scalar nonlinear equation must be used by the solver. Parameters ---------- herm: bool If True, the Hermitian version is used. """ cdef PetscBool val = asBool(herm) CHKERR( NEPRIISetHermitian(self.nep, val) ) def getRIIHermitian(self): """ Returns the flag about using the Hermitian version of the scalar nonlinear equation. Returns ------- herm: bool If True, the Hermitian version is used. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPRIIGetHermitian(self.nep, &tval) ) return toBool(tval) def setRIIDeflationThreshold(self, deftol): """ Sets the threshold value used to switch between deflated and non-deflated iteration. Parameters ---------- deftol: float The threshold value. """ cdef PetscReal val = asReal(deftol) CHKERR( NEPRIISetDeflationThreshold(self.nep, val) ) def getRIIDeflationThreshold(self): """ Returns the threshold value that controls deflation. Returns ------- deftol: float The threshold value. """ cdef PetscReal rval = 0.0 CHKERR( NEPRIIGetDeflationThreshold(self.nep, &rval) ) return toReal(rval) def setRIIKSP(self, KSP ksp): """ Associate a linear solver object to the nonlinear eigensolver. Parameters ---------- ksp: `KSP` The linear solver object. """ CHKERR( NEPRIISetKSP(self.nep, ksp.ksp) ) def getRIIKSP(self): """ Retrieve the linear solver object associated with the nonlinear eigensolver. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( NEPRIIGetKSP(self.nep, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp # def setSLPDeflationThreshold(self, deftol): """ Sets the threshold value used to switch between deflated and non-deflated iteration. Parameters ---------- deftol: float The threshold value. """ cdef PetscReal val = asReal(deftol) CHKERR( NEPSLPSetDeflationThreshold(self.nep, val) ) def getSLPDeflationThreshold(self): """ Returns the threshold value that controls deflation. Returns ------- deftol: float The threshold value. """ cdef PetscReal rval = 0.0 CHKERR( NEPSLPGetDeflationThreshold(self.nep, &rval) ) return toReal(rval) def setSLPEPS(self, EPS eps): """ Associate a linear eigensolver object to the nonlinear eigensolver. Parameters ---------- eps: `EPS` The linear eigensolver. """ CHKERR( NEPSLPSetEPS(self.nep, eps.eps) ) def getSLPEPS(self): """ Retrieve the linear eigensolver object associated with the nonlinear eigensolver. Returns ------- eps: `EPS` The linear eigensolver. """ cdef EPS eps = EPS() CHKERR( NEPSLPGetEPS(self.nep, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setSLPEPSLeft(self, EPS eps): """ Associate a linear eigensolver object to the nonlinear eigensolver, used to compute left eigenvectors in the two-sided variant of SLP. Parameters ---------- eps: `EPS` The linear eigensolver. """ CHKERR( NEPSLPSetEPSLeft(self.nep, eps.eps) ) def getSLPEPSLeft(self): """ Retrieve the left eigensolver. Returns ------- eps: `EPS` The linear eigensolver. """ cdef EPS eps = EPS() CHKERR( NEPSLPGetEPSLeft(self.nep, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setSLPKSP(self, KSP ksp): """ Associate a linear solver object to the nonlinear eigensolver. Parameters ---------- ksp: `KSP` The linear solver object. """ CHKERR( NEPSLPSetKSP(self.nep, ksp.ksp) ) def getSLPKSP(self): """ Retrieve the linear solver object associated with the nonlinear eigensolver. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( NEPSLPGetKSP(self.nep, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp # def setNArnoldiKSP(self, KSP ksp): """ Associate a linear solver object to the nonlinear eigensolver. Parameters ---------- ksp: `KSP` The linear solver object. """ CHKERR( NEPNArnoldiSetKSP(self.nep, ksp.ksp) ) def getNArnoldiKSP(self): """ Retrieve the linear solver object associated with the nonlinear eigensolver. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( NEPNArnoldiGetKSP(self.nep, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp def setNArnoldiLagPreconditioner(self, lag): """ Determines when the preconditioner is rebuilt in the nonlinear solve. Parameters ---------- lag: int 0 indicates NEVER rebuild, 1 means rebuild every time the Jacobian is computed within the nonlinear iteration, 2 means every second time the Jacobian is built, etc. Notes ----- The default is 1. The preconditioner is ALWAYS built in the first iteration of a nonlinear solve. """ cdef PetscInt ival = asInt(lag) CHKERR( NEPNArnoldiSetLagPreconditioner(self.nep, ival) ) def getNArnoldiLagPreconditioner(self): """ Indicates how often the preconditioner is rebuilt. Returns ------- lag: int The lag parameter. """ cdef PetscInt ival = 0 CHKERR( NEPNArnoldiGetLagPreconditioner(self.nep, &ival) ) return toInt(ival) # def setInterpolPEP(self, PEP pep): """ Associate a polynomial eigensolver object to the nonlinear eigensolver. Parameters ---------- pep: `PEP` The polynomial eigensolver. """ CHKERR( NEPInterpolSetPEP(self.nep, pep.pep) ) def getInterpolPEP(self): """ Retrieve the polynomial eigensolver object associated with the nonlinear eigensolver. Returns ------- pep: `PEP` The polynomial eigensolver. """ cdef PEP pep = PEP() CHKERR( NEPInterpolGetPEP(self.nep, &pep.pep) ) CHKERR( PetscINCREF(pep.obj) ) return pep def setInterpolInterpolation(self, tol=None, deg=None): """ Sets the tolerance and maximum degree when building the interpolation polynomial. Parameters ---------- tol: float, optional The tolerance to stop computing polynomial coefficients. deg: int, optional The maximum degree of interpolation. """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if deg is not None: ival = asInt(deg) CHKERR( NEPInterpolSetInterpolation(self.nep, rval, ival) ) def getInterpolInterpolation(self): """ Gets the tolerance and maximum degree when building the interpolation polynomial. Returns ------- tol: float The tolerance to stop computing polynomial coefficients. deg: int The maximum degree of interpolation. """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( NEPInterpolGetInterpolation(self.nep, &rval, &ival) ) return (toReal(rval), toInt(ival)) # def setNLEIGSRestart(self, keep): """ Sets the restart parameter for the NLEIGS method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( NEPNLEIGSSetRestart(self.nep, val) ) def getNLEIGSRestart(self): """ Gets the restart parameter used in the NLEIGS method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( NEPNLEIGSGetRestart(self.nep, &val) ) return toReal(val) def setNLEIGSLocking(self, lock): """ Choose between locking and non-locking variants of the NLEIGS method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( NEPNLEIGSSetLocking(self.nep, val) ) def getNLEIGSLocking(self): """ Gets the locking flag used in the NLEIGS method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPNLEIGSGetLocking(self.nep, &tval) ) return toBool(tval) def setNLEIGSInterpolation(self, tol=None, deg=None): """ Sets the tolerance and maximum degree when building the interpolation via divided differences. Parameters ---------- tol: float, optional The tolerance to stop computing divided differences. deg: int, optional The maximum degree of interpolation. """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if deg is not None: ival = asInt(deg) CHKERR( NEPNLEIGSSetInterpolation(self.nep, rval, ival) ) def getNLEIGSInterpolation(self): """ Gets the tolerance and maximum degree when building the interpolation via divided differences. Returns ------- tol: float The tolerance to stop computing divided differences. deg: int The maximum degree of interpolation. """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( NEPNLEIGSGetInterpolation(self.nep, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setNLEIGSFullBasis(self, fullbasis=True): """ Choose between TOAR-basis (default) and full-basis variants of the NLEIGS method. Parameters ---------- fullbasis: bool True if the full-basis variant must be selected. """ cdef PetscBool val = asBool(fullbasis) CHKERR( NEPNLEIGSSetFullBasis(self.nep, val) ) def getNLEIGSFullBasis(self): """ Gets the flag that indicates if NLEIGS is using the full-basis variant. Returns ------- fullbasis: bool True if the full-basis variant must be selected. """ cdef PetscBool tval = PETSC_FALSE CHKERR( NEPNLEIGSGetFullBasis(self.nep, &tval) ) return toBool(tval) def setNLEIGSEPS(self, EPS eps): """ Associate a linear eigensolver object to the nonlinear eigensolver. Parameters ---------- eps: `EPS` The linear eigensolver. """ CHKERR( NEPNLEIGSSetEPS(self.nep, eps.eps) ) def getNLEIGSEPS(self): """ Retrieve the linear eigensolver object associated with the nonlinear eigensolver. Returns ------- eps: `EPS` The linear eigensolver. """ cdef EPS eps = EPS() CHKERR( NEPNLEIGSGetEPS(self.nep, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setNLEIGSRKShifts(self, shifts): """ Sets a list of shifts to be used in the Rational Krylov method. Parameters ---------- shifts: array of scalars Values specifying the shifts. """ cdef PetscInt na = 0 cdef PetscScalar *a = NULL cdef object tmp1 = iarray_s(shifts, &na, &a) CHKERR( NEPNLEIGSSetRKShifts(self.nep, na, a) ) def getNLEIGSRKShifts(self): """ Gets the list of shifts used in the Rational Krylov method. Returns ------- shifts: array of scalars The shift values. """ cdef PetscInt np = 0 cdef PetscScalar *coeff = NULL CHKERR( NEPNLEIGSGetRKShifts(self.nep, &np, &coeff) ) cdef object ocoeff = None try: ocoeff = array_s(np, coeff) finally: CHKERR( PetscFree(coeff) ) return ocoeff def getNLEIGSKSPs(self): """ Retrieve the array of linear solver objects associated with the NLEIGS solver. Returns ------- ksp: list of `KSP` The linear solver objects. Notes ----- The number of `KSP` solvers is equal to the number of shifts provided by the user, or 1 if the user did not provide shifts. """ cdef PetscInt i = 0, n = 0 cdef PetscKSP *p = NULL CHKERR( NEPNLEIGSGetKSPs(self.nep, &n, &p) ) return [ref_KSP(p[i]) for i from 0 <= i 0, (x'Cx)^2 > 4(x'Mx)(x'Kx). - `GYROSCOPIC`: QEP with M, K Hermitian, M>0, C skew-Hermitian. """ GENERAL = PEP_GENERAL HERMITIAN = PEP_HERMITIAN HYPERBOLIC = PEP_HYPERBOLIC GYROSCOPIC = PEP_GYROSCOPIC class PEPWhich(object): """ PEP desired part of spectrum - `LARGEST_MAGNITUDE`: Largest magnitude (default). - `SMALLEST_MAGNITUDE`: Smallest magnitude. - `LARGEST_REAL`: Largest real parts. - `SMALLEST_REAL`: Smallest real parts. - `LARGEST_IMAGINARY`: Largest imaginary parts in magnitude. - `SMALLEST_IMAGINARY`: Smallest imaginary parts in magnitude. - `TARGET_MAGNITUDE`: Closest to target (in magnitude). - `TARGET_REAL`: Real part closest to target. - `TARGET_IMAGINARY`: Imaginary part closest to target. - `ALL`: All eigenvalues in an interval. - `USER`: User-defined criterion. """ LARGEST_MAGNITUDE = PEP_LARGEST_MAGNITUDE SMALLEST_MAGNITUDE = PEP_SMALLEST_MAGNITUDE LARGEST_REAL = PEP_LARGEST_REAL SMALLEST_REAL = PEP_SMALLEST_REAL LARGEST_IMAGINARY = PEP_LARGEST_IMAGINARY SMALLEST_IMAGINARY = PEP_SMALLEST_IMAGINARY TARGET_MAGNITUDE = PEP_TARGET_MAGNITUDE TARGET_REAL = PEP_TARGET_REAL TARGET_IMAGINARY = PEP_TARGET_IMAGINARY ALL = PEP_ALL USER = PEP_WHICH_USER class PEPBasis(object): """ PEP basis type for the representation of the polynomial - `MONOMIAL`: Monomials (default). - `CHEBYSHEV1`: Chebyshev polynomials of the 1st kind. - `CHEBYSHEV2`: Chebyshev polynomials of the 2nd kind. - `LEGENDRE`: Legendre polynomials. - `LAGUERRE`: Laguerre polynomials. - `HERMITE`: Hermite polynomials. """ MONOMIAL = PEP_BASIS_MONOMIAL CHEBYSHEV1 = PEP_BASIS_CHEBYSHEV1 CHEBYSHEV2 = PEP_BASIS_CHEBYSHEV2 LEGENDRE = PEP_BASIS_LEGENDRE LAGUERRE = PEP_BASIS_LAGUERRE HERMITE = PEP_BASIS_HERMITE class PEPScale(object): """ PEP scaling strategy - `NONE`: No scaling. - `SCALAR`: Parameter scaling. - `DIAGONAL`: Diagonal scaling. - `BOTH`: Both parameter and diagonal scaling. """ NONE = PEP_SCALE_NONE SCALAR = PEP_SCALE_SCALAR DIAGONAL = PEP_SCALE_DIAGONAL BOTH = PEP_SCALE_BOTH class PEPRefine(object): """ PEP refinement strategy - `NONE`: No refinement. - `SIMPLE`: Refine eigenpairs one by one. - `MULTIPLE`: Refine all eigenpairs simultaneously (invariant pair). """ NONE = PEP_REFINE_NONE SIMPLE = PEP_REFINE_SIMPLE MULTIPLE = PEP_REFINE_MULTIPLE class PEPRefineScheme(object): """ PEP scheme for solving linear systems during iterative refinement - `SCHUR`: Schur complement. - `MBE`: Mixed block elimination. - `EXPLICIT`: Build the explicit matrix. """ SCHUR = PEP_REFINE_SCHEME_SCHUR MBE = PEP_REFINE_SCHEME_MBE EXPLICIT = PEP_REFINE_SCHEME_EXPLICIT class PEPExtract(object): """ PEP extraction strategy used to obtain eigenvectors of the PEP from the eigenvectors of the linearization - `NONE`: Use the first block. - `NORM`: Use the first or last block depending on norm of H. - `RESIDUAL`: Use the block with smallest residual. - `STRUCTURED`: Combine all blocks in a certain way. """ NONE = PEP_EXTRACT_NONE NORM = PEP_EXTRACT_NORM RESIDUAL = PEP_EXTRACT_RESIDUAL STRUCTURED = PEP_EXTRACT_STRUCTURED class PEPErrorType(object): """ PEP error type to assess accuracy of computed solutions - `ABSOLUTE`: Absolute error. - `RELATIVE`: Relative error. - `BACKWARD`: Backward error. """ ABSOLUTE = PEP_ERROR_ABSOLUTE RELATIVE = PEP_ERROR_RELATIVE BACKWARD = PEP_ERROR_BACKWARD class PEPConv(object): """ PEP convergence test - `ABS`: Absolute convergence test. - `REL`: Convergence test relative to the eigenvalue. - `NORM`: Convergence test relative to the matrix norms. - `USER`: User-defined convergence test. """ ABS = PEP_CONV_ABS REL = PEP_CONV_REL NORM = PEP_CONV_NORM USER = PEP_CONV_USER class PEPStop(object): """ PEP stopping test - `BASIC`: Default stopping test. - `USER`: User-defined stopping test. """ BASIC = PEP_STOP_BASIC USER = PEP_STOP_USER class PEPConvergedReason(object): """ PEP convergence reasons - `CONVERGED_TOL`: All eigenpairs converged to requested tolerance. - `CONVERGED_USER`: User-defined convergence criterion satisfied. - `DIVERGED_ITS`: Maximum number of iterations exceeded. - `DIVERGED_BREAKDOWN`: Solver failed due to breakdown. - `DIVERGED_SYMMETRY_LOST`: Lanczos-type method could not preserve symmetry. - `CONVERGED_ITERATING`: Iteration not finished yet. """ CONVERGED_TOL = PEP_CONVERGED_TOL CONVERGED_USER = PEP_CONVERGED_USER DIVERGED_ITS = PEP_DIVERGED_ITS DIVERGED_BREAKDOWN = PEP_DIVERGED_BREAKDOWN DIVERGED_SYMMETRY_LOST = PEP_DIVERGED_SYMMETRY_LOST CONVERGED_ITERATING = PEP_CONVERGED_ITERATING ITERATING = PEP_CONVERGED_ITERATING class PEPJDProjection(object): """ PEP type of projection to be used in the Jacobi-Davidson solver - `HARMONIC`: Harmonic projection. - `ORTHOGONAL`: Orthogonal projection. """ HARMONIC = PEP_JD_PROJECTION_HARMONIC ORTHOGONAL = PEP_JD_PROJECTION_ORTHOGONAL class PEPCISSExtraction(object): """ PEP CISS extraction technique - `RITZ`: Ritz extraction. - `HANKEL`: Extraction via Hankel eigenproblem. - `CAA`: Communication-avoiding Arnoldi. """ RITZ = PEP_CISS_EXTRACTION_RITZ HANKEL = PEP_CISS_EXTRACTION_HANKEL CAA = PEP_CISS_EXTRACTION_CAA # ----------------------------------------------------------------------------- cdef class PEP(Object): """ PEP """ Type = PEPType ProblemType = PEPProblemType Which = PEPWhich Basis = PEPBasis Scale = PEPScale Refine = PEPRefine RefineScheme = PEPRefineScheme Extract = PEPExtract ErrorType = PEPErrorType Conv = PEPConv Stop = PEPStop ConvergedReason = PEPConvergedReason JDProjection = PEPJDProjection CISSExtraction = PEPCISSExtraction def __cinit__(self): self.obj = &self.pep self.pep = NULL def view(self, Viewer viewer=None): """ Prints the PEP data structure. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( PEPView(self.pep, vwr) ) def destroy(self): """ Destroys the PEP object. """ CHKERR( PEPDestroy(&self.pep) ) self.pep = NULL return self def reset(self): """ Resets the PEP object. """ CHKERR( PEPReset(self.pep) ) def create(self, comm=None): """ Creates the PEP object. Parameters ---------- comm: Comm, optional. MPI communicator. If not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcPEP newpep = NULL CHKERR( PEPCreate(ccomm, &newpep) ) CHKERR( SlepcCLEAR(self.obj) ); self.pep = newpep return self def setType(self, pep_type): """ Selects the particular solver to be used in the PEP object. Parameters ---------- pep_type: `PEP.Type` enumerate The solver to be used. """ cdef SlepcPEPType cval = NULL pep_type = str2bytes(pep_type, &cval) CHKERR( PEPSetType(self.pep, cval) ) def getType(self): """ Gets the PEP type of this object. Returns ------- type: `PEP.Type` enumerate The solver currently being used. """ cdef SlepcPEPType pep_type = NULL CHKERR( PEPGetType(self.pep, &pep_type) ) return bytes2str(pep_type) def getOptionsPrefix(self): """ Gets the prefix used for searching for all PEP options in the database. Returns ------- prefix: string The prefix string set for this PEP object. """ cdef const_char *prefix = NULL CHKERR( PEPGetOptionsPrefix(self.pep, &prefix) ) return bytes2str(prefix) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all PEP options in the database. Parameters ---------- prefix: string The prefix string to prepend to all PEP option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( PEPSetOptionsPrefix(self.pep, cval) ) def appendOptionsPrefix(self, prefix): """ Appends to the prefix used for searching for all PEP options in the database. Parameters ---------- prefix: string The prefix string to prepend to all PEP option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( PEPAppendOptionsPrefix(self.pep, cval) ) def setFromOptions(self): """ Sets PEP options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. """ CHKERR( PEPSetFromOptions(self.pep) ) def getBasis(self): """ Gets the type of polynomial basis used to describe the polynomial eigenvalue problem. Returns ------- basis: `PEP.Basis` enumerate the basis that was previously set. """ cdef SlepcPEPBasis val = PEP_BASIS_MONOMIAL CHKERR( PEPGetBasis(self.pep, &val) ) return val def setBasis(self, basis): """ Specifies the type of polynomial basis used to describe the polynomial eigenvalue problem. Parameters ---------- basis: `PEP.Basis` enumerate the basis to be set. """ cdef SlepcPEPBasis val = basis CHKERR( PEPSetBasis(self.pep, val) ) def getProblemType(self): """ Gets the problem type from the PEP object. Returns ------- problem_type: `PEP.ProblemType` enumerate The problem type that was previously set. """ cdef SlepcPEPProblemType val = PEP_GENERAL CHKERR( PEPGetProblemType(self.pep, &val) ) return val def setProblemType(self, problem_type): """ Specifies the type of the eigenvalue problem. Parameters ---------- problem_type: `PEP.ProblemType` enumerate The problem type to be set. """ cdef SlepcPEPProblemType val = problem_type CHKERR( PEPSetProblemType(self.pep, val) ) def getWhichEigenpairs(self): """ Returns which portion of the spectrum is to be sought. Returns ------- which: `PEP.Which` enumerate The portion of the spectrum to be sought by the solver. """ cdef SlepcPEPWhich val = PEP_LARGEST_MAGNITUDE CHKERR( PEPGetWhichEigenpairs(self.pep, &val) ) return val def setWhichEigenpairs(self, which): """ Specifies which portion of the spectrum is to be sought. Parameters ---------- which: `PEP.Which` enumerate The portion of the spectrum to be sought by the solver. """ cdef SlepcPEPWhich val = which CHKERR( PEPSetWhichEigenpairs(self.pep, val) ) def getTarget(self): """ Gets the value of the target. Returns ------- target: float (real or complex) The value of the target. Notes ----- If the target was not set by the user, then zero is returned. """ cdef PetscScalar sval = 0 CHKERR( PEPGetTarget(self.pep, &sval) ) return toScalar(sval) def setTarget(self, target): """ Sets the value of the target. Parameters ---------- target: float (real or complex) The value of the target. Notes ----- The target is a scalar value used to determine the portion of the spectrum of interest. It is used in combination with `setWhichEigenpairs()`. """ cdef PetscScalar sval = asScalar(target) CHKERR( PEPSetTarget(self.pep, sval) ) def getTolerances(self): """ Gets the tolerance and maximum iteration count used by the default PEP convergence tests. Returns ------- tol: float The convergence tolerance. max_it: int The maximum number of iterations """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( PEPGetTolerances(self.pep, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setTolerances(self, tol=None, max_it=None): """ Sets the tolerance and maximum iteration count used by the default PEP convergence tests. Parameters ---------- tol: float, optional The convergence tolerance. max_it: int, optional The maximum number of iterations """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if max_it is not None: ival = asInt(max_it) CHKERR( PEPSetTolerances(self.pep, rval, ival) ) def getInterval(self): """ Gets the computational interval for spectrum slicing. Returns ------- inta: float The left end of the interval. intb: float The right end of the interval. Notes ----- If the interval was not set by the user, then zeros are returned. """ cdef PetscReal inta = 0 cdef PetscReal intb = 0 CHKERR( PEPGetInterval(self.pep, &inta, &intb) ) return (toReal(inta), toReal(intb)) def setInterval(self, inta, intb): """ Defines the computational interval for spectrum slicing. Parameters ---------- inta: float The left end of the interval. intb: float The right end of the interval. Notes ----- Spectrum slicing is a technique employed for computing all eigenvalues of symmetric quadratic eigenproblems in a given interval. This function provides the interval to be considered. It must be used in combination with `PEP.Which.ALL`, see `setWhichEigenpairs()`. """ cdef PetscReal rval1 = asReal(inta) cdef PetscReal rval2 = asReal(intb) CHKERR( PEPSetInterval(self.pep, rval1, rval2) ) def getConvergenceTest(self): """ Return the method used to compute the error estimate used in the convergence test. Returns ------- conv: PEP.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcPEPConv conv = PEP_CONV_REL CHKERR( PEPGetConvergenceTest(self.pep, &conv) ) return conv def setConvergenceTest(self, conv): """ Specifies how to compute the error estimate used in the convergence test. Parameters ---------- conv: PEP.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcPEPConv tconv = conv CHKERR( PEPSetConvergenceTest(self.pep, tconv) ) def getRefine(self): """ Gets the refinement strategy used by the PEP object, and the associated parameters. Returns ------- ref: PEP.Refine The refinement type. npart: int The number of partitions of the communicator. tol: real The convergence tolerance. its: int The maximum number of refinement iterations. scheme: PEP.RefineScheme Scheme for solving linear systems """ cdef SlepcPEPRefine ref = PEP_REFINE_NONE cdef PetscInt npart = 1 cdef PetscReal tol = PETSC_DEFAULT cdef PetscInt its = PETSC_DEFAULT cdef SlepcPEPRefineScheme scheme = PEP_REFINE_SCHEME_MBE CHKERR( PEPGetRefine(self.pep, &ref, &npart, &tol, &its, &scheme) ) return (ref, toInt(npart), toReal(tol), toInt(its), scheme) def setRefine(self, ref, npart=None, tol=None, its=None, scheme=None): """ Sets the refinement strategy used by the PEP object, and the associated parameters. Parameters ---------- ref: PEP.Refine The refinement type. npart: int, optional The number of partitions of the communicator. tol: real, optional The convergence tolerance. its: int, optional The maximum number of refinement iterations. scheme: PEP.RefineScheme, optional Scheme for linear system solves """ cdef SlepcPEPRefine tref = ref cdef PetscInt tnpart = 1 cdef PetscReal ttol = PETSC_DEFAULT cdef PetscInt tits = PETSC_DEFAULT cdef SlepcPEPRefineScheme tscheme = PEP_REFINE_SCHEME_MBE if npart is not None: tnpart = asInt(npart) if tol is not None: ttol = asReal(tol) if its is not None: tits = asInt(its) if scheme is not None: tscheme = scheme CHKERR( PEPSetRefine(self.pep, tref, tnpart, ttol, tits, tscheme) ) def getRefineKSP(self): """ Obtain the `KSP` object used by the eigensolver in the refinement phase. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( PEPRefineGetKSP(self.pep, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp def setExtract(self, extract): """ Specifies the extraction strategy to be used. Parameters ---------- extract: `PEP.Extract` enumerate The extraction strategy. """ cdef SlepcPEPExtract val = extract CHKERR( PEPSetExtract(self.pep, val) ) def getExtract(self): """ Gets the extraction technique used by the `PEP` object. Returns ------- extract: `PEP.Extract` enumerate The extraction strategy. """ cdef SlepcPEPExtract val = PEP_EXTRACT_NONE CHKERR( PEPGetExtract(self.pep, &val) ) return val def getTrackAll(self): """ Returns the flag indicating whether all residual norms must be computed or not. Returns ------- trackall: bool Whether the solver compute all residuals or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( PEPGetTrackAll(self.pep, &tval) ) return toBool(tval) def setTrackAll(self, trackall): """ Specifies if the solver must compute the residual of all approximate eigenpairs or not. Parameters ---------- trackall: bool Whether compute all residuals or not. """ cdef PetscBool tval = trackall CHKERR( PEPSetTrackAll(self.pep, tval) ) def getDimensions(self): """ Gets the number of eigenvalues to compute and the dimension of the subspace. Returns ------- nev: int Number of eigenvalues to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( PEPGetDimensions(self.pep, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def setDimensions(self, nev=None, ncv=None, mpd=None): """ Sets the number of eigenvalues to compute and the dimension of the subspace. Parameters ---------- nev: int, optional Number of eigenvalues to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nev is not None: ival1 = asInt(nev) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( PEPSetDimensions(self.pep, ival1, ival2, ival3) ) def getST(self): """ Obtain the spectral transformation (`ST`) object associated to the eigensolver object. Returns ------- st: ST The spectral transformation. """ cdef ST st = ST() CHKERR( PEPGetST(self.pep, &st.st) ) CHKERR( PetscINCREF(st.obj) ) return st def setST(self, ST st): """ Associates a spectral transformation object to the eigensolver. Parameters ---------- st: ST The spectral transformation. """ CHKERR( PEPSetST(self.pep, st.st) ) def getScale(self, Vec Dl=None, Vec Dr=None): """ Gets the strategy used for scaling the polynomial eigenproblem. Parameters ---------- Dl: Vec, optional Placeholder for the returned left diagonal matrix. Dr: Vec, optional Placeholder for the returned right diagonal matrix. Returns ------- scale: `PEP.Scale` enumerate The scaling strategy. alpha: real The scaling factor. its: int The number of iteration of diagonal scaling. lbda: real Approximation of the wanted eigenvalues (modulus). """ cdef SlepcPEPScale scale = PEP_SCALE_NONE cdef PetscReal alpha = 0 cdef PetscInt its = 0 cdef PetscReal lbda = 0 cdef PetscVec vecl = NULL cdef PetscVec vecr = NULL CHKERR( PEPGetScale(self.pep, &scale, &alpha, &vecl, &vecr, &its, &lbda) ) if Dl.vec != NULL: if vecl != NULL: CHKERR( VecCopy(vecl, Dl.vec) ) else: CHKERR( VecSet(Dl.vec, 1.0) ) if Dr.vec != NULL: if vecr != NULL: CHKERR( VecCopy(vecr, Dr.vec) ) else: CHKERR( VecSet(Dr.vec, 1.0) ) CHKERR( VecDestroy(&vecl) ) CHKERR( VecDestroy(&vecr) ) return (scale, toReal(alpha), toInt(its), toReal(lbda)) def setScale(self, scale, alpha=None, Vec Dl=None, Vec Dr=None, its=None, lbda=None): """ Sets the scaling strategy to be used for scaling the polynomial problem before attempting to solve. Parameters ---------- scale: `PEP.Scale` enumerate The scaling strategy. alpha: real, optional The scaling factor. Dl: Vec, optional The left diagonal matrix. Dr: Vec, optional The right diagonal matrix. its: int, optional The number of iteration of diagonal scaling. lbda: real, optional Approximation of the wanted eigenvalues (modulus). """ cdef SlepcPEPScale senum = scale cdef PetscReal rval1 = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT cdef PetscReal rval2 = PETSC_DEFAULT cdef PetscVec vecl = NULL cdef PetscVec vecr = NULL if alpha is not None: rval1 = asReal(alpha) if Dl is not None: vecl = Dl.vec if Dr is not None: vecr = Dr.vec if its is not None: ival = asInt(its) if lbda is not None: rval2 = asReal(lbda) CHKERR( PEPSetScale(self.pep, senum, rval1, vecl, vecr, ival, rval2) ) def getBV(self): """ Obtain the basis vectors object associated to the eigensolver. Returns ------- bv: BV The basis vectors context. """ cdef BV bv = BV() CHKERR( PEPGetBV(self.pep, &bv.bv) ) CHKERR( PetscINCREF(bv.obj) ) return bv def setBV(self, BV bv): """ Associates a basis vectors object to the eigensolver. Parameters ---------- bv: BV The basis vectors context. """ CHKERR( PEPSetBV(self.pep, bv.bv) ) def getRG(self): """ Obtain the region object associated to the eigensolver. Returns ------- rg: RG The region context. """ cdef RG rg = RG() CHKERR( PEPGetRG(self.pep, &rg.rg) ) CHKERR( PetscINCREF(rg.obj) ) return rg def setRG(self, RG rg): """ Associates a region object to the eigensolver. Parameters ---------- rg: RG The region context. """ CHKERR( PEPSetRG(self.pep, rg.rg) ) def getDS(self): """ Obtain the direct solver associated to the eigensolver. Returns ------- ds: DS The direct solver context. """ cdef DS ds = DS() CHKERR( PEPGetDS(self.pep, &ds.ds) ) CHKERR( PetscINCREF(ds.obj) ) return ds def setDS(self, DS ds): """ Associates a direct solver object to the eigensolver. Parameters ---------- ds: DS The direct solver context. """ CHKERR( PEPSetDS(self.pep, ds.ds) ) def getOperators(self): """ Gets the matrices associated with the eigenvalue problem. Returns ------- operators: tuple of Mat The matrices associated with the eigensystem. """ cdef Mat A cdef PetscMat mat = NULL cdef PetscInt k=0, n=0 CHKERR( PEPGetNumMatrices(self.pep, &n) ) cdef object operators = [] for k from 0 <= k < n: CHKERR( PEPGetOperators(self.pep, k, &mat) ) A = Mat(); A.mat = mat; CHKERR( PetscINCREF(A.obj) ) operators.append(A) return tuple(operators) def setOperators(self, operators): """ Sets the matrices associated with the eigenvalue problem. Parameters ---------- operators: sequence of Mat The matrices associated with the eigensystem. """ operators = tuple(operators) cdef PetscMat *mats = NULL cdef Py_ssize_t k=0, n = len(operators) cdef tmp = allocate(n*sizeof(PetscMat),&mats) for k from 0 <= k < n: mats[k] = (operators[k]).mat CHKERR( PEPSetOperators(self.pep, n, mats) ) # def setInitialSpace(self, space): """ Sets the initial space from which the eigensolver starts to iterate. Parameters ---------- space: Vec or sequence of Vec The initial space """ if isinstance(space, Vec): space = [space] cdef PetscVec *vs = NULL cdef Py_ssize_t i = 0, ns = len(space) cdef tmp = allocate(ns*sizeof(PetscVec),&vs) for i in range(ns): vs[i] = (space[i]).vec CHKERR( PEPSetInitialSpace(self.pep, ns, vs) ) # def setStoppingTest(self, stopping, args=None, kargs=None): """ Sets a function to decide when to stop the outer iteration of the eigensolver. """ if stopping is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__stopping__', (stopping, args, kargs)) CHKERR( PEPSetStoppingTestFunction(self.pep, PEP_Stopping, NULL, NULL) ) else: self.set_attr('__stopping__', None) CHKERR( PEPSetStoppingTestFunction(self.pep, PEPStoppingBasic, NULL, NULL) ) def getStoppingTest(self): """ Gets the stopping function. """ return self.get_attr('__stopping__') # def setMonitor(self, monitor, args=None, kargs=None): """ Appends a monitor function to the list of monitors. """ if monitor is None: return cdef object monitorlist = self.get_attr('__monitor__') if monitorlist is None: monitorlist = [] self.set_attr('__monitor__', monitorlist) CHKERR( PEPMonitorSet(self.pep, PEP_Monitor, NULL, NULL) ) if args is None: args = () if kargs is None: kargs = {} monitorlist.append((monitor, args, kargs)) def getMonitor(self): """ Gets the list of monitor functions. """ return self.get_attr('__monitor__') def cancelMonitor(self): """ Clears all monitors for a `PEP` object. """ CHKERR( PEPMonitorCancel(self.pep) ) self.set_attr('__monitor__', None) # def setUp(self): """ Sets up all the internal data structures necessary for the execution of the eigensolver. """ CHKERR( PEPSetUp(self.pep) ) def solve(self): """ Solves the eigensystem. """ CHKERR( PEPSolve(self.pep) ) def getIterationNumber(self): """ Gets the current iteration number. If the call to `solve()` is complete, then it returns the number of iterations carried out by the solution method. Returns ------- its: int Iteration number. """ cdef PetscInt ival = 0 CHKERR( PEPGetIterationNumber(self.pep, &ival) ) return toInt(ival) def getConvergedReason(self): """ Gets the reason why the `solve()` iteration was stopped. Returns ------- reason: `PEP.ConvergedReason` enumerate Negative value indicates diverged, positive value converged. """ cdef SlepcPEPConvergedReason val = PEP_CONVERGED_ITERATING CHKERR( PEPGetConvergedReason(self.pep, &val) ) return val def getConverged(self): """ Gets the number of converged eigenpairs. Returns ------- nconv: int Number of converged eigenpairs. """ cdef PetscInt ival = 0 CHKERR( PEPGetConverged(self.pep, &ival) ) return toInt(ival) def getEigenpair(self, int i, Vec Vr=None, Vec Vi=None): """ Gets the i-th solution of the eigenproblem as computed by `solve()`. The solution consists of both the eigenvalue and the eigenvector. Parameters ---------- i: int Index of the solution to be obtained. Vr: Vec, optional Placeholder for the returned eigenvector (real part). Vi: Vec, optional Placeholder for the returned eigenvector (imaginary part). Returns ------- e: scalar (possibly complex) The computed eigenvalue. """ cdef PetscScalar sval1 = 0 cdef PetscScalar sval2 = 0 cdef PetscVec vecr = Vr.vec if Vr is not None else NULL cdef PetscVec veci = Vi.vec if Vi is not None else NULL CHKERR( PEPGetEigenpair(self.pep, i, &sval1, &sval2, vecr, veci) ) return toComplex(sval1, sval2) def getErrorEstimate(self, int i): """ Returns the error estimate associated to the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. Returns ------- error: real Error estimate. """ cdef PetscReal rval = 0 CHKERR( PEPGetErrorEstimate(self.pep, i, &rval) ) return toReal(rval) def computeError(self, int i, etype=None): """ Computes the error (based on the residual norm) associated with the i-th computed eigenpair. Parameters ---------- i: int Index of the solution to be considered. etype: `PEP.ErrorType` enumerate The error type to compute. Returns ------- error: real The error bound, computed in various ways from the residual norm ``||P(l)x||_2`` where ``l`` is the eigenvalue and ``x`` is the eigenvector. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). """ cdef SlepcPEPErrorType et = PEP_ERROR_BACKWARD cdef PetscReal rval = 0 if etype is not None: et = etype CHKERR( PEPComputeError(self.pep, i, et, &rval) ) return toReal(rval) def errorView(self, etype=None, Viewer viewer=None): """ Displays the errors associated with the computed solution (as well as the eigenvalues). Parameters ---------- etype: `PEP.ErrorType` enumerate, optional The error type to compute. viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. Notes ----- By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ``ASCII_INFO_DETAIL`` then a table with eigenvalues and corresponding errors is printed. """ cdef SlepcPEPErrorType et = PEP_ERROR_RELATIVE if etype is not None: et = etype cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( PEPErrorView(self.pep, et, vwr) ) def valuesView(self, Viewer viewer=None): """ Displays the computed eigenvalues in a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( PEPValuesView(self.pep, vwr) ) def vectorsView(self, Viewer viewer=None): """ Outputs computed eigenvectors to a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( PEPVectorsView(self.pep, vwr) ) # def setLinearEPS(self, EPS eps): """ Associate an eigensolver object to the polynomial eigenvalue solver. Parameters ---------- eps: `EPS` The linear eigensolver. """ CHKERR( PEPLinearSetEPS(self.pep, eps.eps) ) def getLinearEPS(self): """ Retrieve the eigensolver object associated to the polynomial eigenvalue solver. Returns ------- eps: `EPS` The linear eigensolver. """ cdef EPS eps = EPS() CHKERR( PEPLinearGetEPS(self.pep, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setLinearLinearization(self, alpha=1.0, beta=0.0): """ Set the coefficients that define the linearization of a quadratic eigenproblem. Parameters ---------- alpha: float First parameter of the linearization. beta: float Second parameter of the linearization. """ cdef PetscReal a = asReal(alpha) cdef PetscReal b = asReal(beta) CHKERR( PEPLinearSetLinearization(self.pep, a, b) ) def getLinearLinearization(self): """ Returns the coefficients that define the linearization of a quadratic eigenproblem. Returns ------- alpha: float First parameter of the linearization. beta: float Second parameter of the linearization. """ cdef PetscReal a = 0.0 cdef PetscReal b = 0.0 CHKERR( PEPLinearGetLinearization(self.pep, &a, &b) ) return (asReal(a), asReal(b)) def setLinearExplicitMatrix(self, flag): """ Indicate if the matrices A and B for the linearization of the problem must be built explicitly. Parameters ---------- flag: bool Boolean flag indicating if the matrices are built explicitly. """ cdef PetscBool sval = asBool(flag) CHKERR( PEPLinearSetExplicitMatrix(self.pep, sval) ) def getLinearExplicitMatrix(self): """ Returns the flag indicating if the matrices A and B for the linearization are built explicitly. Returns ------- flag: bool Boolean flag indicating if the matrices are built explicitly. """ cdef PetscBool sval = PETSC_FALSE CHKERR( PEPLinearGetExplicitMatrix(self.pep, &sval) ) return toBool(sval) # def setQArnoldiRestart(self, keep): """ Sets the restart parameter for the Q-Arnoldi method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( PEPQArnoldiSetRestart(self.pep, val) ) def getQArnoldiRestart(self): """ Gets the restart parameter used in the Q-Arnoldi method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( PEPQArnoldiGetRestart(self.pep, &val) ) return toReal(val) def setQArnoldiLocking(self, lock): """ Choose between locking and non-locking variants of the Q-Arnoldi method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( PEPQArnoldiSetLocking(self.pep, val) ) def getQArnoldiLocking(self): """ Gets the locking flag used in the Q-Arnoldi method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( PEPQArnoldiGetLocking(self.pep, &tval) ) return toBool(tval) # def setTOARRestart(self, keep): """ Sets the restart parameter for the TOAR method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( PEPTOARSetRestart(self.pep, val) ) def getTOARRestart(self): """ Gets the restart parameter used in the TOAR method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( PEPTOARGetRestart(self.pep, &val) ) return toReal(val) def setTOARLocking(self, lock): """ Choose between locking and non-locking variants of the TOAR method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( PEPTOARSetLocking(self.pep, val) ) def getTOARLocking(self): """ Gets the locking flag used in the TOAR method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( PEPTOARGetLocking(self.pep, &tval) ) return toBool(tval) # def setSTOARLinearization(self, alpha=1.0, beta=0.0): """ Set the coefficients that define the linearization of a quadratic eigenproblem. Parameters ---------- alpha: float First parameter of the linearization. beta: float Second parameter of the linearization. """ cdef PetscReal a = asReal(alpha) cdef PetscReal b = asReal(beta) CHKERR( PEPSTOARSetLinearization(self.pep, a, b) ) def getSTOARLinearization(self): """ Returns the coefficients that define the linearization of a quadratic eigenproblem. Returns ------- alpha: float First parameter of the linearization. beta: float Second parameter of the linearization. """ cdef PetscReal a = 0.0 cdef PetscReal b = 0.0 CHKERR( PEPSTOARGetLinearization(self.pep, &a, &b) ) return (asReal(a), asReal(b)) def setSTOARLocking(self, lock): """ Choose between locking and non-locking variants of the STOAR method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged eigenpairs when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( PEPSTOARSetLocking(self.pep, val) ) def getSTOARLocking(self): """ Gets the locking flag used in the STOAR method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( PEPSTOARGetLocking(self.pep, &tval) ) return toBool(tval) def setSTOARDetectZeros(self, detect): """ Sets a flag to enforce detection of zeros during the factorizations throughout the spectrum slicing computation. Parameters ---------- detect: bool True if zeros must checked for. Notes ----- A zero in the factorization indicates that a shift coincides with an eigenvalue. This flag is turned off by default, and may be necessary in some cases. This feature currently requires an external package for factorizations with support for zero detection, e.g. MUMPS. """ cdef PetscBool val = asBool(detect) CHKERR( PEPSTOARSetDetectZeros(self.pep, val) ) def getSTOARDetectZeros(self): """ Gets the flag that enforces zero detection in spectrum slicing. Returns ------- detect: bool The zero detection flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( PEPSTOARGetDetectZeros(self.pep, &tval) ) return toBool(tval) def setSTOARDimensions(self, nev=None, ncv=None, mpd=None): """ Sets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. The meaning of the parameters is the same as in `setDimensions()`. Parameters ---------- nev: int, optional Number of eigenvalues to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nev is not None: ival1 = asInt(nev) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( PEPSTOARSetDimensions(self.pep, ival1, ival2, ival3) ) def getSTOARDimensions(self): """ Gets the dimensions used for each subsolve step in case of doing spectrum slicing for a computational interval. Returns ------- nev: int Number of eigenvalues to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( PEPSTOARGetDimensions(self.pep, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def getSTOARInertias(self): """ Gets the values of the shifts and their corresponding inertias in case of doing spectrum slicing for a computational interval. Returns ------- shifts: list of float The values of the shifts used internally in the solver. inertias: list of int The values of the inertia in each shift. """ cdef PetscReal *shiftsarray = NULL cdef PetscInt *inertiasarray = NULL cdef PetscInt n = 0 CHKERR(PEPSTOARGetInertias(self.pep, &n, &shiftsarray, &inertiasarray)) cdef object shifts = None cdef object inertias = None try: shifts = array_r(n, shiftsarray) inertias = array_i(n, inertiasarray) finally: CHKERR( PetscFree(shiftsarray) ) CHKERR( PetscFree(inertiasarray) ) return (shifts, inertias) def setSTOARCheckEigenvalueType(self, flag): """ Sets a flag to check that all the eigenvalues obtained throughout the spectrum slicing computation have the same definite type. Parameters ---------- flag: bool Whether the eigenvalue type is checked or not. """ cdef PetscBool sval = asBool(flag) CHKERR( PEPSTOARSetCheckEigenvalueType(self.pep, sval) ) def getSTOARCheckEigenvalueType(self): """ Gets the flag for the eigenvalue type check in spectrum slicing. Returns ------- flag: bool Whether the eigenvalue type is checked or not. """ cdef PetscBool sval = PETSC_FALSE CHKERR( PEPSTOARGetCheckEigenvalueType(self.pep, &sval) ) return toBool(sval) # def setJDRestart(self, keep): """ Sets the restart parameter for the Jacobi-Davidson method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( PEPJDSetRestart(self.pep, val) ) def getJDRestart(self): """ Gets the restart parameter used in the Jacobi-Davidson method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( PEPJDGetRestart(self.pep, &val) ) return toReal(val) def setJDFix(self, fix): """ Sets the threshold for changing the target in the correction equation. Parameters ---------- fix: float Threshold for changing the target. Notes ----- The target in the correction equation is fixed at the first iterations. When the norm of the residual vector is lower than the fix value, the target is set to the corresponding eigenvalue. """ cdef PetscReal val = asReal(fix) CHKERR( PEPJDSetFix(self.pep, val) ) def getJDFix(self): """ Gets threshold for changing the target in the correction equation. Returns ------- fix: float The threshold for changing the target. """ cdef PetscReal val = 0 CHKERR( PEPJDGetFix(self.pep, &val) ) return toReal(val) def setJDReusePreconditioner(self, flag): """ Sets a flag indicating whether the preconditioner must be reused or not. Parameters ---------- flag: bool The reuse flag. """ cdef PetscBool bval = asBool(flag) CHKERR( PEPJDSetReusePreconditioner(self.pep, bval) ) def getJDReusePreconditioner(self): """ Returns the flag for reusing the preconditioner. Returns ------- flag: bool The reuse flag. """ cdef PetscBool bval = PETSC_FALSE CHKERR( PEPJDGetReusePreconditioner(self.pep, &bval) ) return toBool(bval) def setJDMinimalityIndex(self, flag): """ Sets the maximum allowed value for the minimality index. Parameters ---------- flag: int The maximum minimality index. """ cdef PetscInt ival = asInt(flag) CHKERR( PEPJDSetMinimalityIndex(self.pep, ival) ) def getJDMinimalityIndex(self): """ Returns the maximum allowed value of the minimality index. Returns ------- flag: int The maximum minimality index. """ cdef PetscInt ival = 1 CHKERR( PEPJDGetMinimalityIndex(self.pep, &ival) ) return toInt(ival) def setJDProjection(self, proj): """ Sets the type of projection to be used in the Jacobi-Davidson solver. Parameters ---------- proj: `PEP.JDProjection` enumerate The type of projection. """ cdef SlepcPEPJDProjection val = proj CHKERR( PEPJDSetProjection(self.pep, val) ) def getJDProjection(self): """ Gets the type of projection to be used in the Jacobi-Davidson solver. Returns ------- proj: `PEP.JDProjection` enumerate The type of projection. """ cdef SlepcPEPJDProjection val = PEP_JD_PROJECTION_HARMONIC CHKERR( PEPJDGetProjection(self.pep, &val) ) return val # def setCISSExtraction(self, extraction): """ Sets the extraction technique used in the CISS solver. Parameters ---------- extraction: `PEP.CISSExtraction` enumerate The extraction technique. """ cdef SlepcPEPCISSExtraction val = extraction CHKERR( PEPCISSSetExtraction(self.pep, val) ) def getCISSExtraction(self): """ Gets the extraction technique used in the CISS solver. Returns ------- extraction: `PEP.CISSExtraction` enumerate The extraction technique. """ cdef SlepcPEPCISSExtraction val = PEP_CISS_EXTRACTION_RITZ CHKERR( PEPCISSGetExtraction(self.pep, &val) ) return val def setCISSSizes(self, ip=None, bs=None, ms=None, npart=None, bsmax=None, realmats=False): """ Sets the values of various size parameters in the CISS solver. Parameters ---------- ip: int, optional Number of integration points. bs: int, optional Block size. ms: int, optional Moment size. npart: int, optional Number of partitions when splitting the communicator. bsmax: int, optional Maximum block size. realmats: bool, optional True if A and B are real. Notes ----- The default number of partitions is 1. This means the internal `KSP` object is shared among all processes of the `PEP` communicator. Otherwise, the communicator is split into npart communicators, so that `npart` `KSP` solves proceed simultaneously. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT cdef PetscInt ival4 = PETSC_DEFAULT cdef PetscInt ival5 = PETSC_DEFAULT cdef PetscBool bval = asBool(realmats) if ip is not None: ival1 = asInt(ip) if bs is not None: ival2 = asInt(bs) if ms is not None: ival3 = asInt(ms) if npart is not None: ival4 = asInt(npart) if bsmax is not None: ival5 = asInt(bsmax) CHKERR( PEPCISSSetSizes(self.pep, ival1, ival2, ival3, ival4, ival5, bval) ) def getCISSSizes(self): """ Gets the values of various size parameters in the CISS solver. Returns ------- ip: int Number of integration points. bs: int Block size. ms: int Moment size. npart: int Number of partitions when splitting the communicator. bsmax: int Maximum block size. realmats: bool True if A and B are real. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 cdef PetscInt ival4 = 0 cdef PetscInt ival5 = 0 cdef PetscBool bval = PETSC_FALSE CHKERR( PEPCISSGetSizes(self.pep, &ival1, &ival2, &ival3, &ival4, &ival5, &bval) ) return (toInt(ival1), toInt(ival2), toInt(ival3), toInt(ival4), toInt(ival5), toBool(bval)) def setCISSThreshold(self, delta=None, spur=None): """ Sets the values of various threshold parameters in the CISS solver. Parameters ---------- delta: float Threshold for numerical rank. spur: float Spurious threshold (to discard spurious eigenpairs). """ cdef PetscReal rval1 = PETSC_DEFAULT cdef PetscReal rval2 = PETSC_DEFAULT if delta is not None: rval1 = asReal(delta) if spur is not None: rval2 = asReal(spur) CHKERR( PEPCISSSetThreshold(self.pep, rval1, rval2) ) def getCISSThreshold(self): """ Gets the values of various threshold parameters in the CISS solver. Returns ------- delta: float Threshold for numerical rank. spur: float Spurious threshold (to discard spurious eigenpairs. """ cdef PetscReal delta = 0 cdef PetscReal spur = 0 CHKERR( PEPCISSGetThreshold(self.pep, &delta, &spur) ) return (toReal(delta), toReal(spur)) def setCISSRefinement(self, inner=None, blsize=None): """ Sets the values of various refinement parameters in the CISS solver. Parameters ---------- inner: int, optional Number of iterative refinement iterations (inner loop). blsize: int, optional Number of iterative refinement iterations (blocksize loop). """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT if inner is not None: ival1 = asInt(inner) if blsize is not None: ival2 = asInt(blsize) CHKERR( PEPCISSSetRefinement(self.pep, ival1, ival2) ) def getCISSRefinement(self): """ Gets the values of various refinement parameters in the CISS solver. Returns ------- inner: int Number of iterative refinement iterations (inner loop). blsize: int Number of iterative refinement iterations (blocksize loop). """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 CHKERR( PEPCISSGetRefinement(self.pep, &ival1, &ival2) ) return (toInt(ival1), toInt(ival2)) def getCISSKSPs(self): """ Retrieve the array of linear solver objects associated with the CISS solver. Returns ------- ksp: list of `KSP` The linear solver objects. Notes ----- The number of `KSP` solvers is equal to the number of integration points divided by the number of partitions. This value is halved in the case of real matrices with a region centered at the real axis. """ cdef PetscInt i = 0, n = 0 cdef PetscKSP *p = NULL CHKERR( PEPCISSGetKSPs(self.pep, &n, &p) ) return [ref_KSP(p[i]) for i from 0 <= i &self.rg self.rg = NULL def view(self, Viewer viewer=None): """ Prints the RG data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( RGView(self.rg, vwr) ) def destroy(self): """ Destroys the RG object. """ CHKERR( RGDestroy(&self.rg) ) self.rg = NULL return self def create(self, comm=None): """ Creates the RG object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcRG newrg = NULL CHKERR( RGCreate(ccomm, &newrg) ) CHKERR( SlepcCLEAR(self.obj) ); self.rg = newrg return self def setType(self, rg_type): """ Selects the type for the RG object. Parameters ---------- rg_type: `RG.Type` enumerate The inner product type to be used. """ cdef SlepcRGType cval = NULL rg_type = str2bytes(rg_type, &cval) CHKERR( RGSetType(self.rg, cval) ) def getType(self): """ Gets the RG type of this object. Returns ------- type: `RG.Type` enumerate The inner product type currently being used. """ cdef SlepcRGType rg_type = NULL CHKERR( RGGetType(self.rg, &rg_type) ) return bytes2str(rg_type) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all RG options in the database. Parameters ---------- prefix: string The prefix string to prepend to all RG option requests. Notes ----- A hyphen (``-``) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( RGSetOptionsPrefix(self.rg, cval) ) def getOptionsPrefix(self): """ Gets the prefix used for searching for all RG options in the database. Returns ------- prefix: string The prefix string set for this RG object. """ cdef const_char *prefix = NULL CHKERR( RGGetOptionsPrefix(self.rg, &prefix) ) return bytes2str(prefix) def setFromOptions(self): """ Sets RG options from the options database. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( RGSetFromOptions(self.rg) ) # def isTrivial(self): """ Tells whether it is the trivial region (whole complex plane). Returns ------- flag: bool True if the region is equal to the whole complex plane, e.g., an interval region with all four endpoints unbounded or an ellipse with infinite radius. """ cdef PetscBool tval = PETSC_FALSE CHKERR( RGIsTrivial(self.rg, &tval) ) return toBool(tval) def isAxisymmetric(self, vertical=False): """ Determines if the region is symmetric with respect to the real or imaginary axis. Parameters ---------- vertical: bool, optional True if symmetry must be checked against the vertical axis. Returns ------- symm: bool True if the region is axisymmetric. """ cdef PetscBool val = asBool(vertical) cdef PetscBool tval = PETSC_FALSE CHKERR( RGIsAxisymmetric(self.rg, val, &tval) ) return toBool(tval) def getComplement(self): """ Returns the flag indicating whether the region is complemented or not. Returns ------- flg: bool Whether the region is complemented or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( RGGetComplement(self.rg, &tval) ) return toBool(tval) def setComplement(self, comp=True): """ Sets a flag to indicate that the region is the complement of the specified one. Parameters ---------- comp: bool, optional Activate/deactivate the complementation of the region. """ cdef PetscBool tval = asBool(comp) CHKERR( RGSetComplement(self.rg, tval) ) def setScale(self, sfactor=None): """ Sets the scaling factor to be used when checking that a point is inside the region and when computing the contour. Parameters ---------- sfactor: float, optional The scaling factor (default=1). """ cdef PetscReal rval = 1.0 if sfactor is not None: rval = asReal(sfactor) CHKERR( RGSetScale(self.rg, rval) ) def getScale(self): """ Gets the scaling factor. Returns ------- sfactor: float The scaling factor. """ cdef PetscReal rval = 0 CHKERR( RGGetScale(self.rg, &rval) ) return toReal(rval) def checkInside(self, a): """ Determines if a set of given points are inside the region or not. Parameters ---------- a: list of float (complex) The coordinates of the points. Returns ------- inside: list of int Computed result for each point (1=inside, 0=on the contour, -1=outside). """ cdef Py_ssize_t i = 0, n = len(a) cdef PetscScalar *ar = NULL, *ai = NULL cdef PetscInt *inside = NULL cdef tmp1 = allocate(n*sizeof(PetscScalar),&ar) cdef tmp2 if sizeof(PetscScalar) == sizeof(PetscReal): tmp2 = allocate(n*sizeof(PetscScalar),&ai) for i in range(n): ar[i] = asComplexReal(a[i]) ai[i] = asComplexImag(a[i]) else: for i in range(n): ar[i] = asScalar(a[i]) cdef tmp3 = allocate(n*sizeof(PetscInt),&inside) CHKERR( RGCheckInside(self.rg, n, ar, ai, inside) ) return array_i(n, inside) def computeContour(self, n): """ Computes the coordinates of several points lying on the contour of the region. Parameters ---------- n: int The number of points to compute. Returns ------- x: list of float (complex) Computed points. """ cdef PetscInt k = asInt(n), i = 0 cdef PetscScalar *cr = NULL, *ci = NULL cdef tmp1 = allocate(k*sizeof(PetscScalar),&cr) cdef tmp2 if sizeof(PetscScalar) == sizeof(PetscReal): tmp2 = allocate(k*sizeof(PetscScalar),&ci) CHKERR( RGComputeContour(self.rg, k, cr, ci) ) if sizeof(PetscScalar) == sizeof(PetscReal): return [toComplex(cr[i],ci[i]) for i from 0 <= i k*sizeof(PetscScalar),&z) cdef tmp2 = allocate(k*sizeof(PetscScalar),&zn) cdef tmp3 = allocate(k*sizeof(PetscScalar),&w) CHKERR( RGComputeQuadrature(self.rg, val, k, z, zn, w) ) return (array_s(k, z), array_s(k, zn), array_s(k, w)) # def setEllipseParameters(self, center, radius, vscale=None): """ Sets the parameters defining the ellipse region. Parameters ---------- center: float (real or complex) The center. radius: float The radius. vscale: float, optional The vertical scale. """ cdef PetscScalar sval = asScalar(center) cdef PetscReal val1 = asReal(radius) cdef PetscReal val2 = 1.0 if vscale is not None: val2 = asReal(vscale) CHKERR( RGEllipseSetParameters(self.rg, sval, val1, val2) ) def getEllipseParameters(self): """ Gets the parameters that define the ellipse region. Returns ------- center: float (real or complex) The center. radius: float The radius. vscale: float The vertical scale. """ cdef PetscScalar sval = 0 cdef PetscReal val1 = 0 cdef PetscReal val2 = 0 CHKERR( RGEllipseGetParameters(self.rg, &sval, &val1, &val2) ) return (toScalar(sval), toReal(val1), toReal(val2)) def setIntervalEndpoints(self, a, b, c, d): """ Sets the parameters defining the interval region. Parameters ---------- a: float The left endpoint in the real axis. b: float The right endpoint in the real axis. c: float The upper endpoint in the imaginary axis. d: float The lower endpoint in the imaginary axis. """ cdef PetscReal va = asReal(a) cdef PetscReal vb = asReal(b) cdef PetscReal vc = asReal(c) cdef PetscReal vd = asReal(d) CHKERR( RGIntervalSetEndpoints(self.rg, va, vb, vc, vd) ) def getIntervalEndpoints(self): """ Gets the parameters that define the interval region. Returns ------- a: float The left endpoint in the real axis. b: float The right endpoint in the real axis. c: float The upper endpoint in the imaginary axis. d: float The lower endpoint in the imaginary axis. """ cdef PetscReal va = 0 cdef PetscReal vb = 0 cdef PetscReal vc = 0 cdef PetscReal vd = 0 CHKERR( RGIntervalGetEndpoints(self.rg, &va, &vb, &vc, &vd) ) return (toReal(va), toReal(vb), toReal(vc), toReal(vd)) def setPolygonVertices(self, v): """ Sets the vertices that define the polygon region. Parameters ---------- v: list of float (complex) The vertices. """ cdef Py_ssize_t i = 0, n = len(v) cdef PetscScalar *vr = NULL, *vi = NULL cdef tmp1 = allocate(n*sizeof(PetscScalar),&vr) cdef tmp2 if sizeof(PetscScalar) == sizeof(PetscReal): tmp2 = allocate(n*sizeof(PetscScalar),&vi) for i in range(n): vr[i] = asComplexReal(v[i]) vi[i] = asComplexImag(v[i]) else: for i in range(n): vr[i] = asScalar(v[i]) CHKERR( RGPolygonSetVertices(self.rg, n, vr, vi) ) def getPolygonVertices(self): """ Gets the parameters that define the interval region. Returns ------- v: list of float (complex) The vertices. """ cdef PetscInt n = 0 cdef PetscScalar *vr = NULL, *vi = NULL CHKERR( RGPolygonGetVertices(self.rg, &n, &vr, &vi) ) if sizeof(PetscScalar) == sizeof(PetscReal): v = [toComplex(vr[i],vi[i]) for i from 0 <= i p if isinstance(s, str): return s else: return s.decode() cdef inline object str2bytes(object s, const_char *p[]): if s is None: p[0] = NULL return None if not isinstance(s, bytes): s = s.encode() p[0] = (s) return s cdef inline object S_(const_char p[]): if p == NULL: return None cdef object s = p return s if isinstance(s, str) else s.decode() include "allocate.pxi" # ----------------------------------------------------------------------------- # Vile hack for raising a exception and not contaminating traceback cdef extern from * nogil: void PyErr_SetObject(object, object) void *PyExc_RuntimeError cdef object PetscError = PyExc_RuntimeError from petsc4py.PETSc import Error as PetscError cdef inline PetscErrorCode SETERR(PetscErrorCode ierr) with gil: if (PetscError) != NULL: PyErr_SetObject(PetscError, ierr) else: PyErr_SetObject(PyExc_RuntimeError, ierr) return ierr # ----------------------------------------------------------------------------- cdef extern from * nogil: ctypedef long PetscInt ctypedef double PetscReal ctypedef double PetscScalar ctypedef PetscInt const_PetscInt "const PetscInt" ctypedef PetscReal const_PetscReal "const PetscReal" ctypedef PetscScalar const_PetscScalar "const PetscScalar" cdef inline object toBool(PetscBool value): return True if value else False cdef inline PetscBool asBool(object value) except? 0: return PETSC_TRUE if value else PETSC_FALSE cdef inline object toInt(PetscInt value): return value cdef inline PetscInt asInt(object value) except? -1: return value cdef inline object toReal(PetscReal value): return value cdef inline PetscReal asReal(object value) except? -1: return value cdef extern from "": object PyPetscScalar_FromPetscScalar(PetscScalar) PetscScalar PyPetscScalar_AsPetscScalar(object) except? -1.0 cdef inline object toScalar(PetscScalar value): return PyPetscScalar_FromPetscScalar(value) cdef inline PetscScalar asScalar(object value) except? -1.0: return PyPetscScalar_AsPetscScalar(value) cdef extern from "Python.h": PyObject *PyErr_Occurred() ctypedef struct Py_complex: double real double imag Py_complex PyComplex_AsCComplex(object) cdef inline object toComplex(PetscScalar rvalue, PetscScalar ivalue): return complex(toScalar(rvalue), toScalar(ivalue)) cdef inline PetscReal asComplexReal(object value) except? -1.0: cdef Py_complex cval = PyComplex_AsCComplex(value) return cval.real cdef inline PetscReal asComplexImag(object value) except? -1.0: cdef Py_complex cval = PyComplex_AsCComplex(value) if cval.real == -1.0 and PyErr_Occurred() != NULL: cval.imag = -1.0 return cval.imag # -------------------------------------------------------------------- # NumPy support # ------------- include "arraynpy.pxi" import_array() IntType = PyArray_TypeObjectFromType(NPY_PETSC_INT) RealType = PyArray_TypeObjectFromType(NPY_PETSC_REAL) ScalarType = PyArray_TypeObjectFromType(NPY_PETSC_SCALAR) ComplexType = PyArray_TypeObjectFromType(NPY_PETSC_COMPLEX) # ----------------------------------------------------------------------------- cdef extern from "" nogil: void* memset(void*,int,size_t) void* memcpy(void*,void*,size_t) char* strdup(char*) # ----------------------------------------------------------------------------- include "slepcmpi.pxi" include "slepcsys.pxi" include "slepcst.pxi" include "slepcbv.pxi" include "slepcds.pxi" include "slepcfn.pxi" include "slepcrg.pxi" include "slepceps.pxi" include "slepcsvd.pxi" include "slepcpep.pxi" include "slepcnep.pxi" include "slepcmfn.pxi" # ----------------------------------------------------------------------------- __doc__ = u""" Scalable Library for Eigenvalue Problem Computations """ DECIDE = PETSC_DECIDE DEFAULT = PETSC_DEFAULT DETERMINE = PETSC_DETERMINE include "Sys.pyx" include "ST.pyx" include "BV.pyx" include "DS.pyx" include "FN.pyx" include "RG.pyx" include "EPS.pyx" include "SVD.pyx" include "PEP.pyx" include "NEP.pyx" include "MFN.pyx" # ----------------------------------------------------------------------------- include "CAPI.pyx" # ----------------------------------------------------------------------------- cdef extern from "Python.h": int Py_AtExit(void (*)()) void PySys_WriteStderr(char*,...) cdef extern from "" nogil: ctypedef struct FILE FILE *stderr int fprintf(FILE *, char *, ...) cdef int initialize(object args) except PETSC_ERR_PYTHON: if (SlepcInitializeCalled): return 1 if (SlepcFinalizeCalled): return 0 # initialize SLEPC CHKERR( SlepcInitialize(NULL, NULL, NULL, NULL) ) # register finalization function if Py_AtExit(finalize) < 0: PySys_WriteStderr(b"warning: could not register %s with Py_AtExit()", b"SlepcFinalize()") return 1 # and we are done, enjoy !! from petsc4py.PETSc cimport PyPetscType_Register cdef extern from * nogil: PetscErrorCode SlepcInitializePackageAll() ctypedef int PetscClassId PetscClassId SLEPC_ST_CLASSID "ST_CLASSID" PetscClassId SLEPC_BV_CLASSID "BV_CLASSID" PetscClassId SLEPC_DS_CLASSID "DS_CLASSID" PetscClassId SLEPC_FN_CLASSID "FN_CLASSID" PetscClassId SLEPC_RG_CLASSID "RG_CLASSID" PetscClassId SLEPC_EPS_CLASSID "EPS_CLASSID" PetscClassId SLEPC_SVD_CLASSID "SVD_CLASSID" PetscClassId SLEPC_PEP_CLASSID "PEP_CLASSID" PetscClassId SLEPC_NEP_CLASSID "NEP_CLASSID" PetscClassId SLEPC_MFN_CLASSID "MFN_CLASSID" cdef PetscErrorCode register(char path[]) except PETSC_ERR_PYTHON: # make sure all SLEPc packages are initialized CHKERR( SlepcInitializePackageAll() ) # register Python types PyPetscType_Register(SLEPC_ST_CLASSID, ST) PyPetscType_Register(SLEPC_BV_CLASSID, BV) PyPetscType_Register(SLEPC_DS_CLASSID, DS) PyPetscType_Register(SLEPC_FN_CLASSID, FN) PyPetscType_Register(SLEPC_RG_CLASSID, RG) PyPetscType_Register(SLEPC_EPS_CLASSID, EPS) PyPetscType_Register(SLEPC_SVD_CLASSID, SVD) PyPetscType_Register(SLEPC_PEP_CLASSID, PEP) PyPetscType_Register(SLEPC_NEP_CLASSID, NEP) PyPetscType_Register(SLEPC_MFN_CLASSID, MFN) return PETSC_SUCCESS cdef void finalize() nogil: cdef PetscErrorCode ierr = PETSC_SUCCESS # manage SLEPc finalization if not (SlepcInitializeCalled): return if (SlepcFinalizeCalled): return # finalize SLEPc ierr = SlepcFinalize() if ierr != PETSC_SUCCESS: fprintf(stderr, "SlepcFinalize() failed " "[error code: %d]\n", ierr) # and we are done, see you later !! # ----------------------------------------------------------------------------- def _initialize(args=None): cdef int ready = initialize(args) if ready: register(NULL) def _finalize(): finalize() # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/ST.pyx000066400000000000000000000505511454104675500177220ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class STType(object): """ ST types - `SHELL`: User-defined. - `SHIFT`: Shift from origin. - `SINVERT`: Shift-and-invert. - `CAYLEY`: Cayley transform. - `PRECOND`: Preconditioner. - `FILTER`: Polynomial filter. """ SHELL = S_(STSHELL) SHIFT = S_(STSHIFT) SINVERT = S_(STSINVERT) CAYLEY = S_(STCAYLEY) PRECOND = S_(STPRECOND) FILTER = S_(STFILTER) class STMatMode(object): """ ST matrix mode - `COPY`: A working copy of the matrix is created. - `INPLACE`: The operation is computed in-place. - `SHELL`: The matrix ``A-sigma*B`` is handled as an implicit matrix. """ COPY = ST_MATMODE_COPY INPLACE = ST_MATMODE_INPLACE SHELL = ST_MATMODE_SHELL # ----------------------------------------------------------------------------- cdef class ST(Object): """ ST """ Type = STType MatMode = STMatMode def __cinit__(self): self.obj = &self.st self.st = NULL def view(self, Viewer viewer=None): """ Prints the ST data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( STView(self.st, vwr) ) def destroy(self): """ Destroys the ST object. """ CHKERR( STDestroy(&self.st) ) self.st = NULL return self def reset(self): """ Resets the ST object. """ CHKERR( STReset(self.st) ) def create(self, comm=None): """ Creates the ST object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcST newst = NULL CHKERR( STCreate(ccomm, &newst) ) CHKERR( SlepcCLEAR(self.obj) ); self.st = newst return self def setType(self, st_type): """ Builds ST for a particular spectral transformation. Parameters ---------- st_type: `ST.Type` enumerate The spectral transformation to be used. Notes ----- See `ST.Type` for available methods. The default is `ST.Type.SHIFT` with a zero shift. Normally, it is best to use `setFromOptions()` and then set the ST type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods. """ cdef SlepcSTType cval = NULL st_type = str2bytes(st_type, &cval) CHKERR( STSetType(self.st, cval) ) def getType(self): """ Gets the ST type of this object. Returns ------- type: `ST.Type` enumerate The spectral transformation currently being used. """ cdef SlepcSTType st_type = NULL CHKERR( STGetType(self.st, &st_type) ) return bytes2str(st_type) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all ST options in the database. Parameters ---------- prefix: string The prefix string to prepend to all ST option requests. Notes ----- A hyphen (``-``) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( STSetOptionsPrefix(self.st, cval) ) def getOptionsPrefix(self): """ Gets the prefix used for searching for all ST options in the database. Returns ------- prefix: string The prefix string set for this ST object. """ cdef const_char *prefix = NULL CHKERR( STGetOptionsPrefix(self.st, &prefix) ) return bytes2str(prefix) def setFromOptions(self): """ Sets ST options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. Notes ----- To see all options, run your program with the -help option. """ CHKERR( STSetFromOptions(self.st) ) # def setShift(self, shift): """ Sets the shift associated with the spectral transformation. Parameters ---------- shift: scalar (possibly complex) The value of the shift. Notes ----- In some spectral transformations, changing the shift may have associated a lot of work, for example recomputing a factorization. """ cdef PetscScalar sval = asScalar(shift) CHKERR( STSetShift(self.st, sval) ) def getShift(self): """ Gets the shift associated with the spectral transformation. Returns ------- shift: scalar (possibly complex) The value of the shift. """ cdef PetscScalar sval = 0 CHKERR( STGetShift(self.st, &sval) ) return toScalar(sval) def setTransform(self, flag=True): """ Sets a flag to indicate whether the transformed matrices are computed or not. Parameters ---------- flag: bool, optional This flag is intended for the case of polynomial eigenproblems solved via linearization. If this flag is False (default) the spectral transformation is applied to the linearization (handled by the eigensolver), otherwise it is applied to the original problem. """ cdef PetscBool sval = asBool(flag) CHKERR( STSetTransform(self.st, sval) ) def getTransform(self): """ Gets the flag indicating whether the transformed matrices are computed or not. Returns ------- flag: bool This flag is intended for the case of polynomial eigenproblems solved via linearization. If this flag is False (default) the spectral transformation is applied to the linearization (handled by the eigensolver), otherwise it is applied to the original problem. """ cdef PetscBool sval = PETSC_FALSE CHKERR( STGetTransform(self.st, &sval) ) return toBool(sval) def setMatMode(self, mode): """ Sets a flag to indicate how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations. Parameters ---------- mode: `ST.MatMode` enumerate The mode flag. Notes ----- By default (`ST.MatMode.COPY`), a copy of matrix ``A`` is made and then this copy is shifted explicitly, e.g. ``A <- (A - s B)``. With `ST.MatMode.INPLACE`, the original matrix ``A`` is shifted at `setUp()` and unshifted at the end of the computations. With respect to the previous one, this mode avoids a copy of matrix ``A``. However, a backdraw is that the recovered matrix might be slightly different from the original one (due to roundoff). With `ST.MatMode.SHELL`, the solver works with an implicit shell matrix that represents the shifted matrix. This mode is the most efficient in creating the shifted matrix but it places serious limitations to the linear solves performed in each iteration of the eigensolver (typically, only iterative solvers with Jacobi preconditioning can be used). In the case of generalized problems, in the two first modes the matrix ``A - s B`` has to be computed explicitly. The efficiency of this computation can be controlled with `setMatStructure()`. """ cdef SlepcSTMatMode val = mode CHKERR( STSetMatMode(self.st, val) ) def getMatMode(self): """ Gets a flag that indicates how the matrix is being shifted in the shift-and-invert and Cayley spectral transformations. Returns ------- mode: `ST.MatMode` enumerate The mode flag. """ cdef SlepcSTMatMode val = ST_MATMODE_INPLACE CHKERR( STGetMatMode(self.st, &val) ) return val def setMatrices(self, operators): """ Sets the matrices associated with the eigenvalue problem. Parameters ---------- operators: sequence of Mat The matrices associated with the eigensystem. """ operators = tuple(operators) cdef PetscMat *mats = NULL cdef Py_ssize_t k=0, n = len(operators) cdef tmp = allocate(n*sizeof(PetscMat),&mats) for k from 0 <= k < n: mats[k] = (operators[k]).mat CHKERR( STSetMatrices(self.st, n, mats) ) def getMatrices(self): """ Gets the matrices associated with the eigenvalue problem. Returns ------- operators: tuple of Mat The matrices associated with the eigensystem. """ cdef Mat A cdef PetscMat mat = NULL cdef PetscInt k=0, n=0 CHKERR( STGetNumMatrices(self.st, &n) ) cdef object operators = [] for k from 0 <= k < n: CHKERR( STGetMatrix(self.st, k, &mat) ) A = Mat(); A.mat = mat; CHKERR( PetscINCREF(A.obj) ) operators.append(A) return tuple(operators) def setMatStructure(self, structure): """ Sets an internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the two matrices ``A`` and ``B`` constituting the generalized eigenvalue problem. This function has no effect in the case of standard eigenproblems. Parameters ---------- structure: `PETSc.Mat.Structure` enumerate Either same, different, or a subset of the non-zero sparsity pattern. Notes ----- By default, the sparsity patterns are assumed to be different. If the patterns are equal or a subset then it is recommended to set this attribute for efficiency reasons (in particular, for internal *AXPY()* matrix operations). """ cdef PetscMatStructure val = matstructure(structure) CHKERR( STSetMatStructure(self.st, val) ) def getMatStructure(self): """ Gets the internal Mat.Structure attribute to indicate which is the relation of the sparsity pattern of the matrices. Returns ------- structure: `PETSc.Mat.Structure` enumerate The structure flag. """ cdef PetscMatStructure val CHKERR( STGetMatStructure(self.st, &val) ) return val def setKSP(self, KSP ksp): """ Sets the KSP object associated with the spectral transformation. Parameters ---------- ksp: KSP The linear solver object. """ CHKERR( STSetKSP(self.st, ksp.ksp) ) def getKSP(self): """ Gets the KSP object associated with the spectral transformation. Returns ------- ksp: KSP The linear solver object. Notes ----- On output, the internal value of KSP can be ``NULL`` if the combination of eigenproblem type and selected transformation does not require to solve a linear system of equations. """ cdef KSP ksp = KSP() CHKERR( STGetKSP(self.st, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp def setPreconditionerMat(self, Mat P=None): """ Sets the matrix to be used to build the preconditioner. Parameters ---------- P: Mat, optional The matrix that will be used in constructing the preconditioner. """ cdef PetscMat Pmat = P.mat if P is not None else NULL CHKERR( STSetPreconditionerMat(self.st, Pmat) ) def getPreconditionerMat(self): """ Gets the matrix previously set by setPreconditionerMat(). Returns ------- P: Mat The matrix that will be used in constructing the preconditioner. """ cdef Mat P = Mat() CHKERR( STGetPreconditionerMat(self.st, &P.mat) ) CHKERR( PetscINCREF(P.obj) ) return P # def setUp(self): """ Prepares for the use of a spectral transformation. """ CHKERR( STSetUp(self.st) ) def apply(self, Vec x, Vec y): """ Applies the spectral transformation operator to a vector, for instance ``(A - sB)^-1 B`` in the case of the shift-and-invert transformation and generalized eigenproblem. Parameters ---------- x: Vec The input vector. y: Vec The result vector. """ CHKERR( STApply(self.st, x.vec, y.vec) ) def applyTranspose(self, Vec x, Vec y): """ Applies the transpose of the operator to a vector, for instance ``B^T(A - sB)^-T`` in the case of the shift-and-invert transformation and generalized eigenproblem. Parameters ---------- x: Vec The input vector. y: Vec The result vector. """ CHKERR( STApplyTranspose(self.st, x.vec, y.vec) ) def applyHermitianTranspose(self, Vec x, Vec y): """ Applies the hermitian-transpose of the operator to a vector, for instance ``B^H(A - sB)^-H`` in the case of the shift-and-invert transformation and generalized eigenproblem. Parameters ---------- x: Vec The input vector. y: Vec The result vector. """ CHKERR( STApplyHermitianTranspose(self.st, x.vec, y.vec) ) def applyMat(self, Mat x, Mat y): """ Applies the spectral transformation operator to a matrix, for instance ``(A - sB)^-1 B`` in the case of the shift-and-invert transformation and generalized eigenproblem. Parameters ---------- x: Mat The input matrix. y: Mat The result matrix. """ CHKERR( STApplyMat(self.st, x.mat, y.mat) ) def getOperator(self): """ Returns a shell matrix that represents the operator of the spectral transformation. Returns ------- op: Mat Operator matrix. """ cdef Mat op = Mat() CHKERR( STGetOperator(self.st, &op.mat) ) CHKERR( PetscINCREF(op.obj) ) return op def restoreOperator(self, Mat op): """ Restore the previously seized operator matrix. Parameters ---------- op: Mat Operator matrix previously obtained with getOperator(). """ CHKERR( PetscObjectDereference(op.mat) ) CHKERR( STRestoreOperator(self.st, &op.mat) ) # def setCayleyAntishift(self, tau): """ Sets the value of the anti-shift for the Cayley spectral transformation. Parameters ---------- tau: scalar (possibly complex) The anti-shift. Notes ----- In the generalized Cayley transform, the operator can be expressed as ``OP = inv(A - sigma B)*(A + tau B)``. This function sets the value of `tau`. Use `setShift()` for setting ``sigma``. """ cdef PetscScalar sval = asScalar(tau) CHKERR( STCayleySetAntishift(self.st, sval) ) def getCayleyAntishift(self): """ Gets the value of the anti-shift for the Cayley spectral transformation. Returns ------- tau: scalar (possibly complex) The anti-shift. """ cdef PetscScalar sval = 0 CHKERR( STCayleyGetAntishift(self.st, &sval) ) return toScalar(sval) def setFilterInterval(self, inta, intb): """ Defines the interval containing the desired eigenvalues. Parameters ---------- inta: float The left end of the interval. intb: float The right end of the interval. Notes ----- The filter will be configured to emphasize eigenvalues contained in the given interval, and damp out eigenvalues outside it. If the interval is open, then the filter is low- or high-pass, otherwise it is mid-pass. Common usage is to set the interval in `EPS` with `EPS.setInterval()`. The interval must be contained within the numerical range of the matrix, see `ST.setFilterRange()`. """ cdef PetscReal rval1 = asReal(inta) cdef PetscReal rval2 = asReal(intb) CHKERR( STFilterSetInterval(self.st, rval1, rval2) ) def getFilterInterval(self): """ Gets the interval containing the desired eigenvalues. Returns ------- inta: float The left end of the interval. intb: float The right end of the interval. """ cdef PetscReal inta = 0 cdef PetscReal intb = 0 CHKERR( STFilterGetInterval(self.st, &inta, &intb) ) return (toReal(inta), toReal(intb)) def setFilterRange(self, left, right): """ Defines the numerical range (or field of values) of the matrix, that is, the interval containing all eigenvalues. Parameters ---------- left: float The left end of the interval. right: float The right end of the interval. Notes ----- The filter will be most effective if the numerical range is tight, that is, left and right are good approximations to the leftmost and rightmost eigenvalues, respectively. """ cdef PetscReal rval1 = asReal(left) cdef PetscReal rval2 = asReal(right) CHKERR( STFilterSetRange(self.st, rval1, rval2) ) def getFilterRange(self): """ Gets the interval containing all eigenvalues. Returns ------- left: float The left end of the interval. right: float The right end of the interval. """ cdef PetscReal left = 0 cdef PetscReal right = 0 CHKERR( STFilterGetRange(self.st, &left, &right) ) return (toReal(left), toReal(right)) def setFilterDegree(self, deg): """ Sets the degree of the filter polynomial. Parameters ---------- deg: int The polynomial degree. """ cdef PetscInt val = asInt(deg) CHKERR( STFilterSetDegree(self.st, val) ) def getFilterDegree(self): """ Gets the degree of the filter polynomial. Returns ------- deg: int The polynomial degree. """ cdef PetscInt val = 0 CHKERR( STFilterGetDegree(self.st, &val) ) return toInt(val) # property shift: def __get__(self): return self.getShift() def __set__(self, value): self.setShift(value) property transform: def __get__(self): return self.getTransform() def __set__(self, value): self.setTransform(value) property mat_mode: def __get__(self): return self.getMatMode() def __set__(self, value): self.setMatMode(value) property mat_structure: def __get__(self): return self.getMatStructure() def __set__(self, value): self.setMatStructure(value) property ksp: def __get__(self): return self.getKSP() def __set__(self, value): self.setKSP(value) # ----------------------------------------------------------------------------- del STType del STMatMode # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/SVD.pyx000066400000000000000000001207061454104675500200300ustar00rootroot00000000000000# ----------------------------------------------------------------------------- class SVDType(object): """ SVD types - `CROSS`: Eigenproblem with the cross-product matrix. - `CYCLIC`: Eigenproblem with the cyclic matrix. - `LAPACK`: Wrappers to dense SVD solvers in Lapack. - `LANCZOS`: Lanczos. - `TRLANCZOS`: Thick-restart Lanczos. - `RANDOMIZED`: Iterative RSVD for low-rank matrices. Wrappers to external SVD solvers (should be enabled during installation of SLEPc) - `SCALAPACK`: - `KSVD`: - `ELEMENTAL`: - `PRIMME`: """ CROSS = S_(SVDCROSS) CYCLIC = S_(SVDCYCLIC) LAPACK = S_(SVDLAPACK) LANCZOS = S_(SVDLANCZOS) TRLANCZOS = S_(SVDTRLANCZOS) RANDOMIZED = S_(SVDRANDOMIZED) SCALAPACK = S_(SVDSCALAPACK) KSVD = S_(SVDKSVD) ELEMENTAL = S_(SVDELEMENTAL) PRIMME = S_(SVDPRIMME) class SVDProblemType(object): """ SVD problem type - `STANDARD`: Standard SVD. - `GENERALIZED`: Generalized singular value decomposition (GSVD). - `HYPERBOLIC` : Hyperbolic singular value decomposition (HSVD). """ STANDARD = SVD_STANDARD GENERALIZED = SVD_GENERALIZED HYPERBOLIC = SVD_HYPERBOLIC class SVDErrorType(object): """ SVD error type to assess accuracy of computed solutions - `ABSOLUTE`: Absolute error. - `RELATIVE`: Relative error. - `NORM`: Error relative to the matrix norm. """ ABSOLUTE = SVD_ERROR_ABSOLUTE RELATIVE = SVD_ERROR_RELATIVE NORM = SVD_ERROR_NORM class SVDWhich(object): """ SVD desired part of spectrum - `LARGEST`: Largest singular values. - `SMALLEST`: Smallest singular values. """ LARGEST = SVD_LARGEST SMALLEST = SVD_SMALLEST class SVDConv(object): """ SVD convergence test - `ABS`: Absolute convergence test. - `REL`: Convergence test relative to the singular value. - `NORM`: Convergence test relative to the matrix norms. - `MAXIT`: No convergence until maximum number of iterations has been reached. - `USER`: User-defined convergence test. """ ABS = SVD_CONV_ABS REL = SVD_CONV_REL NORM = SVD_CONV_NORM MAXIT = SVD_CONV_MAXIT USER = SVD_CONV_USER class SVDStop(object): """ SVD stopping test - `BASIC`: Default stopping test. - `USER`: User-defined stopping test. """ BASIC = SVD_STOP_BASIC USER = SVD_STOP_USER class SVDConvergedReason(object): """ SVD convergence reasons - `CONVERGED_TOL`: All eigenpairs converged to requested tolerance. - `CONVERGED_USER`: User-defined convergence criterion satisfied. - `CONVERGED_MAXIT`: Maximum iterations completed in case MAXIT convergence criterion. - `DIVERGED_ITS`: Maximum number of iterations exceeded. - `DIVERGED_BREAKDOWN`: Solver failed due to breakdown. - `CONVERGED_ITERATING`: Iteration not finished yet. """ CONVERGED_TOL = SVD_CONVERGED_TOL CONVERGED_USER = SVD_CONVERGED_USER CONVERGED_MAXIT = SVD_CONVERGED_MAXIT DIVERGED_ITS = SVD_DIVERGED_ITS DIVERGED_BREAKDOWN = SVD_DIVERGED_BREAKDOWN CONVERGED_ITERATING = SVD_CONVERGED_ITERATING ITERATING = SVD_CONVERGED_ITERATING class SVDTRLanczosGBidiag(object): """ SVD TRLanczos bidiagonalization choices for the GSVD case - `SINGLE`: Single bidiagonalization (Qa). - `UPPER`: Joint bidiagonalization, both Qa and Qb in upper bidiagonal form. - `LOWER`: Joint bidiagonalization, Qa lower bidiagonal, Qb upper bidiagonal. """ SINGLE = SVD_TRLANCZOS_GBIDIAG_SINGLE UPPER = SVD_TRLANCZOS_GBIDIAG_UPPER LOWER = SVD_TRLANCZOS_GBIDIAG_LOWER # ----------------------------------------------------------------------------- cdef class SVD(Object): """ SVD """ Type = SVDType ProblemType = SVDProblemType ErrorType = SVDErrorType Which = SVDWhich Conv = SVDConv Stop = SVDStop ConvergedReason = SVDConvergedReason TRLanczosGBidiag = SVDTRLanczosGBidiag def __cinit__(self): self.obj = &self.svd self.svd = NULL def view(self, Viewer viewer=None): """ Prints the SVD data structure. Parameters ---------- viewer: Viewer, optional Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( SVDView(self.svd, vwr) ) def destroy(self): """ Destroys the SVD object. """ CHKERR( SVDDestroy(&self.svd) ) self.svd = NULL return self def reset(self): """ Resets the SVD object. """ CHKERR( SVDReset(self.svd) ) def create(self, comm=None): """ Creates the SVD object. Parameters ---------- comm: Comm, optional MPI communicator; if not provided, it defaults to all processes. """ cdef MPI_Comm ccomm = def_Comm(comm, SLEPC_COMM_DEFAULT()) cdef SlepcSVD newsvd = NULL CHKERR( SVDCreate(ccomm, &newsvd) ) CHKERR( SlepcCLEAR(self.obj) ); self.svd = newsvd return self def setType(self, svd_type): """ Selects the particular solver to be used in the SVD object. Parameters ---------- svd_type: `SVD.Type` enumerate The solver to be used. Notes ----- See `SVD.Type` for available methods. The default is CROSS. Normally, it is best to use `setFromOptions()` and then set the SVD type from the options database rather than by using this routine. Using the options database provides the user with maximum flexibility in evaluating the different available methods. """ cdef SlepcSVDType cval = NULL svd_type = str2bytes(svd_type, &cval) CHKERR( SVDSetType(self.svd, cval) ) def getType(self): """ Gets the SVD type of this object. Returns ------- type: `SVD.Type` enumerate The solver currently being used. """ cdef SlepcSVDType svd_type = NULL CHKERR( SVDGetType(self.svd, &svd_type) ) return bytes2str(svd_type) def getOptionsPrefix(self): """ Gets the prefix used for searching for all SVD options in the database. Returns ------- prefix: string The prefix string set for this SVD object. """ cdef const_char *prefix = NULL CHKERR( SVDGetOptionsPrefix(self.svd, &prefix) ) return bytes2str(prefix) def setOptionsPrefix(self, prefix): """ Sets the prefix used for searching for all SVD options in the database. Parameters ---------- prefix: string The prefix string to prepend to all SVD option requests. Notes ----- A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. For example, to distinguish between the runtime options for two different SVD contexts, one could call:: S1.setOptionsPrefix("svd1_") S2.setOptionsPrefix("svd2_") """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( SVDSetOptionsPrefix(self.svd, cval) ) def appendOptionsPrefix(self, prefix): """ Appends to the prefix used for searching for all SVD options in the database. Parameters ---------- prefix: string The prefix string to prepend to all SVD option requests. """ cdef const_char *cval = NULL prefix = str2bytes(prefix, &cval) CHKERR( SVDAppendOptionsPrefix(self.svd, cval) ) def setFromOptions(self): """ Sets SVD options from the options database. This routine must be called before `setUp()` if the user is to be allowed to set the solver type. Notes ----- To see all options, run your program with the ``-help`` option. """ CHKERR( SVDSetFromOptions(self.svd) ) def getProblemType(self): """ Gets the problem type from the SVD object. Returns ------- problem_type: `SVD.ProblemType` enumerate The problem type that was previously set. """ cdef SlepcSVDProblemType val = SVD_STANDARD CHKERR( SVDGetProblemType(self.svd, &val) ) return val def setProblemType(self, problem_type): """ Specifies the type of the singular value problem. Parameters ---------- problem_type: `SVD.ProblemType` enumerate The problem type to be set. """ cdef SlepcSVDProblemType val = problem_type CHKERR( SVDSetProblemType(self.svd, val) ) def isGeneralized(self): """ Tells whether the SVD object corresponds to a generalized singular value problem. Returns ------- flag: bool True if two matrices were set with `setOperators()`. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDIsGeneralized(self.svd, &tval) ) return toBool(tval) def isHyperbolic(self): """ Tells whether the SVD object corresponds to a hyperbolic singular value problem. Returns ------- flag: bool True if the problem was specified as hyperbolic. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDIsHyperbolic(self.svd, &tval) ) return toBool(tval) # def getImplicitTranspose(self): """ Gets the mode used to handle the transpose of the matrix associated with the singular value problem. Returns ------- impl: bool How to handle the transpose (implicitly or not). """ cdef PetscBool val = PETSC_FALSE CHKERR( SVDGetImplicitTranspose(self.svd, &val) ) return toBool(val) def setImplicitTranspose(self, mode): """ Indicates how to handle the transpose of the matrix associated with the singular value problem. Parameters ---------- impl: bool How to handle the transpose (implicitly or not). Notes ----- By default, the transpose of the matrix is explicitly built (if the matrix has defined the MatTranspose operation). If this flag is set to true, the solver does not build the transpose, but handles it implicitly via MatMultTranspose(). """ cdef PetscBool val = asBool(mode) CHKERR( SVDSetImplicitTranspose(self.svd, val) ) def getWhichSingularTriplets(self): """ Returns which singular triplets are to be sought. Returns ------- which: `SVD.Which` enumerate The singular values to be sought (either largest or smallest). """ cdef SlepcSVDWhich val = SVD_LARGEST CHKERR( SVDGetWhichSingularTriplets(self.svd, &val) ) return val def setWhichSingularTriplets(self, which): """ Specifies which singular triplets are to be sought. Parameters ---------- which: `SVD.Which` enumerate The singular values to be sought (either largest or smallest). """ cdef SlepcSVDWhich val = which CHKERR( SVDSetWhichSingularTriplets(self.svd, val) ) def getTolerances(self): """ Gets the tolerance and maximum iteration count used by the default SVD convergence tests. Returns ------- tol: float The convergence tolerance. max_it: int The maximum number of iterations """ cdef PetscReal rval = 0 cdef PetscInt ival = 0 CHKERR( SVDGetTolerances(self.svd, &rval, &ival) ) return (toReal(rval), toInt(ival)) def setTolerances(self, tol=None, max_it=None): """ Sets the tolerance and maximum iteration count used by the default SVD convergence tests. Parameters ---------- tol: float, optional The convergence tolerance. max_it: int, optional The maximum number of iterations Notes ----- Use `DECIDE` for `max_it` to assign a reasonably good value, which is dependent on the solution method. """ cdef PetscReal rval = PETSC_DEFAULT cdef PetscInt ival = PETSC_DEFAULT if tol is not None: rval = asReal(tol) if max_it is not None: ival = asInt(max_it) CHKERR( SVDSetTolerances(self.svd, rval, ival) ) def getConvergenceTest(self): """ Return the method used to compute the error estimate used in the convergence test. Returns ------- conv: SVD.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcSVDConv conv = SVD_CONV_REL CHKERR( SVDGetConvergenceTest(self.svd, &conv) ) return conv def setConvergenceTest(self, conv): """ Specifies how to compute the error estimate used in the convergence test. Parameters ---------- conv: SVD.Conv The method used to compute the error estimate used in the convergence test. """ cdef SlepcSVDConv tconv = conv CHKERR( SVDSetConvergenceTest(self.svd, tconv) ) def getTrackAll(self): """ Returns the flag indicating whether all residual norms must be computed or not. Returns ------- trackall: bool Whether the solver compute all residuals or not. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDGetTrackAll(self.svd, &tval) ) return toBool(tval) def setTrackAll(self, trackall): """ Specifies if the solver must compute the residual of all approximate singular triplets or not. Parameters ---------- trackall: bool Whether compute all residuals or not. """ cdef PetscBool tval = asBool(trackall) CHKERR( SVDSetTrackAll(self.svd, tval) ) def getDimensions(self): """ Gets the number of singular values to compute and the dimension of the subspace. Returns ------- nsv: int Number of singular values to compute. ncv: int Maximum dimension of the subspace to be used by the solver. mpd: int Maximum dimension allowed for the projected problem. """ cdef PetscInt ival1 = 0 cdef PetscInt ival2 = 0 cdef PetscInt ival3 = 0 CHKERR( SVDGetDimensions(self.svd, &ival1, &ival2, &ival3) ) return (toInt(ival1), toInt(ival2), toInt(ival3)) def setDimensions(self, nsv=None, ncv=None, mpd=None): """ Sets the number of singular values to compute and the dimension of the subspace. Parameters ---------- nsv: int, optional Number of singular values to compute. ncv: int, optional Maximum dimension of the subspace to be used by the solver. mpd: int, optional Maximum dimension allowed for the projected problem. Notes ----- Use `DECIDE` for `ncv` and `mpd` to assign a reasonably good value, which is dependent on the solution method. The parameters `ncv` and `mpd` are intimately related, so that the user is advised to set one of them at most. Normal usage is the following: - In cases where `nsv` is small, the user sets `ncv` (a reasonable default is 2 * `nsv`). - In cases where `nsv` is large, the user sets `mpd`. The value of `ncv` should always be between `nsv` and (`nsv` + `mpd`), typically `ncv` = `nsv` + `mpd`. If `nsv` is not too large, `mpd` = `nsv` is a reasonable choice, otherwise a smaller value should be used. """ cdef PetscInt ival1 = PETSC_DEFAULT cdef PetscInt ival2 = PETSC_DEFAULT cdef PetscInt ival3 = PETSC_DEFAULT if nsv is not None: ival1 = asInt(nsv) if ncv is not None: ival2 = asInt(ncv) if mpd is not None: ival3 = asInt(mpd) CHKERR( SVDSetDimensions(self.svd, ival1, ival2, ival3) ) def getBV(self): """ Obtain the basis vectors objects associated to the SVD object. Returns ------- V: BV The basis vectors context for right singular vectors. U: BV The basis vectors context for left singular vectors. """ cdef BV V = BV() cdef BV U = BV() CHKERR( SVDGetBV(self.svd, &V.bv, &U.bv) ) CHKERR( PetscINCREF(V.obj) ) CHKERR( PetscINCREF(U.obj) ) return (V,U) def setBV(self, BV V,BV U=None): """ Associates basis vectors objects to the SVD solver. Parameters ---------- V: BV The basis vectors context for right singular vectors. U: BV The basis vectors context for left singular vectors. """ cdef SlepcBV VBV = V.bv cdef SlepcBV UBV = U.bv if U is not None else NULL CHKERR( SVDSetBV(self.svd, VBV, UBV) ) def getDS(self): """ Obtain the direct solver associated to the singular value solver. Returns ------- ds: DS The direct solver context. """ cdef DS ds = DS() CHKERR( SVDGetDS(self.svd, &ds.ds) ) CHKERR( PetscINCREF(ds.obj) ) return ds def setDS(self, DS ds): """ Associates a direct solver object to the singular value solver. Parameters ---------- ds: DS The direct solver context. """ CHKERR( SVDSetDS(self.svd, ds.ds) ) def getOperators(self): """ Gets the matrices associated with the singular value problem. Returns ------- A: Mat The matrix associated with the singular value problem. B: Mat The second matrix in the case of GSVD. """ cdef Mat A = Mat() cdef Mat B = Mat() CHKERR( SVDGetOperators(self.svd, &A.mat, &B.mat) ) CHKERR( PetscINCREF(A.obj) ) CHKERR( PetscINCREF(B.obj) ) return (A, B) def setOperators(self, Mat A, Mat B=None): """ Sets the matrices associated with the singular value problem. Parameters ---------- A: Mat The matrix associated with the singular value problem. B: Mat, optional The second matrix in the case of GSVD; if not provided, a usual SVD is assumed. """ cdef PetscMat Bmat = B.mat if B is not None else NULL CHKERR( SVDSetOperators(self.svd, A.mat, Bmat) ) def getSignature(self): """ Gets the signature matrix defining a hyperbolic singular value problem. Returns ------- omega: Vec A vector containing the diagonal elements of the signature matrix. """ cdef Vec omega = Vec() CHKERR( SVDGetSignature(self.svd, &omega.vec) ) if (omega.vec == NULL): return None else: CHKERR( PetscINCREF(omega.obj) ) return omega def setSignature(self, Vec omega=None): """ Sets the signature matrix defining a hyperbolic singular value problem. Parameters ---------- omega: Vec, optional A vector containing the diagonal elements of the signature matrix. """ cdef PetscVec Ovec = omega.vec if omega is not None else NULL CHKERR( SVDSetSignature(self.svd, Ovec) ) # def setInitialSpaces(self, spaceright=None, spaceleft=None): """ Sets the initial spaces from which the SVD solver starts to iterate. Parameters ---------- spaceright: sequence of Vec The right initial space. spaceleft: sequence of Vec The left initial space. """ cdef Py_ssize_t i = 0 if spaceright is None: spaceright = [] elif isinstance(spaceright, Vec): spaceright = [spaceright] cdef PetscVec *isr = NULL cdef Py_ssize_t nr = len(spaceright) cdef tmp1 = allocate(nr*sizeof(PetscVec),&isr) for i in range(nr): isr[i] = (spaceright[i]).vec if spaceleft is None: spaceright = [] elif isinstance(spaceleft, Vec): spaceleft = [spaceleft] cdef PetscVec *isl = NULL cdef Py_ssize_t nl = len(spaceleft) cdef tmp2 = allocate(nl*sizeof(PetscVec),&isl) for i in range(nl): isl[i] = (spaceleft[i]).vec CHKERR( SVDSetInitialSpaces(self.svd, nr, isr, nl, isl) ) # def setStoppingTest(self, stopping, args=None, kargs=None): """ Sets a function to decide when to stop the outer iteration of the eigensolver. """ if stopping is not None: if args is None: args = () if kargs is None: kargs = {} self.set_attr('__stopping__', (stopping, args, kargs)) CHKERR( SVDSetStoppingTestFunction(self.svd, SVD_Stopping, NULL, NULL) ) else: self.set_attr('__stopping__', None) CHKERR( SVDSetStoppingTestFunction(self.svd, SVDStoppingBasic, NULL, NULL) ) def getStoppingTest(self): """ Gets the stopping function. """ return self.get_attr('__stopping__') # def setMonitor(self, monitor, args=None, kargs=None): """ Appends a monitor function to the list of monitors. """ if monitor is None: return cdef object monitorlist = self.get_attr('__monitor__') if monitorlist is None: monitorlist = [] self.set_attr('__monitor__', monitorlist) CHKERR( SVDMonitorSet(self.svd, SVD_Monitor, NULL, NULL) ) if args is None: args = () if kargs is None: kargs = {} monitorlist.append((monitor, args, kargs)) def getMonitor(self): """ Gets the list of monitor functions. """ return self.get_attr('__monitor__') def cancelMonitor(self): """ Clears all monitors for an `SVD` object. """ CHKERR( SVDMonitorCancel(self.svd) ) self.set_attr('__monitor__', None) # def setUp(self): """ Sets up all the internal data structures necessary for the execution of the singular value solver. Notes ----- This function need not be called explicitly in most cases, since `solve()` calls it. It can be useful when one wants to measure the set-up time separately from the solve time. """ CHKERR( SVDSetUp(self.svd) ) def solve(self): """ Solves the singular value problem. """ CHKERR( SVDSolve(self.svd) ) def getIterationNumber(self): """ Gets the current iteration number. If the call to `solve()` is complete, then it returns the number of iterations carried out by the solution method. Returns ------- its: int Iteration number. """ cdef PetscInt ival = 0 CHKERR( SVDGetIterationNumber(self.svd, &ival) ) return toInt(ival) def getConvergedReason(self): """ Gets the reason why the `solve()` iteration was stopped. Returns ------- reason: `SVD.ConvergedReason` enumerate Negative value indicates diverged, positive value converged. """ cdef SlepcSVDConvergedReason val = SVD_CONVERGED_ITERATING CHKERR( SVDGetConvergedReason(self.svd, &val) ) return val def getConverged(self): """ Gets the number of converged singular triplets. Returns ------- nconv: int Number of converged singular triplets. Notes ----- This function should be called after `solve()` has finished. """ cdef PetscInt ival = 0 CHKERR( SVDGetConverged(self.svd, &ival) ) return toInt(ival) def getValue(self, int i): """ Gets the i-th singular value as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. Returns ------- s: float The computed singular value. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`. Singular triplets are indexed according to the ordering criterion established with `setWhichSingularTriplets()`. """ cdef PetscReal rval = 0 CHKERR( SVDGetSingularTriplet(self.svd, i, &rval, NULL, NULL) ) return toReal(rval) def getVectors(self, int i, Vec U, Vec V): """ Gets the i-th left and right singular vectors as computed by `solve()`. Parameters ---------- i: int Index of the solution to be obtained. U: Vec Placeholder for the returned left singular vector. V: Vec Placeholder for the returned right singular vector. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`. Singular triplets are indexed according to the ordering criterion established with `setWhichSingularTriplets()`. """ cdef PetscReal dummy = 0 CHKERR( SVDGetSingularTriplet(self.svd, i, &dummy, U.vec, V.vec) ) def getSingularTriplet(self, int i, Vec U=None, Vec V=None): """ Gets the i-th triplet of the singular value decomposition as computed by `solve()`. The solution consists of the singular value and its left and right singular vectors. Parameters ---------- i: int Index of the solution to be obtained. U: Vec Placeholder for the returned left singular vector. V: Vec Placeholder for the returned right singular vector. Returns ------- s: float The computed singular value. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`. Singular triplets are indexed according to the ordering criterion established with `setWhichSingularTriplets()`. """ cdef PetscReal rval = 0 cdef PetscVec Uvec = U.vec if U is not None else NULL cdef PetscVec Vvec = V.vec if V is not None else NULL CHKERR( SVDGetSingularTriplet(self.svd, i, &rval, Uvec, Vvec) ) return toReal(rval) # def computeError(self, int i, etype=None): """ Computes the error (based on the residual norm) associated with the i-th singular triplet. Parameters ---------- i: int Index of the solution to be considered. etype: `SVD.ErrorType` enumerate The error type to compute. Returns ------- e: real The relative error bound, computed in various ways from the residual norm ``sqrt(n1^2+n2^2)`` where ``n1 = ||A*v-sigma*u||_2``, ``n2 = ||A^T*u-sigma*v||_2``, ``sigma`` is the singular value, ``u`` and ``v`` are the left and right singular vectors. Notes ----- The index ``i`` should be a value between ``0`` and ``nconv-1`` (see `getConverged()`). """ cdef SlepcSVDErrorType et = SVD_ERROR_RELATIVE cdef PetscReal rval = 0 if etype is not None: et = etype CHKERR( SVDComputeError(self.svd, i, et, &rval) ) return toReal(rval) def errorView(self, etype=None, Viewer viewer=None): """ Displays the errors associated with the computed solution (as well as the eigenvalues). Parameters ---------- etype: `SVD.ErrorType` enumerate, optional The error type to compute. viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. Notes ----- By default, this function checks the error of all eigenpairs and prints the eigenvalues if all of them are below the requested tolerance. If the viewer has format ``ASCII_INFO_DETAIL`` then a table with eigenvalues and corresponding errors is printed. """ cdef SlepcSVDErrorType et = SVD_ERROR_RELATIVE if etype is not None: et = etype cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( SVDErrorView(self.svd, et, vwr) ) def valuesView(self, Viewer viewer=None): """ Displays the computed singular values in a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( SVDValuesView(self.svd, vwr) ) def vectorsView(self, Viewer viewer=None): """ Outputs computed singular vectors to a viewer. Parameters ---------- viewer: Viewer, optional. Visualization context; if not provided, the standard output is used. """ cdef PetscViewer vwr = def_Viewer(viewer) CHKERR( SVDVectorsView(self.svd, vwr) ) # def setCrossEPS(self, EPS eps): """ Associate an eigensolver object (`EPS`) to the singular value solver. Parameters ---------- eps: EPS The eigensolver object. """ CHKERR( SVDCrossSetEPS(self.svd, eps.eps) ) def getCrossEPS(self): """ Retrieve the eigensolver object (`EPS`) associated to the singular value solver. Returns ------- eps: EPS The eigensolver object. """ cdef EPS eps = EPS() CHKERR( SVDCrossGetEPS(self.svd, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setCrossExplicitMatrix(self, flag=True): """ Indicate if the eigensolver operator ``A^T*A`` must be computed explicitly. Parameters ---------- flag: bool True if ``A^T*A`` is built explicitly. """ cdef PetscBool tval = asBool(flag) CHKERR( SVDCrossSetExplicitMatrix(self.svd, tval) ) def getCrossExplicitMatrix(self): """ Returns the flag indicating if ``A^T*A`` is built explicitly. Returns ------- flag: bool True if ``A^T*A`` is built explicitly. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDCrossGetExplicitMatrix(self.svd, &tval) ) return toBool(tval) def setCyclicEPS(self, EPS eps): """ Associate an eigensolver object (`EPS`) to the singular value solver. Parameters ---------- eps: EPS The eigensolver object. """ CHKERR( SVDCyclicSetEPS(self.svd, eps.eps) ) def getCyclicEPS(self): """ Retrieve the eigensolver object (`EPS`) associated to the singular value solver. Returns ------- eps: EPS The eigensolver object. """ cdef EPS eps = EPS() CHKERR( SVDCyclicGetEPS(self.svd, &eps.eps) ) CHKERR( PetscINCREF(eps.obj) ) return eps def setCyclicExplicitMatrix(self, flag=True): """ Indicate if the eigensolver operator ``H(A) = [ 0 A ; A^T 0 ]`` must be computed explicitly. Parameters ---------- flag: bool True if ``H(A)`` is built explicitly. """ cdef PetscBool tval = asBool(flag) CHKERR( SVDCyclicSetExplicitMatrix(self.svd, tval) ) def getCyclicExplicitMatrix(self): """ Returns the flag indicating if ``H(A) = [ 0 A ; A^T 0 ]`` is built explicitly. Returns ------- flag: bool True if ``H(A)`` is built explicitly. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDCyclicGetExplicitMatrix(self.svd, &tval) ) return toBool(tval) def setLanczosOneSide(self, flag=True): """ Indicate if the variant of the Lanczos method to be used is one-sided or two-sided. Parameters ---------- flag: bool True if the method is one-sided. Notes ----- By default, a two-sided variant is selected, which is sometimes slightly more robust. However, the one-sided variant is faster because it avoids the orthogonalization associated to left singular vectors. It also saves the memory required for storing such vectors. """ cdef PetscBool tval = asBool(flag) CHKERR( SVDLanczosSetOneSide(self.svd, tval) ) def getLanczosOneSide(self): """ Gets if the variant of the Lanczos method to be used is one-sided or two-sided. Returns ------- delayed: bool True if the method is one-sided. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDLanczosGetOneSide(self.svd, &tval) ) return toBool(tval) def setTRLanczosOneSide(self, flag=True): """ Indicate if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided. Parameters ---------- flag: bool True if the method is one-sided. Notes ----- By default, a two-sided variant is selected, which is sometimes slightly more robust. However, the one-sided variant is faster because it avoids the orthogonalization associated to left singular vectors. """ cdef PetscBool tval = asBool(flag) CHKERR( SVDLanczosSetOneSide(self.svd, tval) ) def getTRLanczosOneSide(self): """ Gets if the variant of the thick-restart Lanczos method to be used is one-sided or two-sided. Returns ------- delayed: bool True if the method is one-sided. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDTRLanczosGetOneSide(self.svd, &tval) ) return toBool(tval) def setTRLanczosGBidiag(self, bidiag): """ Sets the bidiagonalization choice to use in the GSVD TRLanczos solver. Parameters ---------- bidiag: `SVD.TRLanczosGBidiag` enumerate The bidiagonalization choice. """ cdef SlepcSVDTRLanczosGBidiag val = bidiag CHKERR( SVDTRLanczosSetGBidiag(self.svd, val) ) def getTRLanczosGBidiag(self): """ Returns bidiagonalization choice used in the GSVD TRLanczos solver. Returns ------- bidiag: `SVD.TRLanczosGBidiag` enumerate The bidiagonalization choice. """ cdef SlepcSVDTRLanczosGBidiag val = SVD_TRLANCZOS_GBIDIAG_LOWER CHKERR( SVDTRLanczosGetGBidiag(self.svd, &val) ) return val def setTRLanczosRestart(self, keep): """ Sets the restart parameter for the thick-restart Lanczos method, in particular the proportion of basis vectors that must be kept after restart. Parameters ---------- keep: float The number of vectors to be kept at restart. Notes ----- Allowed values are in the range [0.1,0.9]. The default is 0.5. """ cdef PetscReal val = asReal(keep) CHKERR( SVDTRLanczosSetRestart(self.svd, val) ) def getTRLanczosRestart(self): """ Gets the restart parameter used in the thick-restart Lanczos method. Returns ------- keep: float The number of vectors to be kept at restart. """ cdef PetscReal val = 0 CHKERR( SVDTRLanczosGetRestart(self.svd, &val) ) return toReal(val) def setTRLanczosLocking(self, lock): """ Choose between locking and non-locking variants of the thick-restart Lanczos method. Parameters ---------- lock: bool True if the locking variant must be selected. Notes ----- The default is to lock converged singular triplets when the method restarts. This behaviour can be changed so that all directions are kept in the working subspace even if already converged to working accuracy (the non-locking variant). """ cdef PetscBool val = asBool(lock) CHKERR( SVDTRLanczosSetLocking(self.svd, val) ) def getTRLanczosLocking(self): """ Gets the locking flag used in the thick-restart Lanczos method. Returns ------- lock: bool The locking flag. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDTRLanczosGetLocking(self.svd, &tval) ) return toBool(tval) def setTRLanczosKSP(self, KSP ksp): """ Associate a linear solver object to the SVD solver. Parameters ---------- ksp: `KSP` The linear solver object. """ CHKERR( SVDTRLanczosSetKSP(self.svd, ksp.ksp) ) def getTRLanczosKSP(self): """ Retrieve the linear solver object associated with the SVD solver. Returns ------- ksp: `KSP` The linear solver object. """ cdef KSP ksp = KSP() CHKERR( SVDTRLanczosGetKSP(self.svd, &ksp.ksp) ) CHKERR( PetscINCREF(ksp.obj) ) return ksp def setTRLanczosExplicitMatrix(self, flag=True): """ Indicate if the matrix ``Z=[A;B]`` must be built explicitly. Parameters ---------- flag: bool True if ``Z=[A;B]`` is built explicitly. """ cdef PetscBool tval = asBool(flag) CHKERR( SVDTRLanczosSetExplicitMatrix(self.svd, tval) ) def getTRLanczosExplicitMatrix(self): """ Returns the flag indicating if ``Z=[A;B]`` is built explicitly. Returns ------- flag: bool True if ``Z=[A;B]`` is built explicitly. """ cdef PetscBool tval = PETSC_FALSE CHKERR( SVDTRLanczosGetExplicitMatrix(self.svd, &tval) ) return toBool(tval) setOperator = setOperators # backward compatibility # property problem_type: def __get__(self): return self.getProblemType() def __set__(self, value): self.setProblemType(value) property transpose_mode: def __get__(self): return self.getTransposeMode() def __set__(self, value): self.setTransposeMode(value) property which: def __get__(self): return self.getWhichSingularTriplets() def __set__(self, value): self.setWhichSingularTriplets(value) property tol: def __get__(self): return self.getTolerances()[0] def __set__(self, value): self.setTolerances(tol=value) property max_it: def __get__(self): return self.getTolerances()[1] def __set__(self, value): self.setTolerances(max_it=value) property track_all: def __get__(self): return self.getTrackAll() def __set__(self, value): self.setTrackAll(value) property ds: def __get__(self): return self.getDS() def __set__(self, value): self.setDS(value) # ----------------------------------------------------------------------------- del SVDType del SVDProblemType del SVDErrorType del SVDWhich del SVDConv del SVDStop del SVDConvergedReason del SVDTRLanczosGBidiag # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/Sys.pyx000066400000000000000000000037671454104675500201610ustar00rootroot00000000000000# ----------------------------------------------------------------------------- cdef class Sys: @classmethod def getVersion(cls, devel=False, date=False, author=False): cdef char cversion[256] cdef PetscInt major=0, minor=0, micro=0, release=0 CHKERR( SlepcGetVersion(cversion, sizeof(cversion)) ) CHKERR( SlepcGetVersionNumber(&major, &minor, µ, &release) ) out = version = (toInt(major), toInt(minor), toInt(micro)) if devel or date or author: out = [version] if devel: out.append(not release) if date: vstr = bytes2str(cversion) if release != 0: date = vstr.split(",", 1)[-1].strip() else: date = vstr.split("GIT Date:")[-1].strip() out.append(date) if author: author = bytes2str(SLEPC_AUTHOR_INFO).split('\n') author = tuple([s.strip() for s in author if s]) out.append(author) return tuple(out) @classmethod def getVersionInfo(cls): version, dev, date, author = cls.getVersion(True, True, True) return dict(major = version[0], minor = version[1], subminor = version[2], release = not dev, date = date, authorinfo = author) # --- xxx --- @classmethod def isInitialized(cls): return toBool(SlepcInitializeCalled) @classmethod def isFinalized(cls): return toBool(SlepcFinalizeCalled) # --- xxx --- @classmethod def hasExternalPackage(cls, package): cdef const char *cpackage = NULL package = str2bytes(package, &cpackage) cdef PetscBool has = PETSC_FALSE CHKERR( SlepcHasExternalPackage(cpackage, &has) ) return toBool(has) # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/allocate.pxi000066400000000000000000000013221454104675500211300ustar00rootroot00000000000000# ----------------------------------------------------------------------------- cdef extern from "Python.h": enum: PY_SSIZE_T_MAX void *PyMem_Malloc(size_t) void *PyMem_Realloc(void*, size_t) void PyMem_Free(void*) #@cython.final #@cython.internal cdef class _p_mem: cdef void *buf def __cinit__(self): self.buf = NULL def __dealloc__(self): PyMem_Free(self.buf) cdef inline object allocate(size_t n, void **buf): cdef _p_mem ob = <_p_mem>_p_mem.__new__(_p_mem) ob.buf = PyMem_Malloc(n) if ob.buf == NULL: raise MemoryError if buf != NULL: buf[0] = ob.buf return ob # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/arraynpy.pxi000066400000000000000000000166751454104675500212320ustar00rootroot00000000000000# -------------------------------------------------------------------- cdef extern from "": int import_array "_import_array" () except -1 ctypedef long npy_intp ctypedef extern class numpy.dtype [object PyArray_Descr]: pass ctypedef extern class numpy.ndarray [object PyArrayObject]: pass void* PyArray_DATA(ndarray) npy_intp PyArray_SIZE(ndarray) int PyArray_NDIM(ndarray) npy_intp* PyArray_DIMS(ndarray) npy_intp PyArray_DIM(ndarray, int) enum: NPY_INTP dtype PyArray_DescrFromType(int) object PyArray_TypeObjectFromType(int) enum: NPY_ARRAY_ALIGNED enum: NPY_ARRAY_WRITEABLE enum: NPY_ARRAY_NOTSWAPPED enum: NPY_ARRAY_CARRAY enum: NPY_ARRAY_FARRAY ndarray PyArray_FROM_O(object) ndarray PyArray_FROM_OT(object,int) ndarray PyArray_FROM_OTF(object,int,int) ndarray PyArray_Copy(ndarray) ndarray PyArray_ArangeObj(object,object,object,dtype) ndarray PyArray_EMPTY(int,npy_intp[],int,int) ndarray PyArray_ZEROS(int,npy_intp[],int,int) bint PyArray_ISCONTIGUOUS(ndarray) bint PyArray_ISFORTRAN(ndarray) ctypedef enum NPY_ORDER: NPY_ANYORDER NPY_CORDER NPY_FORTRANORDER ndarray PyArray_NewCopy(ndarray,NPY_ORDER) ctypedef struct PyObject ctypedef struct PyTypeObject ndarray PyArray_New(PyTypeObject*,int,npy_intp[],int,npy_intp[],void*,int,int,PyObject*) ndarray PyArray_SimpleNewFromData(int,npy_intp[],int,void*) cdef extern from "": enum: NPY_INT enum: NPY_DOUBLE enum: NPY_PETSC_BOOL enum: NPY_PETSC_INT enum: NPY_PETSC_REAL enum: NPY_PETSC_SCALAR enum: NPY_PETSC_COMPLEX # -------------------------------------------------------------------- cdef inline ndarray asarray(object ob): return PyArray_FROM_O(ob) cdef inline ndarray arange(start, stop, stride): cdef dtype descr = PyArray_DescrFromType(NPY_PETSC_INT) return PyArray_ArangeObj(start, stop, stride, descr) # -------------------------------------------------------------------- cdef inline ndarray empty_i(PetscInt size): cdef npy_intp s = size return PyArray_EMPTY(1, &s, NPY_PETSC_INT, 0) cdef inline ndarray empty_r(PetscInt size): cdef npy_intp s = size return PyArray_EMPTY(1, &s, NPY_PETSC_REAL, 0) cdef inline ndarray empty_s(PetscInt size): cdef npy_intp s = size return PyArray_EMPTY(1, &s, NPY_PETSC_SCALAR, 0) cdef inline ndarray empty_c(PetscInt size): cdef npy_intp s = size return PyArray_EMPTY(1, &s, NPY_PETSC_COMPLEX, 0) cdef inline ndarray empty_p(PetscInt size): cdef npy_intp s = size return PyArray_EMPTY(1, &s, NPY_INTP, 0) # -------------------------------------------------------------------- cdef inline ndarray array_i(PetscInt size, const PetscInt* data): cdef npy_intp s = size cdef ndarray ary = PyArray_EMPTY(1, &s, NPY_PETSC_INT, 0) if data != NULL: memcpy(PyArray_DATA(ary), data, size*sizeof(PetscInt)) return ary cdef inline ndarray array_r(PetscInt size, const PetscReal* data): cdef npy_intp s = size cdef ndarray ary = PyArray_EMPTY(1, &s, NPY_PETSC_REAL, 0) if data != NULL: memcpy(PyArray_DATA(ary), data, size*sizeof(PetscReal)) return ary cdef inline ndarray array_b(PetscInt size, const PetscBool* data): cdef npy_intp s = size cdef ndarray ary = PyArray_EMPTY(1, &s, NPY_PETSC_BOOL, 0) if data != NULL: memcpy(PyArray_DATA(ary), data, size*sizeof(PetscBool)) return ary cdef inline ndarray array_s(PetscInt size, const PetscScalar* data): cdef npy_intp s = size cdef ndarray ary = PyArray_EMPTY(1, &s, NPY_PETSC_SCALAR, 0) if data != NULL: memcpy(PyArray_DATA(ary), data, size*sizeof(PetscScalar)) return ary # -------------------------------------------------------------------- cdef inline ndarray iarray(object ob, int typenum): cdef ndarray ary = PyArray_FROM_OTF( ob, typenum, NPY_ARRAY_ALIGNED|NPY_ARRAY_NOTSWAPPED) if PyArray_ISCONTIGUOUS(ary): return ary if PyArray_ISFORTRAN(ary): return ary return PyArray_Copy(ary) cdef inline ndarray iarray_i(object ob, PetscInt* size, PetscInt** data): cdef ndarray ary = iarray(ob, NPY_PETSC_INT) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray iarray_r(object ob, PetscInt* size, PetscReal** data): cdef ndarray ary = iarray(ob, NPY_PETSC_REAL) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray iarray_b(object ob, PetscInt* size, PetscBool** data): cdef ndarray ary = iarray(ob, NPY_PETSC_BOOL) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray iarray_s(object ob, PetscInt* size, PetscScalar** data): cdef ndarray ary = iarray(ob, NPY_PETSC_SCALAR) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary # -------------------------------------------------------------------- cdef inline ndarray oarray(object ob, int typenum): cdef ndarray ary = PyArray_FROM_OTF( ob, typenum, NPY_ARRAY_ALIGNED|NPY_ARRAY_WRITEABLE|NPY_ARRAY_NOTSWAPPED) if PyArray_ISCONTIGUOUS(ary): return ary if PyArray_ISFORTRAN(ary): return ary return PyArray_Copy(ary) cdef inline ndarray oarray_i(object ob, PetscInt* size, PetscInt** data): cdef ndarray ary = oarray(ob, NPY_PETSC_INT) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray oarray_r(object ob, PetscInt* size, PetscReal** data): cdef ndarray ary = oarray(ob, NPY_PETSC_REAL) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray oarray_s(object ob, PetscInt* size, PetscScalar** data): cdef ndarray ary = oarray(ob, NPY_PETSC_SCALAR) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray oarray_p(object ob, PetscInt* size, void** data): cdef ndarray ary = oarray(ob, NPY_INTP) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary # -------------------------------------------------------------------- cdef inline ndarray ocarray_s(object ob, PetscInt* size, PetscScalar** data): cdef ndarray ary = PyArray_FROM_OTF( ob, NPY_PETSC_SCALAR, NPY_ARRAY_CARRAY|NPY_ARRAY_NOTSWAPPED) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary cdef inline ndarray ofarray_s(object ob, PetscInt* size, PetscScalar** data): cdef ndarray ary = PyArray_FROM_OTF( ob, NPY_PETSC_SCALAR, NPY_ARRAY_FARRAY|NPY_ARRAY_NOTSWAPPED) if size != NULL: size[0] = PyArray_SIZE(ary) if data != NULL: data[0] = PyArray_DATA(ary) return ary # -------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcbv.pxi000066400000000000000000000133661454104675500210150ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcBVType "const char*" SlepcBVType BVMAT SlepcBVType BVSVEC SlepcBVType BVVECS SlepcBVType BVCONTIGUOUS SlepcBVType BVTENSOR ctypedef enum SlepcBVOrthogType "BVOrthogType": BV_ORTHOG_CGS BV_ORTHOG_MGS ctypedef enum SlepcBVOrthogRefineType "BVOrthogRefineType": BV_ORTHOG_REFINE_IFNEEDED BV_ORTHOG_REFINE_NEVER BV_ORTHOG_REFINE_ALWAYS ctypedef enum SlepcBVOrthogBlockType "BVOrthogBlockType": BV_ORTHOG_BLOCK_GS BV_ORTHOG_BLOCK_CHOL BV_ORTHOG_BLOCK_TSQR BV_ORTHOG_BLOCK_TSQRCHOL BV_ORTHOG_BLOCK_SVQB ctypedef enum SlepcBVMatMultType "BVMatMultType": BV_MATMULT_VECS BV_MATMULT_MAT ctypedef enum SlepcBVSVDMethod "BVSVDMethod": BV_SVD_METHOD_REFINE BV_SVD_METHOD_QR BV_SVD_METHOD_QR_CAA PetscErrorCode BVCreate(MPI_Comm,SlepcBV*) PetscErrorCode BVCreateMat(SlepcBV,PetscMat*) PetscErrorCode BVDuplicate(SlepcBV,SlepcBV*) PetscErrorCode BVDuplicateResize(SlepcBV,PetscInt,SlepcBV*) PetscErrorCode BVCopy(SlepcBV,SlepcBV) PetscErrorCode BVView(SlepcBV,PetscViewer) PetscErrorCode BVDestroy(SlepcBV*) PetscErrorCode BVSetType(SlepcBV,SlepcBVType) PetscErrorCode BVGetType(SlepcBV,SlepcBVType*) PetscErrorCode BVSetSizes(SlepcBV,PetscInt,PetscInt,PetscInt) PetscErrorCode BVSetSizesFromVec(SlepcBV,PetscVec,PetscInt) PetscErrorCode BVGetSizes(SlepcBV,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode BVResize(SlepcBV,PetscInt,PetscBool) PetscErrorCode BVSetOptionsPrefix(SlepcBV,char[]) PetscErrorCode BVGetOptionsPrefix(SlepcBV,char*[]) PetscErrorCode BVAppendOptionsPrefix(SlepcBV,char[]) PetscErrorCode BVSetFromOptions(SlepcBV) PetscErrorCode BVSetOrthogonalization(SlepcBV,SlepcBVOrthogType,SlepcBVOrthogRefineType,PetscReal,SlepcBVOrthogBlockType) PetscErrorCode BVGetOrthogonalization(SlepcBV,SlepcBVOrthogType*,SlepcBVOrthogRefineType*,PetscReal*,SlepcBVOrthogBlockType*) PetscErrorCode BVSetMatMultMethod(SlepcBV,SlepcBVMatMultType) PetscErrorCode BVGetMatMultMethod(SlepcBV,SlepcBVMatMultType*) PetscErrorCode BVSetRandom(SlepcBV) PetscErrorCode BVSetRandomNormal(SlepcBV) PetscErrorCode BVSetRandomSign(SlepcBV) PetscErrorCode BVSetRandomColumn(SlepcBV,PetscInt) PetscErrorCode BVSetRandomCond(SlepcBV,PetscReal) PetscErrorCode BVSetRandomContext(SlepcBV,PetscRandom) PetscErrorCode BVGetRandomContext(SlepcBV,PetscRandom*) PetscErrorCode BVSetMatrix(SlepcBV,PetscMat,PetscBool) PetscErrorCode BVGetMatrix(SlepcBV,PetscMat*,PetscBool*) PetscErrorCode BVApplyMatrix(SlepcBV,PetscVec,PetscVec) PetscErrorCode BVSetActiveColumns(SlepcBV,PetscInt,PetscInt) PetscErrorCode BVGetActiveColumns(SlepcBV,PetscInt*,PetscInt*) PetscErrorCode BVSetDefiniteTolerance(SlepcBV,PetscReal) PetscErrorCode BVGetDefiniteTolerance(SlepcBV,PetscReal*) PetscErrorCode BVCreateVec(SlepcBV,PetscVec*) PetscErrorCode BVInsertVec(SlepcBV,PetscInt,PetscVec) PetscErrorCode BVInsertVecs(SlepcBV,PetscInt,PetscInt*,PetscVec*,PetscBool) PetscErrorCode BVInsertConstraints(SlepcBV,PetscInt*,PetscVec*) PetscErrorCode BVSetNumConstraints(SlepcBV,PetscInt) PetscErrorCode BVGetNumConstraints(SlepcBV,PetscInt*) PetscErrorCode BVGetColumn(SlepcBV,PetscInt,PetscVec*) PetscErrorCode BVRestoreColumn(SlepcBV,PetscInt,PetscVec*) PetscErrorCode BVCopyVec(SlepcBV,PetscInt,PetscVec) PetscErrorCode BVCopyColumn(SlepcBV,PetscInt,PetscInt) PetscErrorCode BVDot(SlepcBV,SlepcBV,PetscMat) PetscErrorCode BVDotVec(SlepcBV,PetscVec,PetscScalar*) PetscErrorCode BVDotColumn(SlepcBV,PetscInt,PetscScalar*) PetscErrorCode BVMatProject(SlepcBV,PetscMat,SlepcBV,PetscMat) PetscErrorCode BVMatMult(SlepcBV,PetscMat,SlepcBV) PetscErrorCode BVMatMultHermitianTranspose(SlepcBV,PetscMat,SlepcBV) PetscErrorCode BVMatMultColumn(SlepcBV,PetscMat,PetscInt) PetscErrorCode BVMatMultTransposeColumn(SlepcBV,PetscMat,PetscInt) PetscErrorCode BVMatMultHermitianTransposeColumn(SlepcBV,PetscMat,PetscInt) PetscErrorCode BVMult(SlepcBV,PetscScalar,PetscScalar,SlepcBV,PetscMat) PetscErrorCode BVMultColumn(SlepcBV,PetscScalar,PetscScalar,PetscInt,PetscScalar*) PetscErrorCode BVMultInPlace(SlepcBV,PetscMat,PetscInt,PetscInt) PetscErrorCode BVMultVec(SlepcBV,PetscScalar,PetscScalar,PetscVec,PetscScalar*) PetscErrorCode BVScaleColumn(SlepcBV,PetscInt,PetscScalar) PetscErrorCode BVScale(SlepcBV,PetscScalar) PetscErrorCode BVNormColumn(SlepcBV,PetscInt,PetscNormType,PetscReal*) PetscErrorCode BVNorm(SlepcBV,PetscNormType,PetscReal*) PetscErrorCode BVOrthogonalizeVec(SlepcBV,PetscVec,PetscScalar*,PetscReal*,PetscBool*) PetscErrorCode BVOrthogonalizeColumn(SlepcBV,PetscInt,PetscScalar*,PetscReal*,PetscBool*) PetscErrorCode BVOrthonormalizeColumn(SlepcBV,PetscInt,PetscBool,PetscReal*,PetscBool*) PetscErrorCode BVOrthogonalize(SlepcBV,PetscMat) PetscErrorCode BVCreateFromMat(PetscMat,SlepcBV*) PetscErrorCode BVGetMat(SlepcBV,PetscMat*) PetscErrorCode BVRestoreMat(SlepcBV,PetscMat*) cdef inline PetscErrorCode BV_Sizes( object size, PetscInt *_n, PetscInt *_N, ) except PETSC_ERR_PYTHON: # unpack and get local and global sizes cdef PetscInt n=PETSC_DECIDE, N=PETSC_DECIDE cdef object on, oN try: on, oN = size except (TypeError, ValueError): on = None; oN = size if on is not None: n = asInt(on) if oN is not None: N = asInt(oN) if n==PETSC_DECIDE and N==PETSC_DECIDE: raise ValueError( "local and global sizes cannot be both 'DECIDE'") # return result to the caller if _n != NULL: _n[0] = n if _N != NULL: _N[0] = N return PETSC_SUCCESS slepc4py-3.19.2/src/slepc4py/SLEPc/slepcds.pxi000066400000000000000000000074471454104675500210170ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcDSType "const char*" SlepcDSType DSHEP SlepcDSType DSNHEP SlepcDSType DSGHEP SlepcDSType DSGHIEP SlepcDSType DSGNHEP SlepcDSType DSNHEPTS SlepcDSType DSSVD SlepcDSType DSHSVD SlepcDSType DSGSVD SlepcDSType DSPEP SlepcDSType DSNEP ctypedef enum SlepcDSStateType "DSStateType": DS_STATE_RAW DS_STATE_INTERMEDIATE DS_STATE_CONDENSED DS_STATE_TRUNCATED ctypedef enum SlepcDSMatType "DSMatType": DS_MAT_A DS_MAT_B DS_MAT_C DS_MAT_T DS_MAT_D DS_MAT_Q DS_MAT_Z DS_MAT_X DS_MAT_Y DS_MAT_U DS_MAT_V DS_MAT_W DS_NUM_MAT ctypedef enum SlepcDSParallelType "DSParallelType": DS_PARALLEL_REDUNDANT DS_PARALLEL_SYNCHRONIZED DS_PARALLEL_DISTRIBUTED PetscErrorCode DSCreate(MPI_Comm,SlepcDS*) PetscErrorCode DSView(SlepcDS,PetscViewer) PetscErrorCode DSDestroy(SlepcDS*) PetscErrorCode DSReset(SlepcDS) PetscErrorCode DSSetType(SlepcDS,SlepcDSType) PetscErrorCode DSGetType(SlepcDS,SlepcDSType*) PetscErrorCode DSSetOptionsPrefix(SlepcDS,char[]) PetscErrorCode DSGetOptionsPrefix(SlepcDS,char*[]) PetscErrorCode DSAppendOptionsPrefix(SlepcDS,char[]) PetscErrorCode DSSetFromOptions(SlepcDS) PetscErrorCode DSDuplicate(SlepcDS,SlepcDS*) PetscErrorCode DSAllocate(SlepcDS,PetscInt) PetscErrorCode DSGetLeadingDimension(SlepcDS,PetscInt*) PetscErrorCode DSSetState(SlepcDS,SlepcDSStateType) PetscErrorCode DSGetState(SlepcDS,SlepcDSStateType*) PetscErrorCode DSSetDimensions(SlepcDS,PetscInt,PetscInt,PetscInt) PetscErrorCode DSGetDimensions(SlepcDS,PetscInt*,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode DSTruncate(SlepcDS,PetscInt,PetscBool) PetscErrorCode DSSetBlockSize(SlepcDS,PetscInt) PetscErrorCode DSGetBlockSize(SlepcDS,PetscInt*) PetscErrorCode DSSetMethod(SlepcDS,PetscInt) PetscErrorCode DSGetMethod(SlepcDS,PetscInt*) PetscErrorCode DSSetParallel(SlepcDS,SlepcDSParallelType) PetscErrorCode DSGetParallel(SlepcDS,SlepcDSParallelType*) PetscErrorCode DSSetCompact(SlepcDS,PetscBool) PetscErrorCode DSGetCompact(SlepcDS,PetscBool*) PetscErrorCode DSSetExtraRow(SlepcDS,PetscBool) PetscErrorCode DSGetExtraRow(SlepcDS,PetscBool*) PetscErrorCode DSSetRefined(SlepcDS,PetscBool) PetscErrorCode DSGetRefined(SlepcDS,PetscBool*) PetscErrorCode DSGetMat(SlepcDS,SlepcDSMatType,PetscMat*) PetscErrorCode DSRestoreMat(SlepcDS,SlepcDSMatType,PetscMat*) PetscErrorCode DSSetIdentity(SlepcDS,SlepcDSMatType) PetscErrorCode DSVectors(SlepcDS,SlepcDSMatType,PetscInt*,PetscReal*) PetscErrorCode DSSolve(SlepcDS,PetscScalar*,PetscScalar*) PetscErrorCode DSSort(SlepcDS,PetscScalar*,PetscScalar*,PetscScalar*,PetscScalar*,PetscInt*) PetscErrorCode DSUpdateExtraRow(SlepcDS) PetscErrorCode DSCond(SlepcDS,PetscReal*) PetscErrorCode DSTranslateHarmonic(SlepcDS,PetscScalar,PetscReal,PetscBool,PetscScalar*,PetscReal*) PetscErrorCode DSTranslateRKS(SlepcDS,PetscScalar) PetscErrorCode DSCond(SlepcDS,PetscReal*) PetscErrorCode DSNormalize(SlepcDS,SlepcDSMatType,PetscInt) PetscErrorCode DSSVDSetDimensions(SlepcDS,PetscInt) PetscErrorCode DSSVDGetDimensions(SlepcDS,PetscInt*) PetscErrorCode DSHSVDSetDimensions(SlepcDS,PetscInt) PetscErrorCode DSHSVDGetDimensions(SlepcDS,PetscInt*) PetscErrorCode DSGSVDSetDimensions(SlepcDS,PetscInt,PetscInt) PetscErrorCode DSGSVDGetDimensions(SlepcDS,PetscInt*,PetscInt*) PetscErrorCode DSPEPSetDegree(SlepcDS,PetscInt) PetscErrorCode DSPEPGetDegree(SlepcDS,PetscInt*) PetscErrorCode DSPEPSetCoefficients(SlepcDS,PetscReal*) PetscErrorCode DSPEPGetCoefficients(SlepcDS,PetscReal**) slepc4py-3.19.2/src/slepc4py/SLEPc/slepceps.pxi000066400000000000000000000414011454104675500211640ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcEPSType "const char*" SlepcEPSType EPSPOWER SlepcEPSType EPSSUBSPACE SlepcEPSType EPSARNOLDI SlepcEPSType EPSLANCZOS SlepcEPSType EPSKRYLOVSCHUR SlepcEPSType EPSGD SlepcEPSType EPSJD SlepcEPSType EPSRQCG SlepcEPSType EPSLOBPCG SlepcEPSType EPSCISS SlepcEPSType EPSLYAPII SlepcEPSType EPSLAPACK SlepcEPSType EPSARPACK SlepcEPSType EPSTRLAN SlepcEPSType EPSBLOPEX SlepcEPSType EPSPRIMME SlepcEPSType EPSFEAST SlepcEPSType EPSSCALAPACK SlepcEPSType EPSELPA SlepcEPSType EPSELEMENTAL SlepcEPSType EPSEVSL ctypedef enum SlepcEPSProblemType "EPSProblemType": EPS_HEP EPS_GHEP EPS_NHEP EPS_GNHEP EPS_PGNHEP EPS_GHIEP ctypedef enum SlepcEPSExtraction "EPSExtraction": EPS_RITZ EPS_HARMONIC EPS_HARMONIC_RELATIVE EPS_HARMONIC_RIGHT EPS_HARMONIC_LARGEST EPS_REFINED EPS_REFINED_HARMONIC ctypedef enum SlepcEPSWhich "EPSWhich": EPS_LARGEST_MAGNITUDE EPS_LARGEST_REAL EPS_LARGEST_IMAGINARY EPS_SMALLEST_MAGNITUDE EPS_SMALLEST_REAL EPS_SMALLEST_IMAGINARY EPS_TARGET_MAGNITUDE EPS_TARGET_REAL EPS_TARGET_IMAGINARY EPS_ALL EPS_WHICH_USER ctypedef enum SlepcEPSBalance "EPSBalance": EPS_BALANCE_NONE EPS_BALANCE_ONESIDE EPS_BALANCE_TWOSIDE EPS_BALANCE_USER ctypedef enum SlepcEPSErrorType "EPSErrorType": EPS_ERROR_ABSOLUTE EPS_ERROR_RELATIVE EPS_ERROR_BACKWARD ctypedef enum SlepcEPSConv "EPSConv": EPS_CONV_ABS EPS_CONV_REL EPS_CONV_NORM EPS_CONV_USER ctypedef enum SlepcEPSStop "EPSStop": EPS_STOP_BASIC EPS_STOP_USER ctypedef enum SlepcEPSConvergedReason "EPSConvergedReason": EPS_CONVERGED_TOL EPS_CONVERGED_USER EPS_DIVERGED_ITS EPS_DIVERGED_BREAKDOWN EPS_DIVERGED_SYMMETRY_LOST EPS_CONVERGED_ITERATING ctypedef PetscErrorCode (*SlepcEPSCtxDel)(void*) ctypedef PetscErrorCode (*SlepcEPSStoppingFunction)(SlepcEPS, PetscInt, PetscInt, PetscInt, PetscInt, SlepcEPSConvergedReason*, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcEPSMonitorFunction)(SlepcEPS, PetscInt, PetscInt, PetscScalar*, PetscScalar*, PetscReal*, PetscInt, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcEPSArbitraryFunction)(PetscScalar, PetscScalar, PetscVec, PetscVec, PetscScalar*, PetscScalar*, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcEPSComparisonFunction)(PetscScalar, PetscScalar, PetscScalar, PetscScalar, PetscInt*, void*) except PETSC_ERR_PYTHON PetscErrorCode EPSView(SlepcEPS,PetscViewer) PetscErrorCode EPSDestroy(SlepcEPS*) PetscErrorCode EPSReset(SlepcEPS) PetscErrorCode EPSCreate(MPI_Comm,SlepcEPS*) PetscErrorCode EPSSetType(SlepcEPS,SlepcEPSType) PetscErrorCode EPSGetType(SlepcEPS,SlepcEPSType*) PetscErrorCode EPSSetOptionsPrefix(SlepcEPS,char[]) PetscErrorCode EPSAppendOptionsPrefix(SlepcEPS,char []) PetscErrorCode EPSGetOptionsPrefix(SlepcEPS,char*[]) PetscErrorCode EPSSetFromOptions(SlepcEPS) PetscErrorCode EPSSetProblemType(SlepcEPS,SlepcEPSProblemType) PetscErrorCode EPSGetProblemType(SlepcEPS,SlepcEPSProblemType*) PetscErrorCode EPSIsGeneralized(SlepcEPS,PetscBool*) PetscErrorCode EPSIsHermitian(SlepcEPS,PetscBool*) PetscErrorCode EPSIsPositive(SlepcEPS,PetscBool*) PetscErrorCode EPSSetExtraction(SlepcEPS,SlepcEPSExtraction) PetscErrorCode EPSGetExtraction(SlepcEPS,SlepcEPSExtraction*) PetscErrorCode EPSSetBalance(SlepcEPS,SlepcEPSBalance,PetscInt,PetscReal) PetscErrorCode EPSGetBalance(SlepcEPS,SlepcEPSBalance*,PetscInt*,PetscReal*) PetscErrorCode EPSSetWhichEigenpairs(SlepcEPS,SlepcEPSWhich) PetscErrorCode EPSGetWhichEigenpairs(SlepcEPS,SlepcEPSWhich*) PetscErrorCode EPSSetTarget(SlepcEPS,PetscScalar) PetscErrorCode EPSGetTarget(SlepcEPS,PetscScalar*) PetscErrorCode EPSSetInterval(SlepcEPS,PetscReal,PetscReal) PetscErrorCode EPSGetInterval(SlepcEPS,PetscReal*,PetscReal*) PetscErrorCode EPSSetTolerances(SlepcEPS,PetscReal,PetscInt) PetscErrorCode EPSGetTolerances(SlepcEPS,PetscReal*,PetscInt*) PetscErrorCode EPSSetDimensions(SlepcEPS,PetscInt,PetscInt,PetscInt) PetscErrorCode EPSGetDimensions(SlepcEPS,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode EPSSetBV(SlepcEPS,SlepcBV) PetscErrorCode EPSGetBV(SlepcEPS,SlepcBV*) PetscErrorCode EPSSetDS(SlepcEPS,SlepcDS) PetscErrorCode EPSGetDS(SlepcEPS,SlepcDS*) PetscErrorCode EPSSetST(SlepcEPS,SlepcST) PetscErrorCode EPSGetST(SlepcEPS,SlepcST*) PetscErrorCode EPSSetRG(SlepcEPS,SlepcRG) PetscErrorCode EPSGetRG(SlepcEPS,SlepcRG*) PetscErrorCode EPSSetOperators(SlepcEPS,PetscMat,PetscMat) PetscErrorCode EPSGetOperators(SlepcEPS,PetscMat*,PetscMat*) PetscErrorCode EPSSetTwoSided(SlepcEPS,PetscBool) PetscErrorCode EPSGetTwoSided(SlepcEPS,PetscBool*) PetscErrorCode EPSSetPurify(SlepcEPS,PetscBool) PetscErrorCode EPSGetPurify(SlepcEPS,PetscBool*) PetscErrorCode EPSSetConvergenceTest(SlepcEPS,SlepcEPSConv) PetscErrorCode EPSGetConvergenceTest(SlepcEPS,SlepcEPSConv*) PetscErrorCode EPSSetTrueResidual(SlepcEPS,PetscBool) PetscErrorCode EPSGetTrueResidual(SlepcEPS,PetscBool*) PetscErrorCode EPSSetTrackAll(SlepcEPS,PetscBool) PetscErrorCode EPSGetTrackAll(SlepcEPS,PetscBool*) PetscErrorCode EPSSetDeflationSpace(SlepcEPS,PetscInt,PetscVec*) PetscErrorCode EPSSetInitialSpace(SlepcEPS,PetscInt,PetscVec*) PetscErrorCode EPSSetLeftInitialSpace(SlepcEPS,PetscInt,PetscVec*) PetscErrorCode EPSSetUp(SlepcEPS) PetscErrorCode EPSSolve(SlepcEPS) PetscErrorCode EPSGetIterationNumber(SlepcEPS,PetscInt*) PetscErrorCode EPSGetConvergedReason(SlepcEPS,SlepcEPSConvergedReason*) PetscErrorCode EPSGetConverged(SlepcEPS,PetscInt*) PetscErrorCode EPSGetEigenvalue(SlepcEPS,PetscInt,PetscScalar*,PetscScalar*) PetscErrorCode EPSGetEigenvector(SlepcEPS,PetscInt,PetscVec,PetscVec) PetscErrorCode EPSGetLeftEigenvector(SlepcEPS,PetscInt,PetscVec,PetscVec) PetscErrorCode EPSGetEigenpair(SlepcEPS,PetscInt,PetscScalar*,PetscScalar*,PetscVec,PetscVec) PetscErrorCode EPSGetInvariantSubspace(SlepcEPS,PetscVec*) PetscErrorCode EPSSetStoppingTestFunction(SlepcEPS,SlepcEPSStoppingFunction,void*,SlepcEPSCtxDel) PetscErrorCode EPSStoppingBasic(SlepcEPS,PetscInt,PetscInt,PetscInt,PetscInt,SlepcEPSConvergedReason*,void*) except PETSC_ERR_PYTHON PetscErrorCode EPSSetArbitrarySelection(SlepcEPS,SlepcEPSArbitraryFunction,void*); PetscErrorCode EPSSetEigenvalueComparison(SlepcEPS,SlepcEPSComparisonFunction,void*); PetscErrorCode EPSGetErrorEstimate(SlepcEPS,PetscInt,PetscReal*) PetscErrorCode EPSComputeError(SlepcEPS,PetscInt,SlepcEPSErrorType,PetscReal*) PetscErrorCode EPSErrorView(SlepcEPS,SlepcEPSErrorType,PetscViewer) PetscErrorCode EPSValuesView(SlepcEPS,PetscViewer) PetscErrorCode EPSVectorsView(SlepcEPS,PetscViewer) PetscErrorCode EPSMonitorSet(SlepcEPS,SlepcEPSMonitorFunction,void*,SlepcEPSCtxDel) PetscErrorCode EPSMonitorCancel(SlepcEPS) ctypedef enum SlepcEPSPowerShiftType "EPSPowerShiftType": EPS_POWER_SHIFT_CONSTANT EPS_POWER_SHIFT_RAYLEIGH EPS_POWER_SHIFT_WILKINSON PetscErrorCode EPSPowerSetShiftType(SlepcEPS,SlepcEPSPowerShiftType) PetscErrorCode EPSPowerGetShiftType(SlepcEPS,SlepcEPSPowerShiftType*) PetscErrorCode EPSArnoldiSetDelayed(SlepcEPS,PetscBool) PetscErrorCode EPSArnoldiGetDelayed(SlepcEPS,PetscBool*) PetscErrorCode EPSKrylovSchurSetRestart(SlepcEPS,PetscReal) PetscErrorCode EPSKrylovSchurGetRestart(SlepcEPS,PetscReal*) PetscErrorCode EPSKrylovSchurSetLocking(SlepcEPS,PetscBool) PetscErrorCode EPSKrylovSchurGetLocking(SlepcEPS,PetscBool*) PetscErrorCode EPSKrylovSchurSetPartitions(SlepcEPS,PetscInt) PetscErrorCode EPSKrylovSchurGetPartitions(SlepcEPS,PetscInt*) PetscErrorCode EPSKrylovSchurSetDetectZeros(SlepcEPS,PetscBool) PetscErrorCode EPSKrylovSchurGetDetectZeros(SlepcEPS,PetscBool*) PetscErrorCode EPSKrylovSchurSetDimensions(SlepcEPS,PetscInt,PetscInt,PetscInt) PetscErrorCode EPSKrylovSchurGetDimensions(SlepcEPS,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode EPSKrylovSchurGetSubcommInfo(SlepcEPS,PetscInt*,PetscInt*,PetscVec*) PetscErrorCode EPSKrylovSchurGetSubcommPairs(SlepcEPS,PetscInt,PetscScalar*,PetscVec) PetscErrorCode EPSKrylovSchurGetSubcommMats(SlepcEPS,PetscMat*,PetscMat*) PetscErrorCode EPSKrylovSchurUpdateSubcommMats(SlepcEPS,PetscScalar,PetscScalar,PetscMat,PetscScalar,PetscScalar,PetscMat,PetscMatStructure,PetscBool) PetscErrorCode EPSKrylovSchurSetSubintervals(SlepcEPS,PetscReal*) PetscErrorCode EPSKrylovSchurGetSubintervals(SlepcEPS,PetscReal**) PetscErrorCode EPSKrylovSchurGetInertias(SlepcEPS,PetscInt*,PetscReal**,PetscInt**) PetscErrorCode EPSKrylovSchurGetKSP(SlepcEPS,PetscKSP*) ctypedef enum SlepcEPSLanczosReorthogType "EPSLanczosReorthogType": EPS_LANCZOS_REORTHOG_LOCAL EPS_LANCZOS_REORTHOG_FULL EPS_LANCZOS_REORTHOG_SELECTIVE EPS_LANCZOS_REORTHOG_PERIODIC EPS_LANCZOS_REORTHOG_PARTIAL EPS_LANCZOS_REORTHOG_DELAYED PetscErrorCode EPSLanczosSetReorthog(SlepcEPS,SlepcEPSLanczosReorthogType) PetscErrorCode EPSLanczosGetReorthog(SlepcEPS,SlepcEPSLanczosReorthogType*) PetscErrorCode EPSGDSetKrylovStart(SlepcEPS,PetscBool) PetscErrorCode EPSGDGetKrylovStart(SlepcEPS,PetscBool*) PetscErrorCode EPSGDSetBlockSize(SlepcEPS,PetscInt) PetscErrorCode EPSGDGetBlockSize(SlepcEPS,PetscInt*) PetscErrorCode EPSGDSetRestart(SlepcEPS,PetscInt,PetscInt) PetscErrorCode EPSGDGetRestart(SlepcEPS,PetscInt*,PetscInt*) PetscErrorCode EPSGDSetInitialSize(SlepcEPS,PetscInt) PetscErrorCode EPSGDGetInitialSize(SlepcEPS,PetscInt*) PetscErrorCode EPSGDSetBOrth(SlepcEPS,PetscBool) PetscErrorCode EPSGDGetBOrth(SlepcEPS,PetscBool*) PetscErrorCode EPSGDSetDoubleExpansion(SlepcEPS,PetscBool) PetscErrorCode EPSGDGetDoubleExpansion(SlepcEPS,PetscBool*) PetscErrorCode EPSJDSetKrylovStart(SlepcEPS,PetscBool) PetscErrorCode EPSJDGetKrylovStart(SlepcEPS,PetscBool*) PetscErrorCode EPSJDSetBlockSize(SlepcEPS,PetscInt) PetscErrorCode EPSJDGetBlockSize(SlepcEPS,PetscInt*) PetscErrorCode EPSJDSetRestart(SlepcEPS,PetscInt,PetscInt) PetscErrorCode EPSJDGetRestart(SlepcEPS,PetscInt*,PetscInt*) PetscErrorCode EPSJDSetInitialSize(SlepcEPS,PetscInt) PetscErrorCode EPSJDGetInitialSize(SlepcEPS,PetscInt*) PetscErrorCode EPSJDSetFix(SlepcEPS,PetscReal) PetscErrorCode EPSJDGetFix(SlepcEPS,PetscReal*) PetscErrorCode EPSJDSetConstCorrectionTol(SlepcEPS,PetscBool) PetscErrorCode EPSJDGetConstCorrectionTol(SlepcEPS,PetscBool*) PetscErrorCode EPSJDSetBOrth(SlepcEPS,PetscBool) PetscErrorCode EPSJDGetBOrth(SlepcEPS,PetscBool*) PetscErrorCode EPSRQCGSetReset(SlepcEPS,PetscInt) PetscErrorCode EPSRQCGGetReset(SlepcEPS,PetscInt*) PetscErrorCode EPSLOBPCGSetBlockSize(SlepcEPS,PetscInt) PetscErrorCode EPSLOBPCGGetBlockSize(SlepcEPS,PetscInt*) PetscErrorCode EPSLOBPCGSetRestart(SlepcEPS,PetscReal) PetscErrorCode EPSLOBPCGGetRestart(SlepcEPS,PetscReal*) PetscErrorCode EPSLOBPCGSetLocking(SlepcEPS,PetscBool) PetscErrorCode EPSLOBPCGGetLocking(SlepcEPS,PetscBool*) PetscErrorCode EPSLyapIISetRanks(SlepcEPS,PetscInt,PetscInt) PetscErrorCode EPSLyapIIGetRanks(SlepcEPS,PetscInt*,PetscInt*) ctypedef enum SlepcEPSCISSQuadRule "EPSCISSQuadRule": EPS_CISS_QUADRULE_TRAPEZOIDAL EPS_CISS_QUADRULE_CHEBYSHEV ctypedef enum SlepcEPSCISSExtraction "EPSCISSExtraction": EPS_CISS_EXTRACTION_RITZ EPS_CISS_EXTRACTION_HANKEL PetscErrorCode EPSCISSSetExtraction(SlepcEPS,SlepcEPSCISSExtraction) PetscErrorCode EPSCISSGetExtraction(SlepcEPS,SlepcEPSCISSExtraction*) PetscErrorCode EPSCISSSetQuadRule(SlepcEPS,SlepcEPSCISSQuadRule) PetscErrorCode EPSCISSGetQuadRule(SlepcEPS,SlepcEPSCISSQuadRule*) PetscErrorCode EPSCISSSetSizes(SlepcEPS,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscBool) PetscErrorCode EPSCISSGetSizes(SlepcEPS,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscBool*) PetscErrorCode EPSCISSSetThreshold(SlepcEPS,PetscReal,PetscReal) PetscErrorCode EPSCISSGetThreshold(SlepcEPS,PetscReal*,PetscReal*) PetscErrorCode EPSCISSSetRefinement(SlepcEPS,PetscInt,PetscInt) PetscErrorCode EPSCISSGetRefinement(SlepcEPS,PetscInt*,PetscInt*) PetscErrorCode EPSCISSSetUseST(SlepcEPS,PetscBool) PetscErrorCode EPSCISSGetUseST(SlepcEPS,PetscBool*) PetscErrorCode EPSCISSGetKSPs(SlepcEPS,PetscInt*,PetscKSP**) cdef extern from * nogil: PetscErrorCode VecDuplicate(PetscVec,PetscVec*) PetscErrorCode MatCreateVecs(PetscMat,PetscVec*,PetscVec*) # ----------------------------------------------------------------------------- cdef inline EPS ref_EPS(SlepcEPS eps): cdef EPS ob = EPS() ob.eps = eps CHKERR( PetscINCREF(ob.obj) ) return ob # ----------------------------------------------------------------------------- cdef PetscErrorCode EPS_Stopping( SlepcEPS eps, PetscInt its, PetscInt max_it, PetscInt nconv, PetscInt nev, SlepcEPSConvergedReason *r, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef EPS Eps = ref_EPS(eps) (stopping, args, kargs) = Eps.get_attr('__stopping__') reason = stopping(Eps, toInt(its), toInt(max_it), toInt(nconv), toInt(nev), *args, **kargs) if reason is None: r[0] = EPS_CONVERGED_ITERATING elif reason is False: r[0] = EPS_CONVERGED_ITERATING elif reason is True: r[0] = EPS_CONVERGED_USER else: r[0] = reason # ----------------------------------------------------------------------------- cdef PetscErrorCode EPS_Arbitrary( PetscScalar er, PetscScalar ei, PetscVec xr, PetscVec xi, PetscScalar* rr, PetscScalar* ri, void *ctx, ) except PETSC_ERR_PYTHON with gil: (arbitrary, args, kargs) = ctx cdef Vec Vr = ref_Vec(xr) cdef Vec Vi = ref_Vec(xi) r = arbitrary(toComplex(er, ei), Vr, Vi, args, **kargs) if sizeof(PetscScalar) == sizeof(PetscReal): rr[0] = asComplexReal(r) ri[0] = asComplexImag(r) else: rr[0] = asScalar(r) ri[0] = 0.0 # ----------------------------------------------------------------------------- cdef PetscErrorCode EPS_Comparison( PetscScalar ar, PetscScalar ai, PetscScalar br, PetscScalar bi, PetscInt* res, void *ctx, ) except PETSC_ERR_PYTHON with gil: (comparison, args, kargs) = ctx r = comparison(toComplex(ar, ai), toComplex(br, bi), args, **kargs) res[0] = asInt(r) # ----------------------------------------------------------------------------- cdef PetscErrorCode EPS_Monitor( SlepcEPS eps, PetscInt its, PetscInt nconv, PetscScalar *eigr, PetscScalar *eigi, PetscReal *errest, PetscInt nest, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef EPS Eps = ref_EPS(eps) cdef object monitorlist = Eps.get_attr('__monitor__') if monitorlist is None: return PETSC_SUCCESS cdef object eig = [toComplex(eigr[i], eigi[i]) for i in range(nest)] cdef object err = [toReal(errest[i]) for i in range(nest)] for (monitor, args, kargs) in monitorlist: monitor(Eps, toInt(its), toInt(nconv), eig, err, *args, **kargs) return PETSC_SUCCESS # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcfn.pxi000066400000000000000000000043501454104675500210020ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcFNType "const char*" SlepcFNType FNCOMBINE SlepcFNType FNRATIONAL SlepcFNType FNEXP SlepcFNType FNLOG SlepcFNType FNPHI SlepcFNType FNSQRT SlepcFNType FNINVSQRT ctypedef enum SlepcFNCombineType "FNCombineType": FN_COMBINE_ADD FN_COMBINE_MULTIPLY FN_COMBINE_DIVIDE FN_COMBINE_COMPOSE ctypedef enum SlepcFNParallelType "FNParallelType": FN_PARALLEL_REDUNDANT FN_PARALLEL_SYNCHRONIZED PetscErrorCode FNCreate(MPI_Comm,SlepcFN*) PetscErrorCode FNView(SlepcFN,PetscViewer) PetscErrorCode FNDestroy(SlepcFN*) PetscErrorCode FNReset(SlepcFN) PetscErrorCode FNSetType(SlepcFN,SlepcFNType) PetscErrorCode FNGetType(SlepcFN,SlepcFNType*) PetscErrorCode FNSetOptionsPrefix(SlepcFN,char[]) PetscErrorCode FNGetOptionsPrefix(SlepcFN,char*[]) PetscErrorCode FNAppendOptionsPrefix(SlepcFN,char[]) PetscErrorCode FNSetFromOptions(SlepcFN) PetscErrorCode FNDuplicate(SlepcFN,MPI_Comm,SlepcFN*) PetscErrorCode FNSetScale(SlepcFN,PetscScalar,PetscScalar) PetscErrorCode FNGetScale(SlepcFN,PetscScalar*,PetscScalar*) PetscErrorCode FNSetMethod(SlepcFN,PetscInt) PetscErrorCode FNGetMethod(SlepcFN,PetscInt*) PetscErrorCode FNSetParallel(SlepcFN,SlepcFNParallelType) PetscErrorCode FNGetParallel(SlepcFN,SlepcFNParallelType*) PetscErrorCode FNEvaluateFunction(SlepcFN,PetscScalar,PetscScalar*) PetscErrorCode FNEvaluateDerivative(SlepcFN,PetscScalar,PetscScalar*) PetscErrorCode FNEvaluateFunctionMat(SlepcFN,PetscMat,PetscMat) PetscErrorCode FNEvaluateFunctionMatVec(SlepcFN,PetscMat,PetscVec) PetscErrorCode FNRationalSetNumerator(SlepcFN,PetscInt,PetscScalar[]) PetscErrorCode FNRationalGetNumerator(SlepcFN,PetscInt*,PetscScalar*[]) PetscErrorCode FNRationalSetDenominator(SlepcFN,PetscInt,PetscScalar[]) PetscErrorCode FNRationalGetDenominator(SlepcFN,PetscInt*,PetscScalar*[]) PetscErrorCode FNCombineSetChildren(SlepcFN,SlepcFNCombineType,SlepcFN,SlepcFN) PetscErrorCode FNCombineGetChildren(SlepcFN,SlepcFNCombineType*,SlepcFN*,SlepcFN*) PetscErrorCode FNPhiSetIndex(SlepcFN,PetscInt) PetscErrorCode FNPhiGetIndex(SlepcFN,PetscInt*) slepc4py-3.19.2/src/slepc4py/SLEPc/slepcmfn.pxi000066400000000000000000000057561454104675500211720ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcMFNType "const char*" SlepcMFNType MFNKRYLOV SlepcMFNType MFNEXPOKIT ctypedef enum SlepcMFNConvergedReason "MFNConvergedReason": MFN_CONVERGED_TOL MFN_CONVERGED_ITS MFN_DIVERGED_ITS MFN_DIVERGED_BREAKDOWN MFN_CONVERGED_ITERATING ctypedef PetscErrorCode (*SlepcMFNCtxDel)(void*) ctypedef PetscErrorCode (*SlepcMFNMonitorFunction)(SlepcMFN, PetscInt, PetscReal, void*) except PETSC_ERR_PYTHON PetscErrorCode MFNCreate(MPI_Comm,SlepcMFN*) PetscErrorCode MFNDestroy(SlepcMFN*) PetscErrorCode MFNReset(SlepcMFN) PetscErrorCode MFNView(SlepcMFN,PetscViewer) PetscErrorCode MFNSetType(SlepcMFN,SlepcMFNType) PetscErrorCode MFNGetType(SlepcMFN,SlepcMFNType*) PetscErrorCode MFNSetOperator(SlepcMFN,PetscMat) PetscErrorCode MFNGetOperator(SlepcMFN,PetscMat*) PetscErrorCode MFNSetOptionsPrefix(SlepcMFN,char*) PetscErrorCode MFNGetOptionsPrefix(SlepcMFN,char*[]) PetscErrorCode MFNSetFromOptions(SlepcMFN) PetscErrorCode MFNAppendOptionsPrefix(SlepcMFN,char*) PetscErrorCode MFNSetUp(SlepcMFN) PetscErrorCode MFNSolve(SlepcMFN,PetscVec,PetscVec) PetscErrorCode MFNSolveTranspose(SlepcMFN,PetscVec,PetscVec) PetscErrorCode MFNSetBV(SlepcMFN,SlepcBV) PetscErrorCode MFNGetBV(SlepcMFN,SlepcBV*) PetscErrorCode MFNSetFN(SlepcMFN,SlepcFN) PetscErrorCode MFNGetFN(SlepcMFN,SlepcFN*) PetscErrorCode MFNSetTolerances(SlepcMFN,PetscReal,PetscInt) PetscErrorCode MFNGetTolerances(SlepcMFN,PetscReal*,PetscInt*) PetscErrorCode MFNSetDimensions(SlepcMFN,PetscInt) PetscErrorCode MFNGetDimensions(SlepcMFN,PetscInt*) PetscErrorCode MFNSetErrorIfNotConverged(SlepcMFN,PetscBool) PetscErrorCode MFNGetErrorIfNotConverged(SlepcMFN,PetscBool*) PetscErrorCode MFNMonitorSet(SlepcMFN,SlepcMFNMonitorFunction,void*,SlepcMFNCtxDel) PetscErrorCode MFNMonitorCancel(SlepcMFN) PetscErrorCode MFNGetIterationNumber(SlepcMFN,PetscInt*) PetscErrorCode MFNGetConvergedReason(SlepcMFN,SlepcMFNConvergedReason*) # ----------------------------------------------------------------------------- cdef inline MFN ref_MFN(SlepcMFN mfn): cdef MFN ob = MFN() ob.mfn = mfn CHKERR( PetscINCREF(ob.obj) ) return ob # ----------------------------------------------------------------------------- cdef PetscErrorCode MFN_Monitor( SlepcMFN mfn, PetscInt it, PetscReal errest, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef MFN Mfn = ref_MFN(mfn) cdef object monitorlist = Mfn.get_attr('__monitor__') if monitorlist is None: return PETSC_SUCCESS for (monitor, args, kargs) in monitorlist: monitor(Mfn, toInt(it), toReal(errest), *args, **kargs) return PETSC_SUCCESS # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcmpi.pxi000066400000000000000000000012621454104675500211630ustar00rootroot00000000000000# ----------------------------------------------------------------------------- cdef extern from * nogil: MPI_Comm MPI_COMM_NULL MPI_Comm MPI_COMM_SELF MPI_Comm MPI_COMM_WORLD cdef extern from * nogil: MPI_Comm PETSC_COMM_SELF MPI_Comm PETSC_COMM_WORLD # ----------------------------------------------------------------------------- from petsc4py.PETSc cimport GetComm cdef inline MPI_Comm def_Comm(object comm, MPI_Comm defv) except *: return GetComm(comm, defv) from petsc4py.PETSc cimport GetCommDefault cdef inline MPI_Comm SLEPC_COMM_DEFAULT(): return GetCommDefault() # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcnep.pxi000066400000000000000000000325471454104675500211720ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcNEPType "const char*" SlepcNEPType NEPRII SlepcNEPType NEPSLP SlepcNEPType NEPNARNOLDI SlepcNEPType NEPCISS SlepcNEPType NEPINTERPOL SlepcNEPType NEPNLEIGS ctypedef enum SlepcNEPProblemType "NEPProblemType": NEP_GENERAL NEP_RATIONAL ctypedef enum SlepcNEPWhich "NEPWhich": NEP_LARGEST_MAGNITUDE NEP_SMALLEST_MAGNITUDE NEP_LARGEST_REAL NEP_SMALLEST_REAL NEP_LARGEST_IMAGINARY NEP_SMALLEST_IMAGINARY NEP_TARGET_MAGNITUDE NEP_TARGET_REAL NEP_TARGET_IMAGINARY NEP_ALL NEP_WHICH_USER ctypedef enum SlepcNEPErrorType "NEPErrorType": NEP_ERROR_ABSOLUTE NEP_ERROR_RELATIVE NEP_ERROR_BACKWARD ctypedef enum SlepcNEPRefine "NEPRefine": NEP_REFINE_NONE NEP_REFINE_SIMPLE NEP_REFINE_MULTIPLE ctypedef enum SlepcNEPRefineScheme "NEPRefineScheme": NEP_REFINE_SCHEME_SCHUR NEP_REFINE_SCHEME_MBE NEP_REFINE_SCHEME_EXPLICIT ctypedef enum SlepcNEPConv "NEPConv": NEP_CONV_ABS NEP_CONV_REL NEP_CONV_NORM NEP_CONV_USER ctypedef enum SlepcNEPStop "NEPStop": NEP_STOP_BASIC NEP_STOP_USER ctypedef enum SlepcNEPConvergedReason "NEPConvergedReason": NEP_CONVERGED_TOL NEP_CONVERGED_USER NEP_DIVERGED_ITS NEP_DIVERGED_BREAKDOWN NEP_DIVERGED_LINEAR_SOLVE NEP_DIVERGED_SUBSPACE_EXHAUSTED NEP_CONVERGED_ITERATING ctypedef PetscErrorCode (*SlepcNEPFunction)(SlepcNEP, PetscScalar, PetscMat, PetscMat, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcNEPJacobian)(SlepcNEP, PetscScalar, PetscMat, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcNEPCtxDel)(void*) ctypedef PetscErrorCode (*SlepcNEPStoppingFunction)(SlepcNEP, PetscInt, PetscInt, PetscInt, PetscInt, SlepcNEPConvergedReason*, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcNEPMonitorFunction)(SlepcNEP, PetscInt, PetscInt, PetscScalar*, PetscScalar*, PetscReal*, PetscInt, void*) except PETSC_ERR_PYTHON PetscErrorCode NEPCreate(MPI_Comm,SlepcNEP*) PetscErrorCode NEPDestroy(SlepcNEP*) PetscErrorCode NEPReset(SlepcNEP) PetscErrorCode NEPView(SlepcNEP,PetscViewer) PetscErrorCode NEPSetType(SlepcNEP,SlepcNEPType) PetscErrorCode NEPGetType(SlepcNEP,SlepcNEPType*) PetscErrorCode NEPSetTarget(SlepcNEP,PetscScalar) PetscErrorCode NEPGetTarget(SlepcNEP,PetscScalar*) PetscErrorCode NEPSetOptionsPrefix(SlepcNEP,char*) PetscErrorCode NEPGetOptionsPrefix(SlepcNEP,char*[]) PetscErrorCode NEPSetFromOptions(SlepcNEP) PetscErrorCode NEPAppendOptionsPrefix(SlepcNEP,char*) PetscErrorCode NEPSetUp(SlepcNEP) PetscErrorCode NEPSolve(SlepcNEP) PetscErrorCode NEPSetFunction(SlepcNEP,PetscMat,PetscMat,SlepcNEPFunction,void*) PetscErrorCode NEPGetFunction(SlepcNEP,PetscMat*,PetscMat*,SlepcNEPFunction*,void**) PetscErrorCode NEPSetJacobian(SlepcNEP,PetscMat,SlepcNEPJacobian,void*) PetscErrorCode NEPGetJacobian(SlepcNEP,PetscMat*,SlepcNEPJacobian*,void**) PetscErrorCode NEPSetSplitOperator(SlepcNEP,PetscInt,PetscMat[],SlepcFN[],PetscMatStructure) PetscErrorCode NEPGetSplitOperatorTerm(SlepcNEP,PetscInt,PetscMat*,SlepcFN*) PetscErrorCode NEPGetSplitOperatorInfo(SlepcNEP,PetscInt*,PetscMatStructure*) PetscErrorCode NEPSetSplitPreconditioner(SlepcNEP,PetscInt,PetscMat[],PetscMatStructure) PetscErrorCode NEPGetSplitPreconditionerTerm(SlepcNEP,PetscInt,PetscMat*) PetscErrorCode NEPGetSplitPreconditionerInfo(SlepcNEP,PetscInt*,PetscMatStructure*) PetscErrorCode NEPSetBV(SlepcNEP,SlepcBV) PetscErrorCode NEPGetBV(SlepcNEP,SlepcBV*) PetscErrorCode NEPSetRG(SlepcNEP,SlepcRG) PetscErrorCode NEPGetRG(SlepcNEP,SlepcRG*) PetscErrorCode NEPSetDS(SlepcNEP,SlepcDS) PetscErrorCode NEPGetDS(SlepcNEP,SlepcDS*) PetscErrorCode NEPSetTolerances(SlepcNEP,PetscReal,PetscInt) PetscErrorCode NEPGetTolerances(SlepcNEP,PetscReal*,PetscInt*) PetscErrorCode NEPSetTwoSided(SlepcNEP,PetscBool) PetscErrorCode NEPGetTwoSided(SlepcNEP,PetscBool*) PetscErrorCode NEPApplyResolvent(SlepcNEP,SlepcRG,PetscScalar,PetscVec,PetscVec) PetscErrorCode NEPSetTrackAll(SlepcNEP,PetscBool) PetscErrorCode NEPGetTrackAll(SlepcNEP,PetscBool*) PetscErrorCode NEPSetDimensions(SlepcNEP,PetscInt,PetscInt,PetscInt) PetscErrorCode NEPGetDimensions(SlepcNEP,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode NEPGetConverged(SlepcNEP,PetscInt*) PetscErrorCode NEPGetEigenpair(SlepcNEP,PetscInt,PetscScalar*,PetscScalar*,PetscVec,PetscVec) PetscErrorCode NEPGetLeftEigenvector(SlepcNEP,PetscInt,PetscVec,PetscVec) PetscErrorCode NEPComputeError(SlepcNEP,PetscInt,SlepcNEPErrorType,PetscReal*) PetscErrorCode NEPErrorView(SlepcNEP,SlepcNEPErrorType,PetscViewer) PetscErrorCode NEPValuesView(SlepcNEP,PetscViewer) PetscErrorCode NEPVectorsView(SlepcNEP,PetscViewer) PetscErrorCode NEPGetErrorEstimate(SlepcNEP,PetscInt,PetscReal*) PetscErrorCode NEPMonitorSet(SlepcNEP,SlepcNEPMonitorFunction,void*,SlepcNEPCtxDel) PetscErrorCode NEPMonitorCancel(SlepcNEP) PetscErrorCode NEPGetIterationNumber(SlepcNEP,PetscInt*) PetscErrorCode NEPSetInitialSpace(SlepcNEP,PetscInt,PetscVec*) PetscErrorCode NEPSetProblemType(SlepcNEP,SlepcNEPProblemType) PetscErrorCode NEPGetProblemType(SlepcNEP,SlepcNEPProblemType*) PetscErrorCode NEPSetWhichEigenpairs(SlepcNEP,SlepcNEPWhich) PetscErrorCode NEPGetWhichEigenpairs(SlepcNEP,SlepcNEPWhich*) PetscErrorCode NEPSetRefine(SlepcNEP,SlepcNEPRefine,PetscInt,PetscReal,PetscInt,SlepcNEPRefineScheme) PetscErrorCode NEPGetRefine(SlepcNEP,SlepcNEPRefine*,PetscInt*,PetscReal*,PetscInt*,SlepcNEPRefineScheme*) PetscErrorCode NEPRefineGetKSP(SlepcNEP,PetscKSP*) PetscErrorCode NEPGetConvergedReason(SlepcNEP,SlepcNEPConvergedReason*) PetscErrorCode NEPSetConvergenceTest(SlepcNEP,SlepcNEPConv) PetscErrorCode NEPGetConvergenceTest(SlepcNEP,SlepcNEPConv*) PetscErrorCode NEPSetStoppingTestFunction(SlepcNEP,SlepcNEPStoppingFunction,void*,SlepcNEPCtxDel) PetscErrorCode NEPStoppingBasic(SlepcNEP,PetscInt,PetscInt,PetscInt,PetscInt,SlepcNEPConvergedReason*,void*) except PETSC_ERR_PYTHON PetscErrorCode NEPRIISetLagPreconditioner(SlepcNEP,PetscInt) PetscErrorCode NEPRIIGetLagPreconditioner(SlepcNEP,PetscInt*) PetscErrorCode NEPRIISetConstCorrectionTol(SlepcNEP,PetscBool) PetscErrorCode NEPRIIGetConstCorrectionTol(SlepcNEP,PetscBool*) PetscErrorCode NEPRIISetMaximumIterations(SlepcNEP,PetscInt) PetscErrorCode NEPRIIGetMaximumIterations(SlepcNEP,PetscInt*) PetscErrorCode NEPRIISetHermitian(SlepcNEP,PetscBool) PetscErrorCode NEPRIIGetHermitian(SlepcNEP,PetscBool*) PetscErrorCode NEPRIISetDeflationThreshold(SlepcNEP,PetscReal) PetscErrorCode NEPRIIGetDeflationThreshold(SlepcNEP,PetscReal*) PetscErrorCode NEPRIISetKSP(SlepcNEP,PetscKSP) PetscErrorCode NEPRIIGetKSP(SlepcNEP,PetscKSP*) PetscErrorCode NEPSLPSetDeflationThreshold(SlepcNEP,PetscReal) PetscErrorCode NEPSLPGetDeflationThreshold(SlepcNEP,PetscReal*) PetscErrorCode NEPSLPSetEPS(SlepcNEP,SlepcEPS) PetscErrorCode NEPSLPGetEPS(SlepcNEP,SlepcEPS*) PetscErrorCode NEPSLPSetEPSLeft(SlepcNEP,SlepcEPS) PetscErrorCode NEPSLPGetEPSLeft(SlepcNEP,SlepcEPS*) PetscErrorCode NEPSLPSetKSP(SlepcNEP,PetscKSP) PetscErrorCode NEPSLPGetKSP(SlepcNEP,PetscKSP*) PetscErrorCode NEPNArnoldiSetKSP(SlepcNEP,PetscKSP) PetscErrorCode NEPNArnoldiGetKSP(SlepcNEP,PetscKSP*) PetscErrorCode NEPNArnoldiSetLagPreconditioner(SlepcNEP,PetscInt) PetscErrorCode NEPNArnoldiGetLagPreconditioner(SlepcNEP,PetscInt*) PetscErrorCode NEPInterpolSetPEP(SlepcNEP,SlepcPEP) PetscErrorCode NEPInterpolGetPEP(SlepcNEP,SlepcPEP*) PetscErrorCode NEPInterpolSetInterpolation(SlepcNEP,PetscReal,PetscInt) PetscErrorCode NEPInterpolGetInterpolation(SlepcNEP,PetscReal*,PetscInt*) PetscErrorCode NEPNLEIGSSetRestart(SlepcNEP,PetscReal) PetscErrorCode NEPNLEIGSGetRestart(SlepcNEP,PetscReal*) PetscErrorCode NEPNLEIGSSetLocking(SlepcNEP,PetscBool) PetscErrorCode NEPNLEIGSGetLocking(SlepcNEP,PetscBool*) PetscErrorCode NEPNLEIGSSetInterpolation(SlepcNEP,PetscReal,PetscInt) PetscErrorCode NEPNLEIGSGetInterpolation(SlepcNEP,PetscReal*,PetscInt*) PetscErrorCode NEPNLEIGSSetRKShifts(SlepcNEP,PetscInt,PetscScalar[]) PetscErrorCode NEPNLEIGSGetRKShifts(SlepcNEP,PetscInt*,PetscScalar*[]) PetscErrorCode NEPNLEIGSGetKSPs(SlepcNEP,PetscInt*,PetscKSP**) PetscErrorCode NEPNLEIGSSetFullBasis(SlepcNEP,PetscBool) PetscErrorCode NEPNLEIGSGetFullBasis(SlepcNEP,PetscBool*) PetscErrorCode NEPNLEIGSSetEPS(SlepcNEP,SlepcEPS) PetscErrorCode NEPNLEIGSGetEPS(SlepcNEP,SlepcEPS*) ctypedef enum SlepcNEPCISSExtraction "NEPCISSExtraction": NEP_CISS_EXTRACTION_RITZ NEP_CISS_EXTRACTION_HANKEL NEP_CISS_EXTRACTION_CAA PetscErrorCode NEPCISSSetExtraction(SlepcNEP,SlepcNEPCISSExtraction) PetscErrorCode NEPCISSGetExtraction(SlepcNEP,SlepcNEPCISSExtraction*) PetscErrorCode NEPCISSSetSizes(SlepcNEP,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscBool) PetscErrorCode NEPCISSGetSizes(SlepcNEP,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscBool*) PetscErrorCode NEPCISSSetThreshold(SlepcNEP,PetscReal,PetscReal) PetscErrorCode NEPCISSGetThreshold(SlepcNEP,PetscReal*,PetscReal*) PetscErrorCode NEPCISSSetRefinement(SlepcNEP,PetscInt,PetscInt) PetscErrorCode NEPCISSGetRefinement(SlepcNEP,PetscInt*,PetscInt*) PetscErrorCode NEPCISSGetKSPs(SlepcNEP,PetscInt*,PetscKSP**) # ----------------------------------------------------------------------------- cdef inline NEP ref_NEP(SlepcNEP nep): cdef NEP ob = NEP() ob.nep = nep CHKERR( PetscINCREF(ob.obj) ) return ob # ----------------------------------------------------------------------------- cdef PetscErrorCode NEP_Function( SlepcNEP nep, PetscScalar mu, PetscMat A, PetscMat B, void* ctx, ) except PETSC_ERR_PYTHON with gil: cdef NEP Nep = ref_NEP(nep) cdef Mat Amat = ref_Mat(A) cdef Mat Bmat = ref_Mat(B) (function, args, kargs) = Nep.get_attr('__function__') retv = function(Nep, toScalar(mu), Amat, Bmat, *args, **kargs) cdef PetscMat Atmp = NULL, Btmp = NULL Atmp = A; A = Amat.mat; Amat.mat = Atmp Btmp = B; B = Bmat.mat; Bmat.mat = Btmp return PETSC_SUCCESS # ----------------------------------------------------------------------------- cdef PetscErrorCode NEP_Jacobian( SlepcNEP nep, PetscScalar mu, PetscMat J, void* ctx, ) except PETSC_ERR_PYTHON with gil: cdef NEP Nep = ref_NEP(nep) cdef Mat Jmat = ref_Mat(J) (jacobian, args, kargs) = Nep.get_attr('__jacobian__') retv = jacobian(Nep, toScalar(mu), Jmat, *args, **kargs) cdef PetscMat Jtmp = NULL Jtmp = J; J = Jmat.mat; Jmat.mat = Jtmp return PETSC_SUCCESS # ----------------------------------------------------------------------------- cdef PetscErrorCode NEP_Stopping( SlepcNEP nep, PetscInt its, PetscInt max_it, PetscInt nconv, PetscInt nev, SlepcNEPConvergedReason *r, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef NEP Nep = ref_NEP(nep) (stopping, args, kargs) = Nep.get_attr('__stopping__') reason = stopping(Nep, toInt(its), toInt(max_it), toInt(nconv), toInt(nev), *args, **kargs) if reason is None: r[0] = NEP_CONVERGED_ITERATING elif reason is False: r[0] = NEP_CONVERGED_ITERATING elif reason is True: r[0] = NEP_CONVERGED_USER else: r[0] = reason # ----------------------------------------------------------------------------- cdef PetscErrorCode NEP_Monitor( SlepcNEP nep, PetscInt its, PetscInt nconv, PetscScalar *eigr, PetscScalar *eigi, PetscReal *errest, PetscInt nest, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef NEP Nep = ref_NEP(nep) cdef object monitorlist = Nep.get_attr('__monitor__') if monitorlist is None: return PETSC_SUCCESS cdef object eig = [toComplex(eigr[i], eigi[i]) for i in range(nest)] cdef object err = [toReal(errest[i]) for i in range(nest)] for (monitor, args, kargs) in monitorlist: monitor(Nep, toInt(its), toInt(nconv), eig, err, *args, **kargs) return PETSC_SUCCESS # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcpep.pxi000066400000000000000000000274761454104675500212010ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcPEPType "const char*" SlepcPEPType PEPLINEAR SlepcPEPType PEPQARNOLDI SlepcPEPType PEPTOAR SlepcPEPType PEPSTOAR SlepcPEPType PEPJD SlepcPEPType PEPCISS ctypedef enum SlepcPEPProblemType "PEPProblemType": PEP_GENERAL PEP_HERMITIAN PEP_HYPERBOLIC PEP_GYROSCOPIC ctypedef enum SlepcPEPRefine "PEPRefine": PEP_REFINE_NONE PEP_REFINE_SIMPLE PEP_REFINE_MULTIPLE ctypedef enum SlepcPEPExtract "PEPExtract": PEP_EXTRACT_NONE PEP_EXTRACT_NORM PEP_EXTRACT_RESIDUAL PEP_EXTRACT_STRUCTURED ctypedef enum SlepcPEPRefineScheme "PEPRefineScheme": PEP_REFINE_SCHEME_EXPLICIT PEP_REFINE_SCHEME_MBE PEP_REFINE_SCHEME_SCHUR ctypedef enum SlepcPEPErrorType "PEPErrorType": PEP_ERROR_ABSOLUTE PEP_ERROR_RELATIVE PEP_ERROR_BACKWARD ctypedef enum SlepcPEPWhich "PEPWhich": PEP_LARGEST_MAGNITUDE PEP_SMALLEST_MAGNITUDE PEP_LARGEST_REAL PEP_SMALLEST_REAL PEP_LARGEST_IMAGINARY PEP_SMALLEST_IMAGINARY PEP_TARGET_MAGNITUDE PEP_TARGET_REAL PEP_TARGET_IMAGINARY PEP_ALL PEP_WHICH_USER ctypedef enum SlepcPEPBasis "PEPBasis": PEP_BASIS_MONOMIAL PEP_BASIS_CHEBYSHEV1 PEP_BASIS_CHEBYSHEV2 PEP_BASIS_LEGENDRE PEP_BASIS_LAGUERRE PEP_BASIS_HERMITE ctypedef enum SlepcPEPScale "PEPScale": PEP_SCALE_NONE PEP_SCALE_SCALAR PEP_SCALE_DIAGONAL PEP_SCALE_BOTH ctypedef enum SlepcPEPConv "PEPConv": PEP_CONV_ABS PEP_CONV_REL PEP_CONV_NORM PEP_CONV_USER ctypedef enum SlepcPEPStop "PEPStop": PEP_STOP_BASIC PEP_STOP_USER ctypedef enum SlepcPEPConvergedReason "PEPConvergedReason": PEP_CONVERGED_TOL PEP_CONVERGED_USER PEP_DIVERGED_ITS PEP_DIVERGED_BREAKDOWN PEP_DIVERGED_SYMMETRY_LOST PEP_CONVERGED_ITERATING ctypedef PetscErrorCode (*SlepcPEPCtxDel)(void*) ctypedef PetscErrorCode (*SlepcPEPStoppingFunction)(SlepcPEP, PetscInt, PetscInt, PetscInt, PetscInt, SlepcPEPConvergedReason*, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcPEPMonitorFunction)(SlepcPEP, PetscInt, PetscInt, PetscScalar*, PetscScalar*, PetscReal*, PetscInt, void*) except PETSC_ERR_PYTHON PetscErrorCode PEPCreate(MPI_Comm,SlepcPEP*) PetscErrorCode PEPDestroy(SlepcPEP*) PetscErrorCode PEPReset(SlepcPEP) PetscErrorCode PEPView(SlepcPEP,PetscViewer) PetscErrorCode PEPSetType(SlepcPEP,SlepcPEPType) PetscErrorCode PEPGetType(SlepcPEP,SlepcPEPType*) PetscErrorCode PEPSetBasis(SlepcPEP,SlepcPEPBasis) PetscErrorCode PEPGetBasis(SlepcPEP,SlepcPEPBasis*) PetscErrorCode PEPSetProblemType(SlepcPEP,SlepcPEPProblemType) PetscErrorCode PEPGetProblemType(SlepcPEP,SlepcPEPProblemType*) PetscErrorCode PEPSetOperators(SlepcPEP,PetscInt,PetscMat*) PetscErrorCode PEPGetOperators(SlepcPEP,PetscInt,PetscMat*) PetscErrorCode PEPGetNumMatrices(SlepcPEP,PetscInt*) PetscErrorCode PEPSetOptionsPrefix(SlepcPEP,char*) PetscErrorCode PEPGetOptionsPrefix(SlepcPEP,char*[]) PetscErrorCode PEPSetFromOptions(SlepcPEP) PetscErrorCode PEPAppendOptionsPrefix(SlepcPEP,char*) PetscErrorCode PEPSetUp(SlepcPEP) PetscErrorCode PEPSolve(SlepcPEP) PetscErrorCode PEPSetBV(SlepcPEP,SlepcBV) PetscErrorCode PEPGetBV(SlepcPEP,SlepcBV*) PetscErrorCode PEPSetDS(SlepcPEP,SlepcDS) PetscErrorCode PEPGetDS(SlepcPEP,SlepcDS*) PetscErrorCode PEPSetST(SlepcPEP,SlepcST) PetscErrorCode PEPGetST(SlepcPEP,SlepcST*) PetscErrorCode PEPSetRG(SlepcPEP,SlepcRG) PetscErrorCode PEPGetRG(SlepcPEP,SlepcRG*) PetscErrorCode PEPSetTrackAll(SlepcPEP,PetscBool) PetscErrorCode PEPGetTrackAll(SlepcPEP,PetscBool*) PetscErrorCode PEPSetTolerances(SlepcPEP,PetscReal,PetscInt) PetscErrorCode PEPGetTolerances(SlepcPEP,PetscReal*,PetscInt*) PetscErrorCode PEPSetDimensions(SlepcPEP,PetscInt,PetscInt,PetscInt) PetscErrorCode PEPGetDimensions(SlepcPEP,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode PEPSetScale(SlepcPEP,SlepcPEPScale,PetscReal,PetscVec,PetscVec,PetscInt,PetscReal) PetscErrorCode PEPGetScale(SlepcPEP,SlepcPEPScale*,PetscReal*,PetscVec*,PetscVec*,PetscInt*,PetscReal*) PetscErrorCode PEPGetConverged(SlepcPEP,PetscInt*) PetscErrorCode PEPGetEigenpair(SlepcPEP,PetscInt,PetscScalar*,PetscScalar*,PetscVec,PetscVec) PetscErrorCode PEPComputeError(SlepcPEP,PetscInt,SlepcPEPErrorType,PetscReal*) PetscErrorCode PEPErrorView(SlepcPEP,SlepcPEPErrorType,PetscViewer) PetscErrorCode PEPValuesView(SlepcPEP,PetscViewer) PetscErrorCode PEPVectorsView(SlepcPEP,PetscViewer) PetscErrorCode PEPGetErrorEstimate(SlepcPEP,PetscInt,PetscReal*) PetscErrorCode PEPSetStoppingTestFunction(SlepcPEP,SlepcPEPStoppingFunction,void*,SlepcPEPCtxDel) PetscErrorCode PEPStoppingBasic(SlepcPEP,PetscInt,PetscInt,PetscInt,PetscInt,SlepcPEPConvergedReason*,void*) except PETSC_ERR_PYTHON PetscErrorCode PEPSetConvergenceTest(SlepcPEP,SlepcPEPConv) PetscErrorCode PEPGetConvergenceTest(SlepcPEP,SlepcPEPConv*) PetscErrorCode PEPSetRefine(SlepcPEP,SlepcPEPRefine,PetscInt,PetscReal,PetscInt,SlepcPEPRefineScheme) PetscErrorCode PEPGetRefine(SlepcPEP,SlepcPEPRefine*,PetscInt*,PetscReal*,PetscInt*,SlepcPEPRefineScheme*) PetscErrorCode PEPRefineGetKSP(SlepcPEP,PetscKSP*) PetscErrorCode PEPSetExtract(SlepcPEP,SlepcPEPExtract); PetscErrorCode PEPGetExtract(SlepcPEP,SlepcPEPExtract*) PetscErrorCode PEPMonitorSet(SlepcPEP,SlepcPEPMonitorFunction,void*,SlepcPEPCtxDel) PetscErrorCode PEPMonitorCancel(SlepcPEP) PetscErrorCode PEPGetIterationNumber(SlepcPEP,PetscInt*) PetscErrorCode PEPSetInitialSpace(SlepcPEP,PetscInt,PetscVec*) PetscErrorCode PEPSetWhichEigenpairs(SlepcPEP,SlepcPEPWhich) PetscErrorCode PEPGetWhichEigenpairs(SlepcPEP,SlepcPEPWhich*) PetscErrorCode PEPSetTarget(SlepcPEP,PetscScalar) PetscErrorCode PEPGetTarget(SlepcPEP,PetscScalar*) PetscErrorCode PEPSetInterval(SlepcPEP,PetscReal,PetscReal) PetscErrorCode PEPGetInterval(SlepcPEP,PetscReal*,PetscReal*) PetscErrorCode PEPGetConvergedReason(SlepcPEP,SlepcPEPConvergedReason*) PetscErrorCode PEPLinearSetLinearization(SlepcPEP,PetscReal,PetscReal) PetscErrorCode PEPLinearGetLinearization(SlepcPEP,PetscReal*,PetscReal*) PetscErrorCode PEPLinearSetExplicitMatrix(SlepcPEP,PetscBool) PetscErrorCode PEPLinearGetExplicitMatrix(SlepcPEP,PetscBool*) PetscErrorCode PEPLinearSetEPS(SlepcPEP,SlepcEPS) PetscErrorCode PEPLinearGetEPS(SlepcPEP,SlepcEPS*) PetscErrorCode PEPQArnoldiSetRestart(SlepcPEP,PetscReal) PetscErrorCode PEPQArnoldiGetRestart(SlepcPEP,PetscReal*) PetscErrorCode PEPQArnoldiSetLocking(SlepcPEP,PetscBool) PetscErrorCode PEPQArnoldiGetLocking(SlepcPEP,PetscBool*) PetscErrorCode PEPTOARSetRestart(SlepcPEP,PetscReal) PetscErrorCode PEPTOARGetRestart(SlepcPEP,PetscReal*) PetscErrorCode PEPTOARSetLocking(SlepcPEP,PetscBool) PetscErrorCode PEPTOARGetLocking(SlepcPEP,PetscBool*) PetscErrorCode PEPSTOARSetLinearization(SlepcPEP,PetscReal,PetscReal) PetscErrorCode PEPSTOARGetLinearization(SlepcPEP,PetscReal*,PetscReal*) PetscErrorCode PEPSTOARSetLocking(SlepcPEP,PetscBool) PetscErrorCode PEPSTOARGetLocking(SlepcPEP,PetscBool*) PetscErrorCode PEPSTOARSetDetectZeros(SlepcPEP,PetscBool) PetscErrorCode PEPSTOARGetDetectZeros(SlepcPEP,PetscBool*) PetscErrorCode PEPSTOARSetDimensions(SlepcPEP,PetscInt,PetscInt,PetscInt) PetscErrorCode PEPSTOARGetDimensions(SlepcPEP,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode PEPSTOARGetInertias(SlepcPEP,PetscInt*,PetscReal**,PetscInt**) PetscErrorCode PEPSTOARSetCheckEigenvalueType(SlepcPEP,PetscBool) PetscErrorCode PEPSTOARGetCheckEigenvalueType(SlepcPEP,PetscBool*) ctypedef enum SlepcPEPJDProjection "PEPJDProjection": PEP_JD_PROJECTION_HARMONIC PEP_JD_PROJECTION_ORTHOGONAL PetscErrorCode PEPJDSetRestart(SlepcPEP,PetscReal) PetscErrorCode PEPJDGetRestart(SlepcPEP,PetscReal*) PetscErrorCode PEPJDSetFix(SlepcPEP,PetscReal) PetscErrorCode PEPJDGetFix(SlepcPEP,PetscReal*) PetscErrorCode PEPJDSetReusePreconditioner(SlepcPEP,PetscBool) PetscErrorCode PEPJDGetReusePreconditioner(SlepcPEP,PetscBool*) PetscErrorCode PEPJDSetMinimalityIndex(SlepcPEP,PetscInt) PetscErrorCode PEPJDGetMinimalityIndex(SlepcPEP,PetscInt*) PetscErrorCode PEPJDSetProjection(SlepcPEP,SlepcPEPJDProjection) PetscErrorCode PEPJDGetProjection(SlepcPEP,SlepcPEPJDProjection*) ctypedef enum SlepcPEPCISSExtraction "PEPCISSExtraction": PEP_CISS_EXTRACTION_RITZ PEP_CISS_EXTRACTION_HANKEL PEP_CISS_EXTRACTION_CAA PetscErrorCode PEPCISSSetExtraction(SlepcPEP,SlepcPEPCISSExtraction) PetscErrorCode PEPCISSGetExtraction(SlepcPEP,SlepcPEPCISSExtraction*) PetscErrorCode PEPCISSSetSizes(SlepcPEP,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscBool) PetscErrorCode PEPCISSGetSizes(SlepcPEP,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,PetscBool*) PetscErrorCode PEPCISSSetThreshold(SlepcPEP,PetscReal,PetscReal) PetscErrorCode PEPCISSGetThreshold(SlepcPEP,PetscReal*,PetscReal*) PetscErrorCode PEPCISSSetRefinement(SlepcPEP,PetscInt,PetscInt) PetscErrorCode PEPCISSGetRefinement(SlepcPEP,PetscInt*,PetscInt*) PetscErrorCode PEPCISSGetKSPs(SlepcPEP,PetscInt*,PetscKSP**) # ----------------------------------------------------------------------------- cdef inline PEP ref_PEP(SlepcPEP pep): cdef PEP ob = PEP() ob.pep = pep CHKERR( PetscINCREF(ob.obj) ) return ob # ----------------------------------------------------------------------------- cdef PetscErrorCode PEP_Stopping( SlepcPEP pep, PetscInt its, PetscInt max_it, PetscInt nconv, PetscInt nev, SlepcPEPConvergedReason *r, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef PEP Pep = ref_PEP(pep) (stopping, args, kargs) = Pep.get_attr('__stopping__') reason = stopping(Pep, toInt(its), toInt(max_it), toInt(nconv), toInt(nev), *args, **kargs) if reason is None: r[0] = PEP_CONVERGED_ITERATING elif reason is False: r[0] = PEP_CONVERGED_ITERATING elif reason is True: r[0] = PEP_CONVERGED_USER else: r[0] = reason # ----------------------------------------------------------------------------- cdef PetscErrorCode PEP_Monitor( SlepcPEP pep, PetscInt its, PetscInt nconv, PetscScalar *eigr, PetscScalar *eigi, PetscReal *errest, PetscInt nest, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef PEP Pep = ref_PEP(pep) cdef object monitorlist = Pep.get_attr('__monitor__') if monitorlist is None: return PETSC_SUCCESS cdef object eig = [toComplex(eigr[i], eigi[i]) for i in range(nest)] cdef object err = [toReal(errest[i]) for i in range(nest)] for (monitor, args, kargs) in monitorlist: monitor(Pep, toInt(its), toInt(nconv), eig, err, *args, **kargs) return PETSC_SUCCESS # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcrg.pxi000066400000000000000000000044471454104675500210160ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcRGType "const char*" SlepcRGType RGINTERVAL SlepcRGType RGPOLYGON SlepcRGType RGELLIPSE SlepcRGType RGRING ctypedef enum SlepcRGQuadRule "RGQuadRule": RG_QUADRULE_TRAPEZOIDAL RG_QUADRULE_CHEBYSHEV PetscErrorCode RGCreate(MPI_Comm,SlepcRG*) PetscErrorCode RGView(SlepcRG,PetscViewer) PetscErrorCode RGDestroy(SlepcRG*) PetscErrorCode RGSetType(SlepcRG,SlepcRGType) PetscErrorCode RGGetType(SlepcRG,SlepcRGType*) PetscErrorCode RGSetOptionsPrefix(SlepcRG,char[]) PetscErrorCode RGGetOptionsPrefix(SlepcRG,char*[]) PetscErrorCode RGAppendOptionsPrefix(SlepcRG,char[]) PetscErrorCode RGSetFromOptions(SlepcRG) PetscErrorCode RGIsTrivial(SlepcRG,PetscBool*) PetscErrorCode RGIsAxisymmetric(SlepcRG,PetscBool,PetscBool*) PetscErrorCode RGSetComplement(SlepcRG,PetscBool) PetscErrorCode RGGetComplement(SlepcRG,PetscBool*) PetscErrorCode RGSetScale(SlepcRG,PetscReal) PetscErrorCode RGGetScale(SlepcRG,PetscReal*) PetscErrorCode RGPushScale(SlepcRG,PetscReal) PetscErrorCode RGPopScale(SlepcRG) PetscErrorCode RGCheckInside(SlepcRG,PetscInt,PetscScalar*,PetscScalar*,PetscInt*) PetscErrorCode RGComputeContour(SlepcRG,PetscInt,PetscScalar*,PetscScalar*) PetscErrorCode RGComputeBoundingBox(SlepcRG,PetscReal*,PetscReal*,PetscReal*,PetscReal*) PetscErrorCode RGCanUseConjugates(SlepcRG,PetscBool,PetscBool*) PetscErrorCode RGComputeQuadrature(SlepcRG,SlepcRGQuadRule,PetscInt,PetscScalar*,PetscScalar*,PetscScalar*) PetscErrorCode RGEllipseSetParameters(SlepcRG,PetscScalar,PetscReal,PetscReal) PetscErrorCode RGEllipseGetParameters(SlepcRG,PetscScalar*,PetscReal*,PetscReal*) PetscErrorCode RGIntervalSetEndpoints(SlepcRG,PetscReal,PetscReal,PetscReal,PetscReal) PetscErrorCode RGIntervalGetEndpoints(SlepcRG,PetscReal*,PetscReal*,PetscReal*,PetscReal*) PetscErrorCode RGPolygonSetVertices(SlepcRG,PetscInt,PetscScalar*,PetscScalar*) PetscErrorCode RGPolygonGetVertices(SlepcRG,PetscInt*,PetscScalar**,PetscScalar**) PetscErrorCode RGRingSetParameters(SlepcRG,PetscScalar,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal) PetscErrorCode RGRingGetParameters(SlepcRG,PetscScalar*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*) slepc4py-3.19.2/src/slepc4py/SLEPc/slepcst.pxi000066400000000000000000000050141454104675500210230ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcSTType "const char*" SlepcSTType STSHELL SlepcSTType STSHIFT SlepcSTType STSINVERT SlepcSTType STCAYLEY SlepcSTType STPRECOND SlepcSTType STFILTER ctypedef enum SlepcSTMatMode "STMatMode": ST_MATMODE_COPY ST_MATMODE_INPLACE ST_MATMODE_SHELL PetscErrorCode STView(SlepcST,PetscViewer) PetscErrorCode STDestroy(SlepcST*) PetscErrorCode STReset(SlepcST) PetscErrorCode STCreate(MPI_Comm,SlepcST*) PetscErrorCode STGetType(SlepcST,SlepcSTType*) PetscErrorCode STSetType(SlepcST,SlepcSTType) PetscErrorCode STGetOptionsPrefix(SlepcST,char*[]) PetscErrorCode STSetOptionsPrefix(SlepcST,char[]) PetscErrorCode STAppendOptionsPrefix(SlepcST,char[]) PetscErrorCode STSetFromOptions(SlepcST) PetscErrorCode STGetShift(SlepcST,PetscScalar*) PetscErrorCode STSetShift(SlepcST,PetscScalar) PetscErrorCode STGetKSP(SlepcST,PetscKSP*) PetscErrorCode STSetKSP(SlepcST,PetscKSP) PetscErrorCode STGetOperator(SlepcST,PetscMat*) PetscErrorCode STRestoreOperator(SlepcST,PetscMat*) PetscErrorCode STGetNumMatrices(SlepcST,PetscInt*) PetscErrorCode STGetMatrix(SlepcST,PetscInt,PetscMat*) PetscErrorCode STSetMatrices(SlepcST,PetscInt,PetscMat*) PetscErrorCode STSetMatStructure(SlepcST,PetscMatStructure) PetscErrorCode STGetMatStructure(SlepcST,PetscMatStructure*) PetscErrorCode STSetPreconditionerMat(SlepcST,PetscMat) PetscErrorCode STGetPreconditionerMat(SlepcST,PetscMat*) PetscErrorCode STSetTransform(SlepcST,PetscBool) PetscErrorCode STGetTransform(SlepcST,PetscBool*) PetscErrorCode STGetMatMode(SlepcST,SlepcSTMatMode*) PetscErrorCode STSetMatMode(SlepcST,SlepcSTMatMode) PetscErrorCode STSetUp(SlepcST) PetscErrorCode STApply(SlepcST,PetscVec,PetscVec) PetscErrorCode STApplyMat(SlepcST,PetscMat,PetscMat) PetscErrorCode STApplyTranspose(SlepcST,PetscVec,PetscVec) PetscErrorCode STApplyHermitianTranspose(SlepcST,PetscVec,PetscVec) PetscErrorCode STCayleySetAntishift(SlepcST,PetscScalar) PetscErrorCode STCayleyGetAntishift(SlepcST,PetscScalar*) PetscErrorCode STFilterSetInterval(SlepcST,PetscReal,PetscReal) PetscErrorCode STFilterGetInterval(SlepcST,PetscReal*,PetscReal*) PetscErrorCode STFilterSetRange(SlepcST,PetscReal,PetscReal) PetscErrorCode STFilterGetRange(SlepcST,PetscReal*,PetscReal*) PetscErrorCode STFilterSetDegree(SlepcST,PetscInt) PetscErrorCode STFilterGetDegree(SlepcST,PetscInt*) slepc4py-3.19.2/src/slepc4py/SLEPc/slepcsvd.pxi000066400000000000000000000204771454104675500212030ustar00rootroot00000000000000cdef extern from * nogil: ctypedef char* SlepcSVDType "const char*" SlepcSVDType SVDCROSS SlepcSVDType SVDCYCLIC SlepcSVDType SVDLAPACK SlepcSVDType SVDLANCZOS SlepcSVDType SVDTRLANCZOS SlepcSVDType SVDRANDOMIZED SlepcSVDType SVDSCALAPACK SlepcSVDType SVDKSVD SlepcSVDType SVDELEMENTAL SlepcSVDType SVDPRIMME ctypedef enum SlepcSVDProblemType "SVDProblemType": SVD_STANDARD SVD_GENERALIZED SVD_HYPERBOLIC ctypedef enum SlepcSVDWhich "SVDWhich": SVD_LARGEST SVD_SMALLEST ctypedef enum SlepcSVDErrorType "SVDErrorType": SVD_ERROR_ABSOLUTE SVD_ERROR_RELATIVE SVD_ERROR_NORM ctypedef enum SlepcSVDConv "SVDConv": SVD_CONV_ABS SVD_CONV_REL SVD_CONV_NORM SVD_CONV_MAXIT SVD_CONV_USER ctypedef enum SlepcSVDStop "SVDStop": SVD_STOP_BASIC SVD_STOP_USER ctypedef enum SlepcSVDConvergedReason "SVDConvergedReason": SVD_CONVERGED_TOL SVD_CONVERGED_USER SVD_CONVERGED_MAXIT SVD_DIVERGED_ITS SVD_DIVERGED_BREAKDOWN SVD_CONVERGED_ITERATING ctypedef PetscErrorCode (*SlepcSVDCtxDel)(void*) ctypedef PetscErrorCode (*SlepcSVDStoppingFunction)(SlepcSVD, PetscInt, PetscInt, PetscInt, PetscInt, SlepcSVDConvergedReason*, void*) except PETSC_ERR_PYTHON ctypedef PetscErrorCode (*SlepcSVDMonitorFunction)(SlepcSVD, PetscInt, PetscInt, PetscReal*, PetscReal*, PetscInt, void*) except PETSC_ERR_PYTHON PetscErrorCode SVDCreate(MPI_Comm,SlepcSVD*) PetscErrorCode SVDView(SlepcSVD,PetscViewer) PetscErrorCode SVDDestroy(SlepcSVD*) PetscErrorCode SVDReset(SlepcSVD) PetscErrorCode SVDSetType(SlepcSVD,SlepcSVDType) PetscErrorCode SVDGetType(SlepcSVD,SlepcSVDType*) PetscErrorCode SVDSetOptionsPrefix(SlepcSVD,char[]) PetscErrorCode SVDAppendOptionsPrefix(SlepcSVD,char[]) PetscErrorCode SVDGetOptionsPrefix(SlepcSVD,char*[]) PetscErrorCode SVDSetFromOptions(SlepcSVD) PetscErrorCode SVDSetProblemType(SlepcSVD,SlepcSVDProblemType) PetscErrorCode SVDGetProblemType(SlepcSVD,SlepcSVDProblemType*) PetscErrorCode SVDIsGeneralized(SlepcSVD,PetscBool*) PetscErrorCode SVDIsHyperbolic(SlepcSVD,PetscBool*) PetscErrorCode SVDSetBV(SlepcSVD,SlepcBV,SlepcBV) PetscErrorCode SVDGetBV(SlepcSVD,SlepcBV*,SlepcBV*) PetscErrorCode SVDSetDS(SlepcSVD,SlepcDS) PetscErrorCode SVDGetDS(SlepcSVD,SlepcDS*) PetscErrorCode SVDSetOperators(SlepcSVD,PetscMat,PetscMat) PetscErrorCode SVDGetOperators(SlepcSVD,PetscMat*,PetscMat*) PetscErrorCode SVDSetSignature(SlepcSVD,PetscVec) PetscErrorCode SVDGetSignature(SlepcSVD,PetscVec*) PetscErrorCode SVDSetInitialSpaces(SlepcSVD,PetscInt,PetscVec*,PetscInt,PetscVec*) PetscErrorCode SVDSetImplicitTranspose(SlepcSVD,PetscBool) PetscErrorCode SVDGetImplicitTranspose(SlepcSVD,PetscBool*) PetscErrorCode SVDSetDimensions(SlepcSVD,PetscInt,PetscInt,PetscInt) PetscErrorCode SVDGetDimensions(SlepcSVD,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode SVDSetTolerances(SlepcSVD,PetscReal,PetscInt) PetscErrorCode SVDGetTolerances(SlepcSVD,PetscReal*,PetscInt*) PetscErrorCode SVDSetWhichSingularTriplets(SlepcSVD,SlepcSVDWhich) PetscErrorCode SVDGetWhichSingularTriplets(SlepcSVD,SlepcSVDWhich*) PetscErrorCode SVDSetConvergenceTest(SlepcSVD,SlepcSVDConv) PetscErrorCode SVDGetConvergenceTest(SlepcSVD,SlepcSVDConv*) PetscErrorCode SVDMonitorSet(SlepcSVD,SlepcSVDMonitorFunction,void*,SlepcSVDCtxDel) PetscErrorCode SVDMonitorCancel(SlepcSVD) PetscErrorCode SVDSetStoppingTestFunction(SlepcSVD,SlepcSVDStoppingFunction,void*,SlepcSVDCtxDel) PetscErrorCode SVDStoppingBasic(SlepcSVD,PetscInt,PetscInt,PetscInt,PetscInt,SlepcSVDConvergedReason*,void*) except PETSC_ERR_PYTHON PetscErrorCode SVDSetTrackAll(SlepcSVD,PetscBool) PetscErrorCode SVDGetTrackAll(SlepcSVD,PetscBool*) PetscErrorCode SVDSetUp(SlepcSVD) PetscErrorCode SVDSolve(SlepcSVD) PetscErrorCode SVDGetIterationNumber(SlepcSVD,PetscInt*) PetscErrorCode SVDGetConvergedReason(SlepcSVD,SlepcSVDConvergedReason*) PetscErrorCode SVDGetConverged(SlepcSVD,PetscInt*) PetscErrorCode SVDGetSingularTriplet(SlepcSVD,PetscInt,PetscReal*,PetscVec,PetscVec) PetscErrorCode SVDComputeError(SlepcSVD,PetscInt,SlepcSVDErrorType,PetscReal*) PetscErrorCode SVDErrorView(SlepcSVD,SlepcSVDErrorType,PetscViewer) PetscErrorCode SVDValuesView(SlepcSVD,PetscViewer) PetscErrorCode SVDVectorsView(SlepcSVD,PetscViewer) PetscErrorCode SVDCrossSetExplicitMatrix(SlepcSVD,PetscBool) PetscErrorCode SVDCrossGetExplicitMatrix(SlepcSVD,PetscBool*) PetscErrorCode SVDCrossSetEPS(SlepcSVD,SlepcEPS) PetscErrorCode SVDCrossGetEPS(SlepcSVD,SlepcEPS*) PetscErrorCode SVDCyclicSetExplicitMatrix(SlepcSVD,PetscBool) PetscErrorCode SVDCyclicGetExplicitMatrix(SlepcSVD,PetscBool*) PetscErrorCode SVDCyclicSetEPS(SlepcSVD,SlepcEPS) PetscErrorCode SVDCyclicGetEPS(SlepcSVD,SlepcEPS*) PetscErrorCode SVDLanczosSetOneSide(SlepcSVD,PetscBool) PetscErrorCode SVDLanczosGetOneSide(SlepcSVD,PetscBool*) PetscErrorCode SVDTRLanczosSetOneSide(SlepcSVD,PetscBool) PetscErrorCode SVDTRLanczosGetOneSide(SlepcSVD,PetscBool*) PetscErrorCode SVDTRLanczosSetGBidiag(SlepcSVD,SlepcSVDTRLanczosGBidiag) PetscErrorCode SVDTRLanczosGetGBidiag(SlepcSVD,SlepcSVDTRLanczosGBidiag*) PetscErrorCode SVDTRLanczosSetKSP(SlepcSVD,PetscKSP) PetscErrorCode SVDTRLanczosGetKSP(SlepcSVD,PetscKSP*) PetscErrorCode SVDTRLanczosSetRestart(SlepcSVD,PetscReal) PetscErrorCode SVDTRLanczosGetRestart(SlepcSVD,PetscReal*) PetscErrorCode SVDTRLanczosSetLocking(SlepcSVD,PetscBool) PetscErrorCode SVDTRLanczosGetLocking(SlepcSVD,PetscBool*) PetscErrorCode SVDTRLanczosSetExplicitMatrix(SlepcSVD,PetscBool) PetscErrorCode SVDTRLanczosGetExplicitMatrix(SlepcSVD,PetscBool*) ctypedef enum SlepcSVDTRLanczosGBidiag "SVDTRLanczosGBidiag": SVD_TRLANCZOS_GBIDIAG_SINGLE SVD_TRLANCZOS_GBIDIAG_UPPER SVD_TRLANCZOS_GBIDIAG_LOWER # ----------------------------------------------------------------------------- cdef inline SVD ref_SVD(SlepcSVD svd): cdef SVD ob = SVD() ob.svd = svd CHKERR( PetscINCREF(ob.obj) ) return ob # ----------------------------------------------------------------------------- cdef PetscErrorCode SVD_Stopping( SlepcSVD svd, PetscInt its, PetscInt max_it, PetscInt nconv, PetscInt nev, SlepcSVDConvergedReason *r, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef SVD Svd = ref_SVD(svd) (stopping, args, kargs) = Svd.get_attr('__stopping__') reason = stopping(Svd, toInt(its), toInt(max_it), toInt(nconv), toInt(nev), *args, **kargs) if reason is None: r[0] = SVD_CONVERGED_ITERATING elif reason is False: r[0] = SVD_CONVERGED_ITERATING elif reason is True: r[0] = SVD_CONVERGED_USER else: r[0] = reason # ----------------------------------------------------------------------------- cdef PetscErrorCode SVD_Monitor( SlepcSVD svd, PetscInt its, PetscInt nconv, PetscReal *sigma, PetscReal *errest, PetscInt nest, void *ctx, ) except PETSC_ERR_PYTHON with gil: cdef SVD Svd = ref_SVD(svd) cdef object monitorlist = Svd.get_attr('__monitor__') if monitorlist is None: return PETSC_SUCCESS cdef object eig = [toReal(sigma[i]) for i in range(nest)] cdef object err = [toReal(errest[i]) for i in range(nest)] for (monitor, args, kargs) in monitorlist: monitor(Svd, toInt(its), toInt(nconv), eig, err, *args, **kargs) return PETSC_SUCCESS # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/SLEPc/slepcsys.pxi000066400000000000000000000063221454104675500212160ustar00rootroot00000000000000cdef extern from * nogil: enum: PETSC_DECIDE enum: PETSC_DEFAULT enum: PETSC_DETERMINE ctypedef enum PetscBool: PETSC_TRUE, PETSC_YES, PETSC_FALSE, PETSC_NO, ctypedef enum PetscNormType "NormType": PETSC_NORM_1 "NORM_1" PETSC_NORM_2 "NORM_2" PETSC_NORM_1_AND_2 "NORM_1_AND_2" PETSC_NORM_FROBENIUS "NORM_FROBENIUS" PETSC_NORM_INFINITY "NORM_INFINITY" PETSC_NORM_MAX "NORM_MAX" ctypedef enum PetscMatStructure "MatStructure": MAT_SAME_NONZERO_PATTERN "SAME_NONZERO_PATTERN" MAT_DIFFERENT_NONZERO_PATTERN "DIFFERENT_NONZERO_PATTERN" MAT_SUBSET_NONZERO_PATTERN "SUBSET_NONZERO_PATTERN" cdef extern from * nogil: PetscErrorCode PetscMalloc(size_t,void*) PetscErrorCode PetscFree(void*) PetscErrorCode PetscMemcpy(void*,void*,size_t) PetscErrorCode PetscMemzero(void*,size_t) cdef extern from * nogil: MPI_Comm PetscObjectComm(PetscObject) PetscErrorCode PetscObjectReference(PetscObject) PetscErrorCode PetscObjectDereference(PetscObject) PetscErrorCode PetscObjectDestroy(PetscObject*) PetscErrorCode PetscObjectTypeCompare(PetscObject,char[],PetscBool*) cdef extern from * nogil: PetscErrorCode VecCopy(PetscVec,PetscVec) PetscErrorCode VecSet(PetscVec,PetscScalar) PetscErrorCode VecDestroy(PetscVec*) cdef extern from * nogil: PetscErrorCode MatGetSize(PetscMat,PetscInt*,PetscInt*) PetscErrorCode MatGetLocalSize(PetscMat,PetscInt*,PetscInt*) cdef extern from * nogil: const_char SLEPC_AUTHOR_INFO[] PetscErrorCode SlepcGetVersion(char[],size_t) PetscErrorCode SlepcGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*) PetscErrorCode SlepcInitialize(int*,char***,char[],char[]) PetscErrorCode SlepcFinalize() PetscBool SlepcInitializeCalled PetscBool SlepcFinalizeCalled PetscErrorCode SlepcHasExternalPackage(const char[],PetscBool*) cdef inline PetscMatStructure matstructure(object structure) \ except (-1): if structure is None: return MAT_DIFFERENT_NONZERO_PATTERN elif structure is False: return MAT_DIFFERENT_NONZERO_PATTERN elif structure is True: return MAT_SAME_NONZERO_PATTERN else: return structure cdef inline PetscErrorCode PetscINCREF(PetscObject *obj): if obj == NULL: return PETSC_SUCCESS if obj[0] == NULL: return PETSC_SUCCESS return PetscObjectReference(obj[0]) cdef inline PetscErrorCode SlepcCLEAR(PetscObject* obj): if obj == NULL: return PETSC_SUCCESS if obj[0] == NULL: return PETSC_SUCCESS cdef PetscObject tmp tmp = obj[0]; obj[0] = NULL return PetscObjectDestroy(&tmp) cdef inline PetscViewer def_Viewer(Viewer viewer): return viewer.vwr if viewer is not None else NULL cdef inline KSP ref_KSP(PetscKSP ksp): cdef KSP ob = KSP() ob.ksp = ksp CHKERR( PetscINCREF(ob.obj) ) return ob cdef inline Mat ref_Mat(PetscMat mat): cdef Mat ob = Mat() ob.mat = mat CHKERR( PetscINCREF(ob.obj) ) return ob cdef inline Vec ref_Vec(PetscVec vec): cdef Vec ob = Vec() ob.vec = vec CHKERR( PetscINCREF(ob.obj) ) return ob slepc4py-3.19.2/src/slepc4py/__init__.pxd000066400000000000000000000000701454104675500201670ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com slepc4py-3.19.2/src/slepc4py/__init__.py000066400000000000000000000042021454104675500200250ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com # ----------------------------------------------------------------------------- """ SLEPc for Python ================ This package is an interface to SLEPc_ libraries. SLEPc_ (the Scalable Library for Eigenvalue Problem Computations) is a software library for the solution of large scale sparse eigenvalue problems on parallel computers. It is an extension of PETSc_ and can be used for either standard or generalized eigenproblems, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix. .. _SLEPc: https://slepc.upv.es .. _PETSc: https://petsc.org """ __author__ = 'Lisandro Dalcin' __version__ = '3.19.2' __credits__ = 'SLEPc Team ' # ----------------------------------------------------------------------------- def init(args=None, arch=None): """ Initialize SLEPc. :Parameters: - `args`: command-line arguments, usually the 'sys.argv' list. - `arch`: specific configuration to use. .. note:: This function should be called only once, typically at the very beginning of the bootstrap script of an application. """ import slepc4py.lib SLEPc = slepc4py.lib.ImportSLEPc(arch) PETSc = slepc4py.lib.ImportPETSc(arch) args = slepc4py.lib.getInitArgs(args) PETSc._initialize(args) SLEPc._initialize(args) # ----------------------------------------------------------------------------- def get_include(): """ Return the directory in the package that contains header files. Extension modules that need to compile against slepc4py should use this function to locate the appropriate include directory. Using Python distutils (or perhaps NumPy distutils):: import petscc4py, slepc4py Extension('extension_name', ... include_dirs=[..., petsc4py.get_include(), slepc4py.get_include(),]) """ from os.path import dirname, join return join(dirname(__file__), 'include') # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/__main__.py000066400000000000000000000042571454104675500200200ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com """ Command line access to the SLEPc Options Database. This module provides command line access to SLEPc Options Database. It outputs a listing of the many SLEPc options indicating option names, default values and descriptions. Usage:: $ python -m slepc4py [eps|svd|pep|nep|mfn|st|bv|rg|fn|ds] [] """ def help(args=None): import sys # program name try: prog = sys.argv[0] except Exception: prog = getattr(sys, 'executable', 'python') # arguments if args is None: args = sys.argv[1:] elif isinstance(args, str): args = args.split() else: args = [str(a) for a in args] # initialization import slepc4py slepc4py.init([prog, '-help'] + args) from slepc4py import SLEPc # and finally ... COMM = SLEPc.COMM_SELF if 'eps' in args: eps = SLEPc.EPS().create(comm=COMM) eps.setFromOptions() eps.destroy() del eps if 'svd' in args: svd = SLEPc.SVD().create(comm=COMM) svd.setFromOptions() svd.destroy() del svd if 'pep' in args: pep = SLEPc.PEP().create(comm=COMM) pep.setFromOptions() pep.destroy() del pep if 'nep' in args: nep = SLEPc.NEP().create(comm=COMM) nep.setFromOptions() nep.destroy() del nep if 'mfn' in args: mfn = SLEPc.MFN().create(comm=COMM) mfn.setFromOptions() mfn.destroy() del mfn if 'st' in args: st = SLEPc.ST().create(comm=COMM) st.setFromOptions() st.destroy() del st if 'bv' in args: bv = SLEPc.BV().create(comm=COMM) bv.setFromOptions() bv.destroy() del bv if 'rg' in args: rg = SLEPc.RG().create(comm=COMM) rg.setFromOptions() rg.destroy() del rg if 'fn' in args: fn = SLEPc.FN().create(comm=COMM) fn.setFromOptions() fn.destroy() del fn if 'ds' in args: ds = SLEPc.DS().create(comm=COMM) ds.setFromOptions() ds.destroy() del ds if __name__ == '__main__': help() slepc4py-3.19.2/src/slepc4py/include/000077500000000000000000000000001454104675500173415ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py/include/slepc4py/000077500000000000000000000000001454104675500211045ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py/include/slepc4py/slepc4py.h000066400000000000000000000004741454104675500230250ustar00rootroot00000000000000/* Author: Lisandro Dalcin */ /* Contact: dalcinl@gmail.com */ #ifndef SLEPC4PY_H #define SLEPC4PY_H #include #include #include "../../SLEPc_api.h" static int import_slepc4py(void) { if (import_slepc4py__SLEPc() < 0) goto bad; return 0; bad: return -1; } #endif /* !SLEPC4PY_H */ slepc4py-3.19.2/src/slepc4py/include/slepc4py/slepc4py.i000066400000000000000000000030241454104675500230200ustar00rootroot00000000000000/* Author: Lisandro Dalcin */ /* Contact: dalcinl@gmail.com */ /* ---------------------------------------------------------------- */ %include petsc4py/petsc4py.i /* ---------------------------------------------------------------- */ %header %{#include "slepc4py/slepc4py.h"%} %init %{import_slepc4py();%} %define SWIG_TYPECHECK_SLEPC_ST 650 %enddef %define SWIG_TYPECHECK_SLEPC_BV 651 %enddef %define SWIG_TYPECHECK_SLEPC_DS 652 %enddef %define SWIG_TYPECHECK_SLEPC_FN 653 %enddef %define SWIG_TYPECHECK_SLEPC_RG 654 %enddef %define SWIG_TYPECHECK_SLEPC_EPS 655 %enddef %define SWIG_TYPECHECK_SLEPC_SVD 656 %enddef %define SWIG_TYPECHECK_SLEPC_PEP 657 %enddef %define SWIG_TYPECHECK_SLEPC_NEP 658 %enddef %define SWIG_TYPECHECK_SLEPC_MFN 659 %enddef %define %slepc4py_objt(Pkg, PyType, Type, CODE) %petsc4py_objt(Pkg, PyType, Type, CODE) %enddef /* %slepc4py_objt */ /* ---------------------------------------------------------------- */ %slepc4py_objt( Slepc , ST , ST , SLEPC_ST ) %slepc4py_objt( Slepc , BV , BV , SLEPC_BV ) %slepc4py_objt( Slepc , DS , DS , SLEPC_DS ) %slepc4py_objt( Slepc , FN , FN , SLEPC_FN ) %slepc4py_objt( Slepc , RG , RG , SLEPC_RG ) %slepc4py_objt( Slepc , EPS , EPS , SLEPC_EPS ) %slepc4py_objt( Slepc , SVD , SVD , SLEPC_SVD ) %slepc4py_objt( Slepc , PEP , PEP , SLEPC_PEP ) %slepc4py_objt( Slepc , NEP , NEP , SLEPC_NEP ) %slepc4py_objt( Slepc , MFN , MFN , SLEPC_MFN ) /* ---------------------------------------------------------------- */ /* * Local Variables: * mode: C * End: */ slepc4py-3.19.2/src/slepc4py/lib/000077500000000000000000000000001454104675500164645ustar00rootroot00000000000000slepc4py-3.19.2/src/slepc4py/lib/__init__.py000066400000000000000000000032761454104675500206050ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com # ----------------------------------------------------------------------------- """ Extension modules for different SLEPc configurations. SLEPc can be configured with different options (eg. debug/optimized, single/double precisionm, C/C++ compilers, external packages). Each configuration variant is associated to a name, frequently available as an environmental variable named ``PETSC_ARCH``. This package is a holds all the available variants of the SLEPc extension module built against specific SLEPc configurations. It also provides a convenience function using of the builtin ``imp`` module for easily importing any of the available extension modules depending on the value of a user-provided configuration name, the ``PETSC_ARCH`` environmental variable, or a configuration file. """ # ----------------------------------------------------------------------------- from petsc4py.lib import ImportPETSc from petsc4py.lib import Import, getPathArch, getInitArgs # noqa: F401 def ImportSLEPc(arch=None): """ Import the SLEPc extension module for a given configuration name. """ path, arch = getPathArchSLEPc(arch) PETSc = ImportPETSc(arch) # noqa: F841 return Import('slepc4py', 'SLEPc', path, arch) def getPathArchSLEPc(arch=None): """ Undocumented. """ import os import sys PETSc = sys.modules.get('petsc4py.PETSc') arch = getattr(PETSc, '__arch__', arch) path = os.path.dirname(__file__) rcvar, rcfile = 'PETSC_ARCH', 'slepc.cfg' path, arch = getPathArch(path, arch, rcvar, rcfile) return (path, arch) # ----------------------------------------------------------------------------- slepc4py-3.19.2/src/slepc4py/lib/slepc.cfg000066400000000000000000000001221454104675500202460ustar00rootroot00000000000000SLEPC_DIR = %(SLEPC_DIR)s PETSC_DIR = %(PETSC_DIR)s PETSC_ARCH = %(PETSC_ARCH)s slepc4py-3.19.2/test/000077500000000000000000000000001454104675500143435ustar00rootroot00000000000000slepc4py-3.19.2/test/runtests.py000066400000000000000000000170661454104675500166160ustar00rootroot00000000000000# Author: Lisandro Dalcin # Contact: dalcinl@gmail.com import os import sys import optparse import unittest __unittest = True components = [ 'PETSc', 'SLEPc', ] def getoptionparser(): parser = optparse.OptionParser() parser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbose", default=1, help="do not print status messages to stdout") parser.add_option("-v", "--verbose", action="store_const", const=2, dest="verbose", default=1, help="print status messages to stdout") parser.add_option("-i", "--include", type="string", action="append", dest="include", default=[], help="include tests matching PATTERN", metavar="PATTERN") parser.add_option("-e", "--exclude", type="string", action="append", dest="exclude", default=[], help="exclude tests matching PATTERN", metavar="PATTERN") parser.add_option("-k", "--pattern", type="string", action="append", dest="patterns", default=[], help="only run tests which match the given substring") parser.add_option("-f", "--failfast", action="store_true", dest="failfast", default=False, help="Stop on first failure") parser.add_option("--no-builddir", action="store_false", dest="builddir", default=True, help="disable testing from build directory") parser.add_option("--path", type="string", action="append", dest="path", default=[], help="prepend PATH to sys.path", metavar="PATH") parser.add_option("--arch", type="string", action="store", dest="arch", default=None, help="use PETSC_ARCH", metavar="PETSC_ARCH") parser.add_option("-s","--summary", action="store_true", dest="summary", default=0, help="print PETSc log summary") parser.add_option("--no-memdebug", action="store_false", dest="memdebug", default=True, help="Do not use PETSc memory debugging") return parser def getbuilddir(): try: try: from setuptools.dist import Distribution except ImportError: from distutils.dist import Distribution try: from setuptools.command.build import build except ImportError: from distutils.command.build import build cmd_obj = build(Distribution()) cmd_obj.finalize_options() return cmd_obj.build_platlib except Exception: return None def getprocessorinfo(): try: name = os.uname()[1] except: import platform name = platform.uname()[1] from petsc4py.PETSc import COMM_WORLD rank = COMM_WORLD.getRank() return (rank, name) def getlibraryinfo(name): modname = "%s4py.%s" % (name.lower(), name) module = __import__(modname, fromlist=[name]) (major, minor, micro), devel = module.Sys.getVersion(devel=True) r = not devel if r: release = 'release' else: release = 'development' arch = module.__arch__ return ( "%s %d.%d.%d %s (conf: '%s')" % (name, major, minor, micro, release, arch) ) def getpythoninfo(): x, y, z = sys.version_info[:3] return ("Python %d.%d.%d (%s)" % (x, y, z, sys.executable)) def getpackageinfo(pkg): try: pkg = __import__(pkg) except ImportError: return None name = pkg.__name__ version = pkg.__version__ path = pkg.__path__[0] return ("%s %s (%s)" % (name, version, path)) def setup_python(options): rootdir = os.path.dirname(os.path.dirname(__file__)) builddir = os.path.join(rootdir, getbuilddir()) if options.builddir and os.path.exists(builddir): sys.path.insert(0, builddir) if options.path: path = options.path[:] path.reverse() for p in path: sys.path.insert(0, p) def setup_unittest(options): from unittest import TestSuite try: from unittest.runner import _WritelnDecorator except ImportError: from unittest import _WritelnDecorator # writeln_orig = _WritelnDecorator.writeln def writeln(self, message=''): try: self.stream.flush() except: pass writeln_orig(self, message) try: self.stream.flush() except: pass _WritelnDecorator.writeln = writeln def import_package(options, pkgname): args = [sys.argv[0]] if options.memdebug: args.append('-malloc') args.append('-malloc_debug') args.append('-malloc_dump') if options.summary: args.append('-log_view') package = __import__(pkgname) package.init(args, arch=options.arch) def print_banner(options): r, n = getprocessorinfo() prefix = "[%d@%s]" % (r, n) def writeln(message='', endl='\n'): if message is None: return from petsc4py.PETSc import Sys message = "%s %s" % (prefix, message) Sys.syncPrint(message, endl=endl, flush=True) if options.verbose: writeln(getpythoninfo()) writeln(getpackageinfo('numpy')) for entry in components: writeln(getlibraryinfo(entry)) writeln(getpackageinfo('%s4py' % entry.lower())) def load_tests(options, args): from glob import glob import re testsuitedir = os.path.dirname(__file__) sys.path.insert(0, testsuitedir) pattern = 'test_*.py' wildcard = os.path.join(testsuitedir, pattern) testfiles = glob(wildcard) testfiles.sort() testsuite = unittest.TestSuite() testloader = unittest.TestLoader() if options.patterns: testloader.testNamePatterns = [ ('*%s*' % p) if ('*' not in p) else p for p in options.patterns ] include = exclude = None if options.include: include = re.compile('|'.join(options.include)).search if options.exclude: exclude = re.compile('|'.join(options.exclude)).search for testfile in testfiles: filename = os.path.basename(testfile) testname = os.path.splitext(filename)[0] if ((exclude and exclude(testname)) or (include and not include(testname))): continue module = __import__(testname) for arg in args: try: cases = testloader.loadTestsFromNames((arg,), module) testsuite.addTests(cases) except AttributeError: pass if not args: cases = testloader.loadTestsFromModule(module) testsuite.addTests(cases) return testsuite def run_tests(options, testsuite, runner=None): if runner is None: runner = unittest.TextTestRunner(verbosity=options.verbose) runner.failfast = options.failfast result = runner.run(testsuite) return result.wasSuccessful() def abort(code=1): os.abort() def shutdown(success): pass def main(args=None): pkgname = '%s4py' % components[-1].lower() parser = getoptionparser() (options, args) = parser.parse_args(args) setup_python(options) setup_unittest(options) import_package(options, pkgname) print_banner(options) testsuite = load_tests(options, args) success = run_tests(options, testsuite) if not success and options.failfast: abort() shutdown(success) return not success if __name__ == '__main__': import sys sys.dont_write_bytecode = True sys.exit(main()) slepc4py-3.19.2/test/test_object.py000066400000000000000000000134451454104675500172310ustar00rootroot00000000000000from slepc4py import SLEPc from petsc4py import PETSc import unittest # -------------------------------------------------------------------- class BaseTestObject(object): CLASS, FACTORY = None, 'create' TARGS, KARGS = (), {} BUILD = None def setUp(self): self.obj = self.CLASS() getattr(self.obj,self.FACTORY)(*self.TARGS, **self.KARGS) if not self.obj: self.obj.create() def tearDown(self): self.obj = None def testTypeRegistry(self): type_reg = PETSc.__type_registry__ classid = self.obj.getClassId() typeobj = self.CLASS if isinstance(self.obj, PETSc.DMDA): typeobj = PETSc.DM self.assertTrue(type_reg[classid] is typeobj ) def testLogClass(self): name = self.CLASS.__name__ logcls = PETSc.Log.Class(name) classid = self.obj.getClassId() self.assertEqual(logcls.id, classid) def testClass(self): self.assertTrue(isinstance(self.obj, self.CLASS)) self.assertTrue(type(self.obj) is self.CLASS) def testNonZero(self): self.assertTrue(bool(self.obj)) def testDestroy(self): self.assertTrue(bool(self.obj)) self.obj.destroy() self.assertFalse(bool(self.obj)) ## self.assertRaises(PETSc.Error, self.obj.destroy) ## self.assertTrue(self.obj.this is this) def testOptions(self): self.assertFalse(self.obj.getOptionsPrefix()) prefix1 = 'my_' self.obj.setOptionsPrefix(prefix1) self.assertEqual(self.obj.getOptionsPrefix(), prefix1) prefix2 = 'opt_' self.obj.setOptionsPrefix(prefix2) self.assertEqual(self.obj.getOptionsPrefix(), prefix2) ## self.obj.appendOptionsPrefix(prefix1) ## self.assertEqual(self.obj.getOptionsPrefix(), ## prefix2 + prefix1) ## self.obj.prependOptionsPrefix(prefix1) ## self.assertEqual(self.obj.getOptionsPrefix(), ## prefix1 + prefix2 + prefix1) self.obj.setFromOptions() def testName(self): oldname = self.obj.getName() newname = '%s-%s' %(oldname, oldname) self.obj.setName(newname) self.assertEqual(self.obj.getName(), newname) self.obj.setName(oldname) self.assertEqual(self.obj.getName(), oldname) def testComm(self): comm = self.obj.getComm() self.assertTrue(isinstance(comm, PETSc.Comm)) self.assertTrue(comm in [PETSc.COMM_SELF, PETSc.COMM_WORLD]) def testRefCount(self): self.assertEqual(self.obj.getRefCount(), 1) self.obj.incRef() self.assertEqual(self.obj.getRefCount(), 2) self.obj.incRef() self.assertEqual(self.obj.getRefCount(), 3) self.obj.decRef() self.assertEqual(self.obj.getRefCount(), 2) self.obj.decRef() self.assertEqual(self.obj.getRefCount(), 1) self.obj.decRef() self.assertFalse(bool(self.obj)) def testHandle(self): self.assertTrue(self.obj.handle) self.assertTrue(self.obj.fortran) h, f = self.obj.handle, self.obj.fortran if (h>0 and f>0) or (h<0 and f<0): self.assertEqual(h, f) self.obj.destroy() self.assertFalse(self.obj.handle) self.assertFalse(self.obj.fortran) def testComposeQuery(self): myobj = type(self.obj)().create() self.assertEqual(myobj.getRefCount(), 1) self.obj.compose('myobj', myobj) self.assertTrue(type(self.obj.query('myobj')) is self.CLASS) self.assertEqual(self.obj.query('myobj'), myobj) self.assertEqual(myobj.getRefCount(), 2) self.obj.compose('myobj', None) self.assertEqual(myobj.getRefCount(), 1) self.assertEqual(self.obj.query('myobj'), None) myobj.destroy() def testProperties(self): self.assertEqual(self.obj.getClassId(), self.obj.classid) self.assertEqual(self.obj.getClassName(), self.obj.klass) self.assertEqual(self.obj.getType(), self.obj.type) self.assertEqual(self.obj.getName(), self.obj.name) self.assertEqual(self.obj.getComm(), self.obj.comm) self.assertEqual(self.obj.getRefCount(), self.obj.refcount) def testShallowCopy(self): import copy rc = self.obj.getRefCount() obj = copy.copy(self.obj) self.assertTrue(obj is not self.obj) self.assertTrue(obj == self.obj) self.assertTrue(type(obj) is type(self.obj)) self.assertEqual(obj.getRefCount(), rc+1) del obj self.assertEqual(self.obj.getRefCount(), rc) def testDeepCopy(self): self.obj.setFromOptions() import copy rc = self.obj.getRefCount() try: obj = copy.deepcopy(self.obj) except NotImplementedError: return self.assertTrue(obj is not self.obj) self.assertTrue(obj != self.obj) self.assertTrue(type(obj) is type(self.obj)) self.assertEqual(self.obj.getRefCount(), rc) self.assertEqual(obj.getRefCount(), 1) del obj # -------------------------------------------------------------------- class TestObjectST(BaseTestObject, unittest.TestCase): CLASS = SLEPc.ST class TestObjectBV(BaseTestObject, unittest.TestCase): CLASS = SLEPc.BV def testDeepCopy(self): pass class TestObjectEPS(BaseTestObject, unittest.TestCase): CLASS = SLEPc.EPS class TestObjectSVD(BaseTestObject, unittest.TestCase): CLASS = SLEPc.SVD class TestObjectPEP(BaseTestObject, unittest.TestCase): CLASS = SLEPc.PEP class TestObjectNEP(BaseTestObject, unittest.TestCase): CLASS = SLEPc.NEP class TestObjectMFN(BaseTestObject, unittest.TestCase): CLASS = SLEPc.MFN # -------------------------------------------------------------------- if __name__ == '__main__': unittest.main()