| 30 | namespace meep { |
| 31 | |
| 32 | fields::fields(structure *s, double m, double beta, bool zero_fields_near_cylorigin, |
| 33 | int loop_tile_base_db, int loop_tile_base_eh, std::vector<double> bfast_scaled_k) |
| 34 | : S(s->S), gv(s->gv), user_volume(s->user_volume), v(s->v), m(m), beta(beta), |
| 35 | loop_tile_base_db(loop_tile_base_db), loop_tile_base_eh(loop_tile_base_eh), |
| 36 | working_on(×_spent), bfast_scaled_k(bfast_scaled_k) { |
| 37 | shared_chunks = s->shared_chunks; |
| 38 | components_allocated = false; |
| 39 | synchronized_magnetic_fields = 0; |
| 40 | outdir = new char[strlen(s->outdir) + 1]; |
| 41 | strcpy(outdir, s->outdir); |
| 42 | if (gv.dim == Dcyl) S = S + r_to_minus_r_symmetry(m); |
| 43 | phasein_time = 0; |
| 44 | for (int d = 0; d < 5; d++) { |
| 45 | k[d] = 0.0; |
| 46 | eikna[d] = 1.0; |
| 47 | } |
| 48 | is_real = 0; |
| 49 | a = gv.a; |
| 50 | dt = s->dt; |
| 51 | t = 0; |
| 52 | sources = NULL; |
| 53 | fluxes = NULL; |
| 54 | // Time stuff: |
| 55 | reset_timers(); |
| 56 | last_step_output_wall_time = -1; |
| 57 | |
| 58 | num_chunks = s->num_chunks; |
| 59 | typedef fields_chunk *fields_chunk_ptr; |
| 60 | chunks = new fields_chunk_ptr[num_chunks]; |
| 61 | for (int i = 0; i < num_chunks; i++) |
| 62 | chunks[i] = new fields_chunk(s->chunks[i], outdir, m, beta, zero_fields_near_cylorigin, i, |
| 63 | loop_tile_base_db, bfast_scaled_k); |
| 64 | FOR_FIELD_TYPES(ft) { |
| 65 | typedef realnum *realnum_ptr; |
| 66 | comm_blocks[ft] = new realnum_ptr[num_chunks * num_chunks]; |
| 67 | for (int i = 0; i < num_chunks * num_chunks; i++) |
| 68 | comm_blocks[ft][i] = 0; |
| 69 | } |
| 70 | for (int b = 0; b < 2; b++) |
| 71 | FOR_DIRECTIONS(d) { |
| 72 | if (gv.has_boundary((boundary_side)b, d)) |
| 73 | boundaries[b][d] = Metallic; |
| 74 | else |
| 75 | boundaries[b][d] = None; |
| 76 | } |
| 77 | chunk_connections_valid = false; |
| 78 | changed_materials = true; |
| 79 | |
| 80 | // unit directions are periodic by default: |
| 81 | FOR_DIRECTIONS(d) { |
| 82 | if (gv.has_boundary(High, d) && gv.has_boundary(Low, d) && d != R && |
| 83 | s->user_volume.num_direction(d) == 1) |
| 84 | use_bloch(d, 0.0); |
| 85 | } |
| 86 | } |
| 87 | |
| 88 | fields::fields(const fields &thef) |
| 89 | : S(thef.S), gv(thef.gv), user_volume(thef.user_volume), v(thef.v), working_on(×_spent) { |