From e0aafef1e3fe5d5812926b8a3d51498447f2564f Mon Sep 17 00:00:00 2001 From: Cristian C Lalescu <Cristian.Lalescu@ds.mpg.de> Date: Tue, 19 Nov 2019 16:57:52 +0100 Subject: [PATCH] bugfix: write_filtered correct for vectors and tensors --- TurTLE/test/test_write_filtered.py | 14 +++- cpp/field.cpp | 17 +++-- cpp/full_code/write_filtered_test.cpp | 92 +++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/TurTLE/test/test_write_filtered.py b/TurTLE/test/test_write_filtered.py index 6a484907..b43fda32 100644 --- a/TurTLE/test/test_write_filtered.py +++ b/TurTLE/test/test_write_filtered.py @@ -24,7 +24,19 @@ def main(): df = h5py.File('data_for_write_filtered.h5', 'r') bla0 = df['scal_field_full/complex/0'][:, 0] bla1 = df['scal_field_z0slice/complex/0'][...] - assert(np.max(np.abs(bla1 - bla0)) < 1e-5) + max_dist = np.max(np.abs(bla1 - bla0)) + print('maximum distance for scalar is ', max_dist) + assert(max_dist < 1e-5) + bla0 = df['vec_field_full/complex/0'][:, 0] + bla1 = df['vec_field_z0slice/complex/0'][...] + max_dist = np.max(np.abs(bla1 - bla0)) + print('maximum distance for vector is ', max_dist) + assert(max_dist < 1e-5) + bla0 = df['tens_field_full/complex/0'][:, 0] + bla1 = df['tens_field_z0slice/complex/0'][...] + max_dist = np.max(np.abs(bla1 - bla0)) + print('maximum distance for tensor is ', max_dist) + assert(max_dist < 1e-5) print('SUCCESS!!! z=0 slice agrees between different datasets') return None diff --git a/cpp/field.cpp b/cpp/field.cpp index 7303d332..04de2b0c 100644 --- a/cpp/field.cpp +++ b/cpp/field.cpp @@ -672,12 +672,9 @@ int field<rnumber, be, fc>::write_filtered( } // these are dimensions of dataset, needed // to create dataset - //dims[0] = nz; dims[0] = ny; dims[1] = nz; dims[2] = nx/2+1; - if (nz == 1) - dims[1] = nx/2+1; /* open/create data set */ if (!H5Lexists(file_id, field_name.c_str(), H5P_DEFAULT)) @@ -702,10 +699,16 @@ int field<rnumber, be, fc>::write_filtered( else { if (nz == 1) + { + hsize_t temp_dims[ndim(fc)-1]; + temp_dims[0] = dims[0]; + for (unsigned int i=1; i<ndim(fc)-1; i++) + temp_dims[i] = dims[i+1]; fspace = H5Screate_simple( ndim(fc)-1, - dims, + temp_dims, NULL); + } else fspace = H5Screate_simple( ndim(fc), @@ -728,7 +731,8 @@ int field<rnumber, be, fc>::write_filtered( { assert(((unsigned int)(ndims_fspace)) == ndim(fc)-1); assert(dims[0] == fdims[0]); - assert(dims[1] == fdims[1]); + for (unsigned int i=1; i<ndim(fc)-1; i++) + assert(dims[i+1] == fdims[i]); } else { @@ -830,7 +834,8 @@ int field<rnumber, be, fc>::write_filtered( //now write data mspace = H5Screate_simple(ndim(fc), memshape, NULL); H5Sselect_hyperslab(mspace, H5S_SELECT_SET, memoffset, NULL, count, NULL); - count[1] = nx/2+1; + for (unsigned int i=1; i<ndim(fc)-1; i++) + count[i] = count[i+1]; H5Sselect_hyperslab(fspace, H5S_SELECT_SET, offset, NULL, count, NULL); H5Dwrite(dset_id, this->cnumber_H5T, mspace, fspace, H5P_DEFAULT, this->data); H5Sclose(mspace); diff --git a/cpp/full_code/write_filtered_test.cpp b/cpp/full_code/write_filtered_test.cpp index fa6e05c3..3e270794 100644 --- a/cpp/full_code/write_filtered_test.cpp +++ b/cpp/full_code/write_filtered_test.cpp @@ -110,6 +110,98 @@ int write_filtered_test<rnumber>::do_work(void) // deallocate delete scal_field; + + // allocate + field<rnumber, FFTW, THREE> *vec_field = new field<rnumber, FFTW, THREE>( + this->nx, this->ny, this->nz, + this->comm, + FFTW_ESTIMATE); + + // fill up vec_field + vec_field->real_space_representation = true; + vec_field->RLOOP( + [&](ptrdiff_t rindex, + ptrdiff_t xindex, + ptrdiff_t yindex, + ptrdiff_t zindex){ + vec_field->rval(rindex, 0) = rdist(rgen); + vec_field->rval(rindex, 1) = rdist(rgen); + vec_field->rval(rindex, 2) = rdist(rgen); + }); + vec_field->dft(); + + vec_field->write_filtered( + "data_for_write_filtered.h5", + "vec_field_z0slice", + this->iteration, + this->nx, + this->ny, + 1); + + vec_field->write_filtered( + "data_for_write_filtered.h5", + "vec_field_full", + this->iteration, + this->nx, + this->ny, + this->nz); + + vec_field->write_filtered( + "data_for_write_filtered.h5", + "vec_field_half", + this->iteration, + this->nx/2, + this->ny/2, + this->nz/2); + + // deallocate + delete vec_field; + + // allocate + field<rnumber, FFTW, THREExTHREE> *tens_field = new field<rnumber, FFTW, THREExTHREE>( + this->nx, this->ny, this->nz, + this->comm, + FFTW_ESTIMATE); + + // fill up tens_field + tens_field->real_space_representation = true; + tens_field->RLOOP( + [&](ptrdiff_t rindex, + ptrdiff_t xindex, + ptrdiff_t yindex, + ptrdiff_t zindex){ + for (int cc = 0; cc<3; cc++) + for (int ccc = 0; ccc<3; ccc++) + tens_field->rval(rindex, cc, ccc) = rdist(rgen); + }); + tens_field->dft(); + + tens_field->write_filtered( + "data_for_write_filtered.h5", + "tens_field_z0slice", + this->iteration, + this->nx, + this->ny, + 1); + + tens_field->write_filtered( + "data_for_write_filtered.h5", + "tens_field_full", + this->iteration, + this->nx, + this->ny, + this->nz); + + tens_field->write_filtered( + "data_for_write_filtered.h5", + "tens_field_half", + this->iteration, + this->nx/2, + this->ny/2, + this->nz/2); + + // deallocate + delete tens_field; return EXIT_SUCCESS; } -- GitLab