"PEC" : Top-level object for configuring perfect electric conductor (PEC) boundary conditions (zero tangential electric field).
"PMC" : Top-level object for configuring perfect magnetic conductor (PMC) boundary conditions (zero tangential magnetic field). Also imposes symmetry of the electric field across the boundary surface.
"Impedance" : Array of objects for configuring surface impedance boundary conditions. A surface impedance boundary relates the tangential electric and magnetic fields on the boundary using a user specified surface impedance.
"Absorbing" : Top-level object for configuring absorbing boundary conditions. These are artificial scattering boundary conditions at farfield boundaries.
"Conductivity" : Array of objects for configuring finite conductivity surface impedance boundary conditions. Finite conductivity boundaries are only available for the frequency domain driven simulation type.
"LumpedPort" : Array of objects for configuring lumped port boundary conditions. Lumped ports can be specified on boundaries which are internal to the computational domain.
"WavePort" : Array of objects for configuring numeric wave port boundary conditions. Wave ports can only be specified on boundaries which are on the true boundary of the computational domain. Addiitionally, wave port boundaries are only available for the frequency domain driven simulation type.
"WavePortPEC" : Top-level object for configuring PEC boundary conditions for boundary mode analysis performed on the wave port boundaries. Thus, this object is only relevant when wave port boundaries are specified under config["Boundaries"]["WavePort"].
"SurfaceCurrent" : Array of objects for configuring surface current boundary conditions. This boundary prescribes a unit source surface current excitation on the given boundary in order to excite a frequency or time domain driven simulation or magnetostatic simulation. For the magnetostatic simulation type, entries of the inductance matrix are extracted corresponding to each surface current boundary.
"Ground" : Top-level object for specifying ground, or zero voltage, boundary conditions for for electrostatic simulations.
"ZeroCharge" : Top-level object for specifying zero charge boundary conditions for for electrostatic simulations. Also imposes symmetry of the electric field across the boundary surface.
"Terminal" : Array of objects for configuring terminal boundary conditions for electrostatic simulations. Entries of the capacitance matrix are extracted corresponding to each terminal boundary.
"Postprocessing" : Top-level object for configuring boundary postprocessing.
"Capacitance" : Array of objects for postprocessing surface capacitance by the ratio of the integral of the induced surface charge on the boundary and the excitation voltage.
"Inductance" : Array of objects for postprocessing surface inductance by the ratio of the integral of the magnetic flux through the boundary and the excitation current.
"Dielectric" : Array of objects for postprocessing surface interface dielectric loss.
"Attributes" [None] : Integer array of mesh boundary attributes at which to apply farfield absorbing boundary conditions.
"Order" [1] : Specify a first- or second-order approximation for the farfield absorbing boundary condition. Second-order absorbing boundary conditions are only available for the frequency domain driven simulation type.
"Attributes" [None] : Integer array of mesh boundary attributes for this finite conductivity boundary.
"Conductivity" [None] : Electrical conductivity for this finite conductivity boundary, S/m.
"Permeability" [1.0] : Relative permeability for this finite conductivity boundary.
"Thickness" [None] : Optional conductor thickness for this finite conductivity boundary specified in mesh length units. Activates a finite conductivity boundary condition which accounts for nonzero metal thickness.
"Index" [None] : Index of this lumped port, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this lumped port boundary. If this port is to be a multielement lumped port with more than a single lumped element, use the "Elements" array described below.
"Direction" [None] : Direction to define the polarization direction of the port field mode on this lumped port boundary. Lumped ports must be axis-aligned unless the port is a coaxial port. The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z", "+R", "-R" ("R" is for a coaxial lumped port). If this port is to be a multielement lumped port with more than a single lumped element, use the "Elements" array described below.
"Excitation" [false] : Turns on or off port excitation for this lumped port boundary for driven or transient simulation types.
"R" [0.0] : Circuit resistance used for computing this lumped port boundary's impedance, $\Omega$. This option should only be used along with the corresponding "L" and "C" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"L" [0.0] : Circuit inductance used for computing this lumped port boundary's impedance, H. This option should only be used along with the corresponding "R" and "C" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"C" [0.0] : Circuit capacitance used for computing this lumped port boundary's impedance, F. This option should only be used along with the corresponding "R" and "L" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"Rs" [0.0] : Surface resistance used for computing this lumped port boundary's impedance, $\Omega$/sq. This option should only be used along with the corresponding "Ls" and "Cs" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Ls" [0.0] : Surface inductance used for computing this lumped port boundary's impedance, H/sq. This option should only be used along with the corresponding "Rs" and "Cs" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Cs" [0.0] : Surface capacitance used for computing this lumped port boundary's impedance, F/sq. This option should only be used along with the corresponding "Rs" and "Ls" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Elements"[]["Attributes"] [None] : This option is for multielement lumped ports and should not be combined with the "Attributes" field described above. Each element of a multielement lumped port can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement port add in parallel.
"Elements"[]["Direction"] [None] : This option is for multielement lumped ports and should not be combined with the "Direction" field described above. Each element of a multielement lumped port can be described by its own unique direction, which is specified here. The elements of a multielement port add in parallel.
"Attributes" [None] : Integer array of mesh boundary attributes to consider along with those specified under config["Boundaries"]["PEC"]["Attributes"] as PEC when performing wave port boundary mode analysis.
"Index" [None] : Index of this surface current boundary, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this surface current boundary. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the "Elements" array described below.
"Direction" [None] : Defines the source current direction for this surface current boundary. The available options are the same as under config["Boundaries"]["LumpedPort"]["Direction"]. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the "Elements" array described below.
"Elements"[]["Attributes"] [None] : This option is for multielement surface current boundaries should not be combined with the "Attributes" field described above. Each element of a multielement current source can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.
"Elements"[]["Direction"] [None] : This option is for multielement surface current boundaires and should not be combined with the "Direction" field described above. Each element of a multielement current source can be described by its own unique direction, which is specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.
"Index" [None] : Index of this inductance postprocessing boundary, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this inductance postprocessing boundary.
"Direction" [None] : Defines the global direction with which to orient the surface normals with computing the magnetic flux for this inductance postprocessing boundary. The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z".
"Index" [None] : Index of this lossy dielectric interface, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this lossy dielectric interface. If the interface consists of multiple elements with different "Side" values, use the "Elements" array described below.
"Side" [None] : Defines the postprocessing side when this dielectric interface is an internal boundary surface (and thus the electric field on the boundary is in general double-valued). The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z". If the boundary is not axis-aligned, the field value is taken from the side which is oriented along the specified direction. If no "Side" is specified, the field solution is taken from the neighboring element with the smaller electrical permittivity, which is an attempt to get the field in the domain corresponding to vacuum. If the interface consists of multiple elements with different "Side" values, use the "Elements" array described below.
"Thickness" [None] : Thickness of this dielectric interface, specified in mesh length units.
"Permittivity" [None] : Relative permittivity for this dielectric interface. Leads to the general quality factor calculation without assuming the interface is a specific metal-air (MA), metal-substrate (MS), or substrate-air (SA) interface. None of "PermittivityMA", "PermittivityMS", or "PermittivitySA" should be specified when this value is given.
"PermittivityMA" [None] : Relative permittivity for this dielectric interface assuming it is a metal-air (MA) interface. None of "PermittivityMS", "PermittivitySA", or the general "Permittivity" should be specified when this value is given.
"PermittivityMS" [None] : Relative permittivity for this dielectric interface assuming it is a metal-substrate (MS) interface. None of "PermittivityMA", "PermittivitySA", or the general "Permittivity" should be specified when this value is given.
"PermittivitySA" [None] : Relative permittivity for this dielectric interface assuming it is a substrate-air (SA) interface. None of "PermittivityMA", "PermittivityMS", or the general "Permittivity" should be specified when this value is given.
"LossTan" [0.0] : Loss tangent for this lossy dielectric interface.
"Elements"[]."Attributes" [None] : This option should not be combined with the "Attributes" field described above. In the case where a single dielectric interface is made up of contributions with their own unique integer arrays of mesh boundary attributes, they can be specified here.
"Elements"[]."Side" [None] : This option should not be combined with the "Side" field described above. In the case where a single dielectric interface is made up of contributions with their own entry for side, they can be specified here.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
A configuration file written in the JSON format is used specify the runtime options for a Palace simulation. The following sections give a detailed overview of the file format and available settings.
Parameters are specified in the form of keyword/value pairs where the key is a string and the value may be a string, boolean, integer or floating point number, or array. Parameters are grouped into a hierarchy of objects. We support relaxed JSON formatting with C++-style comments (//, /* */). Integer arrays can be specified as comma-separated lists of integers or integer ranges, for example [1,3-5,6] is parsed as [1,3,4,5,6].
In the following sections, default values for the parameters are specified alongside the description of each keyword in square brackets. Keywords for which there is no default value listed ([None]) are required in general if specifying values for other keywords under the same top-level object.
The top-level JSON object of the configuration file has the following structure:
"Materials":
+[
+ // Material 1
+ {
+ "Attributes": [<int array>],
+ "Permeability": <float or float array>,
+ "Permittivity": <float or float array>,
+ "LossTan": <float or float array>,
+ "Conductivity": <float or float array>,
+ "LondonDepth": <float>,
+ "MaterialAxes": <array of float array>
+ },
+ // Material 2, 3, ...
+ ...
+]
with
"Attributes" [None] : Integer array of mesh domain attributes for this material.
"Permeability" [1.0] : Relative permeability for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"Permittivity" [1.0] : Relative permittivity for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"LossTan" [0.0] : Loss tangent for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"Conductivity" [0.0] : Electrical conductivity for this material, S/m. Activates Ohmic loss model in the material domain. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"LondonDepth" [0.0] : London penetration depth for this material, specified in mesh length units. Activates London equations-based model relating superconducting current and electromagnetic fields in the material domain.
"MaterialAxes" [[1.0,0.0,0.0], [0.0,1.0,0.0], [0.0,0.0,1.0]] : Axes directions for specification of anisotropic material properties. Required to be unit length and orthogonal.
"Mesh" [None] : Input mesh file path, an absolute path is recommended.
"L0" [1.0e-6] : Mesh vertex coordinate length unit, m.
"Lc" [0.0] : Characteristic length scale used for nondimensionalization, specified in mesh length units. A value less than or equal to zero uses an internally calculated length scale based on the bounding box of the computational domain.
"Refinement" : Top-level object for configuring mesh refinement.
"UniformLevels" [0] : Levels of uniform parallel mesh refinement to be performed on the input mesh.
"Boxes" : Array of box region refinement objects. All elements with a node inside the box region will be marked for refinement.
"Spheres" : Array of sphere region refinement objects. All elements with a node inside the sphere region will be marked for refinement.
"Levels" [0] : Levels of parallel mesh refinement inside the specified refinement region.
"XLimits" [None] : Floating point array of length 2 specifying the limits in the $x$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"YLimits" [None] : Floating point array of length 2 specifying the limits in the $y$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"ZLimits" [None] : Floating point array of length 2 specifying the limits in the $z$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"Center" [None] : Floating point array of length equal to the model spatial dimension specfiying the center coordinates of the sphere for this sphere refinement region. Specified in mesh length units.
"Radius" [None] : The radius of the sphere for this sphere refinement region, specified in mesh length units.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
"Order" [1] : Finite element order (degree). Arbitrary high-order spaces are supported.
"Eigenmode" : Top-level object for configuring the eigenvalue solver for the eigenmode simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Eigenmode".
"Driven" : Top-level object for configuring the frequency domain driven simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Driven".
"Transient" : Top-level object for configuring the time domain driven simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Transient".
"Electrostatic" : Top-level object for configuring the electrostatic simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Electrostatic".
"Magnetostatic" : Top-level object for configuring the magnetostatic simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Magnetostatic".
"Linear" : Top-level object for configuring the linear solver employed by all simulation types.
"Target" [None] : (Nonzero) frequency target above which to search for eigenvalues, GHz.
"Tol" [1.0e-6] : Relative convergence tolerance for the eigenvalue solver.
"MaxIts" [0] : Maximum number of iterations for the iterative eigenvalue solver. A value less than 1 uses the solver default.
"MaxSize" [0] : Maximum subspace dimension for eigenvalue solver. A value less than 1 uses the solver default.
"N" [1] : Number of eigenvalues to compute.
"Save" [0] : Number of computed field modes to save to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Type" ["Default"] : Specifies the eigenvalue solver to be used in computing the given number of eigenmodes of the problem. The available options are:
"SLEPc"
"ARPACK"
"FEAST"
"Default" : Use the default eigensolver. Currently, this is the Krylov-Schur eigenvalue solver from "SLEPc".
"ContourTargetUpper" [None] : Specifies the upper frequency target of the contour used for the FEAST eigenvalue solver, GHz. This option is relevant only for "Type": "FEAST".
"ContourAspectRatio" [None] : Specifies the aspect ratio of the contour used for the FEAST eigenvalue solver. This should be greater than zero, where the aspect ratio is the ratio of the contour width to the frequency range("ContourTargetUpper" - "Target"). This option is relevant only for "Type": "FEAST".
"ContourNPoints" [4] : Number of contour integration points used for the FEAST eigenvalue solver. This option is relevant only for "Type": "FEAST".
"MinFreq" [None] : Lower bound of frequency sweep interval, GHz.
"MaxFreq" [None] : Upper bound of frequency sweep interval, GHz.
"FreqStep" [None] : Frequency step size for frequency sweep, GHz.
"SaveStep" [0] : Controls how often, in number of frequency steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"SaveOnlyPorts" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.
"AdaptiveTol" [0.0] : Relative error convergence tolerance for adaptive frequency sweep. If zero, adaptive frequency sweep is disabled and the full-order model is solved at each frequency step in the specified interval. If positive, this tolerance is used to ensure the reliability of the reduced-order model relative to the full-order one in the frequency band of interest.
"AdaptiveMaxSamples" [10] : Maximum number of frequency samples used to construct the reduced-order model for adaptive fast frequency sweep, if the specified tolerance ("AdaptiveTol") is not met first.
"AdaptiveMaxCandidates" [NumFreq/5] : Maximum number of frequency samples to consider as candidates for computing the reduced-order model error when adaptively sampling new points in order to construct the reduced-order for adaptive fast frequency sweep. The default is less than the requested number of frequency points in the sweep.
"Restart" [1] : Iteration (1-based) from which to restart for a partial frequency sweep simulation. That is, the initial frequency will be computed as "MinFreq" + ("Restart" - 1) * "FreqStep".
"Type" ["Default"] : Specifies the time integration scheme used for the discretization of the second-order system of differential equations. The available options are:
"GeneralizedAlpha" : The second-order implicit generalized-$\alpha$ method with $\rho_\inf = 1.0$. This scheme is unconditionally stable.
"NewmarkBeta" : The second-order implicit Newmark-$\beta$ method with $\beta = 1/4$ and $\gamma = 1/2$. This scheme is unconditionally stable.
"CentralDifference" : The second-order explicit central difference method, obtained by setting $\beta = 0$ and $\gamma = 1/2$ in the Newmark-$\beta$ method. In this case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step.
"Default" : Use the default "GeneralizedAlpha" time integration scheme.
"Excitation" [None] : Controls the time dependence of the source excitation. The available options are:
"Sinusoidal" : A sinusoidal excitation at a user specified frequency.
"Gaussian" : A Gaussian pulse with a user specified width which defines the bandwidth.
"DifferentiatedGaussian" : A differentiated Gaussian pulse with a user specified width which defines the bandwidth.
"ModulatedGaussian" : A modulated Gaussian pulse at a user specified center frequency and width used to excite the system without any DC component.
"Ramp" : A differentiable unit step function to model the ramp up to a DC signal.
"SmoothStep" : A smoother many-times differentiable unit step function to model the ramp up to a DC signal over a specified width of time.
"ExcitationFreq" [None] : Center frequency used for harmonic source excitations, GHz. Only relevant when "Excitation" is one of "Sinusoidal", "Gaussian", "DifferentiatedGaussian", or "ModulatedGaussian".
"ExcitationWidth" [None] : Pulse width for Gaussian-type source excitations, ns. Only relevant when "Excitation" is one of "Gaussian", "DifferentiatedGaussian", "ModulatedGaussian", or "SmoothStep".
"MaxTime" [None] : End of simulation time interval, ns. Transient simulations always start from rest at $t = 0.0$.
"TimeStep" [None] : Uniform time step size for time integration, ns.
"SaveStep" [0] : Controls how often, in number of time steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"SaveOnlyPorts" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.
"Save" [0] : Number of computed electric field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed capacitance matrix. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Save" [0] : Number of computed magnetic field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed inductance matrix. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Type" ["Default"] : Specifies the solver used for preconditioning the linear system of equations to be solved for each simulation type. The available options are:
"SuperLU" : The SuperLU_DIST sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with SuperLU_DIST support.
"STRUMPACK" : The STRUMPACK sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with STRUMPACK support.
"MUMPS" : The MUMPS sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with MUMPS support.
"BoomerAMG" : The BoomerAMG algebraic multigrid solver from Hypre.
"Default" : Use the default "AMS" solver for simulation types involving definite or semi-definite curl-curl operators (time domain problems as well as magnetostatics). For frequency domain problems, use a sparse direct solver if available, otherwise uses "AMS". For electrostatic problems, uses "BoomerAMG".
"KSPType" ["Default"] : Specifies the iterative Krylov subspace solver type for solving linear systems of equations arising for each simulation type. The available options are:
"CG"
"GMRES"
"FGMRES"
"Default" : Use the default "GMRES" Krylov subspace solver for frequency domain problems, that is when config["Problem"]["Type"] is "Eigenmode" or "Driven". For the other simulation types, the linear system matrix is always real and symmetric positive definite (SPD) and the preconditioned conjugate gradient method ("CG") is used as the Krylov solver.
"Tol" [1.0e-6] : Relative (preconditioned) residual convergence tolerance for the iterative linear solver.
"MaxIts" [100] : Maximum number of iterations for the iterative linear solver.
"MaxSize" [0] : Maximum Krylov space size for the GMRES and FGMRES solvers. A value less than 1 defaults to the value specified by "MaxIts".
"UseGMG" [true] : Enable or not geometric multigrid solver which uses h- and p-multigrid coarsening as available to construct the multigrid hierarchy. The solver specified by "Type" is used on the coarsest level. A Hiptmair smoother is applied to all other levels.
"UsePCShifted" [false] : When set to true, constructs the preconditioner for frequency domain problems using a real SPD approximation of the system matrix, which can help performance at high frequencies (relative to the lowest nonzero eigenfrequencies of the model).
"MGCycleIts" [1] : Number of V-cycle iterations per preconditioner application for multigrid preconditioners (when "UseGMG" is true or "Type" is "AMS" or "BoomerAMG").
"MGSmoothIts" [1] : Number of pre- and post-smooth iterations used for multigrid preconditioners (when "UseGMG" is true or "Type" is "AMS" or "BoomerAMG").
"MGSmoothOrder" [3] : Order of polynomial smoothing for geometric multigrid preconditioning (when "UseGMG" is true).
Automated source code formatting is performed using clang-format. Run:
./scripts/format_source
in the repository root directory to automatically use clang-format to format C++ source as well as JuliaFormatter.jl for Julia and Markdown files. The script can be viewed in the repository.
The following conventions also apply:
PascalCase for classes and function names.
Follow 'include what you use' (IWYU), with the include order dictated by the Google C++ Style Guide. This order should be automatically enforced by the clang-formatstyle file.
Code comments should be full sentences, with punctuation. At this time, no Doxygen API reference is generated and so comments generally do not need to conform to Doxygen syntax.
During the cmake configuration step, definining the variables ANALYZE_SOURCES_CLANG_TIDY and ANALYZE_SOURCES_CPPCHECK to ON will turn on static analysis using clang-tidy and cppcheck, respectively, during the build step. This requires the executables to be installed and findable by CMake on your system.
A JSON format configuration file, for example named config.json, can be validated against the provided Schema using:
./scripts/validate_config config.json
This script uses Julia's JSONSchema.jl and the Schema provided in scripts/schema/ to parse the configuration file and check that the fields are correctly specified. This script and the associated Schema are also installed and can be accessed in <INSTALL_DIR>/bin.
The files for this example can be found in the examples/cavity/ directory of the Palace source code.
This example demonstrates Palace's eigenmode simulation type to solve for the lowest frequency modes of a cylindrical cavity resonator. In particular, we consider a cylindrical cavity filled with Teflon ($\varepsilon_r = 2.08$, $\tan\delta = 4\times 10^{-4}$), with radius $a = 2.74\text{ cm}$ and height $d = 2a$. From [1], the frequencies of the $\text{TE}_{nml}$ and $\text{TM}_{nml}$ modes are given by
where $p_{nm}$ and $p'_{nm}$ denote the $m$-th root ($m\geq 1$) of the $n$-th order Bessel function ($n\geq 0$) of the first kind, $J_n$, and its derivative, $J'_n$, respectively.
In addition, we have analytic expressions for the unloaded quality factors due to dielectric loss, $Q_d$, and imperfectly conducting walls, $Q_c$. In particular,
field is set to "Eigenmode", and we use the mesh shown above with a single level of uniform mesh refinement ("UniformLevels": 1). The material properties for Teflon are entered under config["Domains"]["Materials"]. The config["Domains"]["Postprocessing"]["Dielectric]" object is used to extract the quality factor due to bulk dielectric loss; in this problem since there is only one domain this is trivial, but in problems with multiple material domains this feature can be used to isolate the energy-participation ratio (EPR) and associated quality factor due to different domains in the model.
The only difference between the two configuration files is in the "Boundaries" object: cavity_pec.json prescribes a perfect electric conductor ("PEC") boundary condition to the cavity boundary surfaces, while cavity_impedance.json prescribes a surface impedance condition with the surface resistance $R_s = 0.0184\text{ }\Omega\text{/sq}$, for copper at $5\text{ GHz}$.
In both cases, we configure the eigenvalue solver to solve for the $15$ lowest frequency modes above $2.0\text{ GHz}$ (the dominant mode frequencies for both the $\text{TE}$ and $\text{TM}$ cases fall around $2.9\text{ GHz}$ frequency for this problem). A sparse direct solver is used for the solutions of the linear system resulting from the spatial discretization of the governing equations, using in this case a second- order finite element space.
The frequencies for the lowest order $\text{TE}$ and $\text{TM}$ modes computed using the above formula for this problem are listed in the table below.
$(n,m,l)$
$f_{\text{TE}}$
$f_{\text{TM}}$
$(0,1,0)$
––
$2.903605\text{ GHz}$
$(1,1,0)$
––
$4.626474\text{ GHz}$
$(2,1,0)$
––
$6.200829\text{ GHz}$
$(0,1,1)$
$5.000140\text{ GHz}$
$3.468149\text{ GHz}$
$(1,1,1)$
$2.922212\text{ GHz}$
$5.000140\text{ GHz}$
$(2,1,1)$
$4.146842\text{ GHz}$
$6.484398\text{ GHz}$
$(0,1,2)$
$5.982709\text{ GHz}$
$4.776973\text{ GHz}$
$(1,1,2)$
$4.396673\text{ GHz}$
$5.982709\text{ GHz}$
$(2,1,2)$
$5.290341\text{ GHz}$
$7.269033\text{ GHz}$
First, we examine the output of the cavity_pec.json simulation. The file postpro/pec/eig.csv contains information about the computed eigenfrequencies and associated quality factors:
Indeed we can find a correspondence between the analytic modes predicted and the solutions obtained by Palace. Since the only source of loss in the simulation is the nonzero dielectric loss tangent, we have $Q = Q_d = 1/0.0004 = 2.50\times 10^3$ in all cases.
Next, we run cavity_impedance.json, which adds the surface impedance boundary condition. Examining postpro/impedance/eig.csv we see that the mode frequencies are roughly unchanged but the quality factors have fallen due to the addition of imperfectly conducting walls to the model:
However, the bulk dielectric loss postprocessing results, written to postpro/impedance/domain-Q.csv, still give $Q_d = 2.50\times 10^3$ for every mode as expected.
Focusing on the $\text{TE}_{011}$ mode with $f_{\text{TE},010} = 5.00\text{ GHz}$, we can read the mode quality factor $Q = 2.30\times 10^3$. Subtracting out the contribution of dielectric losses, we have
The effect of mesh size can be investigated for the cylindrical cavity resonator using convergence_study.jl. For a polynomial order of solution and refinement level, a mesh is generated using Gmsh using polynomials of the same order to resolve the boundary geometry. The eigenvalue problem is then solved for $f_{\text{TM},010}$ and $f_{\text{TE},111}$, and the relative error, $\frac{f-f_{\text{true}}}{f_{\text{true}}}$, of each mode plotted against $\text{DOF}^{-\frac{1}{3}}$, a notional mesh size. Three different element types are considered: tetrahedra, prisms and hexahedra, and the results are plotted below. The $x$-axis is a notional measure of the overall cost of the solve, accounting for polynomial order.
+
+
+
+
+
+
The observed rate of convergence for the eigenvalues are $p+1$ for odd polynomials and $p+2$ for even polynomials. Given the eigenmodes are analytic functions, the theoretical maximum convergence rate is $2p$[2]. The figures demonstrate that increasing the polynomial order of the solution will give reduced error, however the effect may only become significant on sufficiently refined meshes.
[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012. [2] A. Buffa, P. Houston, I. Perugia, Discontinuous Galerkin computation of the Maxwell eigenvalues on simplicial meshes, Journal of Computational and Applied Mathematics 204 (2007) 317-333.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
diff --git a/dev/examples/coaxial/index.html b/dev/examples/coaxial/index.html
new file mode 100644
index 000000000..f7677bc07
--- /dev/null
+++ b/dev/examples/coaxial/index.html
@@ -0,0 +1,9 @@
+
+Signal Propagation in a Coaxial Cable · Palace
The files for this example can be found in the examples/coaxial/ directory of the Palace source code.
Palace can perform transient electromagnetic modeling, acting as a so-called finite element time domain (FETD) solver. To demonstrate this feature, we consider here the propagation of an electromagnetic pulse through a section of coaxial cable. The model is constructed based on a $50\text{ }\Omega$ RG-401/U coaxial cable [1], with outer and inner conductor diameters of $0.215\text{ in}$ and $0.0645\text{ in}$, respectively. The section length is roughly $1.5\text{ in}$. The Teflon dielectric material has $\varepsilon_r = 2.08$, and we consider $\tan\delta = 4\times 10^{-2}$, a factor of $100$ above the actual value in order to exaggerate losses in the transmission line.
In this example we consider three different configurations of the model, all with a coaxial lumped port excitation at one end of the line: an open termination at the opposite end (coaxial_open.json), a shorted termination(coaxial_short.json), and a matched $50\text{ }\Omega$ lumped port termination (coaxial_matched.json).
The mesh is generated using the Julia code in mesh/mesh.jl and consists of quadratically-curved hexahedral elements, as depicted below. Third-order shape functions are used to approximate the solution.
+
+
Each configuration file sets the simulation "Type" to "Transient". The different termination configurations are specified by using a "LumpedPort" with matched impedance for the matched termination, a "PEC" boundary for the shorted termination, leaving no boundary condition specified for the open termination. This last case applies the natural boundary condition for the finite element formulation which is a perfect magnetic conductor boundary condition, enforcing zero tangential magnetic field and thus zero surface current density.
The excitation pulse is configured under config["Solver"]["Transient"]. Here, we use a modulated Gaussian pulse shape, with time dependence given by the expression
For this simulation, we use a center frequency $f = \omega/2\pi = 10\text{ GHz}$ and pulse width $\tau = 0.05\text{ ns}$. The offset $t_0$ is automatically chosen by Palace in order to smoothly ramp up the excitation from the rest initial condition. Time integration uses the second-order implicit Generalized-$\alpha$ scheme with a uniform time step $\Delta t = 5\times 10^{-3}\text{ ns}$, and the solution is computed for the interval $t\in[0.0,1.0]\text{ ns}$. The electric and magnetic field solutions are sampled every $10$ time steps for visualization.
Below, we plot the time histories of the port voltage at the excited coaxial lumped port for the three simulation cases.
+
+
We can observe that as expected, the matched termination absorbs the incident waveform nearly perfectly, while it is reflected with the same polarity for the shorted termination and opposite polarity for the open termination (phase shifted by $\pi$). Furthermore, the reflected wave is noticably attenuated due to the material loss of the transmission line dielectric.
Lastly, an animation of the signal propagation for the matched (left) and shorted (right) simulations, constructed using the saved fields, is shown below.
The files for this example can be found in the examples/cpw/ directory of the Palace source code.
In this example, we construct a frequency domain model to analyze the wave transmission, reflection, near-end crosstalk, and far-end crosstalk for a four-port system comprised of two side-by-side coplanar waveguides (CPW). Each CPW is characterized by a trace width $w = 30\text{ μm}$ and gap width $s = 18\text{ μm}$. The metal is modeled as an infinitely thin, perfectly conducting boundary surface on top of a sapphire dielectric substrate (parallel to C-axis: $\varepsilon_r = 11.5$, $\tan\delta = 8.6\times 10^{-5}$, perpendicular to C-axis: $\varepsilon_r = 9.3$, $\tan\delta = 3.0\times 10^{-5}$) of $500\text{ μm}$ thickness with the C-axis in the z-direction. This yields a characteristic impedance $Z_0 = 56.02\text{ }\Omega$ for each of the lines [1]. The center-to-center separating distance between the transmission lines on the substrate is $266\text{ μm}$, which means there is exactly $200\text{ μm}$ of ground plane between them.
A visualization of the computational domain is shown below.
+
+
There are two different options for modeling the termination at the ends of the CPW:
Lumped port: A multielement uniform lumped port can be used to terminate the CPW by connecting the center conductor to the ground plane on each side with impedance $Z = 2Z_0$.
Wave port: We can solve a 2D boundary eigenvalue problem for the mode shape and propagation constants for the characteristic CPW mode, and use this to terminate the transmission line.
Views of the mesh boundaries for these two configurations are shown below. In both cases the computational domain is discretized using an unstructured tetrahedral mesh. The mesh files are mesh/cpw_wave.msh and mesh/cpw_lumped.msh, respectively.
+
+
+
Likewise, there are two different options for how the system response is calculated over the desired frequency band:
Uniform: Sample the frequency band with the full-fidelity model at equally spaced frequencies over the desired range.
Adaptive: Use the full-fidelity model to sample the solution at a few adaptively selected frequency points in the desired band, and then construct a low-cost surrogate model which is used to compute the response over the entire band.
The frequency response is computed for the band $f\in[2.0,30.0]\text{ GHz}$. For the uniform sweep, a step size of $\Delta f=2.0\text{ GHz}$ is used, while the adaptive sweep employs a much finer step size $\Delta f=0.1\text{ GHz}$. The adaptive fast frequency sweep algorithm is given a tolerance of $1\times10^{-3}$ for choosing the sampling points; the simulation with uniform ports uses $9$ frequency samples and that with wave ports uses $10$. Despite the much finer frequency resolution, the adaptive frequency sweep simulations take roughly the same amount of time as the uniform ones where the resulting resolution is worse by a factor of $20$. Lastly, for all simulations, a single level of uniform mesh refinement is applied to the initial mesh and a first-order finite element approximation for the solution is used.
The results from the four different simulations are presented in the plots below.
+
+
+
+
+
The first remark is that in both the lumped port and wave port cases, the adaptive fast frequency sweep results are very close to the true solutions sampled by the uniform sweeps.
Second, there is a discrepancy between the results using lumped ports and those with wave ports, namely the lumped port excitation exhibits much higher reflection that that for wave ports. This can be attributed to the coarse meshes used for these examples. Indeed, refining the mesh or increasing the order of the solution approximation resolves this issue and leads to better agreement between the lumped port and wave port results. See below for the results with again a single level of mesh refinement but $p = 2$ for the order of the solution space.
Some examples of using Palace, including configuration and mesh files, can be found in the examples/ directory of the source code. The following sections provide complete tutorials for each of the available example applications.
These examples are also used by Palace's regression testing suite. See the test/ directory for more details.
The files for this example can be found in the examples/rings/ directory of the Palace source code.
This example seeks to compute the inductance matrix for a system of two concentric current-carrying rings of radii $r_a$ and $r_b$, each with width $w$. As for the previous example, the permeability of the surrounding medium is assumed to be the permeability of free space. The mutual inductance, $M_{ab}$, can be easily computed for the case where $r_a\ll r_b$ and $w = 0$ using the Biot-Savart law as
\[M_{ab} = \frac{\mu_0\pi r_b^2}{2 r_a} \,.\]
Analytic expressions for the self inductance of this configuration can also be derived, for example from [1] we have
We take in this case $r_a = 10 \text{ μm}$, $r_b = 100 \text{ μm}$, and $w = 1 \text{ μm}$. The mesh.jl script in the mesh/ directory is used to generate an unstructured tetrahedral mesh with Gmsh, saved to mesh/rings.msh, and a depiction is shown below.
+
+
The configuration file for the Palace simulation is rings.json. The simulation "Type" is "Magnetostatic", and we add "SurfaceCurrent" boundaries for applying a surface current to drive the inner or outer ring. The rest of the ring boundaries are labeled as "PEC" boundaries, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The farfield is also prescribed the "PEC" boundary condition. We seek a second-order solution and use the geometric multigrid AMS solver.
The computed inductance matrix is saved to disk as postpro/terminal-M.csv, and below we show its contents:
for the self inductances. Thus, the Palace solution has approximately $0.78\%$ error in the mutual inductance $1.9\%$ and $0.78\%$ errors in the self inductances versus the analytic solutions.
The typical approach used by Palace for lumped parameter extraction uses the computed field energies, but one can also compute the inductance by explicitly integrating the magnetic flux through a surface and dividing by the excitation current. This is configured under config["Boundaries"]["Postprocessing"]["Inductance"] in the configuration file. The resulting postprocessed values are written to postpro/surface-M.csv:
The values computed using the flux integral method are in close agreement to those above, as expected.
Lastly, we visualize the magnitude of the magnetic flux density field for the excitations of the inner and outer rings. The files for this visualization are again saved to the postpro/paraview directory.
[1] M. R. Alizadeh Pahlavani and H. A. Mohammadpour, Inductance comparison of the solenoidal coil of modular toroidal coils using the analytical and finite element method, Progress in Electromagnetics Research 20 (2010) 337-352.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
diff --git a/dev/examples/spheres/index.html b/dev/examples/spheres/index.html
new file mode 100644
index 000000000..8246c9924
--- /dev/null
+++ b/dev/examples/spheres/index.html
@@ -0,0 +1,23 @@
+
+Capacitance Matrix for Two Spheres · Palace
The files for this example can be found in the examples/spheres/ directory of the Palace source code.
In this example, we consider two conducting spheres of radii $a$ and $b$, with centers separated by a distance $c > a + b$. The surrounding medium is vacuum. An analytic solution for the capacitance matrix of this configuration exists and is given in [1]. The Maxwell capacitance matrix entries are given by the infinite series
where the subscript $a$ refers to the sphere with radius $a$ and likewise for $b$. The parameter $u$ is given by
\[\cosh{u} = \frac{c^2-a^2-b^2}{2ab} \,.\]
Here we take the values $a = 1\text{ cm}$, $b = 2\text{ cm}$, and $c = 5\text{ cm}$. A mesh is generated with Gmsh using the mesh.jl Julia script found in the mesh/ directory, which writes the mesh to mesh/spheres.msh. The resulting high-order mesh uses cubically-curved tetrahedral elements, and is pictured below.
+
+
+
The configuration file for the Palace simulation is found in spheres.json. We set the simulation "Type" to "Electrostatic", and add "Terminal" entries for the surface boundary of each sphere, corresponding to the entries of the capacitance matrix we wish to compute. The outer boundary of the computational domain, which is sufficiently far from the spheres, is prescribed a "Ground" boundary condition. We set the "Order" of the finite element approximation to $3$.
The resulting extracted Maxwell capacitance matrix is saved to disk in the CSV file postpro/terminal-C.csv:
which is computed using the first $n=12$ terms in the series after which convergence to a relative tolerance of $10^{-12}$ is reached. Thus, the errors in the capacitance coefficients by Palace are $0.57\%$, $1.9\%$, and $3.5\%$, respectively.
The mutual capacitance matrix can be computed from its Maxwell counterpart, and is saved in postpro/terminal-Cm.csv:
Additionally, while the typical approach used by Palace for lumped parameter extraction uses the computed field energies, the capacitance can also be calculated by directly integrating the charge on a boundary surface and dividing by the excitation voltage. The configuration file for this example contains this information under config["Boundaries"]["Postprocessing"]["Capacitance"]. The resulting capacitances are written to postpro/surface-C.csv:
and agree closely with the values computed using the default method above, as expected.
Finally, the postpro/paraview directory contains files for visualizing the computed field solutions with ParaView. Below we present the electrostatic potential fields for each terminal solution.
The perfect electric conductor (PEC) boundary condition (zero tangential electric field) is specified using the "PEC" boundary keyword under config["Boundaries"]. It is a homogeneous Dirichlet boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation.
For electrostatic simulations, the homogeneous Dirichlet boundary condition is prescribed using the "Ground" boundary keyword which prescribes zero voltage at the boundary.
The perfect magnetic conductor (PMC) boundary condition (zero tangential magnetic field) is a homogenous Neumann boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation. It is the natural boundary condition and thus it has the same effect as not specifying any additional boundary condition on external boundary surfaces. It can also be explicitly specified using the "PMC" boundary keyword under config["Boundaries"].
Likewise, for electrostatic simulations, the homogeneous Neumann boundary condition implies a zero-charge boundary, and thus zero gradient of the voltage in the direction normal to the boundary. This is specified using the "ZeroCharge" boundary keyword under config["Boundaries"].
The impedance boundary condition is a mixed (Robin) boundary condition and is available for the frequency or time domain finite element formulations and thus for eigenmode or frequency or time domain driven simulation types. It is specified using the "Impedance" boundary keyword. The surface impedance relating the tangential electric and magnetic fields on the boundary is computed from the parallel impedances due to the specified resistance, inductance, and capacitance per square.
Absorbing boundary conditions at farfield boundaries, also referred to as scattering boundary conditions, can be applied using the "Absorbing" boundary keyword under config["Boundaries"]. The first-order absorbing boundary condition is a special case of the above impedance boundary and is available for eigenmode or frequency or time domain driven simulation types. The second-order absorbing boundary condition is only available for frequency domain driven simulations.
Perfectly matched layer (PML) boundaries for frequency and time domain electromagnetic formulations are not yet implemented, but are common in solvers for computational electromagnetics and will be a useful addition.
A finite conductivity boundary condition can be specified using the "Conductivty" boundary keyword. This boundary condition models the effect of a boundary with non-infinite conductivity (an imperfect conductor) for conductors with thickness much larger than the skin depth. It is available only for frequency domain driven simulations.
For frequency domain driven simulations, ports are used to provide a lumped port excitation and postprocess voltages, currents, and scattering parameters. Likewise, for transient simulations, they perform a similar purpose but for time domain computed quantities.
For eigenmode simulations where there is no excitation, lumped ports are used to specify properties and postprocess energy-participation ratios (EPRs) corresponding to linearized circuit elements.
Note that a single lumped port (given by a single integer "Index") can be made up of multiple boundary attributes in the mesh in order to model, for example, a multielement lumped port.
config["Boundaries"]["WavePort"] : Numeric wave ports are available for frequency domain driven simulations. In this case, a port boundary condition is applied with an optional excitation using a modal field shape which is computed by solving a 2D boundary mode eigenproblem on each wave port boundary. This allows for more accurate scattering parameter calculations when modeling waveguides or transmission lines with arbitrary cross sections.
The homogenous Dirichlet boundary conditions for the wave port boundary mode analysis are taken from the "PEC" boundaries of the full 3D model, as well as any optional additional boundary attributes given under "WavePortPEC". Any boundary of the wave port not labeled with with a PEC condition has the natural boundary condition for zero tangential magnetic field prescribed for the purpose of port mode calculation.
Unlike lumped ports, wave port boundaries cannot be defined internal to the computational domain and instead must exist only on the outer boundary of the domain (they are to be "one-sided" in the sense that mesh elements only exist on one side of the boundary).
An alternative source excitation to lumped or wave ports for frequency and time domain driven simulations is a surface current excitation, specified under config["Boundaries"]["SurfaceCurrent"]. This is the excitation used for magnetostatic simulation types as well. This option prescribes a unit source surface current excitation on the given boundary in order to excite the model. It does does not prescribe any boundary condition to the model and only affects the source term on the right hand side.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
This user guide provides an overview of the different types of electromagnetic simulations which can be performed with Palace and the various features available in the solver.
The config["Model"] object is used to specify the mesh for the discretized computational domain. In general, inputs are expected to be dimensional nondimensionalized internally. A length scale, specified under config["Model"]["L0"], describes the length units of the mesh relative to 1 meter (i.e. config["Model"]["L0"]: 1.0e-6 if the mesh coordinates are in $\mu$m, this is the default value). All other entries in the configuration file which have units of length should be specified in units of config["Model"]["L0"] m.
Geometric attributes for domains and boundaries in the mesh are used to define material properties and boundary conditions on the desired model regions and surfaces (see config["Domains"] and config["Boundaries"]). These attribute integers correspond to tags for the domain and boundary elements in the mesh, and should be non-negative and start at 1. They do not need to be contiguous in the mesh file. Throughout the configuration file, the "Attributes" keyword is used to indicate which domain or boundary attributes are relevant to the material properties or boundary conditions being specified.
Refinement of the input mesh file can be performed using levels of global uniform refinement or region-based refinement, specified using the config["Model"]["Refinement"] object. The user can specify any combination of uniform refinement levels as well as local refinement regions which refines the elements inside of a certain box or sphere-shaped region. For simplex meshes, the refinement maintains a conforming mesh but meshes containing hexahedra, prism, or pyramid elements will be non-conforming after local refinement (this is not supported at this time).
Adaptive mesh refinement (AMR) according to error estimates in the computed solution is a work in progress for all simulation types.
Material properties are handled by the config["Domains"]["Materials"] object. Palace supports linear, frequency independent constitutive laws for material modeling.
Materials with scalar or general matrix-valued properties are supported. For most simulation types, each material in the model requires a specified relative permittivity and relative permeability (for electrostatic simulations, only the permittivity is required, while for magnetostatics, only the permeability is required). For dielectric domains, a loss tangent may be specified. Alternatively, for normal conducting domains, an electrical conductivity may be specified which is used to relate the current density and electric field via Ohm's law.
Modeling of superconducting domains is performed using the current-field constitutive relations given by the London equations. The user can specify a London penetration depth to activate this model. It can also be used in conjunction with a materal conductivity when wishing to model both superconducting and normal currents.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
diff --git a/dev/guide/postprocessing/index.html b/dev/guide/postprocessing/index.html
new file mode 100644
index 000000000..6dbdbb34a
--- /dev/null
+++ b/dev/guide/postprocessing/index.html
@@ -0,0 +1,3 @@
+
+Postprocessing and Visualization · Palace
As described in the section Problem Types, each simulation type writes relevant postprocessed scalar quantities to disk in the directory specified by config["Problem"]["Output"], including but not limited to computed values like eigenfrequencies, scattering parameters, or lumped element parameters. In addition, each simulation type will write a file called domain-E.csv, which includes information about the electric and magnetic field energies, as well as lumped element energies, for each step of the simulation (eigenmode, frequency, or time step, for examples).
The participation ratios for bulk dielectrics and interface dielectric layers can be computed for simulations involving the electric field. For model boundaries, the integrated surface charge or magnetic flux can also be postprocessed. These features are described in Domain postprocessing and in Boundary postprocessing.
Additionally, the computed fields can be automatically probed for their vector values at one or more points in space. This probe functionality is also described in Domain postprocessing.
Finally, as described further in Visualization, various field quantities on the 3D computational domain as well as 2D domain boundaries and material interfaces are written to disk when requested using the relevant parameters under config["Solver"]. These fields are meant to be visualized with ParaView.
Domain postprocessing capabilities are enabled by including objects under config["Domains"]["Postprocessing"] in the configuration file. These include:
config["Domains"]["Postprocessing"]["Dielectric"] : Postprocessess bulk dielectric loss based on the participation ratio of the electric field in a lossy region. The respective participation ratios and quality factors for each domain (associated with the specified domain attributes and indexed by the specified integer "Index") are computed using the material properties provided and are written to domain-Q.csv in the specified postprocessing output directory.
config["Domains"]["Postprocessing"]["Probe"] : Probe the values of the computed electric field and magnetic flux density solutions at specified locations in the computational domain. The availability of the $\bm{E}$ and $\bm{B}$ fields depends on the problem type (for example, for magnetostatic problems, only $\bm{B}$ is output and $\bm{E}$ is not computed, whereas the inverse is true for electrostatics). For each computed field, the postprocessed values are written to probe-E.csv and probe-B.csv in the specified output directory.
Boundary postprocessing capabilities are enabled by including objects under config["Boundaries"]["Postprocessing"] in the configuration file. These include:
config["Boundaries"]["Postprocessing"]["Capacitance"] : Postprocess the integral of the surface charge on a surface defined by a list of boundary attributes, and divide by the excitation voltage to get the capacitive coupling. The resulting capcitances are written to surface-C.csv in the specified output directory.
config["Boundaries"]["Postprocessing"]["Inductance"] : Postprocess the magnetic flux through a surface defined by a list of boundary attributes, and divide by the excitation current to the inductive coupling. The resulting inductances are written to surface-M.csv in the specified output directory.
When specified in the configuration file, the electric field and magnetic flux density solutions are written to disk for 3D visualization with ParaView. Various other postprocessed fields are also written to the ParaView database as available, including electric and magnetic energy density, surface currents, and charge density. These files are found in the paraview/ directory located in the output directory specified under config["Problem"]["Output"].
In addition to the full 3D fields, a ParaView data collection for the boundary mesh is also written to disk. The boundary mesh includes all surfaces with prescribed boundary conditions as well as any material interfaces in the computational domain.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
For eigenmode simulations, config["Problem"]["Type"]: "Eigenmode", the user should specify a nonzero (but arbitrarily small) frequency above which to search for eigenmodes. The computed eigenvalues are written to an ASCII file named eig.csv, in the directory specified by config["Problem"]["Output"].
Calculations related to energy-participation ratio (EPR) quantization can be performed with Palace when the user specifies lumped ports corresponding to the linearized lumped circuit elements in the model. In this case, the participation matrix for inductive elements is automatically generated for the specified number of modes and number of inductive lumped ports. The participation matrix is output in an ASCII file named port-EPR.csv.
The EPR framework can be used to characterize the dissipative elements in the model as well. In particular, lumped ports with nonzero resistance in the model will trigger coupling rate and quality factor calculations based on input-output (I-O) line coupling loss: By specifying resistive lumped ports in the model, the mode coupling quality factors will be computed as $Q_{ml} = \omega_m/\kappa_{ml}$. The output file port-Q.csv will be created in the output directory containing these mode qualty factor contributions. For bulk and interface dielectric loss calculations, which are not unique to the eigenmode simulation type, see the sections Domain postprocessing and Boundary postprocessing.
The default frequency sweep behavior for frequency domain driven simulations is to perform a uniform sampling from the minimum to the maximum specified frequency of interest, using the user specified step size. An adaptive fast frequency sweep strategy can also be used, activated by specifying a nonzero value for "AdaptiveTol" under the config["Solver"]["Driven"] object. In this case, using the high-dimensional model solution computed at a few automatically selected frequency samples, a low-cost model is constructed and used to compute the frequency response over the entire frequency range of interest. The specified error tolerance ensures that the approximate low-cost model is reliably accurate relative to the high-dimensional model within the frequency band of interest. This is particularly useful for fine-resolution sweeps containing many sample points, where it can yield a significant speedup over the default strategy.
Port scattering parameters, or S-parameters, are postprocessed for the column of the scattering matrix corresponding to the driven port index automatically for this simulation type and stored in an ASCII file named port-S.csv, in the directory specified by config["Problem"]["Output"]. In the case that more than a single lumped or wave port is excited or surface current excitations are used, scattering parameter output will be disabled for the simulation(though other quantities of interest are still postprocessed). When lumped ports are present, the peak complex lumped port voltages and currents computed for each excitation frequency are written to ASCII files named port-V.csv and port-I.csv, respectively, Additionally, the surface current excitations are written to surface-I.csv.
The previous simulation types describe simulations based on frequency domain formulations of Maxwell's equations. Time domain simulations are also possible through the transient simulation type: config["Problem"]["Type"]: "Transient". Similar to the driven simulation type in the frequency domain, transient simulations involve simulating the response of the system to a time-dependent excitation field specified at lumped ports or surface current excitations in the model. The system is always started from rest with zero initial conditions and time-integrated for a user specified duration, given in nanoseconds. There are several available excitation types which define the time dependence of the pulse or excitation waveform. These are specified under the config["Solver"]["Transient"] object using the "Excitation" keyword.
The time histories of the lumped port voltages and currents are postprocessed and automatically written to ASCII files named port-V.csv and port-I.csv, respectively, in the directory specified by config["Problem"]["Output"]. Additionally, surface current excitation time histories are written to surface-I.csv.
For electrostatic simulations, (config["Problem"]["Type"]: "Electrostatic", the user should specify a number of terminal boundaries (config["Boundaries"]["Terminal"]) as well as boundaries which are grounded (config["Boundaries"]["Ground"]). For each terminal, an electrostatic field is computed by assigning the terminal of interest a positive nonzero voltage and all other terminals and grounded boundaries a zero voltage. The resulting fields are then used to compute the Maxwell capacitance matrix and its inverse, which are written to an ASCII file named terminal-C.csv and terminal-Cinv.csv, respectively, in the directory specified by config["Problem"]["Output"]. The mutual capacitance matrix is also computed and written to terminal-Cm.csv in the same directory.
For magnetostatic simulations, (config["Problem"]["Type"]: "Magnetostatic", the user should specify a number of source current boundaries. For each current source, a magnetostatic field is computed by applying a unit current to the source index of interest, leaving all other sources open with no excitation. Surfaces which are expected to carry current should be labeled as perfectly conducting, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The resulting fields are used to compute the inductance matrix and its inverse, which are written to an ASCII file named terminal-M.csv and terminal-Minv.csv, respectively, in the directory specified by config["Problem"]["Output"]. A "mutual" inductance matrix which has the same form as the mutual capacitance matrix (its entries are based on current differences between ports rather than absolute currents) is computed and written to terminal-Mm.csv in the same directory.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
Palace, for PArallel LArge-scale Computational Electromagnetics, is an open-source, parallel finite element code for full-wave 3D electromagnetic simulations in the frequency or time domain, using the MFEM finite element discretization library.
Eigenmode calculations with optional material or radiative loss including lumped impedance boundaries. Automatic postprocessing of energy-participation ratios (EPRs) for circuit quantization and interface or bulk participation ratios for predicting dielectric loss.
Frequency domain driven simulations with surface current excitation and lumped or numeric wave port boundaries. Wideband frequency response calculation using uniform frequency space sampling or an adaptive fast frequency sweep algorithm.
Explicit or fully-implicit time domain solver for transient electromagnetic analysis.
Lumped capacitance and inductance matrix extraction via electrostatic and magnetostatic problem formulations.
Support for a wide range of mesh file formats for structured and unstructured meshes, with built-in uniform or region-based parallel mesh refinement.
Arbitrary high-order finite element spaces and curvilinear mesh support thanks to the MFEM library.
Scalable algorithms for the solution of linear systems of equations, including geometric multigrid (GMG), parallel sparse direct solvers, and algebraic multigrid (AMG) preconditioners, for fast performance on platforms ranging from laptops to HPC systems.
C and (optionally) Fortran compilers for dependency builds
MPI distribution
BLAS, LAPACK libraries (described below in Math libraries)
In addition, builds from source require the following system packages which are typically already installed and are available from most package managers (apt, dnf, brew, etc.):
During the configure step, the build system will try to detect system installations of BLAS and LAPACK libraries depending on the system architecture according to the following procedure:
For x86_64 systems:
If the MKLROOT environment variable is set, looks for an Intel MKL installation.
If the AOCL_DIR or AOCLROOT environment variables are set, looks for an AMD Optimizing CPU Libraries (AOCL) installation of BLIS and libFLAME.
Otherwise, tries to locate an installation of OpenBLAS which is permissively licensed and available from most package managers.
Otherwise, tries to locate an installation of OpenBLAS.
If the installation path of OpenBLAS is non-standard or is not found by default, it can be set using the OPENBLAS_DIR or OPENBLASROOT environment variables, or added to CMAKE_PREFIX_PATH when calling CMake.
It is recommended in most cases to use a serial BLAS and LAPACK builds (not multithreaded), as the standard parallelization in approach in Palace is to use pure MPI parallelism.
Palace leverages the MFEM finite element discretization library. It always configures and builds its own installation of MFEM internally in order to support the most up to date features and patches. Likewise, Palace will always build its own installation of GSLIB, when PALACE_WITH_GSLIB=ON.
As part of the Build from source, the CMake build will automatically build and install a small number of third-party dependencies before building Palace. The source code for these dependencies is downloaded using using Git submodules. These libraries include:
For solving eigenvalue problems, at least one of SLEPc or ARPACK-NG must be specified. Typically only one of the SuperLU_DIST, STRUMPACK, and MUMPS dependencies is required but all can be built so the user can decide at runtime which solver to use.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
The solver computes a finite element approximation to the three-dimensional, time-harmonic Maxwell's equations in second-order form. The nondimensionalized, source-free, boundary value problem for $\bm{E}(\bm{x})\in\mathbb{C}^3$, $\bm{x}\in\Omega$, $\partial\Omega=\Gamma$, where $\bm{\mathscr{E}}(\bm{x},t) = \text{Re}\{\bm{E}(\bm{x})e^{i\omega t}\}$ denotes the electric field, is written as
where the nondimensionalization has been performed with respect to a characteristic length $L_0$, time $L_0/c_0$, magnetic field strength $H_0$, and electric field strength $Z_0 H_0$. Here, $c_0$ and $Z_0$ are the speed of light and impedance of free space, respectively. Given the electric field solution, the time-harmonic magnetic flux density can be calculated as
where $\varepsilon_r'$ is the real relative permittivity and $\tan{\delta}$ is the loss tangent. Alternatively, conductor loss is modeled by Ohm's law $\bm{J}=\sigma\bm{E}$ with electrical conductivity $\sigma>0.0$. For a superconducting domain, the constitive current-field relationship given by Ohm's law is replaced by that given by the London equations:
where $\lambda_L = \sqrt{m/\mu n_s e^2}/L_0$ is the nondimensionalized London penetration depth. In this case, the term $+i\omega\sigma \bm{E}$ arising for a normal conductor in the time-harmonic Maxwell's equations becomes $+(\mu_r \lambda_L^2)^{-1}\bm{E}$.
The domain boundary $\Gamma=\Gamma_{PEC}\cup\Gamma_{PMC}\cup\Gamma_{Z}$, is separated into perfect electric conductor (PEC), perfect magnetic conductor (PMC), and impedance boundaries, respectively. The PEC boundary condition is a homogenous Dirichlet condition, while the PMC boundary condition is the natural boundary condition for the problem and is satisfied at all exterior boundaries by the finite element formulation. Impedance boundaries are modeled using a Robin boundary condition with $\gamma = i\omega/Z_s$, in which $Z_s$ the surface impedance of the boundary, with units of impedance per square.
A time-dependent formulation is also available to compute the electric field response $\bm{E}(\bm{x},t)$ for a given time-dependent source excitation $\bm{U}^{inc}(\bm{x},t)$. The governing equations in this case are
subject to the same boundary conditions as the frequency-dependent case except for the Robin boundary condition which is written for a lumped resistive port boundary, for example, as
The second-order electric field formulation is chosen to take advantage of unconditionally stable implicit time-integration schemes without the expense of a coupled block system solve for $\bm{E}(\bm{x},t)$ and $\bm{B}(\bm{x},t)$. It offers the additional benefit of sharing many similarities in the spatial discretization as the frequency domain formulation outlined above.
For lumped port boundaries, the surface impedance can be related to an equivalent circuit impedance, $Z$. There are two common cases:
Rectangular ports: $Z = Z_s l / w$, where $l$ and $w$ are the length and width of the port, respectively (length here is defined as the distance between the two conductors).
Coaxial ports: $Z = Z_s \ln(b/a) / 2\pi$, where $a$ and $b$ denote the inner and outer radii of the port, respectively.
A lumped parallel RLC circuit boundary has a circuit impedance
\[\frac{1}{Z} = \frac{1}{R}+\frac{1}{i\omega L}+i\omega C \,.\]
Thus, the relationships between the circuit and surface element parameters for the user to specify are given by $R_s = \alpha R$, $L_s = \alpha L$, and $C_s = C/\alpha$, where $\alpha = w/l$ for a rectangular port or $\alpha = 2\pi / \ln(b/a)$ for a coaxial port.
For multielement lumped ports, the effective circuit impedance is given by
\[\frac{1}{Z} = \sum_k \frac{1}{Z_k} \,.\]
That is, the circuit impedances of each port contributing to the multielement port add in parallel. For the specific case of a two element multielement port with two identical lumped elements, we have $Z = (1/Z_1 + 1/Z_2)^{-1} = Z_k / 2$, where $Z_k$ is the circuit impedance of a single port element.
The source term $\bm{U}^{inc}$ in a driven frequency-response problem is related to the incident field at an excited port boundary by
where $(\bm{n}\times\bm{E}^{inc})\times\bm{n}$ is just the projection of the excitation field onto the port surface. The incident fields for lumped ports depend on the port shape:
Rectangular ports: $\bm{E}^{inc} = E_0 \, \hat{\bm{l}}$, where $E_0$ is a uniform constant field strength and $\hat{\bm{l}}$ a unit vector defining the direction of polarization on the port (typically should be the direction between the two conductors).
Coaxial ports: $\bm{E}^{inc} = \frac{E_0 r_0}{r} \, \hat{\bm{r}}$, where $E_0$ is again a uniform constant field strength, $r_0$ is a characteristic length for the port, $r$ is the distance from the port center, and $\hat{\bm{r}}$ a unit vector specifying the port radial direction.
In the time domain formulation, the source term $\bm{U}^{inc}$ appears as
where $\bm{E}^{inc}(\bm{x})$ is identical to the spatial excitation in the frequency domain formulation, and $p(t)$ describes the temporal shape of the excitation. Possible options include a sinusoidal, Gaussian, modulated Gaussian, or step excitation.
In the frequency domain, the scattering parameters can be postprocessed from the computed electric field for each lumped port with boundary $\Gamma_i$ as
In the time domain, the time histories of the port voltages can be Fourier-transformed to get their frequency domain representation for scattering parameter calculation.
Numeric wave ports assume a field with known normal-direction dependence $\bm{E}(\bm{x})=\bm{e}(\bm{x}_t)e^{ik_n x_n}$ where $k_n$ is the propagation constant. For each operating frequency $\omega$, a two-dimensional eigenvalue problem is solved on the port yielding the mode shapes $\bm{e}_m$ and associated propagaton constants $k_{n,m}$. These are used in the full 3D model where the Robin port boundary condition has coefficient $\gamma=i\text{Re}\{k_{n,m}\}/\mu_r$ and the computed mode is used to compute the incident field in the source term $\bm{U}^{inc}$ at excited ports. Scattering parameter postprocessing takes the same form as the lumped port counterpart using the computed modal solutions. Since the propagation constants are known for each wave port, scattering parameter de-embedding can be performed by specifying an offset distance $d$ for each port:
where the matrix $\bm{K}$ represents the discretized curl-curl operator, $\bm{M}$ the mass term, and $\bm{C}$ the port impedance boundary conditions. The damped frequency $\omega_d$ and quality factor $Q$ is postprocessed from each of the resulting eigenvalues as
The energy-participation ratio (EPR) for lumped inductive elements is computed from the electric and magnetic fields corresponding to eigenmode $m$, $\bm{E}_m$ and $\bm{H}_m$, using the formula
where $p_{mj}\in[-1,1]$ denotes the signed participation ratio for junction $j$ in mode $m$, $L_j$ is the provided junction circuit inductance, $I_ {mj}$ is the peak junction current for mode $m$, and $\mathcal{E}^{elec}_m$ is the electric energy in mode $m$. The junction current is computed using the mean voltage across the port, $\overline{V}_{mj}$, as $I_{mj} = \overline{V}_{mj}/Z_{mj}$, where $Z_{mj} = 1/(i\omega_m L_j)$ is the impedance of the inductive branch of the lumped circuit. The mean port voltage depends on the computed electric field mode and the shape of the port:
where $\bm{D}_m=\varepsilon_r\bm{E}_m$ is the electric flux density for mode $m$ and the second term on the right-hand side accounts for any lumped capacitive boundaries with nonzero circuit capacitance $C_j$.
The EPR can also be used to estimate mode quality factors due to input-output(I-O) line coupling. The mode coupling quality factor due to the $j$-th I-O port is given by
\[Q_{mj} = \frac{\omega_m}{\kappa_{mj}}\]
where the port coupling rate $\kappa_{mj}$ is calculated as
The quality factor due to bulk dielectric loss resulting from an electric field $\bm{E}$ present in domain $j$ with associated loss tangent $\tan{\delta}_j$ is given by
where $t_j$ is the thickness of the layer and $\bm{D} = \varepsilon_{r,j}\bm{E}$ is the electric displacement field in the layer evaluated using the relative permittivity of the interface $\varepsilon_{r,j}$. For an internal boundary, this integral is evaluated on a single side to resolve abiguity due to the discontinuity of $\bm{E}$ across the boundary.
The above formula for interface dielectric loss can be specialized for the case of a metal-air, metal-substrate, or substrate-air interface. In each case, the quality factor for interface $j$ is given by
For electrostatic simulations, the Maxwell capacitance matrix is computed in the following manner. First, the Laplace equation subject to Dirichlet boundary conditions is solved for each terminal with boundary $\Gamma_i$ in the model, yielding an associated voltage field $V_i(\bm{x})$:
For each port with boundary $\Gamma_i$, a unit source surface current $\bm{J}_s^{inc}$ is applied, yielding an associated vector potential solution $\bm{A}_i(\bm{x})$. Homogeneous Dirichlet boundary conditions $\bm{n}\times\bm{A}_i=0$ are also imposed on specified surfaces of the model. The magnetic field energy associated with any solution is
[1] J.-M. Jin, The Finite Element Method in Electromagnetics, Wiley-IEEE Press, Hoboken, NJ, Third edition, 2014. [2] P. Monk, Finite Element Methods for Maxwell's Equations, Oxford University Press, Oxford, 2003.
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
The installed palace script wraps a call to the desired MPI launcher (mpirun by default).
<NUM_PROCS> is the number of MPI processes to use for the simulation.
config.json is the JSON format configuration file used to specify the simulation parameters. The structure of this configuration file is outlined in detail in the section Configuration File.
A full list of available script options is available using the -h or --help flag.
During the course of a simulation, the solver will write a number of useful statistics and logging information to standard output. It is often helpful to save this information to a file, for example with:
<INSTALL_DIR>/bin/palace ... | tee log.out
Of course, the interested user can explicitly run the Palace binary in parallel, supplying options directly to their MPI launcher of choice, as:
where <MPI_RUN> is the MPI launcher command, [OPTIONS] is a list of command line options passed to the MPI launcher, and <ARCH> is the machine architecture (x86_64 or arm64).
Settings
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
This document was generated with Documenter.jl version 0.27.25 on Tuesday 25 July 2023. Using Julia version 1.9.2.
diff --git a/dev/search_index.js b/dev/search_index.js
new file mode 100644
index 000000000..4d520768c
--- /dev/null
+++ b/dev/search_index.js
@@ -0,0 +1,3 @@
+var documenterSearchIndex = {"docs":
+[{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"\n","category":"page"},{"location":"examples/coaxial/#Signal-Propagation-in-a-Coaxial-Cable","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"","category":"section"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"note: Note\nThe files for this example can be found in the examples/coaxial/ directory of the Palace source code.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Palace can perform transient electromagnetic modeling, acting as a so-called finite element time domain (FETD) solver. To demonstrate this feature, we consider here the propagation of an electromagnetic pulse through a section of coaxial cable. The model is constructed based on a 50text Omega RG-401/U coaxial cable [1], with outer and inner conductor diameters of 0215text in and 00645text in, respectively. The section length is roughly 15text in. The Teflon dielectric material has varepsilon_r = 208, and we consider tandelta = 4times 10^-2, a factor of 100 above the actual value in order to exaggerate losses in the transmission line.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"In this example we consider three different configurations of the model, all with a coaxial lumped port excitation at one end of the line: an open termination at the opposite end (coaxial_open.json), a shorted termination(coaxial_short.json), and a matched 50text Omega lumped port termination (coaxial_matched.json).","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"The mesh is generated using the Julia code in mesh/mesh.jl and consists of quadratically-curved hexahedral elements, as depicted below. Third-order shape functions are used to approximate the solution.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Each configuration file sets the simulation \"Type\" to \"Transient\". The different termination configurations are specified by using a \"LumpedPort\" with matched impedance for the matched termination, a \"PEC\" boundary for the shorted termination, leaving no boundary condition specified for the open termination. This last case applies the natural boundary condition for the finite element formulation which is a perfect magnetic conductor boundary condition, enforcing zero tangential magnetic field and thus zero surface current density.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"The excitation pulse is configured under config[\"Solver\"][\"Transient\"]. Here, we use a modulated Gaussian pulse shape, with time dependence given by the expression","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"g(t) = sinleftomega(t-t_0)right e^-frac(t-t_0)^22tau^2 ","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"For this simulation, we use a center frequency f = omega2pi = 10text GHz and pulse width tau = 005text ns. The offset t_0 is automatically chosen by Palace in order to smoothly ramp up the excitation from the rest initial condition. Time integration uses the second-order implicit Generalized-alpha scheme with a uniform time step Delta t = 5times 10^-3text ns, and the solution is computed for the interval tin0010text ns. The electric and magnetic field solutions are sampled every 10 time steps for visualization.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Below, we plot the time histories of the port voltage at the excited coaxial lumped port for the three simulation cases.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"We can observe that as expected, the matched termination absorbs the incident waveform nearly perfectly, while it is reflected with the same polarity for the shorted termination and opposite polarity for the open termination (phase shifted by pi). Furthermore, the reflected wave is noticably attenuated due to the material loss of the transmission line dielectric.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Lastly, an animation of the signal propagation for the matched (left) and shorted (right) simulations, constructed using the saved fields, is shown below.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/#References","page":"Signal Propagation in a Coaxial Cable","title":"References","text":"","category":"section"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"\n","category":"page"},{"location":"config/config/#Overview","page":"Overview","title":"Overview","text":"","category":"section"},{"location":"config/config/","page":"Overview","title":"Overview","text":"A configuration file written in the JSON format is used specify the runtime options for a Palace simulation. The following sections give a detailed overview of the file format and available settings.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"Parameters are specified in the form of keyword/value pairs where the key is a string and the value may be a string, boolean, integer or floating point number, or array. Parameters are grouped into a hierarchy of objects. We support relaxed JSON formatting with C++-style comments (//, /* */). Integer arrays can be specified as comma-separated lists of integers or integer ranges, for example [1,3-5,6] is parsed as [1,3,4,5,6].","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"In the following sections, default values for the parameters are specified alongside the description of each keyword in square brackets. Keywords for which there is no default value listed ([None]) are required in general if specifying values for other keywords under the same top-level object.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"The top-level JSON object of the configuration file has the following structure:","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"{\n \"Problem\":\n {\n ...\n },\n \"Model\":\n {\n ...\n },\n \"Domains\":\n {\n ...\n },\n \"Boundaries\":\n {\n ...\n },\n \"Solver\":\n {\n ...\n }\n}","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"Each property of the top-level config JSON object is detailed in its corresponding section of the documentation.","category":"page"},{"location":"config/config/#Contents","page":"Overview","title":"Contents","text":"","category":"section"},{"location":"config/config/","page":"Overview","title":"Overview","text":"config[\"Problem\"]\nconfig[\"Model\"]\nconfig[\"Domains\"]\nconfig[\"Boundaries\"]\nconfig[\"Solver\"]","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\n","category":"page"},{"location":"config/solver/#config[\"Solver\"]","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Solver\":\n{\n \"Order\": ,\n \"Eigenmode\":\n {\n ...\n },\n \"Driven\":\n {\n ...\n },\n \"Transient\":\n {\n ...\n },\n \"Electrostatic\":\n {\n ...\n },\n \"Magnetostatic\":\n {\n ...\n },\n \"Linear\":\n {\n ...\n }\n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Order\" [1] : Finite element order (degree). Arbitrary high-order spaces are supported.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Eigenmode\" : Top-level object for configuring the eigenvalue solver for the eigenmode simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Eigenmode\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Driven\" : Top-level object for configuring the frequency domain driven simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Driven\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Transient\" : Top-level object for configuring the time domain driven simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Transient\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Electrostatic\" : Top-level object for configuring the electrostatic simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Electrostatic\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Magnetostatic\" : Top-level object for configuring the magnetostatic simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Magnetostatic\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Linear\" : Top-level object for configuring the linear solver employed by all simulation types.","category":"page"},{"location":"config/solver/#solver[\"Eigenmode\"]","page":"config[\"Solver\"]","title":"solver[\"Eigenmode\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Eigenmode\":\n{\n \"Target\": ,\n \"Tol\": ,\n \"MaxIts\": ,\n \"MaxSize\": ,\n \"N\": ,\n \"Save\": ,\n \"Type\": ,\n \"ContourTargetUpper\": ,\n \"ContourAspectRatio\": ,\n \"ContourNPoints\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Target\" [None] : (Nonzero) frequency target above which to search for eigenvalues, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Tol\" [1.0e-6] : Relative convergence tolerance for the eigenvalue solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxIts\" [0] : Maximum number of iterations for the iterative eigenvalue solver. A value less than 1 uses the solver default.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxSize\" [0] : Maximum subspace dimension for eigenvalue solver. A value less than 1 uses the solver default.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"N\" [1] : Number of eigenvalues to compute.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed field modes to save to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the eigenvalue solver to be used in computing the given number of eigenmodes of the problem. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SLEPc\"\n\"ARPACK\"\n\"FEAST\"\n\"Default\" : Use the default eigensolver. Currently, this is the Krylov-Schur eigenvalue solver from \"SLEPc\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourTargetUpper\" [None] : Specifies the upper frequency target of the contour used for the FEAST eigenvalue solver, GHz. This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourAspectRatio\" [None] : Specifies the aspect ratio of the contour used for the FEAST eigenvalue solver. This should be greater than zero, where the aspect ratio is the ratio of the contour width to the frequency range(\"ContourTargetUpper\" - \"Target\"). This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourNPoints\" [4] : Number of contour integration points used for the FEAST eigenvalue solver. This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/#Advanced-eigenmode-solver-options","page":"config[\"Solver\"]","title":"Advanced eigenmode solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"PEPLinear\" [true]\n\"Scaling\" [true]\n\"StartVector\" [true]\n\"StartVectorConstant\" [false]\n\"MassOrthogonal\" [false]","category":"page"},{"location":"config/solver/#solver[\"Driven\"]","page":"config[\"Solver\"]","title":"solver[\"Driven\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Driven\":\n{\n \"MinFreq\": ,\n \"MaxFreq\": ,\n \"FreqStep\": ,\n \"SaveStep\": ,\n \"SaveOnlyPorts\": ,\n \"AdaptiveTol\": ,\n \"AdaptiveMaxSamples\": ,\n \"AdaptiveMaxCandidates\": ,\n \"Restart\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MinFreq\" [None] : Lower bound of frequency sweep interval, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxFreq\" [None] : Upper bound of frequency sweep interval, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"FreqStep\" [None] : Frequency step size for frequency sweep, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveStep\" [0] : Controls how often, in number of frequency steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveOnlyPorts\" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveTol\" [0.0] : Relative error convergence tolerance for adaptive frequency sweep. If zero, adaptive frequency sweep is disabled and the full-order model is solved at each frequency step in the specified interval. If positive, this tolerance is used to ensure the reliability of the reduced-order model relative to the full-order one in the frequency band of interest.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveMaxSamples\" [10] : Maximum number of frequency samples used to construct the reduced-order model for adaptive fast frequency sweep, if the specified tolerance (\"AdaptiveTol\") is not met first.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveMaxCandidates\" [NumFreq/5] : Maximum number of frequency samples to consider as candidates for computing the reduced-order model error when adaptively sampling new points in order to construct the reduced-order for adaptive fast frequency sweep. The default is less than the requested number of frequency points in the sweep.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Restart\" [1] : Iteration (1-based) from which to restart for a partial frequency sweep simulation. That is, the initial frequency will be computed as \"MinFreq\" + (\"Restart\" - 1) * \"FreqStep\".","category":"page"},{"location":"config/solver/#Advanced-driven-solver-options","page":"config[\"Solver\"]","title":"Advanced driven solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveAPosterioriError\" [false]","category":"page"},{"location":"config/solver/#solver[\"Transient\"]","page":"config[\"Solver\"]","title":"solver[\"Transient\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Transient\":\n{\n \"Type\": ,\n \"Excitation\": ,\n \"ExcitationFreq\": ,\n \"ExcitationWidth\": ,\n \"MaxTime\": ,\n \"TimeStep\": ,\n \"SaveStep\": ,\n \"SaveOnlyPorts\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the time integration scheme used for the discretization of the second-order system of differential equations. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"GeneralizedAlpha\" : The second-order implicit generalized-alpha method with rho_inf = 10. This scheme is unconditionally stable.\n\"NewmarkBeta\" : The second-order implicit Newmark-beta method with beta = 14 and gamma = 12. This scheme is unconditionally stable.\n\"CentralDifference\" : The second-order explicit central difference method, obtained by setting beta = 0 and gamma = 12 in the Newmark-beta method. In this case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step.\n\"Default\" : Use the default \"GeneralizedAlpha\" time integration scheme.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Excitation\" [None] : Controls the time dependence of the source excitation. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Sinusoidal\" : A sinusoidal excitation at a user specified frequency.\n\"Gaussian\" : A Gaussian pulse with a user specified width which defines the bandwidth.\n\"DifferentiatedGaussian\" : A differentiated Gaussian pulse with a user specified width which defines the bandwidth.\n\"ModulatedGaussian\" : A modulated Gaussian pulse at a user specified center frequency and width used to excite the system without any DC component.\n\"Ramp\" : A differentiable unit step function to model the ramp up to a DC signal.\n\"SmoothStep\" : A smoother many-times differentiable unit step function to model the ramp up to a DC signal over a specified width of time.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ExcitationFreq\" [None] : Center frequency used for harmonic source excitations, GHz. Only relevant when \"Excitation\" is one of \"Sinusoidal\", \"Gaussian\", \"DifferentiatedGaussian\", or \"ModulatedGaussian\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ExcitationWidth\" [None] : Pulse width for Gaussian-type source excitations, ns. Only relevant when \"Excitation\" is one of \"Gaussian\", \"DifferentiatedGaussian\", \"ModulatedGaussian\", or \"SmoothStep\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxTime\" [None] : End of simulation time interval, ns. Transient simulations always start from rest at t = 00.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"TimeStep\" [None] : Uniform time step size for time integration, ns.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveStep\" [0] : Controls how often, in number of time steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveOnlyPorts\" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.","category":"page"},{"location":"config/solver/#solver[\"Electrostatic\"]","page":"config[\"Solver\"]","title":"solver[\"Electrostatic\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Electrostatic\":\n{\n \"Save\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed electric field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed capacitance matrix. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/#solver[\"Magnetostatic\"]","page":"config[\"Solver\"]","title":"solver[\"Magnetostatic\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Magnetostatic\":\n{\n \"Save\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed magnetic field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed inductance matrix. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/#solver[\"Linear\"]","page":"config[\"Solver\"]","title":"solver[\"Linear\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Linear\":\n{\n \"Type\": ,\n \"KSPType\": ,\n \"Tol\": ,\n \"MaxIts\": ,\n \"MaxSize\": ,\n \"UseGMG\": ,\n \"UsePCShifted\": ,\n \"MGCycleIts\": ,\n \"MGSmoothIts\": ,\n \"MGSmoothOrder\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the solver used for preconditioning the linear system of equations to be solved for each simulation type. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SuperLU\" : The SuperLU_DIST sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with SuperLU_DIST support.\n\"STRUMPACK\" : The STRUMPACK sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with STRUMPACK support.\n\"MUMPS\" : The MUMPS sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with MUMPS support.\n\"AMS\" : Hypre's Auxiliary-space Maxwell Solver (AMS), an algebraic multigrid (AMG)-based preconditioner.\n\"BoomerAMG\" : The BoomerAMG algebraic multigrid solver from Hypre.\n\"Default\" : Use the default \"AMS\" solver for simulation types involving definite or semi-definite curl-curl operators (time domain problems as well as magnetostatics). For frequency domain problems, use a sparse direct solver if available, otherwise uses \"AMS\". For electrostatic problems, uses \"BoomerAMG\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"KSPType\" [\"Default\"] : Specifies the iterative Krylov subspace solver type for solving linear systems of equations arising for each simulation type. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"CG\"\n\"GMRES\"\n\"FGMRES\"\n\"Default\" : Use the default \"GMRES\" Krylov subspace solver for frequency domain problems, that is when config[\"Problem\"][\"Type\"] is \"Eigenmode\" or \"Driven\". For the other simulation types, the linear system matrix is always real and symmetric positive definite (SPD) and the preconditioned conjugate gradient method (\"CG\") is used as the Krylov solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Tol\" [1.0e-6] : Relative (preconditioned) residual convergence tolerance for the iterative linear solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxIts\" [100] : Maximum number of iterations for the iterative linear solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxSize\" [0] : Maximum Krylov space size for the GMRES and FGMRES solvers. A value less than 1 defaults to the value specified by \"MaxIts\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"UseGMG\" [true] : Enable or not geometric multigrid solver which uses h- and p-multigrid coarsening as available to construct the multigrid hierarchy. The solver specified by \"Type\" is used on the coarsest level. A Hiptmair smoother is applied to all other levels.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"UsePCShifted\" [false] : When set to true, constructs the preconditioner for frequency domain problems using a real SPD approximation of the system matrix, which can help performance at high frequencies (relative to the lowest nonzero eigenfrequencies of the model).","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGCycleIts\" [1] : Number of V-cycle iterations per preconditioner application for multigrid preconditioners (when \"UseGMG\" is true or \"Type\" is \"AMS\" or \"BoomerAMG\").","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGSmoothIts\" [1] : Number of pre- and post-smooth iterations used for multigrid preconditioners (when \"UseGMG\" is true or \"Type\" is \"AMS\" or \"BoomerAMG\").","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGSmoothOrder\" [3] : Order of polynomial smoothing for geometric multigrid preconditioning (when \"UseGMG\" is true).","category":"page"},{"location":"config/solver/#Advanced-linear-solver-options","page":"config[\"Solver\"]","title":"Advanced linear solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\": \"STRUMPACK-MP\"\n\"KSPType\": \"MINRES\", \"CGSYM\", \"FCG\", \"BCGS\", \"BCGSL\", \"FBCGS\", \"QMRCGS\", \"TFQMR\"\n\"UseMGS\" [false]\n\"UseCGS2\" [false]\n\"UseKSPPiped\" [false]\n\"UseLOR\" [false]\n\"PrecondSide\" [\"Default\"]: \"Left\", \"Right\", \"Default\"\n\"Reordering\" [\"Default\"]: \"METIS\", \"ParMETIS\", \"Default\"\n\"STRUMPACKCompressionType\" [\"None\"]: \"None\", \"BLR\", \"HSS\", \"HODLR\"\n\"STRUMPACKCompressionTol\" [1.0e-3]\n\"STRUMPACKLossyPrecision\" [16]\n\"STRUMPACKButterflyLevels\" [1]\n\"SuperLU3D\" [false]\n\"AMSVector\" [false]","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\n","category":"page"},{"location":"config/domains/#config[\"Domains\"]","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Domains\":\n{\n \"Materials\":\n [\n ...\n ],\n \"Postprocessing\":\n {\n \"Dielectric\":\n [\n ...\n ],\n \"Probe\":\n [\n ...\n ]\n }\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Materials\" : Array of material properties objects.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\" : Top-level object for configuring domain postprocessing.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Dielectric\" : Array of objects for postprocessing bulk dielectric loss.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Probe\" : Array of objects for postprocessing solution field values evaluated at a probe location in space.","category":"page"},{"location":"config/domains/#domains[\"Materials\"]","page":"config[\"Domains\"]","title":"domains[\"Materials\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Materials\":\n[\n // Material 1\n {\n \"Attributes\": [],\n \"Permeability\": ,\n \"Permittivity\": ,\n \"LossTan\": ,\n \"Conductivity\": ,\n \"LondonDepth\": ,\n \"MaterialAxes\": \n },\n // Material 2, 3, ...\n ...\n]","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Attributes\" [None] : Integer array of mesh domain attributes for this material.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Permeability\" [1.0] : Relative permeability for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Permittivity\" [1.0] : Relative permittivity for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"LossTan\" [0.0] : Loss tangent for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Conductivity\" [0.0] : Electrical conductivity for this material, S/m. Activates Ohmic loss model in the material domain. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"LondonDepth\" [0.0] : London penetration depth for this material, specified in mesh length units. Activates London equations-based model relating superconducting current and electromagnetic fields in the material domain.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"MaterialAxes\" [[1.0,0.0,0.0], [0.0,1.0,0.0], [0.0,0.0,1.0]] : Axes directions for specification of anisotropic material properties. Required to be unit length and orthogonal.","category":"page"},{"location":"config/domains/#domains[\"Postprocessing\"][\"Dielectric\"]","page":"config[\"Domains\"]","title":"domains[\"Postprocessing\"][\"Dielectric\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\":\n{\n \"Dielectric\":\n [\n {\n \"Index\": ,\n \"Attributes\": []\n },\n ...\n ]\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Index\" [None] : Index of this lossy domain, used in postprocessing output files.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Attributes\" [None] : Integer array of mesh domain attributes for this lossy domain.","category":"page"},{"location":"config/domains/#domains[\"Postprocessing\"][\"Probe\"]","page":"config[\"Domains\"]","title":"domains[\"Postprocessing\"][\"Probe\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\":\n{\n \"Probe\":\n [\n {\n \"Index\": ,\n \"X\": ,\n \"Y\": ,\n \"Z\": \n },\n ...\n ]\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Index\" [None] : Index of this probe, used in postprocessing output files.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"X\" [None] : x-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Y\" [None] : y-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Z\" [None] : z-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"\n","category":"page"},{"location":"examples/examples/#Overview","page":"Overview","title":"Overview","text":"","category":"section"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"Some examples of using Palace, including configuration and mesh files, can be found in the examples/ directory of the source code. The following sections provide complete tutorials for each of the available example applications.","category":"page"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"These examples are also used by Palace's regression testing suite. See the test/ directory for more details.","category":"page"},{"location":"examples/examples/#Contents","page":"Overview","title":"Contents","text":"","category":"section"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"Capacitance Matrix for Two Spheres\nInductance Matrix for a Pair of Concentric Rings\nEigenmodes of a Cylindrical Cavity\nSignal Propagation in a Coaxial Cable\nCrosstalk Between Coplanar Waveguides","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"\n","category":"page"},{"location":"install/#Installation","page":"Installation","title":"Installation","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace can be built and installed using the Spack HPC package manager, following the instructions in the Build using Spack section. Alternatively, compiling from source using CMake is described in Build from source.","category":"page"},{"location":"install/#Build-using-Spack","page":"Installation","title":"Build using Spack","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace is a registered package in the built-in Spack package repository. To install the solver, follow the instructions for setting up Spack on your system and run:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"spack install palace","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"More information about about the available configuration options and dependencies can be found using spack info palace.","category":"page"},{"location":"install/#Build-from-source","page":"Installation","title":"Build from source","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"A build from source requires the following prerequisites installed on your system:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"CMake version 3.18.1 or later\nC++ compiler supporting C++17\nC and (optionally) Fortran compilers for dependency builds\nMPI distribution\nBLAS, LAPACK libraries (described below in Math libraries)","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"In addition, builds from source require the following system packages which are typically already installed and are available from most package managers (apt, dnf, brew, etc.):","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Python 3\npkg-config\nlibunwind (optional)\nzlib (optional)","category":"page"},{"location":"install/#Quick-start","page":"Installation","title":"Quick start","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"To start, clone the code using","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"git clone https://github.com/awslabs/palace.git","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Then, a build using the default options can be performed by running the following from within the directory where the repository was cloned:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"mkdir build && cd build\ncmake ..\nmake -j","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"This installs the binary executable in build/bin/.","category":"page"},{"location":"install/#Configuration-options","page":"Installation","title":"Configuration options","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"To configure a Palace build in using the source code in , run:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"mkdir && cd \ncmake [OPTIONS] ","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Here, [OPTIONS] is a list of options passed to cmake of the form -D=. The Palace build respects standard CMake variables, including:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"CMAKE_CXX_COMPILER, CMAKE_C_COMPILER, and CMAKE_Fortran_COMPILER which define the desired compilers.\nCMAKE_CXX_FLAGS, CMAKE_C_FLAGS, and CMAKE_Fortran_FLAGS which define the corresponding compiler flags.\nCMAKE_INSTALL_PREFIX which specifies the path for installation (if none is provided, defaults to ).\nCMAKE_BUILD_TYPE which defines the build type such as Release, Debug, RelWithDebInfo, and MinSizeRel (Release if not otherwise specified).\nBUILD_SHARED_LIBS which is a flag to create shared libraries for dependency library builds instead of static libraries (OFF by default).\nCMAKE_PREFIX_PATH which lists directories specifying installation prefixes to be searched for dependencies.\nCMAKE_INSTALL_RPATH and CMAKE_INSTALL_RPATH_USE_LINK_PATH which configure the rpath for installed library and executable targets.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Additional build options are (with default values in brackets):","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"PALACE_WITH_64BIT_INT [OFF] : Build with 64-bit integer support\nPALACE_WITH_OPENMP [OFF] : Use OpenMP\nPALACE_WITH_GSLIB [ON] : Build with GSLIB library for high-order field interpolation\nPALACE_WITH_SUPERLU [ON] : Build with SuperLU_DIST sparse direct solver\nPALACE_WITH_STRUMPACK [OFF] : Build with STRUMPACK sparse direct solver\nPALACE_WITH_MUMPS [OFF] : Build with MUMPS sparse direct solver\nPALACE_WITH_SLEPC [ON] : Build with SLEPc eigenvalue solver\nPALACE_WITH_ARPACK [OFF] : Build with ARPACK eigenvalue solver","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"The build step is invoked by running (for example with 4 make threads)","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"make -j 4","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"or","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"cmake --build . -- -j 4","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"which installs the binary executable in ${CMAKE_INSTALL_PREFIX}/bin/.","category":"page"},{"location":"install/#Math-libraries","page":"Installation","title":"Math libraries","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"During the configure step, the build system will try to detect system installations of BLAS and LAPACK libraries depending on the system architecture according to the following procedure:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"For x86_64 systems:\nIf the MKLROOT environment variable is set, looks for an Intel MKL installation.\nIf the AOCL_DIR or AOCLROOT environment variables are set, looks for an AMD Optimizing CPU Libraries (AOCL) installation of BLIS and libFLAME.\nOtherwise, tries to locate an installation of OpenBLAS which is permissively licensed and available from most package managers.\nFor aarch64/arm64 systems:\nIf the ARMPL_DIR environment variable is set, looks for an Arm Performance Libraries (PL) installation.\nOtherwise, tries to locate an installation of OpenBLAS.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"If the installation path of OpenBLAS is non-standard or is not found by default, it can be set using the OPENBLAS_DIR or OPENBLASROOT environment variables, or added to CMAKE_PREFIX_PATH when calling CMake.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"It is recommended in most cases to use a serial BLAS and LAPACK builds (not multithreaded), as the standard parallelization in approach in Palace is to use pure MPI parallelism.","category":"page"},{"location":"install/#Dependencies","page":"Installation","title":"Dependencies","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace leverages the MFEM finite element discretization library. It always configures and builds its own installation of MFEM internally in order to support the most up to date features and patches. Likewise, Palace will always build its own installation of GSLIB, when PALACE_WITH_GSLIB=ON.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"As part of the Build from source, the CMake build will automatically build and install a small number of third-party dependencies before building Palace. The source code for these dependencies is downloaded using using Git submodules. These libraries include:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"METIS and ParMETIS\nHypre\nSuperLU_DIST (optional, when PALACE_WITH_SUPERLU=ON)\nSTRUMPACK (optional, when PALACE_WITH_STRUMPACK=ON), including ButterflyPACK and zfp support\nMUMPS (optional, when PALACE_WITH_MUMPS=ON)\nSLEPc (optional, when PALACE_WITH_SLEPC=ON), including PETSc\nARPACK-NG (optional, when PALACE_WITH_ARPACK=ON)\nnlohmann/json\nfmt\nEigen","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"For solving eigenvalue problems, at least one of SLEPc or ARPACK-NG must be specified. Typically only one of the SuperLU_DIST, STRUMPACK, and MUMPS dependencies is required but all can be built so the user can decide at runtime which solver to use.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"\n","category":"page"},{"location":"guide/model/#Simulation-Models","page":"Simulation Models","title":"Simulation Models","text":"","category":"section"},{"location":"guide/model/#Supported-mesh-formats","page":"Simulation Models","title":"Supported mesh formats","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"The config[\"Model\"] object is used to specify the mesh for the discretized computational domain. In general, inputs are expected to be dimensional nondimensionalized internally. A length scale, specified under config[\"Model\"][\"L0\"], describes the length units of the mesh relative to 1 meter (i.e. config[\"Model\"][\"L0\"]: 1.0e-6 if the mesh coordinates are in mum, this is the default value). All other entries in the configuration file which have units of length should be specified in units of config[\"Model\"][\"L0\"] m.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"MFEM supports a wide variety of mesh formats. In addition, Palace has built-in support for Nastran (.nas, .bdf) and COMSOL (.mphtxt, .mphbin) format mesh files, for both linear and high-order curved elements.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Geometric attributes for domains and boundaries in the mesh are used to define material properties and boundary conditions on the desired model regions and surfaces (see config[\"Domains\"] and config[\"Boundaries\"]). These attribute integers correspond to tags for the domain and boundary elements in the mesh, and should be non-negative and start at 1. They do not need to be contiguous in the mesh file. Throughout the configuration file, the \"Attributes\" keyword is used to indicate which domain or boundary attributes are relevant to the material properties or boundary conditions being specified.","category":"page"},{"location":"guide/model/#Mesh-refinement","page":"Simulation Models","title":"Mesh refinement","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Refinement of the input mesh file can be performed using levels of global uniform refinement or region-based refinement, specified using the config[\"Model\"][\"Refinement\"] object. The user can specify any combination of uniform refinement levels as well as local refinement regions which refines the elements inside of a certain box or sphere-shaped region. For simplex meshes, the refinement maintains a conforming mesh but meshes containing hexahedra, prism, or pyramid elements will be non-conforming after local refinement (this is not supported at this time).","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Adaptive mesh refinement (AMR) according to error estimates in the computed solution is a work in progress for all simulation types.","category":"page"},{"location":"guide/model/#Material-models","page":"Simulation Models","title":"Material models","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Material properties are handled by the config[\"Domains\"][\"Materials\"] object. Palace supports linear, frequency independent constitutive laws for material modeling.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Materials with scalar or general matrix-valued properties are supported. For most simulation types, each material in the model requires a specified relative permittivity and relative permeability (for electrostatic simulations, only the permittivity is required, while for magnetostatics, only the permeability is required). For dielectric domains, a loss tangent may be specified. Alternatively, for normal conducting domains, an electrical conductivity may be specified which is used to relate the current density and electric field via Ohm's law.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Modeling of superconducting domains is performed using the current-field constitutive relations given by the London equations. The user can specify a London penetration depth to activate this model. It can also be used in conjunction with a materal conductivity when wishing to model both superconducting and normal currents.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"\n","category":"page"},{"location":"examples/cavity/#Eigenmodes-of-a-Cylindrical-Cavity","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"note: Note\nThe files for this example can be found in the examples/cavity/ directory of the Palace source code.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"This example demonstrates Palace's eigenmode simulation type to solve for the lowest frequency modes of a cylindrical cavity resonator. In particular, we consider a cylindrical cavity filled with Teflon (varepsilon_r = 208, tandelta = 4times 10^-4), with radius a = 274text cm and height d = 2a. From [1], the frequencies of the textTE_nml and textTM_nml modes are given by","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"beginaligned\nf_textTEnml = frac12pisqrtmuvarepsilon\n sqrtleft(fracp_nmaright)^2 +\n left(fraclpidright)^2 \nf_textTMnml = frac12pisqrtmuvarepsilon\n sqrtleft(fracp_nmaright)^2 +\n left(fraclpidright)^2 \nendaligned","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"where p_nm and p_nm denote the m-th root (mgeq 1) of the n-th order Bessel function (ngeq 0) of the first kind, J_n, and its derivative, J_n, respectively.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In addition, we have analytic expressions for the unloaded quality factors due to dielectric loss, Q_d, and imperfectly conducting walls, Q_c. In particular,","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_d = frac1tandelta","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"and, for a surface resistance R_s,","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_c = frac(ka)^3eta ad4(p_nm)^2 R_s\n left1-left(fracnp_nmright)^2right\n leftfracad2\n left1+left(fracbeta an(p_nm)^2right)^2right +\n left(fracbeta a^2p_nmright)^2\n left(1-fracn^2(p_nm)^2right)right^-1","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"where k=omegasqrtmuvarepsilon, eta=sqrtmuvarepsilon, and beta=lpid.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The initial Gmsh mesh for this problem, from mesh/cavity.msh, is shown below. We use quadratic triangular prism elements.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"There are two configuration files for this problem, cavity_pec.json and cavity_impedance.json.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In both, the config[\"Problem\"][\"Type\"]","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"field is set to \"Eigenmode\", and we use the mesh shown above with a single level of uniform mesh refinement (\"UniformLevels\": 1). The material properties for Teflon are entered under config[\"Domains\"][\"Materials\"]. The config[\"Domains\"][\"Postprocessing\"][\"Dielectric]\" object is used to extract the quality factor due to bulk dielectric loss; in this problem since there is only one domain this is trivial, but in problems with multiple material domains this feature can be used to isolate the energy-participation ratio (EPR) and associated quality factor due to different domains in the model.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The only difference between the two configuration files is in the \"Boundaries\" object: cavity_pec.json prescribes a perfect electric conductor (\"PEC\") boundary condition to the cavity boundary surfaces, while cavity_impedance.json prescribes a surface impedance condition with the surface resistance R_s = 00184text Omegatextsq, for copper at 5text GHz.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In both cases, we configure the eigenvalue solver to solve for the 15 lowest frequency modes above 20text GHz (the dominant mode frequencies for both the textTE and textTM cases fall around 29text GHz frequency for this problem). A sparse direct solver is used for the solutions of the linear system resulting from the spatial discretization of the governing equations, using in this case a second- order finite element space.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The frequencies for the lowest order textTE and textTM modes computed using the above formula for this problem are listed in the table below.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"(nml) f_textTE f_textTM\n(010) –– 2903605text GHz\n(110) –– 4626474text GHz\n(210) –– 6200829text GHz\n(011) 5000140text GHz 3468149text GHz\n(111) 2922212text GHz 5000140text GHz\n(211) 4146842text GHz 6484398text GHz\n(012) 5982709text GHz 4776973text GHz\n(112) 4396673text GHz 5982709text GHz\n(212) 5290341text GHz 7269033text GHz","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"First, we examine the output of the cavity_pec.json simulation. The file postpro/pec/eig.csv contains information about the computed eigenfrequencies and associated quality factors:","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":" m, Re{f} (GHz), Im{f} (GHz), Q\n 1.000000e+00, +2.904507338e+00, +5.809012262e-04, +2.500001089e+03\n 2.000000e+00, +2.922515466e+00, +5.845032101e-04, +2.499999550e+03\n 3.000000e+00, +2.922528546e+00, +5.845057488e-04, +2.499999880e+03\n 4.000000e+00, +3.468921611e+00, +6.937841360e-04, +2.500000721e+03\n 5.000000e+00, +4.147607819e+00, +8.295219962e-04, +2.499998747e+03\n 6.000000e+00, +4.147624590e+00, +8.295263017e-04, +2.499995880e+03\n 7.000000e+00, +4.397698897e+00, +8.795405799e-04, +2.499997775e+03\n 8.000000e+00, +4.397707609e+00, +8.795424791e-04, +2.499997329e+03\n 9.000000e+00, +4.630241197e+00, +9.260492789e-04, +2.499997243e+03\n 1.000000e+01, +4.631850092e+00, +9.263712403e-04, +2.499996752e+03\n 1.100000e+01, +4.778292314e+00, +9.556584905e-04, +2.499999978e+03\n 1.200000e+01, +5.002916952e+00, +1.000583103e-03, +2.500000769e+03\n 1.300000e+01, +5.003637424e+00, +1.000727996e-03, +2.499998774e+03\n 1.400000e+01, +5.005126280e+00, +1.001026744e-03, +2.499996334e+03\n 1.500000e+01, +5.291624557e+00, +1.058325143e-03, +2.499999503e+03","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Indeed we can find a correspondence between the analytic modes predicted and the solutions obtained by Palace. Since the only source of loss in the simulation is the nonzero dielectric loss tangent, we have Q = Q_d = 100004 = 250times 10^3 in all cases.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Next, we run cavity_impedance.json, which adds the surface impedance boundary condition. Examining postpro/impedance/eig.csv we see that the mode frequencies are roughly unchanged but the quality factors have fallen due to the addition of imperfectly conducting walls to the model:","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":" m, Re{f} (GHz), Im{f} (GHz), Q\n 1.000000e+00, +2.904507340e+00, +7.086038246e-04, +2.049457910e+03\n 2.000000e+00, +2.922515467e+00, +7.051671704e-04, +2.072214699e+03\n 3.000000e+00, +2.922528546e+00, +7.051734731e-04, +2.072205452e+03\n 4.000000e+00, +3.468921613e+00, +8.640197955e-04, +2.007431854e+03\n 5.000000e+00, +4.147607821e+00, +9.784798616e-04, +2.119414052e+03\n 6.000000e+00, +4.147624591e+00, +9.784941280e-04, +2.119391720e+03\n 7.000000e+00, +4.397698899e+00, +1.000289498e-03, +2.198213128e+03\n 8.000000e+00, +4.397707610e+00, +1.000292504e-03, +2.198210877e+03\n 9.000000e+00, +4.630241200e+00, +1.054149598e-03, +2.196197451e+03\n 1.000000e+01, +4.631850095e+00, +1.054707045e-03, +2.195799411e+03\n 1.100000e+01, +4.778292317e+00, +1.126015851e-03, +2.121769621e+03\n 1.200000e+01, +5.002916951e+00, +1.085882618e-03, +2.303617807e+03\n 1.300000e+01, +5.003637428e+00, +1.171361603e-03, +2.135821061e+03\n 1.400000e+01, +5.005126284e+00, +1.171895768e-03, +2.135482762e+03\n 1.500000e+01, +5.291624560e+00, +1.207338551e-03, +2.191441950e+03","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"However, the bulk dielectric loss postprocessing results, written to postpro/impedance/domain-Q.csv, still give Q_d = 250times 10^3 for every mode as expected.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Focusing on the textTE_011 mode with f_textTE010 = 500text GHz, we can read the mode quality factor Q = 230times 10^3. Subtracting out the contribution of dielectric losses, we have","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_c = left(frac1Q-frac1Q_dright)^-1 = 293times 10^4","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"which agrees very closely to the analytical result of Q_c = 294times 10^4 given in Example 6.4 from [1] for this geometry.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Finally, a clipped view of the electric field (left) and magnetic flux density magnitudes for the textTE_011 mode is shown below.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n \n
","category":"page"},{"location":"examples/cavity/#Mesh-convergence","page":"Eigenmodes of a Cylindrical Cavity","title":"Mesh convergence","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The effect of mesh size can be investigated for the cylindrical cavity resonator using convergence_study.jl. For a polynomial order of solution and refinement level, a mesh is generated using Gmsh using polynomials of the same order to resolve the boundary geometry. The eigenvalue problem is then solved for f_textTM010 and f_textTE111, and the relative error, fracf-f_texttruef_texttrue, of each mode plotted against textDOF^-frac13, a notional mesh size. Three different element types are considered: tetrahedra, prisms and hexahedra, and the results are plotted below. The x-axis is a notional measure of the overall cost of the solve, accounting for polynomial order.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The observed rate of convergence for the eigenvalues are p+1 for odd polynomials and p+2 for even polynomials. Given the eigenmodes are analytic functions, the theoretical maximum convergence rate is 2p [2]. The figures demonstrate that increasing the polynomial order of the solution will give reduced error, however the effect may only become significant on sufficiently refined meshes.","category":"page"},{"location":"examples/cavity/#References","page":"Eigenmodes of a Cylindrical Cavity","title":"References","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012.\n[2] A. Buffa, P. Houston, I. Perugia, Discontinuous Galerkin computation of the Maxwell eigenvalues on simplicial meshes, Journal of Computational and Applied Mathematics 204 (2007) 317-333.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"\n","category":"page"},{"location":"examples/cpw/#Crosstalk-Between-Coplanar-Waveguides","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"","category":"section"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"note: Note\nThe files for this example can be found in the examples/cpw/ directory of the Palace source code.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"In this example, we construct a frequency domain model to analyze the wave transmission, reflection, near-end crosstalk, and far-end crosstalk for a four-port system comprised of two side-by-side coplanar waveguides (CPW). Each CPW is characterized by a trace width w = 30text μm and gap width s = 18text μm. The metal is modeled as an infinitely thin, perfectly conducting boundary surface on top of a sapphire dielectric substrate (parallel to C-axis: varepsilon_r = 115, tandelta = 86times 10^-5, perpendicular to C-axis: varepsilon_r = 93, tandelta = 30times 10^-5) of 500text μm thickness with the C-axis in the z-direction. This yields a characteristic impedance Z_0 = 5602text Omega for each of the lines [1]. The center-to-center separating distance between the transmission lines on the substrate is 266text μm, which means there is exactly 200text μm of ground plane between them.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"A visualization of the computational domain is shown below.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"There are two different options for modeling the termination at the ends of the CPW:","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Lumped port: A multielement uniform lumped port can be used to terminate the CPW by connecting the center conductor to the ground plane on each side with impedance Z = 2Z_0.\nWave port: We can solve a 2D boundary eigenvalue problem for the mode shape and propagation constants for the characteristic CPW mode, and use this to terminate the transmission line.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Views of the mesh boundaries for these two configurations are shown below. In both cases the computational domain is discretized using an unstructured tetrahedral mesh. The mesh files are mesh/cpw_wave.msh and mesh/cpw_lumped.msh, respectively.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Likewise, there are two different options for how the system response is calculated over the desired frequency band:","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Uniform: Sample the frequency band with the full-fidelity model at equally spaced frequencies over the desired range.\nAdaptive: Use the full-fidelity model to sample the solution at a few adaptively selected frequency points in the desired band, and then construct a low-cost surrogate model which is used to compute the response over the entire band.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"This leads to four possible configurations, for which there are four configuration files in the example directory: cpw_lumped_uniform.json, cpw_lumped_adaptive.json, cpw_wave_uniform.json, and cpw_wave_adaptive.json.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The frequency response is computed for the band fin20300text GHz. For the uniform sweep, a step size of Delta f=20text GHz is used, while the adaptive sweep employs a much finer step size Delta f=01text GHz. The adaptive fast frequency sweep algorithm is given a tolerance of 1times10^-3 for choosing the sampling points; the simulation with uniform ports uses 9 frequency samples and that with wave ports uses 10. Despite the much finer frequency resolution, the adaptive frequency sweep simulations take roughly the same amount of time as the uniform ones where the resulting resolution is worse by a factor of 20. Lastly, for all simulations, a single level of uniform mesh refinement is applied to the initial mesh and a first-order finite element approximation for the solution is used.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The results from the four different simulations are presented in the plots below.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n \n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The first remark is that in both the lumped port and wave port cases, the adaptive fast frequency sweep results are very close to the true solutions sampled by the uniform sweeps.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Second, there is a discrepancy between the results using lumped ports and those with wave ports, namely the lumped port excitation exhibits much higher reflection that that for wave ports. This can be attributed to the coarse meshes used for these examples. Indeed, refining the mesh or increasing the order of the solution approximation resolves this issue and leads to better agreement between the lumped port and wave port results. See below for the results with again a single level of mesh refinement but p = 2 for the order of the solution space.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n \n \n
","category":"page"},{"location":"examples/cpw/#References","page":"Crosstalk Between Coplanar Waveguides","title":"References","text":"","category":"section"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"[1] H. J. Visser, Antenna Theory and Applications, Wiley, Hoboken, NJ, 2012.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"\n","category":"page"},{"location":"guide/postprocessing/#Postprocessing-and-Visualization","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"As described in the section Problem Types, each simulation type writes relevant postprocessed scalar quantities to disk in the directory specified by config[\"Problem\"][\"Output\"], including but not limited to computed values like eigenfrequencies, scattering parameters, or lumped element parameters. In addition, each simulation type will write a file called domain-E.csv, which includes information about the electric and magnetic field energies, as well as lumped element energies, for each step of the simulation (eigenmode, frequency, or time step, for examples).","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"The participation ratios for bulk dielectrics and interface dielectric layers can be computed for simulations involving the electric field. For model boundaries, the integrated surface charge or magnetic flux can also be postprocessed. These features are described in Domain postprocessing and in Boundary postprocessing.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Additionally, the computed fields can be automatically probed for their vector values at one or more points in space. This probe functionality is also described in Domain postprocessing.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Finally, as described further in Visualization, various field quantities on the 3D computational domain as well as 2D domain boundaries and material interfaces are written to disk when requested using the relevant parameters under config[\"Solver\"]. These fields are meant to be visualized with ParaView.","category":"page"},{"location":"guide/postprocessing/#Domain-postprocessing","page":"Postprocessing and Visualization","title":"Domain postprocessing","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Domain postprocessing capabilities are enabled by including objects under config[\"Domains\"][\"Postprocessing\"] in the configuration file. These include:","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"config[\"Domains\"][\"Postprocessing\"][\"Dielectric\"] : Postprocessess bulk dielectric loss based on the participation ratio of the electric field in a lossy region. The respective participation ratios and quality factors for each domain (associated with the specified domain attributes and indexed by the specified integer \"Index\") are computed using the material properties provided and are written to domain-Q.csv in the specified postprocessing output directory.\nconfig[\"Domains\"][\"Postprocessing\"][\"Probe\"] : Probe the values of the computed electric field and magnetic flux density solutions at specified locations in the computational domain. The availability of the bmE and bmB fields depends on the problem type (for example, for magnetostatic problems, only bmB is output and bmE is not computed, whereas the inverse is true for electrostatics). For each computed field, the postprocessed values are written to probe-E.csv and probe-B.csv in the specified output directory.","category":"page"},{"location":"guide/postprocessing/#Boundary-postprocessing","page":"Postprocessing and Visualization","title":"Boundary postprocessing","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Boundary postprocessing capabilities are enabled by including objects under config[\"Boundaries\"][\"Postprocessing\"] in the configuration file. These include:","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"config[\"Boundaries\"][\"Postprocessing\"][\"Capacitance\"] : Postprocess the integral of the surface charge on a surface defined by a list of boundary attributes, and divide by the excitation voltage to get the capacitive coupling. The resulting capcitances are written to surface-C.csv in the specified output directory.\nconfig[\"Boundaries\"][\"Postprocessing\"][\"Inductance\"] : Postprocess the magnetic flux through a surface defined by a list of boundary attributes, and divide by the excitation current to the inductive coupling. The resulting inductances are written to surface-M.csv in the specified output directory.\nconfig[\"Boundaries\"][\"Postprocessing\"][\"Dielectric\"] : Postprocesses interface dielectric loss at surfaces of the model by specifying the interface thickness, permittivity, and loss tangent. See https://arxiv.org/pdf/1509.01854.pdf or https://aip.scitation.org/doi/10.1063/1.3637047 for more information. The participation ratios and associated quality factors are written to the file surface-Q.csv in the specified output directory.","category":"page"},{"location":"guide/postprocessing/#Visualization","page":"Postprocessing and Visualization","title":"Visualization","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"When specified in the configuration file, the electric field and magnetic flux density solutions are written to disk for 3D visualization with ParaView. Various other postprocessed fields are also written to the ParaView database as available, including electric and magnetic energy density, surface currents, and charge density. These files are found in the paraview/ directory located in the output directory specified under config[\"Problem\"][\"Output\"].","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"In addition to the full 3D fields, a ParaView data collection for the boundary mesh is also written to disk. The boundary mesh includes all surfaces with prescribed boundary conditions as well as any material interfaces in the computational domain.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"\n","category":"page"},{"location":"run/#Running-*Palace*","page":"Running Palace","title":"Running Palace","text":"","category":"section"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"Once installed into a directory , a parallel simulation using Palace can be started with the following command:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"/bin/palace -np config.json","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"where","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"The installed palace script wraps a call to the desired MPI launcher (mpirun by default).\n is the number of MPI processes to use for the simulation.\nconfig.json is the JSON format configuration file used to specify the simulation parameters. The structure of this configuration file is outlined in detail in the section Configuration File.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"A full list of available script options is available using the -h or --help flag.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"During the course of a simulation, the solver will write a number of useful statistics and logging information to standard output. It is often helpful to save this information to a file, for example with:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"/bin/palace ... | tee log.out","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"Of course, the interested user can explicitly run the Palace binary in parallel, supplying options directly to their MPI launcher of choice, as:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":" [OPTIONS] /bin/palace-.bin config.json","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"where is the MPI launcher command, [OPTIONS] is a list of command line options passed to the MPI launcher, and is the machine architecture (x86_64 or arm64).","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"\n","category":"page"},{"location":"developer/#Developer-Notes","page":"Developer Notes","title":"Developer Notes","text":"","category":"section"},{"location":"developer/#Style-guide","page":"Developer Notes","title":"Style guide","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"Automated source code formatting is performed using clang-format. Run:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"./scripts/format_source","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"in the repository root directory to automatically use clang-format to format C++ source as well as JuliaFormatter.jl for Julia and Markdown files. The script can be viewed in the repository.","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"The following conventions also apply:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"PascalCase for classes and function names.\nFollow 'include what you use' (IWYU), with the include order dictated by the Google C++ Style Guide. This order should be automatically enforced by the clang-format style file.\nCode comments should be full sentences, with punctuation. At this time, no Doxygen API reference is generated and so comments generally do not need to conform to Doxygen syntax.","category":"page"},{"location":"developer/#Static-analysis","page":"Developer Notes","title":"Static analysis","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"During the cmake configuration step, definining the variables ANALYZE_SOURCES_CLANG_TIDY and ANALYZE_SOURCES_CPPCHECK to ON will turn on static analysis using clang-tidy and cppcheck, respectively, during the build step. This requires the executables to be installed and findable by CMake on your system.","category":"page"},{"location":"developer/#JSON-Schema-for-configuration-files","page":"Developer Notes","title":"JSON Schema for configuration files","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"A JSON format configuration file, for example named config.json, can be validated against the provided Schema using:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"./scripts/validate_config config.json","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"This script uses Julia's JSONSchema.jl and the Schema provided in scripts/schema/ to parse the configuration file and check that the fields are correctly specified. This script and the associated Schema are also installed and can be accessed in /bin.","category":"page"},{"location":"developer/#Changelog","page":"Developer Notes","title":"Changelog","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"Code contributions should generally be accompanied by an entry in the changelog.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"\n","category":"page"},{"location":"guide/problem/#Problem-Types","page":"Problem Types","title":"Problem Types","text":"","category":"section"},{"location":"guide/problem/#Eigenmode-problems","page":"Problem Types","title":"Eigenmode problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For eigenmode simulations, config[\"Problem\"][\"Type\"]: \"Eigenmode\", the user should specify a nonzero (but arbitrarily small) frequency above which to search for eigenmodes. The computed eigenvalues are written to an ASCII file named eig.csv, in the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"Calculations related to energy-participation ratio (EPR) quantization can be performed with Palace when the user specifies lumped ports corresponding to the linearized lumped circuit elements in the model. In this case, the participation matrix for inductive elements is automatically generated for the specified number of modes and number of inductive lumped ports. The participation matrix is output in an ASCII file named port-EPR.csv.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The EPR framework can be used to characterize the dissipative elements in the model as well. In particular, lumped ports with nonzero resistance in the model will trigger coupling rate and quality factor calculations based on input-output (I-O) line coupling loss: By specifying resistive lumped ports in the model, the mode coupling quality factors will be computed as Q_ml = omega_mkappa_ml. The output file port-Q.csv will be created in the output directory containing these mode qualty factor contributions. For bulk and interface dielectric loss calculations, which are not unique to the eigenmode simulation type, see the sections Domain postprocessing and Boundary postprocessing.","category":"page"},{"location":"guide/problem/#Driven-problems-in-the-frequency-domain","page":"Problem Types","title":"Driven problems in the frequency domain","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For frequency domain driven simulations, config[\"Problem\"][\"Type\"]: \"Driven\", the model is excited by a time harmonic incident field (port boundary) or surface current. The user can specify a port excitation using lumped ports or numeric wave ports.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The default frequency sweep behavior for frequency domain driven simulations is to perform a uniform sampling from the minimum to the maximum specified frequency of interest, using the user specified step size. An adaptive fast frequency sweep strategy can also be used, activated by specifying a nonzero value for \"AdaptiveTol\" under the config[\"Solver\"][\"Driven\"] object. In this case, using the high-dimensional model solution computed at a few automatically selected frequency samples, a low-cost model is constructed and used to compute the frequency response over the entire frequency range of interest. The specified error tolerance ensures that the approximate low-cost model is reliably accurate relative to the high-dimensional model within the frequency band of interest. This is particularly useful for fine-resolution sweeps containing many sample points, where it can yield a significant speedup over the default strategy.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"Port scattering parameters, or S-parameters, are postprocessed for the column of the scattering matrix corresponding to the driven port index automatically for this simulation type and stored in an ASCII file named port-S.csv, in the directory specified by config[\"Problem\"][\"Output\"]. In the case that more than a single lumped or wave port is excited or surface current excitations are used, scattering parameter output will be disabled for the simulation(though other quantities of interest are still postprocessed). When lumped ports are present, the peak complex lumped port voltages and currents computed for each excitation frequency are written to ASCII files named port-V.csv and port-I.csv, respectively, Additionally, the surface current excitations are written to surface-I.csv.","category":"page"},{"location":"guide/problem/#Driven-problems-in-the-time-domain","page":"Problem Types","title":"Driven problems in the time domain","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The previous simulation types describe simulations based on frequency domain formulations of Maxwell's equations. Time domain simulations are also possible through the transient simulation type: config[\"Problem\"][\"Type\"]: \"Transient\". Similar to the driven simulation type in the frequency domain, transient simulations involve simulating the response of the system to a time-dependent excitation field specified at lumped ports or surface current excitations in the model. The system is always started from rest with zero initial conditions and time-integrated for a user specified duration, given in nanoseconds. There are several available excitation types which define the time dependence of the pulse or excitation waveform. These are specified under the config[\"Solver\"][\"Transient\"] object using the \"Excitation\" keyword.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The time histories of the lumped port voltages and currents are postprocessed and automatically written to ASCII files named port-V.csv and port-I.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. Additionally, surface current excitation time histories are written to surface-I.csv.","category":"page"},{"location":"guide/problem/#Electrostatic-problems","page":"Problem Types","title":"Electrostatic problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For electrostatic simulations, (config[\"Problem\"][\"Type\"]: \"Electrostatic\", the user should specify a number of terminal boundaries (config[\"Boundaries\"][\"Terminal\"]) as well as boundaries which are grounded (config[\"Boundaries\"][\"Ground\"]). For each terminal, an electrostatic field is computed by assigning the terminal of interest a positive nonzero voltage and all other terminals and grounded boundaries a zero voltage. The resulting fields are then used to compute the Maxwell capacitance matrix and its inverse, which are written to an ASCII file named terminal-C.csv and terminal-Cinv.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. The mutual capacitance matrix is also computed and written to terminal-Cm.csv in the same directory.","category":"page"},{"location":"guide/problem/#Magnetostatic-problems","page":"Problem Types","title":"Magnetostatic problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For magnetostatic simulations, (config[\"Problem\"][\"Type\"]: \"Magnetostatic\", the user should specify a number of source current boundaries. For each current source, a magnetostatic field is computed by applying a unit current to the source index of interest, leaving all other sources open with no excitation. Surfaces which are expected to carry current should be labeled as perfectly conducting, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The resulting fields are used to compute the inductance matrix and its inverse, which are written to an ASCII file named terminal-M.csv and terminal-Minv.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. A \"mutual\" inductance matrix which has the same form as the mutual capacitance matrix (its entries are based on current differences between ports rather than absolute currents) is computed and written to terminal-Mm.csv in the same directory.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\n","category":"page"},{"location":"config/model/#config[\"Model\"]","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"","category":"section"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Model\":\n{\n \"Mesh\": \n \"L0\": ,\n \"Lc\": ,\n \"Refinement\":\n {\n ...\n }\n}","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"with","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Mesh\" [None] : Input mesh file path, an absolute path is recommended.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"L0\" [1.0e-6] : Mesh vertex coordinate length unit, m.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Lc\" [0.0] : Characteristic length scale used for nondimensionalization, specified in mesh length units. A value less than or equal to zero uses an internally calculated length scale based on the bounding box of the computational domain.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Refinement\" : Top-level object for configuring mesh refinement.","category":"page"},{"location":"config/model/#model[\"Refinement\"]","page":"config[\"Model\"]","title":"model[\"Refinement\"]","text":"","category":"section"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Refinement\":\n{\n \"UniformLevels\": ,\n \"Boxes\":\n [\n {\n \"Levels\": ,\n \"XLimits\": [],\n \"YLimits\": [],\n \"ZLimits\": []\n },\n ...\n ],\n \"Spheres\":\n [\n {\n \"Levels\": ,\n \"Center\": [],\n \"Radius\": float\n },\n ...\n ]\n}","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"with","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"UniformLevels\" [0] : Levels of uniform parallel mesh refinement to be performed on the input mesh.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Boxes\" : Array of box region refinement objects. All elements with a node inside the box region will be marked for refinement.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Spheres\" : Array of sphere region refinement objects. All elements with a node inside the sphere region will be marked for refinement.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Levels\" [0] : Levels of parallel mesh refinement inside the specified refinement region.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"XLimits\" [None] : Floating point array of length 2 specifying the limits in the x-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"YLimits\" [None] : Floating point array of length 2 specifying the limits in the y-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"ZLimits\" [None] : Floating point array of length 2 specifying the limits in the z-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Center\" [None] : Floating point array of length equal to the model spatial dimension specfiying the center coordinates of the sphere for this sphere refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Radius\" [None] : The radius of the sphere for this sphere refinement region, specified in mesh length units.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"\n","category":"page"},{"location":"guide/boundaries/#Boundary-Conditions","page":"Boundary Conditions","title":"Boundary Conditions","text":"","category":"section"},{"location":"guide/boundaries/#Perfect-electric-conductor-(PEC)-boundary","page":"Boundary Conditions","title":"Perfect electric conductor (PEC) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The perfect electric conductor (PEC) boundary condition (zero tangential electric field) is specified using the \"PEC\" boundary keyword under config[\"Boundaries\"]. It is a homogeneous Dirichlet boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"For electrostatic simulations, the homogeneous Dirichlet boundary condition is prescribed using the \"Ground\" boundary keyword which prescribes zero voltage at the boundary.","category":"page"},{"location":"guide/boundaries/#Perfect-magnetic-conductor-(PMC)-boundary","page":"Boundary Conditions","title":"Perfect magnetic conductor (PMC) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The perfect magnetic conductor (PMC) boundary condition (zero tangential magnetic field) is a homogenous Neumann boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation. It is the natural boundary condition and thus it has the same effect as not specifying any additional boundary condition on external boundary surfaces. It can also be explicitly specified using the \"PMC\" boundary keyword under config[\"Boundaries\"].","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Likewise, for electrostatic simulations, the homogeneous Neumann boundary condition implies a zero-charge boundary, and thus zero gradient of the voltage in the direction normal to the boundary. This is specified using the \"ZeroCharge\" boundary keyword under config[\"Boundaries\"].","category":"page"},{"location":"guide/boundaries/#Impedance-boundary","page":"Boundary Conditions","title":"Impedance boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The impedance boundary condition is a mixed (Robin) boundary condition and is available for the frequency or time domain finite element formulations and thus for eigenmode or frequency or time domain driven simulation types. It is specified using the \"Impedance\" boundary keyword. The surface impedance relating the tangential electric and magnetic fields on the boundary is computed from the parallel impedances due to the specified resistance, inductance, and capacitance per square.","category":"page"},{"location":"guide/boundaries/#Absorbing-(scattering)-boundary","page":"Boundary Conditions","title":"Absorbing (scattering) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Absorbing boundary conditions at farfield boundaries, also referred to as scattering boundary conditions, can be applied using the \"Absorbing\" boundary keyword under config[\"Boundaries\"]. The first-order absorbing boundary condition is a special case of the above impedance boundary and is available for eigenmode or frequency or time domain driven simulation types. The second-order absorbing boundary condition is only available for frequency domain driven simulations.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Perfectly matched layer (PML) boundaries for frequency and time domain electromagnetic formulations are not yet implemented, but are common in solvers for computational electromagnetics and will be a useful addition.","category":"page"},{"location":"guide/boundaries/#Finite-conductivity-boundary","page":"Boundary Conditions","title":"Finite conductivity boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"A finite conductivity boundary condition can be specified using the \"Conductivty\" boundary keyword. This boundary condition models the effect of a boundary with non-infinite conductivity (an imperfect conductor) for conductors with thickness much larger than the skin depth. It is available only for frequency domain driven simulations.","category":"page"},{"location":"guide/boundaries/#Lumped-and-wave-port-excitation","page":"Boundary Conditions","title":"Lumped and wave port excitation","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"config[\"Boundaries\"][\"LumpedPort\"] : A lumped port applies a similar boundary condition to a surface impedance boundary, but takes on a special meaning for each simulation type.\nFor frequency domain driven simulations, ports are used to provide a lumped port excitation and postprocess voltages, currents, and scattering parameters. Likewise, for transient simulations, they perform a similar purpose but for time domain computed quantities.\nFor eigenmode simulations where there is no excitation, lumped ports are used to specify properties and postprocess energy-participation ratios (EPRs) corresponding to linearized circuit elements.\nNote that a single lumped port (given by a single integer \"Index\") can be made up of multiple boundary attributes in the mesh in order to model, for example, a multielement lumped port.\nconfig[\"Boundaries\"][\"WavePort\"] : Numeric wave ports are available for frequency domain driven simulations. In this case, a port boundary condition is applied with an optional excitation using a modal field shape which is computed by solving a 2D boundary mode eigenproblem on each wave port boundary. This allows for more accurate scattering parameter calculations when modeling waveguides or transmission lines with arbitrary cross sections.\nThe homogenous Dirichlet boundary conditions for the wave port boundary mode analysis are taken from the \"PEC\" boundaries of the full 3D model, as well as any optional additional boundary attributes given under \"WavePortPEC\". Any boundary of the wave port not labeled with with a PEC condition has the natural boundary condition for zero tangential magnetic field prescribed for the purpose of port mode calculation.\nUnlike lumped ports, wave port boundaries cannot be defined internal to the computational domain and instead must exist only on the outer boundary of the domain (they are to be \"one-sided\" in the sense that mesh elements only exist on one side of the boundary).","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The incident field excitation at a lumped or wave port is controlled by setting config[\"Boundaries\"][\"LumpedPort\"][][\"Excitation\"]: true or config[\"WavePort\"][][\"Excitation\"]: true for that port. The excitation for each port is defined to have unit incident power over the port boundary surface.","category":"page"},{"location":"guide/boundaries/#Surface-current-excitation","page":"Boundary Conditions","title":"Surface current excitation","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"An alternative source excitation to lumped or wave ports for frequency and time domain driven simulations is a surface current excitation, specified under config[\"Boundaries\"][\"SurfaceCurrent\"]. This is the excitation used for magnetostatic simulation types as well. This option prescribes a unit source surface current excitation on the given boundary in order to excite the model. It does does not prescribe any boundary condition to the model and only affects the source term on the right hand side.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"\n","category":"page"},{"location":"examples/spheres/#Capacitance-Matrix-for-Two-Spheres","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"","category":"section"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"note: Note\nThe files for this example can be found in the examples/spheres/ directory of the Palace source code.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"In this example, we consider two conducting spheres of radii a and b, with centers separated by a distance c a + b. The surrounding medium is vacuum. An analytic solution for the capacitance matrix of this configuration exists and is given in [1]. The Maxwell capacitance matrix entries are given by the infinite series","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"beginaligned\nC_aa = 4pivarepsilon_0 ab sinhusum_n=0^infty frac1asinhnu+bsinh(n+1)u \nC_bb = 4pivarepsilon_0 ab sinhusum_n=0^infty frac1bsinhnu+asinh(n+1)u \nC_ab = -4pivarepsilon_0 fracabc sinhusum_n=1^infty frac1sinhnu\nendaligned","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"where the subscript a refers to the sphere with radius a and likewise for b. The parameter u is given by","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"coshu = fracc^2-a^2-b^22ab ","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Here we take the values a = 1text cm, b = 2text cm, and c = 5text cm. A mesh is generated with Gmsh using the mesh.jl Julia script found in the mesh/ directory, which writes the mesh to mesh/spheres.msh. The resulting high-order mesh uses cubically-curved tetrahedral elements, and is pictured below.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"
\n \n \n
","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The configuration file for the Palace simulation is found in spheres.json. We set the simulation \"Type\" to \"Electrostatic\", and add \"Terminal\" entries for the surface boundary of each sphere, corresponding to the entries of the capacitance matrix we wish to compute. The outer boundary of the computational domain, which is sufficiently far from the spheres, is prescribed a \"Ground\" boundary condition. We set the \"Order\" of the finite element approximation to 3.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The resulting extracted Maxwell capacitance matrix is saved to disk in the CSV file postpro/terminal-C.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C[i][1] (F), C[i][2] (F)\n 1.000000e+00, +1.237470540e-12, -4.771229894e-13\n 2.000000e+00, -4.771229894e-13, +2.478512490e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"In this case, the analytic solution yields","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"beginaligned\nC_aa = +1230518text pF \nC_bb = +2431543text pF \nC_ab = -04945668text pF\nendaligned","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"which is computed using the first n=12 terms in the series after which convergence to a relative tolerance of 10^-12 is reached. Thus, the errors in the capacitance coefficients by Palace are 057, 19, and 35, respectively.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The mutual capacitance matrix can be computed from its Maxwell counterpart, and is saved in postpro/terminal-Cm.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C_m[i][1] (F), C_m[i][2] (F)\n 1.000000e+00, +7.603475504e-13, +4.771229894e-13\n 2.000000e+00, +4.771229894e-13, +2.001389500e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Additionally, while the typical approach used by Palace for lumped parameter extraction uses the computed field energies, the capacitance can also be calculated by directly integrating the charge on a boundary surface and dividing by the excitation voltage. The configuration file for this example contains this information under config[\"Boundaries\"][\"Postprocessing\"][\"Capacitance\"]. The resulting capacitances are written to postpro/surface-C.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C[1] (F), C[2] (F)\n 1.000000e+00, +1.210962236e-12, -4.677852948e-13\n 2.000000e+00, -4.669431918e-13, +2.425918151e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"and agree closely with the values computed using the default method above, as expected.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Finally, the postpro/paraview directory contains files for visualizing the computed field solutions with ParaView. Below we present the electrostatic potential fields for each terminal solution.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"
\n \n \n
","category":"page"},{"location":"examples/spheres/#References","page":"Capacitance Matrix for Two Spheres","title":"References","text":"","category":"section"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"[1] J. Lekner, Capacitance coefficients of two spheres, Journal of Electrostatics 69 (2011) 11-14.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"\n","category":"page"},{"location":"reference/#Reference","page":"Reference","title":"Reference","text":"","category":"section"},{"location":"reference/#Mathematical-background","page":"Reference","title":"Mathematical background","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The solver computes a finite element approximation to the three-dimensional, time-harmonic Maxwell's equations in second-order form. The nondimensionalized, source-free, boundary value problem for bmE(bmx)inmathbbC^3, bmxinOmega, partialOmega=Gamma, where bmmathscrE(bmxt) = textRebmE(bmx)e^iomega t denotes the electric field, is written as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablatimesmu_r^-1nablatimesbmE + iomegasigmabmE\n - omega^2varepsilon_rbmE = 0 bmxinOmega \nbmntimesbmE = 0 bmxinGamma_PEC \nbmntimes(mu_r^-1nablatimesbmE) = 0 bmxinGamma_PMC \nbmntimes(mu_r^-1nablatimesbmE)\n + gammabmntimes(bmntimesbmE) = bmU^inc bmxinGamma_Z\nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the nondimensionalization has been performed with respect to a characteristic length L_0, time L_0c_0, magnetic field strength H_0, and electric field strength Z_0 H_0. Here, c_0 and Z_0 are the speed of light and impedance of free space, respectively. Given the electric field solution, the time-harmonic magnetic flux density can be calculated as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmB = -frac1iomeganablatimesbmE ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The flux density is related to the magnetic field, bmH, by the standard linear consitutive relationship bmH = mu_r^-1bmB.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For a general isotropic lossy dielectric, the relative permittivity varepsilon_r is a complex scalar:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"varepsilon_r = varepsilon_r (1-itandelta)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where varepsilon_r is the real relative permittivity and tandelta is the loss tangent. Alternatively, conductor loss is modeled by Ohm's law bmJ=sigmabmE with electrical conductivity sigma00. For a superconducting domain, the constitive current-field relationship given by Ohm's law is replaced by that given by the London equations:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"fracpartial bmJpartial t=frac1mu_rlambda_L^2bmE","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where lambda_L = sqrtmmu n_s e^2L_0 is the nondimensionalized London penetration depth. In this case, the term +iomegasigma bmE arising for a normal conductor in the time-harmonic Maxwell's equations becomes +(mu_r lambda_L^2)^-1bmE.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The domain boundary Gamma=Gamma_PECcupGamma_PMCcupGamma_Z, is separated into perfect electric conductor (PEC), perfect magnetic conductor (PMC), and impedance boundaries, respectively. The PEC boundary condition is a homogenous Dirichlet condition, while the PMC boundary condition is the natural boundary condition for the problem and is satisfied at all exterior boundaries by the finite element formulation. Impedance boundaries are modeled using a Robin boundary condition with gamma = iomegaZ_s, in which Z_s the surface impedance of the boundary, with units of impedance per square.","category":"page"},{"location":"reference/#Time-domain-formulation","page":"Reference","title":"Time domain formulation","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"A time-dependent formulation is also available to compute the electric field response bmE(bmxt) for a given time-dependent source excitation bmU^inc(bmxt). The governing equations in this case are","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"nablatimesmu_r^-1nablatimesbmE + sigmafracpartialbmEpartial t\n + varepsilon_rfracpartial^2bmEpartial t^2 = 0 bmxinOmega","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"subject to the same boundary conditions as the frequency-dependent case except for the Robin boundary condition which is written for a lumped resistive port boundary, for example, as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmntimes(mu_r^-1nablatimesbmE)\n + Z_s^-1bmntimesleft(bmntimesfracpartialbmEpartial tright)\n = bmU^inc bmxinGamma_Z ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The second-order electric field formulation is chosen to take advantage of unconditionally stable implicit time-integration schemes without the expense of a coupled block system solve for bmE(bmxt) and bmB(bmxt). It offers the additional benefit of sharing many similarities in the spatial discretization as the frequency domain formulation outlined above.","category":"page"},{"location":"reference/#Lumped-ports-and-wave-ports","page":"Reference","title":"Lumped ports and wave ports","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For lumped port boundaries, the surface impedance can be related to an equivalent circuit impedance, Z. There are two common cases:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: Z = Z_s l w, where l and w are the length and width of the port, respectively (length here is defined as the distance between the two conductors).\nCoaxial ports: Z = Z_s ln(ba) 2pi, where a and b denote the inner and outer radii of the port, respectively.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"A lumped parallel RLC circuit boundary has a circuit impedance","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Z = frac1R+frac1iomega L+iomega C ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Thus, the relationships between the circuit and surface element parameters for the user to specify are given by R_s = alpha R, L_s = alpha L, and C_s = Calpha, where alpha = wl for a rectangular port or alpha = 2pi ln(ba) for a coaxial port.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For multielement lumped ports, the effective circuit impedance is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Z = sum_k frac1Z_k ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"That is, the circuit impedances of each port contributing to the multielement port add in parallel. For the specific case of a two element multielement port with two identical lumped elements, we have Z = (1Z_1 + 1Z_2)^-1 = Z_k 2, where Z_k is the circuit impedance of a single port element.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The source term bmU^inc in a driven frequency-response problem is related to the incident field at an excited port boundary by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmU^inc = -2gamma(bmntimesbmE^inc)timesbmn","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where (bmntimesbmE^inc)timesbmn is just the projection of the excitation field onto the port surface. The incident fields for lumped ports depend on the port shape:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: bmE^inc = E_0 hatbml, where E_0 is a uniform constant field strength and hatbml a unit vector defining the direction of polarization on the port (typically should be the direction between the two conductors).\nCoaxial ports: bmE^inc = fracE_0 r_0r hatbmr, where E_0 is again a uniform constant field strength, r_0 is a characteristic length for the port, r is the distance from the port center, and hatbmr a unit vector specifying the port radial direction.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the time domain formulation, the source term bmU^inc appears as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmU^inc = -2 Z_s^-1left(bmntimesfracpartialbmE^incpartial tright)\n timesbmn ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The incident field bmE^inc(bmxt) is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmE^inc(bmxt) = p(t)bmE^inc(bmx)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE^inc(bmx) is identical to the spatial excitation in the frequency domain formulation, and p(t) describes the temporal shape of the excitation. Possible options include a sinusoidal, Gaussian, modulated Gaussian, or step excitation.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the frequency domain, the scattering parameters can be postprocessed from the computed electric field for each lumped port with boundary Gamma_i as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"S_ij = fracdisplaystyleint_Gamma_ibmEcdotbmE^inc_idS\n displaystyleint_Gamma_ibmE^inc_icdotbmE^inc_idS - delta_ij ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the time domain, the time histories of the port voltages can be Fourier-transformed to get their frequency domain representation for scattering parameter calculation.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Numeric wave ports assume a field with known normal-direction dependence bmE(bmx)=bme(bmx_t)e^ik_n x_n where k_n is the propagation constant. For each operating frequency omega, a two-dimensional eigenvalue problem is solved on the port yielding the mode shapes bme_m and associated propagaton constants k_nm. These are used in the full 3D model where the Robin port boundary condition has coefficient gamma=itextRek_nmmu_r and the computed mode is used to compute the incident field in the source term bmU^inc at excited ports. Scattering parameter postprocessing takes the same form as the lumped port counterpart using the computed modal solutions. Since the propagation constants are known for each wave port, scattering parameter de-embedding can be performed by specifying an offset distance d for each port:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"tildeS_ij = S_ije^ik_nid_ie^ik_njd_j ","category":"page"},{"location":"reference/#Eigenmode-calculations","page":"Reference","title":"Eigenmode calculations","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For eigenmode problems, the source term is zero and a quadratic eigenvalue problem for the eigenvalues omega is solved:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"(bmK+iomegabmC-omega^2bmM)bmx = 0","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the matrix bmK represents the discretized curl-curl operator, bmM the mass term, and bmC the port impedance boundary conditions. The damped frequency omega_d and quality factor Q is postprocessed from each of the resulting eigenvalues as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"omega_d = textReomega qquad Q = fracomega2textImomega ","category":"page"},{"location":"reference/#Energy-participation-ratios","page":"Reference","title":"Energy-participation ratios","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The energy-participation ratio (EPR) for lumped inductive elements is computed from the electric and magnetic fields corresponding to eigenmode m, bmE_m and bmH_m, using the formula","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"p_mj = frac1mathcalE^elec_m frac12 L_j I_mj^2","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where p_mjin-11 denotes the signed participation ratio for junction j in mode m, L_j is the provided junction circuit inductance, I_ mj is the peak junction current for mode m, and mathcalE^elec_m is the electric energy in mode m. The junction current is computed using the mean voltage across the port, overlineV_mj, as I_mj = overlineV_mjZ_mj, where Z_mj = 1(iomega_m L_j) is the impedance of the inductive branch of the lumped circuit. The mean port voltage depends on the computed electric field mode and the shape of the port:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: overlineV_mj = frac1w_jint_Gamma_jbmE_mcdothatbml_jdS.\nCoaxial ports: overlineV_mj = frac12piint_Gamma_jfracbmE_mrcdothatbmr_jdS.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Finally, the total electric energy in mode m is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE^elec_m\n = frac12 textReleftint_OmegabmD_m^*cdotbmE_mdVright\n + sum_j frac12 C_jV_mj^2","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmD_m=varepsilon_rbmE_m is the electric flux density for mode m and the second term on the right-hand side accounts for any lumped capacitive boundaries with nonzero circuit capacitance C_j.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The EPR can also be used to estimate mode quality factors due to input-output(I-O) line coupling. The mode coupling quality factor due to the j-th I-O port is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Q_mj = fracomega_mkappa_mj","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the port coupling rate kappa_mj is calculated as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"kappa_mj = frac1mathcalE^elec_m frac12R_j I_mj^2 ","category":"page"},{"location":"reference/#Bulk-and-interface-dielectric-loss","page":"Reference","title":"Bulk and interface dielectric loss","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The quality factor due to bulk dielectric loss resulting from an electric field bmE present in domain j with associated loss tangent tandelta_j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q_j = p_j tandelta_j =\n frac1mathcalE^elec frac12 tandelta_j \n textReleftint_Omega_jbmD^*cdotbmEdVright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where, as above, mathcalE^elec is the total electric field energy in the domain, including the contributions due to capacitive lumped elements.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Likewise, the quality factor due to surface interface dielectric loss for interface j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q_j = p_j tandelta_j =\n frac1mathcalE^elec frac12 t_jtandelta_j \n textReleftint_Gamma_jbmD^*cdotbmEdSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where t_j is the thickness of the layer and bmD = varepsilon_rjbmE is the electric displacement field in the layer evaluated using the relative permittivity of the interface varepsilon_rj. For an internal boundary, this integral is evaluated on a single side to resolve abiguity due to the discontinuity of bmE across the boundary.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The above formula for interface dielectric loss can be specialized for the case of a metal-air, metal-substrate, or substrate-air interface. In each case, the quality factor for interface j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Metal-air:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^MA_j =\n frac1mathcalE^elec frac12 \n fract_jtandelta_jvarepsilon_rj^MA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Metal-substrate:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^MS_j =\n frac1mathcalE^elec frac12 \n fract_jtandelta_j(varepsilon_rj^S)^2varepsilon_rj^MA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Substrate-air:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^SA_j =\n frac1mathcalE^elec frac12 \n t_jtandelta_jleft(varepsilon_rj^SA \n textReleftint_Gamma_jbmE_t^*cdotbmE_tdSright\n + frac1varepsilon_rj^SA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSrightright)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE_n denotes the normal field to the interface and bmE_t=bmE-bmE_n denotes the tangential field.","category":"page"},{"location":"reference/#Lumped-parameter-extraction","page":"Reference","title":"Lumped parameter extraction","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For electrostatic simulations, the Maxwell capacitance matrix is computed in the following manner. First, the Laplace equation subject to Dirichlet boundary conditions is solved for each terminal with boundary Gamma_i in the model, yielding an associated voltage field V_i(bmx):","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablacdot(varepsilon_rnabla V_i) = 0 bmxinOmega \nV_i = 1 bmxinGamma_i \nV_i = 0 bmxinGamma_j jneq i \nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The energy of the electric field associated with any solution is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE(V_i) = frac12int_Omegavarepsilon_rbmE_icdotbmE_idV","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE_i=-nabla V_i is the electric field. Then, the entries of the Maxwell capacitance matrix, bmC, are given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmC_ij = mathcalE(V_i+V_j)-frac12(bmC_ii+bmC_jj) ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Magnetostatic problems for inductance matrix extraction are based on the magnetic vector potential formulation:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablatimes(mu_r^-1nablatimesbmA_i) = 0 bmxinOmega \nbmntimes(mu_r^-1nablatimesbmA_i) =\n bmntimesbmH_i = bmJ_s^inc bmxinGamma_i \nbmntimes(mu_r^-1nablatimesbmA_i) = 0 bmxinGamma_j jneq i \nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For each port with boundary Gamma_i, a unit source surface current bmJ_s^inc is applied, yielding an associated vector potential solution bmA_i(bmx). Homogeneous Dirichlet boundary conditions bmntimesbmA_i=0 are also imposed on specified surfaces of the model. The magnetic field energy associated with any solution is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE(bmA_i) = frac12int_Omegamu_r^-1bmB_icdotbmB_idV","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmB_i=nablatimesbmA_i is the magnetic flux density. Then, the entries of the inductance matrix, bmM, are given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmM_ij = frac1I_i I_jmathcalE(bmA_i+bmA_j)\n - frac12left(fracI_iI_jbmM_ii+fracI_jI_ibmM_jjright)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where I_i is the excitation current for port i, computed by integrating the source surface current bmJ_s^inc over the surface of the port.","category":"page"},{"location":"reference/#References","page":"Reference","title":"References","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"[1] J.-M. Jin, The Finite Element Method in Electromagnetics, Wiley-IEEE Press, Hoboken, NJ, Third edition, 2014.\n[2] P. Monk, Finite Element Methods for Maxwell's Equations, Oxford University Press, Oxford, 2003.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\n","category":"page"},{"location":"config/problem/#config[\"Problem\"]","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"","category":"section"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Problem\":\n{\n \"Type\": \n \"Verbose\": ,\n \"Output\": \n}","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"with","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Type\" [None] : Controls the simulation type. The available options are:","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Eigenmode\" : Perform a undamped or damped eigenfrequency analysis.\n\"Driven\" : Perform a frequency response simulation.\n\"Transient\" : Perform a time domain excitation response simulation.\n\"Electrostatic\" : Perform an electrostatic analysis to compute the capacitance matrix for a set of voltage terminals.\n\"Magnetostatic\" : Perform a magnetostatic analysis to compute the inductance matrix for a set of current sources.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Verbose\" [1] : Controls the level of log file printing.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Output\" [None] : Directory path for saving postprocessing outputs.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"\n","category":"page"},{"location":"examples/rings/#Inductance-Matrix-for-a-Pair-of-Concentric-Rings","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"","category":"section"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"note: Note\nThe files for this example can be found in the examples/rings/ directory of the Palace source code.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"This example seeks to compute the inductance matrix for a system of two concentric current-carrying rings of radii r_a and r_b, each with width w. As for the previous example, the permeability of the surrounding medium is assumed to be the permeability of free space. The mutual inductance, M_ab, can be easily computed for the case where r_all r_b and w = 0 using the Biot-Savart law as","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"M_ab = fracmu_0pi r_b^22 r_a ","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"Analytic expressions for the self inductance of this configuration can also be derived, for example from [1] we have","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"beginaligned\nM_aa = mu_0 r_a left(logfrac16 r_aw-175right) \nM_bb = mu_0 r_b left(logfrac16 r_bw-175right) \nendaligned","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"We take in this case r_a = 10 text μm, r_b = 100 text μm, and w = 1 text μm. The mesh.jl script in the mesh/ directory is used to generate an unstructured tetrahedral mesh with Gmsh, saved to mesh/rings.msh, and a depiction is shown below.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"
\n \n
","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The configuration file for the Palace simulation is rings.json. The simulation \"Type\" is \"Magnetostatic\", and we add \"SurfaceCurrent\" boundaries for applying a surface current to drive the inner or outer ring. The rest of the ring boundaries are labeled as \"PEC\" boundaries, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The farfield is also prescribed the \"PEC\" boundary condition. We seek a second-order solution and use the geometric multigrid AMS solver.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The computed inductance matrix is saved to disk as postpro/terminal-M.csv, and below we show its contents:","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":" i, M[i][1] (H), M[i][2] (H)\n 1.000000e+00, +4.258505069e-11, +1.958488699e-12\n 2.000000e+00, +1.958488699e-12, +7.126907323e-10","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"According to the analytic expressions above, for this geometry we should have","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"M_ab = 1973921text pH","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"for the mutual inductance, and","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"beginaligned\nM_aa = 4178537text pH\nM_bb = 7072050text pH\nendaligned","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"for the self inductances. Thus, the Palace solution has approximately 078 error in the mutual inductance 19 and 078 errors in the self inductances versus the analytic solutions.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The typical approach used by Palace for lumped parameter extraction uses the computed field energies, but one can also compute the inductance by explicitly integrating the magnetic flux through a surface and dividing by the excitation current. This is configured under config[\"Boundaries\"][\"Postprocessing\"][\"Inductance\"] in the configuration file. The resulting postprocessed values are written to postpro/surface-M.csv:","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":" i, M[1] (H), M[2] (H)\n 1.000000e+00, +4.246208372e-11, +1.858193591e-12\n 2.000000e+00, +1.954077499e-12, +7.125811940e-10","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The values computed using the flux integral method are in close agreement to those above, as expected.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"Lastly, we visualize the magnitude of the magnetic flux density field for the excitations of the inner and outer rings. The files for this visualization are again saved to the postpro/paraview directory.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"
\n \n \n
","category":"page"},{"location":"examples/rings/#References","page":"Inductance Matrix for a Pair of Concentric Rings","title":"References","text":"","category":"section"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"[1] M. R. Alizadeh Pahlavani and H. A. Mohammadpour, Inductance comparison of the solenoidal coil of modular toroidal coils using the analytical and finite element method, Progress in Electromagnetics Research 20 (2010) 337-352.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\n","category":"page"},{"location":"config/boundaries/#config[\"Boundaries\"]","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Boundaries\":\n{\n \"PEC\":\n {\n ...\n },\n \"PMC\":\n {\n ...\n },\n \"Impedance\":\n [\n ...\n ],\n \"Absorbing\":\n {\n ...\n },\n \"Conductivity\":\n [\n ...\n ],\n \"LumpedPort\":\n [\n ...\n ],\n \"WavePort\":\n [\n ...\n ],\n \"WavePortPEC\":\n {\n ...\n },\n \"SurfaceCurrent\":\n [\n ...\n ],\n \"Ground\":\n {\n ...\n },\n \"ZeroCharge\":\n {\n ...\n },\n \"Terminal\":\n [\n ...\n ],\n \"Postprocessing\":\n {\n \"Capacitance\":\n [\n ...\n ],\n \"Inductance\":\n [\n ...\n ],\n \"Dielectric\":\n [\n ...\n ]\n }\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PEC\" : Top-level object for configuring perfect electric conductor (PEC) boundary conditions (zero tangential electric field).","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PMC\" : Top-level object for configuring perfect magnetic conductor (PMC) boundary conditions (zero tangential magnetic field). Also imposes symmetry of the electric field across the boundary surface.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Impedance\" : Array of objects for configuring surface impedance boundary conditions. A surface impedance boundary relates the tangential electric and magnetic fields on the boundary using a user specified surface impedance.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Absorbing\" : Top-level object for configuring absorbing boundary conditions. These are artificial scattering boundary conditions at farfield boundaries.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\" : Array of objects for configuring finite conductivity surface impedance boundary conditions. Finite conductivity boundaries are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"LumpedPort\" : Array of objects for configuring lumped port boundary conditions. Lumped ports can be specified on boundaries which are internal to the computational domain.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePort\" : Array of objects for configuring numeric wave port boundary conditions. Wave ports can only be specified on boundaries which are on the true boundary of the computational domain. Addiitionally, wave port boundaries are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePortPEC\" : Top-level object for configuring PEC boundary conditions for boundary mode analysis performed on the wave port boundaries. Thus, this object is only relevant when wave port boundaries are specified under config[\"Boundaries\"][\"WavePort\"].","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"SurfaceCurrent\" : Array of objects for configuring surface current boundary conditions. This boundary prescribes a unit source surface current excitation on the given boundary in order to excite a frequency or time domain driven simulation or magnetostatic simulation. For the magnetostatic simulation type, entries of the inductance matrix are extracted corresponding to each surface current boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ground\" : Top-level object for specifying ground, or zero voltage, boundary conditions for for electrostatic simulations.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"ZeroCharge\" : Top-level object for specifying zero charge boundary conditions for for electrostatic simulations. Also imposes symmetry of the electric field across the boundary surface.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Terminal\" : Array of objects for configuring terminal boundary conditions for electrostatic simulations. Entries of the capacitance matrix are extracted corresponding to each terminal boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Postprocessing\" : Top-level object for configuring boundary postprocessing.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Capacitance\" : Array of objects for postprocessing surface capacitance by the ratio of the integral of the induced surface charge on the boundary and the excitation voltage.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Inductance\" : Array of objects for postprocessing surface inductance by the ratio of the integral of the magnetic flux through the boundary and the excitation current.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Dielectric\" : Array of objects for postprocessing surface interface dielectric loss.","category":"page"},{"location":"config/boundaries/#boundaries[\"PEC\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"PEC\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PEC\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the PEC boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"PMC\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"PMC\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PMC\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the PMC boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"Impedance\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Impedance\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Impedance\":\n[\n {\n \"Attributes\": [],\n \"Rs\": ,\n \"Ls\": ,\n \"Cs\": \n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this surface impedance boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Rs\" [0.0] : Surface resistance used for computing this surface impedance boundary's impedance per square, Omega/sq.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ls\" [0.0] : Surface inductance used for computing this surface impedance boundary's impedance per square, H/sq.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Cs\" [0.0] : Surface capacitance used computing this surface impedance boundary's impedance per square, F/sq.","category":"page"},{"location":"config/boundaries/#boundaries[\"Absorbing\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Absorbing\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Absorbing\":\n{\n \"Attributes\": [],\n \"Order\": \n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply farfield absorbing boundary conditions.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Order\" [1] : Specify a first- or second-order approximation for the farfield absorbing boundary condition. Second-order absorbing boundary conditions are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/#boundaries[\"Conductivity\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Conductivity\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\":\n[\n {\n \"Attributes\": [],\n \"Conductivity\": ,\n \"Permeability\": ,\n \"Thickness\": \n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this finite conductivity boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\" [None] : Electrical conductivity for this finite conductivity boundary, S/m.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Permeability\" [1.0] : Relative permeability for this finite conductivity boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Thickness\" [None] : Optional conductor thickness for this finite conductivity boundary specified in mesh length units. Activates a finite conductivity boundary condition which accounts for nonzero metal thickness.","category":"page"},{"location":"config/boundaries/#boundaries[\"LumpedPort\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"LumpedPort\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"LumpedPort\":\n[\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Direction\": ,\n \"Excitation\": ,\n \"R\": ,\n \"L\": ,\n \"C\": ,\n \"Rs\": ,\n \"Ls\": ,\n \"Cs\": ,\n \"Elements\":\n [\n {\n \"Attributes\": [],\n \"Direction\": \n },\n ...\n ]\n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this lumped port, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this lumped port boundary. If this port is to be a multielement lumped port with more than a single lumped element, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Direction\" [None] : Direction to define the polarization direction of the port field mode on this lumped port boundary. Lumped ports must be axis-aligned unless the port is a coaxial port. The available options are: \"+X\", \"-X\", \"+Y\", \"-Y\", \"+Z\", \"-Z\", \"+R\", \"-R\" (\"R\" is for a coaxial lumped port). If this port is to be a multielement lumped port with more than a single lumped element, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Excitation\" [false] : Turns on or off port excitation for this lumped port boundary for driven or transient simulation types.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"R\" [0.0] : Circuit resistance used for computing this lumped port boundary's impedance, Omega. This option should only be used along with the corresponding \"L\" and \"C\" parameters, and not with any of the surface parameters \"Rs\", \"Ls\", or \"Cs\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"L\" [0.0] : Circuit inductance used for computing this lumped port boundary's impedance, H. This option should only be used along with the corresponding \"R\" and \"C\" parameters, and not with any of the surface parameters \"Rs\", \"Ls\", or \"Cs\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"C\" [0.0] : Circuit capacitance used for computing this lumped port boundary's impedance, F. This option should only be used along with the corresponding \"R\" and \"L\" parameters, and not with any of the surface parameters \"Rs\", \"Ls\", or \"Cs\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Rs\" [0.0] : Surface resistance used for computing this lumped port boundary's impedance, Omega/sq. This option should only be used along with the corresponding \"Ls\" and \"Cs\" parameters, and not with any of the circuit parameters \"R\", \"L\", or \"C\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ls\" [0.0] : Surface inductance used for computing this lumped port boundary's impedance, H/sq. This option should only be used along with the corresponding \"Rs\" and \"Cs\" parameters, and not with any of the circuit parameters \"R\", \"L\", or \"C\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Cs\" [0.0] : Surface capacitance used for computing this lumped port boundary's impedance, F/sq. This option should only be used along with the corresponding \"Rs\" and \"Ls\" parameters, and not with any of the circuit parameters \"R\", \"L\", or \"C\".","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[][\"Attributes\"] [None] : This option is for multielement lumped ports and should not be combined with the \"Attributes\" field described above. Each element of a multielement lumped port can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement port add in parallel.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[][\"Direction\"] [None] : This option is for multielement lumped ports and should not be combined with the \"Direction\" field described above. Each element of a multielement lumped port can be described by its own unique direction, which is specified here. The elements of a multielement port add in parallel.","category":"page"},{"location":"config/boundaries/#boundaries[\"WavePort\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"WavePort\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePort\":\n[\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Excitation\": ,\n \"Mode\": ,\n \"Offset\": \n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this wave port boundary, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this wave port boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Excitation\" [false] : Turns on or off port excitation for this wave port boundary for driven simulation types.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Mode\" [1] : Mode index (1-based) for the characteristic port mode of this wave port boundary. Ranked in order of decreasing wave number.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Offset\" [0.0] : Offset distance used for scattering parameter de-embedding for this wave port boundary, specified in mesh length units.","category":"page"},{"location":"config/boundaries/#boundaries[\"WavePortPEC\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"WavePortPEC\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePortPEC\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes to consider along with those specified under config[\"Boundaries\"][\"PEC\"][\"Attributes\"] as PEC when performing wave port boundary mode analysis.","category":"page"},{"location":"config/boundaries/#boundaries[\"SurfaceCurrent\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"SurfaceCurrent\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"SurfaceCurrent\":\n[\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Direction\": \n \"Elements\":\n [\n {\n \"Attributes\": [],\n \"Direction\": \n },\n ...\n ]\n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this surface current boundary, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this surface current boundary. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Direction\" [None] : Defines the source current direction for this surface current boundary. The available options are the same as under config[\"Boundaries\"][\"LumpedPort\"][\"Direction\"]. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[][\"Attributes\"] [None] : This option is for multielement surface current boundaries should not be combined with the \"Attributes\" field described above. Each element of a multielement current source can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[][\"Direction\"] [None] : This option is for multielement surface current boundaires and should not be combined with the \"Direction\" field described above. Each element of a multielement current source can be described by its own unique direction, which is specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.","category":"page"},{"location":"config/boundaries/#boundaries[\"Ground\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Ground\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ground\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the ground boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"ZeroCharge\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"ZeroCharge\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"ZeroCharge\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the zero-charge boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"Terminal\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Terminal\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Terminal\":\n[\n {\n \"Index\": \n \"Attributes\": [],\n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this terminal boundary, used in postprocessing output files and to index the computed capacitance matrix.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this terminal boundary.","category":"page"},{"location":"config/boundaries/#boundaries[\"Postprocessing\"][\"Capacitance\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Postprocessing\"][\"Capacitance\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Postprocessing\":\n{\n \"Capacitance\":\n [\n {\n \"Index\": \n \"Attributes\": [],\n },\n ...\n ]\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this capacitance postprocessing boundary, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this capacitance postprocessing boundary.","category":"page"},{"location":"config/boundaries/#boundaries[\"Postprocessing\"][\"Inductance\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Postprocessing\"][\"Inductance\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Postprocessing\":\n{\n \"Inductance\":\n [\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Direction\": \n },\n ...\n ]\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this inductance postprocessing boundary, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this inductance postprocessing boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Direction\" [None] : Defines the global direction with which to orient the surface normals with computing the magnetic flux for this inductance postprocessing boundary. The available options are: \"+X\", \"-X\", \"+Y\", \"-Y\", \"+Z\", \"-Z\".","category":"page"},{"location":"config/boundaries/#boundaries[\"Postprocessing\"][\"Dielectric\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Postprocessing\"][\"Dielectric\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Postprocessing\":\n{\n \"Dielectric\":\n [\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Side\": ,\n \"Thickness\": ,\n \"Permittivity\": ,\n \"PermittivityMA\": ,\n \"PermittivityMS\": ,\n \"PermittivitySA\": ,\n \"LossTan\": ,\n \"Elements\":\n [\n {\n \"Attributes\": [],\n \"Side\": \n },\n ...\n ]\n },\n ...\n ]\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Index\" [None] : Index of this lossy dielectric interface, used in postprocessing output files.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this lossy dielectric interface. If the interface consists of multiple elements with different \"Side\" values, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Side\" [None] : Defines the postprocessing side when this dielectric interface is an internal boundary surface (and thus the electric field on the boundary is in general double-valued). The available options are: \"+X\", \"-X\", \"+Y\", \"-Y\", \"+Z\", \"-Z\". If the boundary is not axis-aligned, the field value is taken from the side which is oriented along the specified direction. If no \"Side\" is specified, the field solution is taken from the neighboring element with the smaller electrical permittivity, which is an attempt to get the field in the domain corresponding to vacuum. If the interface consists of multiple elements with different \"Side\" values, use the \"Elements\" array described below.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Thickness\" [None] : Thickness of this dielectric interface, specified in mesh length units.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Permittivity\" [None] : Relative permittivity for this dielectric interface. Leads to the general quality factor calculation without assuming the interface is a specific metal-air (MA), metal-substrate (MS), or substrate-air (SA) interface. None of \"PermittivityMA\", \"PermittivityMS\", or \"PermittivitySA\" should be specified when this value is given.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PermittivityMA\" [None] : Relative permittivity for this dielectric interface assuming it is a metal-air (MA) interface. None of \"PermittivityMS\", \"PermittivitySA\", or the general \"Permittivity\" should be specified when this value is given.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PermittivityMS\" [None] : Relative permittivity for this dielectric interface assuming it is a metal-substrate (MS) interface. None of \"PermittivityMA\", \"PermittivitySA\", or the general \"Permittivity\" should be specified when this value is given.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PermittivitySA\" [None] : Relative permittivity for this dielectric interface assuming it is a substrate-air (SA) interface. None of \"PermittivityMA\", \"PermittivityMS\", or the general \"Permittivity\" should be specified when this value is given.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"LossTan\" [0.0] : Loss tangent for this lossy dielectric interface.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[].\"Attributes\" [None] : This option should not be combined with the \"Attributes\" field described above. In the case where a single dielectric interface is made up of contributions with their own unique integer arrays of mesh boundary attributes, they can be specified here.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Elements\"[].\"Side\" [None] : This option should not be combined with the \"Side\" field described above. In the case where a single dielectric interface is made up of contributions with their own entry for side, they can be specified here.","category":"page"},{"location":"guide/guide/","page":"Overview","title":"Overview","text":"\n","category":"page"},{"location":"guide/guide/#Overview","page":"Overview","title":"Overview","text":"","category":"section"},{"location":"guide/guide/","page":"Overview","title":"Overview","text":"This user guide provides an overview of the different types of electromagnetic simulations which can be performed with Palace and the various features available in the solver.","category":"page"},{"location":"guide/guide/#Contents","page":"Overview","title":"Contents","text":"","category":"section"},{"location":"guide/guide/","page":"Overview","title":"Overview","text":"Problem Types\nSimulation Models\nBoundary Conditions\nPostprocessing and Visualization","category":"page"},{"location":"","page":"Home","title":"Home","text":"\n","category":"page"},{"location":"#Palace:-3D-Finite-Element-Solver-for-Computational-Electromagnetics","page":"Home","title":"Palace: 3D Finite Element Solver for Computational Electromagnetics","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Palace, for PArallel LArge-scale Computational Electromagnetics, is an open-source, parallel finite element code for full-wave 3D electromagnetic simulations in the frequency or time domain, using the MFEM finite element discretization library.","category":"page"},{"location":"#Key-features","page":"Home","title":"Key features","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Eigenmode calculations with optional material or radiative loss including lumped impedance boundaries. Automatic postprocessing of energy-participation ratios (EPRs) for circuit quantization and interface or bulk participation ratios for predicting dielectric loss.\nFrequency domain driven simulations with surface current excitation and lumped or numeric wave port boundaries. Wideband frequency response calculation using uniform frequency space sampling or an adaptive fast frequency sweep algorithm.\nExplicit or fully-implicit time domain solver for transient electromagnetic analysis.\nLumped capacitance and inductance matrix extraction via electrostatic and magnetostatic problem formulations.\nSupport for a wide range of mesh file formats for structured and unstructured meshes, with built-in uniform or region-based parallel mesh refinement.\nArbitrary high-order finite element spaces and curvilinear mesh support thanks to the MFEM library.\nScalable algorithms for the solution of linear systems of equations, including geometric multigrid (GMG), parallel sparse direct solvers, and algebraic multigrid (AMG) preconditioners, for fast performance on platforms ranging from laptops to HPC systems.","category":"page"},{"location":"#Contents","page":"Home","title":"Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Installation\nExecution\nUser Guide\nConfiguration File\nExamples\nReference\nDeveloper Notes","category":"page"},{"location":"#Coming-soon","page":"Home","title":"Coming soon","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Adaptive and nonconforming mesh refinement\nEfficient high-order operator assembly and GPU support\nPerfectly matched layer (PML) boundaries\nAutomatic mesh generation","category":"page"}]
+}
diff --git a/dev/siteinfo.js b/dev/siteinfo.js
new file mode 100644
index 000000000..334349194
--- /dev/null
+++ b/dev/siteinfo.js
@@ -0,0 +1 @@
+var DOCUMENTER_CURRENT_VERSION = "dev";
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..6a5afc301
--- /dev/null
+++ b/index.html
@@ -0,0 +1,2 @@
+
+
diff --git a/previews/PR38/assets/documenter.js b/previews/PR38/assets/documenter.js
new file mode 100644
index 000000000..6adfbbbf4
--- /dev/null
+++ b/previews/PR38/assets/documenter.js
@@ -0,0 +1,331 @@
+// Generated by Documenter.jl
+requirejs.config({
+ paths: {
+ 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min',
+ 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min',
+ 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min',
+ 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min',
+ 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min',
+ 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min',
+ 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min',
+ 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min',
+ 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min',
+ },
+ shim: {
+ "highlight-julia": {
+ "deps": [
+ "highlight"
+ ]
+ },
+ "katex-auto-render": {
+ "deps": [
+ "katex"
+ ]
+ },
+ "headroom-jquery": {
+ "deps": [
+ "jquery",
+ "headroom"
+ ]
+ },
+ "highlight-julia-repl": {
+ "deps": [
+ "highlight"
+ ]
+ }
+}
+});
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) {
+$(document).ready(function() {
+ renderMathInElement(
+ document.body,
+ {
+ "delimiters": [
+ {
+ "left": "$",
+ "right": "$",
+ "display": false
+ },
+ {
+ "left": "$$",
+ "right": "$$",
+ "display": true
+ },
+ {
+ "left": "\\[",
+ "right": "\\]",
+ "display": true
+ }
+ ]
+}
+
+ );
+})
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) {
+$(document).ready(function() {
+ hljs.highlightAll();
+})
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require([], function() {
+function addCopyButtonCallbacks() {
+ for (const el of document.getElementsByTagName("pre")) {
+ const button = document.createElement("button");
+ button.classList.add("copy-button", "fas", "fa-copy");
+ el.appendChild(button);
+
+ const success = function () {
+ button.classList.add("success", "fa-check");
+ button.classList.remove("fa-copy");
+ };
+
+ const failure = function () {
+ button.classList.add("error", "fa-times");
+ button.classList.remove("fa-copy");
+ };
+
+ button.addEventListener("click", function () {
+ copyToClipboard(el.innerText).then(success, failure);
+
+ setTimeout(function () {
+ button.classList.add("fa-copy");
+ button.classList.remove("success", "fa-check", "fa-times");
+ }, 5000);
+ });
+ }
+}
+
+function copyToClipboard(text) {
+ // clipboard API is only available in secure contexts
+ if (window.navigator && window.navigator.clipboard) {
+ return window.navigator.clipboard.writeText(text);
+ } else {
+ return new Promise(function (resolve, reject) {
+ try {
+ const el = document.createElement("textarea");
+ el.textContent = text;
+ el.style.position = "fixed";
+ el.style.opacity = 0;
+ document.body.appendChild(el);
+ el.select();
+ document.execCommand("copy");
+
+ resolve();
+ } catch (err) {
+ reject(err);
+ } finally {
+ document.body.removeChild(el);
+ }
+ });
+ }
+}
+
+if (document.readyState === "loading") {
+ document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks);
+} else {
+ addCopyButtonCallbacks();
+}
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) {
+
+// Manages the top navigation bar (hides it when the user starts scrolling down on the
+// mobile).
+window.Headroom = Headroom; // work around buggy module loading?
+$(document).ready(function() {
+ $('#documenter .docs-navbar').headroom({
+ "tolerance": {"up": 10, "down": 10},
+ });
+})
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
+// Modal settings dialog
+$(document).ready(function() {
+ var settings = $('#documenter-settings');
+ $('#documenter-settings-button').click(function(){
+ settings.toggleClass('is-active');
+ });
+ // Close the dialog if X is clicked
+ $('#documenter-settings button.delete').click(function(){
+ settings.removeClass('is-active');
+ });
+ // Close dialog if ESC is pressed
+ $(document).keyup(function(e) {
+ if (e.keyCode == 27) settings.removeClass('is-active');
+ });
+});
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
+// Manages the showing and hiding of the sidebar.
+$(document).ready(function() {
+ var sidebar = $("#documenter > .docs-sidebar");
+ var sidebar_button = $("#documenter-sidebar-button")
+ sidebar_button.click(function(ev) {
+ ev.preventDefault();
+ sidebar.toggleClass('visible');
+ if (sidebar.hasClass('visible')) {
+ // Makes sure that the current menu item is visible in the sidebar.
+ $("#documenter .docs-menu a.is-active").focus();
+ }
+ });
+ $("#documenter > .docs-main").bind('click', function(ev) {
+ if ($(ev.target).is(sidebar_button)) {
+ return;
+ }
+ if (sidebar.hasClass('visible')) {
+ sidebar.removeClass('visible');
+ }
+ });
+})
+
+// Resizes the package name / sitename in the sidebar if it is too wide.
+// Inspired by: https://github.com/davatron5000/FitText.js
+$(document).ready(function() {
+ e = $("#documenter .docs-autofit");
+ function resize() {
+ var L = parseInt(e.css('max-width'), 10);
+ var L0 = e.width();
+ if(L0 > L) {
+ var h0 = parseInt(e.css('font-size'), 10);
+ e.css('font-size', L * h0 / L0);
+ // TODO: make sure it survives resizes?
+ }
+ }
+ // call once and then register events
+ resize();
+ $(window).resize(resize);
+ $(window).on('orientationchange', resize);
+});
+
+// Scroll the navigation bar to the currently selected menu item
+$(document).ready(function() {
+ var sidebar = $("#documenter .docs-menu").get(0);
+ var active = $("#documenter .docs-menu .is-active").get(0);
+ if(typeof active !== 'undefined') {
+ sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15;
+ }
+})
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
+function set_theme(theme) {
+ var active = null;
+ var disabled = [];
+ for (var i = 0; i < document.styleSheets.length; i++) {
+ var ss = document.styleSheets[i];
+ var themename = ss.ownerNode.getAttribute("data-theme-name");
+ if(themename === null) continue; // ignore non-theme stylesheets
+ // Find the active theme
+ if(themename === theme) active = ss;
+ else disabled.push(ss);
+ }
+ if(active !== null) {
+ active.disabled = false;
+ if(active.ownerNode.getAttribute("data-theme-primary") === null) {
+ document.getElementsByTagName('html')[0].className = "theme--" + theme;
+ } else {
+ document.getElementsByTagName('html')[0].className = "";
+ }
+ disabled.forEach(function(ss){
+ ss.disabled = true;
+ });
+ }
+
+ // Store the theme in localStorage
+ if(typeof(window.localStorage) !== "undefined") {
+ window.localStorage.setItem("documenter-theme", theme);
+ } else {
+ console.error("Browser does not support window.localStorage");
+ }
+}
+
+// Theme picker setup
+$(document).ready(function() {
+ // onchange callback
+ $('#documenter-themepicker').change(function themepick_callback(ev){
+ var themename = $('#documenter-themepicker option:selected').attr('value');
+ set_theme(themename);
+ });
+
+ // Make sure that the themepicker displays the correct theme when the theme is retrieved
+ // from localStorage
+ if(typeof(window.localStorage) !== "undefined") {
+ var theme = window.localStorage.getItem("documenter-theme");
+ if(theme !== null) {
+ $('#documenter-themepicker option').each(function(i,e) {
+ e.selected = (e.value === theme);
+ })
+ } else {
+ $('#documenter-themepicker option').each(function(i,e) {
+ e.selected = $("html").hasClass(`theme--${e.value}`);
+ })
+ }
+ }
+})
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
+// update the version selector with info from the siteinfo.js and ../versions.js files
+$(document).ready(function() {
+ // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the
+ // siteinfo.js file, we just return immediately and not display the version selector.
+ if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) {
+ return;
+ }
+
+ var version_selector = $("#documenter .docs-version-selector");
+ var version_selector_select = $("#documenter .docs-version-selector select");
+
+ version_selector_select.change(function(x) {
+ target_href = version_selector_select.children("option:selected").get(0).value;
+ window.location.href = target_href;
+ });
+
+ // add the current version to the selector based on siteinfo.js, but only if the selector is empty
+ if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) {
+ var option = $("");
+ version_selector_select.append(option);
+ }
+
+ if (typeof DOC_VERSIONS !== 'undefined') {
+ var existing_versions = version_selector_select.children("option");
+ var existing_versions_texts = existing_versions.map(function(i,x){return x.text});
+ DOC_VERSIONS.forEach(function(each) {
+ var version_url = documenterBaseURL + "/../" + each;
+ var existing_id = $.inArray(each, existing_versions_texts);
+ // if not already in the version selector, add it as a new option,
+ // otherwise update the old option with the URL and enable it
+ if (existing_id == -1) {
+ var option = $("");
+ version_selector_select.append(option);
+ } else {
+ var option = existing_versions[existing_id];
+ option.value = version_url;
+ option.disabled = false;
+ }
+ });
+ }
+
+ // only show the version selector if the selector has been populated
+ if (version_selector_select.children("option").length > 0) {
+ version_selector.toggleClass("visible");
+ }
+})
+
+})
diff --git a/previews/PR38/assets/examples/cavity-1.png b/previews/PR38/assets/examples/cavity-1.png
new file mode 100644
index 000000000..526fa7160
Binary files /dev/null and b/previews/PR38/assets/examples/cavity-1.png differ
diff --git a/previews/PR38/assets/examples/cavity-2a.png b/previews/PR38/assets/examples/cavity-2a.png
new file mode 100644
index 000000000..f1b2919f6
Binary files /dev/null and b/previews/PR38/assets/examples/cavity-2a.png differ
diff --git a/previews/PR38/assets/examples/cavity-2b.png b/previews/PR38/assets/examples/cavity-2b.png
new file mode 100644
index 000000000..7a54b35e8
Binary files /dev/null and b/previews/PR38/assets/examples/cavity-2b.png differ
diff --git a/previews/PR38/assets/examples/cavity_error_hexahedra.png b/previews/PR38/assets/examples/cavity_error_hexahedra.png
new file mode 100644
index 000000000..620d31625
Binary files /dev/null and b/previews/PR38/assets/examples/cavity_error_hexahedra.png differ
diff --git a/previews/PR38/assets/examples/cavity_error_prism.png b/previews/PR38/assets/examples/cavity_error_prism.png
new file mode 100644
index 000000000..9be093729
Binary files /dev/null and b/previews/PR38/assets/examples/cavity_error_prism.png differ
diff --git a/previews/PR38/assets/examples/cavity_error_tetrahedra.png b/previews/PR38/assets/examples/cavity_error_tetrahedra.png
new file mode 100644
index 000000000..fe5f44fbb
Binary files /dev/null and b/previews/PR38/assets/examples/cavity_error_tetrahedra.png differ
diff --git a/previews/PR38/assets/examples/coaxial-1.png b/previews/PR38/assets/examples/coaxial-1.png
new file mode 100644
index 000000000..92b42adce
Binary files /dev/null and b/previews/PR38/assets/examples/coaxial-1.png differ
diff --git a/previews/PR38/assets/examples/coaxial-2.gif b/previews/PR38/assets/examples/coaxial-2.gif
new file mode 100644
index 000000000..237f2a708
Binary files /dev/null and b/previews/PR38/assets/examples/coaxial-2.gif differ
diff --git a/previews/PR38/assets/examples/coaxial-2.png b/previews/PR38/assets/examples/coaxial-2.png
new file mode 100644
index 000000000..1bc5db9c0
Binary files /dev/null and b/previews/PR38/assets/examples/coaxial-2.png differ
diff --git a/previews/PR38/assets/examples/coaxial-3.gif b/previews/PR38/assets/examples/coaxial-3.gif
new file mode 100644
index 000000000..237f2a708
Binary files /dev/null and b/previews/PR38/assets/examples/coaxial-3.gif differ
diff --git a/previews/PR38/assets/examples/cpw-1.png b/previews/PR38/assets/examples/cpw-1.png
new file mode 100644
index 000000000..36ddba5b9
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-1.png differ
diff --git a/previews/PR38/assets/examples/cpw-2.png b/previews/PR38/assets/examples/cpw-2.png
new file mode 100644
index 000000000..d12f50893
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-2.png differ
diff --git a/previews/PR38/assets/examples/cpw-3.png b/previews/PR38/assets/examples/cpw-3.png
new file mode 100644
index 000000000..47b59be80
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-3.png differ
diff --git a/previews/PR38/assets/examples/cpw-4a.png b/previews/PR38/assets/examples/cpw-4a.png
new file mode 100644
index 000000000..4103445aa
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-4a.png differ
diff --git a/previews/PR38/assets/examples/cpw-4b.png b/previews/PR38/assets/examples/cpw-4b.png
new file mode 100644
index 000000000..10916d71b
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-4b.png differ
diff --git a/previews/PR38/assets/examples/cpw-4c.png b/previews/PR38/assets/examples/cpw-4c.png
new file mode 100644
index 000000000..4f8d3ecae
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-4c.png differ
diff --git a/previews/PR38/assets/examples/cpw-4d.png b/previews/PR38/assets/examples/cpw-4d.png
new file mode 100644
index 000000000..1d078acc0
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-4d.png differ
diff --git a/previews/PR38/assets/examples/cpw-5a.png b/previews/PR38/assets/examples/cpw-5a.png
new file mode 100644
index 000000000..3a3245290
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-5a.png differ
diff --git a/previews/PR38/assets/examples/cpw-5b.png b/previews/PR38/assets/examples/cpw-5b.png
new file mode 100644
index 000000000..442b79e51
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-5b.png differ
diff --git a/previews/PR38/assets/examples/cpw-5c.png b/previews/PR38/assets/examples/cpw-5c.png
new file mode 100644
index 000000000..2958e4446
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-5c.png differ
diff --git a/previews/PR38/assets/examples/cpw-5d.png b/previews/PR38/assets/examples/cpw-5d.png
new file mode 100644
index 000000000..84e8d6430
Binary files /dev/null and b/previews/PR38/assets/examples/cpw-5d.png differ
diff --git a/previews/PR38/assets/examples/rings-1.png b/previews/PR38/assets/examples/rings-1.png
new file mode 100644
index 000000000..60faaf6ab
Binary files /dev/null and b/previews/PR38/assets/examples/rings-1.png differ
diff --git a/previews/PR38/assets/examples/rings-2.png b/previews/PR38/assets/examples/rings-2.png
new file mode 100644
index 000000000..748846b60
Binary files /dev/null and b/previews/PR38/assets/examples/rings-2.png differ
diff --git a/previews/PR38/assets/examples/rings-3.png b/previews/PR38/assets/examples/rings-3.png
new file mode 100644
index 000000000..43c65f119
Binary files /dev/null and b/previews/PR38/assets/examples/rings-3.png differ
diff --git a/previews/PR38/assets/examples/spheres-1.png b/previews/PR38/assets/examples/spheres-1.png
new file mode 100644
index 000000000..ded59eacd
Binary files /dev/null and b/previews/PR38/assets/examples/spheres-1.png differ
diff --git a/previews/PR38/assets/examples/spheres-2.png b/previews/PR38/assets/examples/spheres-2.png
new file mode 100644
index 000000000..b6c3f6f83
Binary files /dev/null and b/previews/PR38/assets/examples/spheres-2.png differ
diff --git a/previews/PR38/assets/examples/spheres-3.png b/previews/PR38/assets/examples/spheres-3.png
new file mode 100644
index 000000000..29f699710
Binary files /dev/null and b/previews/PR38/assets/examples/spheres-3.png differ
diff --git a/previews/PR38/assets/examples/spheres-4.png b/previews/PR38/assets/examples/spheres-4.png
new file mode 100644
index 000000000..603e55e8b
Binary files /dev/null and b/previews/PR38/assets/examples/spheres-4.png differ
diff --git a/previews/PR38/assets/favicon.ico b/previews/PR38/assets/favicon.ico
new file mode 100644
index 000000000..42e8969ed
Binary files /dev/null and b/previews/PR38/assets/favicon.ico differ
diff --git a/previews/PR38/assets/logo-dark.png b/previews/PR38/assets/logo-dark.png
new file mode 100644
index 000000000..4fef9acae
Binary files /dev/null and b/previews/PR38/assets/logo-dark.png differ
diff --git a/previews/PR38/assets/logo.png b/previews/PR38/assets/logo.png
new file mode 100644
index 000000000..cb1777786
Binary files /dev/null and b/previews/PR38/assets/logo.png differ
diff --git a/previews/PR38/assets/search.js b/previews/PR38/assets/search.js
new file mode 100644
index 000000000..c133f7410
--- /dev/null
+++ b/previews/PR38/assets/search.js
@@ -0,0 +1,267 @@
+// Generated by Documenter.jl
+requirejs.config({
+ paths: {
+ 'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min',
+ 'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min',
+ 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min',
+ }
+});
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery', 'lunr', 'lodash'], function($, lunr, _) {
+
+$(document).ready(function() {
+ // parseUri 1.2.2
+ // (c) Steven Levithan
+ // MIT License
+ function parseUri (str) {
+ var o = parseUri.options,
+ m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
+ uri = {},
+ i = 14;
+
+ while (i--) uri[o.key[i]] = m[i] || "";
+
+ uri[o.q.name] = {};
+ uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+ if ($1) uri[o.q.name][$1] = $2;
+ });
+
+ return uri;
+ };
+ parseUri.options = {
+ strictMode: false,
+ key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
+ q: {
+ name: "queryKey",
+ parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+ },
+ parser: {
+ strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+ loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+ }
+ };
+
+ $("#search-form").submit(function(e) {
+ e.preventDefault()
+ })
+
+ // list below is the lunr 2.1.3 list minus the intersect with names(Base)
+ // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with)
+ // ideally we'd just filter the original list but it's not available as a variable
+ lunr.stopWordFilter = lunr.generateStopWordFilter([
+ 'a',
+ 'able',
+ 'about',
+ 'across',
+ 'after',
+ 'almost',
+ 'also',
+ 'am',
+ 'among',
+ 'an',
+ 'and',
+ 'are',
+ 'as',
+ 'at',
+ 'be',
+ 'because',
+ 'been',
+ 'but',
+ 'by',
+ 'can',
+ 'cannot',
+ 'could',
+ 'dear',
+ 'did',
+ 'does',
+ 'either',
+ 'ever',
+ 'every',
+ 'from',
+ 'got',
+ 'had',
+ 'has',
+ 'have',
+ 'he',
+ 'her',
+ 'hers',
+ 'him',
+ 'his',
+ 'how',
+ 'however',
+ 'i',
+ 'if',
+ 'into',
+ 'it',
+ 'its',
+ 'just',
+ 'least',
+ 'like',
+ 'likely',
+ 'may',
+ 'me',
+ 'might',
+ 'most',
+ 'must',
+ 'my',
+ 'neither',
+ 'no',
+ 'nor',
+ 'not',
+ 'of',
+ 'off',
+ 'often',
+ 'on',
+ 'or',
+ 'other',
+ 'our',
+ 'own',
+ 'rather',
+ 'said',
+ 'say',
+ 'says',
+ 'she',
+ 'should',
+ 'since',
+ 'so',
+ 'some',
+ 'than',
+ 'that',
+ 'the',
+ 'their',
+ 'them',
+ 'then',
+ 'there',
+ 'these',
+ 'they',
+ 'this',
+ 'tis',
+ 'to',
+ 'too',
+ 'twas',
+ 'us',
+ 'wants',
+ 'was',
+ 'we',
+ 'were',
+ 'what',
+ 'when',
+ 'who',
+ 'whom',
+ 'why',
+ 'will',
+ 'would',
+ 'yet',
+ 'you',
+ 'your'
+ ])
+
+ // add . as a separator, because otherwise "title": "Documenter.Anchors.add!"
+ // would not find anything if searching for "add!", only for the entire qualification
+ lunr.tokenizer.separator = /[\s\-\.]+/
+
+ // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names
+ lunr.trimmer = function (token) {
+ return token.update(function (s) {
+ return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '')
+ })
+ }
+
+ lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter')
+ lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer')
+
+ var index = lunr(function () {
+ this.ref('location')
+ this.field('title',{boost: 100})
+ this.field('text')
+ documenterSearchIndex['docs'].forEach(function(e) {
+ this.add(e)
+ }, this)
+ })
+ var store = {}
+
+ documenterSearchIndex['docs'].forEach(function(e) {
+ store[e.location] = {title: e.title, category: e.category, page: e.page}
+ })
+
+ $(function(){
+ searchresults = $('#documenter-search-results');
+ searchinfo = $('#documenter-search-info');
+ searchbox = $('#documenter-search-query');
+ searchform = $('.docs-search');
+ sidebar = $('.docs-sidebar');
+ function update_search(querystring) {
+ tokens = lunr.tokenizer(querystring)
+ results = index.query(function (q) {
+ tokens.forEach(function (t) {
+ q.term(t.toString(), {
+ fields: ["title"],
+ boost: 100,
+ usePipeline: true,
+ editDistance: 0,
+ wildcard: lunr.Query.wildcard.NONE
+ })
+ q.term(t.toString(), {
+ fields: ["title"],
+ boost: 10,
+ usePipeline: true,
+ editDistance: 2,
+ wildcard: lunr.Query.wildcard.NONE
+ })
+ q.term(t.toString(), {
+ fields: ["text"],
+ boost: 1,
+ usePipeline: true,
+ editDistance: 0,
+ wildcard: lunr.Query.wildcard.NONE
+ })
+ })
+ })
+ searchinfo.text("Number of results: " + results.length)
+ searchresults.empty()
+ results.forEach(function(result) {
+ data = store[result.ref]
+ link = $(''+data.title+'')
+ link.attr('href', documenterBaseURL+'/'+result.ref)
+ if (data.category != "page"){
+ cat = $('('+data.category+', '+data.page+')')
+ } else {
+ cat = $('('+data.category+')')
+ }
+ li = $('
"PEC" : Top-level object for configuring perfect electric conductor (PEC) boundary conditions (zero tangential electric field).
"PMC" : Top-level object for configuring perfect magnetic conductor (PMC) boundary conditions (zero tangential magnetic field). Also imposes symmetry of the electric field across the boundary surface.
"Impedance" : Array of objects for configuring surface impedance boundary conditions. A surface impedance boundary relates the tangential electric and magnetic fields on the boundary using a user specified surface impedance.
"Absorbing" : Top-level object for configuring absorbing boundary conditions. These are artificial scattering boundary conditions at farfield boundaries.
"Conductivity" : Array of objects for configuring finite conductivity surface impedance boundary conditions. Finite conductivity boundaries are only available for the frequency domain driven simulation type.
"LumpedPort" : Array of objects for configuring lumped port boundary conditions. Lumped ports can be specified on boundaries which are internal to the computational domain.
"WavePort" : Array of objects for configuring numeric wave port boundary conditions. Wave ports can only be specified on boundaries which are on the true boundary of the computational domain. Addiitionally, wave port boundaries are only available for the frequency domain driven simulation type.
"WavePortPEC" : Top-level object for configuring PEC boundary conditions for boundary mode analysis performed on the wave port boundaries. Thus, this object is only relevant when wave port boundaries are specified under config["Boundaries"]["WavePort"].
"SurfaceCurrent" : Array of objects for configuring surface current boundary conditions. This boundary prescribes a unit source surface current excitation on the given boundary in order to excite a frequency or time domain driven simulation or magnetostatic simulation. For the magnetostatic simulation type, entries of the inductance matrix are extracted corresponding to each surface current boundary.
"Ground" : Top-level object for specifying ground, or zero voltage, boundary conditions for for electrostatic simulations.
"ZeroCharge" : Top-level object for specifying zero charge boundary conditions for for electrostatic simulations. Also imposes symmetry of the electric field across the boundary surface.
"Terminal" : Array of objects for configuring terminal boundary conditions for electrostatic simulations. Entries of the capacitance matrix are extracted corresponding to each terminal boundary.
"Postprocessing" : Top-level object for configuring boundary postprocessing.
"Capacitance" : Array of objects for postprocessing surface capacitance by the ratio of the integral of the induced surface charge on the boundary and the excitation voltage.
"Inductance" : Array of objects for postprocessing surface inductance by the ratio of the integral of the magnetic flux through the boundary and the excitation current.
"Dielectric" : Array of objects for postprocessing surface interface dielectric loss.
"Attributes" [None] : Integer array of mesh boundary attributes at which to apply farfield absorbing boundary conditions.
"Order" [1] : Specify a first- or second-order approximation for the farfield absorbing boundary condition. Second-order absorbing boundary conditions are only available for the frequency domain driven simulation type.
"Attributes" [None] : Integer array of mesh boundary attributes for this finite conductivity boundary.
"Conductivity" [None] : Electrical conductivity for this finite conductivity boundary, S/m.
"Permeability" [1.0] : Relative permeability for this finite conductivity boundary.
"Thickness" [None] : Optional conductor thickness for this finite conductivity boundary specified in mesh length units. Activates a finite conductivity boundary condition which accounts for nonzero metal thickness.
"Index" [None] : Index of this lumped port, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this lumped port boundary. If this port is to be a multielement lumped port with more than a single lumped element, use the "Elements" array described below.
"Direction" [None] : Direction to define the polarization direction of the port field mode on this lumped port boundary. Lumped ports must be axis-aligned unless the port is a coaxial port. The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z", "+R", "-R" ("R" is for a coaxial lumped port). If this port is to be a multielement lumped port with more than a single lumped element, use the "Elements" array described below.
"Excitation" [false] : Turns on or off port excitation for this lumped port boundary for driven or transient simulation types.
"R" [0.0] : Circuit resistance used for computing this lumped port boundary's impedance, $\Omega$. This option should only be used along with the corresponding "L" and "C" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"L" [0.0] : Circuit inductance used for computing this lumped port boundary's impedance, H. This option should only be used along with the corresponding "R" and "C" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"C" [0.0] : Circuit capacitance used for computing this lumped port boundary's impedance, F. This option should only be used along with the corresponding "R" and "L" parameters, and not with any of the surface parameters "Rs", "Ls", or "Cs".
"Rs" [0.0] : Surface resistance used for computing this lumped port boundary's impedance, $\Omega$/sq. This option should only be used along with the corresponding "Ls" and "Cs" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Ls" [0.0] : Surface inductance used for computing this lumped port boundary's impedance, H/sq. This option should only be used along with the corresponding "Rs" and "Cs" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Cs" [0.0] : Surface capacitance used for computing this lumped port boundary's impedance, F/sq. This option should only be used along with the corresponding "Rs" and "Ls" parameters, and not with any of the circuit parameters "R", "L", or "C".
"Elements"[]["Attributes"] [None] : This option is for multielement lumped ports and should not be combined with the "Attributes" field described above. Each element of a multielement lumped port can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement port add in parallel.
"Elements"[]["Direction"] [None] : This option is for multielement lumped ports and should not be combined with the "Direction" field described above. Each element of a multielement lumped port can be described by its own unique direction, which is specified here. The elements of a multielement port add in parallel.
"Attributes" [None] : Integer array of mesh boundary attributes to consider along with those specified under config["Boundaries"]["PEC"]["Attributes"] as PEC when performing wave port boundary mode analysis.
"Index" [None] : Index of this surface current boundary, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this surface current boundary. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the "Elements" array described below.
"Direction" [None] : Defines the source current direction for this surface current boundary. The available options are the same as under config["Boundaries"]["LumpedPort"]["Direction"]. If this source is to be a multielement source which distributes the source across more than a single lumped element, use the "Elements" array described below.
"Elements"[]["Attributes"] [None] : This option is for multielement surface current boundaries should not be combined with the "Attributes" field described above. Each element of a multielement current source can be described by its own unique integer array of mesh boundary attributes, which are specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.
"Elements"[]["Direction"] [None] : This option is for multielement surface current boundaires and should not be combined with the "Direction" field described above. Each element of a multielement current source can be described by its own unique direction, which is specified here. The elements of a multielement source add in parallel to give the same total current as a single-element source.
"Index" [None] : Index of this inductance postprocessing boundary, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this inductance postprocessing boundary.
"Direction" [None] : Defines the global direction with which to orient the surface normals with computing the magnetic flux for this inductance postprocessing boundary. The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z".
"Index" [None] : Index of this lossy dielectric interface, used in postprocessing output files.
"Attributes" [None] : Integer array of mesh boundary attributes for this lossy dielectric interface. If the interface consists of multiple elements with different "Side" values, use the "Elements" array described below.
"Side" [None] : Defines the postprocessing side when this dielectric interface is an internal boundary surface (and thus the electric field on the boundary is in general double-valued). The available options are: "+X", "-X", "+Y", "-Y", "+Z", "-Z". If the boundary is not axis-aligned, the field value is taken from the side which is oriented along the specified direction. If no "Side" is specified, the field solution is taken from the neighboring element with the smaller electrical permittivity, which is an attempt to get the field in the domain corresponding to vacuum. If the interface consists of multiple elements with different "Side" values, use the "Elements" array described below.
"Thickness" [None] : Thickness of this dielectric interface, specified in mesh length units.
"Permittivity" [None] : Relative permittivity for this dielectric interface. Leads to the general quality factor calculation without assuming the interface is a specific metal-air (MA), metal-substrate (MS), or substrate-air (SA) interface. None of "PermittivityMA", "PermittivityMS", or "PermittivitySA" should be specified when this value is given.
"PermittivityMA" [None] : Relative permittivity for this dielectric interface assuming it is a metal-air (MA) interface. None of "PermittivityMS", "PermittivitySA", or the general "Permittivity" should be specified when this value is given.
"PermittivityMS" [None] : Relative permittivity for this dielectric interface assuming it is a metal-substrate (MS) interface. None of "PermittivityMA", "PermittivitySA", or the general "Permittivity" should be specified when this value is given.
"PermittivitySA" [None] : Relative permittivity for this dielectric interface assuming it is a substrate-air (SA) interface. None of "PermittivityMA", "PermittivityMS", or the general "Permittivity" should be specified when this value is given.
"LossTan" [0.0] : Loss tangent for this lossy dielectric interface.
"Elements"[]."Attributes" [None] : This option should not be combined with the "Attributes" field described above. In the case where a single dielectric interface is made up of contributions with their own unique integer arrays of mesh boundary attributes, they can be specified here.
"Elements"[]."Side" [None] : This option should not be combined with the "Side" field described above. In the case where a single dielectric interface is made up of contributions with their own entry for side, they can be specified here.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
A configuration file written in the JSON format is used specify the runtime options for a Palace simulation. The following sections give a detailed overview of the file format and available settings.
Parameters are specified in the form of keyword/value pairs where the key is a string and the value may be a string, boolean, integer or floating point number, or array. Parameters are grouped into a hierarchy of objects. We support relaxed JSON formatting with C++-style comments (//, /* */). Integer arrays can be specified as comma-separated lists of integers or integer ranges, for example [1,3-5,6] is parsed as [1,3,4,5,6].
In the following sections, default values for the parameters are specified alongside the description of each keyword in square brackets. Keywords for which there is no default value listed ([None]) are required in general if specifying values for other keywords under the same top-level object.
The top-level JSON object of the configuration file has the following structure:
"Materials":
+[
+ // Material 1
+ {
+ "Attributes": [<int array>],
+ "Permeability": <float or float array>,
+ "Permittivity": <float or float array>,
+ "LossTan": <float or float array>,
+ "Conductivity": <float or float array>,
+ "LondonDepth": <float>,
+ "MaterialAxes": <array of float array>
+ },
+ // Material 2, 3, ...
+ ...
+]
with
"Attributes" [None] : Integer array of mesh domain attributes for this material.
"Permeability" [1.0] : Relative permeability for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"Permittivity" [1.0] : Relative permittivity for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"LossTan" [0.0] : Loss tangent for this material. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"Conductivity" [0.0] : Electrical conductivity for this material, S/m. Activates Ohmic loss model in the material domain. Scalar or vector of 3 coefficients corresponding to each of "MaterialAxes".
"LondonDepth" [0.0] : London penetration depth for this material, specified in mesh length units. Activates London equations-based model relating superconducting current and electromagnetic fields in the material domain.
"MaterialAxes" [[1.0,0.0,0.0], [0.0,1.0,0.0], [0.0,0.0,1.0]] : Axes directions for specification of anisotropic material properties. Required to be unit length and orthogonal.
"Mesh" [None] : Input mesh file path, an absolute path is recommended.
"L0" [1.0e-6] : Mesh vertex coordinate length unit, m.
"Lc" [0.0] : Characteristic length scale used for nondimensionalization, specified in mesh length units. A value less than or equal to zero uses an internally calculated length scale based on the bounding box of the computational domain.
"Refinement" : Top-level object for configuring mesh refinement.
"UniformLevels" [0] : Levels of uniform parallel mesh refinement to be performed on the input mesh.
"Boxes" : Array of box region refinement objects. All elements with a node inside the box region will be marked for refinement.
"Spheres" : Array of sphere region refinement objects. All elements with a node inside the sphere region will be marked for refinement.
"Levels" [0] : Levels of parallel mesh refinement inside the specified refinement region.
"XLimits" [None] : Floating point array of length 2 specifying the limits in the $x$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"YLimits" [None] : Floating point array of length 2 specifying the limits in the $y$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"ZLimits" [None] : Floating point array of length 2 specifying the limits in the $z$-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.
"Center" [None] : Floating point array of length equal to the model spatial dimension specfiying the center coordinates of the sphere for this sphere refinement region. Specified in mesh length units.
"Radius" [None] : The radius of the sphere for this sphere refinement region, specified in mesh length units.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
"Order" [1] : Finite element order (degree). Arbitrary high-order spaces are supported.
"Eigenmode" : Top-level object for configuring the eigenvalue solver for the eigenmode simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Eigenmode".
"Driven" : Top-level object for configuring the frequency domain driven simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Driven".
"Transient" : Top-level object for configuring the time domain driven simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Transient".
"Electrostatic" : Top-level object for configuring the electrostatic simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Electrostatic".
"Magnetostatic" : Top-level object for configuring the magnetostatic simulation type. Thus, this object is only relevant for config["Problem"]["Type"]: "Magnetostatic".
"Linear" : Top-level object for configuring the linear solver employed by all simulation types.
"Target" [None] : (Nonzero) frequency target above which to search for eigenvalues, GHz.
"Tol" [1.0e-6] : Relative convergence tolerance for the eigenvalue solver.
"MaxIts" [0] : Maximum number of iterations for the iterative eigenvalue solver. A value less than 1 uses the solver default.
"MaxSize" [0] : Maximum subspace dimension for eigenvalue solver. A value less than 1 uses the solver default.
"N" [1] : Number of eigenvalues to compute.
"Save" [0] : Number of computed field modes to save to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Type" ["Default"] : Specifies the eigenvalue solver to be used in computing the given number of eigenmodes of the problem. The available options are:
"SLEPc"
"ARPACK"
"FEAST"
"Default" : Use the default eigensolver. Currently, this is the Krylov-Schur eigenvalue solver from "SLEPc".
"ContourTargetUpper" [None] : Specifies the upper frequency target of the contour used for the FEAST eigenvalue solver, GHz. This option is relevant only for "Type": "FEAST".
"ContourAspectRatio" [None] : Specifies the aspect ratio of the contour used for the FEAST eigenvalue solver. This should be greater than zero, where the aspect ratio is the ratio of the contour width to the frequency range("ContourTargetUpper" - "Target"). This option is relevant only for "Type": "FEAST".
"ContourNPoints" [4] : Number of contour integration points used for the FEAST eigenvalue solver. This option is relevant only for "Type": "FEAST".
"MinFreq" [None] : Lower bound of frequency sweep interval, GHz.
"MaxFreq" [None] : Upper bound of frequency sweep interval, GHz.
"FreqStep" [None] : Frequency step size for frequency sweep, GHz.
"SaveStep" [0] : Controls how often, in number of frequency steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"SaveOnlyPorts" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.
"AdaptiveTol" [0.0] : Relative error convergence tolerance for adaptive frequency sweep. If zero, adaptive frequency sweep is disabled and the full-order model is solved at each frequency step in the specified interval. If positive, this tolerance is used to ensure the reliability of the reduced-order model relative to the full-order one in the frequency band of interest.
"AdaptiveMaxSamples" [10] : Maximum number of frequency samples used to construct the reduced-order model for adaptive fast frequency sweep, if the specified tolerance ("AdaptiveTol") is not met first.
"AdaptiveMaxCandidates" [NumFreq/5] : Maximum number of frequency samples to consider as candidates for computing the reduced-order model error when adaptively sampling new points in order to construct the reduced-order for adaptive fast frequency sweep. The default is less than the requested number of frequency points in the sweep.
"Restart" [1] : Iteration (1-based) from which to restart for a partial frequency sweep simulation. That is, the initial frequency will be computed as "MinFreq" + ("Restart" - 1) * "FreqStep".
"Type" ["Default"] : Specifies the time integration scheme used for the discretization of the second-order system of differential equations. The available options are:
"GeneralizedAlpha" : The second-order implicit generalized-$\alpha$ method with $\rho_\inf = 1.0$. This scheme is unconditionally stable.
"NewmarkBeta" : The second-order implicit Newmark-$\beta$ method with $\beta = 1/4$ and $\gamma = 1/2$. This scheme is unconditionally stable.
"CentralDifference" : The second-order explicit central difference method, obtained by setting $\beta = 0$ and $\gamma = 1/2$ in the Newmark-$\beta$ method. In this case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step.
"Default" : Use the default "GeneralizedAlpha" time integration scheme.
"Excitation" [None] : Controls the time dependence of the source excitation. The available options are:
"Sinusoidal" : A sinusoidal excitation at a user specified frequency.
"Gaussian" : A Gaussian pulse with a user specified width which defines the bandwidth.
"DifferentiatedGaussian" : A differentiated Gaussian pulse with a user specified width which defines the bandwidth.
"ModulatedGaussian" : A modulated Gaussian pulse at a user specified center frequency and width used to excite the system without any DC component.
"Ramp" : A differentiable unit step function to model the ramp up to a DC signal.
"SmoothStep" : A smoother many-times differentiable unit step function to model the ramp up to a DC signal over a specified width of time.
"ExcitationFreq" [None] : Center frequency used for harmonic source excitations, GHz. Only relevant when "Excitation" is one of "Sinusoidal", "Gaussian", "DifferentiatedGaussian", or "ModulatedGaussian".
"ExcitationWidth" [None] : Pulse width for Gaussian-type source excitations, ns. Only relevant when "Excitation" is one of "Gaussian", "DifferentiatedGaussian", "ModulatedGaussian", or "SmoothStep".
"MaxTime" [None] : End of simulation time interval, ns. Transient simulations always start from rest at $t = 0.0$.
"TimeStep" [None] : Uniform time step size for time integration, ns.
"SaveStep" [0] : Controls how often, in number of time steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"SaveOnlyPorts" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.
"Save" [0] : Number of computed electric field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed capacitance matrix. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Save" [0] : Number of computed magnetic field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed inductance matrix. Files are saved in the paraview/ directory under the directory specified by config["Problem"]["Output"].
"Type" ["Default"] : Specifies the solver used for preconditioning the linear system of equations to be solved for each simulation type. The available options are:
"SuperLU" : The SuperLU_DIST sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with SuperLU_DIST support.
"STRUMPACK" : The STRUMPACK sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with STRUMPACK support.
"MUMPS" : The MUMPS sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with MUMPS support.
"BoomerAMG" : The BoomerAMG algebraic multigrid solver from Hypre.
"Default" : Use the default "AMS" solver for simulation types involving definite or semi-definite curl-curl operators (time domain problems as well as magnetostatics). For frequency domain problems, use a sparse direct solver if available, otherwise uses "AMS". For electrostatic problems, uses "BoomerAMG".
"KSPType" ["Default"] : Specifies the iterative Krylov subspace solver type for solving linear systems of equations arising for each simulation type. The available options are:
"CG"
"GMRES"
"FGMRES"
"Default" : Use the default "GMRES" Krylov subspace solver for frequency domain problems, that is when config["Problem"]["Type"] is "Eigenmode" or "Driven". For the other simulation types, the linear system matrix is always real and symmetric positive definite (SPD) and the preconditioned conjugate gradient method ("CG") is used as the Krylov solver.
"Tol" [1.0e-6] : Relative (preconditioned) residual convergence tolerance for the iterative linear solver.
"MaxIts" [100] : Maximum number of iterations for the iterative linear solver.
"MaxSize" [0] : Maximum Krylov space size for the GMRES and FGMRES solvers. A value less than 1 defaults to the value specified by "MaxIts".
"UseGMG" [true] : Enable or not geometric multigrid solver which uses h- and p-multigrid coarsening as available to construct the multigrid hierarchy. The solver specified by "Type" is used on the coarsest level. A Hiptmair smoother is applied to all other levels.
"UsePCShifted" [false] : When set to true, constructs the preconditioner for frequency domain problems using a real SPD approximation of the system matrix, which can help performance at high frequencies (relative to the lowest nonzero eigenfrequencies of the model).
"MGCycleIts" [1] : Number of V-cycle iterations per preconditioner application for multigrid preconditioners (when "UseGMG" is true or "Type" is "AMS" or "BoomerAMG").
"MGSmoothIts" [1] : Number of pre- and post-smooth iterations used for multigrid preconditioners (when "UseGMG" is true or "Type" is "AMS" or "BoomerAMG").
"MGSmoothOrder" [3] : Order of polynomial smoothing for geometric multigrid preconditioning (when "UseGMG" is true).
Automated source code formatting is performed using clang-format. Run:
./scripts/format_source
in the repository root directory to automatically use clang-format to format C++ source as well as JuliaFormatter.jl for Julia and Markdown files. The script can be viewed in the repository.
The following conventions also apply:
PascalCase for classes and function names.
Follow 'include what you use' (IWYU), with the include order dictated by the Google C++ Style Guide. This order should be automatically enforced by the clang-formatstyle file.
Code comments should be full sentences, with punctuation. At this time, no Doxygen API reference is generated and so comments generally do not need to conform to Doxygen syntax.
During the cmake configuration step, definining the variables ANALYZE_SOURCES_CLANG_TIDY and ANALYZE_SOURCES_CPPCHECK to ON will turn on static analysis using clang-tidy and cppcheck, respectively, during the build step. This requires the executables to be installed and findable by CMake on your system.
A JSON format configuration file, for example named config.json, can be validated against the provided Schema using:
./scripts/validate_config config.json
This script uses Julia's JSONSchema.jl and the Schema provided in scripts/schema/ to parse the configuration file and check that the fields are correctly specified. This script and the associated Schema are also installed and can be accessed in <INSTALL_DIR>/bin.
The files for this example can be found in the examples/cavity/ directory of the Palace source code.
This example demonstrates Palace's eigenmode simulation type to solve for the lowest frequency modes of a cylindrical cavity resonator. In particular, we consider a cylindrical cavity filled with Teflon ($\varepsilon_r = 2.08$, $\tan\delta = 4\times 10^{-4}$), with radius $a = 2.74\text{ cm}$ and height $d = 2a$. From [1], the frequencies of the $\text{TE}_{nml}$ and $\text{TM}_{nml}$ modes are given by
where $p_{nm}$ and $p'_{nm}$ denote the $m$-th root ($m\geq 1$) of the $n$-th order Bessel function ($n\geq 0$) of the first kind, $J_n$, and its derivative, $J'_n$, respectively.
In addition, we have analytic expressions for the unloaded quality factors due to dielectric loss, $Q_d$, and imperfectly conducting walls, $Q_c$. In particular,
field is set to "Eigenmode", and we use the mesh shown above with a single level of uniform mesh refinement ("UniformLevels": 1). The material properties for Teflon are entered under config["Domains"]["Materials"]. The config["Domains"]["Postprocessing"]["Dielectric]" object is used to extract the quality factor due to bulk dielectric loss; in this problem since there is only one domain this is trivial, but in problems with multiple material domains this feature can be used to isolate the energy-participation ratio (EPR) and associated quality factor due to different domains in the model.
The only difference between the two configuration files is in the "Boundaries" object: cavity_pec.json prescribes a perfect electric conductor ("PEC") boundary condition to the cavity boundary surfaces, while cavity_impedance.json prescribes a surface impedance condition with the surface resistance $R_s = 0.0184\text{ }\Omega\text{/sq}$, for copper at $5\text{ GHz}$.
In both cases, we configure the eigenvalue solver to solve for the $15$ lowest frequency modes above $2.0\text{ GHz}$ (the dominant mode frequencies for both the $\text{TE}$ and $\text{TM}$ cases fall around $2.9\text{ GHz}$ frequency for this problem). A sparse direct solver is used for the solutions of the linear system resulting from the spatial discretization of the governing equations, using in this case a second- order finite element space.
The frequencies for the lowest order $\text{TE}$ and $\text{TM}$ modes computed using the above formula for this problem are listed in the table below.
$(n,m,l)$
$f_{\text{TE}}$
$f_{\text{TM}}$
$(0,1,0)$
––
$2.903605\text{ GHz}$
$(1,1,0)$
––
$4.626474\text{ GHz}$
$(2,1,0)$
––
$6.200829\text{ GHz}$
$(0,1,1)$
$5.000140\text{ GHz}$
$3.468149\text{ GHz}$
$(1,1,1)$
$2.922212\text{ GHz}$
$5.000140\text{ GHz}$
$(2,1,1)$
$4.146842\text{ GHz}$
$6.484398\text{ GHz}$
$(0,1,2)$
$5.982709\text{ GHz}$
$4.776973\text{ GHz}$
$(1,1,2)$
$4.396673\text{ GHz}$
$5.982709\text{ GHz}$
$(2,1,2)$
$5.290341\text{ GHz}$
$7.269033\text{ GHz}$
First, we examine the output of the cavity_pec.json simulation. The file postpro/pec/eig.csv contains information about the computed eigenfrequencies and associated quality factors:
Indeed we can find a correspondence between the analytic modes predicted and the solutions obtained by Palace. Since the only source of loss in the simulation is the nonzero dielectric loss tangent, we have $Q = Q_d = 1/0.0004 = 2.50\times 10^3$ in all cases.
Next, we run cavity_impedance.json, which adds the surface impedance boundary condition. Examining postpro/impedance/eig.csv we see that the mode frequencies are roughly unchanged but the quality factors have fallen due to the addition of imperfectly conducting walls to the model:
However, the bulk dielectric loss postprocessing results, written to postpro/impedance/domain-Q.csv, still give $Q_d = 2.50\times 10^3$ for every mode as expected.
Focusing on the $\text{TE}_{011}$ mode with $f_{\text{TE},010} = 5.00\text{ GHz}$, we can read the mode quality factor $Q = 2.30\times 10^3$. Subtracting out the contribution of dielectric losses, we have
The effect of mesh size can be investigated for the cylindrical cavity resonator using convergence_study.jl. For a polynomial order of solution and refinement level, a mesh is generated using Gmsh using polynomials of the same order to resolve the boundary geometry. The eigenvalue problem is then solved for $f_{\text{TM},010}$ and $f_{\text{TE},111}$, and the relative error, $\frac{f-f_{\text{true}}}{f_{\text{true}}}$, of each mode plotted against $\text{DOF}^{-\frac{1}{3}}$, a notional mesh size. Three different element types are considered: tetrahedra, prisms and hexahedra, and the results are plotted below. The $x$-axis is a notional measure of the overall cost of the solve, accounting for polynomial order.
+
+
+
+
+
+
The observed rate of convergence for the eigenvalues are $p+1$ for odd polynomials and $p+2$ for even polynomials. Given the eigenmodes are analytic functions, the theoretical maximum convergence rate is $2p$[2]. The figures demonstrate that increasing the polynomial order of the solution will give reduced error, however the effect may only become significant on sufficiently refined meshes.
[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012. [2] A. Buffa, P. Houston, I. Perugia, Discontinuous Galerkin computation of the Maxwell eigenvalues on simplicial meshes, Journal of Computational and Applied Mathematics 204 (2007) 317-333.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
diff --git a/previews/PR38/examples/coaxial/index.html b/previews/PR38/examples/coaxial/index.html
new file mode 100644
index 000000000..aaedc5d3c
--- /dev/null
+++ b/previews/PR38/examples/coaxial/index.html
@@ -0,0 +1,9 @@
+
+Signal Propagation in a Coaxial Cable · Palace
The files for this example can be found in the examples/coaxial/ directory of the Palace source code.
Palace can perform transient electromagnetic modeling, acting as a so-called finite element time domain (FETD) solver. To demonstrate this feature, we consider here the propagation of an electromagnetic pulse through a section of coaxial cable. The model is constructed based on a $50\text{ }\Omega$ RG-401/U coaxial cable [1], with outer and inner conductor diameters of $0.215\text{ in}$ and $0.0645\text{ in}$, respectively. The section length is roughly $1.5\text{ in}$. The Teflon dielectric material has $\varepsilon_r = 2.08$, and we consider $\tan\delta = 4\times 10^{-2}$, a factor of $100$ above the actual value in order to exaggerate losses in the transmission line.
In this example we consider three different configurations of the model, all with a coaxial lumped port excitation at one end of the line: an open termination at the opposite end (coaxial_open.json), a shorted termination(coaxial_short.json), and a matched $50\text{ }\Omega$ lumped port termination (coaxial_matched.json).
The mesh is generated using the Julia code in mesh/mesh.jl and consists of quadratically-curved hexahedral elements, as depicted below. Third-order shape functions are used to approximate the solution.
+
+
Each configuration file sets the simulation "Type" to "Transient". The different termination configurations are specified by using a "LumpedPort" with matched impedance for the matched termination, a "PEC" boundary for the shorted termination, leaving no boundary condition specified for the open termination. This last case applies the natural boundary condition for the finite element formulation which is a perfect magnetic conductor boundary condition, enforcing zero tangential magnetic field and thus zero surface current density.
The excitation pulse is configured under config["Solver"]["Transient"]. Here, we use a modulated Gaussian pulse shape, with time dependence given by the expression
For this simulation, we use a center frequency $f = \omega/2\pi = 10\text{ GHz}$ and pulse width $\tau = 0.05\text{ ns}$. The offset $t_0$ is automatically chosen by Palace in order to smoothly ramp up the excitation from the rest initial condition. Time integration uses the second-order implicit Generalized-$\alpha$ scheme with a uniform time step $\Delta t = 5\times 10^{-3}\text{ ns}$, and the solution is computed for the interval $t\in[0.0,1.0]\text{ ns}$. The electric and magnetic field solutions are sampled every $10$ time steps for visualization.
Below, we plot the time histories of the port voltage at the excited coaxial lumped port for the three simulation cases.
+
+
We can observe that as expected, the matched termination absorbs the incident waveform nearly perfectly, while it is reflected with the same polarity for the shorted termination and opposite polarity for the open termination (phase shifted by $\pi$). Furthermore, the reflected wave is noticably attenuated due to the material loss of the transmission line dielectric.
Lastly, an animation of the signal propagation for the matched (left) and shorted (right) simulations, constructed using the saved fields, is shown below.
The files for this example can be found in the examples/cpw/ directory of the Palace source code.
In this example, we construct a frequency domain model to analyze the wave transmission, reflection, near-end crosstalk, and far-end crosstalk for a four-port system comprised of two side-by-side coplanar waveguides (CPW). Each CPW is characterized by a trace width $w = 30\text{ μm}$ and gap width $s = 18\text{ μm}$. The metal is modeled as an infinitely thin, perfectly conducting boundary surface on top of a sapphire dielectric substrate (parallel to C-axis: $\varepsilon_r = 11.5$, $\tan\delta = 8.6\times 10^{-5}$, perpendicular to C-axis: $\varepsilon_r = 9.3$, $\tan\delta = 3.0\times 10^{-5}$) of $500\text{ μm}$ thickness with the C-axis in the z-direction. This yields a characteristic impedance $Z_0 = 56.02\text{ }\Omega$ for each of the lines [1]. The center-to-center separating distance between the transmission lines on the substrate is $266\text{ μm}$, which means there is exactly $200\text{ μm}$ of ground plane between them.
A visualization of the computational domain is shown below.
+
+
There are two different options for modeling the termination at the ends of the CPW:
Lumped port: A multielement uniform lumped port can be used to terminate the CPW by connecting the center conductor to the ground plane on each side with impedance $Z = 2Z_0$.
Wave port: We can solve a 2D boundary eigenvalue problem for the mode shape and propagation constants for the characteristic CPW mode, and use this to terminate the transmission line.
Views of the mesh boundaries for these two configurations are shown below. In both cases the computational domain is discretized using an unstructured tetrahedral mesh. The mesh files are mesh/cpw_wave.msh and mesh/cpw_lumped.msh, respectively.
+
+
+
Likewise, there are two different options for how the system response is calculated over the desired frequency band:
Uniform: Sample the frequency band with the full-fidelity model at equally spaced frequencies over the desired range.
Adaptive: Use the full-fidelity model to sample the solution at a few adaptively selected frequency points in the desired band, and then construct a low-cost surrogate model which is used to compute the response over the entire band.
The frequency response is computed for the band $f\in[2.0,30.0]\text{ GHz}$. For the uniform sweep, a step size of $\Delta f=2.0\text{ GHz}$ is used, while the adaptive sweep employs a much finer step size $\Delta f=0.1\text{ GHz}$. The adaptive fast frequency sweep algorithm is given a tolerance of $1\times10^{-3}$ for choosing the sampling points; the simulation with uniform ports uses $9$ frequency samples and that with wave ports uses $10$. Despite the much finer frequency resolution, the adaptive frequency sweep simulations take roughly the same amount of time as the uniform ones where the resulting resolution is worse by a factor of $20$. Lastly, for all simulations, a single level of uniform mesh refinement is applied to the initial mesh and a first-order finite element approximation for the solution is used.
The results from the four different simulations are presented in the plots below.
+
+
+
+
+
The first remark is that in both the lumped port and wave port cases, the adaptive fast frequency sweep results are very close to the true solutions sampled by the uniform sweeps.
Second, there is a discrepancy between the results using lumped ports and those with wave ports, namely the lumped port excitation exhibits much higher reflection that that for wave ports. This can be attributed to the coarse meshes used for these examples. Indeed, refining the mesh or increasing the order of the solution approximation resolves this issue and leads to better agreement between the lumped port and wave port results. See below for the results with again a single level of mesh refinement but $p = 2$ for the order of the solution space.
Some examples of using Palace, including configuration and mesh files, can be found in the examples/ directory of the source code. The following sections provide complete tutorials for each of the available example applications.
These examples are also used by Palace's regression testing suite. See the test/ directory for more details.
The files for this example can be found in the examples/rings/ directory of the Palace source code.
This example seeks to compute the inductance matrix for a system of two concentric current-carrying rings of radii $r_a$ and $r_b$, each with width $w$. As for the previous example, the permeability of the surrounding medium is assumed to be the permeability of free space. The mutual inductance, $M_{ab}$, can be easily computed for the case where $r_a\ll r_b$ and $w = 0$ using the Biot-Savart law as
\[M_{ab} = \frac{\mu_0\pi r_b^2}{2 r_a} \,.\]
Analytic expressions for the self inductance of this configuration can also be derived, for example from [1] we have
We take in this case $r_a = 10 \text{ μm}$, $r_b = 100 \text{ μm}$, and $w = 1 \text{ μm}$. The mesh.jl script in the mesh/ directory is used to generate an unstructured tetrahedral mesh with Gmsh, saved to mesh/rings.msh, and a depiction is shown below.
+
+
The configuration file for the Palace simulation is rings.json. The simulation "Type" is "Magnetostatic", and we add "SurfaceCurrent" boundaries for applying a surface current to drive the inner or outer ring. The rest of the ring boundaries are labeled as "PEC" boundaries, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The farfield is also prescribed the "PEC" boundary condition. We seek a second-order solution and use the geometric multigrid AMS solver.
The computed inductance matrix is saved to disk as postpro/terminal-M.csv, and below we show its contents:
for the self inductances. Thus, the Palace solution has approximately $0.78\%$ error in the mutual inductance $1.9\%$ and $0.78\%$ errors in the self inductances versus the analytic solutions.
The typical approach used by Palace for lumped parameter extraction uses the computed field energies, but one can also compute the inductance by explicitly integrating the magnetic flux through a surface and dividing by the excitation current. This is configured under config["Boundaries"]["Postprocessing"]["Inductance"] in the configuration file. The resulting postprocessed values are written to postpro/surface-M.csv:
The values computed using the flux integral method are in close agreement to those above, as expected.
Lastly, we visualize the magnitude of the magnetic flux density field for the excitations of the inner and outer rings. The files for this visualization are again saved to the postpro/paraview directory.
[1] M. R. Alizadeh Pahlavani and H. A. Mohammadpour, Inductance comparison of the solenoidal coil of modular toroidal coils using the analytical and finite element method, Progress in Electromagnetics Research 20 (2010) 337-352.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
diff --git a/previews/PR38/examples/spheres/index.html b/previews/PR38/examples/spheres/index.html
new file mode 100644
index 000000000..86f1992cc
--- /dev/null
+++ b/previews/PR38/examples/spheres/index.html
@@ -0,0 +1,23 @@
+
+Capacitance Matrix for Two Spheres · Palace
The files for this example can be found in the examples/spheres/ directory of the Palace source code.
In this example, we consider two conducting spheres of radii $a$ and $b$, with centers separated by a distance $c > a + b$. The surrounding medium is vacuum. An analytic solution for the capacitance matrix of this configuration exists and is given in [1]. The Maxwell capacitance matrix entries are given by the infinite series
where the subscript $a$ refers to the sphere with radius $a$ and likewise for $b$. The parameter $u$ is given by
\[\cosh{u} = \frac{c^2-a^2-b^2}{2ab} \,.\]
Here we take the values $a = 1\text{ cm}$, $b = 2\text{ cm}$, and $c = 5\text{ cm}$. A mesh is generated with Gmsh using the mesh.jl Julia script found in the mesh/ directory, which writes the mesh to mesh/spheres.msh. The resulting high-order mesh uses cubically-curved tetrahedral elements, and is pictured below.
+
+
+
The configuration file for the Palace simulation is found in spheres.json. We set the simulation "Type" to "Electrostatic", and add "Terminal" entries for the surface boundary of each sphere, corresponding to the entries of the capacitance matrix we wish to compute. The outer boundary of the computational domain, which is sufficiently far from the spheres, is prescribed a "Ground" boundary condition. We set the "Order" of the finite element approximation to $3$.
The resulting extracted Maxwell capacitance matrix is saved to disk in the CSV file postpro/terminal-C.csv:
which is computed using the first $n=12$ terms in the series after which convergence to a relative tolerance of $10^{-12}$ is reached. Thus, the errors in the capacitance coefficients by Palace are $0.57\%$, $1.9\%$, and $3.5\%$, respectively.
The mutual capacitance matrix can be computed from its Maxwell counterpart, and is saved in postpro/terminal-Cm.csv:
Additionally, while the typical approach used by Palace for lumped parameter extraction uses the computed field energies, the capacitance can also be calculated by directly integrating the charge on a boundary surface and dividing by the excitation voltage. The configuration file for this example contains this information under config["Boundaries"]["Postprocessing"]["Capacitance"]. The resulting capacitances are written to postpro/surface-C.csv:
and agree closely with the values computed using the default method above, as expected.
Finally, the postpro/paraview directory contains files for visualizing the computed field solutions with ParaView. Below we present the electrostatic potential fields for each terminal solution.
The perfect electric conductor (PEC) boundary condition (zero tangential electric field) is specified using the "PEC" boundary keyword under config["Boundaries"]. It is a homogeneous Dirichlet boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation.
For electrostatic simulations, the homogeneous Dirichlet boundary condition is prescribed using the "Ground" boundary keyword which prescribes zero voltage at the boundary.
The perfect magnetic conductor (PMC) boundary condition (zero tangential magnetic field) is a homogenous Neumann boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation. It is the natural boundary condition and thus it has the same effect as not specifying any additional boundary condition on external boundary surfaces. It can also be explicitly specified using the "PMC" boundary keyword under config["Boundaries"].
Likewise, for electrostatic simulations, the homogeneous Neumann boundary condition implies a zero-charge boundary, and thus zero gradient of the voltage in the direction normal to the boundary. This is specified using the "ZeroCharge" boundary keyword under config["Boundaries"].
The impedance boundary condition is a mixed (Robin) boundary condition and is available for the frequency or time domain finite element formulations and thus for eigenmode or frequency or time domain driven simulation types. It is specified using the "Impedance" boundary keyword. The surface impedance relating the tangential electric and magnetic fields on the boundary is computed from the parallel impedances due to the specified resistance, inductance, and capacitance per square.
Absorbing boundary conditions at farfield boundaries, also referred to as scattering boundary conditions, can be applied using the "Absorbing" boundary keyword under config["Boundaries"]. The first-order absorbing boundary condition is a special case of the above impedance boundary and is available for eigenmode or frequency or time domain driven simulation types. The second-order absorbing boundary condition is only available for frequency domain driven simulations.
Perfectly matched layer (PML) boundaries for frequency and time domain electromagnetic formulations are not yet implemented, but are common in solvers for computational electromagnetics and will be a useful addition.
A finite conductivity boundary condition can be specified using the "Conductivty" boundary keyword. This boundary condition models the effect of a boundary with non-infinite conductivity (an imperfect conductor) for conductors with thickness much larger than the skin depth. It is available only for frequency domain driven simulations.
For frequency domain driven simulations, ports are used to provide a lumped port excitation and postprocess voltages, currents, and scattering parameters. Likewise, for transient simulations, they perform a similar purpose but for time domain computed quantities.
For eigenmode simulations where there is no excitation, lumped ports are used to specify properties and postprocess energy-participation ratios (EPRs) corresponding to linearized circuit elements.
Note that a single lumped port (given by a single integer "Index") can be made up of multiple boundary attributes in the mesh in order to model, for example, a multielement lumped port.
config["Boundaries"]["WavePort"] : Numeric wave ports are available for frequency domain driven simulations. In this case, a port boundary condition is applied with an optional excitation using a modal field shape which is computed by solving a 2D boundary mode eigenproblem on each wave port boundary. This allows for more accurate scattering parameter calculations when modeling waveguides or transmission lines with arbitrary cross sections.
The homogenous Dirichlet boundary conditions for the wave port boundary mode analysis are taken from the "PEC" boundaries of the full 3D model, as well as any optional additional boundary attributes given under "WavePortPEC". Any boundary of the wave port not labeled with with a PEC condition has the natural boundary condition for zero tangential magnetic field prescribed for the purpose of port mode calculation.
Unlike lumped ports, wave port boundaries cannot be defined internal to the computational domain and instead must exist only on the outer boundary of the domain (they are to be "one-sided" in the sense that mesh elements only exist on one side of the boundary).
An alternative source excitation to lumped or wave ports for frequency and time domain driven simulations is a surface current excitation, specified under config["Boundaries"]["SurfaceCurrent"]. This is the excitation used for magnetostatic simulation types as well. This option prescribes a unit source surface current excitation on the given boundary in order to excite the model. It does does not prescribe any boundary condition to the model and only affects the source term on the right hand side.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
This user guide provides an overview of the different types of electromagnetic simulations which can be performed with Palace and the various features available in the solver.
The config["Model"] object is used to specify the mesh for the discretized computational domain. In general, inputs are expected to be dimensional nondimensionalized internally. A length scale, specified under config["Model"]["L0"], describes the length units of the mesh relative to 1 meter (i.e. config["Model"]["L0"]: 1.0e-6 if the mesh coordinates are in $\mu$m, this is the default value). All other entries in the configuration file which have units of length should be specified in units of config["Model"]["L0"] m.
Geometric attributes for domains and boundaries in the mesh are used to define material properties and boundary conditions on the desired model regions and surfaces (see config["Domains"] and config["Boundaries"]). These attribute integers correspond to tags for the domain and boundary elements in the mesh, and should be non-negative and start at 1. They do not need to be contiguous in the mesh file. Throughout the configuration file, the "Attributes" keyword is used to indicate which domain or boundary attributes are relevant to the material properties or boundary conditions being specified.
Refinement of the input mesh file can be performed using levels of global uniform refinement or region-based refinement, specified using the config["Model"]["Refinement"] object. The user can specify any combination of uniform refinement levels as well as local refinement regions which refines the elements inside of a certain box or sphere-shaped region. For simplex meshes, the refinement maintains a conforming mesh but meshes containing hexahedra, prism, or pyramid elements will be non-conforming after local refinement (this is not supported at this time).
Adaptive mesh refinement (AMR) according to error estimates in the computed solution is a work in progress for all simulation types.
Material properties are handled by the config["Domains"]["Materials"] object. Palace supports linear, frequency independent constitutive laws for material modeling.
Materials with scalar or general matrix-valued properties are supported. For most simulation types, each material in the model requires a specified relative permittivity and relative permeability (for electrostatic simulations, only the permittivity is required, while for magnetostatics, only the permeability is required). For dielectric domains, a loss tangent may be specified. Alternatively, for normal conducting domains, an electrical conductivity may be specified which is used to relate the current density and electric field via Ohm's law.
Modeling of superconducting domains is performed using the current-field constitutive relations given by the London equations. The user can specify a London penetration depth to activate this model. It can also be used in conjunction with a materal conductivity when wishing to model both superconducting and normal currents.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
diff --git a/previews/PR38/guide/postprocessing/index.html b/previews/PR38/guide/postprocessing/index.html
new file mode 100644
index 000000000..3bab1b112
--- /dev/null
+++ b/previews/PR38/guide/postprocessing/index.html
@@ -0,0 +1,3 @@
+
+Postprocessing and Visualization · Palace
As described in the section Problem Types, each simulation type writes relevant postprocessed scalar quantities to disk in the directory specified by config["Problem"]["Output"], including but not limited to computed values like eigenfrequencies, scattering parameters, or lumped element parameters. In addition, each simulation type will write a file called domain-E.csv, which includes information about the electric and magnetic field energies, as well as lumped element energies, for each step of the simulation (eigenmode, frequency, or time step, for examples).
The participation ratios for bulk dielectrics and interface dielectric layers can be computed for simulations involving the electric field. For model boundaries, the integrated surface charge or magnetic flux can also be postprocessed. These features are described in Domain postprocessing and in Boundary postprocessing.
Additionally, the computed fields can be automatically probed for their vector values at one or more points in space. This probe functionality is also described in Domain postprocessing.
Finally, as described further in Visualization, various field quantities on the 3D computational domain as well as 2D domain boundaries and material interfaces are written to disk when requested using the relevant parameters under config["Solver"]. These fields are meant to be visualized with ParaView.
Domain postprocessing capabilities are enabled by including objects under config["Domains"]["Postprocessing"] in the configuration file. These include:
config["Domains"]["Postprocessing"]["Dielectric"] : Postprocessess bulk dielectric loss based on the participation ratio of the electric field in a lossy region. The respective participation ratios and quality factors for each domain (associated with the specified domain attributes and indexed by the specified integer "Index") are computed using the material properties provided and are written to domain-Q.csv in the specified postprocessing output directory.
config["Domains"]["Postprocessing"]["Probe"] : Probe the values of the computed electric field and magnetic flux density solutions at specified locations in the computational domain. The availability of the $\bm{E}$ and $\bm{B}$ fields depends on the problem type (for example, for magnetostatic problems, only $\bm{B}$ is output and $\bm{E}$ is not computed, whereas the inverse is true for electrostatics). For each computed field, the postprocessed values are written to probe-E.csv and probe-B.csv in the specified output directory.
Boundary postprocessing capabilities are enabled by including objects under config["Boundaries"]["Postprocessing"] in the configuration file. These include:
config["Boundaries"]["Postprocessing"]["Capacitance"] : Postprocess the integral of the surface charge on a surface defined by a list of boundary attributes, and divide by the excitation voltage to get the capacitive coupling. The resulting capcitances are written to surface-C.csv in the specified output directory.
config["Boundaries"]["Postprocessing"]["Inductance"] : Postprocess the magnetic flux through a surface defined by a list of boundary attributes, and divide by the excitation current to the inductive coupling. The resulting inductances are written to surface-M.csv in the specified output directory.
When specified in the configuration file, the electric field and magnetic flux density solutions are written to disk for 3D visualization with ParaView. Various other postprocessed fields are also written to the ParaView database as available, including electric and magnetic energy density, surface currents, and charge density. These files are found in the paraview/ directory located in the output directory specified under config["Problem"]["Output"].
In addition to the full 3D fields, a ParaView data collection for the boundary mesh is also written to disk. The boundary mesh includes all surfaces with prescribed boundary conditions as well as any material interfaces in the computational domain.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
For eigenmode simulations, config["Problem"]["Type"]: "Eigenmode", the user should specify a nonzero (but arbitrarily small) frequency above which to search for eigenmodes. The computed eigenvalues are written to an ASCII file named eig.csv, in the directory specified by config["Problem"]["Output"].
Calculations related to energy-participation ratio (EPR) quantization can be performed with Palace when the user specifies lumped ports corresponding to the linearized lumped circuit elements in the model. In this case, the participation matrix for inductive elements is automatically generated for the specified number of modes and number of inductive lumped ports. The participation matrix is output in an ASCII file named port-EPR.csv.
The EPR framework can be used to characterize the dissipative elements in the model as well. In particular, lumped ports with nonzero resistance in the model will trigger coupling rate and quality factor calculations based on input-output (I-O) line coupling loss: By specifying resistive lumped ports in the model, the mode coupling quality factors will be computed as $Q_{ml} = \omega_m/\kappa_{ml}$. The output file port-Q.csv will be created in the output directory containing these mode qualty factor contributions. For bulk and interface dielectric loss calculations, which are not unique to the eigenmode simulation type, see the sections Domain postprocessing and Boundary postprocessing.
The default frequency sweep behavior for frequency domain driven simulations is to perform a uniform sampling from the minimum to the maximum specified frequency of interest, using the user specified step size. An adaptive fast frequency sweep strategy can also be used, activated by specifying a nonzero value for "AdaptiveTol" under the config["Solver"]["Driven"] object. In this case, using the high-dimensional model solution computed at a few automatically selected frequency samples, a low-cost model is constructed and used to compute the frequency response over the entire frequency range of interest. The specified error tolerance ensures that the approximate low-cost model is reliably accurate relative to the high-dimensional model within the frequency band of interest. This is particularly useful for fine-resolution sweeps containing many sample points, where it can yield a significant speedup over the default strategy.
Port scattering parameters, or S-parameters, are postprocessed for the column of the scattering matrix corresponding to the driven port index automatically for this simulation type and stored in an ASCII file named port-S.csv, in the directory specified by config["Problem"]["Output"]. In the case that more than a single lumped or wave port is excited or surface current excitations are used, scattering parameter output will be disabled for the simulation(though other quantities of interest are still postprocessed). When lumped ports are present, the peak complex lumped port voltages and currents computed for each excitation frequency are written to ASCII files named port-V.csv and port-I.csv, respectively, Additionally, the surface current excitations are written to surface-I.csv.
The previous simulation types describe simulations based on frequency domain formulations of Maxwell's equations. Time domain simulations are also possible through the transient simulation type: config["Problem"]["Type"]: "Transient". Similar to the driven simulation type in the frequency domain, transient simulations involve simulating the response of the system to a time-dependent excitation field specified at lumped ports or surface current excitations in the model. The system is always started from rest with zero initial conditions and time-integrated for a user specified duration, given in nanoseconds. There are several available excitation types which define the time dependence of the pulse or excitation waveform. These are specified under the config["Solver"]["Transient"] object using the "Excitation" keyword.
The time histories of the lumped port voltages and currents are postprocessed and automatically written to ASCII files named port-V.csv and port-I.csv, respectively, in the directory specified by config["Problem"]["Output"]. Additionally, surface current excitation time histories are written to surface-I.csv.
For electrostatic simulations, (config["Problem"]["Type"]: "Electrostatic", the user should specify a number of terminal boundaries (config["Boundaries"]["Terminal"]) as well as boundaries which are grounded (config["Boundaries"]["Ground"]). For each terminal, an electrostatic field is computed by assigning the terminal of interest a positive nonzero voltage and all other terminals and grounded boundaries a zero voltage. The resulting fields are then used to compute the Maxwell capacitance matrix and its inverse, which are written to an ASCII file named terminal-C.csv and terminal-Cinv.csv, respectively, in the directory specified by config["Problem"]["Output"]. The mutual capacitance matrix is also computed and written to terminal-Cm.csv in the same directory.
For magnetostatic simulations, (config["Problem"]["Type"]: "Magnetostatic", the user should specify a number of source current boundaries. For each current source, a magnetostatic field is computed by applying a unit current to the source index of interest, leaving all other sources open with no excitation. Surfaces which are expected to carry current should be labeled as perfectly conducting, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The resulting fields are used to compute the inductance matrix and its inverse, which are written to an ASCII file named terminal-M.csv and terminal-Minv.csv, respectively, in the directory specified by config["Problem"]["Output"]. A "mutual" inductance matrix which has the same form as the mutual capacitance matrix (its entries are based on current differences between ports rather than absolute currents) is computed and written to terminal-Mm.csv in the same directory.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
Palace, for PArallel LArge-scale Computational Electromagnetics, is an open-source, parallel finite element code for full-wave 3D electromagnetic simulations in the frequency or time domain, using the MFEM finite element discretization library.
Eigenmode calculations with optional material or radiative loss including lumped impedance boundaries. Automatic postprocessing of energy-participation ratios (EPRs) for circuit quantization and interface or bulk participation ratios for predicting dielectric loss.
Frequency domain driven simulations with surface current excitation and lumped or numeric wave port boundaries. Wideband frequency response calculation using uniform frequency space sampling or an adaptive fast frequency sweep algorithm.
Explicit or fully-implicit time domain solver for transient electromagnetic analysis.
Lumped capacitance and inductance matrix extraction via electrostatic and magnetostatic problem formulations.
Support for a wide range of mesh file formats for structured and unstructured meshes, with built-in uniform or region-based parallel mesh refinement.
Arbitrary high-order finite element spaces and curvilinear mesh support thanks to the MFEM library.
Scalable algorithms for the solution of linear systems of equations, including geometric multigrid (GMG), parallel sparse direct solvers, and algebraic multigrid (AMG) preconditioners, for fast performance on platforms ranging from laptops to HPC systems.
C and (optionally) Fortran compilers for dependency builds
MPI distribution
BLAS, LAPACK libraries (described below in Math libraries)
In addition, builds from source require the following system packages which are typically already installed and are available from most package managers (apt, yum, brew, etc.):
If the repository was already cloned without recursive checkout, git submodule update --init --recursive can be run to initialize or update the dependency repositories.
Then, a build using the default options can be performed by running the following from within the directory where the repository was cloned:
mkdir build && cd build
+cmake ..
+make -j
This installs the binary executable in build/bin/.
During the configure step, the build system will try to detect system installations of BLAS and LAPACK libraries depending on the system architecture according to the following procedure:
For x86_64 systems:
If the MKLROOT environment variable is set, looks for an Intel MKL installation.
If the AOCL_DIR or AOCLROOT environment variables are set, looks for an AMD Optimizing CPU Libraries (AOCL) installation of BLIS and libFLAME.
Otherwise, tries to locate an installation of OpenBLAS which is permissively licensed and available from most package managers.
Otherwise, tries to locate an installation of OpenBLAS.
If the installation path of OpenBLAS is non-standard or is not found by default, it can be set using the OPENBLAS_DIR or OPENBLASROOT environment variables, or added to CMAKE_PREFIX_PATH when calling CMake.
It is recommended in most cases to use a serial BLAS and LAPACK builds (not multithreaded), as the standard parallelization in approach in Palace is to use pure MPI parallelism.
Palace leverages the MFEM finite element discretization library. It always configures and builds its own installation of MFEM internally in order to support the most up to date features and patches. In addition, Palace uses:
As part of the Build from source, the CMake build will automatically build and install a small number of third-party dependencies before building Palace. The source code for these dependencies is downloaded using using Git submodules. These libraries include:
PETSc is built with complex number support. For solving eigenvalue problems, at least one of SLEPc or ARPACK-NG must be specified. Typically only one of the SuperLU_DIST, STRUMPACK, and MUMPS dependencies is required but by default all are built and the user can decide at runtime which solver to use.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
The solver computes a finite element approximation to the three-dimensional, time-harmonic Maxwell's equations in second-order form. The nondimensionalized, source-free, boundary value problem for $\bm{E}(\bm{x})\in\mathbb{C}^3$, $\bm{x}\in\Omega$, $\partial\Omega=\Gamma$, where $\bm{\mathscr{E}}(\bm{x},t) = \text{Re}\{\bm{E}(\bm{x})e^{i\omega t}\}$ denotes the electric field, is written as
where the nondimensionalization has been performed with respect to a characteristic length $L_0$, time $L_0/c_0$, magnetic field strength $H_0$, and electric field strength $Z_0 H_0$. Here, $c_0$ and $Z_0$ are the speed of light and impedance of free space, respectively. Given the electric field solution, the time-harmonic magnetic flux density can be calculated as
where $\varepsilon_r'$ is the real relative permittivity and $\tan{\delta}$ is the loss tangent. Alternatively, conductor loss is modeled by Ohm's law $\bm{J}=\sigma\bm{E}$ with electrical conductivity $\sigma>0.0$. For a superconducting domain, the constitive current-field relationship given by Ohm's law is replaced by that given by the London equations:
where $\lambda_L = \sqrt{m/\mu n_s e^2}/L_0$ is the nondimensionalized London penetration depth. In this case, the term $+i\omega\sigma \bm{E}$ arising for a normal conductor in the time-harmonic Maxwell's equations becomes $+(\mu_r \lambda_L^2)^{-1}\bm{E}$.
The domain boundary $\Gamma=\Gamma_{PEC}\cup\Gamma_{PMC}\cup\Gamma_{Z}$, is separated into perfect electric conductor (PEC), perfect magnetic conductor (PMC), and impedance boundaries, respectively. The PEC boundary condition is a homogenous Dirichlet condition, while the PMC boundary condition is the natural boundary condition for the problem and is satisfied at all exterior boundaries by the finite element formulation. Impedance boundaries are modeled using a Robin boundary condition with $\gamma = i\omega/Z_s$, in which $Z_s$ the surface impedance of the boundary, with units of impedance per square.
A time-dependent formulation is also available to compute the electric field response $\bm{E}(\bm{x},t)$ for a given time-dependent source excitation $\bm{U}^{inc}(\bm{x},t)$. The governing equations in this case are
subject to the same boundary conditions as the frequency-dependent case except for the Robin boundary condition which is written for a lumped resistive port boundary, for example, as
The second-order electric field formulation is chosen to take advantage of unconditionally stable implicit time-integration schemes without the expense of a coupled block system solve for $\bm{E}(\bm{x},t)$ and $\bm{B}(\bm{x},t)$. It offers the additional benefit of sharing many similarities in the spatial discretization as the frequency domain formulation outlined above.
For lumped port boundaries, the surface impedance can be related to an equivalent circuit impedance, $Z$. There are two common cases:
Rectangular ports: $Z = Z_s l / w$, where $l$ and $w$ are the length and width of the port, respectively (length here is defined as the distance between the two conductors).
Coaxial ports: $Z = Z_s \ln(b/a) / 2\pi$, where $a$ and $b$ denote the inner and outer radii of the port, respectively.
A lumped parallel RLC circuit boundary has a circuit impedance
\[\frac{1}{Z} = \frac{1}{R}+\frac{1}{i\omega L}+i\omega C \,.\]
Thus, the relationships between the circuit and surface element parameters for the user to specify are given by $R_s = \alpha R$, $L_s = \alpha L$, and $C_s = C/\alpha$, where $\alpha = w/l$ for a rectangular port or $\alpha = 2\pi / \ln(b/a)$ for a coaxial port.
For multielement lumped ports, the effective circuit impedance is given by
\[\frac{1}{Z} = \sum_k \frac{1}{Z_k} \,.\]
That is, the circuit impedances of each port contributing to the multielement port add in parallel. For the specific case of a two element multielement port with two identical lumped elements, we have $Z = (1/Z_1 + 1/Z_2)^{-1} = Z_k / 2$, where $Z_k$ is the circuit impedance of a single port element.
The source term $\bm{U}^{inc}$ in a driven frequency-response problem is related to the incident field at an excited port boundary by
where $(\bm{n}\times\bm{E}^{inc})\times\bm{n}$ is just the projection of the excitation field onto the port surface. The incident fields for lumped ports depend on the port shape:
Rectangular ports: $\bm{E}^{inc} = E_0 \, \hat{\bm{l}}$, where $E_0$ is a uniform constant field strength and $\hat{\bm{l}}$ a unit vector defining the direction of polarization on the port (typically should be the direction between the two conductors).
Coaxial ports: $\bm{E}^{inc} = \frac{E_0 r_0}{r} \, \hat{\bm{r}}$, where $E_0$ is again a uniform constant field strength, $r_0$ is a characteristic length for the port, $r$ is the distance from the port center, and $\hat{\bm{r}}$ a unit vector specifying the port radial direction.
In the time domain formulation, the source term $\bm{U}^{inc}$ appears as
where $\bm{E}^{inc}(\bm{x})$ is identical to the spatial excitation in the frequency domain formulation, and $p(t)$ describes the temporal shape of the excitation. Possible options include a sinusoidal, Gaussian, modulated Gaussian, or step excitation.
In the frequency domain, the scattering parameters can be postprocessed from the computed electric field for each lumped port with boundary $\Gamma_i$ as
In the time domain, the time histories of the port voltages can be Fourier-transformed to get their frequency domain representation for scattering parameter calculation.
Numeric wave ports assume a field with known normal-direction dependence $\bm{E}(\bm{x})=\bm{e}(\bm{x}_t)e^{ik_n x_n}$ where $k_n$ is the propagation constant. For each operating frequency $\omega$, a two-dimensional eigenvalue problem is solved on the port yielding the mode shapes $\bm{e}_m$ and associated propagaton constants $k_{n,m}$. These are used in the full 3D model where the Robin port boundary condition has coefficient $\gamma=i\text{Re}\{k_{n,m}\}/\mu_r$ and the computed mode is used to compute the incident field in the source term $\bm{U}^{inc}$ at excited ports. Scattering parameter postprocessing takes the same form as the lumped port counterpart using the computed modal solutions. Since the propagation constants are known for each wave port, scattering parameter de-embedding can be performed by specifying an offset distance $d$ for each port:
where the matrix $\bm{K}$ represents the discretized curl-curl operator, $\bm{M}$ the mass term, and $\bm{C}$ the port impedance boundary conditions. The damped frequency $\omega_d$ and quality factor $Q$ is postprocessed from each of the resulting eigenvalues as
The energy-participation ratio (EPR) for lumped inductive elements is computed from the electric and magnetic fields corresponding to eigenmode $m$, $\bm{E}_m$ and $\bm{H}_m$, using the formula
where $p_{mj}\in[-1,1]$ denotes the signed participation ratio for junction $j$ in mode $m$, $L_j$ is the provided junction circuit inductance, $I_ {mj}$ is the peak junction current for mode $m$, and $\mathcal{E}^{elec}_m$ is the electric energy in mode $m$. The junction current is computed using the mean voltage across the port, $\overline{V}_{mj}$, as $I_{mj} = \overline{V}_{mj}/Z_{mj}$, where $Z_{mj} = 1/(i\omega_m L_j)$ is the impedance of the inductive branch of the lumped circuit. The mean port voltage depends on the computed electric field mode and the shape of the port:
where $\bm{D}_m=\varepsilon_r\bm{E}_m$ is the electric flux density for mode $m$ and the second term on the right-hand side accounts for any lumped capacitive boundaries with nonzero circuit capacitance $C_j$.
The EPR can also be used to estimate mode quality factors due to input-output(I-O) line coupling. The mode coupling quality factor due to the $j$-th I-O port is given by
\[Q_{mj} = \frac{\omega_m}{\kappa_{mj}}\]
where the port coupling rate $\kappa_{mj}$ is calculated as
The quality factor due to bulk dielectric loss resulting from an electric field $\bm{E}$ present in domain $j$ with associated loss tangent $\tan{\delta}_j$ is given by
where $t_j$ is the thickness of the layer and $\bm{D} = \varepsilon_{r,j}\bm{E}$ is the electric displacement field in the layer evaluated using the relative permittivity of the interface $\varepsilon_{r,j}$. For an internal boundary, this integral is evaluated on a single side to resolve abiguity due to the discontinuity of $\bm{E}$ across the boundary.
The above formula for interface dielectric loss can be specialized for the case of a metal-air, metal-substrate, or substrate-air interface. In each case, the quality factor for interface $j$ is given by
For electrostatic simulations, the Maxwell capacitance matrix is computed in the following manner. First, the Laplace equation subject to Dirichlet boundary conditions is solved for each terminal with boundary $\Gamma_i$ in the model, yielding an associated voltage field $V_i(\bm{x})$:
For each port with boundary $\Gamma_i$, a unit source surface current $\bm{J}_s^{inc}$ is applied, yielding an associated vector potential solution $\bm{A}_i(\bm{x})$. Homogeneous Dirichlet boundary conditions $\bm{n}\times\bm{A}_i=0$ are also imposed on specified surfaces of the model. The magnetic field energy associated with any solution is
[1] J.-M. Jin, The Finite Element Method in Electromagnetics, Wiley-IEEE Press, Hoboken, NJ, Third edition, 2014. [2] P. Monk, Finite Element Methods for Maxwell's Equations, Oxford University Press, Oxford, 2003.
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
The installed palace script wraps a call to the desired MPI launcher (mpirun by default).
<NUM_PROCS> is the number of MPI processes to use for the simulation.
config.json is the JSON format configuration file used to specify the simulation parameters. The structure of this configuration file is outlined in detail in the section Configuration File.
A full list of available script options is available using the -h or --help flag.
During the course of a simulation, the solver will write a number of useful statistics and logging information to standard output. It is often helpful to save this information to a file, for example with:
<INSTALL_DIR>/bin/palace ... | tee log.out
Of course, the interested user can explicitly run the Palace binary in parallel, supplying options directly to their MPI launcher of choice, as:
where <MPI_RUN> is the MPI launcher command, [OPTIONS] is a list of command line options passed to the MPI launcher, and <ARCH> is the machine architecture (x86_64 or arm64).
Settings
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
This document was generated with Documenter.jl version 0.27.24 on Tuesday 13 June 2023. Using Julia version 1.9.1.
diff --git a/previews/PR38/search_index.js b/previews/PR38/search_index.js
new file mode 100644
index 000000000..f1b5751e8
--- /dev/null
+++ b/previews/PR38/search_index.js
@@ -0,0 +1,3 @@
+var documenterSearchIndex = {"docs":
+[{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"\n","category":"page"},{"location":"examples/coaxial/#Signal-Propagation-in-a-Coaxial-Cable","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"","category":"section"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"note: Note\nThe files for this example can be found in the examples/coaxial/ directory of the Palace source code.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Palace can perform transient electromagnetic modeling, acting as a so-called finite element time domain (FETD) solver. To demonstrate this feature, we consider here the propagation of an electromagnetic pulse through a section of coaxial cable. The model is constructed based on a 50text Omega RG-401/U coaxial cable [1], with outer and inner conductor diameters of 0215text in and 00645text in, respectively. The section length is roughly 15text in. The Teflon dielectric material has varepsilon_r = 208, and we consider tandelta = 4times 10^-2, a factor of 100 above the actual value in order to exaggerate losses in the transmission line.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"In this example we consider three different configurations of the model, all with a coaxial lumped port excitation at one end of the line: an open termination at the opposite end (coaxial_open.json), a shorted termination(coaxial_short.json), and a matched 50text Omega lumped port termination (coaxial_matched.json).","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"The mesh is generated using the Julia code in mesh/mesh.jl and consists of quadratically-curved hexahedral elements, as depicted below. Third-order shape functions are used to approximate the solution.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Each configuration file sets the simulation \"Type\" to \"Transient\". The different termination configurations are specified by using a \"LumpedPort\" with matched impedance for the matched termination, a \"PEC\" boundary for the shorted termination, leaving no boundary condition specified for the open termination. This last case applies the natural boundary condition for the finite element formulation which is a perfect magnetic conductor boundary condition, enforcing zero tangential magnetic field and thus zero surface current density.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"The excitation pulse is configured under config[\"Solver\"][\"Transient\"]. Here, we use a modulated Gaussian pulse shape, with time dependence given by the expression","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"g(t) = sinleftomega(t-t_0)right e^-frac(t-t_0)^22tau^2 ","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"For this simulation, we use a center frequency f = omega2pi = 10text GHz and pulse width tau = 005text ns. The offset t_0 is automatically chosen by Palace in order to smoothly ramp up the excitation from the rest initial condition. Time integration uses the second-order implicit Generalized-alpha scheme with a uniform time step Delta t = 5times 10^-3text ns, and the solution is computed for the interval tin0010text ns. The electric and magnetic field solutions are sampled every 10 time steps for visualization.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Below, we plot the time histories of the port voltage at the excited coaxial lumped port for the three simulation cases.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"We can observe that as expected, the matched termination absorbs the incident waveform nearly perfectly, while it is reflected with the same polarity for the shorted termination and opposite polarity for the open termination (phase shifted by pi). Furthermore, the reflected wave is noticably attenuated due to the material loss of the transmission line dielectric.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"Lastly, an animation of the signal propagation for the matched (left) and shorted (right) simulations, constructed using the saved fields, is shown below.","category":"page"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"
\n \n
","category":"page"},{"location":"examples/coaxial/#References","page":"Signal Propagation in a Coaxial Cable","title":"References","text":"","category":"section"},{"location":"examples/coaxial/","page":"Signal Propagation in a Coaxial Cable","title":"Signal Propagation in a Coaxial Cable","text":"[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"\n","category":"page"},{"location":"config/config/#Overview","page":"Overview","title":"Overview","text":"","category":"section"},{"location":"config/config/","page":"Overview","title":"Overview","text":"A configuration file written in the JSON format is used specify the runtime options for a Palace simulation. The following sections give a detailed overview of the file format and available settings.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"Parameters are specified in the form of keyword/value pairs where the key is a string and the value may be a string, boolean, integer or floating point number, or array. Parameters are grouped into a hierarchy of objects. We support relaxed JSON formatting with C++-style comments (//, /* */). Integer arrays can be specified as comma-separated lists of integers or integer ranges, for example [1,3-5,6] is parsed as [1,3,4,5,6].","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"In the following sections, default values for the parameters are specified alongside the description of each keyword in square brackets. Keywords for which there is no default value listed ([None]) are required in general if specifying values for other keywords under the same top-level object.","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"The top-level JSON object of the configuration file has the following structure:","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"{\n \"Problem\":\n {\n ...\n },\n \"Model\":\n {\n ...\n },\n \"Domains\":\n {\n ...\n },\n \"Boundaries\":\n {\n ...\n },\n \"Solver\":\n {\n ...\n }\n}","category":"page"},{"location":"config/config/","page":"Overview","title":"Overview","text":"Each property of the top-level config JSON object is detailed in its corresponding section of the documentation.","category":"page"},{"location":"config/config/#Contents","page":"Overview","title":"Contents","text":"","category":"section"},{"location":"config/config/","page":"Overview","title":"Overview","text":"config[\"Problem\"]\nconfig[\"Model\"]\nconfig[\"Domains\"]\nconfig[\"Boundaries\"]\nconfig[\"Solver\"]","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\n","category":"page"},{"location":"config/solver/#config[\"Solver\"]","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Solver\":\n{\n \"Order\": ,\n \"Eigenmode\":\n {\n ...\n },\n \"Driven\":\n {\n ...\n },\n \"Transient\":\n {\n ...\n },\n \"Electrostatic\":\n {\n ...\n },\n \"Magnetostatic\":\n {\n ...\n },\n \"Linear\":\n {\n ...\n }\n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Order\" [1] : Finite element order (degree). Arbitrary high-order spaces are supported.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Eigenmode\" : Top-level object for configuring the eigenvalue solver for the eigenmode simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Eigenmode\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Driven\" : Top-level object for configuring the frequency domain driven simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Driven\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Transient\" : Top-level object for configuring the time domain driven simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Transient\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Electrostatic\" : Top-level object for configuring the electrostatic simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Electrostatic\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Magnetostatic\" : Top-level object for configuring the magnetostatic simulation type. Thus, this object is only relevant for config[\"Problem\"][\"Type\"]: \"Magnetostatic\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Linear\" : Top-level object for configuring the linear solver employed by all simulation types.","category":"page"},{"location":"config/solver/#solver[\"Eigenmode\"]","page":"config[\"Solver\"]","title":"solver[\"Eigenmode\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Eigenmode\":\n{\n \"Target\": ,\n \"Tol\": ,\n \"MaxIts\": ,\n \"MaxSize\": ,\n \"N\": ,\n \"Save\": ,\n \"Type\": ,\n \"ContourTargetUpper\": ,\n \"ContourAspectRatio\": ,\n \"ContourNPoints\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Target\" [None] : (Nonzero) frequency target above which to search for eigenvalues, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Tol\" [1.0e-6] : Relative convergence tolerance for the eigenvalue solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxIts\" [0] : Maximum number of iterations for the iterative eigenvalue solver. A value less than 1 uses the solver default.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxSize\" [0] : Maximum subspace dimension for eigenvalue solver. A value less than 1 uses the solver default.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"N\" [1] : Number of eigenvalues to compute.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed field modes to save to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the eigenvalue solver to be used in computing the given number of eigenmodes of the problem. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SLEPc\"\n\"ARPACK\"\n\"FEAST\"\n\"Default\" : Use the default eigensolver. Currently, this is the Krylov-Schur eigenvalue solver from \"SLEPc\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourTargetUpper\" [None] : Specifies the upper frequency target of the contour used for the FEAST eigenvalue solver, GHz. This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourAspectRatio\" [None] : Specifies the aspect ratio of the contour used for the FEAST eigenvalue solver. This should be greater than zero, where the aspect ratio is the ratio of the contour width to the frequency range(\"ContourTargetUpper\" - \"Target\"). This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ContourNPoints\" [4] : Number of contour integration points used for the FEAST eigenvalue solver. This option is relevant only for \"Type\": \"FEAST\".","category":"page"},{"location":"config/solver/#Advanced-eigenmode-solver-options","page":"config[\"Solver\"]","title":"Advanced eigenmode solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"PEPLinear\" [true]\n\"Scaling\" [true]\n\"StartVector\" [true]\n\"StartVectorConstant\" [false]\n\"MassOrthogonal\" [false]","category":"page"},{"location":"config/solver/#solver[\"Driven\"]","page":"config[\"Solver\"]","title":"solver[\"Driven\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Driven\":\n{\n \"MinFreq\": ,\n \"MaxFreq\": ,\n \"FreqStep\": ,\n \"SaveStep\": ,\n \"SaveOnlyPorts\": ,\n \"AdaptiveTol\": ,\n \"AdaptiveMaxSamples\": ,\n \"AdaptiveMaxCandidates\": ,\n \"Restart\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MinFreq\" [None] : Lower bound of frequency sweep interval, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxFreq\" [None] : Upper bound of frequency sweep interval, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"FreqStep\" [None] : Frequency step size for frequency sweep, GHz.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveStep\" [0] : Controls how often, in number of frequency steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveOnlyPorts\" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveTol\" [0.0] : Relative error convergence tolerance for adaptive frequency sweep. If zero, adaptive frequency sweep is disabled and the full-order model is solved at each frequency step in the specified interval. If positive, this tolerance is used to ensure the reliability of the reduced-order model relative to the full-order one in the frequency band of interest.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveMaxSamples\" [10] : Maximum number of frequency samples used to construct the reduced-order model for adaptive fast frequency sweep, if the specified tolerance (\"AdaptiveTol\") is not met first.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveMaxCandidates\" [NumFreq/5] : Maximum number of frequency samples to consider as candidates for computing the reduced-order model error when adaptively sampling new points in order to construct the reduced-order for adaptive fast frequency sweep. The default is less than the requested number of frequency points in the sweep.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Restart\" [1] : Iteration (1-based) from which to restart for a partial frequency sweep simulation. That is, the initial frequency will be computed as \"MinFreq\" + (\"Restart\" - 1) * \"FreqStep\".","category":"page"},{"location":"config/solver/#Advanced-driven-solver-options","page":"config[\"Solver\"]","title":"Advanced driven solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"AdaptiveAPosterioriError\" [false]","category":"page"},{"location":"config/solver/#solver[\"Transient\"]","page":"config[\"Solver\"]","title":"solver[\"Transient\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Transient\":\n{\n \"Type\": ,\n \"Excitation\": ,\n \"ExcitationFreq\": ,\n \"ExcitationWidth\": ,\n \"MaxTime\": ,\n \"TimeStep\": ,\n \"SaveStep\": ,\n \"SaveOnlyPorts\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the time integration scheme used for the discretization of the second-order system of differential equations. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"GeneralizedAlpha\" : The second-order implicit generalized-alpha method with rho_inf = 10. This scheme is unconditionally stable.\n\"NewmarkBeta\" : The second-order implicit Newmark-beta method with beta = 14 and gamma = 12. This scheme is unconditionally stable.\n\"CentralDifference\" : The second-order explicit central difference method, obtained by setting beta = 0 and gamma = 12 in the Newmark-beta method. In this case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step.\n\"Default\" : Use the default \"GeneralizedAlpha\" time integration scheme.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Excitation\" [None] : Controls the time dependence of the source excitation. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Sinusoidal\" : A sinusoidal excitation at a user specified frequency.\n\"Gaussian\" : A Gaussian pulse with a user specified width which defines the bandwidth.\n\"DifferentiatedGaussian\" : A differentiated Gaussian pulse with a user specified width which defines the bandwidth.\n\"ModulatedGaussian\" : A modulated Gaussian pulse at a user specified center frequency and width used to excite the system without any DC component.\n\"Ramp\" : A differentiable unit step function to model the ramp up to a DC signal.\n\"SmoothStep\" : A smoother many-times differentiable unit step function to model the ramp up to a DC signal over a specified width of time.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ExcitationFreq\" [None] : Center frequency used for harmonic source excitations, GHz. Only relevant when \"Excitation\" is one of \"Sinusoidal\", \"Gaussian\", \"DifferentiatedGaussian\", or \"ModulatedGaussian\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"ExcitationWidth\" [None] : Pulse width for Gaussian-type source excitations, ns. Only relevant when \"Excitation\" is one of \"Gaussian\", \"DifferentiatedGaussian\", \"ModulatedGaussian\", or \"SmoothStep\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxTime\" [None] : End of simulation time interval, ns. Transient simulations always start from rest at t = 00.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"TimeStep\" [None] : Uniform time step size for time integration, ns.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveStep\" [0] : Controls how often, in number of time steps, to save computed fields to disk for visualization with ParaView. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SaveOnlyPorts\" [false] : If set to true, postprocessing is only performed for port boundaries and skipped for quantities depending on, for example, field integrals over all or part of the interior of the computational domain. This can be useful in speeding up simulations if only port boundary quantities are required.","category":"page"},{"location":"config/solver/#solver[\"Electrostatic\"]","page":"config[\"Solver\"]","title":"solver[\"Electrostatic\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Electrostatic\":\n{\n \"Save\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed electric field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed capacitance matrix. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/#solver[\"Magnetostatic\"]","page":"config[\"Solver\"]","title":"solver[\"Magnetostatic\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Magnetostatic\":\n{\n \"Save\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Save\" [0] : Number of computed magnetic field solutions to save to disk for visualization with ParaView, ordered by the entries in the computed inductance matrix. Files are saved in the paraview/ directory under the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"config/solver/#solver[\"Linear\"]","page":"config[\"Solver\"]","title":"solver[\"Linear\"]","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Linear\":\n{\n \"Type\": ,\n \"KSPType\": ,\n \"Tol\": ,\n \"MaxIts\": ,\n \"MaxSize\": ,\n \"UseGMG\": ,\n \"UsePCShifted\": ,\n \"MGCycleIts\": ,\n \"MGSmoothIts\": ,\n \"MGSmoothOrder\": \n}","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"with","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\" [\"Default\"] : Specifies the solver used for preconditioning the linear system of equations to be solved for each simulation type. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"SuperLU\" : The SuperLU_DIST sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with SuperLU_DIST support.\n\"STRUMPACK\" : The STRUMPACK sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with STRUMPACK support.\n\"MUMPS\" : The MUMPS sparse direct solver in real double precision is used to factorize the system matrix. For frequency domain problems this uses a real approximation to the true complex linear system matrix. This option is only available when Palace has been built with MUMPS support.\n\"AMS\" : Hypre's Auxiliary-space Maxwell Solver (AMS), an algebraic multigrid (AMG)-based preconditioner.\n\"BoomerAMG\" : The BoomerAMG algebraic multigrid solver from Hypre.\n\"Default\" : Use the default \"AMS\" solver for simulation types involving definite or semi-definite curl-curl operators (time domain problems as well as magnetostatics). For frequency domain problems, use a sparse direct solver if available, otherwise uses \"AMS\". For electrostatic problems, uses \"BoomerAMG\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"KSPType\" [\"Default\"] : Specifies the iterative Krylov subspace solver type for solving linear systems of equations arising for each simulation type. The available options are:","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"CG\"\n\"GMRES\"\n\"FGMRES\"\n\"Default\" : Use the default \"GMRES\" Krylov subspace solver for frequency domain problems, that is when config[\"Problem\"][\"Type\"] is \"Eigenmode\" or \"Driven\". For the other simulation types, the linear system matrix is always real and symmetric positive definite (SPD) and the preconditioned conjugate gradient method (\"CG\") is used as the Krylov solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Tol\" [1.0e-6] : Relative (preconditioned) residual convergence tolerance for the iterative linear solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxIts\" [100] : Maximum number of iterations for the iterative linear solver.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MaxSize\" [0] : Maximum Krylov space size for the GMRES and FGMRES solvers. A value less than 1 defaults to the value specified by \"MaxIts\".","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"UseGMG\" [true] : Enable or not geometric multigrid solver which uses h- and p-multigrid coarsening as available to construct the multigrid hierarchy. The solver specified by \"Type\" is used on the coarsest level. A Hiptmair smoother is applied to all other levels.","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"UsePCShifted\" [false] : When set to true, constructs the preconditioner for frequency domain problems using a real SPD approximation of the system matrix, which can help performance at high frequencies (relative to the lowest nonzero eigenfrequencies of the model).","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGCycleIts\" [1] : Number of V-cycle iterations per preconditioner application for multigrid preconditioners (when \"UseGMG\" is true or \"Type\" is \"AMS\" or \"BoomerAMG\").","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGSmoothIts\" [1] : Number of pre- and post-smooth iterations used for multigrid preconditioners (when \"UseGMG\" is true or \"Type\" is \"AMS\" or \"BoomerAMG\").","category":"page"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"MGSmoothOrder\" [3] : Order of polynomial smoothing for geometric multigrid preconditioning (when \"UseGMG\" is true).","category":"page"},{"location":"config/solver/#Advanced-linear-solver-options","page":"config[\"Solver\"]","title":"Advanced linear solver options","text":"","category":"section"},{"location":"config/solver/","page":"config[\"Solver\"]","title":"config[\"Solver\"]","text":"\"Type\": \"STRUMPACK-MP\"\n\"KSPType\": \"MINRES\", \"CGSYM\", \"FCG\", \"BCGS\", \"BCGSL\", \"FBCGS\", \"QMRCGS\", \"TFQMR\"\n\"UseMGS\" [false]\n\"UseCGS2\" [false]\n\"UseKSPPiped\" [false]\n\"UseLOR\" [false]\n\"PrecondSide\" [\"Default\"]: \"Left\", \"Right\", \"Default\"\n\"Reordering\" [\"Default\"]: \"METIS\", \"ParMETIS\", \"Default\"\n\"STRUMPACKCompressionType\" [\"None\"]: \"None\", \"BLR\", \"HSS\", \"HODLR\"\n\"STRUMPACKCompressionTol\" [1.0e-3]\n\"STRUMPACKLossyPrecision\" [16]\n\"STRUMPACKButterflyLevels\" [1]\n\"SuperLU3D\" [false]\n\"AMSVector\" [false]","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\n","category":"page"},{"location":"config/domains/#config[\"Domains\"]","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Domains\":\n{\n \"Materials\":\n [\n ...\n ],\n \"Postprocessing\":\n {\n \"Dielectric\":\n [\n ...\n ],\n \"Probe\":\n [\n ...\n ]\n }\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Materials\" : Array of material properties objects.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\" : Top-level object for configuring domain postprocessing.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Dielectric\" : Array of objects for postprocessing bulk dielectric loss.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Probe\" : Array of objects for postprocessing solution field values evaluated at a probe location in space.","category":"page"},{"location":"config/domains/#domains[\"Materials\"]","page":"config[\"Domains\"]","title":"domains[\"Materials\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Materials\":\n[\n // Material 1\n {\n \"Attributes\": [],\n \"Permeability\": ,\n \"Permittivity\": ,\n \"LossTan\": ,\n \"Conductivity\": ,\n \"LondonDepth\": ,\n \"MaterialAxes\": \n },\n // Material 2, 3, ...\n ...\n]","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Attributes\" [None] : Integer array of mesh domain attributes for this material.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Permeability\" [1.0] : Relative permeability for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Permittivity\" [1.0] : Relative permittivity for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"LossTan\" [0.0] : Loss tangent for this material. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Conductivity\" [0.0] : Electrical conductivity for this material, S/m. Activates Ohmic loss model in the material domain. Scalar or vector of 3 coefficients corresponding to each of \"MaterialAxes\".","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"LondonDepth\" [0.0] : London penetration depth for this material, specified in mesh length units. Activates London equations-based model relating superconducting current and electromagnetic fields in the material domain.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"MaterialAxes\" [[1.0,0.0,0.0], [0.0,1.0,0.0], [0.0,0.0,1.0]] : Axes directions for specification of anisotropic material properties. Required to be unit length and orthogonal.","category":"page"},{"location":"config/domains/#domains[\"Postprocessing\"][\"Dielectric\"]","page":"config[\"Domains\"]","title":"domains[\"Postprocessing\"][\"Dielectric\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\":\n{\n \"Dielectric\":\n [\n {\n \"Index\": ,\n \"Attributes\": []\n },\n ...\n ]\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Index\" [None] : Index of this lossy domain, used in postprocessing output files.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Attributes\" [None] : Integer array of mesh domain attributes for this lossy domain.","category":"page"},{"location":"config/domains/#domains[\"Postprocessing\"][\"Probe\"]","page":"config[\"Domains\"]","title":"domains[\"Postprocessing\"][\"Probe\"]","text":"","category":"section"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Postprocessing\":\n{\n \"Probe\":\n [\n {\n \"Index\": ,\n \"X\": ,\n \"Y\": ,\n \"Z\": \n },\n ...\n ]\n}","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"with","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Index\" [None] : Index of this probe, used in postprocessing output files.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"X\" [None] : x-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Y\" [None] : y-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"config/domains/","page":"config[\"Domains\"]","title":"config[\"Domains\"]","text":"\"Z\" [None] : z-coordinate of this probe, specified in mesh length units.","category":"page"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"\n","category":"page"},{"location":"examples/examples/#Overview","page":"Overview","title":"Overview","text":"","category":"section"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"Some examples of using Palace, including configuration and mesh files, can be found in the examples/ directory of the source code. The following sections provide complete tutorials for each of the available example applications.","category":"page"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"These examples are also used by Palace's regression testing suite. See the test/ directory for more details.","category":"page"},{"location":"examples/examples/#Contents","page":"Overview","title":"Contents","text":"","category":"section"},{"location":"examples/examples/","page":"Overview","title":"Overview","text":"Capacitance Matrix for Two Spheres\nInductance Matrix for a Pair of Concentric Rings\nEigenmodes of a Cylindrical Cavity\nSignal Propagation in a Coaxial Cable\nCrosstalk Between Coplanar Waveguides","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"\n","category":"page"},{"location":"install/#Installation","page":"Installation","title":"Installation","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace can be built and installed using the Spack HPC package manager, following the instructions in the Build using Spack section. Alternatively, compiling from source using CMake is described in Build from source.","category":"page"},{"location":"install/#Build-using-Spack","page":"Installation","title":"Build using Spack","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace is a registered package in the built-in Spack package repository. To install the solver, follow the instructions for setting up Spack on your system and run:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"spack install palace","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"More information about about the available configuration options and dependencies can be found using spack info palace.","category":"page"},{"location":"install/#Build-from-source","page":"Installation","title":"Build from source","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"A build from source requires the following prerequisites installed on your system:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"CMake version 3.13 or later\nC++ compiler supporting C++17\nC and (optionally) Fortran compilers for dependency builds\nMPI distribution\nBLAS, LAPACK libraries (described below in Math libraries)","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"In addition, builds from source require the following system packages which are typically already installed and are available from most package managers (apt, yum, brew, etc.):","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Python 3\npkg-config\nzlib (optional)","category":"page"},{"location":"install/#Quick-start","page":"Installation","title":"Quick start","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"To start, clone the code, including the library dependency source code, using","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"git clone https://github.com/awslabs/palace.git --recurse-submodules","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"If the repository was already cloned without recursive checkout, git submodule update --init --recursive can be run to initialize or update the dependency repositories.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Then, a build using the default options can be performed by running the following from within the directory where the repository was cloned:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"mkdir build && cd build\ncmake ..\nmake -j","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"This installs the binary executable in build/bin/.","category":"page"},{"location":"install/#Configuration-options","page":"Installation","title":"Configuration options","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"To configure a Palace build in using the source code in , run:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"mkdir && cd \ncmake [OPTIONS] ","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Here, [OPTIONS] is a list of options passed to cmake of the form -D=. The Palace build respects standard CMake variables, including:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"CMAKE_CXX_COMPILER, CMAKE_C_COMPILER, and CMAKE_Fortran_COMPILER which define the desired compilers.\nCMAKE_CXX_FLAGS, CMAKE_C_FLAGS, and CMAKE_Fortran_FLAGS which define the corresponding compiler flags.\nCMAKE_INSTALL_PREFIX which specifies the path for installation (if none is provided, defaults to ).\nCMAKE_BUILD_TYPE which defines the build type such as Release, Debug, RelWithDebInfo, and MinSizeRel (Release if not otherwise specified).\nBUILD_SHARED_LIBS which is a flag to create shared libraries for dependency library builds instead of static libraries (OFF by default).","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"Additional build options are (with default values in brackets):","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"PALACE_WITH_64BIT_INT [OFF] : Build with 64-bit integer support\nPALACE_WITH_OPENMP [OFF] : Use OpenMP\nPALACE_WITH_GSLIB [ON] : Build with GSLIB library for high-order field interpolation\nPALACE_WITH_SUPERLU [ON] : Build with SuperLU_DIST sparse direct solver\nPALACE_WITH_STRUMPACK [OFF] : Build with STRUMPACK sparse direct solver\nPALACE_WITH_MUMPS [OFF] : Build with MUMPS sparse direct solver\nPALACE_WITH_SLEPC [ON] : Build with SLEPc eigenvalue solver\nPALACE_WITH_ARPACK [OFF] : Build with ARPACK eigenvalue solver","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"The build step is invoked by running (for example with 4 make threads)","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"make -j 4","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"or","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"cmake --build . -- -j 4","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"which installs the binary executable in ${CMAKE_INSTALL_PREFIX}/bin/.","category":"page"},{"location":"install/#Math-libraries","page":"Installation","title":"Math libraries","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"During the configure step, the build system will try to detect system installations of BLAS and LAPACK libraries depending on the system architecture according to the following procedure:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"For x86_64 systems:\nIf the MKLROOT environment variable is set, looks for an Intel MKL installation.\nIf the AOCL_DIR or AOCLROOT environment variables are set, looks for an AMD Optimizing CPU Libraries (AOCL) installation of BLIS and libFLAME.\nOtherwise, tries to locate an installation of OpenBLAS which is permissively licensed and available from most package managers.\nFor aarch64/arm64 systems:\nIf the ARMPL_DIR environment variable is set, looks for an Arm Performance Libraries (PL) installation.\nOtherwise, tries to locate an installation of OpenBLAS.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"If the installation path of OpenBLAS is non-standard or is not found by default, it can be set using the OPENBLAS_DIR or OPENBLASROOT environment variables, or added to CMAKE_PREFIX_PATH when calling CMake.","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"It is recommended in most cases to use a serial BLAS and LAPACK builds (not multithreaded), as the standard parallelization in approach in Palace is to use pure MPI parallelism.","category":"page"},{"location":"install/#Dependencies","page":"Installation","title":"Dependencies","text":"","category":"section"},{"location":"install/","page":"Installation","title":"Installation","text":"Palace leverages the MFEM finite element discretization library. It always configures and builds its own installation of MFEM internally in order to support the most up to date features and patches. In addition, Palace uses:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"nlohmann/json\nfmt","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"As part of the Build from source, the CMake build will automatically build and install a small number of third-party dependencies before building Palace. The source code for these dependencies is downloaded using using Git submodules. These libraries include:","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"METIS and ParMETIS\nHypre\nPETSc\nGSLIB (optional, when PALACE_WITH_GSLIB=ON)\nSuperLU_DIST (optional, when PALACE_WITH_SUPERLU=ON)\nSTRUMPACK (optional, when PALACE_WITH_STRUMPACK=ON), including ButterflyPACK support\nMUMPS (optional, when PALACE_WITH_MUMPS=ON)\nSLEPc (optional, when PALACE_WITH_SLEPC=ON)\nARPACK-NG (optional, when PALACE_WITH_ARPACK=ON)","category":"page"},{"location":"install/","page":"Installation","title":"Installation","text":"PETSc is built with complex number support. For solving eigenvalue problems, at least one of SLEPc or ARPACK-NG must be specified. Typically only one of the SuperLU_DIST, STRUMPACK, and MUMPS dependencies is required but by default all are built and the user can decide at runtime which solver to use.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"\n","category":"page"},{"location":"guide/model/#Simulation-Models","page":"Simulation Models","title":"Simulation Models","text":"","category":"section"},{"location":"guide/model/#Supported-mesh-formats","page":"Simulation Models","title":"Supported mesh formats","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"The config[\"Model\"] object is used to specify the mesh for the discretized computational domain. In general, inputs are expected to be dimensional nondimensionalized internally. A length scale, specified under config[\"Model\"][\"L0\"], describes the length units of the mesh relative to 1 meter (i.e. config[\"Model\"][\"L0\"]: 1.0e-6 if the mesh coordinates are in mum, this is the default value). All other entries in the configuration file which have units of length should be specified in units of config[\"Model\"][\"L0\"] m.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"MFEM supports a wide variety of mesh formats. In addition, Palace has built-in support for Nastran (.nas, .bdf) and COMSOL (.mphtxt, .mphbin) format mesh files, for both linear and high-order curved elements.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Geometric attributes for domains and boundaries in the mesh are used to define material properties and boundary conditions on the desired model regions and surfaces (see config[\"Domains\"] and config[\"Boundaries\"]). These attribute integers correspond to tags for the domain and boundary elements in the mesh, and should be non-negative and start at 1. They do not need to be contiguous in the mesh file. Throughout the configuration file, the \"Attributes\" keyword is used to indicate which domain or boundary attributes are relevant to the material properties or boundary conditions being specified.","category":"page"},{"location":"guide/model/#Mesh-refinement","page":"Simulation Models","title":"Mesh refinement","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Refinement of the input mesh file can be performed using levels of global uniform refinement or region-based refinement, specified using the config[\"Model\"][\"Refinement\"] object. The user can specify any combination of uniform refinement levels as well as local refinement regions which refines the elements inside of a certain box or sphere-shaped region. For simplex meshes, the refinement maintains a conforming mesh but meshes containing hexahedra, prism, or pyramid elements will be non-conforming after local refinement (this is not supported at this time).","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Adaptive mesh refinement (AMR) according to error estimates in the computed solution is a work in progress for all simulation types.","category":"page"},{"location":"guide/model/#Material-models","page":"Simulation Models","title":"Material models","text":"","category":"section"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Material properties are handled by the config[\"Domains\"][\"Materials\"] object. Palace supports linear, frequency independent constitutive laws for material modeling.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Materials with scalar or general matrix-valued properties are supported. For most simulation types, each material in the model requires a specified relative permittivity and relative permeability (for electrostatic simulations, only the permittivity is required, while for magnetostatics, only the permeability is required). For dielectric domains, a loss tangent may be specified. Alternatively, for normal conducting domains, an electrical conductivity may be specified which is used to relate the current density and electric field via Ohm's law.","category":"page"},{"location":"guide/model/","page":"Simulation Models","title":"Simulation Models","text":"Modeling of superconducting domains is performed using the current-field constitutive relations given by the London equations. The user can specify a London penetration depth to activate this model. It can also be used in conjunction with a materal conductivity when wishing to model both superconducting and normal currents.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"\n","category":"page"},{"location":"examples/cavity/#Eigenmodes-of-a-Cylindrical-Cavity","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"note: Note\nThe files for this example can be found in the examples/cavity/ directory of the Palace source code.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"This example demonstrates Palace's eigenmode simulation type to solve for the lowest frequency modes of a cylindrical cavity resonator. In particular, we consider a cylindrical cavity filled with Teflon (varepsilon_r = 208, tandelta = 4times 10^-4), with radius a = 274text cm and height d = 2a. From [1], the frequencies of the textTE_nml and textTM_nml modes are given by","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"beginaligned\nf_textTEnml = frac12pisqrtmuvarepsilon\n sqrtleft(fracp_nmaright)^2 +\n left(fraclpidright)^2 \nf_textTMnml = frac12pisqrtmuvarepsilon\n sqrtleft(fracp_nmaright)^2 +\n left(fraclpidright)^2 \nendaligned","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"where p_nm and p_nm denote the m-th root (mgeq 1) of the n-th order Bessel function (ngeq 0) of the first kind, J_n, and its derivative, J_n, respectively.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In addition, we have analytic expressions for the unloaded quality factors due to dielectric loss, Q_d, and imperfectly conducting walls, Q_c. In particular,","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_d = frac1tandelta","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"and, for a surface resistance R_s,","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_c = frac(ka)^3eta ad4(p_nm)^2 R_s\n left1-left(fracnp_nmright)^2right\n leftfracad2\n left1+left(fracbeta an(p_nm)^2right)^2right +\n left(fracbeta a^2p_nmright)^2\n left(1-fracn^2(p_nm)^2right)right^-1","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"where k=omegasqrtmuvarepsilon, eta=sqrtmuvarepsilon, and beta=lpid.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The initial Gmsh mesh for this problem, from mesh/cavity.msh, is shown below. We use quadratic triangular prism elements.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"There are two configuration files for this problem, cavity_pec.json and cavity_impedance.json.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In both, the config[\"Problem\"][\"Type\"]","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"field is set to \"Eigenmode\", and we use the mesh shown above with a single level of uniform mesh refinement (\"UniformLevels\": 1). The material properties for Teflon are entered under config[\"Domains\"][\"Materials\"]. The config[\"Domains\"][\"Postprocessing\"][\"Dielectric]\" object is used to extract the quality factor due to bulk dielectric loss; in this problem since there is only one domain this is trivial, but in problems with multiple material domains this feature can be used to isolate the energy-participation ratio (EPR) and associated quality factor due to different domains in the model.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The only difference between the two configuration files is in the \"Boundaries\" object: cavity_pec.json prescribes a perfect electric conductor (\"PEC\") boundary condition to the cavity boundary surfaces, while cavity_impedance.json prescribes a surface impedance condition with the surface resistance R_s = 00184text Omegatextsq, for copper at 5text GHz.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"In both cases, we configure the eigenvalue solver to solve for the 15 lowest frequency modes above 20text GHz (the dominant mode frequencies for both the textTE and textTM cases fall around 29text GHz frequency for this problem). A sparse direct solver is used for the solutions of the linear system resulting from the spatial discretization of the governing equations, using in this case a second- order finite element space.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The frequencies for the lowest order textTE and textTM modes computed using the above formula for this problem are listed in the table below.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"(nml) f_textTE f_textTM\n(010) –– 2903605text GHz\n(110) –– 4626474text GHz\n(210) –– 6200829text GHz\n(011) 5000140text GHz 3468149text GHz\n(111) 2922212text GHz 5000140text GHz\n(211) 4146842text GHz 6484398text GHz\n(012) 5982709text GHz 4776973text GHz\n(112) 4396673text GHz 5982709text GHz\n(212) 5290341text GHz 7269033text GHz","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"First, we examine the output of the cavity_pec.json simulation. The file postpro/pec/eig.csv contains information about the computed eigenfrequencies and associated quality factors:","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":" m, Re{f} (GHz), Im{f} (GHz), Q\n 1.000000e+00, +2.904507338e+00, +5.809012262e-04, +2.500001089e+03\n 2.000000e+00, +2.922515466e+00, +5.845032101e-04, +2.499999550e+03\n 3.000000e+00, +2.922528546e+00, +5.845057488e-04, +2.499999880e+03\n 4.000000e+00, +3.468921611e+00, +6.937841360e-04, +2.500000721e+03\n 5.000000e+00, +4.147607819e+00, +8.295219962e-04, +2.499998747e+03\n 6.000000e+00, +4.147624590e+00, +8.295263017e-04, +2.499995880e+03\n 7.000000e+00, +4.397698897e+00, +8.795405799e-04, +2.499997775e+03\n 8.000000e+00, +4.397707609e+00, +8.795424791e-04, +2.499997329e+03\n 9.000000e+00, +4.630241197e+00, +9.260492789e-04, +2.499997243e+03\n 1.000000e+01, +4.631850092e+00, +9.263712403e-04, +2.499996752e+03\n 1.100000e+01, +4.778292314e+00, +9.556584905e-04, +2.499999978e+03\n 1.200000e+01, +5.002916952e+00, +1.000583103e-03, +2.500000769e+03\n 1.300000e+01, +5.003637424e+00, +1.000727996e-03, +2.499998774e+03\n 1.400000e+01, +5.005126280e+00, +1.001026744e-03, +2.499996334e+03\n 1.500000e+01, +5.291624557e+00, +1.058325143e-03, +2.499999503e+03","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Indeed we can find a correspondence between the analytic modes predicted and the solutions obtained by Palace. Since the only source of loss in the simulation is the nonzero dielectric loss tangent, we have Q = Q_d = 100004 = 250times 10^3 in all cases.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Next, we run cavity_impedance.json, which adds the surface impedance boundary condition. Examining postpro/impedance/eig.csv we see that the mode frequencies are roughly unchanged but the quality factors have fallen due to the addition of imperfectly conducting walls to the model:","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":" m, Re{f} (GHz), Im{f} (GHz), Q\n 1.000000e+00, +2.904507340e+00, +7.086038246e-04, +2.049457910e+03\n 2.000000e+00, +2.922515467e+00, +7.051671704e-04, +2.072214699e+03\n 3.000000e+00, +2.922528546e+00, +7.051734731e-04, +2.072205452e+03\n 4.000000e+00, +3.468921613e+00, +8.640197955e-04, +2.007431854e+03\n 5.000000e+00, +4.147607821e+00, +9.784798616e-04, +2.119414052e+03\n 6.000000e+00, +4.147624591e+00, +9.784941280e-04, +2.119391720e+03\n 7.000000e+00, +4.397698899e+00, +1.000289498e-03, +2.198213128e+03\n 8.000000e+00, +4.397707610e+00, +1.000292504e-03, +2.198210877e+03\n 9.000000e+00, +4.630241200e+00, +1.054149598e-03, +2.196197451e+03\n 1.000000e+01, +4.631850095e+00, +1.054707045e-03, +2.195799411e+03\n 1.100000e+01, +4.778292317e+00, +1.126015851e-03, +2.121769621e+03\n 1.200000e+01, +5.002916951e+00, +1.085882618e-03, +2.303617807e+03\n 1.300000e+01, +5.003637428e+00, +1.171361603e-03, +2.135821061e+03\n 1.400000e+01, +5.005126284e+00, +1.171895768e-03, +2.135482762e+03\n 1.500000e+01, +5.291624560e+00, +1.207338551e-03, +2.191441950e+03","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"However, the bulk dielectric loss postprocessing results, written to postpro/impedance/domain-Q.csv, still give Q_d = 250times 10^3 for every mode as expected.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Focusing on the textTE_011 mode with f_textTE010 = 500text GHz, we can read the mode quality factor Q = 230times 10^3. Subtracting out the contribution of dielectric losses, we have","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Q_c = left(frac1Q-frac1Q_dright)^-1 = 293times 10^4","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"which agrees very closely to the analytical result of Q_c = 294times 10^4 given in Example 6.4 from [1] for this geometry.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"Finally, a clipped view of the electric field (left) and magnetic flux density magnitudes for the textTE_011 mode is shown below.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n \n
","category":"page"},{"location":"examples/cavity/#Mesh-convergence","page":"Eigenmodes of a Cylindrical Cavity","title":"Mesh convergence","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The effect of mesh size can be investigated for the cylindrical cavity resonator using convergence_study.jl. For a polynomial order of solution and refinement level, a mesh is generated using Gmsh using polynomials of the same order to resolve the boundary geometry. The eigenvalue problem is then solved for f_textTM010 and f_textTE111, and the relative error, fracf-f_texttruef_texttrue, of each mode plotted against textDOF^-frac13, a notional mesh size. Three different element types are considered: tetrahedra, prisms and hexahedra, and the results are plotted below. The x-axis is a notional measure of the overall cost of the solve, accounting for polynomial order.","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"
\n \n
","category":"page"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"The observed rate of convergence for the eigenvalues are p+1 for odd polynomials and p+2 for even polynomials. Given the eigenmodes are analytic functions, the theoretical maximum convergence rate is 2p [2]. The figures demonstrate that increasing the polynomial order of the solution will give reduced error, however the effect may only become significant on sufficiently refined meshes.","category":"page"},{"location":"examples/cavity/#References","page":"Eigenmodes of a Cylindrical Cavity","title":"References","text":"","category":"section"},{"location":"examples/cavity/","page":"Eigenmodes of a Cylindrical Cavity","title":"Eigenmodes of a Cylindrical Cavity","text":"[1] D. M. Pozar, Microwave Engineering, Wiley, Hoboken, NJ, 2012.\n[2] A. Buffa, P. Houston, I. Perugia, Discontinuous Galerkin computation of the Maxwell eigenvalues on simplicial meshes, Journal of Computational and Applied Mathematics 204 (2007) 317-333.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"\n","category":"page"},{"location":"examples/cpw/#Crosstalk-Between-Coplanar-Waveguides","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"","category":"section"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"note: Note\nThe files for this example can be found in the examples/cpw/ directory of the Palace source code.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"In this example, we construct a frequency domain model to analyze the wave transmission, reflection, near-end crosstalk, and far-end crosstalk for a four-port system comprised of two side-by-side coplanar waveguides (CPW). Each CPW is characterized by a trace width w = 30text μm and gap width s = 18text μm. The metal is modeled as an infinitely thin, perfectly conducting boundary surface on top of a sapphire dielectric substrate (parallel to C-axis: varepsilon_r = 115, tandelta = 86times 10^-5, perpendicular to C-axis: varepsilon_r = 93, tandelta = 30times 10^-5) of 500text μm thickness with the C-axis in the z-direction. This yields a characteristic impedance Z_0 = 5602text Omega for each of the lines [1]. The center-to-center separating distance between the transmission lines on the substrate is 266text μm, which means there is exactly 200text μm of ground plane between them.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"A visualization of the computational domain is shown below.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"There are two different options for modeling the termination at the ends of the CPW:","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Lumped port: A multielement uniform lumped port can be used to terminate the CPW by connecting the center conductor to the ground plane on each side with impedance Z = 2Z_0.\nWave port: We can solve a 2D boundary eigenvalue problem for the mode shape and propagation constants for the characteristic CPW mode, and use this to terminate the transmission line.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Views of the mesh boundaries for these two configurations are shown below. In both cases the computational domain is discretized using an unstructured tetrahedral mesh. The mesh files are mesh/cpw_wave.msh and mesh/cpw_lumped.msh, respectively.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Likewise, there are two different options for how the system response is calculated over the desired frequency band:","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Uniform: Sample the frequency band with the full-fidelity model at equally spaced frequencies over the desired range.\nAdaptive: Use the full-fidelity model to sample the solution at a few adaptively selected frequency points in the desired band, and then construct a low-cost surrogate model which is used to compute the response over the entire band.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"This leads to four possible configurations, for which there are four configuration files in the example directory: cpw_lumped_uniform.json, cpw_lumped_adaptive.json, cpw_wave_uniform.json, and cpw_wave_adaptive.json.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The frequency response is computed for the band fin20300text GHz. For the uniform sweep, a step size of Delta f=20text GHz is used, while the adaptive sweep employs a much finer step size Delta f=01text GHz. The adaptive fast frequency sweep algorithm is given a tolerance of 1times10^-3 for choosing the sampling points; the simulation with uniform ports uses 9 frequency samples and that with wave ports uses 10. Despite the much finer frequency resolution, the adaptive frequency sweep simulations take roughly the same amount of time as the uniform ones where the resulting resolution is worse by a factor of 20. Lastly, for all simulations, a single level of uniform mesh refinement is applied to the initial mesh and a first-order finite element approximation for the solution is used.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The results from the four different simulations are presented in the plots below.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n \n \n
","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"The first remark is that in both the lumped port and wave port cases, the adaptive fast frequency sweep results are very close to the true solutions sampled by the uniform sweeps.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"Second, there is a discrepancy between the results using lumped ports and those with wave ports, namely the lumped port excitation exhibits much higher reflection that that for wave ports. This can be attributed to the coarse meshes used for these examples. Indeed, refining the mesh or increasing the order of the solution approximation resolves this issue and leads to better agreement between the lumped port and wave port results. See below for the results with again a single level of mesh refinement but p = 2 for the order of the solution space.","category":"page"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"
\n \n \n \n \n
","category":"page"},{"location":"examples/cpw/#References","page":"Crosstalk Between Coplanar Waveguides","title":"References","text":"","category":"section"},{"location":"examples/cpw/","page":"Crosstalk Between Coplanar Waveguides","title":"Crosstalk Between Coplanar Waveguides","text":"[1] H. J. Visser, Antenna Theory and Applications, Wiley, Hoboken, NJ, 2012.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"\n","category":"page"},{"location":"guide/postprocessing/#Postprocessing-and-Visualization","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"As described in the section Problem Types, each simulation type writes relevant postprocessed scalar quantities to disk in the directory specified by config[\"Problem\"][\"Output\"], including but not limited to computed values like eigenfrequencies, scattering parameters, or lumped element parameters. In addition, each simulation type will write a file called domain-E.csv, which includes information about the electric and magnetic field energies, as well as lumped element energies, for each step of the simulation (eigenmode, frequency, or time step, for examples).","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"The participation ratios for bulk dielectrics and interface dielectric layers can be computed for simulations involving the electric field. For model boundaries, the integrated surface charge or magnetic flux can also be postprocessed. These features are described in Domain postprocessing and in Boundary postprocessing.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Additionally, the computed fields can be automatically probed for their vector values at one or more points in space. This probe functionality is also described in Domain postprocessing.","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Finally, as described further in Visualization, various field quantities on the 3D computational domain as well as 2D domain boundaries and material interfaces are written to disk when requested using the relevant parameters under config[\"Solver\"]. These fields are meant to be visualized with ParaView.","category":"page"},{"location":"guide/postprocessing/#Domain-postprocessing","page":"Postprocessing and Visualization","title":"Domain postprocessing","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Domain postprocessing capabilities are enabled by including objects under config[\"Domains\"][\"Postprocessing\"] in the configuration file. These include:","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"config[\"Domains\"][\"Postprocessing\"][\"Dielectric\"] : Postprocessess bulk dielectric loss based on the participation ratio of the electric field in a lossy region. The respective participation ratios and quality factors for each domain (associated with the specified domain attributes and indexed by the specified integer \"Index\") are computed using the material properties provided and are written to domain-Q.csv in the specified postprocessing output directory.\nconfig[\"Domains\"][\"Postprocessing\"][\"Probe\"] : Probe the values of the computed electric field and magnetic flux density solutions at specified locations in the computational domain. The availability of the bmE and bmB fields depends on the problem type (for example, for magnetostatic problems, only bmB is output and bmE is not computed, whereas the inverse is true for electrostatics). For each computed field, the postprocessed values are written to probe-E.csv and probe-B.csv in the specified output directory.","category":"page"},{"location":"guide/postprocessing/#Boundary-postprocessing","page":"Postprocessing and Visualization","title":"Boundary postprocessing","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"Boundary postprocessing capabilities are enabled by including objects under config[\"Boundaries\"][\"Postprocessing\"] in the configuration file. These include:","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"config[\"Boundaries\"][\"Postprocessing\"][\"Capacitance\"] : Postprocess the integral of the surface charge on a surface defined by a list of boundary attributes, and divide by the excitation voltage to get the capacitive coupling. The resulting capcitances are written to surface-C.csv in the specified output directory.\nconfig[\"Boundaries\"][\"Postprocessing\"][\"Inductance\"] : Postprocess the magnetic flux through a surface defined by a list of boundary attributes, and divide by the excitation current to the inductive coupling. The resulting inductances are written to surface-M.csv in the specified output directory.\nconfig[\"Boundaries\"][\"Postprocessing\"][\"Dielectric\"] : Postprocesses interface dielectric loss at surfaces of the model by specifying the interface thickness, permittivity, and loss tangent. See https://arxiv.org/pdf/1509.01854.pdf or https://aip.scitation.org/doi/10.1063/1.3637047 for more information. The participation ratios and associated quality factors are written to the file surface-Q.csv in the specified output directory.","category":"page"},{"location":"guide/postprocessing/#Visualization","page":"Postprocessing and Visualization","title":"Visualization","text":"","category":"section"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"When specified in the configuration file, the electric field and magnetic flux density solutions are written to disk for 3D visualization with ParaView. Various other postprocessed fields are also written to the ParaView database as available, including electric and magnetic energy density, surface currents, and charge density. These files are found in the paraview/ directory located in the output directory specified under config[\"Problem\"][\"Output\"].","category":"page"},{"location":"guide/postprocessing/","page":"Postprocessing and Visualization","title":"Postprocessing and Visualization","text":"In addition to the full 3D fields, a ParaView data collection for the boundary mesh is also written to disk. The boundary mesh includes all surfaces with prescribed boundary conditions as well as any material interfaces in the computational domain.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"\n","category":"page"},{"location":"run/#Running-*Palace*","page":"Running Palace","title":"Running Palace","text":"","category":"section"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"Once installed into a directory , a parallel simulation using Palace can be started with the following command:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"/bin/palace -np config.json","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"where","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"The installed palace script wraps a call to the desired MPI launcher (mpirun by default).\n is the number of MPI processes to use for the simulation.\nconfig.json is the JSON format configuration file used to specify the simulation parameters. The structure of this configuration file is outlined in detail in the section Configuration File.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"A full list of available script options is available using the -h or --help flag.","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"During the course of a simulation, the solver will write a number of useful statistics and logging information to standard output. It is often helpful to save this information to a file, for example with:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"/bin/palace ... | tee log.out","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"Of course, the interested user can explicitly run the Palace binary in parallel, supplying options directly to their MPI launcher of choice, as:","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":" [OPTIONS] /bin/palace-.bin config.json","category":"page"},{"location":"run/","page":"Running Palace","title":"Running Palace","text":"where is the MPI launcher command, [OPTIONS] is a list of command line options passed to the MPI launcher, and is the machine architecture (x86_64 or arm64).","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"\n","category":"page"},{"location":"developer/#Developer-Notes","page":"Developer Notes","title":"Developer Notes","text":"","category":"section"},{"location":"developer/#Style-guide","page":"Developer Notes","title":"Style guide","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"Automated source code formatting is performed using clang-format. Run:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"./scripts/format_source","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"in the repository root directory to automatically use clang-format to format C++ source as well as JuliaFormatter.jl for Julia and Markdown files. The script can be viewed in the repository.","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"The following conventions also apply:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"PascalCase for classes and function names.\nFollow 'include what you use' (IWYU), with the include order dictated by the Google C++ Style Guide. This order should be automatically enforced by the clang-format style file.\nCode comments should be full sentences, with punctuation. At this time, no Doxygen API reference is generated and so comments generally do not need to conform to Doxygen syntax.","category":"page"},{"location":"developer/#Static-analysis","page":"Developer Notes","title":"Static analysis","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"During the cmake configuration step, definining the variables ANALYZE_SOURCES_CLANG_TIDY and ANALYZE_SOURCES_CPPCHECK to ON will turn on static analysis using clang-tidy and cppcheck, respectively, during the build step. This requires the executables to be installed and findable by CMake on your system.","category":"page"},{"location":"developer/#JSON-Schema-for-configuration-files","page":"Developer Notes","title":"JSON Schema for configuration files","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"A JSON format configuration file, for example named config.json, can be validated against the provided Schema using:","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"./scripts/validate_config config.json","category":"page"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"This script uses Julia's JSONSchema.jl and the Schema provided in scripts/schema/ to parse the configuration file and check that the fields are correctly specified. This script and the associated Schema are also installed and can be accessed in /bin.","category":"page"},{"location":"developer/#Changelog","page":"Developer Notes","title":"Changelog","text":"","category":"section"},{"location":"developer/","page":"Developer Notes","title":"Developer Notes","text":"Code contributions should generally be accompanied by an entry in the changelog.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"\n","category":"page"},{"location":"guide/problem/#Problem-Types","page":"Problem Types","title":"Problem Types","text":"","category":"section"},{"location":"guide/problem/#Eigenmode-problems","page":"Problem Types","title":"Eigenmode problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For eigenmode simulations, config[\"Problem\"][\"Type\"]: \"Eigenmode\", the user should specify a nonzero (but arbitrarily small) frequency above which to search for eigenmodes. The computed eigenvalues are written to an ASCII file named eig.csv, in the directory specified by config[\"Problem\"][\"Output\"].","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"Calculations related to energy-participation ratio (EPR) quantization can be performed with Palace when the user specifies lumped ports corresponding to the linearized lumped circuit elements in the model. In this case, the participation matrix for inductive elements is automatically generated for the specified number of modes and number of inductive lumped ports. The participation matrix is output in an ASCII file named port-EPR.csv.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The EPR framework can be used to characterize the dissipative elements in the model as well. In particular, lumped ports with nonzero resistance in the model will trigger coupling rate and quality factor calculations based on input-output (I-O) line coupling loss: By specifying resistive lumped ports in the model, the mode coupling quality factors will be computed as Q_ml = omega_mkappa_ml. The output file port-Q.csv will be created in the output directory containing these mode qualty factor contributions. For bulk and interface dielectric loss calculations, which are not unique to the eigenmode simulation type, see the sections Domain postprocessing and Boundary postprocessing.","category":"page"},{"location":"guide/problem/#Driven-problems-in-the-frequency-domain","page":"Problem Types","title":"Driven problems in the frequency domain","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For frequency domain driven simulations, config[\"Problem\"][\"Type\"]: \"Driven\", the model is excited by a time harmonic incident field (port boundary) or surface current. The user can specify a port excitation using lumped ports or numeric wave ports.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The default frequency sweep behavior for frequency domain driven simulations is to perform a uniform sampling from the minimum to the maximum specified frequency of interest, using the user specified step size. An adaptive fast frequency sweep strategy can also be used, activated by specifying a nonzero value for \"AdaptiveTol\" under the config[\"Solver\"][\"Driven\"] object. In this case, using the high-dimensional model solution computed at a few automatically selected frequency samples, a low-cost model is constructed and used to compute the frequency response over the entire frequency range of interest. The specified error tolerance ensures that the approximate low-cost model is reliably accurate relative to the high-dimensional model within the frequency band of interest. This is particularly useful for fine-resolution sweeps containing many sample points, where it can yield a significant speedup over the default strategy.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"Port scattering parameters, or S-parameters, are postprocessed for the column of the scattering matrix corresponding to the driven port index automatically for this simulation type and stored in an ASCII file named port-S.csv, in the directory specified by config[\"Problem\"][\"Output\"]. In the case that more than a single lumped or wave port is excited or surface current excitations are used, scattering parameter output will be disabled for the simulation(though other quantities of interest are still postprocessed). When lumped ports are present, the peak complex lumped port voltages and currents computed for each excitation frequency are written to ASCII files named port-V.csv and port-I.csv, respectively, Additionally, the surface current excitations are written to surface-I.csv.","category":"page"},{"location":"guide/problem/#Driven-problems-in-the-time-domain","page":"Problem Types","title":"Driven problems in the time domain","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The previous simulation types describe simulations based on frequency domain formulations of Maxwell's equations. Time domain simulations are also possible through the transient simulation type: config[\"Problem\"][\"Type\"]: \"Transient\". Similar to the driven simulation type in the frequency domain, transient simulations involve simulating the response of the system to a time-dependent excitation field specified at lumped ports or surface current excitations in the model. The system is always started from rest with zero initial conditions and time-integrated for a user specified duration, given in nanoseconds. There are several available excitation types which define the time dependence of the pulse or excitation waveform. These are specified under the config[\"Solver\"][\"Transient\"] object using the \"Excitation\" keyword.","category":"page"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"The time histories of the lumped port voltages and currents are postprocessed and automatically written to ASCII files named port-V.csv and port-I.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. Additionally, surface current excitation time histories are written to surface-I.csv.","category":"page"},{"location":"guide/problem/#Electrostatic-problems","page":"Problem Types","title":"Electrostatic problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For electrostatic simulations, (config[\"Problem\"][\"Type\"]: \"Electrostatic\", the user should specify a number of terminal boundaries (config[\"Boundaries\"][\"Terminal\"]) as well as boundaries which are grounded (config[\"Boundaries\"][\"Ground\"]). For each terminal, an electrostatic field is computed by assigning the terminal of interest a positive nonzero voltage and all other terminals and grounded boundaries a zero voltage. The resulting fields are then used to compute the Maxwell capacitance matrix and its inverse, which are written to an ASCII file named terminal-C.csv and terminal-Cinv.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. The mutual capacitance matrix is also computed and written to terminal-Cm.csv in the same directory.","category":"page"},{"location":"guide/problem/#Magnetostatic-problems","page":"Problem Types","title":"Magnetostatic problems","text":"","category":"section"},{"location":"guide/problem/","page":"Problem Types","title":"Problem Types","text":"For magnetostatic simulations, (config[\"Problem\"][\"Type\"]: \"Magnetostatic\", the user should specify a number of source current boundaries. For each current source, a magnetostatic field is computed by applying a unit current to the source index of interest, leaving all other sources open with no excitation. Surfaces which are expected to carry current should be labeled as perfectly conducting, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The resulting fields are used to compute the inductance matrix and its inverse, which are written to an ASCII file named terminal-M.csv and terminal-Minv.csv, respectively, in the directory specified by config[\"Problem\"][\"Output\"]. A \"mutual\" inductance matrix which has the same form as the mutual capacitance matrix (its entries are based on current differences between ports rather than absolute currents) is computed and written to terminal-Mm.csv in the same directory.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\n","category":"page"},{"location":"config/model/#config[\"Model\"]","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"","category":"section"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Model\":\n{\n \"Mesh\": \n \"L0\": ,\n \"Lc\": ,\n \"Refinement\":\n {\n ...\n }\n}","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"with","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Mesh\" [None] : Input mesh file path, an absolute path is recommended.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"L0\" [1.0e-6] : Mesh vertex coordinate length unit, m.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Lc\" [0.0] : Characteristic length scale used for nondimensionalization, specified in mesh length units. A value less than or equal to zero uses an internally calculated length scale based on the bounding box of the computational domain.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Refinement\" : Top-level object for configuring mesh refinement.","category":"page"},{"location":"config/model/#model[\"Refinement\"]","page":"config[\"Model\"]","title":"model[\"Refinement\"]","text":"","category":"section"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Refinement\":\n{\n \"UniformLevels\": ,\n \"Boxes\":\n [\n {\n \"Levels\": ,\n \"XLimits\": [],\n \"YLimits\": [],\n \"ZLimits\": []\n },\n ...\n ],\n \"Spheres\":\n [\n {\n \"Levels\": ,\n \"Center\": [],\n \"Radius\": float\n },\n ...\n ]\n}","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"with","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"UniformLevels\" [0] : Levels of uniform parallel mesh refinement to be performed on the input mesh.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Boxes\" : Array of box region refinement objects. All elements with a node inside the box region will be marked for refinement.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Spheres\" : Array of sphere region refinement objects. All elements with a node inside the sphere region will be marked for refinement.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Levels\" [0] : Levels of parallel mesh refinement inside the specified refinement region.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"XLimits\" [None] : Floating point array of length 2 specifying the limits in the x-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"YLimits\" [None] : Floating point array of length 2 specifying the limits in the y-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"ZLimits\" [None] : Floating point array of length 2 specifying the limits in the z-direction of the axis-aligned bounding box for this box refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Center\" [None] : Floating point array of length equal to the model spatial dimension specfiying the center coordinates of the sphere for this sphere refinement region. Specified in mesh length units.","category":"page"},{"location":"config/model/","page":"config[\"Model\"]","title":"config[\"Model\"]","text":"\"Radius\" [None] : The radius of the sphere for this sphere refinement region, specified in mesh length units.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"\n","category":"page"},{"location":"guide/boundaries/#Boundary-Conditions","page":"Boundary Conditions","title":"Boundary Conditions","text":"","category":"section"},{"location":"guide/boundaries/#Perfect-electric-conductor-(PEC)-boundary","page":"Boundary Conditions","title":"Perfect electric conductor (PEC) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The perfect electric conductor (PEC) boundary condition (zero tangential electric field) is specified using the \"PEC\" boundary keyword under config[\"Boundaries\"]. It is a homogeneous Dirichlet boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"For electrostatic simulations, the homogeneous Dirichlet boundary condition is prescribed using the \"Ground\" boundary keyword which prescribes zero voltage at the boundary.","category":"page"},{"location":"guide/boundaries/#Perfect-magnetic-conductor-(PMC)-boundary","page":"Boundary Conditions","title":"Perfect magnetic conductor (PMC) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The perfect magnetic conductor (PMC) boundary condition (zero tangential magnetic field) is a homogenous Neumann boundary condition for the frequency or time domain finite element formulation, as well as the magnetostatic formulation. It is the natural boundary condition and thus it has the same effect as not specifying any additional boundary condition on external boundary surfaces. It can also be explicitly specified using the \"PMC\" boundary keyword under config[\"Boundaries\"].","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Likewise, for electrostatic simulations, the homogeneous Neumann boundary condition implies a zero-charge boundary, and thus zero gradient of the voltage in the direction normal to the boundary. This is specified using the \"ZeroCharge\" boundary keyword under config[\"Boundaries\"].","category":"page"},{"location":"guide/boundaries/#Impedance-boundary","page":"Boundary Conditions","title":"Impedance boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The impedance boundary condition is a mixed (Robin) boundary condition and is available for the frequency or time domain finite element formulations and thus for eigenmode or frequency or time domain driven simulation types. It is specified using the \"Impedance\" boundary keyword. The surface impedance relating the tangential electric and magnetic fields on the boundary is computed from the parallel impedances due to the specified resistance, inductance, and capacitance per square.","category":"page"},{"location":"guide/boundaries/#Absorbing-(scattering)-boundary","page":"Boundary Conditions","title":"Absorbing (scattering) boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Absorbing boundary conditions at farfield boundaries, also referred to as scattering boundary conditions, can be applied using the \"Absorbing\" boundary keyword under config[\"Boundaries\"]. The first-order absorbing boundary condition is a special case of the above impedance boundary and is available for eigenmode or frequency or time domain driven simulation types. The second-order absorbing boundary condition is only available for frequency domain driven simulations.","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"Perfectly matched layer (PML) boundaries for frequency and time domain electromagnetic formulations are not yet implemented, but are common in solvers for computational electromagnetics and will be a useful addition.","category":"page"},{"location":"guide/boundaries/#Finite-conductivity-boundary","page":"Boundary Conditions","title":"Finite conductivity boundary","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"A finite conductivity boundary condition can be specified using the \"Conductivty\" boundary keyword. This boundary condition models the effect of a boundary with non-infinite conductivity (an imperfect conductor) for conductors with thickness much larger than the skin depth. It is available only for frequency domain driven simulations.","category":"page"},{"location":"guide/boundaries/#Lumped-and-wave-port-excitation","page":"Boundary Conditions","title":"Lumped and wave port excitation","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"config[\"Boundaries\"][\"LumpedPort\"] : A lumped port applies a similar boundary condition to a surface impedance boundary, but takes on a special meaning for each simulation type.\nFor frequency domain driven simulations, ports are used to provide a lumped port excitation and postprocess voltages, currents, and scattering parameters. Likewise, for transient simulations, they perform a similar purpose but for time domain computed quantities.\nFor eigenmode simulations where there is no excitation, lumped ports are used to specify properties and postprocess energy-participation ratios (EPRs) corresponding to linearized circuit elements.\nNote that a single lumped port (given by a single integer \"Index\") can be made up of multiple boundary attributes in the mesh in order to model, for example, a multielement lumped port.\nconfig[\"Boundaries\"][\"WavePort\"] : Numeric wave ports are available for frequency domain driven simulations. In this case, a port boundary condition is applied with an optional excitation using a modal field shape which is computed by solving a 2D boundary mode eigenproblem on each wave port boundary. This allows for more accurate scattering parameter calculations when modeling waveguides or transmission lines with arbitrary cross sections.\nThe homogenous Dirichlet boundary conditions for the wave port boundary mode analysis are taken from the \"PEC\" boundaries of the full 3D model, as well as any optional additional boundary attributes given under \"WavePortPEC\". Any boundary of the wave port not labeled with with a PEC condition has the natural boundary condition for zero tangential magnetic field prescribed for the purpose of port mode calculation.\nUnlike lumped ports, wave port boundaries cannot be defined internal to the computational domain and instead must exist only on the outer boundary of the domain (they are to be \"one-sided\" in the sense that mesh elements only exist on one side of the boundary).","category":"page"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"The incident field excitation at a lumped or wave port is controlled by setting config[\"Boundaries\"][\"LumpedPort\"][][\"Excitation\"]: true or config[\"WavePort\"][][\"Excitation\"]: true for that port. The excitation for each port is defined to have unit incident power over the port boundary surface.","category":"page"},{"location":"guide/boundaries/#Surface-current-excitation","page":"Boundary Conditions","title":"Surface current excitation","text":"","category":"section"},{"location":"guide/boundaries/","page":"Boundary Conditions","title":"Boundary Conditions","text":"An alternative source excitation to lumped or wave ports for frequency and time domain driven simulations is a surface current excitation, specified under config[\"Boundaries\"][\"SurfaceCurrent\"]. This is the excitation used for magnetostatic simulation types as well. This option prescribes a unit source surface current excitation on the given boundary in order to excite the model. It does does not prescribe any boundary condition to the model and only affects the source term on the right hand side.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"\n","category":"page"},{"location":"examples/spheres/#Capacitance-Matrix-for-Two-Spheres","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"","category":"section"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"note: Note\nThe files for this example can be found in the examples/spheres/ directory of the Palace source code.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"In this example, we consider two conducting spheres of radii a and b, with centers separated by a distance c a + b. The surrounding medium is vacuum. An analytic solution for the capacitance matrix of this configuration exists and is given in [1]. The Maxwell capacitance matrix entries are given by the infinite series","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"beginaligned\nC_aa = 4pivarepsilon_0 ab sinhusum_n=0^infty frac1asinhnu+bsinh(n+1)u \nC_bb = 4pivarepsilon_0 ab sinhusum_n=0^infty frac1bsinhnu+asinh(n+1)u \nC_ab = -4pivarepsilon_0 fracabc sinhusum_n=1^infty frac1sinhnu\nendaligned","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"where the subscript a refers to the sphere with radius a and likewise for b. The parameter u is given by","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"coshu = fracc^2-a^2-b^22ab ","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Here we take the values a = 1text cm, b = 2text cm, and c = 5text cm. A mesh is generated with Gmsh using the mesh.jl Julia script found in the mesh/ directory, which writes the mesh to mesh/spheres.msh. The resulting high-order mesh uses cubically-curved tetrahedral elements, and is pictured below.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"
\n \n \n
","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The configuration file for the Palace simulation is found in spheres.json. We set the simulation \"Type\" to \"Electrostatic\", and add \"Terminal\" entries for the surface boundary of each sphere, corresponding to the entries of the capacitance matrix we wish to compute. The outer boundary of the computational domain, which is sufficiently far from the spheres, is prescribed a \"Ground\" boundary condition. We set the \"Order\" of the finite element approximation to 3.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The resulting extracted Maxwell capacitance matrix is saved to disk in the CSV file postpro/terminal-C.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C[i][1] (F), C[i][2] (F)\n 1.000000e+00, +1.237470540e-12, -4.771229894e-13\n 2.000000e+00, -4.771229894e-13, +2.478512490e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"In this case, the analytic solution yields","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"beginaligned\nC_aa = +1230518text pF \nC_bb = +2431543text pF \nC_ab = -04945668text pF\nendaligned","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"which is computed using the first n=12 terms in the series after which convergence to a relative tolerance of 10^-12 is reached. Thus, the errors in the capacitance coefficients by Palace are 057, 19, and 35, respectively.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"The mutual capacitance matrix can be computed from its Maxwell counterpart, and is saved in postpro/terminal-Cm.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C_m[i][1] (F), C_m[i][2] (F)\n 1.000000e+00, +7.603475504e-13, +4.771229894e-13\n 2.000000e+00, +4.771229894e-13, +2.001389500e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Additionally, while the typical approach used by Palace for lumped parameter extraction uses the computed field energies, the capacitance can also be calculated by directly integrating the charge on a boundary surface and dividing by the excitation voltage. The configuration file for this example contains this information under config[\"Boundaries\"][\"Postprocessing\"][\"Capacitance\"]. The resulting capacitances are written to postpro/surface-C.csv:","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":" i, C[1] (F), C[2] (F)\n 1.000000e+00, +1.210962236e-12, -4.677852948e-13\n 2.000000e+00, -4.669431918e-13, +2.425918151e-12","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"and agree closely with the values computed using the default method above, as expected.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"Finally, the postpro/paraview directory contains files for visualizing the computed field solutions with ParaView. Below we present the electrostatic potential fields for each terminal solution.","category":"page"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"
\n \n \n
","category":"page"},{"location":"examples/spheres/#References","page":"Capacitance Matrix for Two Spheres","title":"References","text":"","category":"section"},{"location":"examples/spheres/","page":"Capacitance Matrix for Two Spheres","title":"Capacitance Matrix for Two Spheres","text":"[1] J. Lekner, Capacitance coefficients of two spheres, Journal of Electrostatics 69 (2011) 11-14.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"\n","category":"page"},{"location":"reference/#Reference","page":"Reference","title":"Reference","text":"","category":"section"},{"location":"reference/#Mathematical-background","page":"Reference","title":"Mathematical background","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The solver computes a finite element approximation to the three-dimensional, time-harmonic Maxwell's equations in second-order form. The nondimensionalized, source-free, boundary value problem for bmE(bmx)inmathbbC^3, bmxinOmega, partialOmega=Gamma, where bmmathscrE(bmxt) = textRebmE(bmx)e^iomega t denotes the electric field, is written as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablatimesmu_r^-1nablatimesbmE + iomegasigmabmE\n - omega^2varepsilon_rbmE = 0 bmxinOmega \nbmntimesbmE = 0 bmxinGamma_PEC \nbmntimes(mu_r^-1nablatimesbmE) = 0 bmxinGamma_PMC \nbmntimes(mu_r^-1nablatimesbmE)\n + gammabmntimes(bmntimesbmE) = bmU^inc bmxinGamma_Z\nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the nondimensionalization has been performed with respect to a characteristic length L_0, time L_0c_0, magnetic field strength H_0, and electric field strength Z_0 H_0. Here, c_0 and Z_0 are the speed of light and impedance of free space, respectively. Given the electric field solution, the time-harmonic magnetic flux density can be calculated as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmB = -frac1iomeganablatimesbmE ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The flux density is related to the magnetic field, bmH, by the standard linear consitutive relationship bmH = mu_r^-1bmB.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For a general isotropic lossy dielectric, the relative permittivity varepsilon_r is a complex scalar:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"varepsilon_r = varepsilon_r (1-itandelta)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where varepsilon_r is the real relative permittivity and tandelta is the loss tangent. Alternatively, conductor loss is modeled by Ohm's law bmJ=sigmabmE with electrical conductivity sigma00. For a superconducting domain, the constitive current-field relationship given by Ohm's law is replaced by that given by the London equations:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"fracpartial bmJpartial t=frac1mu_rlambda_L^2bmE","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where lambda_L = sqrtmmu n_s e^2L_0 is the nondimensionalized London penetration depth. In this case, the term +iomegasigma bmE arising for a normal conductor in the time-harmonic Maxwell's equations becomes +(mu_r lambda_L^2)^-1bmE.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The domain boundary Gamma=Gamma_PECcupGamma_PMCcupGamma_Z, is separated into perfect electric conductor (PEC), perfect magnetic conductor (PMC), and impedance boundaries, respectively. The PEC boundary condition is a homogenous Dirichlet condition, while the PMC boundary condition is the natural boundary condition for the problem and is satisfied at all exterior boundaries by the finite element formulation. Impedance boundaries are modeled using a Robin boundary condition with gamma = iomegaZ_s, in which Z_s the surface impedance of the boundary, with units of impedance per square.","category":"page"},{"location":"reference/#Time-domain-formulation","page":"Reference","title":"Time domain formulation","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"A time-dependent formulation is also available to compute the electric field response bmE(bmxt) for a given time-dependent source excitation bmU^inc(bmxt). The governing equations in this case are","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"nablatimesmu_r^-1nablatimesbmE + sigmafracpartialbmEpartial t\n + varepsilon_rfracpartial^2bmEpartial t^2 = 0 bmxinOmega","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"subject to the same boundary conditions as the frequency-dependent case except for the Robin boundary condition which is written for a lumped resistive port boundary, for example, as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmntimes(mu_r^-1nablatimesbmE)\n + Z_s^-1bmntimesleft(bmntimesfracpartialbmEpartial tright)\n = bmU^inc bmxinGamma_Z ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The second-order electric field formulation is chosen to take advantage of unconditionally stable implicit time-integration schemes without the expense of a coupled block system solve for bmE(bmxt) and bmB(bmxt). It offers the additional benefit of sharing many similarities in the spatial discretization as the frequency domain formulation outlined above.","category":"page"},{"location":"reference/#Lumped-ports-and-wave-ports","page":"Reference","title":"Lumped ports and wave ports","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For lumped port boundaries, the surface impedance can be related to an equivalent circuit impedance, Z. There are two common cases:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: Z = Z_s l w, where l and w are the length and width of the port, respectively (length here is defined as the distance between the two conductors).\nCoaxial ports: Z = Z_s ln(ba) 2pi, where a and b denote the inner and outer radii of the port, respectively.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"A lumped parallel RLC circuit boundary has a circuit impedance","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Z = frac1R+frac1iomega L+iomega C ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Thus, the relationships between the circuit and surface element parameters for the user to specify are given by R_s = alpha R, L_s = alpha L, and C_s = Calpha, where alpha = wl for a rectangular port or alpha = 2pi ln(ba) for a coaxial port.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For multielement lumped ports, the effective circuit impedance is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Z = sum_k frac1Z_k ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"That is, the circuit impedances of each port contributing to the multielement port add in parallel. For the specific case of a two element multielement port with two identical lumped elements, we have Z = (1Z_1 + 1Z_2)^-1 = Z_k 2, where Z_k is the circuit impedance of a single port element.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The source term bmU^inc in a driven frequency-response problem is related to the incident field at an excited port boundary by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmU^inc = -2gamma(bmntimesbmE^inc)timesbmn","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where (bmntimesbmE^inc)timesbmn is just the projection of the excitation field onto the port surface. The incident fields for lumped ports depend on the port shape:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: bmE^inc = E_0 hatbml, where E_0 is a uniform constant field strength and hatbml a unit vector defining the direction of polarization on the port (typically should be the direction between the two conductors).\nCoaxial ports: bmE^inc = fracE_0 r_0r hatbmr, where E_0 is again a uniform constant field strength, r_0 is a characteristic length for the port, r is the distance from the port center, and hatbmr a unit vector specifying the port radial direction.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the time domain formulation, the source term bmU^inc appears as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmU^inc = -2 Z_s^-1left(bmntimesfracpartialbmE^incpartial tright)\n timesbmn ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The incident field bmE^inc(bmxt) is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmE^inc(bmxt) = p(t)bmE^inc(bmx)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE^inc(bmx) is identical to the spatial excitation in the frequency domain formulation, and p(t) describes the temporal shape of the excitation. Possible options include a sinusoidal, Gaussian, modulated Gaussian, or step excitation.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the frequency domain, the scattering parameters can be postprocessed from the computed electric field for each lumped port with boundary Gamma_i as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"S_ij = fracdisplaystyleint_Gamma_ibmEcdotbmE^inc_idS\n displaystyleint_Gamma_ibmE^inc_icdotbmE^inc_idS - delta_ij ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"In the time domain, the time histories of the port voltages can be Fourier-transformed to get their frequency domain representation for scattering parameter calculation.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Numeric wave ports assume a field with known normal-direction dependence bmE(bmx)=bme(bmx_t)e^ik_n x_n where k_n is the propagation constant. For each operating frequency omega, a two-dimensional eigenvalue problem is solved on the port yielding the mode shapes bme_m and associated propagaton constants k_nm. These are used in the full 3D model where the Robin port boundary condition has coefficient gamma=itextRek_nmmu_r and the computed mode is used to compute the incident field in the source term bmU^inc at excited ports. Scattering parameter postprocessing takes the same form as the lumped port counterpart using the computed modal solutions. Since the propagation constants are known for each wave port, scattering parameter de-embedding can be performed by specifying an offset distance d for each port:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"tildeS_ij = S_ije^ik_nid_ie^ik_njd_j ","category":"page"},{"location":"reference/#Eigenmode-calculations","page":"Reference","title":"Eigenmode calculations","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For eigenmode problems, the source term is zero and a quadratic eigenvalue problem for the eigenvalues omega is solved:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"(bmK+iomegabmC-omega^2bmM)bmx = 0","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the matrix bmK represents the discretized curl-curl operator, bmM the mass term, and bmC the port impedance boundary conditions. The damped frequency omega_d and quality factor Q is postprocessed from each of the resulting eigenvalues as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"omega_d = textReomega qquad Q = fracomega2textImomega ","category":"page"},{"location":"reference/#Energy-participation-ratios","page":"Reference","title":"Energy-participation ratios","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The energy-participation ratio (EPR) for lumped inductive elements is computed from the electric and magnetic fields corresponding to eigenmode m, bmE_m and bmH_m, using the formula","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"p_mj = frac1mathcalE^elec_m frac12 L_j I_mj^2","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where p_mjin-11 denotes the signed participation ratio for junction j in mode m, L_j is the provided junction circuit inductance, I_ mj is the peak junction current for mode m, and mathcalE^elec_m is the electric energy in mode m. The junction current is computed using the mean voltage across the port, overlineV_mj, as I_mj = overlineV_mjZ_mj, where Z_mj = 1(iomega_m L_j) is the impedance of the inductive branch of the lumped circuit. The mean port voltage depends on the computed electric field mode and the shape of the port:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Rectangular ports: overlineV_mj = frac1w_jint_Gamma_jbmE_mcdothatbml_jdS.\nCoaxial ports: overlineV_mj = frac12piint_Gamma_jfracbmE_mrcdothatbmr_jdS.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Finally, the total electric energy in mode m is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE^elec_m\n = frac12 textReleftint_OmegabmD_m^*cdotbmE_mdVright\n + sum_j frac12 C_jV_mj^2","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmD_m=varepsilon_rbmE_m is the electric flux density for mode m and the second term on the right-hand side accounts for any lumped capacitive boundaries with nonzero circuit capacitance C_j.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The EPR can also be used to estimate mode quality factors due to input-output(I-O) line coupling. The mode coupling quality factor due to the j-th I-O port is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Q_mj = fracomega_mkappa_mj","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where the port coupling rate kappa_mj is calculated as","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"kappa_mj = frac1mathcalE^elec_m frac12R_j I_mj^2 ","category":"page"},{"location":"reference/#Bulk-and-interface-dielectric-loss","page":"Reference","title":"Bulk and interface dielectric loss","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"The quality factor due to bulk dielectric loss resulting from an electric field bmE present in domain j with associated loss tangent tandelta_j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q_j = p_j tandelta_j =\n frac1mathcalE^elec frac12 tandelta_j \n textReleftint_Omega_jbmD^*cdotbmEdVright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where, as above, mathcalE^elec is the total electric field energy in the domain, including the contributions due to capacitive lumped elements.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Likewise, the quality factor due to surface interface dielectric loss for interface j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q_j = p_j tandelta_j =\n frac1mathcalE^elec frac12 t_jtandelta_j \n textReleftint_Gamma_jbmD^*cdotbmEdSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where t_j is the thickness of the layer and bmD = varepsilon_rjbmE is the electric displacement field in the layer evaluated using the relative permittivity of the interface varepsilon_rj. For an internal boundary, this integral is evaluated on a single side to resolve abiguity due to the discontinuity of bmE across the boundary.","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The above formula for interface dielectric loss can be specialized for the case of a metal-air, metal-substrate, or substrate-air interface. In each case, the quality factor for interface j is given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Metal-air:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^MA_j =\n frac1mathcalE^elec frac12 \n fract_jtandelta_jvarepsilon_rj^MA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Metal-substrate:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^MS_j =\n frac1mathcalE^elec frac12 \n fract_jtandelta_j(varepsilon_rj^S)^2varepsilon_rj^MA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSright","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Substrate-air:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"frac1Q^SA_j =\n frac1mathcalE^elec frac12 \n t_jtandelta_jleft(varepsilon_rj^SA \n textReleftint_Gamma_jbmE_t^*cdotbmE_tdSright\n + frac1varepsilon_rj^SA \n textReleftint_Gamma_jbmE_n^*cdotbmE_ndSrightright)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE_n denotes the normal field to the interface and bmE_t=bmE-bmE_n denotes the tangential field.","category":"page"},{"location":"reference/#Lumped-parameter-extraction","page":"Reference","title":"Lumped parameter extraction","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"For electrostatic simulations, the Maxwell capacitance matrix is computed in the following manner. First, the Laplace equation subject to Dirichlet boundary conditions is solved for each terminal with boundary Gamma_i in the model, yielding an associated voltage field V_i(bmx):","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablacdot(varepsilon_rnabla V_i) = 0 bmxinOmega \nV_i = 1 bmxinGamma_i \nV_i = 0 bmxinGamma_j jneq i \nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"The energy of the electric field associated with any solution is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE(V_i) = frac12int_Omegavarepsilon_rbmE_icdotbmE_idV","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmE_i=-nabla V_i is the electric field. Then, the entries of the Maxwell capacitance matrix, bmC, are given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmC_ij = mathcalE(V_i+V_j)-frac12(bmC_ii+bmC_jj) ","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"Magnetostatic problems for inductance matrix extraction are based on the magnetic vector potential formulation:","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"beginaligned\nnablatimes(mu_r^-1nablatimesbmA_i) = 0 bmxinOmega \nbmntimes(mu_r^-1nablatimesbmA_i) =\n bmntimesbmH_i = bmJ_s^inc bmxinGamma_i \nbmntimes(mu_r^-1nablatimesbmA_i) = 0 bmxinGamma_j jneq i \nendaligned","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"For each port with boundary Gamma_i, a unit source surface current bmJ_s^inc is applied, yielding an associated vector potential solution bmA_i(bmx). Homogeneous Dirichlet boundary conditions bmntimesbmA_i=0 are also imposed on specified surfaces of the model. The magnetic field energy associated with any solution is","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"mathcalE(bmA_i) = frac12int_Omegamu_r^-1bmB_icdotbmB_idV","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where bmB_i=nablatimesbmA_i is the magnetic flux density. Then, the entries of the inductance matrix, bmM, are given by","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"bmM_ij = frac1I_i I_jmathcalE(bmA_i+bmA_j)\n - frac12left(fracI_iI_jbmM_ii+fracI_jI_ibmM_jjright)","category":"page"},{"location":"reference/","page":"Reference","title":"Reference","text":"where I_i is the excitation current for port i, computed by integrating the source surface current bmJ_s^inc over the surface of the port.","category":"page"},{"location":"reference/#References","page":"Reference","title":"References","text":"","category":"section"},{"location":"reference/","page":"Reference","title":"Reference","text":"[1] J.-M. Jin, The Finite Element Method in Electromagnetics, Wiley-IEEE Press, Hoboken, NJ, Third edition, 2014.\n[2] P. Monk, Finite Element Methods for Maxwell's Equations, Oxford University Press, Oxford, 2003.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\n","category":"page"},{"location":"config/problem/#config[\"Problem\"]","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"","category":"section"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Problem\":\n{\n \"Type\": \n \"Verbose\": ,\n \"Output\": \n}","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"with","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Type\" [None] : Controls the simulation type. The available options are:","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Eigenmode\" : Perform a undamped or damped eigenfrequency analysis.\n\"Driven\" : Perform a frequency response simulation.\n\"Transient\" : Perform a time domain excitation response simulation.\n\"Electrostatic\" : Perform an electrostatic analysis to compute the capacitance matrix for a set of voltage terminals.\n\"Magnetostatic\" : Perform a magnetostatic analysis to compute the inductance matrix for a set of current sources.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Verbose\" [1] : Controls the level of log file printing.","category":"page"},{"location":"config/problem/","page":"config[\"Problem\"]","title":"config[\"Problem\"]","text":"\"Output\" [None] : Directory path for saving postprocessing outputs.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"\n","category":"page"},{"location":"examples/rings/#Inductance-Matrix-for-a-Pair-of-Concentric-Rings","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"","category":"section"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"note: Note\nThe files for this example can be found in the examples/rings/ directory of the Palace source code.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"This example seeks to compute the inductance matrix for a system of two concentric current-carrying rings of radii r_a and r_b, each with width w. As for the previous example, the permeability of the surrounding medium is assumed to be the permeability of free space. The mutual inductance, M_ab, can be easily computed for the case where r_all r_b and w = 0 using the Biot-Savart law as","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"M_ab = fracmu_0pi r_b^22 r_a ","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"Analytic expressions for the self inductance of this configuration can also be derived, for example from [1] we have","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"beginaligned\nM_aa = mu_0 r_a left(logfrac16 r_aw-175right) \nM_bb = mu_0 r_b left(logfrac16 r_bw-175right) \nendaligned","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"We take in this case r_a = 10 text μm, r_b = 100 text μm, and w = 1 text μm. The mesh.jl script in the mesh/ directory is used to generate an unstructured tetrahedral mesh with Gmsh, saved to mesh/rings.msh, and a depiction is shown below.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"
\n \n
","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The configuration file for the Palace simulation is rings.json. The simulation \"Type\" is \"Magnetostatic\", and we add \"SurfaceCurrent\" boundaries for applying a surface current to drive the inner or outer ring. The rest of the ring boundaries are labeled as \"PEC\" boundaries, which prescibes a zero magnetic flux, or magnetic insulation, boundary condition. The farfield is also prescribed the \"PEC\" boundary condition. We seek a second-order solution and use the geometric multigrid AMS solver.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The computed inductance matrix is saved to disk as postpro/terminal-M.csv, and below we show its contents:","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":" i, M[i][1] (H), M[i][2] (H)\n 1.000000e+00, +4.258505069e-11, +1.958488699e-12\n 2.000000e+00, +1.958488699e-12, +7.126907323e-10","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"According to the analytic expressions above, for this geometry we should have","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"M_ab = 1973921text pH","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"for the mutual inductance, and","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"beginaligned\nM_aa = 4178537text pH\nM_bb = 7072050text pH\nendaligned","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"for the self inductances. Thus, the Palace solution has approximately 078 error in the mutual inductance 19 and 078 errors in the self inductances versus the analytic solutions.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The typical approach used by Palace for lumped parameter extraction uses the computed field energies, but one can also compute the inductance by explicitly integrating the magnetic flux through a surface and dividing by the excitation current. This is configured under config[\"Boundaries\"][\"Postprocessing\"][\"Inductance\"] in the configuration file. The resulting postprocessed values are written to postpro/surface-M.csv:","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":" i, M[1] (H), M[2] (H)\n 1.000000e+00, +4.246208372e-11, +1.858193591e-12\n 2.000000e+00, +1.954077499e-12, +7.125811940e-10","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"The values computed using the flux integral method are in close agreement to those above, as expected.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"Lastly, we visualize the magnitude of the magnetic flux density field for the excitations of the inner and outer rings. The files for this visualization are again saved to the postpro/paraview directory.","category":"page"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"
\n \n \n
","category":"page"},{"location":"examples/rings/#References","page":"Inductance Matrix for a Pair of Concentric Rings","title":"References","text":"","category":"section"},{"location":"examples/rings/","page":"Inductance Matrix for a Pair of Concentric Rings","title":"Inductance Matrix for a Pair of Concentric Rings","text":"[1] M. R. Alizadeh Pahlavani and H. A. Mohammadpour, Inductance comparison of the solenoidal coil of modular toroidal coils using the analytical and finite element method, Progress in Electromagnetics Research 20 (2010) 337-352.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\n","category":"page"},{"location":"config/boundaries/#config[\"Boundaries\"]","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Boundaries\":\n{\n \"PEC\":\n {\n ...\n },\n \"PMC\":\n {\n ...\n },\n \"Impedance\":\n [\n ...\n ],\n \"Absorbing\":\n {\n ...\n },\n \"Conductivity\":\n [\n ...\n ],\n \"LumpedPort\":\n [\n ...\n ],\n \"WavePort\":\n [\n ...\n ],\n \"WavePortPEC\":\n {\n ...\n },\n \"SurfaceCurrent\":\n [\n ...\n ],\n \"Ground\":\n {\n ...\n },\n \"ZeroCharge\":\n {\n ...\n },\n \"Terminal\":\n [\n ...\n ],\n \"Postprocessing\":\n {\n \"Capacitance\":\n [\n ...\n ],\n \"Inductance\":\n [\n ...\n ],\n \"Dielectric\":\n [\n ...\n ]\n }\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PEC\" : Top-level object for configuring perfect electric conductor (PEC) boundary conditions (zero tangential electric field).","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PMC\" : Top-level object for configuring perfect magnetic conductor (PMC) boundary conditions (zero tangential magnetic field). Also imposes symmetry of the electric field across the boundary surface.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Impedance\" : Array of objects for configuring surface impedance boundary conditions. A surface impedance boundary relates the tangential electric and magnetic fields on the boundary using a user specified surface impedance.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Absorbing\" : Top-level object for configuring absorbing boundary conditions. These are artificial scattering boundary conditions at farfield boundaries.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\" : Array of objects for configuring finite conductivity surface impedance boundary conditions. Finite conductivity boundaries are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"LumpedPort\" : Array of objects for configuring lumped port boundary conditions. Lumped ports can be specified on boundaries which are internal to the computational domain.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePort\" : Array of objects for configuring numeric wave port boundary conditions. Wave ports can only be specified on boundaries which are on the true boundary of the computational domain. Addiitionally, wave port boundaries are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"WavePortPEC\" : Top-level object for configuring PEC boundary conditions for boundary mode analysis performed on the wave port boundaries. Thus, this object is only relevant when wave port boundaries are specified under config[\"Boundaries\"][\"WavePort\"].","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"SurfaceCurrent\" : Array of objects for configuring surface current boundary conditions. This boundary prescribes a unit source surface current excitation on the given boundary in order to excite a frequency or time domain driven simulation or magnetostatic simulation. For the magnetostatic simulation type, entries of the inductance matrix are extracted corresponding to each surface current boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ground\" : Top-level object for specifying ground, or zero voltage, boundary conditions for for electrostatic simulations.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"ZeroCharge\" : Top-level object for specifying zero charge boundary conditions for for electrostatic simulations. Also imposes symmetry of the electric field across the boundary surface.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Terminal\" : Array of objects for configuring terminal boundary conditions for electrostatic simulations. Entries of the capacitance matrix are extracted corresponding to each terminal boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Postprocessing\" : Top-level object for configuring boundary postprocessing.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Capacitance\" : Array of objects for postprocessing surface capacitance by the ratio of the integral of the induced surface charge on the boundary and the excitation voltage.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Inductance\" : Array of objects for postprocessing surface inductance by the ratio of the integral of the magnetic flux through the boundary and the excitation current.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Dielectric\" : Array of objects for postprocessing surface interface dielectric loss.","category":"page"},{"location":"config/boundaries/#boundaries[\"PEC\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"PEC\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PEC\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the PEC boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"PMC\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"PMC\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"PMC\":\n{\n \"Attributes\": []\n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply the PMC boundary condition.","category":"page"},{"location":"config/boundaries/#boundaries[\"Impedance\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Impedance\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Impedance\":\n[\n {\n \"Attributes\": [],\n \"Rs\": ,\n \"Ls\": ,\n \"Cs\": \n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this surface impedance boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Rs\" [0.0] : Surface resistance used for computing this surface impedance boundary's impedance per square, Omega/sq.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Ls\" [0.0] : Surface inductance used for computing this surface impedance boundary's impedance per square, H/sq.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Cs\" [0.0] : Surface capacitance used computing this surface impedance boundary's impedance per square, F/sq.","category":"page"},{"location":"config/boundaries/#boundaries[\"Absorbing\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Absorbing\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Absorbing\":\n{\n \"Attributes\": [],\n \"Order\": \n}","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes at which to apply farfield absorbing boundary conditions.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Order\" [1] : Specify a first- or second-order approximation for the farfield absorbing boundary condition. Second-order absorbing boundary conditions are only available for the frequency domain driven simulation type.","category":"page"},{"location":"config/boundaries/#boundaries[\"Conductivity\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"Conductivity\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\":\n[\n {\n \"Attributes\": [],\n \"Conductivity\": ,\n \"Permeability\": ,\n \"Thickness\": \n },\n ...\n]","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"with","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Attributes\" [None] : Integer array of mesh boundary attributes for this finite conductivity boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Conductivity\" [None] : Electrical conductivity for this finite conductivity boundary, S/m.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Permeability\" [1.0] : Relative permeability for this finite conductivity boundary.","category":"page"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"Thickness\" [None] : Optional conductor thickness for this finite conductivity boundary specified in mesh length units. Activates a finite conductivity boundary condition which accounts for nonzero metal thickness.","category":"page"},{"location":"config/boundaries/#boundaries[\"LumpedPort\"]","page":"config[\"Boundaries\"]","title":"boundaries[\"LumpedPort\"]","text":"","category":"section"},{"location":"config/boundaries/","page":"config[\"Boundaries\"]","title":"config[\"Boundaries\"]","text":"\"LumpedPort\":\n[\n {\n \"Index\": ,\n \"Attributes\": [],\n \"Direction\": ,\n \"Excitation\": ,\n \"R\": ,\n \"L\": ,\n \"C\": ,\n \"Rs\": ,\n \"Ls\": ,\n \"Cs\":