Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)