| 65 | } |
| 66 | |
| 67 | void check_convergence(component c, double best_guess, double beta) { |
| 68 | const double amin = 5.0, amax = 30.0, adelta = 5.0; |
| 69 | |
| 70 | master_printf("Checking convergence for %s field...\n", component_name(c)); |
| 71 | if (beta != 0) master_printf("... using exp(i beta z) z-dependence with beta=%g\n", beta); |
| 72 | if (best_guess) master_printf("(The correct frequency should be %g.)\n", best_guess); |
| 73 | |
| 74 | for (double a = amax; a >= amin; a -= adelta) { |
| 75 | const double freq = freq_at_resolution(holey_2d, a, c, beta); |
| 76 | const double freq_shifted = freq_at_resolution(holey_shifted_2d, a, c, beta); |
| 77 | |
| 78 | // Initialize best guess at the correct freq. |
| 79 | if (!best_guess) { |
| 80 | best_guess = freq + 0.5 * (freq_shifted - freq); |
| 81 | master_printf("The frequency is approximately %g\n", best_guess); |
| 82 | } |
| 83 | else { |
| 84 | master_printf("frequency for a=%g is %g, %g (shifted), %g (mean)\n", a, freq, freq_shifted, |
| 85 | 0.5 * (freq + freq_shifted)); |
| 86 | master_printf("Unshifted freq error is %g/%g/%g\n", (freq - best_guess) * a * a, a, a); |
| 87 | if (fabs(freq - best_guess) * a * a > 0.4) |
| 88 | meep::abort("Frequency doesn't converge properly with a.\n"); |
| 89 | master_printf("Shifted freq error is %g/%g/%g\n", (freq_shifted - best_guess) * a * a, a, a); |
| 90 | if (fabs(freq_shifted - best_guess) * a * a > 0.4) |
| 91 | meep::abort("Frequency doesn't converge properly with a.\n"); |
| 92 | } |
| 93 | |
| 94 | // Check frequency difference... |
| 95 | master_printf("Frequency difference with a of %g is %g/%g/%g\n", a, |
| 96 | (freq - freq_shifted) * a * a, a, a); |
| 97 | if (fabs(freq - freq_shifted) * a * a > 0.4) |
| 98 | meep::abort("Frequency difference = doesn't converge properly with a.\n"); |
| 99 | } |
| 100 | master_printf("Passed 2D resolution convergence test for %s!\n", component_name(c)); |
| 101 | } |
| 102 | |
| 103 | int main(int argc, char **argv) { |
| 104 | initialize mpi(argc, argv); |
no test coverage detected