弹性力学数值方法:混合元法:有限元法基础_第1页
弹性力学数值方法:混合元法:有限元法基础_第2页
弹性力学数值方法:混合元法:有限元法基础_第3页
弹性力学数值方法:混合元法:有限元法基础_第4页
弹性力学数值方法:混合元法:有限元法基础_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

弹性力学数值方法:混合元法:有限元法基础1弹性力学数值方法:混合元法:有限元法基础1.1绪论1.1.1弹性力学概述弹性力学是固体力学的一个分支,主要研究弹性体在外力作用下的变形和应力分布。它基于连续介质力学的基本假设,利用微分方程来描述材料的力学行为。在工程应用中,弹性力学的求解对于结构设计、材料选择和安全性评估至关重要。1.1.2数值方法在弹性力学中的应用数值方法,尤其是有限元法(FEM),在解决弹性力学问题中扮演着核心角色。有限元法通过将连续体离散成有限数量的单元,将偏微分方程转化为代数方程组,从而实现复杂结构的应力和应变分析。这种方法特别适用于处理非线性、不规则形状和边界条件复杂的问题。1.1.3混合元法简介混合元法是有限元法的一种变体,它在求解过程中同时考虑位移和应力作为未知量。这种方法在处理某些特定问题时,如近似满足平衡方程和应力边界条件,可以提供更准确的解。混合元法通过引入额外的未知量,如拉格朗日乘子,来确保位移和应力的连续性和一致性。1.2弹性力学基础1.2.1弹性力学基本方程弹性力学的基本方程包括平衡方程、本构方程和几何方程。平衡方程描述了力的平衡条件;本构方程描述了材料的应力应变关系;几何方程则将应变与位移联系起来。这些方程构成了求解弹性问题的理论基础。1.2.2应力应变关系在弹性力学中,应力应变关系由胡克定律描述,即应力与应变成正比。对于各向同性材料,胡克定律可以表示为:σ其中,σ是应力,ϵ是应变,E是弹性模量。在三维情况下,应力应变关系更为复杂,涉及多个弹性常数。1.3有限元法基础1.3.1有限元法原理有限元法的基本思想是将连续体离散化,即将结构分解为有限数量的单元,每个单元用一组节点来表示。在每个单元内部,位移被假设为节点位移的插值函数。通过在每个单元上应用平衡方程,可以得到整个结构的平衡条件,进而求解节点位移。1.3.2有限元法求解流程结构离散化:将结构分解为单元和节点。选择位移模式:定义单元内部位移的插值函数。建立单元方程:在每个单元上应用平衡方程,得到单元的刚度矩阵和载荷向量。组装整体方程:将所有单元的方程组装成整体结构的方程。施加边界条件:根据问题的边界条件,修改整体方程。求解未知量:解整体方程,得到节点位移。后处理:计算应力、应变等其他物理量,进行结果分析。1.4混合元法原理1.4.1混合元法的动机混合元法的引入主要是为了解决标准位移元法在某些情况下可能遇到的锁定位移和应力不连续的问题。通过同时求解位移和应力,混合元法可以提供更准确的应力分布,尤其是在处理近似满足平衡条件的低阶单元时。1.4.2混合元法的实现混合元法的实现通常涉及引入拉格朗日乘子来确保位移和应力的连续性。在每个单元内部,位移和应力被独立地插值。然后,通过最小化能量泛函,求解位移和应力的未知量。这种方法在理论上可以提供更精确的解,但在实际应用中,选择合适的位移和应力模式以及拉格朗日乘子的计算是关键。1.4.3混合元法的优缺点优点:-可以更准确地预测应力分布,尤其是在低阶单元中。-对于某些问题,如近似满足平衡条件的单元,混合元法可以提供更好的收敛性。缺点:-计算成本较高,因为需要求解更多的未知量。-选择合适的位移和应力模式以及拉格朗日乘子的计算较为复杂。1.5混合元法示例假设我们有一个简单的二维弹性问题,需要使用混合元法求解。我们将使用Python和SciPy库来实现这一过程。importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料属性

E=200e9#弹性模量

nu=0.3#泊松比

#定义单元的几何和位移模式

#假设我们使用线性位移模式和常应力模式

#定义拉格朗日乘子

#在这里,我们假设拉格朗日乘子用于确保位移和应力的连续性

#定义能量泛函

defenergy_functional(u,s):

#u是位移向量,s是应力向量

#计算能量泛函,这里简化为一个示例

returnnp.sum(u**2)+np.sum(s**2)

#定义求解过程

defsolve_mixed_fem():

#初始化位移和应力的未知量

u=np.zeros((num_nodes,2))#位移向量

s=np.zeros((num_elements,3))#应力向量

#初始化能量泛函的梯度矩阵

grad_u=lil_matrix((num_nodes*2,num_nodes*2))

grad_s=lil_matrix((num_elements*3,num_elements*3))

#计算梯度矩阵

#这里简化为一个示例

foriinrange(num_nodes):

grad_u[i*2:(i+1)*2,i*2:(i+1)*2]=2*np.eye(2)

foriinrange(num_elements):

grad_s[i*3:(i+1)*3,i*3:(i+1)*3]=2*np.eye(3)

#组装整体方程

K=lil_matrix((num_nodes*2+num_elements*3,num_nodes*2+num_elements*3))

K[:num_nodes*2,:num_nodes*2]=grad_u

K[num_nodes*2:,num_nodes*2:]=grad_s

#施加边界条件

#假设我们固定第一个节点的位移

K[0,:]=0

K[1,:]=0

K[0,0]=1

K[1,1]=1

#求解未知量

b=np.zeros(num_nodes*2+num_elements*3)

b[:num_nodes*2]=np.random.rand(num_nodes*2)#假设的外力向量

x=spsolve(K.tocsc(),b)

#后处理

u=x[:num_nodes*2].reshape((num_nodes,2))

s=x[num_nodes*2:].reshape((num_elements,3))

returnu,s

#假设的节点和单元数量

num_nodes=10

num_elements=5

#求解混合元法

u,s=solve_mixed_fem()

print("位移向量:",u)

