
    _-Ph3&                     X    d Z ddlZddlmZ ddlmZ ddZ	 	 ddZ	d	 Z
dd
Zd Zd ZdS )zLConstructs linear elasticity problems for first-order elements in 2D and 3D.    N)sparse     j@333333?c                 t    t          |           dk    rt          | ||||          S t          d|            )a  Linear elasticity problem with Q1 finite elements on a regular rectangular grid.

    Parameters
    ----------
    grid : tuple
        length 2 tuple of grid sizes, e.g. (10, 10)
    spacing : tuple
        length 2 tuple of grid spacings, e.g. (1.0, 0.1)
    E : float
        Young's modulus
    nu : float
        Poisson's ratio
    format : string
        Format of the returned sparse matrix (eg. 'csr', 'bsr', etc.)

    Returns
    -------
    A : csr_matrix
        FE Q1 stiffness matrix

    B : array
        rigid body modes

    See Also
    --------
    linear_elasticity_p1

    Notes
    -----
        - only 2d for now

    Examples
    --------
    >>> from pyamg.gallery import linear_elasticity
    >>> A, B = linear_elasticity((4, 4))

    References
    ----------
    .. [1] J. Alberty, C. Carstensen, S. A. Funken, and R. KloseDOI
       "Matlab implementation of the finite element method in elasticity"
       Computing, Volume 69,  Issue 3  (November 2002) Pages: 239 - 263
       http://www.math.hu-berlin.de/~cc/

       )spacingEnuformatzNo support for grid=)lenq12dNotImplementedError)gridr   r	   r
   r   s        X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyamg/gallery/elasticity.pylinear_elasticityr   	   sD    Z 4yyA~~D'Q2fEEEE
;T;;
<
<<    Tc                    t          |           \  }}|dk     s|dk     rt          d          |r
|dz  }|dz  }t          j        d|dz   d|dz   f         }t          j        |d         j                            dd          |dz  z
  |d         j                            dd          |dz  z
  f          }|d\  }	}
nt          |          \  }	}
||	|
gz  }||z  d|z   dd|z  z
  z  z  }|dd|z  z   z  }t          j        ddg|	dg|	|
gd|
gg          }t          |||          }t          j	        |dz   |dz   z                                |dz   |dz             }|ddddf         }d|z  
                    |j                                      dd	d	          }|                                }|t          j        dddd
d|z  dz   d|z  dz   d|z  dz   d|z  d
z   gd          z  }|t          j        dddd
d|z  dz   d|z  dz   d|z  dz   d|z  d
z   gd          j        z  }t          j        |||z  df          }t          j        |          }t          j        |          }t          j        |          }t          j        |||ff|j        |j        f                                          }|                    d          }~~~~~t          j        d|dz   z  |dz   z  d
f          }d|ddddf<   d|ddddf<   |dddf          |ddddf<   |dddf         |ddddf<   |rt          j        |dz   |dz   fd          }d|ddddf<   t          j        |          }t          j        |dz
  |dz
  z  ddf          }d|ddddf<   d|ddddf<   t          j	        |dz
  |dz
  z            }t          j        t          j        dg          t          j        |          f          }t          j        |||fd|dz   z  |dz   z  d|dz
  z  |dz
  z  f          }|j        }|j        |z  |z  }||z  }|                    |          |fS )zSQ1 elements in 2 dimensions.

    See Also
    --------
    linear_elasticity

       zinvalid grid shaper          @Nr   r   r               )r   r   shape)r   r   	blocksizebooldtypeT)tuple
ValueErrornpmgridhstackTreshapearray
q12d_localarangerepeatsizecopytileravelr   
coo_matrixtocsrtobsrzerosconcatenatecumsum
bsr_matrixasformat)r   r   r	   r
   dirichlet_boundaryr   XYptsDXDYlamemuverticesKnodesLLIdJVABmaskdataindicesindptrPPts                               r   r   r   <   s    ;;DAq1uuA-... 	Q	Q
(1QqS5!AaC%<
 C
)SVX%%b!,,q3w6VX%%b!,,q3w68 9 9C BBwBBx r6a"fQV,-D	
a!b&j	Bx!Q"a2r(QG<==H8T2&&AIqsQqSk""**1Q3!44E	ssCRCxB
B$qv			&	&r1a	0	0B
		A"'1aAqsQw!a1q!A#'BF
