当前位置: 首页 > 工具软件 > OpenSees > 使用案例 >

OpenSees二次开发实例02

钮轩昂
2023-12-01

前言

本文介绍了一个源代码中附带的记录器的二次开发过程,记录器的h和cpp文件是源代码自带的。这次花费了我3天的时间,才实现了记录器的添加。

过程

  1. 本记录器名字为SumElementForcesRecorder
  2. 在recorder项目下添加h文件和cpp文件,这里编译时可能会出现cpp文件中的OPS_Export void * OPS_SumElementForcesRecorder()中的OPS_GetString() 报错,OPS_SumElementForcesRecorder()这个函数是不执行的,可以注释掉。
  3. 在classTag.h类中添加新记录器编号,使其能被识别,格式如下:#define RECORDER_TAGS_SumElementForceRecorder 22
  4. 修改recorder项目中的TclRecorderCommands.cpp:首先包含新记录器的头文件,格式为: #include <SumElementForcesRecorder.h>,然后修改其中的TclCreatRecorder()函数,在其中添加该记录器的实例化过程,代码如下:
else if ((strcmp(argv[1], "SumElementForcesRecorder") == 0))
{
		 int numEle = 0;
		 int endEleIDs = 2;
		 bool echoTime = false;
		 int loc = endEleIDs;
		 int flags = 0;
		 int eleData = 0;
		 outputMode eMode = STANDARD_STREAM;
		 ID *eleIDs = 0;
		 int precision = 6;
		 const char* inetAddr = 0;
		 int inetPort;
		 bool closeOnWrite = false;
		 int writeBufferSize = 0;
		 bool doScientific = false;
		 ID* specificIndices = 0;
		 
		 while (flags == 0 && loc < argc)			
		 {
			 if (strcmp(argv[loc],"-ele")==0)
			 {
				 if (argc<loc+1)
				 {
					 opserr<<"WARNING recorder SumElementForcesRecorder .. -ele tag1?.. - no ele tags specified\n";
					return TCL_ERROR;
				 }
				 loc++;
				 int eleTag;
				 eleIDs = new ID(0, 32);
				 while (loc < argc && Tcl_GetInt(interp, argv[loc],&eleTag)==TCL_OK)	
				 {
					 (*eleIDs)[numEle] = eleTag;
					 numEle++;
					 loc++;	
				 }
				 Tcl_ResetResult(interp);
				 //if (strcmp(argv[loc],"all")==0)
				 //{
					// eleIDs = 0;
					// loc++;
				 //}	 
			 }
			 else if ((strcmp(argv[loc],"-time")==0)||(strcmp(argv[loc],"-load")==0))
			 {
				 echoTime = true;
				 loc++;
			 }
			 else if (strcmp(argv[loc],"-file")==0)
			 {
				 fileName = argv[loc + 1];
				 eMode = DATA_STREAM;
				 const char* pwd = getInterpPWD(interp);
				 
				 simulationInfo.addOutputFile(fileName, pwd);
				 loc += 2;
				 if (strcmp(argv[loc],"-xml")==0)
				 {
					 eMode = XML_STREAM;
					 loc += 1;
				 }
			 }
			 else
			 {
				 eleData = loc;
				 flags = 1;  //表示把所有的可能项都遍历了一边
			 }
		 }
		 if (eMode==DATA_STREAM && fileName!=0)
		 {
			 theOutputStream = new DataFileStream(fileName, OVERWRITE, 2, 0, closeOnWrite, precision, doScientific);
		 }
		 else if (eMode == XML_STREAM && fileName != 0)
		 {
			 theOutputStream = new XmlFileStream(fileName);
		 }
		 theOutputStream->setPrecision(precision);

		 (*theRecorder) = new SumElementForcesRecorder(*eleIDs, echoTime, theOutputStream);
		 if (eleIDs!=0)
		 {
			 delete eleIDs;
		 }
	 }
  1. 然后生成可执行文件,并且运行example.tcl文件,可以看到使用新记录器输出的结果。到此为止,一个简单的记录器二次开发完成。

结语

这是一个比较简单的记录器二次开发实例,主要帮助我们了解记录器的过程,值得一提的是,使用编译可以帮助我们连接OpenSees软件计算过程。记录器的二次开发的难点是对,希望本文能帮助到学习OpenSees二次开发同志。

 类似资料: