BUG: Proper handling of bigint data. Corrects behavior when compiled with LAMMPS_BIGBIG.
This commit is contained in:
@ -43,7 +43,8 @@
|
|||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
using namespace MathConst;
|
using namespace MathConst;
|
||||||
|
|
||||||
enum{INT,FLOAT,BIGINT}; // same as in thermo.cpp
|
enum{THERMO_INT,THERMO_FLOAT,THERMO_BIGINT}; // same as in thermo.cpp
|
||||||
|
enum{DUMP_INT,DUMP_DOUBLE,DUMP_STRING,DUMP_BIGINT}; // same as in DumpCFG
|
||||||
|
|
||||||
const char NC_FRAME_STR[] = "frame";
|
const char NC_FRAME_STR[] = "frame";
|
||||||
const char NC_SPATIAL_STR[] = "spatial";
|
const char NC_SPATIAL_STR[] = "spatial";
|
||||||
@ -121,10 +122,6 @@ DumpNetCDF::DumpNetCDF(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
ndims = 3;
|
ndims = 3;
|
||||||
strcpy(mangled, "velocities");
|
strcpy(mangled, "velocities");
|
||||||
}
|
}
|
||||||
// extensions to the AMBER specification
|
|
||||||
else if (!strcmp(mangled, "type")) {
|
|
||||||
strcpy(mangled, "atom_types");
|
|
||||||
}
|
|
||||||
else if (!strcmp(mangled, "xs") || !strcmp(mangled, "ys") ||
|
else if (!strcmp(mangled, "xs") || !strcmp(mangled, "ys") ||
|
||||||
!strcmp(mangled, "zs")) {
|
!strcmp(mangled, "zs")) {
|
||||||
idim = mangled[0] - 'x';
|
idim = mangled[0] - 'x';
|
||||||
@ -409,10 +406,11 @@ void DumpNetCDF::openfile()
|
|||||||
nc_type xtype;
|
nc_type xtype;
|
||||||
|
|
||||||
// Type mangling
|
// Type mangling
|
||||||
if (vtype[perat[i].field[0]] == INT) {
|
if (vtype[perat[i].field[0]] == DUMP_INT) {
|
||||||
xtype = NC_INT;
|
xtype = NC_INT;
|
||||||
}
|
} else if (vtype[perat[i].field[0]] == DUMP_BIGINT) {
|
||||||
else {
|
xtype = NC_INT64;
|
||||||
|
} else {
|
||||||
if (double_precision)
|
if (double_precision)
|
||||||
xtype = NC_DOUBLE;
|
xtype = NC_DOUBLE;
|
||||||
else
|
else
|
||||||
@ -476,15 +474,15 @@ void DumpNetCDF::openfile()
|
|||||||
if (thermo) {
|
if (thermo) {
|
||||||
Thermo *th = output->thermo;
|
Thermo *th = output->thermo;
|
||||||
for (int i = 0; i < th->nfield; i++) {
|
for (int i = 0; i < th->nfield; i++) {
|
||||||
if (th->vtype[i] == FLOAT) {
|
if (th->vtype[i] == THERMO_FLOAT) {
|
||||||
NCERRX( nc_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims,
|
NCERRX( nc_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == INT) {
|
else if (th->vtype[i] == THERMO_INT) {
|
||||||
NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT, 1, dims,
|
NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == BIGINT) {
|
else if (th->vtype[i] == THERMO_BIGINT) {
|
||||||
#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG)
|
#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG)
|
||||||
NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT64, 1, dims,
|
NCERRX( nc_def_var(ncid, th->keyword[i], NC_INT64, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
@ -645,6 +643,52 @@ int nc_put_var1_bigint<long long>(int ncid, int varid, const size_t index[],
|
|||||||
return nc_put_var1_longlong(ncid, varid, index, tp);
|
return nc_put_var1_longlong(ncid, varid, index, tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
int nc_put_vara_bigint(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[], const T* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vara_int(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int nc_put_vara_bigint<long>(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[], const long* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vara_long(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int nc_put_vara_bigint<long long>(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[], const long long* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vara_longlong(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
int nc_put_vars_bigint(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[], const ptrdiff_t stride[],
|
||||||
|
const T* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vars_int(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int nc_put_vars_bigint<long>(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[], const ptrdiff_t stride[],
|
||||||
|
const long* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vars_long(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int nc_put_vars_bigint<long long>(int ncid, int varid, const size_t start[],
|
||||||
|
const size_t count[],
|
||||||
|
const ptrdiff_t stride[],
|
||||||
|
const long long* tp)
|
||||||
|
{
|
||||||
|
return nc_put_vars_longlong(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
void DumpNetCDF::write()
|
void DumpNetCDF::write()
|
||||||
{
|
{
|
||||||
// open file
|
// open file
|
||||||
@ -666,16 +710,16 @@ void DumpNetCDF::write()
|
|||||||
for (int i = 0; i < th->nfield; i++) {
|
for (int i = 0; i < th->nfield; i++) {
|
||||||
th->call_vfunc(i);
|
th->call_vfunc(i);
|
||||||
if (filewriter) {
|
if (filewriter) {
|
||||||
if (th->vtype[i] == FLOAT) {
|
if (th->vtype[i] == THERMO_FLOAT) {
|
||||||
NCERRX( nc_put_var1_double(ncid, thermovar[i], start,
|
NCERRX( nc_put_var1_double(ncid, thermovar[i], start,
|
||||||
&th->dvalue),
|
&th->dvalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == INT) {
|
else if (th->vtype[i] == THERMO_INT) {
|
||||||
NCERRX( nc_put_var1_int(ncid, thermovar[i], start, &th->ivalue),
|
NCERRX( nc_put_var1_int(ncid, thermovar[i], start, &th->ivalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == BIGINT) {
|
else if (th->vtype[i] == THERMO_BIGINT) {
|
||||||
NCERRX( nc_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue),
|
NCERRX( nc_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
@ -776,16 +820,16 @@ void DumpNetCDF::write_data(int n, double *mybuf)
|
|||||||
|
|
||||||
if (!int_buffer) {
|
if (!int_buffer) {
|
||||||
n_buffer = n;
|
n_buffer = n;
|
||||||
int_buffer = (int *)
|
int_buffer = (bigint *)
|
||||||
memory->smalloc(n*sizeof(int),"dump::int_buffer");
|
memory->smalloc(n*sizeof(bigint),"dump::int_buffer");
|
||||||
double_buffer = (double *)
|
double_buffer = (double *)
|
||||||
memory->smalloc(n*sizeof(double),"dump::double_buffer");
|
memory->smalloc(n*sizeof(double),"dump::double_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n > n_buffer) {
|
if (n > n_buffer) {
|
||||||
n_buffer = n;
|
n_buffer = n;
|
||||||
int_buffer = (int *)
|
int_buffer = (bigint *)
|
||||||
memory->srealloc(int_buffer, n*sizeof(int),"dump::int_buffer");
|
memory->srealloc(int_buffer, n*sizeof(bigint),"dump::int_buffer");
|
||||||
double_buffer = (double *)
|
double_buffer = (double *)
|
||||||
memory->srealloc(double_buffer, n*sizeof(double),"dump::double_buffer");
|
memory->srealloc(double_buffer, n*sizeof(double),"dump::double_buffer");
|
||||||
}
|
}
|
||||||
@ -805,7 +849,7 @@ void DumpNetCDF::write_data(int n, double *mybuf)
|
|||||||
for (int i = 0; i < n_perat; i++) {
|
for (int i = 0; i < n_perat; i++) {
|
||||||
int iaux = perat[i].field[0];
|
int iaux = perat[i].field[0];
|
||||||
|
|
||||||
if (vtype[iaux] == INT) {
|
if (vtype[iaux] == DUMP_INT || vtype[iaux] == DUMP_BIGINT) {
|
||||||
// integers
|
// integers
|
||||||
if (perat[i].dims > 1) {
|
if (perat[i].dims > 1) {
|
||||||
|
|
||||||
@ -813,41 +857,55 @@ void DumpNetCDF::write_data(int n, double *mybuf)
|
|||||||
iaux = perat[i].field[idim];
|
iaux = perat[i].field[idim];
|
||||||
|
|
||||||
if (iaux >= 0) {
|
if (iaux >= 0) {
|
||||||
for (int j = 0; j < n; j++, iaux+=size_one) {
|
if (vtype[iaux] == DUMP_INT) {
|
||||||
int_buffer[j] = mybuf[iaux];
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<int>(mybuf[iaux]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // DUMP_BIGINT
|
||||||
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<bigint>(mybuf[iaux]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
start[2] = idim;
|
start[2] = idim;
|
||||||
|
|
||||||
if (perat[i].constant) {
|
if (perat[i].constant) {
|
||||||
if (perat[i].ndumped < ntotalgr) {
|
if (perat[i].ndumped < ntotalgr) {
|
||||||
NCERR( nc_put_vars_int(ncid, perat[i].var,
|
NCERR( nc_put_vars_bigint(ncid, perat[i].var,
|
||||||
start+1, count+1, stride+1,
|
start+1, count+1, stride+1,
|
||||||
int_buffer) );
|
int_buffer) );
|
||||||
perat[i].ndumped += n;
|
perat[i].ndumped += n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
NCERR( nc_put_vars_int(ncid, perat[i].var, start, count, stride,
|
NCERR( nc_put_vars_bigint(ncid, perat[i].var, start, count, stride,
|
||||||
int_buffer) );
|
int_buffer) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (int j = 0; j < n; j++, iaux+=size_one) {
|
if (vtype[iaux] == DUMP_INT) {
|
||||||
int_buffer[j] = mybuf[iaux];
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<int>(mybuf[iaux]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // DUMP_BIGINT
|
||||||
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<bigint>(mybuf[iaux]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (perat[i].constant) {
|
if (perat[i].constant) {
|
||||||
if (perat[i].ndumped < ntotalgr) {
|
if (perat[i].ndumped < ntotalgr) {
|
||||||
NCERR( nc_put_vara_int(ncid, perat[i].var, start+1, count+1,
|
NCERR( nc_put_vara_bigint(ncid, perat[i].var, start+1, count+1,
|
||||||
int_buffer) );
|
int_buffer) );
|
||||||
perat[i].ndumped += n;
|
perat[i].ndumped += n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
NCERR( nc_put_vara_int(ncid, perat[i].var, start, count,
|
NCERR( nc_put_vara_bigint(ncid, perat[i].var, start, count,
|
||||||
int_buffer) );
|
int_buffer) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@ -66,7 +66,7 @@ class DumpNetCDF : public DumpCustom {
|
|||||||
bool thermo; // write thermo output to netcdf file
|
bool thermo; // write thermo output to netcdf file
|
||||||
|
|
||||||
bigint n_buffer; // size of buffer
|
bigint n_buffer; // size of buffer
|
||||||
int *int_buffer; // buffer for passing data to netcdf
|
bigint *int_buffer; // buffer for passing data to netcdf
|
||||||
double *double_buffer; // buffer for passing data to netcdf
|
double *double_buffer; // buffer for passing data to netcdf
|
||||||
|
|
||||||
int ncid;
|
int ncid;
|
||||||
|
|||||||
@ -43,7 +43,8 @@
|
|||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
using namespace MathConst;
|
using namespace MathConst;
|
||||||
|
|
||||||
enum{INT,FLOAT,BIGINT}; // same as in thermo.cpp
|
enum{THERMO_INT,THERMO_FLOAT,THERMO_BIGINT}; // same as in thermo.cpp
|
||||||
|
enum{DUMP_INT,DUMP_DOUBLE,DUMP_STRING,DUMP_BIGINT}; // same as in DumpCFG
|
||||||
|
|
||||||
const char NC_FRAME_STR[] = "frame";
|
const char NC_FRAME_STR[] = "frame";
|
||||||
const char NC_SPATIAL_STR[] = "spatial";
|
const char NC_SPATIAL_STR[] = "spatial";
|
||||||
@ -404,10 +405,11 @@ void DumpNetCDFMPIIO::openfile()
|
|||||||
nc_type xtype;
|
nc_type xtype;
|
||||||
|
|
||||||
// Type mangling
|
// Type mangling
|
||||||
if (vtype[perat[i].field[0]] == INT) {
|
if (vtype[perat[i].field[0]] == DUMP_INT) {
|
||||||
xtype = NC_INT;
|
xtype = NC_INT;
|
||||||
}
|
} else if (vtype[perat[i].field[0]] == DUMP_BIGINT) {
|
||||||
else {
|
xtype = NC_INT64;
|
||||||
|
} else {
|
||||||
if (double_precision)
|
if (double_precision)
|
||||||
xtype = NC_DOUBLE;
|
xtype = NC_DOUBLE;
|
||||||
else
|
else
|
||||||
@ -443,15 +445,15 @@ void DumpNetCDFMPIIO::openfile()
|
|||||||
if (thermo) {
|
if (thermo) {
|
||||||
Thermo *th = output->thermo;
|
Thermo *th = output->thermo;
|
||||||
for (int i = 0; i < th->nfield; i++) {
|
for (int i = 0; i < th->nfield; i++) {
|
||||||
if (th->vtype[i] == FLOAT) {
|
if (th->vtype[i] == THERMO_FLOAT) {
|
||||||
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims,
|
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_DOUBLE, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == INT) {
|
else if (th->vtype[i] == THERMO_INT) {
|
||||||
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT, 1, dims,
|
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == BIGINT) {
|
else if (th->vtype[i] == THERMO_BIGINT) {
|
||||||
#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG)
|
#if defined(LAMMPS_SMALLBIG) || defined(LAMMPS_BIGBIG)
|
||||||
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT64, 1, dims,
|
NCERRX( ncmpi_def_var(ncid, th->keyword[i], NC_INT64, 1, dims,
|
||||||
&thermovar[i]), th->keyword[i] );
|
&thermovar[i]), th->keyword[i] );
|
||||||
@ -602,25 +604,77 @@ void DumpNetCDFMPIIO::closefile()
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
int ncmpi_put_var1_bigint(int ncid, int varid, const MPI_Offset index[],
|
int ncmpi_put_var1_bigint(int ncid, int varid, const MPI_Offset index[],
|
||||||
const T* tp)
|
const T* tp)
|
||||||
{
|
{
|
||||||
return ncmpi_put_var1_int(ncid, varid, index, tp);
|
return ncmpi_put_var1_int(ncid, varid, index, tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
int ncmpi_put_var1_bigint<long>(int ncid, int varid, const MPI_Offset index[],
|
int ncmpi_put_var1_bigint<long>(int ncid, int varid, const MPI_Offset index[],
|
||||||
const long* tp)
|
const long* tp)
|
||||||
{
|
{
|
||||||
return ncmpi_put_var1_long(ncid, varid, index, tp);
|
return ncmpi_put_var1_long(ncid, varid, index, tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
int ncmpi_put_var1_bigint<long long>(int ncid, int varid, const MPI_Offset index[],
|
int ncmpi_put_var1_bigint<long long>(int ncid, int varid,
|
||||||
const long long* tp)
|
const MPI_Offset index[],
|
||||||
|
const long long* tp)
|
||||||
{
|
{
|
||||||
return ncmpi_put_var1_longlong(ncid, varid, index, tp);
|
return ncmpi_put_var1_longlong(ncid, varid, index, tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
int ncmpi_put_vara_bigint_all(int ncid, int varid, const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[], const T* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vara_int_all(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int ncmpi_put_vara_bigint_all<long>(int ncid, int varid,
|
||||||
|
const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[], const long* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vara_long_all(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int ncmpi_put_vara_bigint_all<long long>(int ncid, int varid,
|
||||||
|
const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[],
|
||||||
|
const long long* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vara_longlong_all(ncid, varid, start, count, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
int ncmpi_put_vars_bigint_all(int ncid, int varid, const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[],
|
||||||
|
const MPI_Offset stride[], const T* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vars_int_all(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int ncmpi_put_vars_bigint_all<long>(int ncid, int varid,
|
||||||
|
const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[],
|
||||||
|
const MPI_Offset stride[], const long* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vars_long_all(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int ncmpi_put_vars_bigint_all<long long>(int ncid, int varid,
|
||||||
|
const MPI_Offset start[],
|
||||||
|
const MPI_Offset count[],
|
||||||
|
const MPI_Offset stride[],
|
||||||
|
const long long* tp)
|
||||||
|
{
|
||||||
|
return ncmpi_put_vars_longlong_all(ncid, varid, start, count, stride, tp);
|
||||||
|
}
|
||||||
|
|
||||||
void DumpNetCDFMPIIO::write()
|
void DumpNetCDFMPIIO::write()
|
||||||
{
|
{
|
||||||
// open file
|
// open file
|
||||||
@ -644,16 +698,16 @@ void DumpNetCDFMPIIO::write()
|
|||||||
for (int i = 0; i < th->nfield; i++) {
|
for (int i = 0; i < th->nfield; i++) {
|
||||||
th->call_vfunc(i);
|
th->call_vfunc(i);
|
||||||
if (filewriter) {
|
if (filewriter) {
|
||||||
if (th->vtype[i] == FLOAT) {
|
if (th->vtype[i] == THERMO_FLOAT) {
|
||||||
NCERRX( ncmpi_put_var1_double(ncid, thermovar[i], start,
|
NCERRX( ncmpi_put_var1_double(ncid, thermovar[i], start,
|
||||||
&th->dvalue),
|
&th->dvalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == INT) {
|
else if (th->vtype[i] == THERMO_INT) {
|
||||||
NCERRX( ncmpi_put_var1_int(ncid, thermovar[i], start, &th->ivalue),
|
NCERRX( ncmpi_put_var1_int(ncid, thermovar[i], start, &th->ivalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
else if (th->vtype[i] == BIGINT) {
|
else if (th->vtype[i] == THERMO_BIGINT) {
|
||||||
NCERRX( ncmpi_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue),
|
NCERRX( ncmpi_put_var1_bigint(ncid, thermovar[i], start, &th->bivalue),
|
||||||
th->keyword[i] );
|
th->keyword[i] );
|
||||||
}
|
}
|
||||||
@ -782,16 +836,16 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf)
|
|||||||
|
|
||||||
if (!int_buffer) {
|
if (!int_buffer) {
|
||||||
n_buffer = std::max(1, n);
|
n_buffer = std::max(1, n);
|
||||||
int_buffer = (int *)
|
int_buffer = (bigint *)
|
||||||
memory->smalloc(n_buffer*sizeof(int),"dump::int_buffer");
|
memory->smalloc(n_buffer*sizeof(bigint),"dump::int_buffer");
|
||||||
double_buffer = (double *)
|
double_buffer = (double *)
|
||||||
memory->smalloc(n_buffer*sizeof(double),"dump::double_buffer");
|
memory->smalloc(n_buffer*sizeof(double),"dump::double_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n > n_buffer) {
|
if (n > n_buffer) {
|
||||||
n_buffer = std::max(1, n);
|
n_buffer = std::max(1, n);
|
||||||
int_buffer = (int *)
|
int_buffer = (bigint *)
|
||||||
memory->srealloc(int_buffer, n_buffer*sizeof(int),"dump::int_buffer");
|
memory->srealloc(int_buffer, n_buffer*sizeof(bigint),"dump::int_buffer");
|
||||||
double_buffer = (double *)
|
double_buffer = (double *)
|
||||||
memory->srealloc(double_buffer, n_buffer*sizeof(double),
|
memory->srealloc(double_buffer, n_buffer*sizeof(double),
|
||||||
"dump::double_buffer");
|
"dump::double_buffer");
|
||||||
@ -824,7 +878,7 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf)
|
|||||||
error->one(FLERR,errmsg);
|
error->one(FLERR,errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vtype[iaux] == INT) {
|
if (vtype[iaux] == DUMP_INT || vtype[iaux] == DUMP_BIGINT) {
|
||||||
// integers
|
// integers
|
||||||
if (perat[i].dims > 1) {
|
if (perat[i].dims > 1) {
|
||||||
|
|
||||||
@ -839,13 +893,21 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf)
|
|||||||
error->one(FLERR,errmsg);
|
error->one(FLERR,errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < n; j++, iaux+=size_one) {
|
if (vtype[iaux] == DUMP_INT) {
|
||||||
int_buffer[j] = mybuf[iaux];
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<int>(mybuf[iaux]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // DUMP_BIGINT
|
||||||
|
for (int j = 0; j < n; j++, iaux+=size_one) {
|
||||||
|
int_buffer[j] = static_cast<bigint>(mybuf[iaux]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
start[2] = idim;
|
start[2] = idim;
|
||||||
NCERRX( ncmpi_put_vars_int_all(ncid, perat[i].var, start, count,
|
NCERRX( ncmpi_put_vars_bigint_all(ncid, perat[i].var, start, count,
|
||||||
stride, int_buffer), perat[i].name );
|
stride, int_buffer),
|
||||||
|
perat[i].name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -854,8 +916,8 @@ void DumpNetCDFMPIIO::write_data(int n, double *mybuf)
|
|||||||
int_buffer[j] = mybuf[iaux];
|
int_buffer[j] = mybuf[iaux];
|
||||||
}
|
}
|
||||||
|
|
||||||
NCERRX( ncmpi_put_vara_int_all(ncid, perat[i].var, start, count,
|
NCERRX( ncmpi_put_vara_bigint_all(ncid, perat[i].var, start, count,
|
||||||
int_buffer), perat[i].name );
|
int_buffer), perat[i].name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@ -65,7 +65,7 @@ class DumpNetCDFMPIIO : public DumpCustom {
|
|||||||
bool thermo; // write thermo output to netcdf file
|
bool thermo; // write thermo output to netcdf file
|
||||||
|
|
||||||
bigint n_buffer; // size of buffer
|
bigint n_buffer; // size of buffer
|
||||||
int *int_buffer; // buffer for passing data to netcdf
|
bigint *int_buffer; // buffer for passing data to netcdf
|
||||||
double *double_buffer; // buffer for passing data to netcdf
|
double *double_buffer; // buffer for passing data to netcdf
|
||||||
|
|
||||||
int ncid;
|
int ncid;
|
||||||
|
|||||||
Reference in New Issue
Block a user