Fortran Coder

标题: 请教一个温度在网格上分配的算法 [打印本页]

作者: 半个月亮    时间: 2014-12-20 13:58
标题: 请教一个温度在网格上分配的算法
如图所示,将单元所得温度值分配到1-9节点上,其中:
节点1379 分别为单元1-4温度值;节点2为单元12的平均值;节点4为单元13的平均值;节点6为单元24的平均值;节点8为单元34的平均值;
节点5为单元1234的平均值;
请教一下,下面的算法哪里有问题?



算法伪代码:
[Fortran] 纯文本查看 复制代码
tem = [6 12 24 36]!单元温度
NJoints = 6 !节点数
NElems = 4 !单元数
NJE = 4      !每个单元节点数
Elems = [1 2 5 4;
                2 3 6 5;
                4 5 8 7;
                5 6 9 8!单元节点构造
node_tem = zeros(NJoints,1)
do k = 1:NJoints
        t = 0;
        ne = 0;
     do iel = 1:NElems
         do jel =1: NJE
             if  Elems(iel,jel) == k
                 ne = ne+1;
                 t = t + tem(iel);
             end
         enddo
     enddo
    node_tem = t/ne;
enddo



作者: 楚香饭    时间: 2014-12-20 16:00
你这算法有点罗嗦,还不如分情况填呢。

[Fortran] 纯文本查看 复制代码
Module MeshDistribution_Mod
  Implicit None
contains
  Function MeshDistribution( r )
    Real , Intent( IN ) :: r(:,:)
    Real :: MeshDistribution(size(r,dim=1)+1,size(r,dim=2)+1)
    Integer :: n , m , i , j
    MeshDistribution = 0.0
    n = size(r,dim=1)+1
    m = size(r,dim=2)+1
    MeshDistribution( 1 , 1 ) = r(1,1)
    MeshDistribution( 1 , m ) = r(1,m-1)
    MeshDistribution( n , 1 ) = r(n-1,1)
    MeshDistribution( n , m ) = r(n-1,m-1)
    Do i = 2 , n-1
      MeshDistribution( i , 1 ) = sum(r(i-1:i,1))/2.0
      Do j = 2 , m-1
        MeshDistribution( i , j ) = sum(r(i-1:i,j-1:j))/4.0
      End Do
      MeshDistribution( i , m ) = sum(r(i-1:i,m-1))/2.0
    End Do
    Do j = 2 , m-1
      MeshDistribution( 1 , j ) = sum(r(1,j-1:j))/2.0
      MeshDistribution( n , j ) = sum(r(n-1,j-1:j))/2.0
    End Do
  End Function MeshDistribution
End Module MeshDistribution_Mod

Program www_fcode_cn
  Use MeshDistribution_Mod  
  Implicit None
  real :: v(4,3) = reshape( (/ &
          3,5,6,0, &
          8,3,5,4, &
          8,6,8,1  /) , (/4,3/) )
  write(*,'(4(5f5.2,/))') MeshDistribution( v )
End Program www_fcode_cn

作者: 珊瑚虫    时间: 2014-12-20 20:42
建议参照有限元后处理应力磨平操作进行计算,即对每个单元进行循环,循环的过程中累积节点的温度,并且记录每个节点所在的单元数,最后用累积温度除以每个节点所在的单元数即可:
do ie=1,ne       !单元总数循环
do inode=1,nd  !每个单元的节点数
T(ELEMS(inode.ie))=T(ELEMS(inode.ie))+每个单元计算出来的节点温度  !累积单元节点温度
nn(ELEMS(inode.ie))=nn(ELEMS(inode.ie))+1                                    !累积每个节点所在的单元数
enddo
enddo
! 再平均
T(1:NNODE)=T(1:NNODE)/NN(1:NNODE)





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2