def get_wave_operator_with_space_preprocessing( op_fun, domain, range_, dual_to_range, wave_number, label, symmetry, parameters, use_projection_spaces=True, assemble_only_singular_part=False): """Preprocess a wave operator.""" import bempp.api from bempp.api.space import rewrite_operator_spaces from bempp.api.space import project_operator if parameters is None: parameters = bempp.api.global_parameters if check_for_non_barycentric_spaces(domain, dual_to_range): return rewrite_operator_spaces( get_wave_operator_with_space_preprocessing( op_fun, domain.non_barycentric_space, range_, dual_to_range.non_barycentric_space, wave_number, label, symmetry, parameters, use_projection_spaces, assemble_only_singular_part), domain, range_, dual_to_range) if not use_projection_spaces: return op_fun( domain, range_, dual_to_range, wave_number, label, symmetry, parameters, assemble_only_singular_part) else: op = op_fun( domain.super_space, range_, dual_to_range.super_space, wave_number, label, symmetry, parameters, assemble_only_singular_part) return project_operator( op, domain=domain, range_=range_, dual_to_range=dual_to_range)
def magnetic_field(domain, range_, dual_to_range, wave_number, label="MFIE", symmetry='no_symmetry', parameters=None, use_projection_spaces=True, assemble_only_singular_part=False): """Return the Maxwell magnetic field boundary operator. Parameters ---------- domain : bempp.api.space.Space Domain space. range_ : bempp.api.space.Space Range space. dual_to_range : bempp.api.space.Space Dual space to the range space. wave_number : complex Wavenumber for the Helmholtz problem. label : string Label for the operator. symmetry : string Symmetry mode. Possible values are: 'no_symmetry', 'symmetric', 'hermitian'. parameters : bempp.api.common.ParameterList Parameters for the operator. If none given the default global parameter object `bempp.api.global_parameters` is used. use_projection_spaces : bool Represent operator by projection from higher dimensional space if available. This parameter can speed up fast assembly routines, such as H-Matrices or FMM (default true). assemble_only_singular_part : bool When assembled the operator will only contain components for adjacent or overlapping test and trial functions (default false). """ from bempp.api.operators.boundary._common import \ get_wave_operator_with_space_preprocessing from bempp.api.space import rewrite_operator_spaces try: #pylint: disable=protected-access hdiv_dual_to_range = dual_to_range._hdiv_space except: raise ValueError( "The dual space must be a valid Nedelec curl-conforming space.") return rewrite_operator_spaces( get_wave_operator_with_space_preprocessing( _magnetic_field_impl, domain, range_, hdiv_dual_to_range, wave_number, label, symmetry, parameters, use_projection_spaces, assemble_only_singular_part), domain, range_, dual_to_range)
def get_operator_with_space_preprocessing(op_fun, domain, range_, dual_to_range, label, symmetry, parameters, use_projection_spaces=True, assemble_only_singular_part=False): """Assemble operator after preprocessing of spaces.""" import bempp.api from bempp.api.space import rewrite_operator_spaces from bempp.api.space import project_operator if parameters is None: parameters = bempp.api.global_parameters if parameters.assembly.boundary_operator_assembly_type == 'dense': from bempp.api import log use_projection_spaces = False log("Projection space mode disabled for dense assembly.") if check_for_non_barycentric_spaces(domain, dual_to_range): return rewrite_operator_spaces( get_operator_with_space_preprocessing( op_fun, domain.non_barycentric_space, range_, dual_to_range.non_barycentric_space, label, symmetry, parameters, use_projection_spaces, assemble_only_singular_part), domain, range_, dual_to_range) if not use_projection_spaces: return op_fun(domain, range_, dual_to_range, label, symmetry, parameters, assemble_only_singular_part) else: operator = op_fun(domain.super_space, range_, dual_to_range.super_space, label, symmetry, parameters, assemble_only_singular_part) return project_operator(operator, domain=domain, range_=range_, dual_to_range=dual_to_range)