Skip to content

Commit

Permalink
add undocumented parameter for specifying base case of recursion to S…
Browse files Browse the repository at this point in the history
…imulation constructor
  • Loading branch information
oskooi committed Aug 1, 2021
1 parent bd4a609 commit 5a4d858
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 13 deletions.
5 changes: 4 additions & 1 deletion python/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
26 changes: 16 additions & 10 deletions src/fields.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(&times_spent) {
shared_chunks = s->shared_chunks;
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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<grid_volume> *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<grid_volume> *result,
const size_t loop_tile_base) {
if (gvol.nowned_min() < loop_tile_base) {
result->push_back(gvol);
return;
}
Expand All @@ -213,9 +215,9 @@ static void split_into_tiles(grid_volume gvol, std::vector<grid_volume> *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;
}

Expand All @@ -235,7 +237,7 @@ static void check_tiles(grid_volume gv, const std::vector<grid_volume> &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;
Expand All @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions src/meep.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 5a4d858

Please sign in to comment.