@@ -348,7 +348,7 @@ void greencyl(std::complex<double> *EH, const vec &x, double freq, double eps, d
348348 }
349349}
350350
351- void dft_near2far::farfield_lowlevel (std::complex <double > *EH, const vec &x) {
351+ void dft_near2far::farfield_lowlevel (std::complex <double > *EH, const vec &x, double greencyl_tol ) {
352352 if (x.dim != D3 && x.dim != D2 && x.dim != Dcyl)
353353 meep::abort (" only 2d or 3d or cylindrical far-field computation is supported" );
354354 greenfunc green = x.dim == D2 ? green2d : green3d;
@@ -384,7 +384,7 @@ void dft_near2far::farfield_lowlevel(std::complex<double> *EH, const vec &x) {
384384 std::complex <double > cphase = std::polar (1.0 , phase);
385385 if (x.dim == Dcyl)
386386 greencyl (EH6, x, freq[i], eps, mu, xs, c0, f->dft [Nfreq * idx_dft + i], f->fc ->m ,
387- 1e-3 );
387+ greencyl_tol );
388388 else
389389 green (EH6, x, freq[i], eps, mu, xs, c0, f->dft [Nfreq * idx_dft + i]);
390390 for (int j = 0 ; j < 6 ; ++j)
@@ -397,19 +397,19 @@ void dft_near2far::farfield_lowlevel(std::complex<double> *EH, const vec &x) {
397397 }
398398}
399399
400- std::complex <double > *dft_near2far::farfield (const vec &x) {
400+ std::complex <double > *dft_near2far::farfield (const vec &x, double greencyl_tol ) {
401401 std::complex <double > *EH, *EH_local;
402402 const size_t Nfreq = freq.size ();
403403 EH_local = new std::complex <double >[6 * Nfreq];
404- farfield_lowlevel (EH_local, x);
404+ farfield_lowlevel (EH_local, x, greencyl_tol );
405405 EH = new std::complex <double >[6 * Nfreq];
406406 sum_to_all (EH_local, EH, 6 * Nfreq);
407407 delete[] EH_local;
408408 return EH;
409409}
410410
411411double *dft_near2far::get_farfields_array (const volume &where, int &rank, size_t *dims, size_t &N,
412- double resolution) {
412+ double resolution, double greencyl_tol ) {
413413 /* compute output grid size etc. */
414414 double dx[3 ] = {0 , 0 , 0 };
415415 direction dirs[3 ] = {X, Y, Z};
@@ -457,7 +457,7 @@ double *dft_near2far::get_farfields_array(const volume &where, int &rank, size_t
457457 start = t;
458458 last_point = this_point;
459459 }
460- farfield_lowlevel (EH1, x);
460+ farfield_lowlevel (EH1, x, greencyl_tol );
461461 if (verbosity > 1 ) all_wait (); // Allow consistent progress updates from master
462462 ptrdiff_t idx = (i0 * dims[1 ] + i1) * dims[2 ] + i2;
463463 for (size_t i = 0 ; i < Nfreq; ++i)
@@ -655,7 +655,8 @@ dft_near2far fields::add_dft_near2far(const volume_list *where, const double *fr
655655// Modified from farfield_lowlevel
656656std::vector<struct sourcedata > dft_near2far::near_sourcedata (const vec &x_0, double *farpt_list,
657657 size_t nfar_pts,
658- const std::complex <double > *dJ) {
658+ const std::complex <double > *dJ,
659+ double greencyl_tol) {
659660 if (x_0.dim != D3 && x_0.dim != D2 && x_0.dim != Dcyl)
660661 meep::abort (" only 2d or 3d or cylindrical far-field computation is supported" );
661662 greenfunc green = x_0.dim == D2 ? green2d : green3d;
@@ -697,7 +698,7 @@ std::vector<struct sourcedata> dft_near2far::near_sourcedata(const vec &x_0, dou
697698 for (size_t ipt = 0 ; ipt < nfar_pts; ++ipt) {
698699 vec x = vec (farpt_list[3 * ipt], farpt_list[3 * ipt + 1 ], farpt_list[3 * ipt + 2 ]);
699700 if (x_0.dim == Dcyl)
700- greencyl (EH6, x, freq[i], eps, mu, xs, c0, w, f->fc ->m , 1e-3 );
701+ greencyl (EH6, x, freq[i], eps, mu, xs, c0, w, f->fc ->m , greencyl_tol );
701702 else
702703 green (EH6, x, freq[i], eps, mu, xs, c0, w);
703704 for (int j = 0 ; j < 6 ; ++j)
0 commit comments