Exemplo n.º 1
0
def build_broken_elastic_nullspace(V):
    """Function to build incorrect null space for 2D elasticity"""

    # Create list of vectors for null space
    nullspace_basis = [
        la.PETScVector(V.dofmap().index_map()) for i in range(4)
    ]

    # Build translational null space basis
    V.sub(0).dofmap().set(nullspace_basis[0], 1.0)
    V.sub(1).dofmap().set(nullspace_basis[1], 1.0)

    # Build rotational null space basis
    V.sub(0).set_x(nullspace_basis[2], -1.0, 1)
    V.sub(1).set_x(nullspace_basis[2], 1.0, 0)

    # Add vector that is not in nullspace
    V.sub(1).set_x(nullspace_basis[3], 1.0, 1)

    for x in nullspace_basis:
        x.apply()

    return la.VectorSpaceBasis(nullspace_basis)
Exemplo n.º 2
0
def build_elastic_nullspace(V):
    """Function to build nullspace for 2D/3D elasticity"""

    # Get geometric dim
    gdim = V.mesh().geometry.dim
    assert gdim == 2 or gdim == 3

    # Set dimension of nullspace
    dim = 3 if gdim == 2 else 6

    # Create list of vectors for null space
    nullspace_basis = [
        la.PETScVector(V.dofmap().index_map()) for i in range(dim)
    ]

    # Build translational null space basis
    for i in range(gdim):
        V.sub(i).dofmap().set(nullspace_basis[i], 1.0)

    # Build rotational null space basis
    if gdim == 2:
        V.sub(0).set_x(nullspace_basis[2], -1.0, 1)
        V.sub(1).set_x(nullspace_basis[2], 1.0, 0)
    elif gdim == 3:
        V.sub(0).set_x(nullspace_basis[3], -1.0, 1)
        V.sub(1).set_x(nullspace_basis[3], 1.0, 0)

        V.sub(0).set_x(nullspace_basis[4], 1.0, 2)
        V.sub(2).set_x(nullspace_basis[4], -1.0, 0)

        V.sub(2).set_x(nullspace_basis[5], 1.0, 1)
        V.sub(1).set_x(nullspace_basis[5], -1.0, 2)

    for x in nullspace_basis:
        x.apply()

    return la.VectorSpaceBasis(nullspace_basis)