EXODUS est un fichier de données pour stocker des données pour l'analyse par éléments finis. C'est un format qui peut être utilisé à la fois comme fichier de génération intermédiaire lors du détournement du résultat du calcul dans un autre code et comme format de stockage du résultat du calcul.
Jusqu'à présent, les résultats de calcul pour mon propre FEM étaient sortis au format vtk, mais EXODUS semble être plus réutilisable, donc je migre vers cela.
Apportez le code du référentiel ci-dessous. https://github.com/gsjaardema/seacas#exodus Je pense qu'il n'y a fondamentalement aucun problème avec l'introduction si vous suivez ceci.
Ici, il est supposé que vous extrayez et construisez avec ~ / local.
cd ~
mkdir local
cd local
git clone https://github.com/gsjaardema/seacas.git
cd seacas && export ACCESS=`pwd`
Vous devez préparer NetCDF et HDF5 en tant que bibliothèque tierce (TPL), téléchargez-les donc à partir de ce qui suit. https://www.unidata.ucar.edu/downloads/netcdf/ https://portal.hdfgroup.org/display/support/HDF5%201.12.0
cd TPL/hdf5
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.0/src/hdf5-1.12.0.tar.gz
tar -zxvf ./hdf5-1.12.0.tar.gz
cd hdf5-1.12.0
../runconfigure.sh
cd ../../netcdf
wget https://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-c-4.7.4.tar.gz
tar -zxvf ./netcdf-c-4.7.4.tar.gz
cd netcdf-c-4.7.4/
mkdir build
cd build
sh ../../runcmake.sh
make && make install
cd ../../../../
mkdir build
../cmake-exodus
make && make install
En gros, c'est OK si vous regardez le manuel suivant https://gsjaardema.github.io/seacas/exodusII-new.pdf
À titre d'exemple, le code de sortie d'un maillage d'un cantilever avec des dimensions de 1 x 1 x 10 divisé par 10 éléments hexaèdres à 8 nœuds au format EXODUS est illustré ci-dessous.
#include <exodusII.h>
#include <iostream>
#include <vector>
int main(){
int N;
N = 10; // the length of cantilever
int CPU_word_size, IO_word_size, exoid;
CPU_word_size = sizeof(double);
IO_word_size = 8;
exoid = ex_create("test.exo", //file Name
EX_CLOBBER, //create mode
&CPU_word_size, //CPU float word size in bytes
&IO_word_size); //I/O float word size in bytes
int dim = 3; // dimension
int NoN = 4 + 4 * N; // num of nodes
int NoE = N; // num of elements
int NoEB = 1; // num of element blocks
int NoNS = 0; // num of node sets
int NoSS = 0; // num of side sets
ex_put_init(exoid, "Test", dim, NoN, NoE, NoEB, NoNS, NoSS);
std::vector<double> x(NoN), y(NoN), z(NoN), i2nn(NoN);
char* coord_names[3];
coord_names[0] = "xcoor";
coord_names[1] = "ycoor";
coord_names[2] = "zcoor";
for(int i=0;i<=N;i++){
x[i*4] = 0; y[i*4] = 0; z[i*4]=i; i2nn[i*4] = i*4 + 1;
x[i*4+1] = 1; y[i*4+1] = 0; z[i*4+1]=i; i2nn[i*4+1] = i*4 + 2;
x[i*4+2] = 1; y[i*4+2] = 1; z[i*4+2]=i; i2nn[i*4+2] = i*4 + 3;
x[i*4+3] = 0; y[i*4+3] = 1; z[i*4+3]=i; i2nn[i*4+3] = i*4 + 4;
}
ex_put_coord(exoid, x.data(), y.data(), z.data());
ex_put_coord_names(exoid, coord_names);
ex_put_node_num_map(exoid, i2nn.data());
//for(int i=0;i<NoE;i++)i2nn[i] = i+1;
int NoN_for_EB = NoE; // number of nodes for element block
int NoN_per_Elem = 8; // number of nodes of each element
int ebid = 1; // element block id
ex_put_elem_block(exoid, ebid, "hex", NoN_for_EB, NoN_per_Elem, 0);
std::vector<int> connectivity(NoE * NoN_per_Elem);
std::vector<int> i2en(NoE); // index to element number
for(int i=0; i<NoE; i++){
for(int j=0;j<8;j++){
connectivity[i*8 + j] = i*4 + j +1;
}
i2en[i] = i+1;
}
ex_put_elem_conn(exoid, ebid, connectivity.data());
ex_put_elem_num_map(exoid, i2en.data());
ex_close(exoid);
return 0;
}
Par exemple, vous pouvez compiler comme suit.
g++ main.cpp -I ~/local/seacas/include -L ~/local/seacas/lib -lexodus
En regardant la sortie test.exo avec Paraview, cela ressemble à ce qui suit.
Étant donné que la quantité de nœuds et la quantité d'éléments ne sont pas générées cette fois, le contour sera l'ID d'élément.
Cette fois, nous avons montré l'introduction et le contrôle de fonctionnement du format EXODUS qui peut stocker le résultat de la méthode des éléments finis. Je vous serais reconnaissant si vous pouviez me faire savoir si vous avez un meilleur type de fichier.
c'est tout.
Recommended Posts