diff --git a/CREDITS b/CREDITS index 1b826c89..99888d04 100644 --- a/CREDITS +++ b/CREDITS @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This is the official list of entities and people who have contributed to gprMax. diff --git a/gprMax/constants.pxd b/gprMax/constants.pxd index 3fb4c629..16adede8 100644 --- a/gprMax/constants.pxd +++ b/gprMax/constants.pxd @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/constants.py b/gprMax/constants.py index 9c623b5e..1118435b 100644 --- a/gprMax/constants.py +++ b/gprMax/constants.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/cython/fields_updates_dispersive.pyx b/gprMax/cython/fields_updates_dispersive.pyx new file mode 100644 index 00000000..fd44f561 --- /dev/null +++ b/gprMax/cython/fields_updates_dispersive.pyx @@ -0,0 +1,1232 @@ +# Copyright (C) 2015-2023: The University of Edinburgh, United Kingdom +# Authors: Craig Warren, Antonis Giannopoulos, and John Hartley +# +# This file is part of gprMax. +# +# gprMax is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# gprMax is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with gprMax. If not, see . + +import numpy as np +cimport numpy as np + +from cython.parallel import prange + + +# Use C-functions from 'complex.h' but doesn't work for Windows as it doesn't +# support 'double complex' but instead defines its own type '_Dcomplex'. +# https://docs.microsoft.com/en-us/cpp/c-runtime-library/complex-math-support?view=vs-2019 +# https://stackoverflow.com/questions/57837255/defining-dcomplex-externally-in-cython?rq=1 + +cdef extern from "complex.h" nogil: + double creal(double complex z) + float crealf(float complex z) + + + +############################################################### +# Electric field updates - dispersive materials - multipole A # +############################################################### + + +cpdef void update_electric_dispersive_multipole_A_double_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsE, + double[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double[:, :, :, ::1] Tx, + double[:, :, :, ::1] Ty, + double[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez, + double[:, :, ::1] Hx, + double[:, :, ::1] Hy, + double[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Tx[pole, i, j, k] + + Tx[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tx[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Ty[pole, i, j, k] + + Ty[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Ty[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Tz[pole, i, j, k] + + Tz[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tz[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + +cpdef void update_electric_dispersive_multipole_A_float_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsE, + float[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float[:, :, :, ::1] Tx, + float[:, :, :, ::1] Ty, + float[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez, + float[:, :, ::1] Hx, + float[:, :, ::1] Hy, + float[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Tx[pole, i, j, k] + + Tx[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tx[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Ty[pole, i, j, k] + + Ty[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Ty[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + phi = 0 + for pole in range(maxpoles): + + phi = phi + updatecoeffsdispersive[material, pole * 3] * Tz[pole, i, j, k] + + Tz[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tz[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + +cpdef void update_electric_dispersive_multipole_A_double_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsE, + double complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double complex[:, :, :, ::1] Tx, + double complex[:, :, :, ::1] Ty, + double complex[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez, + double[:, :, ::1] Hx, + double[:, :, ::1] Hy, + double[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + creal(updatecoeffsdispersive[material, pole * 3]) + * creal(Tx[pole, i, j, k])) + + + Tx[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tx[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + creal(updatecoeffsdispersive[material, pole * 3]) + * creal(Ty[pole, i, j, k])) + + + Ty[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Ty[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + creal(updatecoeffsdispersive[material, pole * 3]) + * creal(Tz[pole, i, j, k])) + + + Tz[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tz[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + +cpdef void update_electric_dispersive_multipole_A_float_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsE, + float complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float complex[:, :, :, ::1] Tx, + float complex[:, :, :, ::1] Ty, + float complex[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez, + float[:, :, ::1] Hx, + float[:, :, ::1] Hy, + float[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + crealf(updatecoeffsdispersive[material, pole * 3]) + * crealf(Tx[pole, i, j, k])) + + + Tx[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tx[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + crealf(updatecoeffsdispersive[material, pole * 3]) + * crealf(Ty[pole, i, j, k])) + + + Ty[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Ty[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + phi = 0 + for pole in range(maxpoles): + + + phi = (phi + crealf(updatecoeffsdispersive[material, pole * 3]) + * crealf(Tz[pole, i, j, k])) + + + Tz[pole, i, j, k] = (updatecoeffsdispersive[material, 1 + (pole * 3)] + * Tz[pole, i, j, k] + updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + + + +############################################################### +# Electric field updates - dispersive materials - multipole B # +############################################################### + + +cpdef void update_electric_dispersive_multipole_B_double_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double[:, :, :, ::1] Tx, + double[:, :, :, ::1] Ty, + double[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + for pole in range(maxpoles): + Tx[pole, i, j, k] = (Tx[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + for pole in range(maxpoles): + Ty[pole, i, j, k] = (Ty[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + for pole in range(maxpoles): + Tz[pole, i, j, k] = (Tz[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + + +cpdef void update_electric_dispersive_multipole_B_float_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float[:, :, :, ::1] Tx, + float[:, :, :, ::1] Ty, + float[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + for pole in range(maxpoles): + Tx[pole, i, j, k] = (Tx[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + for pole in range(maxpoles): + Ty[pole, i, j, k] = (Ty[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + for pole in range(maxpoles): + Tz[pole, i, j, k] = (Tz[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + + +cpdef void update_electric_dispersive_multipole_B_double_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double complex[:, :, :, ::1] Tx, + double complex[:, :, :, ::1] Ty, + double complex[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + for pole in range(maxpoles): + Tx[pole, i, j, k] = (Tx[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + for pole in range(maxpoles): + Ty[pole, i, j, k] = (Ty[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + for pole in range(maxpoles): + Tz[pole, i, j, k] = (Tz[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + + +cpdef void update_electric_dispersive_multipole_B_float_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float complex[:, :, :, ::1] Tx, + float complex[:, :, :, ::1] Ty, + float complex[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with multiple poles) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k, pole + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + for pole in range(maxpoles): + Tx[pole, i, j, k] = (Tx[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ex[i, j, k]) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + for pole in range(maxpoles): + Ty[pole, i, j, k] = (Ty[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ey[i, j, k]) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + for pole in range(maxpoles): + Tz[pole, i, j, k] = (Tz[pole, i, j, k] + - updatecoeffsdispersive[material, 2 + (pole * 3)] + * Ez[i, j, k]) + + + + +################################################################# +# Electric field updates - dispersive materials - single pole A # +################################################################# + + +cpdef void update_electric_dispersive_1pole_A_double_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsE, + double[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double[:, :, :, ::1] Tx, + double[:, :, :, ::1] Ty, + double[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez, + double[:, :, ::1] Hx, + double[:, :, ::1] Hy, + double[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Tx[0, i, j, k] + + Tx[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tx[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Ty[0, i, j, k] + + Ty[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Ty[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Tz[0, i, j, k] + + Tz[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tz[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + + +cpdef void update_electric_dispersive_1pole_A_float_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsE, + float[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float[:, :, :, ::1] Tx, + float[:, :, :, ::1] Ty, + float[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez, + float[:, :, ::1] Hx, + float[:, :, ::1] Hy, + float[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Tx[0, i, j, k] + + Tx[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tx[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Ty[0, i, j, k] + + Ty[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Ty[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + + phi = updatecoeffsdispersive[material, 0] * Tz[0, i, j, k] + + Tz[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tz[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + + +cpdef void update_electric_dispersive_1pole_A_double_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsE, + double complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double complex[:, :, :, ::1] Tx, + double complex[:, :, :, ::1] Ty, + double complex[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez, + double[:, :, ::1] Hx, + double[:, :, ::1] Hy, + double[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + + + phi = (creal(updatecoeffsdispersive[material, 0]) + * creal(Tx[0, i, j, k])) + + + Tx[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tx[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + + + phi = (creal(updatecoeffsdispersive[material, 0]) + * creal(Ty[0, i, j, k])) + + + Ty[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Ty[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + + + phi = (creal(updatecoeffsdispersive[material, 0]) + * creal(Tz[0, i, j, k])) + + + Tz[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tz[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + + +cpdef void update_electric_dispersive_1pole_A_float_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsE, + float complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float complex[:, :, :, ::1] Tx, + float complex[:, :, :, ::1] Ty, + float complex[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez, + float[:, :, ::1] Hx, + float[:, :, ::1] Hy, + float[:, :, ::1] Hz +): + """Updates the electric field components when dispersive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + cdef float phi = 0 + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + + + phi = (crealf(updatecoeffsdispersive[material, 0]) + * crealf(Tx[0, i, j, k])) + + + Tx[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tx[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ex[i, j, k]) + Ex[i, j, k] = (updatecoeffsE[material, 0] * Ex[i, j, k] + updatecoeffsE[material, 2] + * (Hz[i, j, k] - Hz[i, j - 1, k]) - updatecoeffsE[material, 3] + * (Hy[i, j, k] - Hy[i, j, k - 1]) - updatecoeffsE[material, 4] * phi) + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + + + phi = (crealf(updatecoeffsdispersive[material, 0]) + * crealf(Ty[0, i, j, k])) + + + Ty[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Ty[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ey[i, j, k]) + Ey[i, j, k] = (updatecoeffsE[material, 0] * Ey[i, j, k] + updatecoeffsE[material, 3] + * (Hx[i, j, k] - Hx[i, j, k - 1]) - updatecoeffsE[material, 1] + * (Hz[i, j, k] - Hz[i - 1, j, k]) - updatecoeffsE[material, 4] * phi) + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + + + phi = (crealf(updatecoeffsdispersive[material, 0]) + * crealf(Tz[0, i, j, k])) + + + Tz[0, i, j, k] = (updatecoeffsdispersive[material, 1] * Tz[0, i, j, k] + + updatecoeffsdispersive[material, 2] * Ez[i, j, k]) + Ez[i, j, k] = (updatecoeffsE[material, 0] * Ez[i, j, k] + updatecoeffsE[material, 1] + * (Hy[i, j, k] - Hy[i - 1, j, k]) - updatecoeffsE[material, 2] + * (Hx[i, j, k] - Hx[i, j - 1, k]) - updatecoeffsE[material, 4] * phi) + + + + +################################################################# +# Electric field updates - dispersive materials - single pole B # +################################################################# + + +cpdef void update_electric_dispersive_1pole_B_double_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double[:, :, :, ::1] Tx, + double[:, :, :, ::1] Ty, + double[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + Tx[0, i, j, k] = Tx[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ex[i, j, k] + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + Ty[0, i, j, k] = Ty[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ey[i, j, k] + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + Tz[0, i, j, k] = Tz[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ez[i, j, k] + +cpdef void update_electric_dispersive_1pole_B_float_real( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float[:, :, :, ::1] Tx, + float[:, :, :, ::1] Ty, + float[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + Tx[0, i, j, k] = Tx[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ex[i, j, k] + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + Ty[0, i, j, k] = Ty[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ey[i, j, k] + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + Tz[0, i, j, k] = Tz[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ez[i, j, k] + +cpdef void update_electric_dispersive_1pole_B_double_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + double complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + double complex[:, :, :, ::1] Tx, + double complex[:, :, :, ::1] Ty, + double complex[:, :, :, ::1] Tz, + double[:, :, ::1] Ex, + double[:, :, ::1] Ey, + double[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + Tx[0, i, j, k] = Tx[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ex[i, j, k] + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + Ty[0, i, j, k] = Ty[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ey[i, j, k] + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + Tz[0, i, j, k] = Tz[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ez[i, j, k] + +cpdef void update_electric_dispersive_1pole_B_float_complex( + int nx, + int ny, + int nz, + int nthreads, + int maxpoles, + float complex[:, ::1] updatecoeffsdispersive, + np.uint32_t[:, :, :, ::1] ID, + float complex[:, :, :, ::1] Tx, + float complex[:, :, :, ::1] Ty, + float complex[:, :, :, ::1] Tz, + float[:, :, ::1] Ex, + float[:, :, ::1] Ey, + float[:, :, ::1] Ez +): + """Updates a temporary dispersive material array when disperisive materials + (with 1 pole) are present. + + Args: + nx, ny, nz: int for grid size in cells. + nthreads: int for number of threads to use. + maxpoles: int for maximum number of poles. + updatecoeffs, T, ID, E, H: memoryviews to access to update coeffients, + temporary, ID and field component arrays. + """ + + cdef Py_ssize_t i, j, k + cdef int material + + # Ex component + if ny != 1 or nz != 1: + for i in prange(0, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(1, nz): + material = ID[0, i, j, k] + Tx[0, i, j, k] = Tx[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ex[i, j, k] + + # Ey component + if nx != 1 or nz != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(0, ny): + for k in range(1, nz): + material = ID[1, i, j, k] + Ty[0, i, j, k] = Ty[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ey[i, j, k] + + # Ez component + if nx != 1 or ny != 1: + for i in prange(1, nx, nogil=True, schedule='static', num_threads=nthreads): + for j in range(1, ny): + for k in range(0, nz): + material = ID[2, i, j, k] + Tz[0, i, j, k] = Tz[0, i, j, k] - updatecoeffsdispersive[material, 2] * Ez[i, j, k] diff --git a/gprMax/fields_outputs.py b/gprMax/fields_outputs.py index 17df289e..e15dfca3 100644 --- a/gprMax/fields_outputs.py +++ b/gprMax/fields_outputs.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/fields_updates_ext.pyx b/gprMax/fields_updates_ext.pyx index 92b4482b..81367b1b 100644 --- a/gprMax/fields_updates_ext.pyx +++ b/gprMax/fields_updates_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/fields_updates_gpu.py b/gprMax/fields_updates_gpu.py index 5aa04bed..024581d6 100644 --- a/gprMax/fields_updates_gpu.py +++ b/gprMax/fields_updates_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/fractals.py b/gprMax/fractals.py index e509590d..5da780d9 100644 --- a/gprMax/fractals.py +++ b/gprMax/fractals.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/fractals_generate_ext.pyx b/gprMax/fractals_generate_ext.pyx index d16bebbb..1f1b24e1 100644 --- a/gprMax/fractals_generate_ext.pyx +++ b/gprMax/fractals_generate_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/geometry_outputs.py b/gprMax/geometry_outputs.py index de7652f7..c950cbc9 100644 --- a/gprMax/geometry_outputs.py +++ b/gprMax/geometry_outputs.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/geometry_outputs_ext.pyx b/gprMax/geometry_outputs_ext.pyx index a2747dc1..b55c0a3d 100644 --- a/gprMax/geometry_outputs_ext.pyx +++ b/gprMax/geometry_outputs_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/geometry_primitives_ext.pyx b/gprMax/geometry_primitives_ext.pyx index 33abd13a..c8549e33 100644 --- a/gprMax/geometry_primitives_ext.pyx +++ b/gprMax/geometry_primitives_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/gprMax.py b/gprMax/gprMax.py index 80fa4f36..16476c9a 100644 --- a/gprMax/gprMax.py +++ b/gprMax/gprMax.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/grid.py b/gprMax/grid.py index 00d01b77..89fb9cfb 100644 --- a/gprMax/grid.py +++ b/gprMax/grid.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/input_cmd_funcs.py b/gprMax/input_cmd_funcs.py index fe161d10..6cec2861 100644 --- a/gprMax/input_cmd_funcs.py +++ b/gprMax/input_cmd_funcs.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/input_cmds_file.py b/gprMax/input_cmds_file.py index e521ff9b..98a95eb4 100644 --- a/gprMax/input_cmds_file.py +++ b/gprMax/input_cmds_file.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/input_cmds_geometry.py b/gprMax/input_cmds_geometry.py index 10bcce29..b698ef4b 100644 --- a/gprMax/input_cmds_geometry.py +++ b/gprMax/input_cmds_geometry.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/input_cmds_multiuse.py b/gprMax/input_cmds_multiuse.py index b162283b..96a3321d 100644 --- a/gprMax/input_cmds_multiuse.py +++ b/gprMax/input_cmds_multiuse.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/input_cmds_singleuse.py b/gprMax/input_cmds_singleuse.py index 0e6c272a..386f2c0d 100644 --- a/gprMax/input_cmds_singleuse.py +++ b/gprMax/input_cmds_singleuse.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/materials.py b/gprMax/materials.py index e07764cf..d9703c3b 100644 --- a/gprMax/materials.py +++ b/gprMax/materials.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/model_build_run.py b/gprMax/model_build_run.py index 1d8ab696..cf268718 100644 --- a/gprMax/model_build_run.py +++ b/gprMax/model_build_run.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/optimisation_taguchi.py b/gprMax/optimisation_taguchi.py index dec9e0ff..dd7cec39 100644 --- a/gprMax/optimisation_taguchi.py +++ b/gprMax/optimisation_taguchi.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml.py b/gprMax/pml.py index 49fc4afc..cd1c3690 100644 --- a/gprMax/pml.py +++ b/gprMax/pml.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_electric_HORIPML_ext.pyx b/gprMax/pml_updates/pml_updates_electric_HORIPML_ext.pyx index 108ddf37..0cf04bde 100644 --- a/gprMax/pml_updates/pml_updates_electric_HORIPML_ext.pyx +++ b/gprMax/pml_updates/pml_updates_electric_HORIPML_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_electric_HORIPML_gpu.py b/gprMax/pml_updates/pml_updates_electric_HORIPML_gpu.py index 2bfcbf65..6d0c2904 100644 --- a/gprMax/pml_updates/pml_updates_electric_HORIPML_gpu.py +++ b/gprMax/pml_updates/pml_updates_electric_HORIPML_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_electric_MRIPML_ext.pyx b/gprMax/pml_updates/pml_updates_electric_MRIPML_ext.pyx index 7dc5536f..8cd35de5 100644 --- a/gprMax/pml_updates/pml_updates_electric_MRIPML_ext.pyx +++ b/gprMax/pml_updates/pml_updates_electric_MRIPML_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_electric_MRIPML_gpu.py b/gprMax/pml_updates/pml_updates_electric_MRIPML_gpu.py index 9072a8ed..c591aae6 100644 --- a/gprMax/pml_updates/pml_updates_electric_MRIPML_gpu.py +++ b/gprMax/pml_updates/pml_updates_electric_MRIPML_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_magnetic_HORIPML_ext.pyx b/gprMax/pml_updates/pml_updates_magnetic_HORIPML_ext.pyx index 18cd0eb9..5051e054 100644 --- a/gprMax/pml_updates/pml_updates_magnetic_HORIPML_ext.pyx +++ b/gprMax/pml_updates/pml_updates_magnetic_HORIPML_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_magnetic_HORIPML_gpu.py b/gprMax/pml_updates/pml_updates_magnetic_HORIPML_gpu.py index fe5e5a73..fde2858c 100644 --- a/gprMax/pml_updates/pml_updates_magnetic_HORIPML_gpu.py +++ b/gprMax/pml_updates/pml_updates_magnetic_HORIPML_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_magnetic_MRIPML_ext.pyx b/gprMax/pml_updates/pml_updates_magnetic_MRIPML_ext.pyx index 58f6d463..e0a6e9b9 100644 --- a/gprMax/pml_updates/pml_updates_magnetic_MRIPML_ext.pyx +++ b/gprMax/pml_updates/pml_updates_magnetic_MRIPML_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/pml_updates/pml_updates_magnetic_MRIPML_gpu.py b/gprMax/pml_updates/pml_updates_magnetic_MRIPML_gpu.py index 23d0b9b4..c85c88fd 100644 --- a/gprMax/pml_updates/pml_updates_magnetic_MRIPML_gpu.py +++ b/gprMax/pml_updates/pml_updates_magnetic_MRIPML_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/receivers.py b/gprMax/receivers.py index b840bd2d..b87af1e4 100644 --- a/gprMax/receivers.py +++ b/gprMax/receivers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/snapshots.py b/gprMax/snapshots.py index 98e05a26..637f1e2e 100644 --- a/gprMax/snapshots.py +++ b/gprMax/snapshots.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/snapshots_ext.pyx b/gprMax/snapshots_ext.pyx index fda151d6..cba05c47 100644 --- a/gprMax/snapshots_ext.pyx +++ b/gprMax/snapshots_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/snapshots_gpu.py b/gprMax/snapshots_gpu.py index b9cad9b6..4471131f 100644 --- a/gprMax/snapshots_gpu.py +++ b/gprMax/snapshots_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/source_updates_gpu.py b/gprMax/source_updates_gpu.py index ab5e1a62..00a5cd50 100644 --- a/gprMax/source_updates_gpu.py +++ b/gprMax/source_updates_gpu.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/sources.py b/gprMax/sources.py index 7607949e..3b972835 100644 --- a/gprMax/sources.py +++ b/gprMax/sources.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/utilities.py b/gprMax/utilities.py index 210125d7..da768434 100644 --- a/gprMax/utilities.py +++ b/gprMax/utilities.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. @@ -63,7 +63,7 @@ def logo(version): """ description = '\n=== Electromagnetic modelling software based on the Finite-Difference Time-Domain (FDTD) method' - copyright = 'Copyright (C) 2015-2022: The University of Edinburgh' + copyright = 'Copyright (C) 2015-2023: The University of Edinburgh' authors = 'Authors: Craig Warren and Antonis Giannopoulos' licenseinfo1 = 'gprMax is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n' licenseinfo2 = 'gprMax is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.' diff --git a/gprMax/waveforms.py b/gprMax/waveforms.py index 1857f1b8..008dd909 100644 --- a/gprMax/waveforms.py +++ b/gprMax/waveforms.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/yee_cell_build_ext.pyx b/gprMax/yee_cell_build_ext.pyx index 03ffc158..84c1208a 100644 --- a/gprMax/yee_cell_build_ext.pyx +++ b/gprMax/yee_cell_build_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/yee_cell_setget_rigid_ext.pxd b/gprMax/yee_cell_setget_rigid_ext.pxd index 84851c1e..bf4abd26 100644 --- a/gprMax/yee_cell_setget_rigid_ext.pxd +++ b/gprMax/yee_cell_setget_rigid_ext.pxd @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/gprMax/yee_cell_setget_rigid_ext.pyx b/gprMax/yee_cell_setget_rigid_ext.pyx index 33ae9454..f53adf8a 100644 --- a/gprMax/yee_cell_setget_rigid_ext.pyx +++ b/gprMax/yee_cell_setget_rigid_ext.pyx @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/setup.py b/setup.py index 5bff7811..9b7f44cc 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tests/benchmarking/plot_benchmark.py b/tests/benchmarking/plot_benchmark.py index 7852f30d..541b6724 100644 --- a/tests/benchmarking/plot_benchmark.py +++ b/tests/benchmarking/plot_benchmark.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tests/test_experimental.py b/tests/test_experimental.py index d1674e07..38767696 100644 --- a/tests/test_experimental.py +++ b/tests/test_experimental.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tests/test_models.py b/tests/test_models.py index 05aa12d1..5f13d752 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/Paraview macros/gprMax_info.py b/tools/Paraview macros/gprMax_info.py index fe6aa411..d2567506 100644 --- a/tools/Paraview macros/gprMax_info.py +++ b/tools/Paraview macros/gprMax_info.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren, Antonis Giannopoulos, and John Hartley # # This file is part of gprMax. diff --git a/tools/convert_png2h5.py b/tools/convert_png2h5.py index b82dd5ae..fcff4db2 100644 --- a/tools/convert_png2h5.py +++ b/tools/convert_png2h5.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/inputfile_old2new.py b/tools/inputfile_old2new.py index ff6a2def..9873d454 100644 --- a/tools/inputfile_old2new.py +++ b/tools/inputfile_old2new.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/outputfiles_merge.py b/tools/outputfiles_merge.py index 1ba87e1c..afed4507 100644 --- a/tools/outputfiles_merge.py +++ b/tools/outputfiles_merge.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/plot_Ascan.py b/tools/plot_Ascan.py index 5aff3ab8..7c5d2f29 100644 --- a/tools/plot_Ascan.py +++ b/tools/plot_Ascan.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/plot_Bscan.py b/tools/plot_Bscan.py index 270dc7b0..c6229a2a 100644 --- a/tools/plot_Bscan.py +++ b/tools/plot_Bscan.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/plot_antenna_params.py b/tools/plot_antenna_params.py index f27bf6fd..b54b1710 100644 --- a/tools/plot_antenna_params.py +++ b/tools/plot_antenna_params.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/tools/plot_source_wave.py b/tools/plot_source_wave.py index 1648ccf9..88710fd1 100644 --- a/tools/plot_source_wave.py +++ b/tools/plot_source_wave.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022: The University of Edinburgh +# Copyright (C) 2015-2023: The University of Edinburgh # Authors: Craig Warren and Antonis Giannopoulos # # This file is part of gprMax. diff --git a/user_libs/antennas/GSSI.py b/user_libs/antennas/GSSI.py index 35819bc9..e40114ad 100644 --- a/user_libs/antennas/GSSI.py +++ b/user_libs/antennas/GSSI.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022, Craig Warren +# Copyright (C) 2015-2023, Craig Warren # # This module is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. # To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. diff --git a/user_libs/antennas/MALA.py b/user_libs/antennas/MALA.py index 8b66832d..d2eb0314 100644 --- a/user_libs/antennas/MALA.py +++ b/user_libs/antennas/MALA.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022, Craig Warren +# Copyright (C) 2015-2023, Craig Warren # # This module is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. # To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. diff --git a/user_libs/optimisation_taguchi/fitness_functions.py b/user_libs/optimisation_taguchi/fitness_functions.py index 23514d06..3c2b8365 100755 --- a/user_libs/optimisation_taguchi/fitness_functions.py +++ b/user_libs/optimisation_taguchi/fitness_functions.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022, Craig Warren +# Copyright (C) 2015-2023, Craig Warren # # This module is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. # To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. diff --git a/user_libs/optimisation_taguchi/plot_results.py b/user_libs/optimisation_taguchi/plot_results.py index 1f03bb29..5aec6125 100644 --- a/user_libs/optimisation_taguchi/plot_results.py +++ b/user_libs/optimisation_taguchi/plot_results.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2022, Craig Warren +# Copyright (C) 2015-2023, Craig Warren # # This module is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. # To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/.