我如何使用c++ API从Abaqus odb文件中提取比我的RAM大的数据(fieldOutputs)



我正在使用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方法将是有利的。

最新更新