MT2D大地电磁有限元正演程序--单元分析

MT2D有限元单元分析

泛函公式

J ( U ) = ∑ V ∫ e 1 2 σ ( ∇ U ) 2 d V + ∑ V ∫ e 1 2 σ k 2 U 2 d V − I δ ( A ) U J(U)=\sum_{V} \int_{e} \frac{1}{2} \sigma(\nabla U)^{2} d V+\sum_{V} \int_{e} \frac{1}{2} \sigma k^{2} U^{2} d V-I \delta(A) U J(U)=Ve21σ(U)2dV+Ve21σk2U2dVIδ(A)U
对于每一个单元,需要对上式的第一项和第二项的单元积分。最重要的是求 ∇ U \nabla U U U U U的积分计算。

三角单元的形函数

在这里插入图片描述

U的单元分析

假定在三角单元内的电位 U U U是线性变化的,即
U = N i U i + N j U j + N m U m U=N_iU_i+N_jU_j+N_mU_m U=NiUi+NjUj+NmUm
其中, N n N_n Nn为形函数, n = i , j , m n=i,j,m n=i,j,m
N n = 1 2 Δ ( a n + b n x + c n y ) N_{n}=\frac{1}{2 \Delta}\left(a_{n}+b_{n} x+c_{n}y\right) Nn=2Δ1(an+bnx+cny)
由于形函数仅与空间坐标有关系,与其他因素无关,其中 a n , b n a_{n},b_{n} an,bn公式如下:
{ a i = x j y m − y j x m , b i = y j − y m , c i = x j − x m a j = x m y i − y m x j , b j = y m − y i , c j = x m − x i a m = x i y j − y i x j , b m = y i − y j , c m = x i − x j Δ = 1 2 ( b i c j − b j c i ) \left\{\begin{array}{l}{a_{i}=x_{j}y_{m}-y_{j}x_{m},b_{i}=y_{j}-y_{m}, c_{i}=x_{j}-x_{m}} \\ {a_{j}=x_{m}y_{i}-y_{m}x_{j},b_{j}=y_{m}-y_{i}, c_{j}=x_{m}-x_{i}} \\ {a_{m}=x_{i}y_{j}-y_{i}x_{j},b_{m}=y_{i}-y_{j}, c_{m}=x_{i}-x_{j}} \\ {\Delta=\frac{1}{2}\left(b_{i}c_{j}-b_{j} c_{i}\right)}\end{array}\right. ai=xjymyjxm,bi=yjym,ci=xjxmaj=xmyiymxj,bj=ymyi,cj=xmxiam=xiyjyixj,bm=yiyj,cm=xixjΔ=21(bicjbjci)
利用matlab简单实现计算单元的算法
在这里插入图片描述

function fem
    % 假设有一个三角单元,其三个点的坐标分别如下:
    p1 = [.5 .5];
    p2 = [0 0];
    p3 = [1 0];
    hs=scatter([p1(1);p2(1);p3(1)],[p1(2);p2(2);p3(2)]);
    hold on
    hp=patch([p1(1);p2(1);p3(1)],[p1(2);p2(2);p3(2)],[.7 .7 .7]);

    a(1) = p2(1)*p3(2)-p2(2)*p3(1);
    a(2) = p3(1)*p1(2)-p3(2)*p1(1);
    a(3) = p1(1)*p2(2)-p1(2)*p2(1);
    b(1) = p2(2)-p3(2);
    b(2) = p3(2)-p1(2);
    b(3) = p1(2)-p2(2);
    c(1) = p3(1)-p2(1);
    c(2) = p1(1)-p2(1);
    c(3) = p2(1)-p1(1);
    delta = 0.5*(b(1)*c(2)-b(2)*c(1));
    if delta <= 0
        message('出错了,妈的!!')
    end

    N1 = femN(p1,delta,a,b,c)
    N2 = femN(p2,delta,a,b,c)
    N3 = femN(p3,delta,a,b,c)
end

function N = femN(p,delta,a,b,c)
    factor = 1.0/(2.0*delta);
    for i =1:3
        N(i) = (a(i)+b(i)*p(1)+c(i)*p(1))*factor;
    end
end

∇ U \nabla U U的单元分析

因为,
∇ U = ∂ U ∂ x ı ⃗ + ∂ U ∂ y ȷ ⃗ \nabla U=\frac{\partial U}{\partial x} \vec{\imath}+\frac{\partial U}{\partial y} \vec{\jmath} U=xUı +yUȷ
所以有,
( ∇ U ) 2 = ( ∂ U ∂ x ) 2 + ( ∂ U ∂ y ) 2 (\nabla U)^{2}=\left(\frac{\partial U}{\partial x}\right)^{2}+\left(\frac{\partial U}{\partial y}\right)^{2} (U)2=(xU)2+(yU)2
分开来看,
∂ U ∂ x = ∂ ∂ x ( ∑ n = i , j , m N n U n ) = ∑ n = i , j , m ∂ N n ∂ x U n = ( ∂ N ⃗ ∂ x ) T U ⃗ e = U ⃗ e T ( ∂ N ⃗ ∂ x ) \frac{\partial U}{\partial x}=\frac{\partial}{\partial x}\left(\sum_{n=i, j, m} N_{n} U_{n}\right)=\sum_{n=i, j, m} \frac{\partial N_{n}}{\partial x} U_{n}=\left(\frac{\partial \vec{N}}{\partial x}\right)^{T} \vec{U}_{e}=\vec{U}_{e}^{T}\left(\frac{\partial \vec{N}}{\partial x}\right) xU=x(n=i,j,mNnUn)=n=i,j,mxNnUn=(xN )TU e=U eT(xN )
( ∂ U ∂ x ) 2 = U ⃗ e T ( ∂ N ⃗ ∂ x ) ( ∂ N ⃗ ∂ x ) T U ⃗ e \left(\frac{\partial U}{\partial x}\right)^{2}=\vec{U}_{e}^{T}\left(\frac{\partial \vec{N}}{\partial x}\right)\left(\frac{\partial \vec{N}}{\partial x}\right)^{T} \vec{U}_{e} (xU)2=U eT(xN )(xN )TU e
那么则有
( ∂ N ⃗ ∂ x ) T = ( ∂ N i ∂ x , ∂ N j ∂ x , ∂ N m ∂ x ) = 1 2 Δ ( b i , b j , b m ) \left(\frac{\partial \vec{N}}{\partial x}\right)^{T}=\left(\frac{\partial N_{i}}{\partial x}, \frac{\partial N_{j}}{\partial x}, \frac{\partial N_{m}}{\partial x}\right)=\frac{1}{2 \Delta}\left(b_{i}, b_{j}, b_{m}\right) (xN )T=(xNi,xNj,xNm)=2Δ1(bi,bj,bm)
同理,
( ∂ U ∂ y ) 2 = U ⃗ e T ( ∂ N ⃗ ∂ y ) ( ∂ N ⃗ ∂ y ) T U ⃗ e \left(\frac{\partial \mathrm{U}}{\partial \mathrm{y}}\right)^{2}=\vec{U}_{e}^{T}\left(\frac{\partial \vec{N}}{\partial y}\right)\left(\frac{\partial \vec{N}}{\partial \mathrm{y}}\right)^{\mathrm{T}} \vec{U}_{e} (yU)2=U eT(yN )(yN )TU e
其中,
( ∂ N ⃗ ∂ y ) T = ( ∂ N i ∂ y , ∂ N j ∂ y , ∂ N m ∂ y ) = 1 2 Δ ( c i , c j , c m ) \left(\frac{\partial \vec{N}}{\partial y}\right)^{T}=\left(\frac{\partial N_{i}}{\partial y}, \frac{\partial N_{j}}{\partial y}, \frac{\partial N_{m}}{\partial y}\right)=\frac{1}{2 \Delta}\left(c_{i}, c_{j}, c_{m}\right) (yN )T=(yNi,yNj,yNm)=2Δ1(ci,cj,cm)
通过上述表达式可求出:
∫ e 1 2 σ ( ∇ U ) 2 d V = 1 2 σ U ⃗ e T ∫ e ( ∂ N ⃗ ∂ x ) ( ∂ N ⃗ ∂ x ) T ( ∂ N ⃗ ∂ y ) ( ∂ N ⃗ ∂ y ) T d V U ⃗ e = 1 2 U ⃗ e T k 1 e U ⃗ e \int_{e} \frac{1}{2} \sigma(\nabla U)^{2} d V=\frac{1}{2} \sigma \vec{U}_{e}^{T} \int_{e}\left(\frac{\partial \vec{N}}{\partial x}\right)\left(\frac{\partial \vec{N}}{\partial x}\right)^{T}\left(\frac{\partial \vec{N}}{\partial y}\right)\left(\frac{\partial \vec{N}}{\partial y}\right)^{T} d V \vec{U}_{e}=\frac{1}{2} \vec{U}_{e}^{T} k_{1 e} \vec{U}_{e} e21σ(U)2dV=21σU eTe(xN )(xN )T(yN )(yN )TdVU e=21U eTk1eU e
其中:
k 1 e = 1 4 Δ [ b i c i b j c j b m c m ] [ b i b j b m c i c j c m ] = 1 4 Δ b s c t , s , t = i , j , m k_{1 e}=\frac{1}{4 \Delta}\left[\begin{array}{cc}{b_{i}} & {c_{i}} \\ {b_{j}} & {c_{j}} \\ {b_{m}} & {c_{m}}\end{array}\right]\left[\begin{array}{ccc}{b_{i}} & {b_{j}} & {b_{m}} \\ {c_{i}} & {c_{j}} & {c_{m}}\end{array}\right]=\frac{1}{4 \Delta} b_{s} c_{t}, \quad s, t=i, j, m k1e=4Δ1bibjbmcicjcm[bicibjcjbmcm]=4Δ1bsct,s,t=i,j,m

对于第二项,
∫ e 1 2 σ k 2 U 2 d V = 1 2 σ k 2 U ⃗ e T ∫ e N ⃗ N ⃗ T d V U ⃗ e = 1 2 U ⃗ e T k 2 e U ⃗ e \int_{e} \frac{1}{2} \sigma k^{2} U^{2} d V=\frac{1}{2} \sigma k^{2} \vec{U}_{e}^{T} \int_{e} \vec{N} \vec{N}^{T} d V \vec{U}_{e}=\frac{1}{2} \vec{U}_{e}^{T} k_{2 e} \vec{U}_{e} e21σk2U2dV=21σk2U eTeN N TdVU e=21U eTk2eU e
又由,
∫ e N i a N j b N m c d V = 2 Δ a ! b ! c ! ( a + b + c + 2 ) ! \int_{\mathrm{e}} N_{i}^{a} N_{j}^{b} N_{m}^{c} d V=2 \Delta \frac{a ! b ! c !}{(a+b+c+2) !} eNiaNjbNmcdV=2Δ(a+b+c+2)!a!b!c!
其中,
k 2 e = 1 12 [ 2 1 1 1 2 1 1 1 2 ] k_{2 e}=\frac{1}{12}\left[\begin{array}{lll}{2} & {1} & {1} \\ {1} & {2} & {1} \\ {1} & {1} & {2}\end{array}\right] k2e=121211121112

function [GG NN] = GGNN(delta,b,c)
    factor = 0.25/delta;
    for i=1:3
        for j=1:3
            GG(i,j)=factor*(b(i)*b(j)+c(i)*c(j));
            if i==j
                NN(i,j)= delta/6.0;
            else
                NN(i,j)=delta/12.0;
            end
        end
    end
end

以上为三角单元的单元分析的原理和matlab的代码。

MT2D中的单元分析代码如下,可以通过上述的matlab代码和公式去理解

#ifndef  _FEM_H
#define  _FEM_H

// C++ includes
#include <cassert>
#include "tri.h"

class FEM
{
 public: 
   FEM(Tri& tri);   % 构造函数
   ~FEM(); 			% 解析函数
   void init(); 
   void N(Point p, double n[3]);  % 求形函数 
   void Grad_N(Point p, Point grad_n[3]); 
   void Grad_N_dot_N(Matrix3D& GG,  Matrix3D& NN); %求解形函数的二阶导数相乘,和N*N  
 
 public:
   Tri*                          tri;
   double                        s;
   double                        a[3], b[3], c[3];   
};


inline
FEM::FEM(Tri& tri_):
  tri  (&tri_)
{
  this->init();
}

inline
FEM::~FEM()
{
}

inline
void FEM::init()
{
  Point& v0 = *tri->get_node(0);
  Point& v1 = *tri->get_node(1);
  Point& v2 = *tri->get_node(2);
  a[0]= v1(0)*v2(1) - v1(1)*v2(0);
  a[1]= v2(0)*v0(1) - v2(1)*v0(0);
  a[2]= v0(0)*v1(1) - v0(1)*v1(0);
  b[0]= v1(1)-v2(1);
  b[1]= v2(1)-v0(1);
  b[2]= v0(1)-v1(1);
  c[0]= v2(0)-v1(0);
  c[1]= v0(0)-v2(0);
  c[2]= v1(0)-v0(0);
  
  double size = 0.5*(b[0]*c[1]-b[1]*c[0]);
  this-> s    = size;
  assert(size>0.0);
  
  return;
}

inline
void FEM::N(Point p, double N[3])
{
  assert(this->s>0.);
  const double factor= 1.0/(2.0*this->s);
  for(int i=0; i<3; i++) N[i]= (a[i]+b[i]*p(0)+c[i]*p(1))*factor;
  return;
}



inline
void FEM::Grad_N(Point p, Point grad_n[3])
{
  assert(s>0.);
  const double factor= 1.0/(2.0*this->s);

  for(int i=0; i<3; i++) {
    grad_n[i](0) = b[i]*factor;
    grad_n[i](1) = c[i]*factor;    
  }
  return;
}


inline
void FEM::Grad_N_dot_N(Matrix3D& GG,  Matrix3D& NN)
{
  GG.setZero(); NN.setZero();

  for(int i=0; i<3; i++)
   for(int j=0; j<3; j++) 
     GG(i,j)= (0.25/s)*(b[i]*b[j]+c[i]*c[j]);
   
  for(int i=0; i<3; i++)
   for(int j=0; j<3; j++) {
     if(i==j) NN(i,j)= s/6.0;
     else NN(i,j)= s/12.0;
   }   
  return;
}


#endif // _FEM_H

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值