声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1994|回复: 1

[经典算法] 进行结构响应分析的Wilson法

[复制链接]
发表于 2006-11-21 10:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
进行结构响应分析的Wilson法,是直接积分的基本算法之一,相信进行有限元动力分析编程的诸位都能用上(这是vc代码)

  1. void CGlobalElement::WilsonMethod()
  2. {
  3.         int loop,loop1,iBuf;
  4.         int nTimeStep,nLoadTimeStep,nGroundAccData,nTotalDOF,nFreeDOF;
  5.         double *adGroundAcc;
  6.         double dBuf,dBuf1,dAlfa,dPsi,da,da1,da2,da3,da4,da5;
  7.         CSparseMatrix smatMass,smatDK;
  8.         CMatrix matDisp,matVec,matAcc,matBuf,matBuf1;
  9.         ofstream fout;
  10.         ifstream fin;

  11.         if(m_apEle.GetSize()==0) return;
  12.         m_bFlagDynamicAnalyzed=true;

  13.         nTotalDOF=m_Node.GetTotalDOF();
  14.         nFreeDOF=m_Node.GetFreeDOF();

  15.         matDisp.Realloc(nFreeDOF,1);
  16.         matVec.Realloc(nFreeDOF,1);
  17.         matAcc.Realloc(nFreeDOF,1);
  18.         matBuf.Realloc(nFreeDOF,1);
  19.         matBuf1.Realloc(nFreeDOF,1);

  20.         GetMassMatrix(smatMass);
  21.         m_smatGK.ElementBufRealloc();
  22.         m_smatGK=0.0;
  23.         for(loop=0;loop<m_nEle;loop++){
  24.                 m_apEle[loop]->StiffAssemble(m_smatGK);
  25.         }

  26.         dBuf=(m_adEigen[0]*m_adEigen[0]-m_adEigen[1]*m_adEigen[1]);
  27.         dAlfa=2.0*m_adEigen[0]*m_adEigen[1]*(m_adDampRatio[1]*m_adEigen[0]
  28.                 -m_adDampRatio[0]*m_adEigen[1])/dBuf;
  29.         dPsi=2.0*(m_adDampRatio[0]*m_adEigen[0]-m_adDampRatio[1]*m_adEigen[1])/dBuf;
  30.         dBuf1=m_dWilsonXita*m_dTimeStep;
  31.         dBuf=1.0/dBuf1;
  32.         da=3.0*dBuf*(2.0*dBuf+dAlfa);
  33.         da1=1.0+3.0*dBuf*dPsi;
  34.         da2=3.0+dBuf1*dAlfa/2.0;
  35.         da3=dBuf1*dPsi/2.0;
  36.         da4=6.0*dBuf+3.0*dAlfa;
  37.         da5=3.0*dPsi;
  38.        
  39.         nTimeStep=(int)(m_dResponseDuration/m_dTimeStep);
  40.         nLoadTimeStep=(int)(m_dLoadDuration/m_dTimeStep);

  41.         smatDK=m_smatGK;
  42.         smatDK*=da1;
  43.         smatMass*=da;
  44.         smatDK+=smatMass;
  45.         dBuf=1/da;
  46.         smatMass*=dBuf;

  47.         matDisp=0.0;matVec=0.0;matAcc=0.0;
  48.         fout.open("dydata.tmp",ios::binary);
  49.         if(m_iDynamicLoadType==DYNAMIC_INSTANT_LOAD){
  50.                 m_iCurLoadGroup=0;
  51.                 GetLoadVector();
  52.                 for(loop=0;loop<nTimeStep;loop++){
  53.                         matBuf=matVec*da4+matAcc*da2;
  54.                         matBuf=smatMass*matBuf;
  55.                         matBuf1=matVec*da5+matAcc*da3;
  56.                         matBuf1=m_smatGK*matBuf1;
  57.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  58.                                 m_adDisp[loop1]=matBuf(loop1,0)+matBuf1(loop1,0);
  59.                         if(loop==0){
  60.                                 for(loop1=0;loop1<nFreeDOF;loop1++)
  61.                                         m_adDisp[loop1]+=m_dWilsonXita*m_adLoadVector[loop1];
  62.                         }
  63.                         else if(loop==nLoadTimeStep){
  64.                                 for(loop1=0;loop1<nFreeDOF;loop1++)
  65.                                         m_adDisp[loop1]-=m_dWilsonXita*m_adLoadVector[loop1];
  66.                         }

  67.                         if(!smatDK.LdltSolve(nFreeDOF,m_adDisp)) return;
  68.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  69.                                 matBuf(loop1,0)=m_adDisp[loop1];
  70.                         dBuf=6.0/(m_dWilsonXita*m_dWilsonXita*m_dWilsonXita*m_dTimeStep*m_dTimeStep);
  71.                         dBuf1=-6.0/(m_dWilsonXita*m_dWilsonXita*m_dTimeStep);
  72.                         matBuf=matBuf*dBuf+matVec*dBuf1+matAcc*(1.0-3.0/m_dWilsonXita);
  73.                         matDisp+=matVec*m_dTimeStep+(matBuf+matAcc*2.0)*(m_dTimeStep*m_dTimeStep/6.0);
  74.                         matVec+=(matBuf+matAcc)*(m_dTimeStep/2.0);
  75.                         matAcc=matBuf;
  76.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  77.                                 m_adDisp[loop1]=matDisp(loop1,0);
  78.                         fout.write((char*)m_adDisp,sizeof(double)*nFreeDOF);
  79.                 }
  80.         }
  81.         else{
  82.                 fin.open(m_sGroundAccFile,ios::nocreate);
  83.                 if(!fin.good()){
  84.                         AfxMessageBox("Can't open seismic acceleration file", MB_OK, 0 );
  85.                         return;
  86.                 }
  87.                 dBuf1=0.0;
  88.                 nGroundAccData=0;
  89.                 while(!fin.eof()){
  90.                         fin>>dBuf;
  91.                         nGroundAccData++;
  92.                         if(dBuf1<fabs(dBuf)) dBuf1=fabs(dBuf);
  93.                 }
  94.                 fin.close();
  95.                 dBuf=m_dPeakAcc/dBuf1;
  96.                 adGroundAcc=new double [nGroundAccData];
  97.                 fin.open(m_sGroundAccFile,ios::nocreate);
  98.                 adGroundAcc[0]=0.0;
  99.                 for(loop=1;loop<nGroundAccData;loop++){
  100.                         fin>>adGroundAcc[loop];
  101.                         adGroundAcc[loop]*=dBuf;
  102.                 }
  103.                 fin.close();

  104.                 for(loop=0;loop<nTimeStep;loop++){
  105.                         matBuf=matVec*da4+matAcc*da2;
  106.                         if(loop<nGroundAccData){
  107.                                 for(loop1=0;loop1<m_nNode;loop1++){
  108.                                         iBuf=m_Node.GetXDOFIndex(loop1);
  109.                                         if(iBuf<nFreeDOF){
  110.                                                 matBuf(iBuf,0)+=m_dWilsonXita*(adGroundAcc[loop]-adGroundAcc[loop+1]);
  111.                                         }
  112.                                 }
  113.                         }
  114.                         matBuf=smatMass*matBuf;
  115.                         matBuf1=matVec*da5+matAcc*da3;
  116.                         matBuf1=m_smatGK*matBuf1;
  117.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  118.                                 m_adDisp[loop1]=matBuf(loop1,0)+matBuf1(loop1,0);
  119.                        
  120.                         if(!smatDK.LdltSolve(nFreeDOF,m_adDisp)) return;
  121.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  122.                                 matBuf(loop1,0)=m_adDisp[loop1];
  123.                         dBuf=6.0/(m_dWilsonXita*m_dWilsonXita*m_dWilsonXita*m_dTimeStep*m_dTimeStep);
  124.                         dBuf1=-6.0/(m_dWilsonXita*m_dWilsonXita*m_dTimeStep);
  125.                         matBuf=matBuf*dBuf+matVec*dBuf1+matAcc*(1.0-3.0/m_dWilsonXita);
  126.                         matDisp+=matVec*m_dTimeStep+(matBuf+matAcc*2.0)*(m_dTimeStep*m_dTimeStep/6.0);
  127.                         matVec+=(matBuf+matAcc)*(m_dTimeStep/2.0);
  128.                         matAcc=matBuf;
  129.                         for(loop1=0;loop1<nFreeDOF;loop1++)
  130.                                 m_adDisp[loop1]=matDisp(loop1,0);
  131.                         fout.write((char*)m_adDisp,sizeof(double)*nFreeDOF);
  132.                 }
  133.                 delete adGroundAcc;
  134.         }
  135.         fout.close();
  136. }
复制代码
回复
分享到:

使用道具 举报

发表于 2008-3-28 14:13 | 显示全部楼层
正需要啊,
谢谢
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 17:16 , Processed in 0.058529 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表