| 44 | }; |
| 45 | |
| 46 | static 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]]); |
nothing calls this directly
no test coverage detected