本文介绍了一个源代码中附带的记录器的二次开发过程,记录器的h和cpp文件是源代码自带的。这次花费了我3天的时间,才实现了记录器的添加。
OPS_Export void * OPS_SumElementForcesRecorder()
中的OPS_GetString()
报错,OPS_SumElementForcesRecorder()
这个函数是不执行的,可以注释掉。#define RECORDER_TAGS_SumElementForceRecorder 22
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;
}
}
这是一个比较简单的记录器二次开发实例,主要帮助我们了解记录器的过程,值得一提的是,使用编译可以帮助我们连接OpenSees软件计算过程。记录器的二次开发的难点是对,希望本文能帮助到学习OpenSees二次开发同志。