| 43 | const double RELTOL = sizeof(realnum) == sizeof(float) ? 1.0e-4 : 1.0e-6; |
| 44 | |
| 45 | double Compare(realnum *d1, realnum *d2, int N, const char *Name) { |
| 46 | double Norm1 = 0.0, Norm2 = 0.0, NormDelta = 0.0; |
| 47 | for (int n = 0; n < N; n++) { |
| 48 | Norm1 += d1[n] * d1[n]; |
| 49 | Norm2 += d2[n] * d2[n]; |
| 50 | NormDelta += (d1[n] - d2[n]) * (d1[n] - d2[n]); |
| 51 | }; |
| 52 | Norm1 = sqrt(Norm1); |
| 53 | Norm2 = sqrt(Norm2); |
| 54 | NormDelta = sqrt(NormDelta); |
| 55 | double RelErr = NormDelta / (0.5 * (Norm1 + Norm2)); |
| 56 | if (RelErr > RELTOL) meep::abort("fail: rel error in %s data = %e\n", Name, RelErr); |
| 57 | return RelErr; |
| 58 | } |
| 59 | |
| 60 | double Compare(std::complex<realnum> *d1, std::complex<realnum> *d2, int N, const char *Name) { |
| 61 | double Norm1 = 0.0, Norm2 = 0.0, NormDelta = 0.0; |