ファイルから ArrayFire 配列をロードする方法を見つける必要があります。ファイルの形式はix iy iz valで、( ix, iy , iz) は値 val が必要な座標です。C++ の方法で (getline などを使用して) ファイルを開き、行を解析して、インデックスix、iy、izおよび値valを正しく取得します。
ファイルの反復処理を開始する前に、いつものように配列を作成します
af::array af_obj(Lx,Ly,Lz, f32);
次に、反復するときに、次のような行を使用して値を保存します。
af_obj( ix, iy ,iz ) = val
しかし、配列は情報を正しく保存しません。つまり、単純な三次元配列で同じことを行うと、正しい情報が保持されます。
ファイル内の情報は 1 と 0 で構成され、3D 空間を表します。1 は空気領域を表し、0 はソリッド マテリアルを表します。(球体を表現するためのある種の離散化、ポイント全体は、この配列を使用して他の配列(速度フィールドを保持)を乗算するため、固体の場合、速度はゼロ値になります)
私は他の方法を試し、データを 1D 配列に平坦化し、それを配列のコンストラクターに渡しましたが、最良の場合、1 つではなく 3 つの球を回復します (配列のサイズは : Lx = 300 、Ly=Lz です)。 =100 ) しかし、私はやりたいことをすることができません。ファイルに正しいデータが含まれていることは確かです。このファイルを他のコードから生成します(ファイルの形式を変更すると役立つ場合は、変更できます)
読んでくれてありがとう。
編集:
データを保存するには、これを使用します:
std::ofstream file;
file.open("solidRegion.dat");
for( int iz = 0 ; iz < this->Lz; iz++ ){
for( int iy = 0 ; iy < this->Ly; iy++){
for( int ix = 0 ; ix < this->Lx ; ix++){
file << ix << " " << iy << " " << iz << " " << grid[ix][iy][iz] << "\n";
}}}
file.close();
3D 配列グリッドには、ポイント (1 と 0) が含まれており、正しいデータがあることがわかっています。
そしてファイルをロードするには:
std::string line;
af::array af_obj(Lx,Ly,Lz,f32);
while( std::getline(file_h,line ) ){
std::stringstream linestream(line);
int x,y,z, o;
linestream >> x >> y >> z >> o;
af_obj(x,y,z) = o;
object[x][y][z] = o;
}
オブジェクト配列は古典的な c++ 3D 配列 (次元 Lx, Ly , Lz ) であり、データがこの配列 ( object ) に正しく保存されているが ArrayFire オブジェクトには保存されていない場合....理由はわかりません。
編集2:
1D メモリのポインターを使用して、これを試します。
int *h_o;
h_o = new int[Lx*Ly*Lz];
int i = 0;
for ( int k = 0 ; k < Lz ; k++)
for( int ix = 0 ; ix < Lx ; ix++)
for( int j = 0 ; j < Ly ; j++)
{
h_o[i] = object[ix][j][k];
i++;
}
af::array af_obj(Lx, Ly ,Lz , h_o);
3D object[][][] 配列が正しい情報を持っていることを知っている!
しかし、配列が球を表す前に言ったように、ArrayFireオブジェクトaf_objはそうではありません。最良の場合、ArrayFireオブジェクトは3つの球を示します(理由はわかりません)。ネストされた fors の順序が重要です。xyz の考えられるすべての組み合わせを試してみましたが、何も機能しないようです。