Merge pull request #4126 from lammps/global-vector-access
Relax error check on accessing fixes that produce variable size vectors/arrays
This commit is contained in:
@ -1515,15 +1515,16 @@ void Thermo::compute_fix()
|
|||||||
int m = field2index[ifield];
|
int m = field2index[ifield];
|
||||||
Fix *fix = fixes[m];
|
Fix *fix = fixes[m];
|
||||||
|
|
||||||
// check for out-of-range access if vector/array is variable length
|
|
||||||
|
|
||||||
if (argindex1[ifield] == 0) {
|
if (argindex1[ifield] == 0) {
|
||||||
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");
|
// if index exceeds variable vector length, use a zero value
|
||||||
dvalue = fix->compute_vector(argindex1[ifield] - 1);
|
// this can be useful if vector length is not known a priori
|
||||||
|
|
||||||
|
if (fix->size_vector_variable && argindex1[ifield] > fix->size_vector) dvalue = 0.0;
|
||||||
|
else dvalue = fix->compute_vector(argindex1[ifield] - 1);
|
||||||
if (normflag) {
|
if (normflag) {
|
||||||
if (fix->extvector == 0)
|
if (fix->extvector == 0)
|
||||||
return;
|
return;
|
||||||
@ -1533,9 +1534,12 @@ 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");
|
// if index exceeds variable array rows, use a zero value
|
||||||
dvalue = fix->compute_array(argindex1[ifield] - 1, argindex2[ifield] - 1);
|
// this can be useful if array size is not known a priori
|
||||||
|
|
||||||
|
if (fix->size_array_rows_variable && argindex1[ifield] > fix->size_array_rows) dvalue = 0.0;
|
||||||
|
else dvalue = fix->compute_array(argindex1[ifield] - 1, argindex2[ifield] - 1);
|
||||||
if (normflag && fix->extarray) dvalue /= natoms;
|
if (normflag && fix->extarray) dvalue /= natoms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1809,12 +1809,16 @@ 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);
|
||||||
|
|
||||||
value1 = fix->compute_vector(index1-1);
|
// if index exceeds variable vector length, use a zero value
|
||||||
|
// this can be useful if vector length is not known a priori
|
||||||
|
|
||||||
|
if (fix->size_vector_variable && index1 > fix->size_vector) value1 = 0.0;
|
||||||
|
else value1 = fix->compute_vector(index1-1);
|
||||||
argstack[nargstack++] = value1;
|
argstack[nargstack++] = value1;
|
||||||
|
|
||||||
// f_ID[i][j] = scalar from global array
|
// f_ID[i][j] = scalar from global array
|
||||||
@ -1823,14 +1827,18 @@ 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);
|
||||||
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);
|
||||||
|
|
||||||
value1 = fix->compute_array(index1-1,index2-1);
|
// if index exceeds variable array rows, use a zero value
|
||||||
|
// this can be useful if array size is not known a priori
|
||||||
|
|
||||||
|
if (fix->size_array_rows_variable && index1 > fix->size_array_rows) value1 = 0.0;
|
||||||
|
else value1 = fix->compute_array(index1-1,index2-1);
|
||||||
argstack[nargstack++] = value1;
|
argstack[nargstack++] = value1;
|
||||||
|
|
||||||
// F_ID[i] = scalar element of per-atom vector, note uppercase "F"
|
// F_ID[i] = scalar element of per-atom vector, note uppercase "F"
|
||||||
|
|||||||
Reference in New Issue
Block a user