print("应力向量:",s)代码解释:上述代码示例中,我们定义了一个简化版的混合元法求解过程。首先,我们初始化了位移和应力的未知量,以及能量泛函的梯度矩阵。然后,我们组装了整体方程,并施加了边界条件。最后,我们求解了未知量,并进行了后处理,计算了位移和应力的值。请注意,实际的混合元法求解过程会更复杂,涉及到更精确的能量泛函定义、位移和应力的插值函数,以及拉格朗日乘子的计算。上述代码仅用于说明混合元法的基本求解流程。1.6结论混合元法在弹性力学数值分析中提供了一种更精确的求解方法,尤其是在处理应力和位移的连续性问题时。通过同时求解位移和应力,混合元法可以克服标准位移元法的一些限制,但同时也带来了计算成本和实现复杂度的增加。在实际应用中,选择合适的位移和应力模式以及优化求解过程是关键。2弹性力学数值方法:混合元法:有限元法基础2.1有限元法的历史与发展有限元法(FiniteElementMethod,FEM)起源于20世纪40年代末,最初由工程师们在解决结构工程问题时提出。1943年,R.Courant在解决平板问题时首次使用了有限元的概念。然而,直到1956年,当O.C.Zienkiewicz和Y.K.Cheung在《工程计算》杂志上发表了一篇关于有限元法的文章后,这一方法才开始被广泛接受和应用。自那时起,有限元法迅速发展,成为解决复杂工程问题的强有力工具,其应用领域从最初的结构工程扩展到流体力学、热传导、电磁学等多个领域。2.2基本概念与术语2.2.1节点(Node)在有限元模型中,结构被离散化为一系列小的单元,这些单元的交点被称为节点。节点是有限元分析的基本单元,它们的位置决定了模型的几何形状。2.2.2单元(Element)单元是有限元模型中的基本几何构建块,可以是线、面或体。每个单元由一组节点定义,单元内部的物理量(如位移、应力、应变)通过节点上的物理量插值来近似。2.2.3插值函数(InterpolationFunction)插值函数用于在单元内部从节点值推导出任意点的物理量。这些函数通常基于多项式,如线性、二次或三次多项式,以确保物理量在单元内部的连续性和光滑性。2.2.4刚度矩阵(StiffnessMatrix)刚度矩阵是有限元分析中最重要的矩阵之一,它描述了结构在给定载荷下的响应。刚度矩阵的元素表示节点位移与节点力之间的关系,即当一个节点受到单位力时,其他节点的位移量。刚度矩阵是通过对单元的微分方程进行积分得到的。2.2.5载荷向量(ForceVector)载荷向量包含了作用在结构上的所有外力和边界条件。在有限元分析中,载荷向量被离散化,每个节点上的力或力矩都被表示为载荷向量中的一个元素。2.3离散化过程有限元法的核心是将连续的结构离散化为一系列单元和节点,然后在每个单元上应用微分方程。这一过程可以分为以下几个步骤:几何离散化:将结构划分为多个单元,每个单元由一组节点定义。选择插值函数:为每个单元选择适当的插值函数,以近似单元内部的物理量。建立单元方程:基于单元的微分方程和插值函数,建立单元的刚度矩阵和载荷向量。组装整体方程:将所有单元的刚度矩阵和载荷向量组合成整体刚度矩阵和整体载荷向量。施加边界条件:在整体方程中施加边界条件,如固定节点或施加外力。求解方程:使用线性代数方法求解整体方程,得到节点位移。后处理:从节点位移计算单元的应力和应变,以及结构的变形。2.3.1示例:一维杆的有限元分析假设我们有一根长度为1米的均匀杆,两端分别固定在x=0和x=1。杆受到一个沿x方向的均匀分布载荷q=10N/m。我们使用有限元法来分析这根杆的应力和应变。2.3.1.1几何离散化我们将杆离散化为两个长度为0.5米的线性单元。2.3.1.2选择插值函数对于一维杆,我们选择线性插值函数,即位移u(x)在每个单元内可以表示为:u(x)=a0+a1*x其中,a0和a1是待定系数,可以通过节点位移来确定。2.3.1.3建立单元方程对于每个单元,我们有以下微分方程:E*A*d^2u/dx^2=q其中,E是弹性模量,A是截面积。将微分方程与插值函数结合,可以得到单元的刚度矩阵和载荷向量。2.3.1.4组装整体方程将两个单元的刚度矩阵和载荷向量组合成整体刚度矩阵和整体载荷向量。2.3.1.5施加边界条件在x=0和x=1的节点上施加固定边界条件,即位移为0。2.3.1.6求解方程使用线性代数方法求解整体方程,得到节点位移。2.3.1.7后处理从节点位移计算单元的应力和应变,以及杆的变形。2.3.2代码示例以下是一个使用Python和NumPy库进行一维杆有限元分析的简单示例:importnumpyasnp

#材料属性

E=200e9#弹性模量,单位:Pa

A=0.01#截面积,单位:m^2

#几何参数

L=1.0#杆的长度,单位:m

n=2#单元数量

#载荷

q=10#均匀分布载荷,单位:N/m

#单元长度

l=L/n

#刚度矩阵

K=np.array([[E*A/l,-E*A/l],

[-E*A/l,E*A/l]])

#载荷向量

F=np.array([q*l/2,q*l/2])

#整体刚度矩阵和载荷向量

K_global=np.zeros((n+1,n+1))

F_global=np.zeros(n+1)

#组装整体方程

foriinrange(n):

K_global[2*i:2*i+2,2*i:2*i+2]+=K

F_global[2*i:2*i+2]+=F

#施加边界条件

K_global[[0,-1],:]=0

K_global[:,[0,-1]]=0

K_global[0,0]=1

K_global[-1,-1]=1

F_global[0]=0

F_global[-1]=0

#求解方程

u=np.linalg.solve(K_global,F_global)

#后处理

stress=E*np.gradient(u)/l

strain=np.gradient(u)/l

print("节点位移:",u)

print("单元应力:",stress)

print("单元应变:",strain)这段代码首先定义了材料属性、几何参数和载荷,然后计算了单元的刚度矩阵和载荷向量。接着,它组装了整体刚度矩阵和载荷向量,并施加了边界条件。最后,它求解了整体方程,得到了节点位移,并计算了单元的应力和应变。2.4刚度矩阵与载荷向量2.4.1刚度矩阵刚度矩阵是有限元分析中最重要的矩阵之一,它描述了结构的刚度特性。对于每个单元,刚度矩阵的元素表示节点位移与节点力之间的关系。在整体分析中,所有单元的刚度矩阵被组合成一个大的整体刚度矩阵,用于描述整个结构的刚度特性。2.4.2载荷向量载荷向量包含了作用在结构上的所有外力和边界条件。在有限元分析中,载荷向量被离散化,每个节点上的力或力矩都被表示为载荷向量中的一个元素。载荷向量与刚度矩阵一起,构成了求解结构响应的线性方程组。2.4.3示例:二维梁的有限元分析假设我们有一根长度为1米、宽度为0.1米的矩形梁,两端分别固定在(0,0)和(1,0)。梁受到一个垂直向下的集中载荷P=100N。我们使用有限元法来分析这根梁的应力和应变。2.4.3.1几何离散化我们将梁离散化为10个长度为0.1米的线性单元。2.4.3.2选择插值函数对于二维梁,我们选择二次插值函数,即位移u(x,y)和v(x,y)在每个单元内可以表示为:u(x,y)=a0+a1*x+a2*y+a3*x*y+a4*x^2+a5*y^2

v(x,y)=b0+b1*x+b2*y+b3*x*y+b4*x^2+b5*y^2其中,a0至a5和b0至b5是待定系数,可以通过节点位移来确定。2.4.3.3建立单元方程对于每个单元,我们有以下微分方程:d^2u/dx^2+d^2u/dy^2=0

d^2v/dx^2+d^2v/dy^2=0将微分方程与插值函数结合,可以得到单元的刚度矩阵和载荷向量。2.4.3.4组装整体方程将所有单元的刚度矩阵和载荷向量组合成整体刚度矩阵和整体载荷向量。2.4.3.5施加边界条件在(0,0)和(1,0)的节点上施加固定边界条件,即位移为0。2.4.3.6求解方程使用线性代数方法求解整体方程,得到节点位移。2.4.3.7后处理从节点位移计算单元的应力和应变,以及梁的变形。2.4.4代码示例以下是一个使用Python和SciPy库进行二维梁有限元分析的简单示例:fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#材料属性

E=200e9#弹性模量,单位:Pa

nu=0.3#泊松比

#几何参数

L=1.0#梁的长度,单位:m

B=0.1#梁的宽度,单位:m

n=10#单元数量

#载荷

P=100#集中载荷,单位:N

#单元长度

l=L/n

#刚度矩阵

K=lil_matrix((2*(n+1),2*(n+1)))

#载荷向量

F=np.zeros(2*(n+1))

#组装整体方程

foriinrange(n):

#计算单元刚度矩阵

k=np.array([[E*A/l,0,-E*A/l,0],

[0,E*A/l,0,-E*A/l],

[-E*A/l,0,E*A/l,0],

[0,-E*A/l,0,E*A/l]])

#将单元刚度矩阵添加到整体刚度矩阵中

K[2*i:2*i+4,2*i:2*i+4]+=k

#施加边界条件

K[[0,-1],:]=0

K[:,[0,-1]]=0

K[0,0]=1

K[-1,-1]=1

F[1]=P

#求解方程

u=spsolve(K,F)

#后处理

#这里省略了后处理的代码,因为它涉及到更复杂的数学计算和物理量的转换。这段代码首先定义了材料属性、几何参数和载荷,然后计算了单元的刚度矩阵和载荷向量。接着,它组装了整体刚度矩阵和载荷向量,并施加了边界条件。最后,它求解了整体方程,得到了节点位移。后处理部分省略了,因为它涉及到更复杂的数学计算和物理量的转换。3弹性力学基本方程3.1平衡方程平衡方程描述了在弹性体内部,应力与外力之间的关系,确保了材料在受力作用下处于平衡状态。在三维空间中,平衡方程可以表示为:∂其中,σij是应力张量,bi$$\frac{\partial\sigma_{x}}{\partialx}+\frac{\partial\sigma_{y}}{\partialy}+b_x=0\\\frac{\partial\tau_{xy}}{\partialx}+\frac{\partial\sigma_{y}}{\partialy}+b_y=0$$这里,σx和σy是正应力,3.2几何方程几何方程,也称为应变-位移关系,描述了位移如何引起应变。在小变形假设下,对于三维问题,几何方程可以表示为:ϵ其中,ϵij是应变张量,ui$$\epsilon_x=\frac{\partialu}{\partialx}\\\epsilon_y=\frac{\partialv}{\partialy}\\\gamma_{xy}=\frac{\partialu}{\partialy}+\frac{\partialv}{\partialx}$$这里,u和v是位移分量,ϵx和ϵy是正应变,3.3物理方程物理方程,也称为本构关系,描述了应力与应变之间的关系。对于线性弹性材料,物理方程遵循胡克定律,可以表示为:σ其中,Ciσ这里,λ和μ是拉梅常数,δi3.4边界条件边界条件是弹性力学问题中不可或缺的一部分,用于描述弹性体与外界的相互作用。边界条件可以分为两种类型:位移边界条件和应力边界条件。3.4.1位移边界条件位移边界条件规定了弹性体边界上的位移。例如,固定边界上的位移为零。3.4.2应力边界条件应力边界条件规定了弹性体边界上的应力。例如,受力边界上的应力等于外力。3.4.3示例:二维弹性力学问题的有限元分析假设我们有一个矩形弹性体,长为1m,宽为0.5m,受到均匀分布的垂直向下的力。我们将使用Python和SciPy库来解决这个问题。importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料属性

E=200e9#弹性模量,单位:Pa

nu=0.3#泊松比

mu=E/(2*(1+nu))

lmbda=E*nu/((1+nu)*(1-2*nu))

#定义网格和节点

n_x=10#网格在x方向的节点数

n_y=5#网格在y方向的节点数

L=1.0#弹性体的长度

H=0.5#弹性体的高度

x=np.linspace(0,L,n_x+1)

y=np.linspace(0,H,n_y+1)

X,Y=np.meshgrid(x,y)

nodes=np.vstack((X.flatten(),Y.flatten())).T

#定义单元

elements=[]

foriinrange(n_x):

forjinrange(n_y):

elements.append([i*(n_y+1)+j,(i+1)*(n_y+1)+j,(i+1)*(n_y+1)+j+1,i*(n_y+1)+j+1])

#定义外力

force=np.zeros((len(nodes),2))

force[:,1]=-1e6#垂直向下的力,单位:N/m^2

#定义位移边界条件

displacement=np.zeros((len(nodes),2))

displacement[0,0]=1e-3#左边界x方向位移,单位:m

displacement[-1,0]=-1e-3#右边界x方向位移,单位:m

#定义应力边界条件

stress=np.zeros((len(nodes),2))

stress[0,1]=0#左边界y方向应力,单位:Pa

stress[-1,1]=0#右边界y方向应力,单位:Pa

#构建刚度矩阵

K=lil_matrix((len(nodes)*2,len(nodes)*2))

foreinelements:

#计算单元刚度矩阵

Ke=np.zeros((8,8))

foriinrange(4):

forjinrange(4):

#计算几何矩阵

B=np.zeros((3,8))

B[0,2*i:2*i+2]=[1,0]

B[1,2*j:2*j+2]=[0,1]

B[2,2*i:2*i+2]=[0,1]

B[2,2*j:2*j+2]=[1,0]

#计算物理矩阵

D=np.array([[lmbda+2*mu,lmbda,0],

[lmbda,lmbda+2*mu,0],

[0,0,mu]])

#更新单元刚度矩阵

Ke+=B.T@D@B

#更新全局刚度矩阵

foriinrange(4):

forjinrange(4):

K[2*e[i]:2*e[i]+2,2*e[j]:2*e[j]+2]+=Ke[2*i:2*i+2,2*j:2*j+2]

#应用边界条件

foriinrange(len(nodes)):

ifdisplacement[i,0]!=0:

K[2*i,:]=0

K[2*i,2*i]=1

force[2*i]=displacement[i,0]

ifdisplacement[i,1]!=0:

K[2*i+1,:]=0

K[2*i+1,2*i+1]=1

force[2*i+1]=displacement[i,1]

#求解位移

u=spsolve(K.tocsr(),force.flatten())

#计算应变和应力

epsilon=np.zeros((len(nodes),3))

sigma=np.zeros((len(nodes),3))

foriinrange(len(nodes)):

#计算几何矩阵

B=np.zeros((3,8))

B[0,2*i:2*i+2]=[1,0]

B[1,2*i:2*i+2]=[0,1]

B[2,2*i:2*i+2]=[0,1]

B[2,2*i+1:2*i+3]=[1,0]

#计算应变

epsilon[i]=B@u[2*i:2*i+2]

#计算应力

sigma[i]=D@epsilon[i]

#输出结果

print("位移:")

print(u.reshape((len(nodes),2)))

print("应变:")

print(epsilon)

print("应力:")

print(sigma)这个例子展示了如何使用有限元方法解决一个二维弹性力学问题,包括构建刚度矩阵、应用边界条件、求解位移、计算应变和应力。通过调整材料属性、网格大小和外力,可以模拟不同的弹性力学问题。4弹性力学数值方法:混合元法:有限元法基础4.1混合元法原理4.1.1混合元法的基本思想混合元法(MixedFiniteElementMethod)是一种在有限元分析中处理复杂问题的有效方法,尤其适用于流体动力学、固体力学和电磁学等领域。其基本思想是将原始的偏微分方程组分解为多个方程,每个方程可以独立地用不同的插值函数来逼近,从而提高解的精度和稳定性。在弹性力学中,混合元法通常用于同时求解位移和应力,或位移和应变,而不是像标准有限元法那样仅求解位移。4.1.2混合元法的数学基础混合元法的数学基础建立在变分原理和泛函分析上。考虑一个典型的弹性力学问题,其控制方程可以表示为:σ∇其中,σ是应力张量,ε是应变张量,C是弹性系数矩阵,f是体力。在混合元法中,我们引入辅助变量,例如,将应力或应变作为独立变量,从而将上述方程组转化为:σ∇接下来,我们使用Galerkin方法或其变种来离散这些方程。对于每个方程,我们选择不同的插值函数,例如,位移可能使用线性插值,而应力可能使用常数插值。这样,我们可以在每个单元内独立地逼近位移和应力,从而避免了标准有限元法中可能出现的锁定位移或应力的数值问题。4.1.3混合元法与标准有限元法的比较混合元法与标准有限元法的主要区别在于,混合元法允许独立逼近不同物理量,如位移和应力,而标准有限元法通常只逼近位移。这种独立逼近的能力使得混合元法在处理某些特定问题时更为有效,例如,当应力或应变的精确解对问题至关重要时,混合元法可以提供更准确的结果。4.1.3.1示例:使用混合元法求解平面应力问题假设我们有一个平面应力问题,需要求解一个矩形板在边界载荷下的位移和应力。我们使用混合元法,其中位移使用线性插值,应力使用常数插值。importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料属性

E=200e9#弹性模量

nu=0.3#泊松比

C=np.array([[1,nu,0],[nu,1,0],[0,0,(1-nu)/2]])*E/(1+nu)/(1-2*nu)

#定义网格和节点

nodes=np.array([[0,0],[1,0],[1,1],[0,1]])

elements=np.array([[0,1,2],[0,2,3]])

#定义边界条件和载荷

boundary_nodes=[0,3]

boundary_values=[np.array([0,0]),np.array([0,0])]

loads={1:np.array([0,-1e6]),2:np.array([0,-1e6])}

#初始化矩阵和向量

K=lil_matrix((2*len(nodes),2*len(nodes)),dtype=float)

F=np.zeros(2*len(nodes))

#构建刚度矩阵和载荷向量

foreinelements:

#计算单元刚度矩阵

Ke=np.zeros((6,6))

foriinrange(3):

forjinrange(3):

