diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a8c2abe6f7320f947c07921e960a57ccc618186..360a0d34799c0bbd34e969e212b9b6dac9021258 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -651,7 +651,10 @@ if(VERBOSE_MODE) message(STATUS " Project uses Scales : ${WITH_SCALES}") message(STATUS " Project uses FFTW : ${WITH_FFTW}") message(STATUS " Project uses GPU : ${WITH_GPU}") +<<<<<<< HEAD message(STATUS " Project uses parallel hdf5 interface : ${H5PY_PARALLEL_COMPRESSION_ENABLED}") +======= +>>>>>>> c9b88f65566d41430ec337958469ac7b37608012 message(STATUS " ${PROJECT_NAME} profile mode : ${PROFILE}") message(STATUS " ${PROJECT_NAME} debug mode : ${DEBUG}") message(STATUS " Enable -OO run? : ${OPTIM}") diff --git a/ci/docker_images/ubuntu/bionic/Dockerfile b/ci/docker_images/ubuntu/bionic/Dockerfile index de940fd5fbfe05dbfc8ed488601d3c8df4f66d0a..872147e972dbc3e5ca3e3f3cbe62baab1cc1442a 100644 --- a/ci/docker_images/ubuntu/bionic/Dockerfile +++ b/ci/docker_images/ubuntu/bionic/Dockerfile @@ -89,7 +89,7 @@ RUN pip install --upgrade numba # RUN cd /tmp && git clone https://github.com/sphinx-contrib/doxylink.git && cd doxylink/sphinxcontrib/doxylink \ # && mv doxylink.py doxylink.py3 && strip-hints doxylink.py3 > doxylink.py && rm doxylink.py3 \ # && mv parsing.py parsing.py3 && strip-hints parsing.py3 > parsing.py && rm parsing.py3 \ -# && python setup.py install +# && cd ../.. && python setup.py install # scitools (python-scitools does not exist on ubuntu:bionic) diff --git a/hysop/__init__.py.in b/hysop/__init__.py.in index ef29096df566f849a87b1898392d60ebed0a4346..26d8c7a9ec81a48aa7573e2d19e4766d865448ee 100644 --- a/hysop/__init__.py.in +++ b/hysop/__init__.py.in @@ -33,7 +33,10 @@ __GPU_ENABLED__ = "@WITH_GPU@" is "ON" __FFTW_ENABLED__ = "@WITH_FFTW@" is "ON" __SCALES_ENABLED__ = "@WITH_SCALES@" is "ON" __OPTIMIZE__ = not __debug__ +<<<<<<< HEAD __H5PY_PARALLEL_COMPRESSION_ENABLED__ = ("@H5PY_PARALLEL_COMPRESSION_ENABLED@" is "ON") +======= +>>>>>>> c9b88f65566d41430ec337958469ac7b37608012 __VERBOSE__ = get_env('VERBOSE', ("@VERBOSE@" is "ON")) __DEBUG__ = get_env('DEBUG', ("@DEBUG@" is "ON")) diff --git a/hysop/operator/hdf_io.py b/hysop/operator/hdf_io.py index 65238694793e294988ba6ac5635060948e3b7200..443d3faf1308899b2a0b862af72385bac49c24fd 100755 --- a/hysop/operator/hdf_io.py +++ b/hysop/operator/hdf_io.py @@ -113,8 +113,6 @@ class HDF_IO(ComputationalGraphOperator): self.topology = None self._local_compute_slices = None self._global_grid_resolution = None - self._local_grid_resolution = None - self._all_local_grid_resolution = None self._global_slices = None # Dictionnary of discrete fields. Key = name in hdf file, # Value = discrete field @@ -376,7 +374,6 @@ class HDF_Writer(HDF_IO): assert self.use_local_hdf5 return self.io_params.filename + "_{0:05d}".format(i) + "_rk{rk:03d}.h5" - @op_apply def apply(self, simulation=None, **kwds): if (simulation is None): @@ -408,12 +405,14 @@ class HDF_Writer(HDF_IO): write_step = tuple(step) ds_names = self.dataset.keys() + joinrkfiles = None if self.use_local_hdf5 and (self.topology.cart_size > 1): joinrkfiles = range(self.topology.cart_size) + grid_attributes = XMF.prepare_grid_attributes( ds_names, - resolution, origin, step, joinrkfiles=joinrkfiles) + resolution, origin, step) self.grid_attributes_template = grid_attributes @@ -445,7 +444,7 @@ class HDF_Writer(HDF_IO): filenames = dict(('filename'+str(r), self._get_filename(i).format(rk=r).split('/')[-1]) for r in range(self.topology.cart_size)) filenames.update(('resolution'+str(r), XMF._list_format(self._all_local_grid_resolution[r])) for r in range(self.topology.cart_size)) grid_attrs = self.grid_attributes_template.format( - niteration=i, time=t, **filenames) + niteration=i, time=t, filename=filename) f.seek(lastp) f.write(grid_attrs) self._last_xmf_pos = f.tell() @@ -456,13 +455,7 @@ class HDF_Writer(HDF_IO): self._xdmf_data_files = [] def _step_HDF5(self, simu): - """Write an h5 file with data on each mpi process. - - If parallel interface of HDF5 is not enabled, each rank is - writing its own h5 file. All files are concatenated in the xmf - part with a 'JOIN' function. If parallel interface enabled, - only one h5 file is written by all ranks. - """ + """Write an h5 file with data on each mpi process.""" # Remarks: # - force np.float64, ParaView seems unable to read float32 # - writing compressed hdf5 files (gzip compression seems the best) diff --git a/hysop/tools/io_utils.py b/hysop/tools/io_utils.py index b66ec46c96e3b883cf291444fd886da9f449911d..3de3fc9a4c6f87e88833b87544ba04a05afc525e 100755 --- a/hysop/tools/io_utils.py +++ b/hysop/tools/io_utils.py @@ -234,7 +234,7 @@ class IOParams(namedtuple("IOParams", ['filename', 'filepath', IO.check_dir(filename) return super(IOParams, cls).__new__(cls, filename, filepath, - frequency, fileformat, + frequency, fileformat, io_leader, visu_leader, kwds) @@ -387,7 +387,7 @@ class XMF(object): @staticmethod def prepare_grid_attributes(dataset_names, - resolution, origin, step, joinrkfiles=None): + resolution, origin, step): """ Prepare XDMF header as a string. @@ -398,7 +398,6 @@ class XMF(object): resolution: 3d tuple origin: 3d tuple step: 3d tuple - joinrkfiles : (optional) Returns: -------- @@ -406,10 +405,7 @@ class XMF(object): the xml-like header formattable with the following keywords: niteration : iteration number time: time in seconds - filename: target file name, in sequential or with parallel hdf5 support - filename0, ... filenameN : target file names for each rank 0 to N, in parallel without HDF5 parallel support - resolution0, ... resolutionN : local resolutions for each rank 0 to N, in parallel without HDF5 parallel support - + filename: target file name """ # The header (xml-like), saved in a string. # always use a 3D mesh because paraview does not like 2D meshes (uses axe (Y,Z) instead of (X,Y)). @@ -437,29 +433,13 @@ class XMF(object): xml_grid += " <Attribute Name=\"" xml_grid += name + "\"" xml_grid += " AttributeType=\"Scalar\" Center=\"Node\">\n" - if joinrkfiles is None: - xml_grid += " <DataItem Dimensions=\"" - xml_grid += XMF._list_format(resolution) + " \"" - xml_grid += " NumberType=\"Float\" Precision=\"8\" Format=\"HDF\"" - xml_grid += " Compression=\"Raw\">\n" # - xml_grid += " {filename}" - xml_grid += ":/" + name - xml_grid += "\n </DataItem>\n" - else: - xml_grid += " <DataItem Dimensions=\"" - xml_grid += XMF._list_format(resolution) + " \"" - xml_grid += " ItemType=\"Function\" Function=\"JOIN(" - xml_grid += " ; ".join("$"+str(i) for i in joinrkfiles) - xml_grid += ")\">\n" - for i in joinrkfiles: - xml_grid += " <DataItem Dimensions=\"" - xml_grid += "{resolution"+str(i)+"}" + " \"" - xml_grid += " NumberType=\"Float\" Precision=\"8\" Format=\"HDF\"" - xml_grid += " Compression=\"Raw\">\n" # - xml_grid += " {filename"+str(i)+"}" - xml_grid += ":/" + name - xml_grid += "\n </DataItem>\n" - xml_grid += " </DataItem>\n" + xml_grid += " <DataItem Dimensions=\"" + xml_grid += XMF._list_format(resolution) + " \"" + xml_grid += " NumberType=\"Float\" Precision=\"8\" Format=\"HDF\"" + xml_grid += " Compression=\"Raw\">\n" # + xml_grid += " {filename}" + xml_grid += ":/" + name + xml_grid += "\n </DataItem>\n" xml_grid += " </Attribute>\n" xml_grid += " </Grid>\n" return xml_grid diff --git a/setup.py.in b/setup.py.in old mode 100644 new mode 100755 index 9b1630a437e2fae13c66843582c1fba1c122926c..370ff9bda8e706dcb8f81de7a29a36f520366a14 --- a/setup.py.in +++ b/setup.py.in @@ -57,7 +57,7 @@ def parseCMakeDefines(var): defines = parseCMakeVar(var) if len(defines)==0: return None - + # regex to match compiler defines like -DMACRO_NAME or # -DMACRO_NAME = MACRO_VALUE p = re.compile('\s*(?:-D)?\s*(\w+)(?:\s*=\s*(\w+))?\s*') @@ -126,7 +126,7 @@ def create_fortran_extension(name, pyf_file=None, src_dirs=None, sources=None, for sdir in src_dirs: sources += glob.glob(os.path.join(sdir, '*.f95')) sources += glob.glob(os.path.join(sdir, '*.f90')) - + # Reorder source list with fortran modules # dependencies. It seems that this is not taken into # account in f2py or distutils. @@ -147,6 +147,7 @@ def create_fortran_extension(name, pyf_file=None, src_dirs=None, sources=None, # --- set compilation flags --- fortran_flags = ['@Fortran_FLAGS@'] + fortran_flags = list(set([_ for _ in fortran_flags[0].split(' ') if _ != ''])) # we trust cmake for external libraries and # add them to linker, without using libraries option @@ -308,7 +309,7 @@ if enable_fortran is "ON": num_dirs = [] for sd in subdirs: num_dirs.append(os.path.join(fortran_root, sd)) - + hysop_libdir = [ld.strip() for ld in hysop_libdir] # hysop_libdir = ' '.join([ '-L{}'.format(ld) if ld[1]!='L' else hysop_libdir]) num_dirs.append('@GENERATED_FORTRAN_FILES_DIR@')