如何使用 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.htmhttp://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 方法会更受欢迎。