Ke[2*i:2*i+2,2*j:2*j+2]+=C@np.array([[1,0],[0,1]])*0.5

#应用边界条件

fori,nodeinenumerate(boundary_nodes):

Ke=np.delete(np.delete(Ke,2*node,axis=0),2*node,axis=1)

#将单元刚度矩阵添加到全局刚度矩阵

K+=Ke

#计算单元载荷向量

Fe=np.zeros(6)

fori,nodeinenumerate(e):

ifnodeinloads:

Fe[2*i:2*i+2]+=loads[node]

#应用边界条件

fori,nodeinenumerate(boundary_nodes):

Fe=np.delete(Fe,2*node)

#将单元载荷向量添加到全局载荷向量

F+=Fe

#应用边界条件

fori,nodeinenumerate(boundary_nodes):

K=np.delete(np.delete(K,2*node,axis=0),2*node,axis=1)

F=np.delete(F,2*node)

#求解线性方程组

u=spsolve(K.tocsr(),F)

#输出位移和应力

print("位移:",u)

print("应力:",C@np.array([[1,0],[0,1]])*0.5)此代码示例展示了如何使用混合元法求解一个简单的平面应力问题。我们首先定义了材料属性、网格、节点、边界条件和载荷。然后,我们初始化了刚度矩阵和载荷向量,并通过遍历每个单元来构建它们。在每个单元中,我们计算了单元刚度矩阵和载荷向量,应用了边界条件,并将它们添加到全局矩阵和向量中。最后,我们应用了全局边界条件,求解了线性方程组,并输出了位移和应力的结果。混合元法通过允许独立逼近不同物理量,提供了一种更灵活和精确的有限元分析方法,尤其是在处理应力或应变的精确解对问题至关重要的情况下。5混合元法在弹性力学中的应用5.1平面应力和平面应变问题5.1.1原理在弹性力学中,平面应力和平面应变问题是两种常见的简化模型,用于分析薄板和厚板的应力应变分布。平面应力问题假设结构在厚度方向上的应力可以忽略,而平面应变问题则假设结构在厚度方向上的应变为零。混合元法在处理这类问题时,通过引入额外的未知数(如应力或应变)来提高数值解的精度和稳定性。5.1.2内容混合元法在平面应力和平面应变问题中的应用,主要涉及以下步骤:选择位移和应力的插值函数:在有限元分析中,位移和应力通常由多项式函数表示。混合元法允许位移和应力使用不同的插值函数,这可以更好地逼近实际的应力分布。建立变分原理:基于位移和应力的插值函数,建立相应的变分原理,如最小势能原理或混合变分原理。求解方程:通过求解得到的变分方程,找到位移和应力的数值解。5.1.2.1示例:平面应力问题的混合元法求解假设我们有一个矩形薄板,其尺寸为10x1,材料为钢,弹性模量为200GPa,泊松比为0.3。板的左边界固定,右边界受到均匀的横向力作用。我们使用混合元法求解板的位移和应力分布。#导入必要的库

importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料参数

E=200e9#弹性模量

nu=0.3#泊松比

#定义几何参数

L=10.0#长度

H=1.0#高度

#定义网格参数

n_x=10#x方向的单元数

n_y=1#y方向的单元数

#计算单元尺寸

dx=L/n_x

dy=H/n_y

#初始化位移和应力矩阵

u=np.zeros((n_x+1,n_y+1))

v=np.zeros((n_x+1,n_y+1))

sigma_xx=np.zeros((n_x,n_y))

sigma_yy=np.zeros((n_x,n_y))

sigma_xy=np.zeros((n_x,n_y))

#构建刚度矩阵和载荷向量

K=lil_matrix((2*(n_x+1)*(n_y+1),2*(n_x+1)*(n_y+1)))

F=np.zeros(2*(n_x+1)*(n_y+1))

#应用边界条件

foriinrange(n_y+1):

K[i,i]=1

K[n_x*(n_y+1)+i,n_x*(n_y+1)+i]=1

#应用载荷

F[-1]=-1e6*dy#右边界上的横向力

#求解位移

u_v=spsolve(K.tocsr(),F)

#将位移向量转换为网格上的位移

