def _create_block_tensor(comm, block_form, rank, block_tensor):
    backend = BlockDefaultFactory()
    block_tensor = _dolfin_create_tensor(comm, block_form, rank, backend, block_tensor)
    block_tensor = as_backend_type(block_tensor)

    # Attach block dofmap to tensor
    assert rank in (1, 2)
    if rank == 2:
        block_dofmap_0 = block_form.block_function_spaces()[0].block_dofmap()
        block_dofmap_1 = block_form.block_function_spaces()[1].block_dofmap()
        assert block_tensor.has_block_dof_map(0) == block_tensor.has_block_dof_map(1)
        if not block_tensor.has_block_dof_map(0):
            block_tensor.attach_block_dof_map(block_dofmap_0, block_dofmap_1)
        else:
            assert block_dofmap_0 == block_tensor.get_block_dof_map(0)
            assert block_dofmap_1 == block_tensor.get_block_dof_map(1)
    elif rank == 1:
        block_dofmap = block_form.block_function_spaces()[0].block_dofmap()
        if not block_tensor.has_block_dof_map():
            block_tensor.attach_block_dof_map(block_dofmap)
        else:
            assert block_dofmap == block_tensor.get_block_dof_map()

    # Store private attribute for BlockDirichletBC application to off diagonal blocks
    if rank == 2:
        bcs_zero_off_block_diagonal = empty(block_form.shape, dtype=bool)
        for I in range(block_form.shape[0]):
            for J in range(block_form.shape[1]):
                bcs_zero_off_block_diagonal[I, J] = not _is_zero(block_form[I, J])
        block_tensor._bcs_zero_off_block_diagonal = bcs_zero_off_block_diagonal.tolist()

    return block_tensor
示例#2
0
def _create_block_tensor(comm, block_form, rank, block_tensor):
    backend = BlockDefaultFactory()
    block_tensor = _dolfin_create_tensor(comm, block_form, rank, backend,
                                         block_tensor)
    block_tensor = as_backend_type(block_tensor)

    # Attach block dofmap to tensor
    assert rank in (1, 2)
    if rank is 2:
        block_dofmap_0 = block_form.block_function_spaces()[0].block_dofmap()
        block_dofmap_1 = block_form.block_function_spaces()[1].block_dofmap()
        assert block_tensor.has_block_dof_map(
            0) == block_tensor.has_block_dof_map(1)
        if not block_tensor.has_block_dof_map(0):
            block_tensor.attach_block_dof_map(block_dofmap_0, block_dofmap_1)
        else:
            assert block_dofmap_0 == block_tensor.get_block_dof_map(0)
            assert block_dofmap_1 == block_tensor.get_block_dof_map(1)
    elif rank is 1:
        block_dofmap = block_form.block_function_spaces()[0].block_dofmap()
        if not block_tensor.has_block_dof_map():
            block_tensor.attach_block_dof_map(block_dofmap)
        else:
            assert block_dofmap == block_tensor.get_block_dof_map()

    return block_tensor