如何使用 c++ API 从 Abaqus odb 文件中提取大于我的 RAM 的数据(fieldOutputs)
How can I extract Data(fieldOutputs) which is bigger than my RAM from an Abaqus odb-file using the c++ API
我正在使用 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。
这些 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 或两秒会很有帮助。
因此,将一个又一个数据块读取到 Matlab(将其保存在 Matlab 中)将是使其正常工作的一种方式。
当然,如果您阅读整个字段输出,bulkData 方法会更受欢迎。
我正在使用 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。 这些 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 或两秒会很有帮助。
因此,将一个又一个数据块读取到 Matlab(将其保存在 Matlab 中)将是使其正常工作的一种方式。
当然,如果您阅读整个字段输出,bulkData 方法会更受欢迎。