27 {
28 double best = 0.0;
29 if (forces == nullptr || nAtoms <= 0 || begin >= nAtoms) {
30 return best;
31 }
32 if (begin < 0) {
33 begin = 0;
34 }
35 for (long i = begin; i < nAtoms; ++i) {
36 if (fixed != nullptr) {
37 const double *mask = fixed + 3 * i;
38 if (mask[0] > 0.5 && mask[1] > 0.5 && mask[2] > 0.5) {
39 continue;
40 }
41 }
42 const double *row = forces + 3 * i;
43 const double xx = row[0] * row[0];
44 const double yy = row[1] * row[1];
45 const double zz = row[2] * row[2];
46 const double norm = std::sqrt((xx + yy) + zz);
47 if (std::isnan(norm)) {
48 return norm;
49 }
50 best = std::max(best, norm);
51 }
52 return best;
53}