【问题标题】:How can I extract Data(fieldOutputs) which is bigger than my RAM from an Abaqus odb-file using the c++ API如何使用 c++ API 从 Abaqus odb 文件中提取比我的 RAM 大的 Data(fieldOutputs)
【发布时间】:2016-09-26 18:59:14
【问题描述】:

我正在使用 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 可以是矩阵或向量。维度取决于节点数和每个 fieldOutput 的参数数。

我的问题:

上述例程之一是否能够连续加载大于 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 编译器。

【问题讨论】:

    标签: c++ matlab mex abaqus


    【解决方案1】:

    一个字段的输出真的比你的内存大吗?你有超过 10 亿个元素吗?

    我认为您正在运行大量的字段输出并且这样做时内存不足。

    您可能会耗尽内存,因为 Abaqus Odb API 没有正确释放内存(据我观察)。在 C++ API 中有一些未记录的函数可以释放内存,如果我找到它们可以提供。

    即使这样,我也无法让 API 释放内存。我解决了这个问题(打开 Odb -> 读取数据块 -> 关闭 Odb -> 重新打开 odb 并读取下一个数据块) 我的观察是,在内存被正确释放的每个块之后等待 1 或 2 秒会很有帮助。

    因此,将数据块逐块读取到 Matlab(将其保存在 Matlab 中)将是使其工作的一种方法。

    如果您阅读整个字段输出,bulkData 方法当然会更好。

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多