329 {
330 constexpr double pi = 3.14159265358979323846;
331 const int nComp = 2 * orderL + 1;
332 const double prefactor = 4.0 * pi / (2.0 * orderL + 1.0);
333 const int row = iatom * nComp;
334 double sumLocal = 0.0;
335 for (int m = 0; m < nComp; m++) {
336 const double re = qlmInterleaved[2 * (row + m)];
337 const double im = qlmInterleaved[2 * (row + m) + 1];
338 sumLocal += re * re + im * im;
339 }
340 ql[iatom] = std::sqrt(prefactor * sumLocal);
341
342 const int j0 = offsets[iatom];
343 const int j1 = offsets[iatom + 1];
344 if (j0 == j1) {
345 qlBar[iatom] = ql[iatom];
346 return;
347 }
348 double barRe[17];
349 double barIm[17];
350 for (int m = 0; m < nComp; m++) {
351 barRe[m] = qlmInterleaved[2 * (row + m)];
352 barIm[m] = qlmInterleaved[2 * (row + m) + 1];
353 }
354 int nContrib = 1;
355 for (int p = j0; p < j1; p++) {
356 const int jatom = cols[p];
357 const int jRow = jatom * nComp;
358 for (int m = 0; m < nComp; m++) {
359 barRe[m] += qlmInterleaved[2 * (jRow + m)];
360 barIm[m] += qlmInterleaved[2 * (jRow + m) + 1];
361 }
362 nContrib++;
363 }
364 const double inv = 1.0 / static_cast<double>(nContrib);
365 double sumBar = 0.0;
366 for (int m = 0; m < nComp; m++) {
367 const double re = barRe[m] * inv;
368 const double im = barIm[m] * inv;
369 sumBar += re * re + im * im;
370 }
371 qlBar[iatom] = std::sqrt(prefactor * sumBar);
372}