@@ -250,12 +250,27 @@ template <std::floating_point T>
250250void FDTDEngine<T>::update_hx(const T hya, const T hza) {
251251 SPDLOG_TRACE (" enter FDTDEngine<T>::update_hx" );
252252
253- // todo correctly implement for PEC boundary
254- for (size_t i = 1 ; i < h.x .extent (0 ) - 1 ; ++i) {
255- for (size_t j = 1 ; j < h.x .extent (1 ) - 1 ; ++j) {
256- for (size_t k = 1 ; k < h.x .extent (2 ) - 1 ; ++k) {
257- h.x [i, j, k] += -hya * (e.z [i, j + 1 , k] - e.z [i, j, k]) +
258- hza * (e.y [i, j, k + 1 ] - e.y [i, j, k]);
253+ // todo remove branches
254+ for (size_t i = 0 ; i < h.x .extent (0 ); ++i) {
255+ for (size_t j = 0 ; j < h.x .extent (1 ); ++j) {
256+ for (size_t k = 0 ; k < h.x .extent (2 ); ++k) {
257+ [[likely]] if (j != h.x .extent (1 ) - 1 && k != h.x .extent (2 ) - 1 ) {
258+ // j- k-low volume
259+ h.x [i, j, k] += -hya * (e.z [i, j + 1 , k] - e.z [i, j, k]) +
260+ hza * (e.y [i, j, k + 1 ] - e.y [i, j, k]);
261+ } else if (j != h.x .extent (1 ) - 1 && k == h.x .extent (2 ) - 1 ) {
262+ // k-high plane
263+ h.x [i, j, k] += -hya * (e.z [i, j + 1 , k] - e.z [i, j, k]) +
264+ hza * (0.0 - e.y [i, j, k]);
265+ } else if (j == h.x .extent (1 ) - 1 && k != h.x .extent (2 ) - 1 ) {
266+ // j-high plane
267+ h.x [i, j, k] += -hya * (0.0 - e.z [i, j, k]) +
268+ hza * (e.y [i, j, k + 1 ] - e.y [i, j, k]);
269+ } else {
270+ // j- k-high line
271+ h.x [i, j, k] +=
272+ -hya * (0.0 - e.z [i, j, k]) + hza * (0.0 - e.y [i, j, k]);
273+ }
259274 }
260275 }
261276 }
@@ -267,12 +282,27 @@ template <std::floating_point T>
267282void FDTDEngine<T>::update_hy(const T hxa, const T hza) {
268283 SPDLOG_TRACE (" enter FDTDEngine<T>::update_hy" );
269284
270- // todo correctly implement for PEC boundary
271- for (size_t i = 1 ; i < h.y .extent (0 ) - 1 ; ++i) {
272- for (size_t j = 1 ; j < h.y .extent (1 ) - 1 ; ++j) {
273- for (size_t k = 1 ; k < h.y .extent (2 ) - 1 ; ++k) {
274- h.y [i, j, k] += -hza * (e.x [i, j, k + 1 ] - e.x [i, j, k]) +
275- hxa * (e.z [i + 1 , j, k] - e.z [i, j, k]);
285+ // todo remove branches
286+ for (size_t i = 0 ; i < h.y .extent (0 ); ++i) {
287+ for (size_t j = 0 ; j < h.y .extent (1 ); ++j) {
288+ for (size_t k = 0 ; k < h.y .extent (2 ); ++k) {
289+ [[likely]] if (i != h.y .extent (0 ) - 1 && k != h.y .extent (2 ) - 1 ) {
290+ // i- k-low volume
291+ h.y [i, j, k] += -hza * (e.x [i, j, k + 1 ] - e.x [i, j, k]) +
292+ hxa * (e.z [i + 1 , j, k] - e.z [i, j, k]);
293+ } else if (i != h.y .extent (0 ) - 1 && k == h.y .extent (2 ) - 1 ) {
294+ // k-high plane
295+ h.y [i, j, k] += -hza * (0.0 - e.x [i, j, k]) +
296+ hxa * (e.z [i + 1 , j, k] - e.z [i, j, k]);
297+ } else if (i == h.y .extent (0 ) - 1 && k != h.y .extent (2 ) - 1 ) {
298+ // i-high plane
299+ h.y [i, j, k] += -hza * (e.x [i, j, k + 1 ] - e.x [i, j, k]) +
300+ hxa * (0.0 - e.z [i, j, k]);
301+ } else {
302+ // i- k-high line
303+ h.y [i, j, k] +=
304+ -hza * (0.0 - e.x [i, j, k]) + hxa * (0.0 - e.z [i, j, k]);
305+ }
276306 }
277307 }
278308 }
@@ -285,11 +315,27 @@ void FDTDEngine<T>::update_hz(const T hxa, const T hya) {
285315 SPDLOG_TRACE (" enter FDTDEngine<T>::update_hz" );
286316
287317 // todo correctly implement for PEC boundary
288- for (size_t i = 1 ; i < h.z .extent (0 ) - 1 ; ++i) {
289- for (size_t j = 1 ; j < h.z .extent (1 ) - 1 ; ++j) {
290- for (size_t k = 1 ; k < h.z .extent (2 ) - 1 ; ++k) {
291- h.z [i, j, k] += -hxa * (e.y [i + 1 , j, k] - e.y [i, j, k]) +
292- hya * (e.x [i, j + 1 , k] - e.x [i, j, k]);
318+ // todo remove branches
319+ for (size_t i = 0 ; i < h.z .extent (0 ); ++i) {
320+ for (size_t j = 0 ; j < h.z .extent (1 ); ++j) {
321+ for (size_t k = 0 ; k < h.z .extent (2 ); ++k) {
322+ [[likely]] if (i != h.y .extent (0 ) - 1 && j != h.y .extent (1 ) - 1 ) {
323+ // i- j-low volume
324+ h.z [i, j, k] += -hxa * (e.y [i + 1 , j, k] - e.y [i, j, k]) +
325+ hya * (e.x [i, j + 1 , k] - e.x [i, j, k]);
326+ } else if (i != h.y .extent (0 ) - 1 && j == h.y .extent (1 ) - 1 ) {
327+ // j-high plane
328+ h.z [i, j, k] += -hxa * (e.y [i + 1 , j, k] - e.y [i, j, k]) +
329+ hya * (0.0 - e.x [i, j, k]);
330+ } else if (i == h.y .extent (0 ) - 1 && j != h.y .extent (1 ) - 1 ) {
331+ // i-high plane
332+ h.z [i, j, k] += -hxa * (0.0 - e.y [i, j, k]) +
333+ hya * (e.x [i, j + 1 , k] - e.x [i, j, k]);
334+ } else {
335+ // i- j-high line
336+ h.z [i, j, k] +=
337+ -hxa * (0.0 - e.y [i, j, k]) + hya * (0.0 - e.x [i, j, k]);
338+ }
293339 }
294340 }
295341 }
0 commit comments