⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skdd.h

📁 这是等参单元的有限元程序
💻 H
字号:
///////////////////////////////////////////////////////////////////////
//
//         skdd函数:根据节点和单元信息计算总体刚度矩阵中非零元素的排布信息,
//         Getstiff,Setstiff函数:根据二维刚度矩阵的行,列号来取对应的一维刚度矩阵中的值
//         Skke函数:  单元刚度矩阵组装程序
//         jd[i]     --表示二维总刚中第i行第i列的元素在一维总刚数组中的序号,
//                        从而建立二维总刚和一维总刚的联系。
//         Ele       --EleNumber*8的存储单元的节点编号的二维数组指针,Ele[i][j]第i行单元的第j个节点编号.
//         NodeNumber--节点总数;
//         ND        --每个节点的自由度个数,对所有节点均相同;
//         EleNumber --单元总数;
//         zk        --因为存储的刚度矩阵长度为jd[jd[0]]+1     zk[0]未用
//         ek        --存放一维按行存储单元刚度数组,长度为16*16;
//         je        --存放单元自由度总体编号数组,长度为 16
//                      如果je[i]=0,这表明单元中不存在第i个自由度
//         NFE       --单元总自由度数
//
////////////////////////////////////////////////////////////////////////////////////////
#ifndef __SKDD_
#define __SKDD_
void skdd(int *jd,int (*Ele)[8],int NodeNumber,int ND,int EleNumber);
void SetStiff(int i,int j,double Value,double *zk,int *jd);
double GetStiff(int i, int j,double *zk,int *jd);
void Skke(double *ek,int *je,int NFE,double *zk,int *jd);

void skdd(int *jd,int (*Ele)[8],int NodeNumber,int ND,int EleNumber)

{  int i,j,k,m,d,jew[8],*Min,*Band;    //定义临时变量
   Min=new int[NodeNumber+1];
   for(i=1;i<=NodeNumber;i++) 
	   Min[i]=NodeNumber;          //Min存放每个节点相连的最小节点号,此处赋初值;
   for(i=0;i<EleNumber;i++)
  {   for(j=0;j<8;j++)  
           jew[j]=Ele[i][j];
       k=jew[0];  
	   for(j=1;j<8;j++)
         if(jew[j]>0) 
			 if(jew[j]<k)
				  k=jew[j];  //寻找第i个单元中的最小节点号;
      for(j=0;j<8;j++)
      {   m=jew[j];
	      if(m>0) 
			  if(k<Min[m])  Min[m]=k;
	  }                            //更新第i个单元内所有节点的相连的最小节点号;
  }                                     //完成对单元的循环,寻找最小节点号;
  Band=new int[ND*NodeNumber+1];                  //为半带宽分配存储空间;

  for(i=1;i<=NodeNumber;i++)                      //完成所有半带宽的计算;
   {
      d=i-Min[i];
     for(j=1;j<=ND;j++)  
		 Band[ND*(i-1)+j]=ND*d+j;
   }
  jd[1]=1;  
  for(i=2;i<=ND*NodeNumber;i++) 
	  jd[i]=jd[i-1]+Band[i];
 jd[0]=0 ;  
 delete[]Min;  
 delete[]Band;
 return;
}

void SetStiff(int i,int j,double Value,double *zk,int *jd)
/* i-要访问的刚度矩阵元素的行号
   j-要访问的刚度矩阵元素的列号
   Value-刚度矩阵元素K[i][j]
*/
{     if(i<j) return;                       //上三角部分 ,不作处理
        if(j<i-jd[i]+jd[i-1]+1) return;        //带宽以外,不作处理
      zk[jd[i]+j-i]=Value;
}  
                                   //设定矩阵元素k(i,j)=Value
double GetStiff(int i, int j,double *zk,int *jd)
{   int ii,jj;
    if(i<j) 
	{  ii=j;  jj=i;} 
	   else { ii=i; jj=j;}    //上三角部分,交换下标
    if(jj<ii-jd[ii]+jd[ii-1]+1) 
		return (0);          //在半带宽以外,返回零值
       else 
		   return (zk[jd[ii]+jj-ii]);
}                                        //返回矩阵元素k(i,j)


//单元刚度矩阵组装程序

void Skke(double *ek,int *je,int NFE,double *zk,int *jd)
 {    
	 int    i,j;
       double Value;
       for(i=0;i<NFE;i++) 
		   if (je[i])  
			   for(j=0;j<NFE;j++)
                  if(je[j])
				  {   Value=GetStiff(je[i],je[j],zk,jd)+ek[i*16+j];
                      SetStiff(je[i],je[j],Value,zk,jd);
				  }  
 }



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -