我正在使用c++ API访问*。odb文件。读取文件没有问题,除非文件比我的RAM大。
文档中有两个例程用于从odb文件读取数据(在我的例子中是fieldOutputs)。
1。批量数据
odb_FieldOutput& disp = lastFrame.fieldOutputs()["U"];
const odb_SequenceFieldBulkData& seqDispBulkData = disp.bulkDataBlocks();
int numDispBlocks = seqDispBulkData.size();
for (int iblock=0; iblock<numDispBlocks; iblock++) {
const odb_FieldBulkData& bulkData = seqDispBulkData[iblock];
int numNodes = bulkData.length();
int numComp = bulkData.width();
float* data = bulkData.data();
int* nodeLabels = bulkData.nodeLabels();
for (int node=0,pos=0; node<numNodes; node++) {
int nodeLabel = nodeLabels[node];
cout << "Node = " << nodeLabel;
cout << " U = ";
for (int comp=0;comp<numComp;comp++) {
cout << data[pos++] << " ";
}
cout << endl;
}
}
2值const odb_SequenceFieldValue& displacements = lastFrame.fieldOutputs()["U"].values();
int numValues = displacements.size();
int numComp = 0;
for (int i=0; i<numValues; i++) {
const odb_FieldValue val = displacements[i];
cout << "Node = " << val.nodeLabel();
const float* const U = val.data(numComp);
cout << ", U = ";
for (int comp=0;comp<numComp;comp++)
cout << U[comp] << " ";
}
cout << endl;
}
我想做的是从文件中读取数据并将它们保存到mat文件中。
数据形状:
Odb-file是一个可以用树状结构表示的数据库。
包含步骤。每个步骤包含帧,每个帧包含fieldOutputs。这些字段输出可以是矩阵或向量。维度取决于节点的数量和每个字段输出的参数数量。
我的问题:
所提到的例程之一能够依次加载大于RAM的文件吗?如果有,我很乐意得到一些提示。
附加信息:
文档:http://abaqus.software.polimi.it/v6.12/books/ker/default.htm和http://xn--90ajn.xn--p1ai:2080/v6.12/pdf_books/SCRIPT_USER.pdf我使用Abaqus 6.12和visual studio 2010编译器
一个字段的输出真的比你的RAM大吗?你有超过10亿个元素吗?
我认为您正在运行大量的字段输出,并且在这样做时内存不足。
在那里你可以用完内存,因为Abaqus Odb API没有正确释放内存(据我观察)。在c++ API中有一些未记录的函数来释放内存,如果我找到它们,我可以提供。
即使这样,我也不能让API释放内存。我解决了这个问题(打开Odb ->读取数据块->关闭Odb ->重新打开Odb并读取下一个数据块)我的观察是,在每个块被正确释放后等待1或2秒将是有帮助的。
因此读取数据块后块到Matlab(将其保存在Matlab中)将是一种使其工作的方法。
当然,如果您读取整个字段输出,bulkData方法将是有利的。