From af88cec22df5ad39e7670a38d4ba35c7fc21769e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 5 Apr 2024 15:12:46 -0600 Subject: [PATCH] relax error check on fixes that produce variable size vectors/arrays --- src/thermo.cpp | 20 ++++++++++++-------- src/variable.cpp | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/thermo.cpp b/src/thermo.cpp index 5ef5eb59b8..128f8573cf 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -1515,15 +1515,16 @@ void Thermo::compute_fix() int m = field2index[ifield]; Fix *fix = fixes[m]; - // check for out-of-range access if vector/array is variable length - if (argindex1[ifield] == 0) { dvalue = fix->compute_scalar(); if (normflag && fix->extscalar) dvalue /= natoms; } 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); + + // 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 && argindex1[ifield] > fix->size_vector) dvalue = 0.0; + else dvalue = fix->compute_vector(argindex1[ifield] - 1); if (normflag) { if (fix->extvector == 0) return; @@ -1533,9 +1534,12 @@ void Thermo::compute_fix() dvalue /= natoms; } } 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); + + // 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 && 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; } } diff --git a/src/variable.cpp b/src/variable.cpp index c99e4a4761..896b193313 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1807,12 +1807,16 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!fix->vector_flag) 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); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) 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; // f_ID[i][j] = scalar from global array @@ -1821,14 +1825,18 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!fix->array_flag) 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); if (index2 > fix->size_array_cols) print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) 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; // F_ID[i] = scalar element of per-atom vector, note uppercase "F"