你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-07 15:10:13 +08:00
Merge pull request #340 from Sai-Suraj-27/devel
This PR fixes mistakes in the docs, and makes it clean and better
这个提交包含在:
12
CREDITS
12
CREDITS
@@ -1,9 +1,10 @@
|
||||
# Copyright (C) 2015-2023: The University of Edinburgh, United Kingdom
|
||||
# Authors: Craig Warren, Antonis Giannopoulos, and John Hartley
|
||||
#
|
||||
# This is the official list of entities and people who have contributed to gprMax.
|
||||
#
|
||||
# Please keep the lists of sorted alphabetically (by surname for individuals).
|
||||
|
||||
# Authors: Craig Warren, Antonis Giannopoulos, and John Hartley
|
||||
|
||||
# This is the official list of entities and people who have contributed to gprMax
|
||||
|
||||
# Please keep the lists sorted alphabetically (by surname for individuals).
|
||||
|
||||
gprMax has been supported through research projects funded by:
|
||||
|
||||
@@ -12,7 +13,6 @@ Google
|
||||
|
||||
gprMax is a contribution to COST Action TU1208 'Civil Engineering Applications of Ground Penetrating Radar'
|
||||
|
||||
|
||||
As well as the aforementioned authors, the following individuals have contributed to gprMax:
|
||||
|
||||
Oystein Bjorndal
|
||||
|
22
README.rst
22
README.rst
@@ -14,7 +14,7 @@ Getting Started
|
||||
What is gprMax?
|
||||
===============
|
||||
|
||||
`gprMax <http://www.gprmax.com>`_ is open source software that simulates electromagnetic wave propagation. It solves Maxwell's equations in 3D using the Finite-Difference Time-Domain (FDTD) method. gprMax was designed for modelling Ground Penetrating Radar (GPR) but can also be used to model electromagnetic wave propagation for many other applications.
|
||||
`gprMax <http://www.gprmax.com>`_ is an open source software that simulates electromagnetic wave propagation. It solves Maxwell's equations in 3D using the Finite-Difference Time-Domain (FDTD) method. gprMax was designed for modelling Ground Penetrating Radar (GPR) but can also be used to model electromagnetic wave propagation for many other applications.
|
||||
|
||||
gprMax is currently released under the `GNU General Public License v3 or higher <http://www.gnu.org/copyleft/gpl.html>`_.
|
||||
|
||||
@@ -55,10 +55,10 @@ Package overview
|
||||
* ``CREDITS`` contains a list of names of people who have contributed to the gprMax codebase.
|
||||
* ``docs`` contains source files for the User Guide. The User Guide is written using `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ markup, and is built using `Sphinx <http://sphinx-doc.org>`_ and `Read the Docs <https://readthedocs.org>`_.
|
||||
* ``examples`` is a sub-package where example input files and models are stored.
|
||||
* ``gprMax`` is the main package. Within this package the main module is ``gprMax.py``
|
||||
* ``gprMax`` is the main package. Within this package, the main module is ``gprMax.py``
|
||||
* ``gprMax.toml`` contains build system requirements.
|
||||
* ``LICENSE`` contains information on the `GNU General Public License v3 or higher <http://www.gnu.org/copyleft/gpl.html>`_.
|
||||
* ``MANIFEST.in`` consists of commands, one per line, instructing setuptools to add or remove files from the source distribution.
|
||||
* ``MANIFEST.in`` consists of commands, one per line, instructing setup tools to add or remove files from the source distribution.
|
||||
* ``README.rst`` contains getting started information on installation, usage, and new features/changes.
|
||||
* ``setup.py`` is the centre of all activity in building, distributing, and installing gprMax, including building and compiling the Cython extension modules.
|
||||
* ``testing`` is a sub-package which contains test modules and input files.
|
||||
@@ -73,12 +73,12 @@ The following steps provide guidance on how to install gprMax:
|
||||
2. Install a C compiler which supports OpenMP
|
||||
3. Build and install gprMax
|
||||
|
||||
1. Install Python, required Python packages, and get gprMax source
|
||||
1. Install Python, the required Python packages, and get the gprMax source
|
||||
------------------------------------------------------------------
|
||||
|
||||
We recommend using Miniconda to install Python and the required Python packages for gprMax in a self-contained Python environment. Miniconda is a mini version of Anaconda which is a completely free Python distribution (including for commercial use and redistribution). It includes more than 300 of the most popular Python packages for science, math, engineering, and data analysis.
|
||||
|
||||
* `Download and install Miniconda <https://docs.conda.io/en/latest/miniconda.html>`_. Choose the Python 3.x version for your platform. We recommend choosing the installation options to: install Miniconda only for your user account; add Miniconda to your PATH environment variable; and to register Miniconda Python as your default Python. See the `Quick Install page <https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html>`_ for help installing Miniconda.
|
||||
* `Download and install Miniconda <https://docs.conda.io/en/latest/miniconda.html>`_. Choose the Python 3.x version for your platform. We recommend choosing the installation options to: install Miniconda only for your user account; add Miniconda to your PATH environment variable; and register Miniconda Python as your default Python. See the `Quick Install page <https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html>`_ for help installing Miniconda.
|
||||
* Open a Terminal (Linux/macOS) or Command Prompt (Windows) and run the following commands:
|
||||
|
||||
.. code-block:: bash
|
||||
@@ -119,7 +119,7 @@ Microsoft Windows
|
||||
* Download and install Microsoft `Build Tools for Visual Studio 2022 <https://aka.ms/vs/17/release/vs_BuildTools.exe>`_ (direct link). You can also find it on the `Microsoft Visual Studio downloads page <https://visualstudio.microsoft.com/downloads/>`_ by scrolling down to the 'All Downloads' section, clicking the disclosure triangle by 'Tools for Visual Studio 2022', then clicking the download button next to 'Build Tools for Visual Studio 2022'. When installing, choose the 'Desktop development with C++' Workload and select only 'MSVC v143' and 'Windows 10 SDK' or 'Windows 11 SDK options.
|
||||
* Set the Path and Environment Variables - this can be done by following the `instructions from Microsoft <https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160#developer_command_file_locations>`_, or manually by adding a form of :code:`C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.23.28105\bin\Hostx64\x64` (this may vary according to your exact machine and installation) to your system Path environment variable.
|
||||
|
||||
Alternatively if you are using Windows 10/11 you can install the `Windows Subsystem for Linux <https://docs.microsoft.com/en-gb/windows/wsl/about>`_ and then follow the Linux install instructions for gprMax. Note however that currently WSL does not aim to support GUI desktops or applications, e.g. Gnome, KDE, etc....
|
||||
Alternatively, if you are using Windows 10/11 you can install the `Windows Subsystem for Linux <https://docs.microsoft.com/en-gb/windows/wsl/about>`_ and then follow the Linux install instructions for gprMax. Note however that currently, WSL does not aim to support GUI desktops or applications, e.g. Gnome, KDE, etc....
|
||||
|
||||
3. Build and install gprMax
|
||||
---------------------------
|
||||
@@ -159,7 +159,7 @@ When the simulation is complete you can plot the A-scan using:
|
||||
|
||||
(gprMax)$ python -m toolboxes/Plotting.plot_Ascan examples/cylinder_Ascan_2D.h5
|
||||
|
||||
Your results should like those from the A-scan from the metal cylinder example in `introductory/basic 2D models section <http://docs.gprmax.com/en/latest/examples_simple_2D.html#view-the-results>`_
|
||||
Your results should be like those from the A-scan from the metal cylinder example in `introductory/basic 2D models section <http://docs.gprmax.com/en/latest/examples_simple_2D.html#view-the-results>`_
|
||||
|
||||
When you are finished using gprMax, the conda environment can be deactivated using :code:`conda deactivate`.
|
||||
|
||||
@@ -170,8 +170,8 @@ Optional command line arguments
|
||||
Argument name Type Description
|
||||
====================== ========= ===========
|
||||
``-n`` integer Number of required simulation runs. This option can be used to run a series of models, e.g. to create a B-scan with 60 traces: ``(gprMax)$ python -m gprMax examples/cylinder_Bscan_2D.in -n 60``
|
||||
``-i`` integer Model number to start/restart simulation from. It would typically be used to restart a series of models from a specific model number, with the n argument, e.g. to restart from A-scan 45 when creating a B-scan with 60 traces.
|
||||
``-mpi`` integer number of Message Passing Interface (MPI) tasks, i.e. master + workers, for MPI task farm. This option is most usefully combined with ``-n`` to allow individual models to be farmed out using a MPI task farm, e.g. to create a B-scan with 60 traces and use MPI to farm out each trace: ``(gprMax)$ python -m gprMax examples/cylinder_Bscan_2D.in -n 60 -mpi 61``. For further details see the `parallel performance section of the User Guide <http://docs.gprmax.com/en/latest/openmp_mpi.html>`_
|
||||
``-i`` integer Model number to start/restart the simulation from. It would typically be used to restart a series of models from a specific model number, with the n argument, e.g. to restart from A-scan 45 when creating a B-scan with 60 traces.
|
||||
``-mpi`` integer number of Message Passing Interface (MPI) tasks, i.e. master + workers, for MPI task farm. This option is most usefully combined with ``-n`` to allow individual models to be farmed out using an MPI task farm, e.g. to create a B-scan with 60 traces and use MPI to farm out each trace: ``(gprMax)$ python -m gprMax examples/cylinder_Bscan_2D.in -n 60 -mpi 61``. For further details see the `parallel performance section of the User Guide <http://docs.gprmax.com/en/latest/openmp_mpi.html>`_
|
||||
``-gpu`` list/bool Flag to use NVIDIA GPU or list of NVIDIA GPU device ID(s) for specific GPU card(s), e.g. ``-gpu 0 1``
|
||||
``-opencl`` list/bool Flag to use OpenCL or list of OpenCL device ID(s) for specific compute device(s).
|
||||
``--geometry-only`` flag Build a model and produce any geometry views but do not run the simulation, e.g. to check the geometry of a model is correct: ``(gprMax)$ python -m gprMax examples/heterogeneous_soil.in --geometry-only``
|
||||
@@ -189,11 +189,11 @@ Updating gprMax
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
(gprMax)$ pip unistall gprMax
|
||||
(gprMax)$ pip uninstall gprMax
|
||||
(gprMax)$ git clone https://github.com/gprMax/gprMax.git
|
||||
(gprMax)$ pip install -e gprMax
|
||||
|
||||
This will uninstall gprMax, clone the most recent gprMax source code form GitHub, and then build and install the latest version of gprMax.
|
||||
This will uninstall gprMax, clone the most recent gprMax source code from GitHub, and then build and install the latest version of gprMax.
|
||||
|
||||
|
||||
Updating conda and Python packages
|
||||
|
@@ -4,13 +4,13 @@
|
||||
OpenMP/CUDA/OpenCL
|
||||
******************
|
||||
|
||||
The most computationally intensive parts of gprMax, which are the FDTD solver loops, have been parallelised using different CPU and GPU accelerators to offer performance and flexibility.
|
||||
The most computationally intensive parts of gprMax, which are the FDTD solver loops, have been parallelized using different CPU and GPU accelerators to offer performance and flexibility.
|
||||
|
||||
1. `OpenMP <http://openmp.org>`_ which supports multi-platform shared memory multiprocessing.
|
||||
2. `NVIDIA CUDA <https://developer.nvidia.com/cuda-toolkit>`_ for NVIDIA GPUs.
|
||||
3. `OpenCL <https://www.khronos.org/api/opencl>`_ for a wider range of CPU and GPU hardware.
|
||||
|
||||
Additionally the Message Passing Interface (MPI) can be utilised to implement a simple task farm that can be used to distribute a series of models as independent tasks. This can be useful in many GPR simulations where a B-scan (composed of multiple A-scans) is required. Each A-scan can be task-farmed as a independent model, and within each model OpenMP or CUDA can still be used for parallelism. This creates mixed mode OpenMP/MPI or CUDA/MPI environments.
|
||||
Additionally, the Message Passing Interface (MPI) can be utilised to implement a simple task farm that can be used to distribute a series of models as independent tasks. This can be useful in many GPR simulations where a B-scan (composed of multiple A-scans) is required. Each A-scan can be task-farmed as an independent model, and within each model, OpenMP or CUDA can still be used for parallelism. This creates mixed mode OpenMP/MPI or CUDA/MPI environments.
|
||||
|
||||
Some of these accelerators and frameworks require additional software to be installed. The guidance below explains how to do that and gives examples of usage.
|
||||
|
||||
@@ -24,12 +24,12 @@ OpenMP
|
||||
|
||||
No additional software is required to use OpenMP as it is part of the standard installation of gprMax.
|
||||
|
||||
By default gprMax will try to determine and use the maximum number of OpenMP threads (usually the number of physical CPU cores) available on your machine. You can override this behaviour in two ways: firstly, gprMax will check to see if the ``#cpu_threads`` command is present in your input file; if not, gprMax will check to see if the environment variable ``OMP_NUM_THREADS`` is set. This can be useful if you are running gprMax in a High-Performance Computing (HPC) environment where you might not want to use all of the available CPU cores.
|
||||
By default, gprMax will try to determine and use the maximum number of OpenMP threads (usually the number of physical CPU cores) available on your machine. You can override this behaviour in two ways: firstly, gprMax will check to see if the ``#cpu_threads`` command is present in your input file; if not, gprMax will check to see if the environment variable ``OMP_NUM_THREADS`` is set. This can be useful if you are running gprMax in a High-Performance Computing (HPC) environment where you might not want to use all of the available CPU cores.
|
||||
|
||||
MPI
|
||||
===
|
||||
|
||||
By default the MPI task farm functionality is turned off. It can be used with the ``-mpi`` command line option, which specifies the total number of MPI tasks, i.e. master + workers, for the MPI task farm. This option is most usefully combined with ``-n`` to allow individual models to be farmed out using a MPI task farm, e.g. to create a B-scan with 60 traces and use MPI to farm out each trace: ``(gprMax)$ python -m gprMax examples/cylinder_Bscan_2D.in -n 60 -mpi 61``.
|
||||
By default, the MPI task farm functionality is turned off. It can be used with the ``-mpi`` command line option, which specifies the total number of MPI tasks, i.e. master + workers, for the MPI task farm. This option is most usefully combined with ``-n`` to allow individual models to be farmed out using an MPI task farm, e.g. to create a B-scan with 60 traces and use MPI to farm out each trace: ``(gprMax)$ python -m gprMax examples/cylinder_Bscan_2D.in -n 60 -mpi 61``.
|
||||
|
||||
Software required
|
||||
-----------------
|
||||
@@ -108,7 +108,7 @@ Run one of the test models:
|
||||
CUDA/MPI
|
||||
========
|
||||
|
||||
Message Passing Interface (MPI) has been utilised to implement a simple task farm that can be used to distribute a series of models as independent tasks. This is described in more detail in the :ref:`HPC <hpc>` section. MPI can be combined with the GPU functionality to allow a series models to be distributed to multiple GPUs on the same machine (node).
|
||||
Message Passing Interface (MPI) has been utilised to implement a simple task farm that can be used to distribute a series of models as independent tasks. This is described in more detail in the :ref:`HPC <hpc>` section. MPI can be combined with the GPU functionality to allow a series of models to be distributed to multiple GPUs on the same machine (node).
|
||||
|
||||
Example
|
||||
-------
|
||||
@@ -121,4 +121,4 @@ For example, to run a B-scan that contains 60 A-scans (traces) on a system with
|
||||
|
||||
.. note::
|
||||
|
||||
The argument given with ``-mpi`` is number of MPI tasks, i.e. master + workers, for MPI task farm. So in this case, 1 master (CPU) and 4 workers (GPU cards). The integers given with the ``-gpu`` argument are the NVIDIA CUDA device IDs for the specific GPU cards to be used.
|
||||
The argument given with ``-mpi`` is the number of MPI tasks, i.e. master + workers, for the MPI task farm. So in this case, 1 master (CPU) and 4 workers (GPU cards). The integers given with the ``-gpu`` argument are the NVIDIA CUDA device IDs for the specific GPU cards to be used.
|
||||
|
@@ -52,7 +52,7 @@ High dielectric example
|
||||
|
||||
:download:`cylinder_fs.py <../../examples/subgrids/cylinder_fs.py>`
|
||||
|
||||
This example is a basic demonstration of how to use subgrids. The geometry is 3D (required for any use of subgrids) and is of a water-filled (high dielectric constant) cylindrical object in freespace. The subgrid encloses the cylinderical object using a fine spatial discretisation (1mm), and a courser spatial discretisation (5mm) is used in the rest of the model (main grid). A simple Hertzian dipole source is used with a waveform shaped as the first derivative of a gaussian.
|
||||
This example is a basic demonstration of how to use subgrids. The geometry is 3D (required for any use of subgrids) and is of a water-filled (high dielectric constant) cylindrical object in freespace. The subgrid encloses the cylindrical object using a fine spatial discretisation (1mm), and a courser spatial discretisation (5mm) is used in the rest of the model (main grid). A simple Hertzian dipole source is used with a waveform shaped as the first derivative of a gaussian.
|
||||
|
||||
.. literalinclude:: ../../examples/subgrids/cylinder_fs.py
|
||||
:language: none
|
||||
|
@@ -17,7 +17,7 @@ This example demonstrates a model of a half-wavelength wire dipole antenna in fr
|
||||
:language: none
|
||||
:linenos:
|
||||
|
||||
The wire is modelled using an edge which specifies properties of the edge of the Yee cell. The antenna is fed using a transmission line The one-dimensional transmission line model virtually attaches to the dipole at the gap between the arms. The antenna has an input resistance :math:`Z_{in} = 73~\Omega` specified in the transmissions, and uses a Gaussian waveform with a centre frequency of 1GHz. A time window of 60ns is used: firstly, to give enough time for the response to decay down to zero; and secondly, to allow a reasonable resolution (17MHz) for calculating antenna parameters that involve taking a FFT (:math:`\Delta f=1/T` where :math:`\Delta f` is the frequency bin spacing and :math:`T` is the time window).
|
||||
The wire is modelled using an edge which specifies the properties of the edge of the Yee cell. The antenna is fed using a transmission line The one-dimensional transmission line model virtually attaches to the dipole at the gap between the arms. The antenna has an input resistance :math:`Z_{in} = 73~\Omega` specified in the transmissions, and uses a Gaussian waveform with a centre frequency of 1GHz. A time window of 60ns is used: firstly, to give enough time for the response to decay down to zero; and secondly, to allow a reasonable resolution (17MHz) for calculating antenna parameters that involve taking an FFT (:math:`\Delta f=1/T` where :math:`\Delta f` is the frequency bin spacing and :math:`T` is the time window).
|
||||
|
||||
Time histories of voltage and current values in the transmission line are saved to the output file. These are documented in the :ref:`output` section. These parameters are useful for calculating characteristics of the antenna such as the input impedance or S-parameters. gprMax includes a Python module (in the ``toolboxes\Plotting`` package) to help you view the input impedance and admittance and s11 parameter from an antenna model fed using a transmission line. Details of how to use this module are given in the README.rst for that package.
|
||||
|
||||
@@ -51,7 +51,7 @@ You can view the results (see :ref:`output` section and README.rst for the ``too
|
||||
|
||||
Detailed view of input admittance and impedance (resistance and reactance) and s11 parameter values of the antenna (:math:`\Delta f = 17~MHz`).
|
||||
|
||||
:numref:`antenna_wire_dipole_fs_tl_params` shows time histories and frequency spectra of the incident and total (incident + reflected) voltages and currents in the transmission line. :numref:`antenna_wire_dipole_fs_ant_params` shows the input admittance and impedance (resistance and reactance), and s11 parameter of the half-wavelength wire dipole. :numref:`antenna_wire_dipole_fs_ant_params_detail` shows a more detailed view of these parameters. The s11 parameter shows that the first resonance of the antenna is at 950MHz. Depending on the radius of the wire, the length of the dipole for first resonance is about :math:`l=0.47\lambda` to :math:`0.48\lambda`. The thinner the wire the closer the resonance is to :math:`0.48\lambda` [BAL2005]_. In this case, with a first resonance of 950MHz and a length of 150mm, :math:`l/\lambda=0.475`. The input impedance is :math:`Z_{in} = 72.8 + j1~\Omega`. If :math:`l/\lambda=0.5` then the theoretical input impedance would be :math:`Z_{in} = 73 + j42.5~\Omega`. The reactive (imaginery) part associated with the input impedance of a dipole is a function of its length.
|
||||
:numref:`antenna_wire_dipole_fs_tl_params` shows time histories and frequency spectra of the incident and total (incident + reflected) voltages and currents in the transmission line. :numref:`antenna_wire_dipole_fs_ant_params` shows the input admittance and impedance (resistance and reactance), and s11 parameter of the half-wavelength wire dipole. :numref:`antenna_wire_dipole_fs_ant_params_detail` shows a more detailed view of these parameters. The s11 parameter shows that the first resonance of the antenna is at 950MHz. Depending on the radius of the wire, the length of the dipole for first resonance is about :math:`l=0.47\lambda` to :math:`0.48\lambda`. The thinner the wire the closer the resonance is to :math:`0.48\lambda` [BAL2005]_. In this case, with a first resonance of 950MHz and a length of 150mm, :math:`l/\lambda=0.475`. The input impedance is :math:`Z_{in} = 72.8 + j1~\Omega`. If :math:`l/\lambda=0.5` then the theoretical input impedance would be :math:`Z_{in} = 73 + j42.5~\Omega`. The reactive (imaginary) part associated with the input impedance of a dipole is a function of its length.
|
||||
|
||||
:numref:`antenna_wire_dipole_fs_ant_params_detail_1p4MHz` demonstrates the increased frequency resolution (:math:`\Delta f = 1.4~MHz`) when an even longer time window (700ns) is used.
|
||||
|
||||
@@ -92,7 +92,7 @@ When the simulation is run two geometry files for the antenna are produced along
|
||||
|
||||
python -m tools.plot_Ascan examples/antenna_like_MALA_1200_fs.h5 --outputs Ey
|
||||
|
||||
:numref:`antenna_like_MALA_1200_fs_results` shows the time history of the y-component of the electric field from the receiver bowtie of the antenna model (the antenna bowties are aligned with the y axis).
|
||||
:numref:`antenna_like_MALA_1200_fs_results` shows the time history of the y-component of the electric field from the receiver bowtie of the antenna model (the antenna bowties are aligned with the y-axis).
|
||||
|
||||
.. _antenna_like_MALA_1200_fs_results:
|
||||
|
||||
@@ -118,7 +118,7 @@ This example demonstrates how to create a B-scan with an antenna model. The scen
|
||||
|
||||
FDTD geometry mesh showing a metal cylinder buried in a half-space and an antenna model similar to a GSSI 1.5GHz antenna.
|
||||
|
||||
The antenna must be moved to a new position for every single A-scan (trace) in the B-scan. This is done using a for loop and creating a new scene (with new antenna position) for each A-scan. In this example the B-scan distance will be 270mm with a trace every 5mm, so 54 model runs will be required.
|
||||
The antenna must be moved to a new position for every single A-scan (trace) in the B-scan. This is done using a for loop and creating a new scene (with a new antenna position) for each A-scan. In this example the B-scan distance will be 270mm with a trace every 5mm, so 54 model runs will be required.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -144,4 +144,4 @@ After merging the A-scans into a single file you can now view an image of the B-
|
||||
.. figure:: ../../images_shared/cylinder_Bscan_GSSI_1500_results.png
|
||||
:width: 600px
|
||||
|
||||
B-scan of model of a metal cylinder buried in a dielectric half-space with a model of an antenna similar to a GSSI 1.5GHz antenna.
|
||||
B-scan of the model of a metal cylinder buried in a dielectric half-space with a model of an antenna similar to a GSSI 1.5GHz antenna.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
Introductory (2D) models
|
||||
************************
|
||||
|
||||
This section provides some introductory example models in 2D that demonstrate basic features of gprMax. Each example comes with an input file which you can download and run.
|
||||
This section provides some introductory example models in 2D that demonstrate the basic features of gprMax. Each example comes with an input file which you can download and run.
|
||||
|
||||
.. _example-2D-Ascan:
|
||||
|
||||
@@ -24,9 +24,9 @@ The geometry of the scenario is straightforward and an image created from the ge
|
||||
.. figure:: ../../images_shared/cylinder_half_space_geo.png
|
||||
:width: 600 px
|
||||
|
||||
Geometry of a 2D model of a metal cylinder buried in a dielectric half-space.
|
||||
The Geometry of a 2D model of a metal cylinder buried in a dielectric half-space.
|
||||
|
||||
For this initial example a detailed description of what each command in the input file does and why each command was used is given. The following steps explain the process of building the input file:
|
||||
For this initial example, a detailed description of what each command in the input file does and why each command was used is given. The following steps explain the process of building the input file:
|
||||
|
||||
Determine the constitutive parameters for the materials
|
||||
-------------------------------------------------------
|
||||
@@ -47,7 +47,7 @@ These should generally be known, often based on the GPR system or scenario being
|
||||
#waveform: ricker 1 1.5e9 my_ricker
|
||||
#hertzian_dipole: z 0.100 0.170 0 my_ricker
|
||||
|
||||
The Ricker waveform is created with the ``#waveform`` command, specifying an amplitude of one, centre frequency of 1.5 GHz and picking an arbitrary identifier of ``my_ricker``. The Hertzian dipole source is created using the ``#hertzian_dipole`` command, specifying a z direction polarisation (perpendicular to the survey direction if a B-scan were being created), location on the surface of the slab, and using the Ricker waveform already created.
|
||||
The Ricker waveform is created with the ``#waveform`` command, specifying an amplitude of one, centre frequency of 1.5 GHz, and picking an arbitrary identifier of ``my_ricker``. The Hertzian dipole source is created using the ``#hertzian_dipole`` command, specifying a z direction polarisation (perpendicular to the survey direction if a B-scan were being created), location on the surface of the slab, and using the Ricker waveform already created.
|
||||
|
||||
Calculate a spatial resolution and domain size
|
||||
----------------------------------------------
|
||||
@@ -86,7 +86,7 @@ The time step required for the model is automatically calculated using the :ref:
|
||||
Create the objects
|
||||
------------------
|
||||
|
||||
Now physical objects can be created for the half-space and the cylinder. First the ``#box`` command will be used to create the half-space and then the ``#cylinder`` command will be given which will overwrite the properties of the half-space with those of the cylinder at the location of the cylinder.
|
||||
Now physical objects can be created for the half-space and the cylinder. First, the ``#box`` command will be used to create the half-space and then the ``#cylinder`` command will be given which will overwrite the properties of the half-space with those of the cylinder at the location of the cylinder.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -114,7 +114,7 @@ You should have produced an output file ``cylinder_Ascan_2D.h5``. You can view t
|
||||
|
||||
python -m tools.plot_Ascan examples/cylinder_Ascan_2D.h5
|
||||
|
||||
:numref:`cylinder_Ascan_results` shows the time history of the electric and magnetic field components and currents at the receiver location. The :math:`E_z` field component can be converted to voltage which represents the A-scan (trace). The initial part of the signal (~0.5-1.5 ns) represents the direct wave from transmitter to receiver. Then comes the reflected wavelet (~1.8-2.6 ns), which has opposite polarity, from the metal cylinder.
|
||||
:numref:`cylinder_Ascan_results` shows the time history of the electric and magnetic field components and currents at the receiver location. The :math:`E_z` field component can be converted to a voltage that represents the A-scan (trace). The initial part of the signal (~0.5-1.5 ns) represents the direct wave from transmitter to receiver. Then comes the reflected wavelet (~1.8-2.6 ns), which has opposite polarity, from the metal cylinder.
|
||||
|
||||
.. _cylinder_Ascan_results:
|
||||
|
||||
@@ -139,7 +139,7 @@ This example uses the same geometry as the previous example but this time a B-sc
|
||||
|
||||
The differences between this input file and the one from the A-scan are the x coordinates of the source and receiver (lines 11 and 12), and the commands needed to move the source and receiver (lines 13 and 14). As before, the source and receiver are offset by 40mm from each other as before but they are now shifted to a starting position for the scan. The ``#src_steps`` command is used to move every source in the model by specified steps each time the model is run. Similarly, the ``#rx_steps`` command is used to move every receiver in the model by specified steps each time the model is run. Note, the same functionality can be achieved by using our Python API to move the source and receiver individually (see the :ref:`Python API <input-api>` section).
|
||||
|
||||
To run the model to create a B-scan you must pass an optional argument to specify the number of times the model should be run. In this case this is the number of A-scans (traces) that will comprise the B-scan. For a B-scan over a distance of 120mm with a step of 2mm that is 60 A-scans.
|
||||
To run the model to create a B-scan you must pass an optional argument to specify the number of times the model should be run. In this case, this is the number of A-scans (traces) that will comprise the B-scan. For a B-scan over a distance of 120mm with a step of 2mm that is 60 A-scans.
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -163,11 +163,11 @@ You can now view an image of the B-scan using the command:
|
||||
|
||||
python -m tools.plot_Bscan examples/cylinder_Bscan_2D_merged.h5 Ez
|
||||
|
||||
:numref:`cylinder_Bscan_results` shows the B-scan (of the :math:`E_z` field component). Again, the initial part of the signal (~0.5-1.5 ns) represents the direct wave from transmitter to receiver. Then comes the refelected wave (~2-3 ns) from the metal cylinder which creates the hyperbolic shape.
|
||||
:numref:`cylinder_Bscan_results` shows the B-scan (of the :math:`E_z` field component). Again, the initial part of the signal (~0.5-1.5 ns) represents the direct wave from transmitter to receiver. Then comes the reflected wave (~2-3 ns) from the metal cylinder which creates the hyperbolic shape.
|
||||
|
||||
.. _cylinder_Bscan_results:
|
||||
|
||||
.. figure:: ../../images_shared/cylinder_Bscan_results.png
|
||||
:width: 600px
|
||||
|
||||
B-scan of model of a metal cylinder buried in a dielectric half-space.
|
||||
B-scan of the model of a metal cylinder buried in a dielectric half-space.
|
||||
|
@@ -5,7 +5,7 @@ FAQs
|
||||
This section provides answers to frequently asked questions about gprMax and its uses. You should also check out our `YouTube channel <https://www.youtube.com/@Gprmax>`_ which contains screencasts and videos that explain how to install gprMax, demonstrate some of its key features, and give example models showing applications.
|
||||
|
||||
**What applications can gprMax simulate?**
|
||||
gprMax is electromagnetic wave simulation software that is based on the Finite-Difference Time-Domain (FDTD) method. Many of its features have been designed to benefit simulating Ground Penetrating Radar (GPR), however it can be used to simulate many other applications in areas such as engineering, geophysics, archaeology, and medicine.
|
||||
gprMax is electromagnetic wave simulation software that is based on the Finite-Difference Time-Domain (FDTD) method. Many of its features have been designed to benefit simulating Ground Penetrating Radar (GPR), however, it can be used to simulate many other applications in areas such as engineering, geophysics, archaeology, and medicine.
|
||||
|
||||
**Why does gprMax not have a GUI?**
|
||||
We considered developing a CAD-based graphical user interface (GUI) but, for now, decided against it. There were two guiding principals behind this design decision: firstly, users most often perform a series of related simulations with varying parameters to solve or optimize a particular problem; and secondly, we decided the limited resources we had were best concentrated on developing advanced modelling features for GPR within software that could easily be interfaced with other tools. Although a CAD-based GUI is useful for creating single simulations it becomes increasingly cumbersome for a series of simulations or where simulations contain heterogeneities, e.g. a model of a soil with stochastically varying electrical properties.
|
||||
@@ -14,7 +14,7 @@ We considered developing a CAD-based graphical user interface (GUI) but, for now
|
||||
gprMax is released under the `GNU General Public License v3 or higher <http://www.gnu.org/copyleft/gpl.html>`_. This means when distributing derived works, the source code of the work must be made available under the same license.
|
||||
|
||||
**Where does the name gprMax come from?**
|
||||
The name gprMax comes from the joining of the acroymn for Ground Penetrating Radar - **gpr** - and the name of the Scottish scientist who formulated the classical theory of electromagnetic radiation, `James Clerk Maxwell <https://en.wikipedia.org/wiki/James_Clerk_Maxwell>`_ - **Max**.
|
||||
The name gprMax comes from the joining of the acronym for Ground Penetrating Radar - **gpr** - and the name of the Scottish scientist who formulated the classical theory of electromagnetic radiation, `James Clerk Maxwell <https://en.wikipedia.org/wiki/James_Clerk_Maxwell>`_ - **Max**.
|
||||
|
||||
**Do I need to learn Python to use gprMax?**
|
||||
No, you can use gprMax purely through commands in your input. However, gprMax also has a Python API which can be used to create more complex simulations and scripting.
|
||||
@@ -22,8 +22,8 @@ No, you can use gprMax purely through commands in your input. However, gprMax al
|
||||
**Can I still do all my pre/post-processing for gprMax in MATLAB?**
|
||||
Yes, `MATLAB has built-in functions to read HDF5 files <http://uk.mathworks.com/help/matlab/high-level-functions.html>`_.
|
||||
|
||||
**Can I convert my output file to a text file, e.g. to import into Microsoft Excel**
|
||||
Yes, we recommend you download `HDFView <https://support.hdfgroup.org/products/java/hdfview/>`_ which is free viewer for HDF files. You can then export any of datasets in the output file to a text (ASCII) file that can be imported into Microsoft Excel. To do so right-click on the dataset in HDFView and choose Export Dataset -> Export Data to Text File.
|
||||
**Can I convert my output file to a text file, e.g. to import it into Microsoft Excel**
|
||||
Yes, we recommend you download `HDFView <https://support.hdfgroup.org/products/java/hdfview/>`_ which is a free viewer for HDF files. You can then export any of the datasets in the output file to a text (ASCII) file that can be imported into Microsoft Excel. To do so right-click on the dataset in HDFView and choose Export Dataset -> Export Data to Text File.
|
||||
|
||||
**How do I choose a spatial resolution for my simulation?**
|
||||
Spatial resolution should be chosen to mitigate numerical dispersion and to adequately resolve geometry in your simulation. :ref:`A 2D example of modelling a metal cylinder in a dielectric <example-2D-Ascan>` provides guidance on how to determine spatial resolution.
|
||||
|
@@ -9,10 +9,10 @@ This section highlights some of the key features of gprMax that are useful for G
|
||||
Python API
|
||||
==========
|
||||
|
||||
There is now a **Python API**, which includes all the functionality of the input file (hash) commands as well as several more advanced features. It allows users to access to gprMax functions directly from Python through importing the gprMax module. This method is recommended for those who prefer to use Python or need access to specific API-only advanced features, and is described in the :ref:`Python API <input-api>` section. There are several advantages to using the Python API:
|
||||
There is now a **Python API**, which includes all the functionality of the input file (hash) commands as well as several more advanced features. It allows users to access to gprMax functions directly from Python by importing the gprMax module. This method is recommended for those who prefer to use Python or need access to specific API-only advanced features, and is described in the :ref:`Python API <input-api>` section. There are several advantages to using the Python API:
|
||||
|
||||
1. Users can take advantage of the Python language - for instance, the structural elements of Python can be utilised more easily.
|
||||
2. gprMax objects can be used directly within functions, classes, modules and packages. In this way collections of components can be defined, reused and modified. For example, complex targets can be imported from a separate module and combined with an antenna from another module.
|
||||
2. gprMax objects can be used directly within functions, classes, modules and packages. In this way, collections of components can be defined, reused, and modified. For example, complex targets can be imported from a separate module and combined with an antenna from another module.
|
||||
3. The API can interface with other Python libraries. For example, the API could be used to create a parametric antenna and the external library Scipy could then be used to optimise its parameters.
|
||||
|
||||
Subgridding
|
||||
|
@@ -4,7 +4,7 @@
|
||||
Guidance on GPR modelling
|
||||
*************************
|
||||
|
||||
**In order to make the most of gprMax for modelling GPR you should be familiar with the Finite-Difference Time-Domain (FDTD) method method on which the software is based.**
|
||||
**In order to make the most of gprMax for modelling GPR you should be familiar with the Finite-Difference Time-Domain (FDTD) method on which the software is based.**
|
||||
|
||||
This section discusses some basic concepts of the FDTD method and GPR modelling. There is a large amount of further information available in the relevant literature. Good starting points are [KUN1993]_ and [TAF2005]_, and the specific application of FDTD to the GPR forward problem is described in [GIA1997]_.
|
||||
|
||||
@@ -36,7 +36,7 @@ temporal :math:`\Delta t` steps play a very significant role -- since the smalle
|
||||
|
||||
By assigning appropriate constitutive parameters to the locations of the electromagnetic field components complex shaped targets can be included easily in the models. However, objects with curved boundaries are represented using a staircase approximation.
|
||||
|
||||
gprMax is fundamentally based on solving Maxwell's equations in 3D using the FDTD method - transverse electromagnetic (TEM) mode. However, it can also be used to carry out simulations in 2D using the transverse magnetic (TM) mode. This is achieved through specifying a single cell slice of the domain, i.e. one dimension of the domain must be equal to the spatial discretization in that direction. When this occurs the electric and magnetic field components on the two faces of single cell slice in the invariant direction are set to zero. This is illustrated for the 2D TMz case in :numref:`yeecell2DTMz`.
|
||||
gprMax is fundamentally based on solving Maxwell's equations in 3D using the FDTD method - transverse electromagnetic (TEM) mode. However, it can also be used to carry out simulations in 2D using the transverse magnetic (TM) mode. This is achieved through specifying a single cell slice of the domain, i.e. one dimension of the domain must be equal to the spatial discretization in that direction. When this occurs the electric and magnetic field components on the two faces of a single cell slice in the invariant direction are set to zero. This is illustrated for the 2D TMz case in :numref:`yeecell2DTMz`.
|
||||
|
||||
.. _yeecell2DTMz:
|
||||
|
||||
@@ -64,7 +64,7 @@ Using this approach means that Maxwell's equations in 3D, shown in :eq:`maxwell3
|
||||
&\frac{\partial H_x}{\partial t} = \frac{1}{\mu} \left( - \frac{\partial E_z}{\partial y} - M_{Sx} - \sigma^* H_x \right) \\
|
||||
&\frac{\partial H_y}{\partial t} = \frac{1}{\mu} \left( \frac{\partial E_z}{\partial x} - M_{Sy} - \sigma^* H_y \right)
|
||||
|
||||
These equations are discretized in both space and time and applied in each FDTD cell. The numerical solution is obtained directly in the time domain in an iterative fashion. In each iteration the electromagnetic fields advance (propagate) in the FDTD grid and each iteration corresponds to an elapsed simulated time of one :math:`\Delta t`. Hence by specifying the number of iterations you can instruct the FDTD solver to simulate the fields for a given time window.
|
||||
These equations are discretized in both space and time and applied in each FDTD cell. The numerical solution is obtained directly in the time domain in an iterative fashion. In each iteration, the electromagnetic fields advance (propagate) in the FDTD grid and each iteration corresponds to an elapsed simulated time of one :math:`\Delta t`. Hence by specifying the number of iterations you can instruct the FDTD solver to simulate the fields for a given time window.
|
||||
|
||||
The price you have to pay for obtaining a solution directly in the time domain using the FDTD method is that the values of :math:`\Delta x`, :math:`\Delta y`, :math:`\Delta z` and :math:`\Delta t` can not be assigned independently. FDTD is a conditionally stable numerical process. The stability condition is known as the CFL condition after the initials of Courant, Freidrichs and Lewy and is given by,
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
HPC
|
||||
***
|
||||
|
||||
High-performance computing (HPC) environments usually require jobs to be submitted to a queue using a job script. The following are examples of job scripts for a HPC environment that uses `Open Grid Scheduler/Grid Engine <http://gridscheduler.sourceforge.net/index.html>`_, and are intended as general guidance to help you get started. Using gprMax in an HPC environment is heavily dependent on the configuration of your specific HPC/cluster, e.g. the names of parallel environments (``-pe``) and compiler modules will depend on how they were defined by your system administrator.
|
||||
High-performance computing (HPC) environments usually require jobs to be submitted to a queue using a job script. The following are examples of job scripts for an HPC environment that uses `Open Grid Scheduler/Grid Engine <http://gridscheduler.sourceforge.net/index.html>`_, and are intended as general guidance to help you get started. Using gprMax in an HPC environment is heavily dependent on the configuration of your specific HPC/cluster, e.g. the names of parallel environments (``-pe``) and compiler modules will depend on how they were defined by your system administrator.
|
||||
|
||||
|
||||
OpenMP example
|
||||
@@ -26,17 +26,17 @@ OpenMP/MPI example
|
||||
|
||||
:download:`gprmax_omp_mpi.sh <../../toolboxes/Utilities/HPC/gprmax_omp_mpi.sh>`
|
||||
|
||||
Here is an example of a job script for running models, e.g. A-scans to make a B-scan, distributed as independent tasks in a HPC environment using MPI. The behaviour of most of the variables is explained in the comments in the script.
|
||||
Here is an example of a job script for running models, e.g. A-scans to make a B-scan, distributed as independent tasks in an HPC environment using MPI. The behaviour of most of the variables is explained in the comments in the script.
|
||||
|
||||
.. literalinclude:: ../../toolboxes/Utilities/HPC/gprmax_omp_mpi.sh
|
||||
:language: bash
|
||||
:linenos:
|
||||
|
||||
In this example 10 models will be distributed as independent tasks in a HPC environment using MPI.
|
||||
In this example, 10 models will be distributed as independent tasks in an HPC environment using MPI.
|
||||
|
||||
The ``-mpi`` argument is passed to gprMax which takes the number of MPI tasks to run. This should be the number of models (worker tasks) plus one extra for the master task.
|
||||
|
||||
The ``NSLOTS`` variable which is required to set the total number of slots/cores for the parallel environment ``-pe mpi`` is usually the number of MPI tasks multiplied by the number of OpenMP threads per task. In this example the number of MPI tasks is 11 and number of OpenMP threads per task is 16, so 176 slots are required.
|
||||
The ``NSLOTS`` variable which is required to set the total number of slots/cores for the parallel environment ``-pe mpi`` is usually the number of MPI tasks multiplied by the number of OpenMP threads per task. In this example the number of MPI tasks is 11 and the number of OpenMP threads per task is 16, so 176 slots are required.
|
||||
|
||||
|
||||
Job array example
|
||||
|
@@ -268,4 +268,4 @@ The CFS values (which are internally specified) used for the default standard fi
|
||||
|
||||
* The parameters will be applied to all slabs of the PML that are switched on.
|
||||
* Using ``None`` for the maximum value of :math:`\sigma` forces gprMax to calculate it internally based on the relative permittivity and permeability of the underlying materials in the model.
|
||||
* ``forward`` direction implies minimum parameter value at the inner boundary of the PML and maximum parameter value at the edge of computational domain, ``reverse`` is the opposite.
|
||||
* ``forward`` direction implies a minimum parameter value at the inner boundary of the PML and maximum parameter value at the edge of the computational domain, ``reverse`` is the opposite.
|
||||
|
@@ -33,7 +33,7 @@ To describe the commands that can be used in the input file and their parameters
|
||||
|
||||
Unless otherwise specified, the SI system of units is used throughout gprMax:
|
||||
|
||||
* All parameters associated with simulated space (i.e. size of model, spatial increments, etc...) should be specified in **metres**.
|
||||
* All parameters associated with simulated space (i.e. size of the model, spatial increments, etc...) should be specified in **metres**.
|
||||
* All parameters associated with time (i.e. total simulation time, time instants, etc...) should be specified in **seconds**.
|
||||
* All parameters denoting frequency should be specified in **Hertz**.
|
||||
* All parameters associated with spatial coordinates in the model should be specified in **metres**. The origin of the coordinate system **(0,0)** is at the lower left corner of the model.
|
||||
@@ -164,7 +164,7 @@ Allows you to control how many OpenMP threads (usually the number of physical CP
|
||||
|
||||
#omp_threads: i1
|
||||
|
||||
where ``i1`` is the number of OpenMP threads to use. If ``#omp_threads`` is not specified gprMax will firstly look to see if the environment variable ``OMP_NUM_THREADS`` exists, and if not will detect and use all available physical CPU cores on the machine.
|
||||
where ``i1`` is the number of OpenMP threads to use. If ``#omp_threads`` is not specified gprMax will first look to see if the environment variable ``OMP_NUM_THREADS`` exists, and if not will detect and use all available physical CPU cores on the machine.
|
||||
|
||||
|
||||
.. _materials:
|
||||
@@ -198,7 +198,7 @@ For example ``#material: 3 0.01 1 0 my_sand`` creates a material called ``my_san
|
||||
#add_dispersion_debye:
|
||||
----------------------
|
||||
|
||||
Allows you to add dispersive properties to an already defined ``#material`` based on a multiple pole Debye formulation (see :ref:`capabilities` section). For example, the susceptability function for a single-pole Debye material is given by:
|
||||
Allows you to add dispersive properties to an already defined ``#material`` based on a multiple pole Debye formulation (see :ref:`capabilities` section). For example, the susceptibility function for a single-pole Debye material is given by:
|
||||
|
||||
.. math::
|
||||
|
||||
|
@@ -105,7 +105,7 @@ Within each individual ``tl`` group are the following datasets:
|
||||
Snapshots
|
||||
---------
|
||||
|
||||
Snapshot files contain a snapshot of the electromagnetic field values of a specified volume of the model domain at a specified point in time during the simulation. By default snapshot files use the open source `Visualization ToolKit (VTK) <http://www.vtk.org>`_ format which can be viewed in many free readers, such as `Paraview <http://www.paraview.org>`_. Paraview is an open-source, multi-platform data analysis and visualization application. It is available for Linux, macOS, and Windows. You can optionally output snapshot files using the HDF5 format if desired.
|
||||
Snapshot files contain a snapshot of the electromagnetic field values of a specified volume of the model domain at a specified point in time during the simulation. By default, snapshot files use the open source `Visualization ToolKit (VTK) <http://www.vtk.org>`_ format which can be viewed in many free readers, such as `Paraview <http://www.paraview.org>`_. Paraview is an open-source, multi-platform data analysis and visualization application. It is available for Linux, macOS, and Windows. You can optionally output snapshot files using the HDF5 format if desired.
|
||||
|
||||
.. tip::
|
||||
You can take advantage of our Python API to easily create a series of snapshots. For example, to create 30 snapshots starting at time 0.1ns until 3ns in intervals of 0.1ns, use the following code snippet in your input file. Replace ``x, y, z, dl, fn`` accordingly.
|
||||
@@ -147,7 +147,7 @@ The ``#geometry_view:`` command produces either ImageData (.vti) for a per-cell
|
||||
|
||||
Paraview toolbar showing ``gprMax`` macro button.
|
||||
|
||||
#. **Open the file** either from the File menu or toolbar.
|
||||
#. **Open the file** either from the File menu or the toolbar.
|
||||
#. Click the **Apply** button in the Properties panel. You should see an outline of the volume of the geometry view.
|
||||
#. Install the ``gprMax.py`` Python script, that comes with the gprMax source code (in the ``toolboxes/Utilities/Paraview`` directory), as a macro in Paraview. This script makes it quick and easy to view the different materials in a geometry file. To add the script as a macro in Paraview choose the file from the Macros->Add new macro menu. It will then appear as a shortcut button in the toolbar as shown in :numref:`pv_toolbar`. You only need to do this once, the macro will be kept in Paraview for future use.
|
||||
#. Click the ``gprMax`` shortcut button. All the materials in the model should appear in the Pipeline Browser as Threshold items as shown in :numref:`pv_pipeline`.
|
||||
|
@@ -15,7 +15,7 @@ References
|
||||
.. [GIA2012] Giannopoulos, A. (2012). Unsplit implementation of higher order PMLs. Antennas and Propagation, IEEE Transactions on, 60(3), 1479-1485. (http://dx.doi.org/10.1109/tap.2011.2180344)
|
||||
.. [HAR2021] Hartley, J., Giannopoulos, A., & Davidson, N. (2022). Switched Huygens Subgridding for the FDTD Method. IEEE Transactions on Antennas and Propagation, 70(8), 6872-6882. (http://dx.doi.org/10.1109/TAP.2022.3161371)
|
||||
.. [IRE2013] Ireland, D., & Abbosh, A. (2013). Modeling human head at microwave frequencies using optimized Debye models and FDTD method. Antennas and Propagation, IEEE Transactions on, 61(4), 2352-2355. (http://dx.doi.org/10.1109/tap.2013.2242037)
|
||||
.. [KEL2007] Kelley, D. F., Destan, T. J., & Luebbers, R. J. (2007). Debye function expansions of complex permittivity using a hybrid particle swarm-least squares optimization approach. IEEE Transactions on Antennas and propagation, 55(7), 1999-2005. (https://doi.org/10.1109/TAP.2007.900230)
|
||||
.. [KEL2007] Kelley, D. F., Destan, T. J., & Luebbers, R. J. (2007). Debye function expansions of complex permittivity using a hybrid particle swarm-least squares optimization approach. IEEE Transactions on Antennas and Propagation, 55(7), 1999-2005. (https://doi.org/10.1109/TAP.2007.900230)
|
||||
.. [KUN1993] Kunz, K. S., & Luebbers, R. J. (1993). The finite difference time domain method for electromagnetics. CRC press.
|
||||
.. [LI2013] Li, J., Guo, L. X., Jiao, Y. C., & Wang, R. (2013). Composite scattering of a plasma-coated target above dispersive sea surface by the ADE-FDTD method. Geoscience and Remote Sensing Letters, IEEE, 10(1), 4-8. (http://dx.doi.org/10.1109/lgrs.2012.2189751)
|
||||
.. [LUE1994] Luebbers, R., Steich, D., & Kunz, K. (1993). FDTD calculation of scattering from frequency-dependent materials. Antennas and Propagation, IEEE Transactions on, 41(9), 1249-1257. (http://dx.doi.org/10.1109/8.247751)
|
||||
|
在新工单中引用
屏蔽一个用户