Skip to content

An open-source C++ library for computing Green's functions for layered media

License

Notifications You must be signed in to change notification settings

modelics/strata

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Strata is a C++ library for computing the dyadic multilayer Green's function (MGF), intended for use in computational electromagnetics codes for solving Maxwell's equations in integral form. Strata can be used as a standalone library to compute the MGF as a function of frequency and/or spatial separation. It can also be incorporated easily into existing integral equation solvers.

Prerequisites

  • CMake, at least version 3.10.2

Installation

To install Strata, clone this repository and navigate to the root directory of the cloned repository in a terminal. Then run the following commands:

mkdir build
cd build
cmake ..
make

Important notes

  • An internet connection is required during the installation process, because some third-party libraries (OpenBLAS and yaml-cpp) will automatically be downloaded and installated locally in the directory external.
  • If you already have OpenBLAS installed on your machine, you could save some time by reusing it. In that case, instead of cmake .., run
    cmake -DWITH_OPENBLAS_INC=location/of/openblas/headers -DWITH_OPENBLAS_LIB=location/of/openblas/lib ..
    where location/of/openblas/headers is the path to the directory containing all OpenBLAS-related headers (e.g., cblas.h and lapacke.h), and location/of/openblas/lib is the path to the directory containing the OpenBLAS shared library, usually libopenblas.so.
  • On macOS, the cmake command requires an additional option:
    cmake -DCMAKE_INSTALL_RPATH_USE_LINK_PATH="ON" ..

Advanced users may want to consult this page for out-of-source builds.

To use Strata within your own application, include the directory inc, which contains all the headers, and link to build/libstrata.so while building your project.

Strata is designed for UNIX-based operating systems, and has been tested on

  • Ubuntu 20.04
  • Ubuntu 18.04
  • CentOS 7
  • macOS Catalina 10.15.6

Usage

Please consult the Strata documentation, doc/strata.html or doc/strata.pdf for usage instructions.

Note: the documentation is generated automatically during the build process.

Run your first test case

A set of example layer definition files and test cases is provided in the test directory. The most basic test case is in test/testMGF.cpp, which takes as input the layer definition file (see doc/strata.html or doc/strata.pdf for details) and a name for the output file. From within the build folder, run

./testMGF ../test/examples/ling_jin_2000/layers.yaml ../test/examples/ling_jin_2000/MGFdata.txt

This will compute the MGF for a simple example and store the reuslts in the file test/examples/ling_jin_2000/MGFdata.txt. Now, assuming you have Python 3 installed, you can plot the computed MGF:

cd ../test/examples/ling_jin_2000
python3 makeplots.py

You should see the following plot:

Results of testMGF.cpp

Features

The functionality of Strata can be divided into the computation of the MGF in (a) the spectral domain, and (b) the spatial domain.

a) Computation of the spectral-domain MGF

Strata can compute, in spectral domain:

  • Each component of the dyadic G(A), and the scalar term G(φ), as defined in formulation-C of [1]
  • Each unique component of the dyadics G(EM) and G(HJ), as defined in [2]

In addition, one can optionally extract the quasistatic terms as defined in [3].

b) Computation of the spatial-domain MGF

Strata allows computing the spatial domain MGF via the following methods:

  • Direct numerical integration of the Sommerfeld integrals, as described in [4]
  • The discrete complex image method (DCIM) [5]
  • Precomputation of interpolation tables constructed using either one of the above methods

In addition, one can optionally extract (in spectral domain) and add (in spatial domain) the quasistatic terms as defined in [3].

To easily incorporate into existing codes, one can also extract out the singular behaviour of the MGF, so that the singularities can be treated separately.

Strata is written with modularity and readability as a priority, to allow users to incorporate new formulations and extend the functionality in both spectral and spatial domains.

Citing Strata

We request that you acknowledge the authors of Strata by citing the following:

@INPROCEEDINGS{strata,
	author={S. {Sharma} and P. {Triverio}},
	booktitle={2021 {IEEE} International Symposium on Antennas and Propagation and {USNC-URSI} Radio Science Meeting},
	title={Strata: An Open-Source {C++} Library for Computing {Green's} Functions for Layered Media},
	year={2021},
	month={Dec.},
	address = {Singapore}}

Issues and Improvements

We encourage users to report problems and suggest improvements by opening issues within the GitHub environment.

We also encourage users to help in our goal of providing a high-quality library for layered medium Green's functions by contributing features and new formulations.

Known Pitfalls

  • This library was originally developed for chip-level structures where conductors are embedded in dielectric layers, as opposed to printed circuit-like structures, where the metal is placed at the top of a substrate. I.e., there cannot be source or observation points in the upper half-space - all points must lie inside a layer. To model printed circuit structures, create a phantom air layer above the substrate, and place the structure within it. Note that no two layers are allowed to have identical material properties - typically, if this happens, the layers are automatically merged into a single layer. However, if both the phantom layer and the upper half space are supposed to be air, you must make the relative permittivity of the phantom layer slightly different from that of air (e.g., 1.001) to avoid numerical issues.

  • Again, because the upper half-space is not considered a layer, our indexing scheme is offset from the scheme in [1]. In [1], the indexing starts from the upper half-space, which has index 0. In Strata, the first layer has index 0, not the upper half-space.

  • These comments also apply to the lower half-space.

Related Projects

This is a list of related open-source projects by other authors - please let us know if some projects were missed.

  • A Matlab and Fortran library for computing the MGF for the case of two half spaces can be found here.

References

[1] K. A. Michalski and D. Zheng, "Electromagnetic scattering and radiation by surfaces of arbitrary shape in layered media. I. theory," IEEE Trans. Antennas Propag., vol. 38, no. 3, pp. 335–344, Mar. 1990.

[2] K. A. Michalski and J. R. Mosig, "Multilayered media Green's functions in integral equation formulations," IEEE Trans. Antennas Propag., vol. 45, no. 3, pp. 508–519, Mar. 1997.

[3] E. Simsek, Q. H. Liu, and B. Wei, "Singularity Subtraction for Evaluation of Green's Functions for Multilayer Media," IEEE Trans. Microw. Theory Tech., vol. 54, pp. 216–225, Jan 2006.

[4] K. A. Michalski and J. R. Mosig, "Efficient computation of Sommerfeld integral tails - methods and algorithms," J. Electromagn. Waves Appl., vol. 30, no. 3, pp. 281–317, 2016.

[5] M. I. Aksun, "A Robust Approach for the derivation of closed-form Green's functions," IEEE Trans. Microw. Theory Tech., vol. 44, pp. 651–658, May 1996.

Contributors

Strata was developed as part of a PhD project at the Modelics Lab, University of Toronto, Canada.

  • Shashwat Sharma (Architect & Developer)
  • Piero Triverio (Principal Investigator)