extern void artHeader_write(artHeader_t header, const char *headerFileName) { assert(header != NULL); assert(headerFileName != NULL); FILE *f; int blocksize; endian_t systemEndianess = endian_getSystemEndianess(); f = xfopen(headerFileName, "wb"); blocksize = ARTHEADER_HEADERSTRING_LENGTH + 121 * sizeof(float); if (header->fileEndianess != systemEndianess) { local_byteswapHeader(header); byteswap(&blocksize, sizeof(int)); } xfwrite(&blocksize, sizeof(int), 1, f); xfwrite(header->headerString, sizeof(char), ARTHEADER_HEADERSTRING_LENGTH, f); xfwrite(&(header->aexpn), sizeof(float), 121, f); xfwrite(&blocksize, sizeof(int), 1, f); if (header->fileEndianess != systemEndianess) local_byteswapHeader(header); xfclose(&f); }
extern void cubepm_initHeaderValuesFromFiles(cubepm_t cubepm) { assert(cubepm != NULL); assert(cubepm->fileNames != NULL); cubepm_open(cubepm, CUBEPM_MODE_READ, 0); xfread(cubepm->np_local, sizeof(int32_t), 1, cubepm->f); xfread(&(cubepm->a), sizeof(float), 1, cubepm->f); xfread(&(cubepm->t), sizeof(float), 1, cubepm->f); xfread(&(cubepm->tau), sizeof(float), 1, cubepm->f); xfread(&(cubepm->nts), sizeof(int32_t), 1, cubepm->f); xfread(&(cubepm->dt_f_acc), sizeof(float), 1, cubepm->f); xfread(&(cubepm->dt_pp_acc), sizeof(float), 1, cubepm->f); xfread(&(cubepm->dt_c_acc), sizeof(float), 1, cubepm->f); xfread(&(cubepm->cur_checkpoint), sizeof(int32_t), 1, cubepm->f); xfread(&(cubepm->cur_projection), sizeof(int32_t), 1, cubepm->f); xfread(&(cubepm->cur_halofind), sizeof(int32_t), 1, cubepm->f); xfread(&(cubepm->mass_p), sizeof(float), 1, cubepm->f); cubepm_close(cubepm); for (int i = 1; i < cubepm->numFiles; i++) { cubepm_open(cubepm, CUBEPM_MODE_READ, i); xfread(cubepm->np_local + i, sizeof(int32_t), 1, cubepm->f); cubepm_close(cubepm); } if (cubepm->fileEndianess != endian_getSystemEndianess()) local_byteswapHeaderValues(cubepm); }
static uint64_t local_actOnSingleFile(cubepm_t cubepm, uint64_t pSkip, uint64_t pAct, stai_t *data) { bool doByteswap = false; float partData[6]; if (endian_getSystemEndianess() != cubepm_getFileEndianess(cubepm)) doByteswap = true; local_seekToParticle(cubepm, pSkip); if (cubepm_getMode(cubepm) == CUBEPM_MODE_READ) { int ngrid = cubepm_getNGrid(cubepm); for (uint64_t i = UINT64_C(0); i < pAct; i++) { local_readParticle(cubepm->f, partData, doByteswap); local_applyOffsetToParticle(partData, cubepm->fileCoordOffset); local_applyPeriodicityToParticle(partData, ngrid); local_copyParticleDataToStais(partData, i, data); } } else if (cubepm_getMode(cubepm) == CUBEPM_MODE_WRITE) { for (uint64_t i = UINT64_C(0); i < pAct; i++) { local_fillParticleDataFromStais(partData, i, data); local_unapplyOffsetToParticle(partData, cubepm->fileCoordOffset); local_writeParticle(cubepm->f, partData, doByteswap); } } else { diediedie(EXIT_FAILURE); } return pAct; }
/*--- Implementations of local functions --------------------------------*/ static void local_nullRestOfStructure(cubepm_t cubepm) { assert(cubepm->numFiles > 0); cubepm->fileEndianess = endian_getSystemEndianess(); cubepm->f = NULL; cubepm->mode = CUBEPM_MODE_READ; cubepm->lastOpened = CUBEPM_NUMBER_NONE; for (int i = 0; i < 3; i++) cubepm->fileCoordOffset[i] = NAN; for (int i = 0; i < cubepm->numFiles; i++) cubepm->np_local[i] = CUBEPM_NUMBER_NONE; cubepm->a = NAN; cubepm->t = NAN; cubepm->tau = NAN; cubepm->nts = CUBEPM_NUMBER_NONE; cubepm->dt_f_acc = NAN; cubepm->dt_pp_acc = NAN; cubepm->dt_c_acc = NAN; cubepm->cur_checkpoint = CUBEPM_NUMBER_NONE; cubepm->cur_projection = CUBEPM_NUMBER_NONE; cubepm->cur_halofind = CUBEPM_NUMBER_NONE; cubepm->mass_p = NAN; cubepm->omega0 = NAN; cubepm->lambda0 = NAN; cubepm->boxsize = NAN; }
extern uint64_t art_readFromPage(art_t art, int pageNumber, uint64_t pSkip, uint64_t pRead, stai_t *data) { bool doByteswap = false; endian_t systemEndianess = endian_getSystemEndianess(); assert(art != NULL); assert(art->f != NULL && art->mode == ART_MODE_READ); assert(pageNumber < art->numPagesInThisFile); local_seekToPage(art, pageNumber); if (systemEndianess != artHeader_getFileEndianess(art->header)) doByteswap = true; local_readComponent(art, pSkip, pRead, data[0], doByteswap); local_readComponent(art, pSkip, pRead, data[1], doByteswap); local_readComponent(art, pSkip, pRead, data[2], doByteswap); local_readComponent(art, pSkip, pRead, data[3], doByteswap); local_readComponent(art, pSkip, pRead, data[4], doByteswap); local_readComponent(art, pSkip, pRead, data[5], doByteswap); return pRead; }
/*--- Implementation of local functions ---------------------------------*/ static void local_nullHeader(artHeader_t header) { for (int i = 0; i < ARTHEADER_HEADERSTRING_LENGTH + 1; i++) header->headerString[i] = '\0'; header->aexpn = HUGE_VAL; header->aexp0 = HUGE_VAL; header->amplt = HUGE_VAL; header->astep = HUGE_VAL; header->istep = INT_MAX; header->partw = HUGE_VAL; header->tintg = HUGE_VAL; header->ekin = HUGE_VAL; header->ekin1 = HUGE_VAL; header->ekin2 = HUGE_VAL; header->au0 = HUGE_VAL; header->aeu0 = HUGE_VAL; header->nrowc = INT_MAX; header->ngridc = INT_MAX; header->nspecies = INT_MAX; header->nseed = INT_MAX; header->Om0 = HUGE_VAL; header->Oml0 = HUGE_VAL; header->hubble = HUGE_VAL; header->wp5 = HUGE_VAL; header->Ocurv = HUGE_VAL; for (int i = 0; i < 10; i++) header->wspecies[i] = HUGE_VAL; for (int i = 0; i < 10; i++) header->lspecies[i] = INT64_MAX; for (int i = 30; i < 100; i++) header->extras[i] = HUGE_VAL; header->fileEndianess = endian_getSystemEndianess(); header->factorFileWeightToMsunh = 0.0; header->factorFilePositionToMpch = 0.0; } /* local_nullHeader */
static void local_readHeaderActual(artHeader_t header, FILE *f) { uint32_t b1, b2; endian_t systemEndianess = endian_getSystemEndianess(); xfread(&b1, sizeof(uint32_t), 1, f); xfread(header->headerString, sizeof(char), ARTHEADER_HEADERSTRING_LENGTH, f); header->headerString[ARTHEADER_HEADERSTRING_LENGTH] = '\0'; xfread(&(header->aexpn), sizeof(float), 121, f); xfread(&b2, sizeof(uint32_t), 1, f); if (b1 != b2) { diediedie(EXIT_FAILURE); } if (systemEndianess != header->fileEndianess) local_byteswapHeader(header); local_calcFactorWeight(header); local_calcFactorPosition(header); local_calFactorVelocity(header); }