def build_broken_elastic_nullspace(V): """Function to build incorrect null space for 2D elasticity""" # Create list of vectors for null space nullspace_basis = [ cpp.la.create_vector(V.dofmap.index_map, V.dofmap.index_map_bs) for i in range(4) ] with ExitStack() as stack: vec_local = [ stack.enter_context(x.localForm()) for x in nullspace_basis ] basis = [np.asarray(x) for x in vec_local] dofs = [V.sub(i).dofmap.list.array for i in range(2)] basis[0][dofs[0]] = 1.0 basis[1][dofs[1]] = 1.0 # Build rotational null space basis x = V.tabulate_dof_coordinates() dofs_block = V.dofmap.list.array x0, x1 = x[dofs_block, 0], x[dofs_block, 1] basis[2][dofs[0]] = -x1 basis[2][dofs[1]] = x0 # Add vector that is not in nullspace basis[3][dofs[1]] = x1 return la.VectorSpaceBasis(nullspace_basis)
def build_broken_elastic_nullspace(V): """Function to build incorrect null space for 2D elasticity""" # Create list of vectors for null space nullspace_basis = [ cpp.la.create_vector(V.dofmap.index_map) for i in range(4) ] with ExitStack() as stack: vec_local = [ stack.enter_context(x.localForm()) for x in nullspace_basis ] basis = [np.asarray(x) for x in vec_local] # Build translational null space basis V.sub(0).dofmap.set(basis[0], 1.0) V.sub(1).dofmap.set(basis[1], 1.0) # Build rotational null space basis V.sub(0).set_x(basis[2], -1.0, 1) V.sub(1).set_x(basis[2], 1.0, 0) # Add vector that is not in nullspace V.sub(1).set_x(basis[3], 1.0, 1) return la.VectorSpaceBasis(nullspace_basis)
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 = [ cpp.la.create_vector(V.dofmap.index_map, V.dofmap.index_map_bs) for i in range(dim) ] with ExitStack() as stack: vec_local = [ stack.enter_context(x.localForm()) for x in nullspace_basis ] basis = [np.asarray(x) for x in vec_local] dofs = [V.sub(i).dofmap.list.array for i in range(gdim)] # Build translational null space basis for i in range(gdim): basis[i][dofs[i]] = 1.0 # Build rotational null space basis x = V.tabulate_dof_coordinates() dofs_block = V.dofmap.list.array x0, x1, x2 = x[dofs_block, 0], x[dofs_block, 1], x[dofs_block, 2] if gdim == 2: basis[2][dofs[0]] = -x1 basis[2][dofs[1]] = x0 elif gdim == 3: basis[3][dofs[0]] = -x1 basis[3][dofs[1]] = x0 basis[4][dofs[0]] = x2 basis[4][dofs[2]] = -x0 basis[5][dofs[2]] = x1 basis[5][dofs[1]] = -x2 return la.VectorSpaceBasis(nullspace_basis)
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 = [ cpp.la.create_vector(V.dofmap.index_map) for i in range(dim) ] with ExitStack() as stack: vec_local = [ stack.enter_context(x.localForm()) for x in nullspace_basis ] basis = [np.asarray(x) for x in vec_local] # Build translational null space basis for i in range(gdim): V.sub(i).dofmap.set(basis[i], 1.0) # Build rotational null space basis if gdim == 2: V.sub(0).set_x(basis[2], -1.0, 1) V.sub(1).set_x(basis[2], 1.0, 0) elif gdim == 3: V.sub(0).set_x(basis[3], -1.0, 1) V.sub(1).set_x(basis[3], 1.0, 0) V.sub(0).set_x(basis[4], 1.0, 2) V.sub(2).set_x(basis[4], -1.0, 0) V.sub(2).set_x(basis[5], 1.0, 1) V.sub(1).set_x(basis[5], -1.0, 2) return la.VectorSpaceBasis(nullspace_basis)