void seissol::checkpoint::mpio::Wavefield::load(real* dofs) { logInfo(rank()) << "Loading wave field checkpoint"; seissol::checkpoint::CheckPoint::setLoaded(); MPI_File file = open(); if (file == MPI_FILE_NULL) logError() << "Could not open checkpoint file"; // Read and broadcast header checkMPIErr(setHeaderView(file)); if (rank() == 0) checkMPIErr(MPI_File_read(file, header().data(), 1, headerType(), MPI_STATUS_IGNORE)); MPI_Bcast(header().data(), 1, headerType(), 0, comm()); // Read dofs checkMPIErr(setDataView(file)); checkMPIErr(MPI_File_read_all(file, dofs, numDofs(), MPI_DOUBLE, MPI_STATUS_IGNORE)); // Close the file checkMPIErr(MPI_File_close(&file)); }
void seissol::checkpoint::mpio::Wavefield::load(double &time, int ×tepWaveField) { logInfo(rank()) << "Loading wave field checkpoint"; seissol::checkpoint::CheckPoint::load(); MPI_File file = open(); if (file == MPI_FILE_NULL) logError() << "Could not open checkpoint file"; // Read and broadcast header checkMPIErr(setHeaderView(file)); Header header; if (rank() == 0) checkMPIErr(MPI_File_read(file, &header, 1, headerType(), MPI_STATUS_IGNORE)); MPI_Bcast(&header, 1, headerType(), 0, comm()); time = header.time; timestepWaveField = header.timestepWavefield; // Read dofs checkMPIErr(setDataView(file)); checkMPIErr(MPI_File_read_all(file, dofs(), numDofs(), MPI_DOUBLE, MPI_STATUS_IGNORE)); // Close the file checkMPIErr(MPI_File_close(&file)); }
bool seissol::checkpoint::mpio::Wavefield::validate(MPI_File file) const { if (setHeaderView(file) != 0) { logWarning() << "Could not set checkpoint header view"; return false; } int result = true; if (rank() == 0) { Header header; // Check the header MPI_File_read(file, &header, 1, headerType(), MPI_STATUS_IGNORE); if (header.identifier != identifier()) { logWarning() << "Checkpoint identifier does match"; result = false; } else if (header.partitions != partitions()) { logWarning() << "Number of partitions in checkpoint does not match"; result = false; } } // Make sure everybody knows the result of the validation MPI_Bcast(&result, 1, MPI_INT, 0, comm()); return result; }
static mps_res_t dylan_header_scan_weak(mps_ss_t mps_ss, mps_addr_t base, mps_addr_t limit) { mps_res_t res; while(base < limit) { mps_word_t header; header = (mps_word_t)*(int*)((char*)base - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: base = (mps_addr_t)((char*)base + headerPadSize(header)); continue; default: notreached(); break; } res = dylan_scan1_weak(mps_ss, &base); if(res) return res; base = AddHeader(base); } assert(base <= AddHeader(limit)); return MPS_RES_OK; }
static mps_res_t dylan_header_scan(mps_ss_t mps_ss, mps_addr_t base, mps_addr_t limit) { mps_res_t res; mps_addr_t p = base; while(p < limit) { mps_word_t header = (mps_word_t)*(int*)((char*)p - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: p = (mps_addr_t)((char*)p + headerPadSize(header)); continue; default: notreached(); break; } res = dylan_scan1(mps_ss, &p); if(res) return res; p = AddHeader(p); } assert(p <= AddHeader(limit)); return MPS_RES_OK; }
void seissol::checkpoint::mpio::Wavefield::writeHeader(const void* header, size_t headerSize) { SCOREP_USER_REGION("checkpoint_write_header", SCOREP_USER_REGION_TYPE_FUNCTION); checkMPIErr(setHeaderView(file())); if (rank() == 0) checkMPIErr(MPI_File_write(file(), const_cast<void*>(header), 1, headerType(), MPI_STATUS_IGNORE)); }
static mps_addr_t dylan_header_isfwd(mps_addr_t object) { mps_word_t header; header = (mps_word_t)*(int*)((char*)object - headerSIZE); if (headerType(header) != realTYPE) return NULL; assert(header == realHeader); return dylan_format->isfwd(object); }
void seissol::checkpoint::mpio::Wavefield::writeHeader(double time, int timestepWaveField) { EPIK_TRACER("checkpoint_write_header"); SCOREP_USER_REGION("checkpoint_write_header", SCOREP_USER_REGION_TYPE_FUNCTION); checkMPIErr(setHeaderView(file())); if (rank() == 0) { Header header; header.identifier = identifier(); header.partitions = partitions(); header.time = time; header.timestepWavefield = timestepWaveField; checkMPIErr(MPI_File_write(file(), &header, 1, headerType(), MPI_STATUS_IGNORE)); } }
static mps_addr_t dylan_header_skip(mps_addr_t object) { mps_addr_t *p; /* cursor in object */ mps_word_t header; header = (mps_word_t)*(int*)((char*)object - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: return (mps_addr_t)((char*)object + headerPadSize(header)); default: notreached(); break; } p = dylan_format->skip(object); p = AddHeader(p); return p; }