u=u_v[:len(u_v)//2].reshape((n_x+1,n_y+1))

v=u_v[len(u_v)//2:].reshape((n_x+1,n_y+1))

#计算应力

foriinrange(n_x):

forjinrange(n_y):

du_dx=(u[i+1,j]-u[i,j])/dx

dv_dy=(v[i,j+1]-v[i,j])/dy

du_dy=(u[i,j+1]-u[i,j])/dy

dv_dx=(v[i+1,j]-v[i,j])/dx

sigma_xx[i,j]=E/(1-nu**2)*(du_dx+nu*dv_dy)

sigma_yy[i,j]=E/(1-nu**2)*(dv_dy+nu*du_dx)

sigma_xy[i,j]=E/(2*(1+nu))*(du_dy+dv_dx)

#输出结果

print("位移u:")

print(u)

print("位移v:")

print(v)

print("应力sigma_xx:")

print(sigma_xx)

print("应力sigma_yy:")

print(sigma_yy)

print("应力sigma_xy:")

print(sigma_xy)此代码示例展示了如何使用混合元法求解平面应力问题。首先,我们定义了材料和几何参数,然后构建了刚度矩阵和载荷向量,应用了边界条件和载荷,最后求解了位移并计算了应力。5.2轴对称问题5.2.1原理轴对称问题是指结构关于某一轴对称,且所有物理量(如位移、应力和应变)都与该轴的径向距离有关,而与角度无关。在处理这类问题时,混合元法可以有效地减少计算量,因为可以将三维问题简化为二维问题。5.2.2内容轴对称问题的混合元法求解,通常包括以下步骤:选择位移和应力的插值函数:与平面应力和平面应变问题类似,但需要考虑轴对称的特性。建立变分原理:基于轴对称的假设,建立相应的变分原理。求解方程:通过求解得到的变分方程,找到位移和应力的数值解。5.2.2.1示例:轴对称问题的混合元法求解假设我们有一个圆柱形压力容器,其内径为1,外径为2,材料为铝,弹性模量为70GPa,泊松比为0.33。容器内部受到均匀的压力作用。我们使用混合元法求解容器的位移和应力分布。#导入必要的库

importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料参数

E=70e9#弹性模量

nu=0.33#泊松比

#定义几何参数

r_i=1.0#内径

r_o=2.0#外径

#定义网格参数

n_r=10#径向的单元数

#计算单元尺寸

dr=(r_o-r_i)/n_r

#初始化位移和应力矩阵

u=np.zeros(n_r+1)

sigma_rr=np.zeros(n_r)

sigma_tt=np.zeros(n_r)

sigma_rt=np.zeros(n_r)

#构建刚度矩阵和载荷向量

K=lil_matrix((n_r+1,n_r+1))

F=np.zeros(n_r+1)

#应用边界条件

K[0,0]=1

K[-1,-1]=1

#应用载荷

F[-1]=-1e6*2*np.pi*r_o*dr#内表面的压力

#求解位移

u=spsolve(K.tocsr(),F)

#计算应力

foriinrange(n_r):

du_dr=(u[i+1]-u[i])/dr

sigma_rr[i]=E/(1-nu**2)*(du_dr+nu*u[i]/(r_i+i*dr))

sigma_tt[i]=E/(1-nu**2)*(u[i]/(r_i+i*dr)+nu*du_dr)

sigma_rt[i]=0#轴对称问题中,径向和切向的剪应力为零

#输出结果

print("位移u:")

print(u)

print("应力sigma_rr:")

print(sigma_rr)

print("应力sigma_tt:")

print(sigma_tt)此代码示例展示了如何使用混合元法求解轴对称问题。我们定义了材料和几何参数,构建了刚度矩阵和载荷向量,应用了边界条件和载荷,最后求解了位移并计算了应力。5.3维弹性问题5.3.1原理三维弹性问题涉及结构在三个方向上的位移、应力和应变。混合元法在处理这类问题时,可以提供更准确的应力和应变分布,尤其是在应力集中或复杂几何形状的情况下。5.3.2内容三维弹性问题的混合元法求解,通常包括以下步骤:选择位移和应力的插值函数:三维问题需要考虑六个独立的应力分量和三个位移分量。建立变分原理:基于三维弹性理论,建立相应的变分原理。求解方程:通过求解得到的变分方程,找到位移和应力的数值解。5.3.2.1示例:三维弹性问题的混合元法求解假设我们有一个立方体结构,其尺寸为1x1x1,材料为铜,弹性模量为120GPa,泊松比为0.34。结构的一侧固定,另一侧受到均匀的力作用。我们使用混合元法求解结构的位移和应力分布。#导入必要的库

importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#定义材料参数

E=120e9#弹性模量

nu=0.34#泊松比

#定义几何参数

L=1.0#长度

#定义网格参数

n_x=5#x方向的单元数

n_y=5#y方向的单元数

n_z=5#z方向的单元数

#计算单元尺寸

dx=L/n_x

dy=L/n_y

dz=L/n_z

#初始化位移和应力矩阵

u=np.zeros((n_x+1,n_y+1,n_z+1))

v=np.zeros((n_x+1,n_y+1,n_z+1))

w=np.zeros((n_x+1,n_y+1,n_z+1))

sigma_xx=np.zeros((n_x,n_y,n_z))

sigma_yy=np.zeros((n_x,n_y,n_z))

sigma_zz=np.zeros((n_x,n_y,n_z))

sigma_xy=np.zeros((n_x,n_y,n_z))

sigma_xz=np.zeros((n_x,n_y,n_z))

sigma_yz=np.zeros((n_x,n_y,n_z))

#构建刚度矩阵和载荷向量

K=lil_matrix((3*(n_x+1)*(n_y+1)*(n_z+1),3*(n_x+1)*(n_y+1)*(n_z+1)))

F=np.zeros(3*(n_x+1)*(n_y+1)*(n_z+1))

#应用边界条件

foriinrange(n_y+1):

forjinrange(n_z+1):

K[i*(n_y+1)*(n_z+1),i*(n_y+1)*(n_z+1)]=1

K[(n_x+1)*(n_y+1)*(n_z+1)+i*(n_y+1)*(n_z+1),(n_x+1)*(n_y+1)*(n_z+1)+i*(n_y+1)*(n_z+1)]=1

K[2*(n_x+1)*(n_y+1)*(n_z+1)+i*(n_y+1)*(n_z+1),2*(n_x+1)*(n_y+1)*(n_z+1)+i*(n_y+1)*(n_z+1)]

#应用载荷

F[-1]=-1e6*dy*dz#右边界上的力

#求解位移

u_v_w=spsolve(K.tocsr(),F)

#将位移向量转换为网格上的位移

u=u_v_w[:len(u_v_w)//3].reshape((n_x+1,n_y+1,n_z+1))

v=u_v_w[len(u_v_w)//3:2*len(u_v_w)//3].reshape((n_x+1,n_y+1,n_z+1))

w=u_v_w[2*len(u_v_w)//3:].reshape((n_x+1,n_y+1,n_z+1))

#计算应力

foriinrange(n_x):

forjinrange(n_y):

forkinrange(n_z):

du_dx=(u[i+1,j,k]-u[i,j,k])/dx

dv_dy=(v[i,j+1,k]-v[i,j,k])/dy

dw_dz=(w[i,j,k+1]-w[i,j,k])/dz

du_dy=(u[i,j+1,k]-u[i,j,k])/dy

du_dz=(u[i,j,k+1]-u[i,j,k])/dz

dv_dx=(v[i+1,j,k]-v[i,j,k])/dx

dv_dz=(v[i,j,k+1]-v[i,j,k])/dz

dw_dx=(w[i+1,j,k]-w[i,j,k])/dx

dw_dy=(w[i,j+1,k]-w[i,j,k])/dy

sigma_xx[i,j,k]=E/(1-nu**2)*(du_dx+nu*(dv_dy+dw_dz))

sigma_yy[i,j,k]=E/(1-nu**2)*(dv_dy+nu*(du_dx+dw_dz))

sigma_zz[i,j,k]=E/(1-nu**2)*(dw_dz+nu*(du_dx+dv_dy))

sigma_xy[i,j,k]=E/(2*(1+nu))*(du_dy+dv_dx)

sigma_xz[i,j,k]=E/(2*(1+nu))*(du_dz+dw_dx)

sigma_yz[i,j,k]=E/(2*(1+nu))*(dv_dz+dw_dy)

#输出结果

print("位移u:")

print(u)

print("位移v:")

print(v)

print("位移w:")

print(w)

print("应力sigma_xx:")

print(sigma_xx)

print("应力sigma_yy:")

print(sigma_yy)

print("应力sigma_zz:")

print(sigma_zz)

print("应力sigma_xy:")

print(sigma_xy)

print("应力sigma_xz:")

print(sigma_xz)

print("应力sigma_yz:")

print(sigma_yz)此代码示例展示了如何使用混合元法求解三维弹性问题。我们定义了材料和几何参数,构建了刚度矩阵和载荷向量,应用了边界条件和载荷,最后求解了位移并计算了应力。三维问题的处理比平面问题复杂,需要考虑更多的位移和应力分量。6弹性力学数值方法:混合元法:有限元法基础6.1有限元分析步骤6.1.1前处理:网格划分与节点编号在有限元分析中,前处理阶段是将实际的物理结构转化为计算机可以处理的数学模型的过程。这通常包括将结构离散化为一系列小的、简单的形状,称为“单元”,以及对这些单元的节点进行编号。6.1.1.1网格划分网格划分是将复杂结构分解为多个小单元的过程。这些单元可以是线性的、二次的、三角形的、四边形的、六面体的等,具体取决于结构的几何形状和分析的复杂性。例如,对于一个简单的矩形板,可以使用四边形单元进行网格划分。6.1.1.2节点编号节点编号是为每个单元的节点分配一个唯一编号的过程。这有助于在后续的分析中追踪每个节点的位置和响应。节点编号通常从1开始,顺序进行,确保每个节点只有一个编号。6.1.1.3示例假设我们有一个简单的矩形板,尺寸为1mx1m,厚度为0.1m。我们将使用四边形单元进行网格划分,并对节点进行编号。#导入必要的库

importnumpyasnp

importmatplotlib.pyplotasplt

#定义板的尺寸

length=1.0

width=1.0

thickness=0.1

#定义网格划分的参数

num_elements_length=10

num_elements_width=10

#计算每个单元的尺寸

element_length=length/num_elements_length

element_width=width/num_elements_width

#创建节点坐标

nodes=np.zeros((num_elements_length*num_elements_width+1,2))

foriinrange(num_elements_length+1):

forjinrange(num_elements_width+1):

nodes[i*(num_elements_width+1)+j]=[i*element_length,j*element_width]

#创建单元连接

elements=np.zeros((num_elements_length*num_elements_width,4),dtype=int)

foriinrange(num_elements_length):

forjinrange(num_elements_width):

elements[i*num_elements_width+j]=[i*(num_elements_width+1)+j,

i*(num_elements_width+1)+j+1,

(i+1)*(num_elements_width+1)+j+1,

(i+1)*(num_elements_width+1)+j]

#可视化网格

plt.figure()

foriinrange(len(elements)):

plt.plot(nodes[elements[i,0],0],nodes[elements[i,0],1],'ro')

plt.plot(nodes[elements[i,1],0],nodes[elements[i,1],1],'ro')

plt.plot(nodes[elements[i,2],0],nodes[elements[i,2],1],'ro')

plt.plot(nodes[elements[i,3],0],nodes[elements[i,3],1],'ro')

plt.plot([nodes[elements[i,0],0],nodes[elements[i,1],0]],

[nodes[elements[i,0],1],nodes[elements[i,1],1]],'k-')

plt.plot([nodes[elements[i,1],0],nodes[elements[i,2],0]],

[nodes[elements[i,1],1],nodes[elements[i,2],1]],'k-')

plt.plot([nodes[elements[i,2],0],nodes[elements[i,3],0]],

[nodes[elements[i,2],1],nodes[elements[i,3],1]],'k-')

plt.plot([nodes[elements[i,3],0],nodes[elements[i,0],0]],

[nodes[elements[i,3],1],nodes[elements[i,0],1]],'k-')

plt.show()6.1.2求解过程:方程建立与求解在有限元分析中,求解过程涉及建立和求解结构的平衡方程。这通常通过应用胡克定律和牛顿第二定律来完成,将结构的物理行为转化为数学方程。6.1.2.1方程建立方程建立阶段是将每个单元的物理行为转化为数学方程的过程。这通常涉及到计算单元的刚度矩阵和载荷向量,然后将这些矩阵和向量组合成全局的刚度矩阵和载荷向量。6.1.2.2求解求解阶段是求解全局平衡方程的过程。这通常涉及到求解一个大规模的线性方程组,可以使用直接求解器或迭代求解器来完成。6.1.2.3示例假设我们有一个简单的弹簧系统,由两个弹簧和两个质量块组成。我们将使用有限元法来建立和求解系统的平衡方程。#导入必要的库

importnumpyasnp

#定义系统的参数

k1=1000.0#弹簧1的刚度

k2=2000.0#弹簧2的刚度

m1=1.0#质量块1的质量

m2=2.0#质量块2的质量

f1=100.0#作用在质量块1上的力

f2=200.0#作用在质量块2上的力

#创建刚度矩阵

K=np.zeros((4,4))

K[0,0]=k1

K[0,1]=-k1

K[1,0]=-k1

K[1,1]=k1+k2

K[1,2]=-k2

K[2,1]=-k2

K[2,2]=k2

K[2,3]=-k2

K[3,2]=-k2

K[3,3]=k2

#创建质量矩阵

M=np.zeros((4,4))

M[0,0]=m1

M[1,1]=m1

M[2,2]=m2

M[3,3]=m2

#创建载荷向量

F=np.array([f1,0.0,f2,0.0])

#求解平衡方程

u=np.linalg.solve(K,F)

#输出位移

print("位移向量:",u)6.1.3后处理:结果分析与可视化在有限元分析中,后处理阶段是分析和可视化求解结果的过程。这通常涉及到计算应力、应变、位移等物理量,并将这些物理量可视化,以便于理解和解释结果。6.1.3.1结果分析结果分析阶段是计算和分析求解结果的过程。这通常涉及到计算每个单元的应力、应变、位移等物理量,然后对这些物理量进行分析,以确定结构的响应。6.1.3.2可视化可视化阶段是将求解结果转化为图形的过程。这通常涉及到使用可视化工具,如Matplotlib或Paraview,将应力、应变、位移等物理量转化为图形,以便于理解和解释结果。6.1.3.3示例假设我们已经求解了一个简单的矩形板的有限元分析,现在我们将分析和可视化求解结果。#导入必要的库

importnumpyasnp

importmatplotlib.pyplotasplt

#定义求解结果

u=np.zeros((121,2))

u[100:121,0]=0.01

#可视化位移

plt.figure()

plt.quiver(nodes[:,0],nodes[:,1],u[:,0],u[:,1])

plt.show()以上就是有限元分析的基本步骤,包括前处理、求解过程和后处理。在实际应用中,这些步骤可能会更加复杂,涉及到更多的物理定律和数学方程。但是,这些基本步骤提供了一个理解有限元分析过程的框架。7实例分析与计算7.1维杆件的混合元法分析在弹性力学中,一维杆件的混合元法分析主要关注于杆件的轴向变形。混合元法结合了位移法和应力法的优点,通过引入额外的未知数(如应力或应变)来提高数值解的精度和稳定性。下面,我们将通过一个具体的例子来展示如何使用混合元法分析一维杆件。7.1.1问题描述假设有一根长度为1米的均匀杆件,两端分别固定和自由,受到轴向力的作用。杆件的横截面积为0.01平方米,弹性模量为200GPa。我们需要计算杆件在不同轴向力作用下的轴向位移和应力分布。7.1.2混合元法分析步骤离散化:将杆件离散为多个单元,每个单元采用混合元法进行分析。建立方程:在每个单元内,同时考虑位移和应力的平衡方程。求解:通过求解全局方程组,得到位移和应力的数值解。7.1.3代码示例#弹性力学数值方法:混合元法分析一维杆件

importnumpyasnp

#材料属性

E=200e9#弹性模量,单位:Pa

A=0.01#横截面积,单位:m^2

L=1.0#杆件长度,单位:m

F=10000#轴向力,单位:N

#单元离散

n_elements=10

element_length=L/n_elements

#单元刚度矩阵

k=(E*A)/element_length

K=np.array([[k,-k],[-k,k]])

#全局刚度矩阵

K_global=np.zeros((n_elements+1,n_elements+1))

foriinrange(n_elements):

K_global[i:i+2,i:i+2]+=K

#边界条件

K_global[0,:]=0

K_global[:,0]=0

K_global[0,0]=1

#载荷向量

F_global=np.zeros(n_elements+1)

F_global[-1]=F

#求解位移

U=np.linalg.solve(K_global,F_global)

#计算应力

stress=np.zeros(n_elements)

foriinrange(n_elements):

stress[i]=E*(U[i+1]-U[i])/element_length

#输出结果

print("位移分布:",U)

print("应力分布:",stress)7.1.4解释此代码首先定义了材料属性和杆件的几何参数,然后将杆件离散为10个单元。通过计算单元刚度矩阵并组合成全局刚度矩阵,应用边界条件和载荷向量,最后求解得到位移和应力的分布。7.2维平板的混合元法分析二维平板的混合元法分析通常涉及平面应力和平面应变问题。我们将通过一个具体的例子来展示如何使用混合元法分析二维平板。7.2.1问题描述考虑一个尺寸为1mx1m的平板,厚度为0.01m,弹性模量为200GPa,泊松比为0.3。平板的一边固定,另一边受到均匀分布的面力作用。我们需要计算平板在面力作用下的位移和应力分布。7.2.2混合元法分析步骤网格划分:将平板划分为多个四边形单元。建立方程:在每个单元内,同时考虑位移和应力的平衡方程。求解:通过求解全局方程组,得到位移和应力的数值解。7.2.3代码示例#弹性力学数值方法:混合元法分析二维平板

importnumpyasnp

fromscipy.sparseimportlil_matrix

fromscipy.sparse.linalgimportspsolve

#材料属性

E=200e9#弹性模量,单位:Pa

nu=0.3#泊松比

t=0.01#厚度,单位:m

F=1000#面力,单位:N/m

#单元属性

n_elements_x=10

n_elements_y=10

element_length_x=1.0/n_elements_x

element_length_y=1.0/n_elements_y

#单元刚度矩阵

D=E/(1-nu**2)*np.array([[1,nu,0],[nu,1,0],[0,0,(1-nu)/2]])

K=np.zeros((8,8))

foriinrange(4):

forjinrange(4):

K[2*i:2*i+2,2*j:2*j+2]+=D

#全局刚度矩阵

n_nodes=(n_elements_x+1)*(n_elements_y+1)

K_global=lil_matrix((2*n_nodes,2*n_nodes))

foriinrange(n_elements_x):

forjinrange(n_elements_y):

node1=i*(n_elements_y+1)+j

node2=(i+1)*(n_elements_y+1)+j

node3=(i+1)*(n_elements_y+1)+j+1

node4=i*(n_elements_y+1)+j+1

nodes=[node1,node2,node3,node4]

forkinrange(4):

forlinrange(4):

K_global[2*nodes[k]:2*nodes[k]+2,2*nodes[l]:2*nodes[l]+2]+=K[2*k:2*k+2,2*l:2*l+2]

#边界条件

foriinrange(n_nodes):

ifi%(n_elements_y+1)==0:

K_global[i,:]=0

K_global[i,i]=1

K_global[i+1,:]=0

K_global[i+1,i+1]=1

#载荷向量

F_global=np.zeros(2*n_nodes)

foriinrange(n_elements_x+1):

node=i*(n_elements_y+1)

F_global[2*node+1]=F*element_length_x*t

#求解位移

U=spsolve(K_global.tocsc(),F_global)

#计算应力

stress=np.zeros((n_elements_x,n_elements_y))

foriinrange(n_elements_x):

forjinrange(n_elements_y):

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论