352 {
353 constexpr double pi = 3.14159265358979323846;
354 const int nComp = 2 * orderL + 1;
355 const double prefactor = 4.0 * pi / (2.0 * orderL + 1.0);
356 const int row = iatom * nComp;
357 double sumLocal = 0.0;
358 for (int m = 0; m < nComp; m++) {
359 const double re = qlmInterleaved[2 * (row + m)];
360 const double im = qlmInterleaved[2 * (row + m) + 1];
361 sumLocal += re * re + im * im;
362 }
363 ql[iatom] = std::sqrt(prefactor * sumLocal);
364
365 const int j0 = offsets[iatom];
366 const int j1 = offsets[iatom + 1];
367 if (j0 == j1) {
368 qlBar[iatom] = ql[iatom];
369 return;
370 }
371 double barRe[17];
372 double barIm[17];
373 for (int m = 0; m < nComp; m++) {
374 barRe[m] = qlmInterleaved[2 * (row + m)];
375 barIm[m] = qlmInterleaved[2 * (row + m) + 1];
376 }
377 int nContrib = 1;
378 for (int p = j0; p < j1; p++) {
379 const int jatom = cols[p];
380 const int jRow = jatom * nComp;
381 for (int m = 0; m < nComp; m++) {
382 barRe[m] += qlmInterleaved[2 * (jRow + m)];
383 barIm[m] += qlmInterleaved[2 * (jRow + m) + 1];
384 }
385 nContrib++;
386 }
387 const double inv = 1.0 / static_cast<double>(nContrib);
388 double sumBar = 0.0;
389 for (int m = 0; m < nComp; m++) {
390 const double re = barRe[m] * inv;
391 const double im = barIm[m] * inv;
392 sumBar += re * re + im * im;
393 }
394 qlBar[iatom] = std::sqrt(prefactor * sumBar);
395}