more consistent error checks on variable length global vecs and arrays
This commit is contained in:
@ -121,7 +121,7 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
prefactor = utils::numeric(FLERR,arg[iarg+1],false,lmp);
|
prefactor = utils::numeric(FLERR,arg[iarg+1],false,lmp);
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
} else if (strcmp(arg[iarg],"file") == 0) {
|
} else if (strcmp(arg[iarg],"file") == 0) {
|
||||||
if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix ave/correlate file", error);
|
if (iarg+2 > nargnew) utils::missing_cmd_args(FLERR, "fix ave/correlate file", error);
|
||||||
if (comm->me == 0) {
|
if (comm->me == 0) {
|
||||||
fp = fopen(arg[iarg+1],"w");
|
fp = fopen(arg[iarg+1],"w");
|
||||||
if (fp == nullptr)
|
if (fp == nullptr)
|
||||||
|
|||||||
@ -178,7 +178,7 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
if (val.argindex && (val.val.f->array_flag == 0))
|
if (val.argindex && (val.val.f->array_flag == 0))
|
||||||
error->all(FLERR,"Fix ave/time fix {} does not calculate an array", val.id);
|
error->all(FLERR,"Fix ave/time fix {} does not calculate an array", val.id);
|
||||||
if (val.argindex && (val.val.f->size_array_rows_variable))
|
if (val.argindex && (val.val.f->size_array_rows_variable))
|
||||||
error->all(FLERR,"Fix ave/time fix {} array cannot be variable length", val.id);
|
error->all(FLERR,"Fix ave/time fix {} array cannot have variable row length", val.id);
|
||||||
if (val.argindex && (val.argindex > val.val.f->size_array_cols))
|
if (val.argindex && (val.argindex > val.val.f->size_array_cols))
|
||||||
error->all(FLERR,"Fix ave/time fix {} array is accessed out-of-range", val.id);
|
error->all(FLERR,"Fix ave/time fix {} array is accessed out-of-range", val.id);
|
||||||
if (nevery % val.val.f->global_freq)
|
if (nevery % val.val.f->global_freq)
|
||||||
|
|||||||
@ -1490,9 +1490,8 @@ void Thermo::compute_compute()
|
|||||||
if (normflag && compute->extscalar) dvalue /= natoms;
|
if (normflag && compute->extscalar) dvalue /= natoms;
|
||||||
} else if (compute_which[m] == VECTOR) {
|
} else if (compute_which[m] == VECTOR) {
|
||||||
if (compute->size_vector_variable && argindex1[ifield] > compute->size_vector)
|
if (compute->size_vector_variable && argindex1[ifield] > compute->size_vector)
|
||||||
dvalue = 0.0;
|
error->all(FLERR, "Thermo compute vector is accessed out-of-range");
|
||||||
else
|
dvalue = compute->vector[argindex1[ifield] - 1];
|
||||||
dvalue = compute->vector[argindex1[ifield] - 1];
|
|
||||||
if (normflag) {
|
if (normflag) {
|
||||||
if (compute->extvector == 0)
|
if (compute->extvector == 0)
|
||||||
return;
|
return;
|
||||||
@ -1503,9 +1502,8 @@ void Thermo::compute_compute()
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (compute->size_array_rows_variable && argindex1[ifield] > compute->size_array_rows)
|
if (compute->size_array_rows_variable && argindex1[ifield] > compute->size_array_rows)
|
||||||
dvalue = 0.0;
|
error->all(FLERR, "Thermo compute array is accessed out-of-range");
|
||||||
else
|
dvalue = compute->array[argindex1[ifield] - 1][argindex2[ifield] - 1];
|
||||||
dvalue = compute->array[argindex1[ifield] - 1][argindex2[ifield] - 1];
|
|
||||||
if (normflag && compute->extarray) dvalue /= natoms;
|
if (normflag && compute->extarray) dvalue /= natoms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1521,6 +1519,8 @@ void Thermo::compute_fix()
|
|||||||
dvalue = fix->compute_scalar();
|
dvalue = fix->compute_scalar();
|
||||||
if (normflag && fix->extscalar) dvalue /= natoms;
|
if (normflag && fix->extscalar) dvalue /= natoms;
|
||||||
} else if (argindex2[ifield] == 0) {
|
} else if (argindex2[ifield] == 0) {
|
||||||
|
if (fix->size_vector_variable && argindex1[ifield] > fix->size_vector)
|
||||||
|
error->all(FLERR, "Thermo fix vector is accessed out-of-range");
|
||||||
dvalue = fix->compute_vector(argindex1[ifield] - 1);
|
dvalue = fix->compute_vector(argindex1[ifield] - 1);
|
||||||
if (normflag) {
|
if (normflag) {
|
||||||
if (fix->extvector == 0)
|
if (fix->extvector == 0)
|
||||||
@ -1531,6 +1531,8 @@ void Thermo::compute_fix()
|
|||||||
dvalue /= natoms;
|
dvalue /= natoms;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (fix->size_array_rows_variable && argindex1[ifield] > fix->size_array_rows)
|
||||||
|
error->all(FLERR, "Thermo fix array is accessed out-of-range");
|
||||||
dvalue = fix->compute_array(argindex1[ifield] - 1, argindex2[ifield] - 1);
|
dvalue = fix->compute_array(argindex1[ifield] - 1, argindex2[ifield] - 1);
|
||||||
if (normflag && fix->extarray) dvalue /= natoms;
|
if (normflag && fix->extarray) dvalue /= natoms;
|
||||||
}
|
}
|
||||||
@ -1547,10 +1549,8 @@ void Thermo::compute_variable()
|
|||||||
else {
|
else {
|
||||||
double *varvec;
|
double *varvec;
|
||||||
int nvec = input->variable->compute_vector(variables[field2index[ifield]], &varvec);
|
int nvec = input->variable->compute_vector(variables[field2index[ifield]], &varvec);
|
||||||
if (nvec < iarg)
|
if (iarg > nvec) error->all(FLERR, "Thermo vector-style variable is accessed out-of-range");
|
||||||
dvalue = 0.0;
|
dvalue = varvec[iarg - 1];
|
||||||
else
|
|
||||||
dvalue = varvec[iarg - 1];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1225,7 +1225,6 @@ int Variable::compute_vector(int ivar, double **result)
|
|||||||
int nlen = size_tree_vector(tree);
|
int nlen = size_tree_vector(tree);
|
||||||
if (nlen == 0)
|
if (nlen == 0)
|
||||||
print_var_error(FLERR,"Vector-style variable has zero length",ivar);
|
print_var_error(FLERR,"Vector-style variable has zero length",ivar);
|
||||||
|
|
||||||
if (nlen < 0)
|
if (nlen < 0)
|
||||||
print_var_error(FLERR,"Inconsistent lengths in vector-style variable",ivar);
|
print_var_error(FLERR,"Inconsistent lengths in vector-style variable",ivar);
|
||||||
|
|
||||||
@ -1535,9 +1534,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!compute->vector_flag)
|
if (!compute->vector_flag)
|
||||||
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
||||||
if (index1 > compute->size_vector &&
|
|
||||||
compute->size_vector_variable == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0);
|
|
||||||
if (!compute->is_initialized())
|
if (!compute->is_initialized())
|
||||||
print_var_error(FLERR,"Variable formula compute cannot be invoked before "
|
print_var_error(FLERR,"Variable formula compute cannot be invoked before "
|
||||||
"initialization by a run",ivar);
|
"initialization by a run",ivar);
|
||||||
@ -1546,10 +1542,14 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
compute->invoked_flag |= Compute::INVOKED_VECTOR;
|
compute->invoked_flag |= Compute::INVOKED_VECTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compute->size_vector_variable &&
|
// wait to check index1 until after compute invocation
|
||||||
index1 > compute->size_vector) value1 = 0.0;
|
// to allow for computes with size_vector_variable == 1
|
||||||
else value1 = compute->vector[index1-1];
|
|
||||||
argstack[nargstack++] = value1;
|
if (index1 > compute->size_vector)
|
||||||
|
print_var_error(FLERR,"Variable formula compute vector is accessed out-of-range",ivar,0);
|
||||||
|
|
||||||
|
value1 = compute->vector[index1-1];
|
||||||
|
argstack[nargstack++] = value1;
|
||||||
|
|
||||||
// c_ID[i][j] = scalar from global array
|
// c_ID[i][j] = scalar from global array
|
||||||
|
|
||||||
@ -1557,9 +1557,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!compute->array_flag)
|
if (!compute->array_flag)
|
||||||
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
||||||
if (index1 > compute->size_array_rows &&
|
|
||||||
compute->size_array_rows_variable == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
|
||||||
if (index2 > compute->size_array_cols)
|
if (index2 > compute->size_array_cols)
|
||||||
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
||||||
if (!compute->is_initialized())
|
if (!compute->is_initialized())
|
||||||
@ -1570,9 +1567,13 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
compute->invoked_flag |= Compute::INVOKED_ARRAY;
|
compute->invoked_flag |= Compute::INVOKED_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compute->size_array_rows_variable &&
|
// wait to check index1 until after compute invocation
|
||||||
index1 > compute->size_array_rows) value1 = 0.0;
|
// to allow for computes with size_array_rows_variable == 1
|
||||||
else value1 = compute->array[index1-1][index2-1];
|
|
||||||
|
if (index1 > compute->size_array_rows)
|
||||||
|
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
||||||
|
|
||||||
|
value1 = compute->array[index1-1][index2-1];
|
||||||
argstack[nargstack++] = value1;
|
argstack[nargstack++] = value1;
|
||||||
|
|
||||||
// C_ID[i] = scalar element of per-atom vector, note uppercase "C"
|
// C_ID[i] = scalar element of per-atom vector, note uppercase "C"
|
||||||
@ -1634,8 +1635,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!compute->vector_flag)
|
if (!compute->vector_flag)
|
||||||
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
||||||
if (compute->size_vector == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula compute vector is zero length",ivar);
|
|
||||||
if (!compute->is_initialized())
|
if (!compute->is_initialized())
|
||||||
print_var_error(FLERR,"Variable formula compute cannot be invoked before "
|
print_var_error(FLERR,"Variable formula compute cannot be invoked before "
|
||||||
"initialization by a run",ivar);
|
"initialization by a run",ivar);
|
||||||
@ -1644,6 +1643,12 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
compute->invoked_flag |= Compute::INVOKED_VECTOR;
|
compute->invoked_flag |= Compute::INVOKED_VECTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wait to check vector size until after compute invocation
|
||||||
|
// to allow for computes with size_vector_variable == 1
|
||||||
|
|
||||||
|
if (compute->size_vector == 0)
|
||||||
|
print_var_error(FLERR,"Variable formula compute vector is zero length",ivar);
|
||||||
|
|
||||||
auto newtree = new Tree();
|
auto newtree = new Tree();
|
||||||
newtree->type = VECTORARRAY;
|
newtree->type = VECTORARRAY;
|
||||||
newtree->array = compute->vector;
|
newtree->array = compute->vector;
|
||||||
@ -1657,8 +1662,6 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!compute->array_flag)
|
if (!compute->array_flag)
|
||||||
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
|
||||||
if (compute->size_array_rows == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula compute array is zero length",ivar);
|
|
||||||
if (index1 > compute->size_array_cols)
|
if (index1 > compute->size_array_cols)
|
||||||
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
print_var_error(FLERR,"Variable formula compute array is accessed out-of-range",ivar,0);
|
||||||
if (!compute->is_initialized())
|
if (!compute->is_initialized())
|
||||||
@ -1669,6 +1672,12 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
compute->invoked_flag |= Compute::INVOKED_ARRAY;
|
compute->invoked_flag |= Compute::INVOKED_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wait to check row count until after compute invocation
|
||||||
|
// to allow for computes with size_array_rows_variable == 1
|
||||||
|
|
||||||
|
if (compute->size_array_rows == 0)
|
||||||
|
print_var_error(FLERR,"Variable formula compute array has zero rows",ivar);
|
||||||
|
|
||||||
auto newtree = new Tree();
|
auto newtree = new Tree();
|
||||||
newtree->type = VECTORARRAY;
|
newtree->type = VECTORARRAY;
|
||||||
newtree->array = &compute->array[0][index1-1];
|
newtree->array = &compute->array[0][index1-1];
|
||||||
@ -1798,8 +1807,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!fix->vector_flag)
|
if (!fix->vector_flag)
|
||||||
print_var_error(FLERR,"Mismatched fix in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched fix in variable formula",ivar);
|
||||||
if (index1 > fix->size_vector &&
|
if (index1 > fix->size_vector)
|
||||||
fix->size_vector_variable == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0);
|
print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range",ivar,0);
|
||||||
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
|
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
|
||||||
print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar);
|
print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar);
|
||||||
@ -1813,8 +1821,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (!fix->array_flag)
|
if (!fix->array_flag)
|
||||||
print_var_error(FLERR,"Mismatched fix in variable formula",ivar);
|
print_var_error(FLERR,"Mismatched fix in variable formula",ivar);
|
||||||
if (index1 > fix->size_array_rows &&
|
if (index1 > fix->size_array_rows)
|
||||||
fix->size_array_rows_variable == 0)
|
|
||||||
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0);
|
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0);
|
||||||
if (index2 > fix->size_array_cols)
|
if (index2 > fix->size_array_cols)
|
||||||
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0);
|
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0);
|
||||||
|
|||||||
Reference in New Issue
Block a user