K
KKB!Q1acAgqsQw!a1qA6	J	J	LLA
AaC8A	"B
A
A 	1r1g,sx.BCCCIIKKA	&!!A
Aq"e
!qs)QqS/1%&&AAaddAgJAaddAgJaaad)AaddAgJQQQTAaddAgJ x1ac
&111QrT1R4Zx~~x!A#!a+,,QQQ1WQQQ1W)QqS1Q3K((1#	$ @AAtWf5%&!Wac]AqsGQqSM$BD D DSC!GaKF::fq  r   c                 "   |d|z  z   }t          j        g dg dg dg dg          dz  }t          j        g dg dg dg dg          d	z  }t          j        g d
g dg dg dg          dz  }t          j        t          j        | d         | d         z
  | d         | d         z
  f                    }t          j        d          }|j                            t          j        |dgd|gg                                        |          }	|	d         |z  |	d         |z  z   |	d         |j        z  z   |	d         |z  z   |ddddddf<   |j                            t          j        |dgd|gg                                        |          }	|	d         |z  |	d         |z  z   |	d         |j        z  z   |	d         |z  z   |ddddddf<   |j                            t          j        d|g|dgg                                        |          }	|	d         |z  |	d         |z  z   |	d         |j        z  z   |	d         |z  z   |ddddddf<   |ddddddf         j        |ddddddf<   |t          j        |          z  }|S )a9  Local stiffness matrix for two dimensional elasticity on a square element.

    Parameters
    ----------
    lame : Float
        Lame's first parameter
    mu : Float
        shear modulus

    See Also
    --------
    linear_elasticity

    Notes
    -----
    Vertices should be listed in counter-clockwise order::

        [3]----[2]
         |      |
         |      |
        [0]----[1]

    Degrees of freedom are enumerated as follows::

        [x=6,y=7]----[x=4,y=5]
            |            |
            |            |
        [x=0,y=1]----[x=2,y=3]

    r   )r   r   r   )rR   r   r   r   )r   r   r   rR   )r   r   rR   r   g      @)r   r   r   r   )r   r   r   r   g      @)r   r   r   rR   )r   r   rR   r   )r   rR   r   r   )rR   r   r   r   r   r   r   )r   r   )r   r   )r   r   )r   r   r   N)	r%   r*   slainvvstackr5   r(   dotdet)
rB   r@   rA   MR_11R_12R_22FrC   r	   s
             r   r+   r+      s   > 	qtA8^^^#^^#^^#^^% & & ),,D
 8^^^#^^#^^#^^% & & ),,D
 8^^^#^^#^^#^^% & & ),,D
 		8A;!4hqkHQK6OPQQRRA
A	1a&1b'*++,,0033AdGdNQtWt^3	$$&T7T>*AaddADqDjM 	
2q'Aq6*++,,0033AdGdNQtWt^3	$$&T7T>*AaddADqDjM 	
1b'D!9-..//33A66AdGdNQtWt^3	$$&T7T>*AaddADqDjM addADqDjMOAaddADqDjMOAHr   c                    ||z  d|z   dd|z  z
  z  z  }|dd|z  z   z  }t          j        |           } t          j        |          }| j        d         }|| j        d         z  }|j        d         }	|j        d         |dz   k    rt          d          |dk    rt          }
n|dk    rt
          }
nt          d          |                    |                              d|          }||z  }|t          j        |          z  }|                    d||dz   z                                ||dz   z  d          }|                    d||dz   z  ||dz   z            }|	                    dd          }t          j
        |	||dz   z  ||dz   z  ft          	          }t          |	          D ]*}||d
