单元积分点应力如何外插至节点上 | 数值实现篇

继上次的推文:有限元计算过程中积分点应力如何外插至节点处?【公式推导篇】,本次分享单元积分点应力外插至节点处的数值实现过程

应力外插

核心理念:坐标系的转换

假设$\left( \xi ,\eta \right) 是母单元的自然坐标系, 是母单元的自然坐标系, 是母单元的自然坐标系,\left( \hat{\xi},\hat{\eta} \right) $是由高斯积分点控制的坐标系(术语可能不专业),假设高斯积分方案为 2 × 2 2 \times2 2×2。坐标系转换关系:
( ξ , η ) = ( ξ ^ , η ^ ) / 3 o r ( ξ ^ , η ^ ) = ( ξ , η ) 3 (\xi,\eta)=(\hat{\xi},\hat{\eta})/\sqrt{3}\quad\mathrm{or}\quad(\hat{\xi},\hat{\eta})=(\xi,\eta)\sqrt{3} (ξ,η)=(ξ^,η^)/3 or(ξ^,η^)=(ξ,η)3

单元内任一点的应力 σ P \sigma _P σP,由4个高斯积分点应力 σ G i \sigma _{Gi} σGi进行插值时,可表示为

σ P = ∑ i = 1 4 N i σ G i = [ N 1 ( ξ ^ , η ^ ) N 2 ( ξ ^ , η ^ ) N 3 ( ξ ^ , η ^ ) N 4 ( ξ ^ , η ^ ) ] [ σ G 1 σ G 2 σ G 3 σ G 4 ] \sigma_{P}=\sum_{i=1}^{4}N_{i}\sigma_{Gi}=\begin{bmatrix}N_{1}(\hat{\xi},\hat{\eta})N_{2}(\hat{\xi},\hat{\eta})N_{3}(\hat{\xi},\hat{\eta})N_{4}(\hat{\xi},\hat{\eta})\end{bmatrix}\begin{bmatrix}\sigma_{G1}\\\sigma_{G2}\\\sigma_{G3}\\\sigma_{G4}\end{bmatrix} σP=i=14NiσGi=[N1(ξ^,η^)N2(ξ^,η^)N3(ξ^,η^)N4(ξ^,η^)] σG1σG2σG3σG4

其中, N ( ξ ^ , η ^ ) N(\hat{\xi},\hat{\eta}) N(ξ^,η^)是基于高斯积分点的形函数,第一个积分点的坐标在母单元坐标系下为(-1,-1),根据上述的坐标系转换的方式,在高斯积分点的坐标系下,第一个单元节点在高斯积分点坐标系下坐标为$\left( -\sqrt{3},-\sqrt{3} \right) $,将此坐标值代入第一个形函数,得 1 + 3 2 1+\frac{\sqrt{3}}{2} 1+23 ,相同的道理,可推导至四个节点在4个形函数下的 4 × 4 4 \times 4 4×4外插矩阵:

[ σ 1 σ 2 σ 3 σ 4 ] = [ 1 + 0.5 3 − 0.5 1 − 0.5 3 − 0.5 − 0.5 1 + 0.5 3 − 0.5 1 − 0.5 3 1 − 0.5 3 − 0.5 1 + 0.5 3 − 0.5 − 0.5 1 − 0.5 3 − 0.5 1 + 0.5 3 ] [ σ G 1 σ G 2 σ G 3 σ G 4 ] \begin{bmatrix}\sigma_1\\\sigma_2\\\sigma_3\\\sigma_4\end{bmatrix}=\begin{bmatrix}1+0.5\sqrt{3}&-0.5&1-0.5\sqrt{3}&-0.5\\-0.5&1+0.5\sqrt{3}&-0.5&1-0.5\sqrt{3}\\1-0.5\sqrt{3}&-0.5&1+0.5\sqrt{3}&-0.5\\-0.5&1-0.5\sqrt{3}&-0.5&1+0.5\sqrt{3}\end{bmatrix}\begin{bmatrix}\sigma_{G1}\\\sigma_{G2}\\\sigma_{G3}\\\sigma_{G4}\end{bmatrix} σ1σ2σ3σ4 = 1+0.53 0.510.53 0.50.51+0.53 0.510.53 10.53 0.51+0.53 0.50.510.53 0.51+0.53 σG1σG2σG3σG4

数值实现

借助以上理论,我们可以基于matlab平台编制以下代码段:

% 将积分点应力外插至单元节点上,这里只列举了Q4的情况
for i = 1:3
  StressElem(e,:,i) = [1+0.5*sqrt(3) -0.5 1-0.5*sqrt(3) -0.5;
  -0.5 1+0.5*sqrt(3) -0.5 1-0.5*sqrt(3);
  1-0.5*sqrt(3) -0.5 1+0.5*sqrt(3) -0.5;
  -0.5 1-0.5*sqrt(3) -0.5 1+0.5*sqrt(3)]*...
  [stress(e,1,i);stress(e,2,i);stress(e,3,i);stress(e,4,i)];
end

对标Abaqus

模型材料参数为普通的线弹性材料,单元类型选择CPS4,网格划分及边界条件设置如下:

在结果对标过程中,可以先对比自研程序与Abaqus的节点位移场:

Abaqus位移场结果

自研程序位移场结果

在位移场一致的前提下,我们再来对标应力结果。以常见的mises应力为例:

Abaqus位移应力场结果

自研程序应力场结果

结果是一致的,说明了程序的正确性。

如果我们还想看一下细节方面的,以1号单元的节点应力 s 11 s_{11} s11为例:

