From 1cf5550ccc1f59c66ef2f905a0a4c240adfec717 Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Sat, 7 Oct 2023 22:50:18 -0700 Subject: [PATCH] add flux member function for class dft_near2far in C++ and DftNear2Far in Python --- python/examples/disc_radiation_pattern.py | 3 +++ python/simulation.py | 4 ++++ src/meep.hpp | 3 +++ src/near2far.cpp | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/python/examples/disc_radiation_pattern.py b/python/examples/disc_radiation_pattern.py index 7f1fc6ee9..4fbcfa65e 100644 --- a/python/examples/disc_radiation_pattern.py +++ b/python/examples/disc_radiation_pattern.py @@ -220,6 +220,9 @@ def disc_total_flux(dmat: float, h: float) -> Tuple[float, float]: ) flux_near = mp.get_fluxes(flux_mon)[0] + flux_near_n2f = mp.get_fluxes(n2f_mon)[0] + + print(f"flux:, {flux_near}, {flux_near_n2f}") Ptheta = radiation_pattern(sim, n2f_mon) plot_radiation_pattern_polar(r * r * Ptheta) diff --git a/python/simulation.py b/python/simulation.py index 390dc6121..074619336 100644 --- a/python/simulation.py +++ b/python/simulation.py @@ -783,6 +783,10 @@ def eps(self): def mu(self): return self.swigobj_attr("mu") + @property + def flux(self): + return self.swigobj_attr("flux") + def flux( self, direction: int = None, where: Volume = None, resolution: float = None ): diff --git a/src/meep.hpp b/src/meep.hpp index cd2e01698..123e993b1 100644 --- a/src/meep.hpp +++ b/src/meep.hpp @@ -1378,6 +1378,9 @@ class dft_near2far { /* output Poynting flux of far fields */ double *flux(direction df, const volume &where, double resolution); + /* output Poynting flux of near/monitor fields */ + double *flux(); + void save_hdf5(h5file *file, const char *dprefix = 0); void load_hdf5(h5file *file, const char *dprefix = 0); diff --git a/src/near2far.cpp b/src/near2far.cpp index ef3676d6a..f41a841ea 100644 --- a/src/near2far.cpp +++ b/src/near2far.cpp @@ -553,6 +553,25 @@ double *dft_near2far::flux(direction df, const volume &where, double resolution) return F; } +double *dft_near2far::flux() { + const size_t Nfreq = freq.size(); + double *fl = new double[Nfreq]; + for (size_t i = 0; i < Nfreq; ++i) + fl[i] = 0; + + std::complex *Edft = 0, *Hdft = 0; + for (dft_chunk *f = F; f; f = f->next_in_dft->next_in_dft) { + Edft = f->dft; + Hdft = f->next_in_dft->dft; + for (size_t k = 0; k < f->N; ++k) + for (size_t i = 0; i < Nfreq; ++i) + fl[i] += real(Edft[k * Nfreq + i] * conj(Hdft[k * Nfreq + i])); + } + double *fl_sum = new double[Nfreq]; + sum_to_all(fl, fl_sum, int(Nfreq)); + return fl_sum; +} + static double approxeq(double a, double b) { return fabs(a - b) < 0.5e-11 * (fabs(a) + fabs(b)); } dft_near2far fields::add_dft_near2far(const volume_list *where, const double *freq, size_t Nfreq,