(grid, spacing=None, E=1e5, nu=0.3, dirichlet_boundary=True,
         format=None)
return A.asformat(format), B
Q1 elements in 2 dimensions.

    See Also
    --------
    linear_elasticity
Q1 elements in 2 dimensions.
Q1 elements in 2 dimensions .
def q12d(grid, spacing=None, E=1e5, nu=0.3, dirichlet_boundary=True,
         format=None):
    """Q1 elements in 2 dimensions.

    See Also
    --------
    linear_elasticity

    """
    X, Y = tuple(grid)

    if X < 1 or Y < 1:
        raise ValueError('invalid grid shape')

    if dirichlet_boundary:
        X += 1
        Y += 1

    pts = np.mgrid[0:X+1, 0:Y+1]
    pts = np.hstack((pts[0].T.reshape(-1, 1) - X / 2.0,
                     pts[1].T.reshape(-1, 1) - Y / 2.0))

    if spacing is None:
        DX, DY = 1, 1
    else:
        DX, DY = tuple(spacing)
        pts *= [DX, DY]

    # compute local stiffness matrix
    lame = E * nu / ((1 + nu) * (1 - 2 * nu))  # Lame's first parameter
    mu = E / (2 + 2 * nu)                   # shear modulus

    vertices = np.array([[0, 0], [DX, 0], [DX, DY], [0, DY]])
    K = q12d_local(vertices, lame, mu)

    nodes = np.arange((X+1)*(Y+1)).reshape(X+1, Y+1)
    LL = nodes[:-1, :-1]
    Id = (2*LL).repeat(K.size).reshape(-1, 8, 8)
    J = Id.copy()
    Id += np.tile([0, 1, 2, 3, 2*X + 4, 2*X + 5, 2*X + 2, 2*X + 3], (8, 1))
    J += np.tile([0, 1, 2, 3, 2*X + 4, 2*X + 5, 2*X + 2, 2*X + 3], (8, 1)).T
    V = np.tile(K, (X*Y, 1))

    Id = np.ravel(Id)
    J = np.ravel(J)
    V = np.ravel(V)

    # sum duplicates
    A = sparse.coo_matrix((V, (Id, J)), shape=(pts.size, pts.size)).tocsr()
    A = A.tobsr(blocksize=(2, 2))

    del Id, J, V, LL, nodes

    B = np.zeros((2 * (X+1)*(Y+1), 3))
    B[0::2, 0] = 1
    B[1::2, 1] = 1
    B[0::2, 2] = -pts[:, 1]
    B[1::2, 2] = pts[:, 0]

    if dirichlet_boundary:
        mask = np.zeros((X+1, Y+1), dtype='bool')
        mask[1:-1, 1:-1] = True
        mask = np.ravel(mask)
        data = np.zeros(((X-1)*(Y-1), 2, 2))
        data[:, 0, 0] = 1
        data[:, 1, 1] = 1
        indices = np.arange((X-1)*(Y-1))
        indptr = np.concatenate((np.array([0]), np.cumsum(mask)))
        P = sparse.bsr_matrix((data, indices, indptr),
                              shape=(2*(X+1)*(Y+1), 2*(X-1)*(Y-1)))
        Pt = P.T
        A = P.T * A * P

        B = Pt * B

    return A.asformat(format), B
def q12d ( grid , spacing = None , E = 1e5 , nu = 0.3 , dirichlet_boundary = True , format = None ) : X , Y = tuple ( grid ) if X < 1 or Y < 1 : raise ValueError ( 'invalid grid shape' ) if dirichlet_boundary : X += 1 Y += 1 pts = np . mgrid [ 0 : X + 1 , 0 : Y + 1 ] pts = np . hstack ( ( pts [ 0 ] . T . reshape ( - 1 , 1 ) - X / 2.0 , pts [ 1 ] . T . reshape ( - 1 , 1 ) - Y / 2.0 ) ) if spacing is None : DX , DY = 1 , 1 else : DX , DY = tuple ( spacing ) pts *= [ DX , DY ] # compute local stiffness matrix lame = E * nu / ( ( 1 + nu ) * ( 1 - 2 * nu ) ) # Lame's first parameter mu = E / ( 2 + 2 * nu ) # shear modulus vertices = np . array ( [ [ 0 , 0 ] , [ DX , 0 ] , [ DX , DY ] , [ 0 , DY ] ] ) K = q12d_local ( vertices , lame , mu ) nodes = np . arange ( ( X + 1 ) * ( Y + 1 ) ) . reshape ( X + 1 , Y + 1 ) LL = nodes [ : - 1 , : - 1 ] Id = ( 2 * LL ) . repeat ( K . size ) . reshape ( - 1 , 8 , 8 ) J = Id . copy ( ) Id += np . tile ( [ 0 , 1 , 2 , 3 , 2 * X + 4 , 2 * X + 5 , 2 * X + 2 , 2 * X + 3 ] , ( 8 , 1 ) ) J += np . tile ( [ 0 , 1 , 2 , 3 , 2 * X + 4 , 2 * X + 5 , 2 * X + 2 , 2 * X + 3 ] , ( 8 , 1 ) ) . T V = np . tile ( K , ( X * Y , 1 ) ) Id = np . ravel ( Id ) J = np . ravel ( J ) V = np . ravel ( V ) # sum duplicates A = sparse . coo_matrix ( ( V , ( Id , J ) ) , shape = ( pts . size , pts . size ) ) . tocsr ( ) A = A . tobsr ( blocksize = ( 2 , 2 ) ) del Id , J , V , LL , nodes B = np . zeros ( ( 2 * ( X + 1 ) * ( Y + 1 ) , 3 ) ) B [ 0 : : 2 , 0 ] = 1 B [ 1 : : 2 , 1 ] = 1 B [ 0 : : 2 , 2 ] = - pts [ : , 1 ] B [ 1 : : 2 , 2 ] = pts [ : , 0 ] if dirichlet_boundary : mask = np . zeros ( ( X + 1 , Y + 1 ) , dtype = 'bool' ) mask [ 1 : - 1 , 1 : - 1 ] = True mask = np . ravel ( mask ) data = np . zeros ( ( ( X - 1 ) * ( Y - 1 ) , 2 , 2 ) ) data [ : , 0 , 0 ] = 1 data [ : , 1 , 1 ] = 1 indices = np . arange ( ( X - 1 ) * ( Y - 1 ) ) indptr = np . concatenate ( ( np . array ( [ 0 ] ) , np . cumsum ( mask ) ) ) P = sparse . bsr_matrix ( ( data , indices , indptr ) , shape = ( 2 * ( X + 1 ) * ( Y + 1 ) , 2 * ( X - 1 ) * ( Y - 1 ) ) ) Pt = P . T A = P . T * A * P B = Pt * B return A . asformat ( format ) , B