d
f         }| |d
d
f         } |
|||          ||<   +|                                }|                                }|                                }t          j        |||ff||f                                          }|                    ||f          }|dk    rTt          j        |df          }d|dd
ddf<   d|dd
ddf<   | d
d
df          |dd
ddf<   | d
d
df         |dd
ddf<   nt          j        |df          }d|dd
ddf<   d|dd
ddf<   d|dd
ddf<   | d
d
df          |dd
ddf<   | d
d
df         |dd
ddf<   | d
d
df          |dd
ddf<   | d
d
df         |dd
ddf<   | d
d
df          |dd
ddf<   | d
d
df         |dd
ddf<   |                    |          |fS )a  P1 elements in 2 or 3 dimensions.

    Parameters
    ----------
    vertices : array_like
        array of vertices of a triangle or tets
    elements : array_like
        array of vertex indices for tri or tet elements
    E : float
        Young's modulus
    nu : float
        Poisson's ratio
    format : string
        'csr', 'csc', 'coo', 'bsr'

    Returns
    -------
    A : csr_matrix
        FE Q1 stiffness matrix

    Notes
    -----
        - works in both 2d and in 3d

    Examples
    --------
    >>> from pyamg.gallery import linear_elasticity_p1
    >>> import numpy as np
    >>> E = np.array([[0, 1, 2],[1, 3, 2]])
    >>> V = np.array([[0.0, 0.0],[1.0, 0.0],[0.0, 1.0],[1.0, 1.0]])
    >>> A, B = linear_elasticity_p1(V, E)

    References
    ----------
    .. [1] J. Alberty, C. Carstensen, S. A. Funken, and R. KloseDOI
       "Matlab implementation of the finite element method in elasticity"
       Computing, Volume 69,  Issue 3  (November 2002) Pages: 239 - 263
       http://www.math.hu-berlin.de/~cc/

    r   r   r   zdimension mismatchr   z$only dimension 2 and 3 are supportedr   )axisr!   Nr   r      r   r   )r%   asarrayr   r$   
p12d_local
p13d_localr-   r)   r,   swapaxesemptyfloatranger1   r   r2   r3   r4   r5   r9   )rB   elementsr	   r
   r   r@   rA   DDoFNElocal_KrowcolrL   ielement_indiceselement_verticesrI   rJ   s                      r   linear_elasticity_p1rq      s   T r6a"fQrT*+D	
a!B$hBz(##Hz(##HqA
HN1
C		B~aAE!!-...Avv	
a?@@@
//!


$
$R
+
+C1HC29Q<<C
++b!QqS'
"
"
)
)!QqS'
)
:
:C
++b!QqS'1ac7
+
+C
,,q!

C8RAaC!QqS'*%888D2YY 6 6"1aaa4.#OQQQ$67'*D"55Q
))++C
))++C::<<D 	4#s,S#J???EEGGA	1a&!!A 	AvvHc1X!$Q$'
!$Q$'
qqq!tn_!$Q$'
aaad^!$Q$'

Hc1X!$Q$'
!$Q$'
!$Q$'
qqq!tn_!$Q$'
aaad^!$Q$'
qqq!tn_!$Q$'
aaad^!$Q$'
qqq!tn_!$Q$'
aaad^!$Q$'
::fq  r   c                 6   | j         dk    sJ t          j        t          j        d          | j        f          }t          j        |          ddddf         }t          j        d          }|j        |dgdggg df<   |j        |dgdggg d	f<   |t          j        g d
g dg dg          z  |t          j        g dg dg dg          z  z   }t          j	        |          dz  t          j
        t          j
        |j        |          |          z  }|S )z-Local stiffness matrix for P1 elements in 2d.)r   r   )r   r   Nr   )r   r_   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   r   )r   r%   rU   onesr(   rS   rT   r5   r*   rW   rV   rB   r@   rA   rI   PhiGradRCrC   s           r   ra   ra   =  s   >V####
	276??HJ/00AgajjABBG
A&yAsQCj)))&yAsQCj)))
28YYY			9995666RXyyy)))YYY7888	9A

3rvbfQS!nna000AHr   c                    | j         dk    sJ t          j        t          j        d          | j        f          }t          j        |          ddddf         }t          j        d          }|j        |g ddddf<   |j        |g d	dddf<   |j        |g d
dddf<   t          j        d          }|d|z  t          j        d          z  z   |ddddf<   |t          j        d          z  |ddddf<   t          j	        |          dz  t          j
        t          j
        |j        |          |          z  }|S )z-Local stiffness matrix for P1 elements in 3d.)r   r   )r   r   Nr   )r_      )r   r   r   r   r   )r   r   r   )r   r   r   r   )r_   r_   r_   )r   r%   rU   rs   r(   rS   rT   r5   eyerW   rV   rt   s           r   rb   rb   L  s;   >V####
	276??HJ/00AgajjABBG
A AiiiAo AiiiAo AiiiAo
A2bfQii'Aac1Q3hKRVAYY,Aac1Q3hK

1RVBF13NNA...AHr   )Nr   r   N)Nr   r   TN)r   r   N)__doc__numpyr%   scipy.linalglinalgrS   scipyr   r   r   r+   rq   ra   rb    r   r   <module>r      s    R R                0= 0= 0= 0=f @DK! K! K! K!\C C CLj! j! j! j!Z      r   