Skip to content
Snippets Groups Projects
Commit f1e04459 authored by Thomas Jahns's avatar Thomas Jahns :cartwheel: Committed by Sergey Kosukhin
Browse files

Pass large struct by reference.

parent 17c78753
No related branches found
No related tags found
2 merge requests!34Version 2.2.0,!13Consolidation with CDI-PIO (develop)
......@@ -57,7 +57,7 @@ modelRegionCompute(double region[], int nlev, int nlat, int nlon, const int chun
}
void
modelRun(struct model_config setup, MPI_Comm comm)
modelRun(const struct model_config *setup, MPI_Comm comm)
{
struct varDesc_t
{
......@@ -87,8 +87,8 @@ modelRun(struct model_config setup, MPI_Comm comm)
int vdate = 19850101, vtime = 120000;
int rank = 0;
char *filename = NULL;
int nlon = setup.nlon, nlat = setup.nlat;
size_t nVars = setup.nvars > 0 ? (size_t) setup.nvars : 0;
int nlon = setup->nlon, nlat = setup->nlat;
size_t nVars = setup->nvars > 0 ? (size_t) setup->nvars : 0;
size_t varslice_size = 0, varsliceF_size = 0;
;
#if USE_MPI
......@@ -105,15 +105,15 @@ modelRun(struct model_config setup, MPI_Comm comm)
#endif
#if USE_MPI
bool needsGather = setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG;
bool needsGather = setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG;
#else
bool needsGather = true;
#endif
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
var = (double *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup.max_nlev * sizeof(var[0]));
var = (double *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(var[0]));
#if !USE_MPI
varF = (float *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup.max_nlev * sizeof(varF[0]));
varF = (float *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(varF[0]));
#endif
}
......@@ -130,18 +130,18 @@ modelRun(struct model_config setup, MPI_Comm comm)
findPartition2D(npart, comm_size);
rank_coord[0] = rank % npart[0], rank_coord[1] = rank / npart[0];
}
blk_displ = Malloc((size_t) setup.max_nlev * sizeof(blk_displ[0]) * 2);
blk_lens = blk_displ + setup.max_nlev;
blk_displ = Malloc((size_t) setup->max_nlev * sizeof(blk_displ[0]) * 2);
blk_lens = blk_displ + setup->max_nlev;
#endif
var_scale(setup.datatype, &mscale, &mrscale);
var_scale(setup->datatype, &mscale, &mrscale);
gridID = setupGrid(&setup, comm);
gridID = setupGrid(setup, comm);
levs = (double *) Malloc((size_t) setup.max_nlev * sizeof(levs[0]));
levs = (double *) Malloc((size_t) setup->max_nlev * sizeof(levs[0]));
{
double lscale = 1.0 / (double) (setup.max_nlev - 1);
for (size_t i = 0; i < (size_t) setup.max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale);
double lscale = 1.0 / (double) (setup->max_nlev - 1);
for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale);
}
vlistID = vlistCreate();
......@@ -151,9 +151,9 @@ modelRun(struct model_config setup, MPI_Comm comm)
int varLevs = (int) cdi_repeatable_random() % 4;
switch (varLevs)
{
case 1: varLevs = setup.max_nlev / 3; break;
case 2: varLevs = setup.max_nlev >= 11 ? 11 : setup.max_nlev / 2; break;
case 3: varLevs = setup.max_nlev - 1; break;
case 1: varLevs = setup->max_nlev / 3; break;
case 2: varLevs = setup->max_nlev >= 11 ? 11 : setup->max_nlev / 2; break;
case 3: varLevs = setup->max_nlev - 1; break;
}
++varLevs;
varDesc[varIdx].nlev = varLevs;
......@@ -170,7 +170,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_PRESSURE, varDesc[varIdx].nlev);
zaxisDefLevels(varDesc[varIdx].zaxisID, levs);
}
if (setup.flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG)
{
unsigned char uuid[CDI_UUID_SIZE];
if (rank == 0) cdiCreateUUID(uuid);
......@@ -211,7 +211,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
Xt_int varStartXt[3] = { start[0], start[1], 0 };
Xt_idxlist part_idxlist = xt_idxsection_new(0, (varLevs > 1 ? 3 : 2), varSizeXt, chunkSize, varStartXt), gather_idxlist;
varDesc[varIdx].partDesc = part_idxlist;
if (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)
{
if (rank == 0)
{
......@@ -232,36 +232,36 @@ modelRun(struct model_config setup, MPI_Comm comm)
Free(src_blocks);
xt_xmap_delete(xmap4gather);
}
partDescriptionSet:;
}
partDescriptionSet:;
#endif
varDesc[varIdx].code = GRIB_USERDEF + (int) varIdx;
vlistDefVarCode(vlistID, varDesc[varIdx].id, varDesc[varIdx].code);
vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup.datatype);
vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup->datatype);
varDesc[varIdx].useFloat = (bool) (cdi_repeatable_random() & 1);
}
taxisID = taxisCreate(setup.taxistype);
taxisID = taxisCreate(setup->taxistype);
vlistDefTaxis(vlistID, taxisID);
for (tfID = 0; tfID < ntfiles; tfID++)
{
for (size_t varIdx = 0; varIdx < nVars; ++varIdx) varDesc[varIdx].checksum_state = 0;
int streamID = composeStream(&filename, setup.prefix, tfID, setup.suffix, setup.filetype);
int streamID = composeStream(&filename, setup->prefix, tfID, setup->suffix, setup->filetype);
streamDefVlist(streamID, vlistID);
vdate = 19850101;
vtime = 120000;
current_time = cditime2time_t(vdate, vtime);
for (tsID = 0; tsID < setup.nts; tsID++)
for (tsID = 0; tsID < setup->nts; tsID++)
{
int vdatetime[2];
time_t2cditime(current_time, &vdatetime[1], &vdatetime[0]);
taxisDefVdate(taxisID, vdatetime[1]);
taxisDefVtime(taxisID, vdatetime[0]);
streamDefTimestep(streamID, tsID);
if (setup.filetype == CDI_FILETYPE_EXT)
if (setup->filetype == CDI_FILETYPE_EXT)
{
/* EXTRA doesn't store time, only date
* set the value to 0 before checksumming, because a
......@@ -319,7 +319,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
for (size_t i = 0; i < layerSize; ++i) varF[k * layerSize + i] = (float) var[k * layerSize + i];
#endif
}
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) vdatetime, sizeof(vdatetime));
memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) var, varDesc[varIdx].size * sizeof(var[0]));
......@@ -352,10 +352,10 @@ modelRun(struct model_config setup, MPI_Comm comm)
#endif
}
streamClose(streamID);
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
FILE *tablefp;
composeFilename(&filename, setup.prefix, tfID, "cksum");
composeFilename(&filename, setup->prefix, tfID, "cksum");
if (!(tablefp = fopen(filename, "w")))
{
perror("failed to open table file");
......@@ -366,7 +366,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
uint32_t cksum;
int code;
cksum = memcrc_finish(&varDesc[varIdx].checksum_state,
(off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup.nts));
(off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup->nts));
code = vlistInqVarCode(vlistID, varDesc[varIdx].id);
if (fprintf(tablefp, "%08lx %d\n", (unsigned long) cksum, code) < 0)
{
......@@ -392,7 +392,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
zaxisDestroy(zID);
#if USE_MPI
xt_idxlist_delete(varDesc[varIdx].partDesc);
if (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG) xt_redist_delete(varDesc[varIdx].redist4gather);
if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG) xt_redist_delete(varDesc[varIdx].redist4gather);
#endif
for (size_t j = varIdx + 1; j < nVars; ++j)
if (zID == varDesc[j].zaxisID) varDesc[j].zaxisID = CDI_UNDEFID;
......
......@@ -465,7 +465,7 @@ main(int argc, char *argv[])
commModel = -1;
#endif
modelRun(setup, commModel);
modelRun(&setup, commModel);
#ifdef USE_MPI
}
......
......@@ -37,6 +37,6 @@ struct model_config
const char *suffix;
};
void modelRun(struct model_config setup, MPI_Comm comm);
void modelRun(const struct model_config *setup, MPI_Comm comm);
#endif
......@@ -83,7 +83,7 @@ findPartition2D(int npart[2], int num_parts)
#endif
int
setupGrid(struct model_config *setup, MPI_Comm comm)
setupGrid(const struct model_config *setup, MPI_Comm comm)
{
int nlon = setup->nlon, nlat = setup->nlat;
int gridID;
......
......@@ -15,7 +15,7 @@
void findPartition2D(int npart[2], int num_parts);
#endif
int setupGrid(struct model_config *setup, MPI_Comm comm);
int setupGrid(const struct model_config *setup, MPI_Comm comm);
#endif
/*
......
......@@ -53,7 +53,7 @@ modelRegionCompute(double region[], size_t offset, size_t len, int nlev, int nla
}
void
modelRun(struct model_config setup, MPI_Comm comm)
modelRun(const struct model_config *setup, MPI_Comm comm)
{
struct varDesc_t
{
......@@ -79,8 +79,8 @@ modelRun(struct model_config setup, MPI_Comm comm)
int vdate = 19850101, vtime = 120000;
int rank = 0;
char *filename = NULL;
int nlon = setup.nlon, nlat = setup.nlat;
size_t nVars = (size_t) setup.nvars;
int nlon = setup->nlon, nlat = setup->nlat;
size_t nVars = (size_t) setup->nvars;
size_t varslice_size = 0, varsliceF_size = 0;
#if USE_MPI
int *chunks = NULL, *displs = NULL, comm_size = 1;
......@@ -91,30 +91,30 @@ modelRun(struct model_config setup, MPI_Comm comm)
#if USE_MPI
xmpi(MPI_Comm_rank(comm, &rank));
xmpi(MPI_Comm_size(comm, &comm_size));
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
chunks = Malloc((size_t) comm_size * sizeof(chunks[0]));
displs = Malloc((size_t) comm_size * sizeof(displs[0]));
var = Malloc((size_t) nlon * (size_t) nlat * (size_t) setup.max_nlev * sizeof(var[0]));
var = Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(var[0]));
}
#else
(void) comm;
#endif
var_scale(setup.datatype, &mscale, &mrscale);
var_scale(setup->datatype, &mscale, &mrscale);
gridID = setupGrid(&setup, comm);
gridID = setupGrid(setup, comm);
levs = (double *) Malloc((size_t) setup.max_nlev * sizeof(levs[0]));
levs = (double *) Malloc((size_t) setup->max_nlev * sizeof(levs[0]));
{
double lscale = 1.0 / (double) (setup.max_nlev - 1);
for (size_t i = 0; i < (size_t) setup.max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale);
double lscale = 1.0 / (double) (setup->max_nlev - 1);
for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale);
}
vlistID = vlistCreate();
varDesc = (struct varDesc_t *) Malloc(nVars * sizeof(varDesc[0]));
#if USE_MPI
if (setup.flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG)
{
partDescPreset = (Xt_idxlist *) Malloc(nVars * sizeof(*partDescPreset));
conversion = (int *) Malloc(nVars * sizeof(*conversion));
......@@ -125,9 +125,9 @@ modelRun(struct model_config setup, MPI_Comm comm)
int varLevs = (int) cdi_repeatable_random() % 4;
switch (varLevs)
{
case 1: varLevs = setup.max_nlev / 3; break;
case 2: varLevs = setup.max_nlev >= 11 ? 11 : setup.max_nlev / 2; break;
case 3: varLevs = setup.max_nlev - 1; break;
case 1: varLevs = setup->max_nlev / 3; break;
case 2: varLevs = setup->max_nlev >= 11 ? 11 : setup->max_nlev / 2; break;
case 3: varLevs = setup->max_nlev - 1; break;
}
++varLevs;
varDesc[varIdx].nlev = varLevs;
......@@ -144,7 +144,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_PRESSURE, varDesc[varIdx].nlev);
zaxisDefLevels(varDesc[varIdx].zaxisID, levs);
}
if (setup.flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG)
{
unsigned char uuid[CDI_UUID_SIZE];
if (rank == 0) cdiCreateUUID(uuid);
......@@ -177,10 +177,10 @@ modelRun(struct model_config setup, MPI_Comm comm)
#endif
varDesc[varIdx].code = GRIB_USERDEF + (int) varIdx;
vlistDefVarCode(vlistID, varDesc[varIdx].id, varDesc[varIdx].code);
vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup.datatype);
vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup->datatype);
varDesc[varIdx].useFloat = (bool) (cdi_repeatable_random() & 1);
#ifdef USE_MPI
if (setup.flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG)
{
partDescPreset[varIdx] = varDesc[varIdx].partDesc;
conversion[varIdx] = varDesc[varIdx].useFloat ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
......@@ -188,15 +188,15 @@ modelRun(struct model_config setup, MPI_Comm comm)
#endif
}
taxisID = taxisCreate(setup.taxistype);
if (setup.taxisunit != -1) taxisDefTunit(taxisID, setup.taxisunit);
taxisID = taxisCreate(setup->taxistype);
if (setup->taxisunit != -1) taxisDefTunit(taxisID, setup->taxisunit);
vlistDefTaxis(vlistID, taxisID);
for (tfID = 0; tfID < ntfiles; tfID++)
{
for (size_t varIdx = 0; varIdx < nVars; ++varIdx) varDesc[varIdx].checksum_state = 0;
int streamID = composeStream(&filename, setup.prefix, tfID, setup.suffix, setup.filetype);
int streamID = composeStream(&filename, setup->prefix, tfID, setup->suffix, setup->filetype);
#ifdef USE_MPI
if (partDescPreset)
cdiPioStreamDefDecomposedVlist(streamID, vlistID, partDescPreset, conversion);
......@@ -207,14 +207,14 @@ modelRun(struct model_config setup, MPI_Comm comm)
vdate = 19850101;
vtime = 120000;
current_time = cditime2time_t(vdate, vtime);
for (tsID = 0; tsID < setup.nts; tsID++)
for (tsID = 0; tsID < setup->nts; tsID++)
{
int vdatetime[2];
time_t2cditime(current_time, &vdatetime[1], &vdatetime[0]);
taxisDefVdate(taxisID, vdatetime[1]);
taxisDefVtime(taxisID, vdatetime[0]);
streamDefTimestep(streamID, tsID);
if (setup.filetype == CDI_FILETYPE_EXT)
if (setup->filetype == CDI_FILETYPE_EXT)
{
/* EXTRA doesn't store time, only date
* set the value to 0 before checksumming, because a
......@@ -248,7 +248,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
for (size_t i = 0; i < chunkSize; ++i) varslice[i] = varsliceF[i] = (float) varslice[i];
}
if (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)
if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)
{
#if USE_MPI
int chunk = (int) chunkSize;
......@@ -267,7 +267,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
var = varslice;
#endif
}
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) vdatetime, sizeof(vdatetime));
memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) var, varDesc[varIdx].size * sizeof(var[0]));
......@@ -291,10 +291,10 @@ modelRun(struct model_config setup, MPI_Comm comm)
#endif
}
streamClose(streamID);
if (rank == 0 && (setup.flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG))
{
FILE *tablefp;
composeFilename(&filename, setup.prefix, tfID, "cksum");
composeFilename(&filename, setup->prefix, tfID, "cksum");
if (!(tablefp = fopen(filename, "w")))
{
perror("failed to open table file");
......@@ -304,7 +304,7 @@ modelRun(struct model_config setup, MPI_Comm comm)
{
uint32_t cksum
= memcrc_finish(&varDesc[varIdx].checksum_state,
(off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup.nts));
(off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup->nts));
int code = vlistInqVarCode(vlistID, varDesc[varIdx].id);
if (fprintf(tablefp, "%08lx %d\n", (unsigned long) cksum, code) < 0)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment