From 5a4d8585fdc5c6cffccf21bd81d143a395162e4a Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Sun, 1 Aug 2021 13:53:48 -0700 Subject: [PATCH] add undocumented parameter for specifying base case of recursion to Simulation constructor --- python/simulation.py | 5 ++++- src/fields.cpp | 26 ++++++++++++++++---------- src/meep.hpp | 5 +++-- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/python/simulation.py b/python/simulation.py index c4eb90563..cb54cfaa5 100644 --- a/python/simulation.py +++ b/python/simulation.py @@ -953,6 +953,7 @@ def __init__(self, progress_interval=4, subpixel_tol=1e-4, subpixel_maxeval=100000, + loop_tile_base=0, ensure_periodicity=True, num_chunks=0, Courant=0.5, @@ -1206,6 +1207,7 @@ def __init__(self, self.eps_averaging = eps_averaging self.subpixel_tol = subpixel_tol self.subpixel_maxeval = subpixel_maxeval + self.loop_tile_base = loop_tile_base self.ensure_periodicity = ensure_periodicity self.extra_materials = extra_materials self.default_material = default_material @@ -1921,7 +1923,8 @@ def init_sim(self): self.structure, self.m if self.is_cylindrical else 0, self.k_point.z if self.special_kz and self.k_point else 0, - not self.accurate_fields_near_cylorigin + not self.accurate_fields_near_cylorigin, + self.loop_tile_base ) if self.force_all_components and self.dimensions != 1: diff --git a/src/fields.cpp b/src/fields.cpp index 0643ccef6..39b47d97f 100644 --- a/src/fields.cpp +++ b/src/fields.cpp @@ -29,7 +29,8 @@ using namespace std; namespace meep { -fields::fields(structure *s, double m, double beta, bool zero_fields_near_cylorigin) +fields::fields(structure *s, double m, double beta, bool zero_fields_near_cylorigin, + int loop_tile_base) : S(s->S), gv(s->gv), user_volume(s->user_volume), v(s->v), m(m), beta(beta), working_on(×_spent) { shared_chunks = s->shared_chunks; @@ -57,7 +58,8 @@ fields::fields(structure *s, double m, double beta, bool zero_fields_near_cylori typedef fields_chunk *fields_chunk_ptr; chunks = new fields_chunk_ptr[num_chunks]; for (int i = 0; i < num_chunks; i++) - chunks[i] = new fields_chunk(s->chunks[i], outdir, m, beta, zero_fields_near_cylorigin, i); + chunks[i] = new fields_chunk(s->chunks[i], outdir, m, beta, + zero_fields_near_cylorigin, i, loop_tile_base); FOR_FIELD_TYPES(ft) { typedef realnum *realnum_ptr; comm_blocks[ft] = new realnum_ptr[num_chunks * num_chunks]; @@ -202,9 +204,9 @@ fields_chunk::~fields_chunk() { if (new_s && new_s->refcount-- <= 1) delete new_s; // delete if not shared } -static void split_into_tiles(grid_volume gvol, std::vector *result) { - const size_t base_nowned_min = 12000; - if (gvol.nowned_min() < base_nowned_min) { +static void split_into_tiles(grid_volume gvol, std::vector *result, + const size_t loop_tile_base) { + if (gvol.nowned_min() < loop_tile_base) { result->push_back(gvol); return; } @@ -213,9 +215,9 @@ static void split_into_tiles(grid_volume gvol, std::vector *result) direction best_split_direction; gvol.tile_split(best_split_point, best_split_direction); grid_volume left_gvol = gvol.split_at_fraction(false, best_split_point, best_split_direction); - split_into_tiles(left_gvol, result); + split_into_tiles(left_gvol, result, loop_tile_base); grid_volume right_gvol = gvol.split_at_fraction(true, best_split_point, best_split_direction); - split_into_tiles(right_gvol, result); + split_into_tiles(right_gvol, result, loop_tile_base); return; } @@ -235,7 +237,7 @@ static void check_tiles(grid_volume gv, const std::vector &gvs) { } fields_chunk::fields_chunk(structure_chunk *the_s, const char *od, double m, double beta, - bool zero_fields_near_cylorigin, int chunkidx) + bool zero_fields_near_cylorigin, int chunkidx, int loop_tile_base) : gv(the_s->gv), v(the_s->v), m(m), zero_fields_near_cylorigin(zero_fields_near_cylorigin), beta(beta) { s = the_s; @@ -248,8 +250,12 @@ fields_chunk::fields_chunk(structure_chunk *the_s, const char *od, double m, dou Courant = s->Courant; dt = s->dt; dft_chunks = NULL; - split_into_tiles(gv, &gvs); - check_tiles(gv, gvs); + if (loop_tile_base > 0) { + split_into_tiles(gv, &gvs, loop_tile_base); + check_tiles(gv, gvs); + } else { + gvs.push_back(gv); + } FOR_FIELD_TYPES(ft) { polarization_state *cur = NULL; pol[ft] = NULL; diff --git a/src/meep.hpp b/src/meep.hpp index d84c44097..aeffb263f 100644 --- a/src/meep.hpp +++ b/src/meep.hpp @@ -1460,7 +1460,7 @@ class fields_chunk { int chunk_idx; fields_chunk(structure_chunk *, const char *outdir, double m, double beta, - bool zero_fields_near_cylorigin, int chunkidx); + bool zero_fields_near_cylorigin, int chunkidx, int loop_tile_base); fields_chunk(const fields_chunk &, int chunkidx); ~fields_chunk(); @@ -1695,7 +1695,8 @@ class fields { bool components_allocated; // fields.cpp methods: - fields(structure *, double m = 0, double beta = 0, bool zero_fields_near_cylorigin = true); + fields(structure *, double m = 0, double beta = 0, bool zero_fields_near_cylorigin = true, + int loop_tile_base = 0); fields(const fields &); ~fields(); bool equal_layout(const fields &f) const;