private BaseDyadCoordinate <Complex> setNonDiagonalElements( DispersionParameter dispersion, CartesianCoordinate displacement) { double rmod = displacement.Norm; double rmod2 = rmod * rmod; double rmod3 = rmod2 * rmod; double kmod = dispersion.WaveVector.Norm; double kr = kmod * rmod; BaseDyadCoordinate <Complex> dyadProduct = displacement.DyadProduct(displacement); var initDyad = new DiagonalDyadCoordinate <Complex>(rmod2); BaseDyadCoordinate <Complex> firstMember = (kmod * kmod) * (dyadProduct - initDyad); BaseDyadCoordinate <Complex> secondMember = (1 / rmod2) * (Complex.ImaginaryOne * kr - 1) * (3 * dyadProduct - initDyad); Complex multiplier = Complex.FromPolarCoordinates(1 / rmod3, kr); return(multiplier * (firstMember + secondMember)); }