private void addDataS(int nGaussians) {
    if (atomCoordBohr[atomIndex] == null) {
      moCoeff++;
      return;
    }
    if (doDebug)
      dumpInfo(nGaussians, "S ");

    int moCoeff0 = moCoeff;
    // all gaussians of a set use the same MO coefficient
    // so we just reset each time, then move on
    setMinMax(nGaussians);
    for (int ig = 0; ig < nGaussians; ig++) {
      moCoeff = moCoeff0;
      float alpha = gaussians[gaussianPtr + ig][0];
      float c1 = gaussians[gaussianPtr + ig][1];
      // (2 alpha^3/pi^3)^0.25 exp(-alpha r^2)
      float a = c1 * (float) Math.pow(alpha, 0.75) * 0.712705470f;
      a *= moCoefficients[moCoeff++];
      // the coefficients are all included with the X factor here

      for (int i = xMax; --i >= xMin;) {
        EX[i] = a * gExp(-X2[i] * alpha);
      }
      for (int i = yMax; --i >= yMin;) {
        EY[i] = gExp(-Y2[i] * alpha);
      }
      for (int i = zMax; --i >= zMin;) {
        EZ[i] = gExp(-Z2[i] * alpha);
      }

      for (int ix = xMax; --ix >= xMin;)
        for (int iy = yMax; --iy >= yMin;)
          for (int iz = zMax; --iz >= zMin;)
            voxelData[ix][iy][iz] += EX[ix] * EY[iy] * EZ[iz];
    }
  }