Example #1
0
def test_slepc(backends):
  """Check for petsc + slepc."""
  from dolfin import has_linear_algebra_backend, has_slepc
  if has_linear_algebra_backend("PETSc") and has_slepc():
    backends.append("petsc")
  else:
    print "Petsc + slepc not found."
Example #2
0
import re

try:
    from dolfin import __version__ as dolfin_version
    from dolfin import has_linear_algebra_backend, has_slepc
except ImportError:
    raise
else:
    fenics_version_major = int(dolfin_version[0:4])
    if (fenics_version_major < 2016 or fenics_version_major >= 2018):
        raise Exception(
            'hIPPYlib requires FEniCS versions 2016.x.x or 2017.x.x')
    if not has_linear_algebra_backend("PETSc"):
        raise Exception(
            'hIPPYlib requires FEniCS to be installed with PETSc support')
    if not has_slepc():
        raise Exception(
            'hIPPYlib requires FEniCS to be installed with SLEPc support')

here = path.abspath(path.dirname(__file__))
with open(path.join(here, 'README.md'), encoding='utf-8') as f:
    long_description = f.read()

version = {}
with open(path.join(here, 'hippylib/version.py')) as f:
    exec(f.read(), version)

VERSION = version['__version__']

REQUIREMENTS = ['mpi4py', 'numpy', 'matplotlib', 'scipy']
Example #3
0
import numpy as np
from spuq.utils.testing import *


try:
    import dolfin
    from dolfin import (UnitSquare, FunctionSpace, Expression, interpolate, dx,
                        inner, nabla_grad, TrialFunction, TestFunction,
                        assemble, Constant, DirichletBC, Mesh, PETScMatrix,
                        SLEPcEigenSolver, Function, solve)
    from spuq.fem.fenics.fenics_basis import FEniCSBasis
    from spuq.fem.fenics.fenics_vector import FEniCSVector
    from spuq.fem.fenics.fenics_operator import FEniCSOperator, FEniCSSolveOperator
    HAVE_FENICS = True
    # Test for PETSc and SLEPc
    HAVE_SLEPC = dolfin.has_linear_algebra_backend("PETSc") and dolfin.has_slepc()
    TestFunction = no_test(TestFunction)
except:
    HAVE_FENICS = False


def homogeneous_bc(V):
    # define boundary conditions
    def u0_boundary(x, on_boundary):
        return on_boundary
    u0 = Constant(0.0)
    bc = DirichletBC(V, u0, u0_boundary)
    return bc

def assemble_lhs(coeff, V):
    """Assemble the discrete problem (i.e. the stiffness matrix)."""
Example #4
0
def eigen_xct(V, A, B=None, k=100, spect='LM', **kwargs):
    """
    Get eigen-pairs of A (or generalized eigen-pairs for (A,B)) for the first k in the spectrum spect.
    """
    if 'mpi_comm' in kwargs:
        mpi_comm = kwargs['mpi_comm']
    else:
        mpi_comm = df.mpi_comm_world()
    # mixed functions to store eigenfunctions
    try:
        M = df.FunctionSpace(V.mesh(), df.MixedElement([V.ufl_element()] * k))
    except:
        print('Warning: '
              'MixedFunctionSpace'
              ' has been deprecated after DOLFIN version 1.6.0.')
        M = df.MixedFunctionSpace([V] * k)
    # Extract subfunction dofs
    eigf_dofs = [M.sub(i).dofmap().dofs() for i in range(k)]
    eigf = df.Function(M)
    # try reading eigen-pairs from file
    eig_files = [
        f for f in os.listdir(os.getcwd())
        if f.startswith('prior_' + spect + 'eig')
    ]
    found_eigv = False
    found_eigf = False
    if any(eig_files):
        for f_i in eig_files:
            if int(f_i.split("_k")[-1].split(".")[0]) >= k:
                if f_i.endswith('.txt'):
                    try:
                        eigv_ = np.loadtxt(os.path.join(os.getcwd(), f_i),
                                           delimiter=',')
                        eigv = eigv_[:k]
                        found_eigv = True
                    except:
                        pass
                if f_i.endswith('.h5'):
                    try:
                        f = df.HDF5File(mpi_comm,
                                        os.path.join(os.getcwd(), f_i), "r")
                        eigf_i = df.Function(V, name='eigenfunction')
                        for i, dof_i in enumerate(eigf_dofs):
                            f.read(eigf_i, 'eigf_{0}'.format(i))
                            eigf.vector()[dof_i] = eigf_i.vector()
                        f.close()
                        found_eigf = True
                    except:
                        f.close()
                        pass
                if found_eigv and found_eigf:
                    break
    if found_eigv and found_eigf:
        print('Read the first %d eigen-pairs with ' % k + {
            'LM': 'largest magnitude',
            'SM': 'smallest magnitude'
        }[spect] + ' successfully!')
        return (eigv, eigf), eigf_dofs
    else:
        # solve the associated eigen-problem
        f = df.HDF5File(
            mpi_comm,
            os.path.join(os.getcwd(),
                         'prior_' + spect + 'eigf_k' + str(k) + '.h5'), "w")
        eigf_i = df.Function(V, name='eigenfunction')
        if type(A) is df.PETScMatrix and df.has_slepc():
            # using SLEPc
            print("Computing the first %d eigenvalues with " % k + {
                'LM': 'largest magnitude',
                'SM': 'smallest magnitude'
            }[spect] + "...")
            # Create eigen-solver
            if B is not None and type(B) is df.PETScMatrix:
                eigen = df.SLEPcEigenSolver(A, B)
                eigen.parameters['problem_type'] = 'gen_hermitian'
            else:
                eigen = df.SLEPcEigenSolver(A)


#                 eigen.parameters['problem_type']='hermitian'
            eigen.parameters['spectrum'] = {
                'LM': 'largest magnitude',
                'SM': 'smallest magnitude'
            }[spect]
            if spect is 'SM':
                eigen.parameters['tolerance'] = 1e-10
                eigen.parameters['maximum_iterations'] = 100
                eigen.parameters['spectral_transform'] = 'shift-and-invert'
                eigen.parameters['spectral_shift'] = 10.0 * df.DOLFIN_EPS
            eigen.solve(k)
            print(
                'Total number of iterations: %d, and total number of convergences: %d.'
                % (eigen.get_iteration_number(), eigen.get_number_converged()))
            # get eigen-pairs
            eigv = np.zeros(k)
            for i, dof_i in enumerate(eigf_dofs):
                eigv[i], _, eigf_vec_i, _ = eigen.get_eigenpair(i)
                eigf_i.vector()[:] = eigf_vec_i[:]
                f.write(eigf_i, 'eigf_{0}'.format(i))
                eigf.vector()[dof_i] = eigf_i.vector()
        else:
            warnings.warn(
                'petsc4py or SLEPc not found! Using scipy.sparse.linalg.eigsh...'
            )
            import scipy.sparse.linalg as spsla
            eigv, eigf_vec = spsla.eigsh(A, k=k, M=B, which=spect)
            dsc_ord = eigv.argsort()[::-1]
            eigv = eigv[dsc_ord]
            eigf_vec = eigf_vec[:, dsc_ord]
            for i, dof_i in enumerate(eigf_dofs):
                eigf_i.vector()[:] = eigf_vec[:, i]
                f.write(eigf_i, 'eigf_{0}'.format(i))
                eigf.vector()[dof_i] = eigf_i.vector()
        f.close()
        np.savetxt(os.path.join(os.getcwd(),
                                'prior_' + spect + 'eigv_k' + str(k) + '.txt'),
                   eigv,
                   delimiter=',')
        return (eigv, eigf), eigf_dofs
Example #5
0
#
# RBniCS is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with RBniCS. If not, see <http://www.gnu.org/licenses/>.
#

# Check that dolfin has been compiled with PETSc and SLEPc
from dolfin import has_petsc, has_linear_algebra_backend, parameters, has_slepc
assert has_petsc()
assert has_linear_algebra_backend("PETSc")
assert parameters["linear_algebra_backend"] == "PETSc"
assert has_slepc()

# Import modules
from rbnics.backends.dolfin.abs import abs
from rbnics.backends.dolfin.affine_expansion_storage import AffineExpansionStorage
from rbnics.backends.dolfin.assign import assign
from rbnics.backends.dolfin.basis_functions_matrix import BasisFunctionsMatrix
from rbnics.backends.dolfin.copy import copy
from rbnics.backends.dolfin.eigen_solver import EigenSolver
from rbnics.backends.dolfin.evaluate import evaluate
from rbnics.backends.dolfin.export import export
from rbnics.backends.dolfin.function import Function
from rbnics.backends.dolfin.functions_list import FunctionsList
from rbnics.backends.dolfin.gram_schmidt import GramSchmidt
from rbnics.backends.dolfin.high_order_proper_orthogonal_decomposition import HighOrderProperOrthogonalDecomposition
from rbnics.backends.dolfin.import_ import import_
Example #6
0
## You should have received a copy of the GNU General Public License
## along with SUCEM. If not, see <http://www.gnu.org/licenses/>.
##
## Contact: [email protected]
# Authors:
# Neilen Marais <*****@*****.**>
import dolfin as dol
from dolfin import dot, curl, inner, dx
from scipy.sparse.linalg.eigen.arpack import speigs

# Test for PETSc and SLEPc
if not dol.has_la_backend("PETSc"):
    print "DOLFIN has not been configured with PETSc. Exiting."
    exit()

if not dol.has_slepc():
    print "DOLFIN has not been configured with SLEPc. Exiting."
    exit()


class CavityDims(object):
    pass


cdims = CavityDims()
cdims.a, cdims.b, cdims.c = 29, 23, 19

# Define mesh, function space
mesh = dol.UnitCube(1, 1, 1)
mesh.coordinates()[:] *= [cdims.a, cdims.b, cdims.c]
V = dol.FunctionSpace(mesh, "Nedelec 1st kind H(curl)", 4)
Example #7
0
import os
import dolfin as dol
from dolfin import dot, curl, inner, dx
from scipy.sparse.linalg.eigen.arpack import speigs

from sucemfem.Consts import eps0, mu0, c0

import postproc_eigres
from material_properties import MaterialProperties

# Test for PETSc and SLEPc
if not dol.has_la_backend("PETSc"):
    print "DOLFIN has not been configured with PETSc. Exiting."
    exit()

if not dol.has_slepc():
    print "DOLFIN has not been configured with SLEPc. Exiting."
    exit()

# class CavityDims(object): pass
# cdims = CavityDims()
# cdims.a, cdims.b, cdims.c = 29,23,19


# Define mesh
# mesh = dol.UnitCube(1,1,1)
# mesh.coordinates()[:] *= [cdims.a,cdims.b,cdims.c]
#mesh_file = 'lee_mittra92_fig6b.xml'
#mesh_file = 'lee_mittra92_fig6c.xml'
mesh_file = '../examples/albani_bernardi74/mesh/albani_bernardi74_fig2VII.xml'
materials_mesh_file = "%s_physical_region%s" % (os.path.splitext(mesh_file))