Я использую API C ++ для доступа к * .odb файлам. Чтение файла не проблема, если файл не превышает мою оперативную память.
В документации есть две процедуры для чтения данных (в моем случае fieldOutputs) из odb-файла.
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-файл — это база данных, которая может быть представлена в виде древовидной структуры.
Содержит шаги. Каждый шаг содержит кадры, а каждый кадр содержит fieldOutputs.
Эти fieldOutputs могут быть матрицами или векторами. Размерность зависит от количества узлов и количества параметров на fieldOutput.
Способна ли одна из упомянутых подпрограмм загружать файлы больше, чем объем ОЗУ? Если да, я был бы рад получить несколько подсказок.
Документация:
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.
Одно выходное поле действительно больше вашей оперативной памяти? У вас есть> 1 млрд элементов?
Я думаю, что вы работаете с большим количеством выходов и не хватает памяти при этом.
Там вы можете исчерпать память, потому что API Abaqus Odb не освобождает память правильно (на мой взгляд). В C ++ API есть несколько недокументированных функций для освобождения памяти, которые я могу предоставить, если найду их.
Даже с этим я не мог получить API для освобождения памяти. Я обошел эту проблему в (открытие Odb -> прочитать кусок данных -> закрыть Odb -> снова открыть odb и прочитать следующий кусок данных)
Мое наблюдение состояло в том, что было бы полезно подождать 1 или две секунды после каждого фрагмента, чтобы память освобождалась должным образом.
Таким образом, чтение фрагмента данных после фрагмента в Matlab (сохранение его в Matlab) будет способом заставить его работать.
Конечно, массовый подход был бы полезен, если вы прочитали все поле Outputs.
Других решений пока нет …