MCPcopy Create free account
hub / github.com/NanoComp/meep / integrate_chunkloop

Function integrate_chunkloop

src/integrate.cpp:46–129  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

44};
45
46static void integrate_chunkloop(fields_chunk *fc, int ichunk, component cgrid, ivec is, ivec ie,
47 vec s0, vec s1, vec e0, vec e1, double dV0, double dV1, ivec shift,
48 complex<double> shift_phase, const symmetry &S, int sn,
49 void *data_) {
50 (void)ichunk; // unused
51 integrate_data *data = (integrate_data *)data_;
52 ptrdiff_t *off = data->offsets;
53 component *cS = data->cS;
54 complex<realnum> *fvals = data->fvals;
55 complex<double> *ph = data->ph;
56 complex<long double> sum = 0.0;
57 double maxabs = 0;
58 const component *iecs = data->inveps_cs;
59 const direction *ieds = data->inveps_ds;
60 ptrdiff_t ieos[6];
61 const component *imcs = data->invmu_cs;
62 const direction *imds = data->invmu_ds;
63 ptrdiff_t imos[6];
64
65 for (int i = 0; i < data->num_fvals; ++i) {
66 cS[i] = S.transform(data->components[i], -sn);
67 if (cS[i] == Dielectric || cS[i] == Permeability)
68 ph[i] = 1.0;
69 else {
70 if (cgrid == Centered) fc->gv.yee2cent_offsets(cS[i], off[2 * i], off[2 * i + 1]);
71 ph[i] = shift_phase * S.phase_shift(cS[i], sn);
72 }
73 }
74 for (int k = 0; k < data->ninveps; ++k)
75 fc->gv.yee2cent_offsets(iecs[k], ieos[2 * k], ieos[2 * k + 1]);
76 for (int k = 0; k < data->ninvmu; ++k)
77 fc->gv.yee2cent_offsets(imcs[k], imos[2 * k], imos[2 * k + 1]);
78
79 vec rshift(shift * (0.5 * fc->gv.inva));
80 LOOP_OVER_IVECS(fc->gv, is, ie, idx) {
81 IVEC_LOOP_LOC(fc->gv, loc);
82 loc = S.transform(loc, sn) + rshift;
83
84 for (int i = 0; i < data->num_fvals; ++i) {
85 if (cS[i] == Dielectric) {
86 double tr = 0.0;
87 for (int k = 0; k < data->ninveps; ++k) {
88 const realnum *ie = fc->s->chi1inv[iecs[k]][ieds[k]];
89 if (ie)
90 tr += (ie[idx] + ie[idx + ieos[2 * k]] + ie[idx + ieos[1 + 2 * k]] +
91 ie[idx + ieos[2 * k] + ieos[1 + 2 * k]]);
92 else
93 tr += 4; // default inveps == 1
94 }
95 fvals[i] = (4 * data->ninveps) / tr;
96 }
97 else if (cS[i] == Permeability) {
98 double tr = 0.0;
99 for (int k = 0; k < data->ninvmu; ++k) {
100 const realnum *im = fc->s->chi1inv[imcs[k]][imds[k]];
101 if (im)
102 tr += (im[idx] + im[idx + imos[2 * k]] + im[idx + imos[1 + 2 * k]] +
103 im[idx + imos[2 * k] + imos[1 + 2 * k]]);

Callers

nothing calls this directly

Calls 6

absFunction · 0.85
yee2cent_offsetsMethod · 0.80
phase_shiftMethod · 0.80
LOOP_OVER_IVECSFunction · 0.70
maxFunction · 0.70
transformMethod · 0.45

Tested by

no test coverage detected