void evaluate(const ConstGeometricalDataSlice<CoordinateType> &testGeomData,
                const ConstGeometricalDataSlice<CoordinateType> &trialGeomData,
                CollectionOf2dSlicesOfNdArrays<ValueType> &result) const {
    const int coordCount = 3;
    const ValueType waveNumber = m_waveNumber;

    CoordinateType distanceSq = 0.;
    CoordinateType nTest_diff = 0;
    CoordinateType nTrial_diff = 0;
    CoordinateType nTest_nTrial = 0.;
    for (int coordIndex = 0; coordIndex < coordCount; ++coordIndex) {
      CoordinateType diff =
          trialGeomData.global(coordIndex) - testGeomData.global(coordIndex);
      distanceSq += diff * diff;
      nTest_diff += diff * testGeomData.normal(coordIndex);
      nTrial_diff += diff * trialGeomData.normal(coordIndex);
      nTest_nTrial +=
          testGeomData.normal(coordIndex) * trialGeomData.normal(coordIndex);
    }
    CoordinateType distance = sqrt(distanceSq);
    ValueType kr = waveNumber * distance;
    ValueType v = m_interpolator.evaluate(distance);
    const CoordinateType ONE = 1., THREE = 3.;
    result[0](0, 0) =
        static_cast<CoordinateType>(1.0 / (4.0 * M_PI)) /
        (distance * distanceSq * distanceSq) *
        (-distanceSq * nTest_nTrial * (ONE + kr) +
         nTest_diff * nTrial_diff * (THREE + THREE * kr + kr * kr)) *
        v;
  }
    void evaluate(
            const ConstGeometricalDataSlice<CoordinateType>& testGeomData,
            const ConstGeometricalDataSlice<CoordinateType>& trialGeomData,
            CollectionOf2dSlicesOfNdArrays<ValueType>& result) const {
        const int coordCount = 3;
        assert(testGeomData.dimWorld() == coordCount);
        assert(result.size() == 1);

        CoordinateType distanceSq = 0.;
        CoordinateType nTest_diff = 0;
        CoordinateType nTrial_diff = 0;
        CoordinateType nTest_nTrial = 0.;
        for (int coordIndex = 0; coordIndex < coordCount; ++coordIndex) {
            CoordinateType diff = trialGeomData.global(coordIndex) -
                    testGeomData.global(coordIndex);
            distanceSq += diff * diff;
            nTest_diff += diff * testGeomData.normal(coordIndex);
            nTrial_diff += diff * trialGeomData.normal(coordIndex);
            nTest_nTrial += testGeomData.normal(coordIndex) *
                    trialGeomData.normal(coordIndex);
        }
        CoordinateType distance = sqrt(distanceSq);
        CoordinateType commonFactor =
                static_cast<CoordinateType>(-1. / (4. * M_PI)) /
                (distance * distanceSq * distanceSq);
        result[0](0, 0) = commonFactor * (
                    nTest_nTrial * distanceSq -
                    static_cast<CoordinateType>(3.) * nTest_diff * nTrial_diff);
    }
 void evaluate(
         const ConstBasisDataSlice<ValueType>& basisData,
         const ConstGeometricalDataSlice<CoordinateType>& geomData,
         _1dSliceOf3dArray<ValueType>& result) const {
     assert(basisData.componentCount() == 1);
     const int dimWorld = geomData.dimWorld();
     for (int dim = 0; dim < dimWorld; ++dim)
         result(dim) = basisData.values(0) * geomData.normal(dim);
 }
    void evaluate(
            const ConstGeometricalDataSlice<CoordinateType>& testGeomData,
            const ConstGeometricalDataSlice<CoordinateType>& trialGeomData,
            CollectionOf2dSlicesOfNdArrays<ValueType>& result) const {
        const int coordCount = 3;

        CoordinateType x_y = 0.;
        for (int coordIndex = 0; coordIndex < coordCount; ++coordIndex)
            x_y += testGeomData.global(coordIndex) *
                    trialGeomData.global(coordIndex);
        CoordinateType x_ny = 0.;
        for (int coordIndex = 0; coordIndex < coordCount; ++coordIndex)
            x_ny += testGeomData.global(coordIndex) *
                    trialGeomData.normal(coordIndex);
        result[0](0, 0) = static_cast<ValueType>(1.0 / (4.0 * M_PI)) *
                m_waveNumber * x_ny * exp(m_waveNumber * x_y);
    }
  void evaluate(const ConstGeometricalDataSlice<CoordinateType> &testGeomData,
                const ConstGeometricalDataSlice<CoordinateType> &trialGeomData,
                CollectionOf2dSlicesOfNdArrays<ValueType> &result) const {
    const int coordCount = 3;

    CoordinateType numeratorSum = 0., distSq = 0.;
    for (int coordIndex = 0; coordIndex < coordCount; ++coordIndex) {
      CoordinateType diff =
          trialGeomData.global(coordIndex) - testGeomData.global(coordIndex);
      distSq += diff * diff;
      numeratorSum += diff * trialGeomData.normal(coordIndex);
    }
    CoordinateType dist = sqrt(distSq);
    ValueType v = m_interpolator.evaluate(dist);
    result[0](0, 0) =
        numeratorSum /
        (static_cast<CoordinateType>(-4.0 * M_PI) * distSq * dist) *
        (m_waveNumber * dist + static_cast<CoordinateType>(1.0)) * v;
  }