make checks for exceeding length of variable-length vectors more consistent

This commit is contained in:
Steve Plimpton
2024-04-04 14:11:13 -06:00
parent 2c26586b1a
commit 66d042a0ee
5 changed files with 22 additions and 9 deletions

View File

@ -454,6 +454,8 @@ void FixAveCorrelateLong::end_of_step()
scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable
// if index exceeds vector length, use a zero value
// this can be useful if vector length is not known a priori
} else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0)
@ -462,7 +464,7 @@ void FixAveCorrelateLong::end_of_step()
double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec);
int index = val.argindex;
if (nvec < index) scalar = 0.0;
if (index > nvec) scalar = 0.0;
else scalar = varvec[index-1];
}
}

View File

@ -414,6 +414,8 @@ void FixAveCorrelate::end_of_step()
scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable
// if index exceeds vector length, use a zero value
// this can be useful if vector length is not known a priori
} else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0)
@ -422,7 +424,7 @@ void FixAveCorrelate::end_of_step()
double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec);
int index = val.argindex;
if (nvec < index) scalar = 0.0;
if (index > nvec) scalar = 0.0;
else scalar = varvec[index-1];
}
}

View File

@ -600,6 +600,8 @@ void FixAveHisto::end_of_step()
}
// evaluate equal-style or vector-style or atom-style variable
// if index exceeds vector length, use a zero value
// this can be useful if vector length is not known a priori
} else if (val.which == ArgInfo::VARIABLE) {
if (kind == GLOBAL && mode == SCALAR) {
@ -607,7 +609,7 @@ void FixAveHisto::end_of_step()
else {
double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec);
if (nvec < j) bin_one(0.0);
if (j > nvec) bin_one(0.0);
else bin_one(varvec[j-1]);
}

View File

@ -562,7 +562,8 @@ void FixAveTime::invoke_scalar(bigint ntimestep)
scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable
// ensure no out-of-range access to vector-style variable
// if index exceeds vector length, use a zero value
// this can be useful if vector length is not known a priori
} else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0)
@ -570,7 +571,7 @@ void FixAveTime::invoke_scalar(bigint ntimestep)
else {
double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec);
if (nvec < val.argindex) scalar = 0.0;
if (val.argindex > nvec) scalar = 0.0;
else scalar = varvec[val.argindex-1];
}
}

View File

@ -1515,6 +1515,8 @@ 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;
@ -1544,13 +1546,17 @@ void Thermo::compute_variable()
{
int iarg = argindex1[ifield];
// evaluate equal-style or vector-style variable
// if index exceeds vector length, use a zero value
// this can be useful if vector length is not known a priori
if (iarg == 0)
dvalue = input->variable->compute_equal(variables[field2index[ifield]]);
else {
double *varvec;
int nvec = input->variable->compute_vector(variables[field2index[ifield]], &varvec);
if (iarg > nvec) error->all(FLERR, "Thermo vector-style variable is accessed out-of-range");
dvalue = varvec[iarg - 1];
if (iarg > nvec) dvalue = 0.0;
else dvalue = varvec[iarg - 1];
}
}