OpenSees開發(fā)(二)源碼分析

上傳人:飛*** 文檔編號:36182423 上傳時(shí)間:2021-10-29 格式:DOCX 頁數(shù):15 大小:73KB
收藏 版權(quán)申訴 舉報(bào) 下載
OpenSees開發(fā)(二)源碼分析_第1頁
第1頁 / 共15頁
OpenSees開發(fā)(二)源碼分析_第2頁
第2頁 / 共15頁
OpenSees開發(fā)(二)源碼分析_第3頁
第3頁 / 共15頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《OpenSees開發(fā)(二)源碼分析》由會(huì)員分享,可在線閱讀,更多相關(guān)《OpenSees開發(fā)(二)源碼分析(15頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、OpenSees 開發(fā)(二)源碼分析這是一個(gè)平面桁架靜力分析算例,代碼位于OpenSees2.3.0EXAMPLESExample1main.cpp 這里先給 出原始源代碼:cpp view plain copy / standard C+ includes#include<stdlib.h> #include <OPS_Globals.h>#include <StandardStream.h> #include <ArrayOfTaggedObjects.h> / includes for the domain classes #include

2、 <Domain.h> #include <Node.h> #include <Truss.h> #include <ElasticMaterial.h> #include <SP_Constraint.h>#include <LoadPattern.h> #include <LinearSeries.h> #include <NodalLoad.h>/ includes for the analysis classes #include <StaticAnalysis.h> #incl

3、ude <AnalysisModel.h>#include <Linear.h> #include<PenaltyConstraintHandler.h> #include <DOF_Numberer.h> #include <RCM.h>#include <LoadControl.h> #include <BandSPDLinSOE.h> #include<BandSPDLinLapackSolver.h>/ init the globalvariabled defined in OPS_Glob

4、als.h StandardStream sserr; OPS_Stream *opserrPtr = &sserr;doubleops_Dt = 0;/ Domain*ops_TheActiveDomain = 0;Element *ops_TheActiveElement = 0;/main routine int main(int argc, char *argv) / now create a domain and a modelbuilder/ andbuild the model /Domain *theDomain =new Domain();/ create the n

5、odes usingconstructor:/ Node(tag, ndof, crd1, crd2)/ and then add them to the domainNode*node1 = new Node(1, 2,0.0,0.0);Node*node2 = new Node(2, 2, 144.0,0.0);Node *node3= new Node(3, 2, 168.0,0.0);new Node(4, 2,72.0, 96.0);theDomain->addNode(node1);theDomain->addNode(node2);theDomain->addN

6、ode(node3);theDomain->addNode(node4);elastic material using constriuctor:Node *node4 =/ create an/ElasticMaterialModel(tag, E)UniaxialMaterial*theMaterial = new ElasticMaterial(1, 3000);/create the truss elements using constructor:/Truss(tag, dim, nd1, nd2, Material &,A)/ andthen add them to

7、the domainTruss *truss1 =new Truss(1, 2, 1, 4, *theMaterial, 10.0);Truss*truss2 = new Truss(2, 2, 2, 4, *theMaterial, 5.0);Truss *truss3 = new Truss(3, 2, 3, 4, *theMaterial, 5.0);theDomain->addElement(truss1);theDomain->addElement(truss2);theDomain->addElement(truss3);/create the single-po

8、int constraint objects using constructor:/ SP_Constraint(tag, nodeTag, dofID, value)and then add them to the domainSP_Constraint *sp1 = new SP_Constraint(1, 1, 0, 0.0);SP_Constraint *sp2 = new SP_Constraint(2, 1, 1, 0.0);SP_Constraint *sp3 = new SP_Constraint(3, 2, 0, 0.0);SP_Constraint *sp4 = new S

9、P_Constraint(4, 2, 1, 0.0);SP_Constraint *sp5 = new SP_Constraint(5, 3, 0, 0.0);SP_Constraint *sp6 = new SP_Constraint(6, 3, 1, 0.0);theDomain->addSP_Constraint(sp1);theDomain->addSP_Constraint(sp2);theDomain->addSP_Constraint(sp3);theDomain->addSP_Constraint(sp4);/theDomain->addSP_Co

10、nstraint(sp5);theDomain->addSP_Constraint(sp6);construct a linear time series object using constructor:/ LinearSeries()TimeSeries *theSeries= new LinearSeries();/ construct a loadpattren using constructor:/ LoadPattern(tag)/ and then set its TimeSeries and add it to the domain LoadPattern *theLoa

11、dPattern = new LoadPattern(1);theLoadPattern->setTimeSeries(theSeries); theDomain->addLoadPattern(theLoadPattern); / construct a nodal load using constructor:/NodalLoad(tag, nodeID, Vector &)/ firstconstruct a Vector of size 2 and set the values NOTE C INDEXING / then construct the load an

12、d add it to the domainVector theLoadValues(2);theLoadValues(0) = 100.0;theLoadValues(1) =-50.0; NodalLoad *theLoad = new NodalLoad(1, 4, theLoadValues);theDomain->addNodalLoad(theLoad, 1);/create an Analysis object to perform a static analysis of the model / - constructs:/ AnalysisModel oftype An

13、alysisModel,/EquiSolnAlgo of typeLinear/StaticIntegrator of type LoadControl/ ConstraintHandler of type Penalty/DOFNumberer which uses RCM/ LinearSOEof type Band SPD objectAnalysisModel();= new Linear();/ and then the StaticAnalysisAnalysisModelEquiSolnAlgoStaticIntegratornew LoadControl(1.0, 1, 1.0

14、, 1.0);*theModel = new*theSolnAlgo*theIntegrator =ConstraintHandlerRCMDOF_Numberer*theHandler = new PenaltyConstraintHandler(1.0e8,1.0e8);*theRCM = new RCM();*theNumberer = newDOF_Numberer(*theRCM);BandSPDLinSolver*theSolver = new BandSPDLinLapackSolver();LinearSOE*theSOE = newBandSPDLinSOE(*theSolv

15、er);StaticAnalysis theAnalysis(*theDomain,*theHandler,*theNumberer,*theModel,*theSolnAlgo,*theSOE,*theIntegrator);/perform the analysis & print out the results for thedomain int numSteps = 1;theAnalysis.analyze(numSteps);opserr <<*theDomain;exit(0); 接下去一步一步解釋代碼:cpp view plain copy / 創(chuàng)建一個(gè)有限

16、元模型Domain *theDomain = new Domain();cpp view plain copy / 創(chuàng)建 4 個(gè)節(jié)點(diǎn), 詳細(xì)見說明 1 Node *node1 = new Node(1, 2,0.0,0.0); Node *node2 =new Node(2, 2, 144.0,0.0); Node *node3 = newNode(3, 2, 168.0,0.0); Node *node4 = new Node(4,2, 72.0, 96.0);說明 1 : Node 構(gòu)造函數(shù)位于 OpenSees2.3.0SRCdomainnodeNode.cpp源碼定義如下:*Node:

17、Node(int tag, int ndof, double Crd1, double Crd2):DomainComponent(tag,NOD_TAG_Node),numberDOF(ndof), theDOF_GroupPtr(0),Crd(0),。Crd = new Vector(2);(*Crd)(0) = Crd1;(*Crd)(1) = Crd2;。*參數(shù) tag 為該節(jié)點(diǎn)的標(biāo)簽,指定給基類 :DomainComponent(tag,NOD_TAG_Node), NOD_TAG_Node 是一個(gè)枚舉值,表明該DomainComponent 對象是一個(gè)節(jié)點(diǎn)類型;ndof 該節(jié)點(diǎn)的自

18、由度,本例中,節(jié)點(diǎn)都為兩個(gè)自由度;Crd1, Crd2 為該 2 維節(jié)點(diǎn)的坐標(biāo),賦于成員變量Crd ,這是一個(gè)類數(shù)組的數(shù)據(jù)類型,創(chuàng)建了一個(gè)含該點(diǎn)坐標(biāo)信息的數(shù)組。cpp view plain copy / 將 4 個(gè)節(jié)點(diǎn)對象加入有限元模型中/ 如果兩個(gè) node 對象 tag 相同,則會(huì)返回失敗theDomain->addNode(node1);theDomain->addNode(node2);theDomain->addNode(node3);theDomain->addNode(node4); cpp view plain copy / 創(chuàng)建一個(gè)彈性材料, 見說明

19、2 UniaxialMaterial *theMaterial = new ElasticMaterial(1, 3000); 說明 2 :創(chuàng)建材料對象*UniaxialMaterial *theMaterial = newElasticMaterial(1,3000);*UniaxialMaterial 類官方說明:http:/opensees.berkeley.edu/OpenSees/api/doxygen2/html/classElasticMaterial.html其中, ElasticMaterial 為 UniaxialMaterial 派生類意為理想彈性材料http:/open

20、sees.berkeley.edu/wiki/index.php/Elastic_Uniaxial_Material構(gòu)造函數(shù)申明:*ElasticMaterial(int tag, double E, double eta =0.0);*實(shí)現(xiàn):*ElasticMaterial:ElasticMaterial(int tag, double e, doubleet):UniaxialMaterial(tag,MAT_TAG_ElasticMaterial),trialStrain(0.0), trialStrainRate(0.0),E(e), eta(et), parameterID(0)*其

21、中,第一個(gè)參數(shù)tag 為標(biāo)簽,傳遞給基類構(gòu)造函數(shù), e 為彈性模型, et 為材料阻尼比, 默認(rèn)為 0.cpp view plain copy/ 創(chuàng)建一個(gè)工況,編號為 1 ,暫時(shí)未知 LoadPattern*theLoadPattern = new LoadPattern(1);theDomain->addLoadPattern(theLoadPattern);/ 暫時(shí)未知這句話什么意思theLoadPattern->setTimeSeries(new LinearSeries();/ 創(chuàng)建一個(gè)節(jié)點(diǎn)荷載向量Vector theLoadValues(2);theLoadValues(

22、0) = 100.0; theLoadValues(1) = -50.0;/ 第一個(gè)參數(shù)tag 標(biāo)簽,第二個(gè)參數(shù)表明施加點(diǎn)荷載的節(jié)點(diǎn)tag ,第三個(gè)參數(shù)是一個(gè)向量,表明在第一維度施加 100 個(gè)單位力,第二維度施加反方向 50 單位力 NodalLoad*theLoad = new NodalLoad(1, 4, theLoadValues);/ 將/ 如果NodalLoad 對象加入模型, 1 表示加入的工況編號theDomain->addNodalLoad(theLoad, 1);new NodalLoad 后的節(jié)點(diǎn)編號未在模型中找到,返回失敗/ 如果 addNodalLoad 第

23、2 個(gè)參數(shù)所表示的工況編號不存在,返回失敗這里為了避免內(nèi)存泄漏,也為了使代碼的封裝性更強(qiáng),我更改了一部分代碼:cpp view plain copy AnalysisModel*theModel = newAnalysisModel(); EquiSolnAlgo *theSolnAlgo = new Linear(); StaticIntegrator *theIntegrator = newLoadControl(1.0, 1, 1.0, 1.0); ConstraintHandler*theHandler = new PenaltyConstraintHandler(1.0e8,1.0e

24、8);RCM*theRCM = new RCM();DOF_Numberer *theNumberer = newDOF_Numberer(*theRCM);BandSPDLinSolver*theSolver = new BandSPDLinLapackSolver();LinearSOE*theSOE = newBandSPDLinSOE(*theSolver);StaticAnalysistheAnalysis(*theDomain, *theHandler,*theNumberer, *theModel, *theSolnAlgo,*theSOE, *theIntegrator); 改

25、為:cpp view plain copy / 分析對象封裝 structMyStaticAnalysis : public StaticAnalysisConstraintHandler *pConstraintHandler;DOFNumberer*pDOF_Numberer;AnalysisModel*pAnalysisModel;EquiSolnAlgo*pEquiSolnAlgo;LinearSOE*pLinearSOE;StaticIntegrator*pStaticIntegrator;MyStaticAnalysis(Domain *theDomain) :StaticAnal

26、ysis(*theDomain,*(pConstraintHandler = newPenaltyConstraintHandler(1.0e8,1.0e8),*(pDOF_Numberer = new DOF_Numberer(*(new RCM(),*(pAnalysisModel = new AnalysisModel(),*(pEquiSolnAlgo = new Linear(),*(pLinearSOE= new BandSPDLinSOE(*(newBandSPDLinLapackSolver(),*(pStaticIntegrator = new LoadControl(1.0

27、, 1, 1.0, 1.0) MyStaticAnalysis()delete pConstraintHandler;delete pLinearSOE; ;delete pDOF_Numberer;delete pAnalysisModel;delete pEquiSolnAlgo;delete pStaticIntegrator;cpp view plain copy / 實(shí)例化分析模型對象MyStaticAnalysis &theAnalysis = *(newMyStaticAnalysis(theDomain); / perform the analysis& pri

28、nt out the results for the domain int numSteps =1; theAnalysis.analyze(numSteps); / 釋放分析對象delete &theAnalysis; / 模型信息打印 opserr<< *theDomain;cpp view plain copy / 查看 4 節(jié)點(diǎn)兩個(gè)自由度上的位移Vector const &disp4node = theDomain->getNode(4)->getDisp();printf(x4: %lf,z4: %lfn, disp4node0, disp4n

29、ode1);/ 查看 3 個(gè)桁架單元的軸力 Information trussInfo; for(int i=0; i<3; +i) Truss *pTruss = (Truss*)theDomain->getElement(i+1);pTruss->getResponse(2, trussInfo);printf(N%d: %lfn, i+1, trussInfo.theDouble); /Domain 類的析構(gòu)會(huì)釋放加入domain 的所有元素, 所以 node之類的對象不用單獨(dú)析構(gòu) delete theDomain; 編譯 運(yùn)行屏幕輸出:第一自由度位移 0.530094 ,第二自由 度位移 -0.177894桿件 1 軸力: 43.94桿件2 軸力:-57.55桿件3 軸力:-55.31 與 sap2000 計(jì)算結(jié)果一致: sap2000模型文件*SDB(v14)和* s2k文件,及修改后的源文件first.cpp 下載:

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!