diff --git a/bfps/base.py b/bfps/base.py index ccd298e717d0cfedae2674c80aa81e2e5540aa77..b836a66afbcf56afeab1688bf329b1a34d69d417 100644 --- a/bfps/base.py +++ b/bfps/base.py @@ -21,6 +21,7 @@ import os +import h5py class base(object): def __init__( @@ -52,25 +53,25 @@ class base(object): key = self.parameters.keys() key.sort() src_txt = ('int read_parameters()\n{\n' - + 'int err_while_reading = 0, errr;\n' + 'if (myrank == {0})'.format(self.iorank) + '\n{\n' - + 'FILE *par_file;\n' + 'char fname[{0}];\n'.format(self.string_length) - + 'sprintf(fname, "%s_pars.txt", simname);\n' - + 'par_file = fopen(fname, "r");\n') + + 'sprintf(fname, "%s.h5", simname);\n' + + 'H5::H5File par_file(fname, H5F_ACC_RDONLY);\n' + + 'H5::DataSet dset;\n' + + 'H5::StrType strdtype(0, H5T_VARIABLE);\n' + + 'H5::DataSpace strdspace(H5S_SCALAR);\n' + + 'std::string tempstr;') #src_txt += 'std::cerr << fname << std::endl;\n' for i in range(len(key)): + src_txt += 'dset = par_file.openDataSet("parameters/{0}");\n'.format(key[i]) if type(self.parameters[key[i]]) == int: - src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %d\\n", &' + key[i] + ') != 1)\n' - + ' err_while_reading++;\n') + src_txt += 'dset.read(&{0}, H5::PredType::NATIVE_INT);\n'.format(key[i]) elif type(self.parameters[key[i]]) == str: - src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %s\\n", ' + key[i] + ') != 1)\n' - + ' err_while_reading++;\n') + src_txt += ('dset.read(tempstr, strdtype, strdspace);\n' + + 'sprintf({0}, "%s", tempstr.c_str());\n').format(key[i]) else: - src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %le\\n", &' + key[i] + ') != 1)\n' - + ' err_while_reading++;\n') - #src_txt += 'DEBUG_MSG("read ' + key[i] + ', err_while_reading is %d\\n", err_while_reading);\n' + src_txt += 'dset.read(&{0}, H5::PredType::NATIVE_DOUBLE);\n'.format(key[i]) src_txt += '}\n' # finishing if myrank == 0 # now broadcasting values to all ranks for i in range(len(key)): @@ -80,13 +81,7 @@ class base(object): src_txt += 'MPI_Bcast((void*)(' + key[i] + '), {0}, MPI_CHAR, {1}, MPI_COMM_WORLD);\n'.format(self.string_length, self.iorank) else: src_txt += 'MPI_Bcast((void*)(&' + key[i] + '), 1, MPI_DOUBLE, {0}, MPI_COMM_WORLD);\n'.format(self.iorank) - src_txt += ('MPI_Allreduce((void*)(&err_while_reading), (void*)(&errr), 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD);\n' - + 'if (errr > 0)\n{\n' - + 'fprintf(stderr, "Error reading parameters.\\nAttempting to exit.\\n");\n' - + 'MPI_Finalize();\n' - + 'exit(0);\n' - + '}\n' # finishing errr check - + 'return 0;\n}\n') # finishing read_parameters + src_txt += 'return 0;\n}\n' # finishing read_parameters return src_txt def cprint_pars(self): key = self.parameters.keys() @@ -101,17 +96,11 @@ class base(object): src_txt += 'DEBUG_MSG("'+ key[i] + ' = %le\\n", ' + key[i] + ');\n' return src_txt def write_par(self): - filename = self.simname + '_pars.txt' if not os.path.isdir(self.work_dir): os.makedirs(self.work_dir) - ofile = open(os.path.join(self.work_dir, filename), 'w') - key = self.parameters.keys() - key.sort() - for i in range(len(key)): - if type(self.parameters[key[i]]) == float: - ofile.write(('{0} = {1:e}\n').format(key[i], self.parameters[key[i]])) - else: - ofile.write('{0} = {1}\n'.format(key[i], self.parameters[key[i]])) + ofile = h5py.File(os.path.join(self.work_dir, self.simname + '.h5'), 'w') + for k in self.parameters.keys(): + ofile['parameters/' + k] = self.parameters[k] ofile.close() return None def read_parameters(self): diff --git a/bfps/code.py b/bfps/code.py index 635d4a25563d8984423b230f49cfbc1323f885da..fa1c3165ff9cb866c96ee841c96e523efdd92c7c 100644 --- a/bfps/code.py +++ b/bfps/code.py @@ -41,6 +41,7 @@ class code(base): #include "base.hpp" #include "fluid_solver.hpp" #include <iostream> + #include <H5Cpp.h> #include <fftw3-mpi.h> //endcpp """ diff --git a/machine_settings.py b/machine_settings.py index 2b3a21f7d11144f8f2a1765fc8e18e4c03f47329..77967a1af0b665d4458793ef0c9a293f692993c0 100644 --- a/machine_settings.py +++ b/machine_settings.py @@ -7,14 +7,14 @@ import os hostname = os.getenv('HOSTNAME') extra_compile_args = ['-mtune=native', '-ffast-math', '-std=c++11'] -extra_libraries = [] +extra_libraries = ['hdf5_cpp', 'hdf5'] if hostname == 'chichi-G': include_dirs = ['/usr/local/include', '/usr/include/mpich'] library_dirs = ['/usr/local/lib' '/usr/lib/mpich'] - extra_libraries = ['mpich'] + extra_libraries += ['mpich'] if hostname in ['frontend01', 'frontend02']: include_dirs = ['/usr/nld/mvapich2-1.9a2-gcc/include', @@ -26,7 +26,7 @@ if hostname in ['frontend01', 'frontend02']: '/usr/nld/gcc-4.7.2/lib64', '/usr/nld/fftw-3.3.3-mvapich2-1.9a2-gcc/lib', '/usr/nld/fftw-3.3.3-float-mvapich2-1.9a2-gcc/lib'] - extra_libraries = ['mpich'] + extra_libraries += ['mpich'] if hostname == 'tolima': local_install_dir = '/scratch.local/chichi/installs' diff --git a/setup.py b/setup.py index 32e0b80d6291e88520b6767a6ed8ffb0987fb458..dcf43c69aada4ac7488c93d2a6872c8507ac9816 100644 --- a/setup.py +++ b/setup.py @@ -89,7 +89,7 @@ libbfps = Extension( setup( name = 'bfps', packages = ['bfps'], - install_requires = ['numpy>=1.8', 'matplotlib>=1.3'], + install_requires = ['numpy>=1.8', 'matplotlib>=1.3', 'h5py>=2.2.1'], ext_modules = [libbfps], package_data = {'bfps': header_list + ['../machine_settings.py', 'install_info.pickle']},