Example #1
0
void seissol::checkpoint::mpio::FaultAsync::writePrepare(int timestepFault)
{
	EPIK_TRACER("CheckPointFault_writePrepare");
	SCOREP_USER_REGION("CheckPointFault_writePrepare", SCOREP_USER_REGION_TYPE_FUNCTION);

	if (numSides() == 0)
		return;

	// Write the header
	writeHeader(timestepFault);

	// Create copy of the data
	for (unsigned int i = 0; i < NUM_VARIABLES; i++)
		memcpy(&m_dataCopy[i*numSides()*numBndGP()],
				data(i), numSides()*numBndGP()*sizeof(double));

	// Save data
	EPIK_USER_REG(r_write_wavefield, "checkpoint_write_begin_fault");
	SCOREP_USER_REGION_DEFINE(r_write_fault);
	EPIK_USER_START(r_write_wavefield);
	SCOREP_USER_REGION_BEGIN(r_write_fault, "checkpoint_write_begin_fault", SCOREP_USER_REGION_TYPE_COMMON);

	checkMPIErr(setDataView(file()));
	checkMPIErr(MPI_File_write_all_begin(file(), m_dataCopy, numSides() * numBndGP() * NUM_VARIABLES, MPI_DOUBLE));

	EPIK_USER_END(r_write_fault);
	SCOREP_USER_REGION_END(r_write_fault);

	m_started = true;

	logInfo(rank()) << "Writing fault check point. Done.";
}
Example #2
0
bool seissol::checkpoint::h5::Fault::validate(hid_t h5file) const
{
	// Turn of error printing
	H5ErrHandler errHandler;

	// Check dimensions
	for (unsigned int i = 0; i < NUM_VARIABLES; i++) {
		hid_t h5data = H5Dopen(h5file, VAR_NAMES[i], H5P_DEFAULT);
		if (h5data < 0) {
			logWarning(rank()) << "Dataset" << VAR_NAMES[i] << "not found in checkpoint.";
			return false;
		}

		hid_t h5space = H5Dget_space(h5data);
		checkH5Err(H5Dclose(h5data));
		if (h5space < 0) {
			logWarning(rank()) << "Could not get space identifier for" << VAR_NAMES[i] << "in checkpoint.";
			return false;
		}

		bool isValid = true;

		int dims = H5Sget_simple_extent_ndims(h5space);
		if (dims != 2) {
			isValid = false;
			logWarning() << "Number of dimensions for" << VAR_NAMES[i] << "in checkpoint does not match.";
		} else {
			hsize_t dimSize[2];
			if (H5Sget_simple_extent_dims(h5space, dimSize, 0L) != 2) {
				isValid = false;
				logWarning(rank()) << "Could not get dimension sizes for" << VAR_NAMES[i] << "of checkpoint.";
			} else {
				if (dimSize[0] != numTotalElems()) {
					isValid = false;
					logWarning(rank()) << "Number of elements for" << VAR_NAMES[i] << "in checkpoint does not match.";
				}
				if (dimSize[1] != numBndGP()) {
					logWarning(rank()) << "Number of boundary points for" << VAR_NAMES[i] << "in checkpoint does not match.";
					isValid = false;
				}
			}
		}

		checkH5Err(H5Sclose(h5space));

		// Dimensions for at least one variable do not match -> invalid
		if (!isValid)
			return false;
	}

	return true;
}
Example #3
0
void seissol::checkpoint::h5::Fault::load(int &timestepFault)
{
	if (numSides() == 0)
		return;

	logInfo(rank()) << "Loading fault checkpoint";

	seissol::checkpoint::CheckPoint::load();

	hid_t h5file = open(linkFile());
	checkH5Err(h5file);

	// Attributes
	hid_t h5attr = H5Aopen(h5file, "timestep_fault", H5P_DEFAULT);
	checkH5Err(h5attr);
	checkH5Err(H5Aread(h5attr, H5T_NATIVE_INT, &timestepFault));
	checkH5Err(H5Aclose(h5attr));

	// Set the memory space (this is the same for all variables)
	hsize_t count[2] = {numSides(), numBndGP()};
	hid_t h5memSpace = H5Screate_simple(2, count, 0L);
	checkH5Err(h5memSpace);
	checkH5Err(H5Sselect_all(h5memSpace));

	// Offset for the file space
	hsize_t fStart[2] = {fileOffset(), 0};

	// Read the data
	for (unsigned int i = 0; i < NUM_VARIABLES; i++) {
		hid_t h5data = H5Dopen(h5file, VAR_NAMES[i], H5P_DEFAULT);
		checkH5Err(h5data);
		hid_t h5fSpace = H5Dget_space(h5data);
		checkH5Err(h5fSpace);

		// Read the data
		checkH5Err(H5Sselect_hyperslab(h5fSpace, H5S_SELECT_SET, fStart, 0L, count, 0L));

		checkH5Err(H5Dread(h5data, H5T_NATIVE_DOUBLE, h5memSpace, h5fSpace,
				h5XferList(), data(i)));

		checkH5Err(H5Sclose(h5fSpace));
		checkH5Err(H5Dclose(h5data));
	}

	checkH5Err(H5Sclose(h5memSpace));
	checkH5Err(H5Fclose(h5file));
}
Example #4
0
void seissol::checkpoint::h5::Fault::write(int timestepFault)
{
	EPIK_TRACER("CheckPointFault_write");
	SCOREP_USER_REGION("CheckPointFault_write", SCOREP_USER_REGION_TYPE_FUNCTION);

	if (numSides() == 0)
		return;

	logInfo(rank()) << "Writing fault check point.";

	// Create array with all pointers
	EPIK_USER_REG(r_write_fault, "checkpoint_write_fault");
	SCOREP_USER_REGION_DEFINE(r_write_fault);
	EPIK_USER_START(r_write_fault);
	SCOREP_USER_REGION_BEGIN(r_write_fault, "checkpoint_write_fault", SCOREP_USER_REGION_TYPE_COMMON);

	// Attributes
	checkH5Err(H5Awrite(m_h5timestepFault[odd()], H5T_NATIVE_INT, &timestepFault));

	// Set memory and file space
	hsize_t fStart[2] = {fileOffset(), 0};
	hsize_t count[2] = {numSides(), numBndGP()};
	hid_t h5memSpace = H5Screate_simple(2, count, 0L);
	checkH5Err(h5memSpace);
	checkH5Err(H5Sselect_all(h5memSpace));
	checkH5Err(H5Sselect_hyperslab(m_h5fSpaceData, H5S_SELECT_SET, fStart, 0L, count, 0L));

	for (unsigned int i = 0; i < NUM_VARIABLES; i++) {
		checkH5Err(H5Dwrite(m_h5data[odd()][i], H5T_NATIVE_DOUBLE, h5memSpace, m_h5fSpaceData,
				h5XferList(), data(i)));
	}

	checkH5Err(H5Sclose(h5memSpace));

	EPIK_USER_END(r_write_fault);
	SCOREP_USER_REGION_END(r_write_fault);

	// Finalize the checkpoint
	finalizeCheckpoint();

	logInfo(rank()) << "Writing fault check point. Done.";
}