From 5252630c45e8d021a889d35abb2af97f01939cf4 Mon Sep 17 00:00:00 2001
From: Pietro Incardona <incardon@mpi-cbg.de>
Date: Tue, 2 May 2017 16:55:00 +0200
Subject: [PATCH] Refactoring HDF5 load

---
 src/Grid/grid_dist_id.hpp | 395 +-------------------------------------
 1 file changed, 5 insertions(+), 390 deletions(-)

diff --git a/src/Grid/grid_dist_id.hpp b/src/Grid/grid_dist_id.hpp
index 81c435277..13239393c 100644
--- a/src/Grid/grid_dist_id.hpp
+++ b/src/Grid/grid_dist_id.hpp
@@ -1663,42 +1663,11 @@ public:
 	void map()
 	{
 		getGlobalGridsInfo(gdb_ext_global);
-/*
-		std::cout << "Global size: " << gdb_ext_global.size() << std::endl;
 
-		for (size_t i = 0; i < gdb_ext_global.size(); i++)
-		{
-			std::cout << "(" << gdb_ext_global.get(i).Dbox.getLow(0) << "; " << gdb_ext_global.get(i).Dbox.getLow(1) << "); (" << gdb_ext_global.get(i).Dbox.getHigh(0) << "; " << gdb_ext_global.get(i).Dbox.getHigh(1) << ")" << std::endl;
-			std::cout << "I = " << i << ", Origin is (" << gdb_ext_global.get(i).origin.get(0) << "; " << gdb_ext_global.get(i).origin.get(1) << ")" << std::endl;
-		}
-
-		if (v_cl.getProcessUnitID() == 0)
-		{
-			for (size_t i = 0; i < gdb_ext.size(); i++)
-			{
-				Box<dim,long int> box = gdb_ext.get(i).Dbox;
-				box += gdb_ext.get(i).origin;
-				std::cout << "(" << box.getLow(0) << "; " << box.getLow(1) << "); (" << box.getHigh(0) << "; " << box.getHigh(1) << ")" << std::endl;
-			}
-		}
-
-		if (v_cl.getProcessUnitID() == 0)
-		{
-			for (size_t i = 0; i < loc_grid_old.size(); i++)
-			{
-				Point<dim,St> p1;
-				Point<dim,St> p2;
-				for (size_t n = 0; n < dim; n++)
-				{
-					p1.get(n) = loc_grid_old.get(i).getGrid().getBox().getLow(n);
-					p2.get(n) = loc_grid_old.get(i).getGrid().getBox().getHigh(n);
-				}
-
-				std::cout << "Loc_grid_old: (" << p1.get(0) << "; " << p1.get(1) << "); (" << p2.get(0) << "; " << p2.get(1) << "); " << "Gdb_ext_old: (" << gdb_ext_old.get(i).Dbox.getLow(0) << "; " << gdb_ext_old.get(i).Dbox.getLow(1) << "); (" << gdb_ext_old.get(i).Dbox.getHigh(0) << "; " << gdb_ext_old.get(i).Dbox.getHigh(1) << ")" << std::endl;
-			}
-		}
-*/
 		this->template map_(dec,cd_sm,loc_grid,loc_grid_old,gdb_ext,gdb_ext_old,gdb_ext_global);
+
+		loc_grid_old.clear();
+		gdb_ext_old.clear();
 	}
 
 	inline void save(const std::string & filename) const
@@ -1708,368 +1677,14 @@ public:
 		h5s.save(filename,loc_grid,gdb_ext);
 	}
 
-	void load_block(long int bid,
-			        hssize_t mpi_size_old,
-					int * metadata_out,
-					openfpm::vector<size_t> & metadata_accum,
-					hid_t plist_id,
-					hid_t dataset_2)
-	{
-/*	  	if (mpi_size >= mpi_size_old)
-	  	{
-			if (mpi_rank >= mpi_size_old)
-				block[0] = 0;
-			else
-				block[0] = {(size_t)metadata_out[mpi_rank]};
-	  	}
-	  	else
-	  	{
-	  		int x = mpi_size_old/mpi_size;
-	  		int shift = mpi_rank*x;
-	  		for (int i = 0; i < x; i++)
-	  		{
-	  			//block0.get(mpi_rank).add(metadata_out[shift]);
-	  			block[0] += metadata_out[shift];
-	  			shift++;
-	  		}
-	  		int y = mpi_size_old%mpi_size;
-	  		if (mpi_rank < y)
-	  		{
-				block_add[0] += metadata_out[mpi_size*x+mpi_rank];
-				//block_add0.get(mpi_rank).add(metadata_out[mpi_size*x+mpi_rank]);
-	  		}
-	  	}*/
-
-//		std::cout << "BID: " << bid << std::endl;
-
-		hsize_t offset[1];
-		hsize_t block[1];
-
-		if (bid < mpi_size_old && bid != -1)
-		{
-			offset[0] = metadata_accum.get(bid);
-			block[0] = metadata_out[bid];
-		}
-		else
-		{
-			offset[0] = 0;
-			block[0] = 0;
-		}
-
-//		std::cout << "Offset: " << offset[0] << "; Block: " << block[0]<<  std::endl;
-//	    hsize_t offset_add[1] = {0};
-
-/*	    if (mpi_size >= mpi_size_old)
-		{
-			if (mpi_rank >= mpi_size_old)
-				offset[0] = 0;
-			else
-			{
-				for (int i = 0; i < mpi_rank; i++)
-				offset[0] += metadata_out[i];
-			}
-		}
-	    else
-	    {
-	  		int x = mpi_size_old/mpi_size;
-	  		int shift = mpi_rank*x;
-
-	  		for (int i = 0; i < shift; i++)
-	  		{
-	  			offset[0] += metadata_out[i];
-	  			//offset0.get(mpi_rank).add(metadata_out[i]);
-	  		}
-
-	  		int y = mpi_size_old%mpi_size;
-	  		if (mpi_rank < y)
-	  		{
-	  			for (int i = 0; i < mpi_size*x + mpi_rank; i++)
-	  			{
-	  				offset_add[0] += metadata_out[i];
-	  				//offset_add0.get(mpi_rank).add(metadata_out[i]);
-	  			}
-	  		}
-	    }*/
-
-	    //hsize_t stride[1] = {1};
-	    hsize_t count[1] = {1};
-
-	    //std::cout << "LOAD: MPI rank: " << mpi_rank << ", MPI size: " << mpi_size << ", Offset: " << offset[0] << ", Offset_add: " << offset_add[0] << ", Block: " << block[0] << ", Block_add: " << block_add[0] << std::endl;
-/*
-	    std::cout << "LOAD: MPI rank: " << mpi_rank << ", MPI size: " << mpi_size << std::endl;
-	    for (size_t i = 0; i < offset0.get(mpi_rank).size(); i++)
-	    	std::cout << ", Offset: " << offset0.get(mpi_rank).get(i) << std::endl;
-		for (size_t i = 0; i < offset_add0.get(mpi_rank).size(); i++)
-			std::cout << ", Offset_add: " << offset_add0.get(mpi_rank).get(i) << std::endl;
-		for (size_t i = 0; i < block0.get(mpi_rank).size(); i++)
-			std::cout << ", Block: " << block0.get(mpi_rank).get(i) << std::endl;
-		for (size_t i = 0; i < block_add0.get(mpi_rank).size(); i++)
-			std::cout << ", Block_add: " << block_add0.get(mpi_rank).get(i) << std::endl;
-*/
-
-		//Select file dataspace
-		hid_t file_dataspace_id_2 = H5Dget_space(dataset_2);
-
-        H5Sselect_hyperslab(file_dataspace_id_2, H5S_SELECT_SET, offset, NULL, count, block);
-
-		//Select file dataspace
-/*		hid_t file_dataspace_id_3 = H5Dget_space(dataset_2);
-
-        H5Sselect_hyperslab(file_dataspace_id_3, H5S_SELECT_SET, offset_add, NULL, count, block_add);*/
-
-        hsize_t mdim_2[1] = {block[0]};
-//        hsize_t mdim_3[1] = {block_add[0]};
-
-
-		//Size for data space in memory
-
-		/*if (mpi_rank >= mpi_size_old)
-			mdim_2[0] = 0;
-		else
-			mdim_2[0] = metadata_out[mpi_rank];*/
-
-		//Create data space in memory
-		hid_t mem_dataspace_id_2 = H5Screate_simple(1, mdim_2, NULL);
-//		hid_t mem_dataspace_id_3 = H5Screate_simple(1, mdim_3, NULL);
-
-		//if (mpi_rank == 0)
-	/*	{
-			hssize_t size2;
-
-			size2 = H5Sget_select_npoints (mem_dataspace_id_2);
-			printf ("\nLOAD: memspace_id_2 size: %llu\n", size2);
-			size2 = H5Sget_select_npoints (file_dataspace_id_2);
-			printf ("LOAD: dataspace_id_2 size: %llu\n", size2);
-		}*/
-/*
-		if (mpi_rank == 0)
-		{
-			hssize_t size2;
-
-			size2 = H5Sget_select_npoints (mem_dataspace_id_3);
-			printf ("\nLOAD: memspace_id_3 size: %llu\n", size2);
-			size2 = H5Sget_select_npoints (file_dataspace_id_3);
-			printf ("LOAD: dataspace_id_3 size: %llu\n", size2);
-		}
-*/
-/*	size_t sum = 0;
-
-		for (int i = 0; i < mpi_size_old; i++)
-		{
-			sum += metadata_out[i];
-		}*/
-
-	//	std::cout << "LOAD: sum: " << sum << std::endl;
-
-		// allocate the memory
-		HeapMemory pmem;
-//		HeapMemory pmem2;
-		//pmem.allocate(req);
-		ExtPreAlloc<HeapMemory> & mem = *(new ExtPreAlloc<HeapMemory>(block[0],pmem));
-		mem.incRef();
-//		ExtPreAlloc<HeapMemory> & mem2 = *(new ExtPreAlloc<HeapMemory>(block_add[0],pmem2));
-//		mem2.incRef();
-
-	  	// Read the dataset.
-	    H5Dread(dataset_2, H5T_NATIVE_CHAR, mem_dataspace_id_2, file_dataspace_id_2, plist_id, (char *)mem.getPointer());
-
-	    // Read the dataset.
-//		H5Dread(dataset_2, H5T_NATIVE_CHAR, mem_dataspace_id_3, file_dataspace_id_3, plist_id, (char *)mem2.getPointer());
-
-		mem.allocate(pmem.size());
-//		mem2.allocate(pmem2.size());
-	//	std::cout << "Mem.size(): " << mem.size() << " = " << block[0] << std::endl;
-
-		Unpack_stat ps;
-
-		openfpm::vector<device_grid> loc_grid_old_unp;
-		openfpm::vector<GBoxes<device_grid::dims>> gdb_ext_old_unp;
-
-		Unpacker<decltype(loc_grid_old),HeapMemory>::unpack(mem,loc_grid_old_unp,ps,1);
-		Unpacker<decltype(gdb_ext_old),HeapMemory>::unpack(mem,gdb_ext_old_unp,ps,1);
-/*
-		std::cout << "Loc_grid_old.size() before merge: " << loc_grid_old.size() << std::endl;
-		std::cout << "Gdb_ext_old.size() before merge: " << gdb_ext_old.size() << std::endl;
-
-		std::cout << "Loc_grid_old_unp.size() before merge: " << loc_grid_old_unp.size() << std::endl;
-		std::cout << "Gdb_ext_old_unp.size() before merge: " << gdb_ext_old_unp.size() << std::endl;
-*/
-		for (size_t i = 0; i < loc_grid_old_unp.size(); i++)
-			loc_grid_old.add(loc_grid_old_unp.get(i));
-
-		for (size_t i = 0; i < gdb_ext_old_unp.size(); i++)
-			gdb_ext_old.add(gdb_ext_old_unp.get(i));
-
-//		std::cout << "Loc_grid_old.size() after merge: " << loc_grid_old.size() << std::endl;
-//		std::cout << "Gdb_ext_old.size() after merge: " << gdb_ext_old.size() << std::endl;
-//		std::cout << "*********************************" << std::endl;
-
-		mem.decRef();
-		delete &mem;
-
-	}
-
 	inline void load(const std::string & filename)
 	{
-		MPI_Comm comm = v_cl.getMPIComm();
-		MPI_Info info  = MPI_INFO_NULL;
-
-		int mpi_rank = v_cl.getProcessUnitID();
-		//int mpi_size = v_cl.getProcessingUnits();
-
-		// Set up file access property list with parallel I/O access
-		hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
-		H5Pset_fapl_mpio(plist_id, comm, info);
-
-		//Open a file
-	    hid_t file = H5Fopen (filename.c_str(), H5F_ACC_RDONLY, plist_id);
-	    H5Pclose(plist_id);
-
-	    //Open dataset
-	    hid_t dataset = H5Dopen (file, "metadata", H5P_DEFAULT);
-
-	    //Create property list for collective dataset read
-	  	plist_id = H5Pcreate(H5P_DATASET_XFER);
-	  	H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
-
-		//Select file dataspace
-		hid_t file_dataspace_id = H5Dget_space(dataset);
-
-		hssize_t mpi_size_old = H5Sget_select_npoints (file_dataspace_id);
-
-		//if (mpi_rank == 0)
-			//printf ("\nOld MPI size: %llu\n", mpi_size_old);
-
-	  	//Where to read metadata
-	  	int metadata_out[mpi_size_old];
-
-	  	for (int i = 0; i < mpi_size_old; i++)
-	  	{
-	  		metadata_out[i] = 0;
-	  	}
-
-		//Size for data space in memory
-		hsize_t mdim[1] = {(size_t)mpi_size_old};
-
-		//Create data space in memory
-		hid_t mem_dataspace_id = H5Screate_simple(1, mdim, NULL);
-
-/*
-		if (mpi_rank == 0)
-		{
-			hssize_t size;
-
-			size = H5Sget_select_npoints (mem_dataspace_id);
-			printf ("\nmemspace_id size: %llu\n", size);
-			size = H5Sget_select_npoints (file_dataspace_id);
-			printf ("dataspace_id size: %llu\n", size);
-		}
-*/
-	  	// Read the dataset.
-	    H5Dread(dataset, H5T_NATIVE_INT, mem_dataspace_id, file_dataspace_id, plist_id, metadata_out);
-/*
-		if (mpi_rank == 0)
-		{
-			std::cout << "Metadata_out[]: ";
-			for (int i = 0; i < mpi_size_old; i++)
-			{
-				std::cout << metadata_out[i] << " ";
-			}
-			std::cout << " " << std::endl;
-		}
-*/
-
-	    openfpm::vector<size_t> metadata_accum;
-	    metadata_accum.resize(mpi_size_old);
-
-	    metadata_accum.get(0) = 0;
-	    for (int i = 1 ; i < mpi_size_old ; i++)
-	    	metadata_accum.get(i) = metadata_accum.get(i-1) + metadata_out[i-1];
-
-	    //Open dataset
-	    hid_t dataset_2 = H5Dopen (file, "grid_dist", H5P_DEFAULT);
+		HDF5_reader<GRID_DIST> h5l;
 
-	    //Create property list for collective dataset read
-	  	plist_id = H5Pcreate(H5P_DATASET_XFER);
-	  	H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
-
-	  	/////////////////////////////////////
-
-	  	openfpm::vector<size_t> n_block;
-	  	n_block.resize(v_cl.getProcessingUnits());
-
-
-	  	for(size_t i = 0 ; i < n_block.size() ; i++)
-	  		n_block.get(i) = mpi_size_old / v_cl.getProcessingUnits();
-
-	  	size_t rest_block = mpi_size_old % v_cl.getProcessingUnits();
-
-	  //	std::cout << "MPI size old: " << mpi_size_old << std::endl;
-	  	//std::cout << "MPI size: " << v_cl.getProcessingUnits() << std::endl;
-
-
-	  //	std::cout << "Rest block: " << rest_block << std::endl;
-
-	  	size_t max_block;
-
-	  	if (rest_block != 0)
-	  		max_block = n_block.get(0) + 1;
-	  	else
-	  		max_block = n_block.get(0);
-
-	  	//for(size_t i = 0 ; i < n_block.size() ; i++)
-	  	for(size_t i = 0 ; i < rest_block ; i++)
-	  		n_block.get(i) += 1;
-
-
-	  	//for(size_t i = 0 ; i < n_block.size() ; i++)
-	  		//std::cout << "n_block.get(i): " << n_block.get(i) << std::endl;
-
-	  	size_t start_block = 0;
-	  	size_t stop_block = 0;
-
-
-	  	if (v_cl.getProcessUnitID() != 0)
-	  	{
-			for(size_t i = 0 ; i < v_cl.getProcessUnitID() ; i++)
-				start_block += n_block.get(i);
-	  	}
-
-	  	stop_block = start_block + n_block.get(v_cl.getProcessUnitID());
-
-//	  	std::cout << "ID: " << v_cl.getProcessUnitID() << "; Start block: " << start_block << "; " << "Stop block: " << stop_block << std::endl;
-
-	  	if (mpi_rank >= mpi_size_old)
-	  		load_block(start_block,mpi_size_old,metadata_out,metadata_accum,plist_id,dataset_2);
-	  	else
-	  	{
-	  		size_t n_bl = 0;
-	  		size_t lb = start_block;
-			for ( ; lb < stop_block ; lb++, n_bl++)
-				load_block(lb,mpi_size_old,metadata_out,metadata_accum,plist_id,dataset_2);
-
-			if (n_bl < max_block)
-				load_block(-1,mpi_size_old,metadata_out,metadata_accum,plist_id,dataset_2);
-	  	}
-
-	  	////////////////////////////////////
-
-		//std::cout << "LOAD: sum: " << sum << std::endl;
-
-	    // Close the dataset.
-	    H5Dclose(dataset);
-	    H5Dclose(dataset_2);
-	    // Close the file.
-	    H5Fclose(file);
-	    H5Pclose(plist_id);
+		h5l.load<device_grid>(filename,loc_grid_old,gdb_ext_old);
 
 		// Map the distributed grid
 		map();
-/*
-		for (size_t i = 0; i < loc_grid.size(); i++)
-		{
-			std::cout << "loc_grids loaded: (" << loc_grid.get(i).getGrid().getBox().getLow(0) << "; " << loc_grid.get(i).getGrid().getBox().getLow(1) << "); (" << loc_grid.get(i).getGrid().getBox().getHigh(0) << "; " << loc_grid.get(i).getGrid().getBox().getHigh(1) << ")" << std::endl;
-		}*/
 	}
 
 	//! Define friend classes
-- 
GitLab