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); scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable // 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) { } else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0) if (val.argindex == 0)
@ -462,7 +464,7 @@ void FixAveCorrelateLong::end_of_step()
double *varvec; double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec); int nvec = input->variable->compute_vector(val.val.v,&varvec);
int index = val.argindex; int index = val.argindex;
if (nvec < index) scalar = 0.0; if (index > nvec) scalar = 0.0;
else scalar = varvec[index-1]; else scalar = varvec[index-1];
} }
} }

View File

@ -414,7 +414,9 @@ void FixAveCorrelate::end_of_step()
scalar = val.val.f->compute_vector(val.argindex-1); scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable // 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) { } else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0) if (val.argindex == 0)
scalar = input->variable->compute_equal(val.val.v); scalar = input->variable->compute_equal(val.val.v);
@ -422,7 +424,7 @@ void FixAveCorrelate::end_of_step()
double *varvec; double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&varvec); int nvec = input->variable->compute_vector(val.val.v,&varvec);
int index = val.argindex; int index = val.argindex;
if (nvec < index) scalar = 0.0; if (index > nvec) scalar = 0.0;
else scalar = varvec[index-1]; 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 // 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) { } else if (val.which == ArgInfo::VARIABLE) {
if (kind == GLOBAL && mode == SCALAR) { if (kind == GLOBAL && mode == SCALAR) {
@ -607,7 +609,7 @@ void FixAveHisto::end_of_step()
else { else {
double *varvec; double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&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]); else bin_one(varvec[j-1]);
} }
@ -637,7 +639,7 @@ void FixAveHisto::end_of_step()
modify->addstep_compute(nvalid); modify->addstep_compute(nvalid);
return; return;
} }
irepeat = 0; irepeat = 0;
nvalid = ntimestep + nfreq - static_cast<bigint>(nrepeat-1)*nevery; nvalid = ntimestep + nfreq - static_cast<bigint>(nrepeat-1)*nevery;
modify->addstep_compute(nvalid); modify->addstep_compute(nvalid);

View File

@ -562,7 +562,8 @@ void FixAveTime::invoke_scalar(bigint ntimestep)
scalar = val.val.f->compute_vector(val.argindex-1); scalar = val.val.f->compute_vector(val.argindex-1);
// evaluate equal-style or vector-style variable // 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) { } else if (val.which == ArgInfo::VARIABLE) {
if (val.argindex == 0) if (val.argindex == 0)
@ -570,7 +571,7 @@ void FixAveTime::invoke_scalar(bigint ntimestep)
else { else {
double *varvec; double *varvec;
int nvec = input->variable->compute_vector(val.val.v,&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]; else scalar = varvec[val.argindex-1];
} }
} }

View File

@ -1515,6 +1515,8 @@ 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;
@ -1544,13 +1546,17 @@ void Thermo::compute_variable()
{ {
int iarg = argindex1[ifield]; 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) if (iarg == 0)
dvalue = input->variable->compute_equal(variables[field2index[ifield]]); dvalue = input->variable->compute_equal(variables[field2index[ifield]]);
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 (iarg > nvec) error->all(FLERR, "Thermo vector-style variable is accessed out-of-range"); if (iarg > nvec) dvalue = 0.0;
dvalue = varvec[iarg - 1]; else dvalue = varvec[iarg - 1];
} }
} }