我正在使用c ++ API来访问* .odb文件。读取文件没问题,除非文件大于我的RAM。
文档中有两个例程可以从odb文件中读取数据(在我的例子中是fieldOutputs)。
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;
}
}
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。 那些fieldOutputs可以是矩阵或向量。维度取决于节点数量和每个fieldOutput的参数数量。
上面提到的一个例程是否能够连续加载大于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编译器。
答案 0 :(得分:0)
单个字段输出是否真的比你的RAM大?你有> 10亿元素?
我认为你正在运行大量的字段输出并且在执行此操作时内存不足。
在那里你可能会耗尽内存,因为Abaqus Odb API没有正确释放内存(根据我的观察)。有一些未记录的函数可以在C ++ API中释放内存,如果我找到它们可以提供。
即便如此,我也无法获得API来释放内存。我解决了这个问题(打开Odb - &gt;读取一大块数据 - &gt;关闭Odb - &gt;重新打开odb并读取下一个数据块) 我的观察是,在每个块之后等待1到2秒才能正确释放内存。
因此,将数据块读取到Matlab之后(将其保存在Matlab中)将是一种使其工作的方法。
当然,如果你读取整个字段的输出,那么bulkData aproach会很有用。