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."
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']
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)."""
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
# # 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_
## 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)
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))