自研程序与Abaqus的结果也是一致的,在提取Abaqus单元节点应力时,应该将应力平滑选项取消勾选,即:

单元积分点应力外插matlab函数
function [StressElem,StressNode] = QuadNodeStress(node, element, prop, U, averageType,elemType,guassType)
% 通过节点位移计算节点应力,正应力:Sxx、Syy、Sxy、VonMises
% 增加节点应力均匀化标识:averageType,==1时,采用绕节点直接平均,==2时采用绕节点面积加权平均
    E = prop(1);
    NU = prop(2);
    ID = prop(4);

    [numberNodes, ~] = size(node);
    [numberElements, ~] = size(element);
    StressElem = zeros(numberElements, 3); % 只计算出正应力Sxx、Syy、Sxy即可
    StressNode = zeros(numberNodes, 4);
    WeightSum = zeros(numberNodes, 1);  % 用于加权平均的权重总和
    % 根据平面应力/应变状态ID选择应力-应变矩阵
    if ID == 1
        D = (E/(1-NU^2)) * [1, NU, 0; NU, 1, 0; 0, 0, (1-NU)/2];
    elseif ID == 2
        D = (E/(1+NU)/(1-2*NU)) * [1-NU, NU, 0; NU, 1-NU, 0; 0, 0, (1-2*NU)/2];
    end

    % quadrature according to quadType
    [gaussWeights,gaussLocations_cols]=gauss(guassType);
    stress = zeros(numberElements,size(gaussLocations_cols,1),3);
    StressElem = zeros(numberElements,4,3);
    elementDof = zeros(1,2*4);
    % 遍历所有单元计算单元应力
    for e = 1:numberElements
        indice = element(e,:);
        elementDof(1:2:end)=2*indice-1;
        elementDof(2:2:end)=2*indice;
        elementNode = element(e, :);
        elemNodeCoordinate = node(elementNode, :);
        elenode = length(elemNodeCoordinate);
        B=zeros(3,2*elenode);
        for q = 1:size(gaussWeights,1)
            xi_Gauss=gaussLocations_cols(q,1);
            eta_Gauss=gaussLocations_cols(q,2);
            % shape functions and derivatives
            [shapeFunction,naturalDerivatives]=shapeFunctionQuad(xi_Gauss,eta_Gauss,elemType);
            % Jacobian matrix, inverse of Jacobian,
            % derivatives w.r.t. x,y
            [Jacob,XYderivatives] = Jacobian(elemNodeCoordinate,naturalDerivatives);
            A = det(Jacob)*4;
            % B matrix
            B(1,1:2:end) = XYderivatives(:,1)';
            B(2,2:2:end) = XYderivatives(:,2)';
            B(3,1:2:end) = XYderivatives(:,2)';
            B(3,2:2:end) = XYderivatives(:,1)';
            % element deformation
            strain = B*U(elementDof);
            stress(e,q,1:3) = D*strain;
        end

        % 计算单元应力
        % 将积分点应力外插至单元节点上,这里只列举了Q4的情况
        for i = 1:3
            StressElem(e,:,i) = [1+0.5*sqrt(3) -0.5 1-0.5*sqrt(3) -0.5;
            -0.5 1+0.5*sqrt(3) -0.5 1-0.5*sqrt(3);
            1-0.5*sqrt(3) -0.5 1+0.5*sqrt(3) -0.5;
            -0.5 1-0.5*sqrt(3) -0.5 1+0.5*sqrt(3)]*...
            [stress(e,1,i);stress(e,2,i);stress(e,3,i);stress(e,4,i)];
        end
...

完整版的代码,我将会放置在《有限元基础编程百科全书》有关平面单元的章节,有待更新~

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
matlab节点单元是常用于有限元分析中的一种常见单元类型。它由四个节点组成,通常用于模拟结构中的小变形问题。下面是使用matlab进行四节点单元应力求解的步骤: 步骤1:定义节点坐标和单元的连接关系 首先,需要定义每个节点的坐标,以及节点之间的连接关系。这些坐标和连接关系以矩阵的形式给出。例如,假设有四个节点,它们的坐标分别为(x1,y1),(x2,y2),(x3,y3),(x4,y4)。连接关系可以使用节点之间的索引表示。 步骤2:计算刚度矩阵和载荷向量 根据有限元分析的基本理论,可以通过计算每个单元的刚度矩阵和载荷向量来求解应力。对于四节点单元,刚度矩阵的计算可以使用单元的形函数和雅可比矩阵得到。载荷向量可以由用在结构上的部载荷和边界条件确定。 步骤3:组装刚度矩阵和载荷向量 在确定每个单元的刚度矩阵和载荷向量之后,需要将它们组装成整个结构的总刚度矩阵和载荷向量。这可以通过将每个单元的刚度矩阵和载荷向量分别放置在总刚度矩阵和载荷向量的相位置来完成。 步骤4:求解线性方程组 将得到的总刚度矩阵和载荷向量输入到线性方程组中,可以通过求解线性方程组得到应力的解。这可以通过使用matlab中的线性代数函数来实现。 步骤5:后处理结果 最后,需要进行后处理,以获得更具物理意义的结果。这可能包括计算应力变和变形等。 综上所述,通过使用matlab,可以比较方便地求解四节点单元应力问题。通过定义节点坐标和单元的连接关系,计算刚度矩阵和载荷向量,组装刚度矩阵和载荷向量,求解线性方程组,以及后处理结果,可以得到结构在给定载荷下的应力分布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易木木木响叮当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值