diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 2488bdf..71da811 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-16T05:42:13","documenter_version":"1.3.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-22T00:31:52","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/dev/generated/basic/index.html b/dev/generated/basic/index.html index ff76cf7..fa6726f 100644 --- a/dev/generated/basic/index.html +++ b/dev/generated/basic/index.html @@ -21,7 +21,7 @@ rx = GroundSampler(distance, field)
GroundSampler{Float64}(2.0e6, LongwaveModePropagator.Fields.Ez)

Finally there is a Receiver struct which is defined with a geographic location and Antenna, but it is not exported because geographic information is not currently handled by the package.

Waveguides

The abstract LongwaveModePropagator.Waveguide type is used to describe the earth-ionosphere waveguide with a BField, Species, and Ground.

The basic concrete waveguide type is a HomogeneousWaveguide, with fields

If not specified, distance is 0. The form of the function call is

HomogeneousWaveguide(bfield, species, ground)

HomogeneousWaveguide should be used when modeling with only a single homogeneous waveguide (ground, ionosphere, and magnetic field) along the propagation path.

To model an inhomogeneous propagation path, there is a SegmentedWaveguide type. The SegmentedWaveguide is simply a wrapper for a Vector of waveguides.

Let's look at the components of a waveguide.

BField

The BField type describes the magnitude and direction of the background magnetic field. Internally it consists of fields for the field strength B in Teslas and direction cosines corresponding to the directions parallel, perpendicular, and up into the waveguide.

A BField is most commonly constructed by specifying the field strength, dip angle in radians from the horizontal and positive when directed into Earth, and azimuth angle in radians from the propagation direction, positive towards $y$.

For example,

bfield = BField(50000e-9, π/2, 0)
BField(5.0e-5, 6.123233995736766e-17, 0.0, -1.0)

bfield is a vertical magnetic field of 50,000 nT.

Species

The Species struct identifies a constituent species of the ionosphere. Species contains the fields

numberdensity and collisionfrequency should be "callables" (usually Functions) that return the number density and collision frequency, respectively, as a function of height in meters.

For convenience, the Wait and Spies profile is accessible via waitprofile. Similarly the accompanying collision frequency profiles are electroncollisionfrequency and ioncollisionfrequency.

To define some electrons for the ionosphere (QE and ME were explicitly imported at the top of the example):

h = 75
 β = 0.35
 
-electrons = Species(QE, ME, z->waitprofile(z, h, β), electroncollisionfrequency)
Species(-1.602176634e-19, 9.1093837015e-31, FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x0000763071f813b0, Ptr{Nothing} @0x00007630168ac068, Base.RefValue{Main.var"#1#2"}(Main.var"#1#2"()), Main.var"#1#2"), FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x0000763071f81700, Ptr{Nothing} @0x00007630168ac070, Base.RefValue{typeof(electroncollisionfrequency)}(LongwaveModePropagator.electroncollisionfrequency), typeof(electroncollisionfrequency)))

Note that we used a lambda function to specify the waitprofile with our given $h'$ and $\beta$. Also note that these two parameters are a rare instance of SI units not strictly being followed. See the help for waitprofile for more information, including optional height cutoff and density threshold arguments.

electroncollisionfrequency is a function of height z only, so it is not necessary to generate a lambda function. We can pass the function handle directly.

Ground

Ground describes the relative permittivity ϵᵣ and conductivity σ of Earth.

ground = Ground(10, 2e-4)
Ground(10, 0.0002)

For convenience, a dictionary of common ground indices is exported.

GROUND
Dict{Int64, Ground} with 10 entries:
+electrons = Species(QE, ME, z->waitprofile(z, h, β), electroncollisionfrequency)
Species(-1.602176634e-19, 9.1093837015e-31, FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x00007fc886981290, Ptr{Nothing} @0x00007fc8256c8070, Base.RefValue{Main.var"#1#2"}(Main.var"#1#2"()), Main.var"#1#2"), FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x00007fc8869815e0, Ptr{Nothing} @0x00007fc8256c8078, Base.RefValue{typeof(electroncollisionfrequency)}(LongwaveModePropagator.electroncollisionfrequency), typeof(electroncollisionfrequency)))

Note that we used a lambda function to specify the waitprofile with our given $h'$ and $\beta$. Also note that these two parameters are a rare instance of SI units not strictly being followed. See the help for waitprofile for more information, including optional height cutoff and density threshold arguments.

electroncollisionfrequency is a function of height z only, so it is not necessary to generate a lambda function. We can pass the function handle directly.

Ground

Ground describes the relative permittivity ϵᵣ and conductivity σ of Earth.

ground = Ground(10, 2e-4)
Ground(10, 0.0002)

For convenience, a dictionary of common ground indices is exported.

GROUND
Dict{Int64, Ground} with 10 entries:
   5  => Ground(15, 0.001)
   4  => Ground(10, 0.0003)
   6  => Ground(15, 0.003)
@@ -42,7 +42,7 @@
 electrons = Species(QE, ME, z->waitprofile(z, 75, 0.35), electroncollisionfrequency)
 ground = GROUND[5]
 
-waveguide = HomogeneousWaveguide(bfield, electrons, ground)
HomogeneousWaveguide{Species}(BField(5.0e-5, 6.123233995736766e-17, 0.0, -1.0), Species(-1.602176634e-19, 9.1093837015e-31, FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x0000763071f87540, Ptr{Nothing} @0x00007630168ac078, Base.RefValue{Main.var"#3#4"}(Main.var"#3#4"()), Main.var"#3#4"), FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x0000763071f81700, Ptr{Nothing} @0x00007630168ac080, Base.RefValue{typeof(electroncollisionfrequency)}(LongwaveModePropagator.electroncollisionfrequency), typeof(electroncollisionfrequency))), Ground(15, 0.001), 0.0)

The propagate function returns a tuple of complex electric field, amplitude in dB μV/m, and phase in radians.

E, a, p = propagate(waveguide, tx, rx);

Here are quick plots of the amplitude

plot(ranges/1000, a;
+waveguide = HomogeneousWaveguide(bfield, electrons, ground)
HomogeneousWaveguide{Species}(BField(5.0e-5, 6.123233995736766e-17, 0.0, -1.0), Species(-1.602176634e-19, 9.1093837015e-31, FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x00007fc886987420, Ptr{Nothing} @0x00007fc8256c8068, Base.RefValue{Main.var"#3#4"}(Main.var"#3#4"()), Main.var"#3#4"), FunctionWrappers.FunctionWrapper{Float64, Tuple{Float64}}(Ptr{Nothing} @0x00007fc8869815e0, Ptr{Nothing} @0x00007fc8256c8080, Base.RefValue{typeof(electroncollisionfrequency)}(LongwaveModePropagator.electroncollisionfrequency), typeof(electroncollisionfrequency))), Ground(15, 0.001), 0.0)

The propagate function returns a tuple of complex electric field, amplitude in dB μV/m, and phase in radians.

E, a, p = propagate(waveguide, tx, rx);

Here are quick plots of the amplitude

plot(ranges/1000, a;
      xlabel="range (km)", ylabel="amplitude (dB)",
      linewidth=1.5, legend=false)

and phase.

plot(ranges/1000, rad2deg.(p);
      xlabel="range (km)", ylabel="phase (deg)",
@@ -79,4 +79,4 @@
   wavefieldheights: StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}
   wavefieldintegrationparams: IntegrationParams{OrdinaryDiffEq.Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}}
   radiationresistancecorrection: Bool false
-

An instance of LMPParams can be passed as the params argument of propagate or findmodes.

See the Parameters.jl README for other ways of interacting with LMPParams.


This page was generated using Literate.jl.

+

An instance of LMPParams can be passed as the params argument of propagate or findmodes.

See the Parameters.jl README for other ways of interacting with LMPParams.


This page was generated using Literate.jl.

diff --git a/dev/generated/basic_homogeneousamplitude.png b/dev/generated/basic_homogeneousamplitude.png index 566ce4e..4c7dd0a 100644 Binary files a/dev/generated/basic_homogeneousamplitude.png and b/dev/generated/basic_homogeneousamplitude.png differ diff --git a/dev/generated/basic_homogeneousphase.png b/dev/generated/basic_homogeneousphase.png index 05233c1..38b9499 100644 Binary files a/dev/generated/basic_homogeneousphase.png and b/dev/generated/basic_homogeneousphase.png differ diff --git a/dev/generated/basic_segmentedamplitude.png b/dev/generated/basic_segmentedamplitude.png index 02b75de..58bfdbc 100644 Binary files a/dev/generated/basic_segmentedamplitude.png and b/dev/generated/basic_segmentedamplitude.png differ diff --git a/dev/generated/basic_segmentedphase.png b/dev/generated/basic_segmentedphase.png index c680e92..59f0aa6 100644 Binary files a/dev/generated/basic_segmentedphase.png and b/dev/generated/basic_segmentedphase.png differ diff --git a/dev/generated/ground/index.html b/dev/generated/ground/index.html index 9379e7f..8fa945e 100644 --- a/dev/generated/ground/index.html +++ b/dev/generated/ground/index.html @@ -43,4 +43,4 @@ p = plot() buildplots!(p, amps) plot!(p; size=(600,400), ylims=(0, 95), title="Night", legend=(0.85, 1.02), - xlabel="Range (km)", ylabel="Amplitude (dB)", legendtitle="ϵᵣ, σ")

Low ground conductivity can have a significant influence on the signal propagation - there is strong attenuation. These low conductivities can be found in areas of sea or polar ice and industrial or city areas.

The influence of ground conductivity on the received signal has similar impact on the day and night scenarios.


This page was generated using Literate.jl.

+ xlabel="Range (km)", ylabel="Amplitude (dB)", legendtitle="ϵᵣ, σ")

Low ground conductivity can have a significant influence on the signal propagation - there is strong attenuation. These low conductivities can be found in areas of sea or polar ice and industrial or city areas.

The influence of ground conductivity on the received signal has similar impact on the day and night scenarios.


This page was generated using Literate.jl.

diff --git a/dev/generated/ground_day.png b/dev/generated/ground_day.png index 2495dc0..534148c 100644 Binary files a/dev/generated/ground_day.png and b/dev/generated/ground_day.png differ diff --git a/dev/generated/ground_night.png b/dev/generated/ground_night.png index af57843..53d639f 100644 Binary files a/dev/generated/ground_night.png and b/dev/generated/ground_night.png differ diff --git a/dev/generated/integratedreflection/index.html b/dev/generated/integratedreflection/index.html index b7438e8..976e4a4 100644 --- a/dev/generated/integratedreflection/index.html +++ b/dev/generated/integratedreflection/index.html @@ -138,4 +138,4 @@ heatmap(tolerancestrings, solverstrings, permutedims(mean_times)/1e6; clims=(0, 5), xlabel="tolerance", ylabel="solver", - colorbar_title="time (μs)", colorbar=true)

The best accuracy occurs with Vern7 and experiment's we've done looking at the sensitivity of the mode solutions to integration tolerance have shown we can get away with a tolerance of 1e-4. To play it safe, the default used by LMP is 1e-5. The integration accuracy improves considerably for relatively little additional computation time if the tolerance is changed to 1e-9, but that accuracy is not required.


This page was generated using Literate.jl.

+ colorbar_title="time (μs)", colorbar=true)

The best accuracy occurs with Vern7 and experiment's we've done looking at the sensitivity of the mode solutions to integration tolerance have shown we can get away with a tolerance of 1e-4. To play it safe, the default used by LMP is 1e-5. The integration accuracy improves considerably for relatively little additional computation time if the tolerance is changed to 1e-9, but that accuracy is not required.


This page was generated using Literate.jl.

diff --git a/dev/generated/integratedreflection_difference.png b/dev/generated/integratedreflection_difference.png index 71c8ca7..d36a830 100644 Binary files a/dev/generated/integratedreflection_difference.png and b/dev/generated/integratedreflection_difference.png differ diff --git a/dev/generated/integratedreflection_time.png b/dev/generated/integratedreflection_time.png index 0b924c9..baecac6 100644 Binary files a/dev/generated/integratedreflection_time.png and b/dev/generated/integratedreflection_time.png differ diff --git a/dev/generated/interpolatingfunctions/index.html b/dev/generated/interpolatingfunctions/index.html index 8e38046..9e7fbb2 100644 --- a/dev/generated/interpolatingfunctions/index.html +++ b/dev/generated/interpolatingfunctions/index.html @@ -94,8 +94,8 @@ plot(p1, p2, layout=grid(2,1,heights=[0.7, 0.3]))

Here is the mean absolute amplitude difference between each technique and the true profile amplitude. We filter to finite values because the amplitude calculated at 0 meters is Inf.

for n in ("linear", "cubic", "FritschButland", "FritschCarlson", "Steffen")
     @printf("%s: %.3e\n",n, meanad(filter(isfinite,results[n][2]),
         filter(isfinite,results["truth"][2])))
-end
linear: 1.396e-02
-cubic: 2.647e-03
-FritschButland: 2.776e-03
-FritschCarlson: 2.791e-03
-Steffen: 3.258e-03

The amplitude and phase for each of the interpolators matches the true exponential profile extremely closely relative to the typical noise of real VLF measurements.

Timing can vary when run by GitHub to build the documentation, so results here are from a local run:

InterpolatorRuntime relative to truth
truth1
linear0.84
cubic0.85
FritschButland0.91
FritschCarlson0.92
Steffen0.82

Really, any of these except for the linear interpolation could be used to interpolate a discrete profile. The Steffen and cubic interpolations are fastest, but the FritschButland is a little more true to the actual profile. It's for that reason that FritschButland is used to interpolate TableInput types in LongwaveModePropagator.


This page was generated using Literate.jl.

+end
linear: 1.614e-02
+cubic: 6.315e-03
+FritschButland: 4.328e-03
+FritschCarlson: 5.099e-03
+Steffen: 4.154e-03

The amplitude and phase for each of the interpolators matches the true exponential profile extremely closely relative to the typical noise of real VLF measurements.

Timing can vary when run by GitHub to build the documentation, so results here are from a local run:

InterpolatorRuntime relative to truth
truth1
linear0.84
cubic0.85
FritschButland0.91
FritschCarlson0.92
Steffen0.82

Really, any of these except for the linear interpolation could be used to interpolate a discrete profile. The Steffen and cubic interpolations are fastest, but the FritschButland is a little more true to the actual profile. It's for that reason that FritschButland is used to interpolate TableInput types in LongwaveModePropagator.


This page was generated using Literate.jl.

diff --git a/dev/generated/interpolatingfunctions_amp.png b/dev/generated/interpolatingfunctions_amp.png index e178d7a..03e436c 100644 Binary files a/dev/generated/interpolatingfunctions_amp.png and b/dev/generated/interpolatingfunctions_amp.png differ diff --git a/dev/generated/interpolatingfunctions_phase.png b/dev/generated/interpolatingfunctions_phase.png index 197ff04..ad1a8e3 100644 Binary files a/dev/generated/interpolatingfunctions_phase.png and b/dev/generated/interpolatingfunctions_phase.png differ diff --git a/dev/generated/interpreting_betas.png b/dev/generated/interpreting_betas.png index 2ee5b18..992e098 100644 Binary files a/dev/generated/interpreting_betas.png and b/dev/generated/interpreting_betas.png differ diff --git a/dev/generated/interpreting_collisionday.png b/dev/generated/interpreting_collisionday.png index e2a420c..4d245f0 100644 Binary files a/dev/generated/interpreting_collisionday.png and b/dev/generated/interpreting_collisionday.png differ diff --git a/dev/generated/interpreting_collisionnight.png b/dev/generated/interpreting_collisionnight.png index a73a25e..7b21abf 100644 Binary files a/dev/generated/interpreting_collisionnight.png and b/dev/generated/interpreting_collisionnight.png differ diff --git a/dev/generated/interpreting_frequencies.png b/dev/generated/interpreting_frequencies.png index c3ac9a1..8238fe4 100644 Binary files a/dev/generated/interpreting_frequencies.png and b/dev/generated/interpreting_frequencies.png differ diff --git a/dev/generated/interpreting_hprimes.png b/dev/generated/interpreting_hprimes.png index cd6ef24..59e5d01 100644 Binary files a/dev/generated/interpreting_hprimes.png and b/dev/generated/interpreting_hprimes.png differ diff --git a/dev/generated/interpretinghpbeta/index.html b/dev/generated/interpretinghpbeta/index.html index bd2e763..a7fe541 100644 --- a/dev/generated/interpretinghpbeta/index.html +++ b/dev/generated/interpretinghpbeta/index.html @@ -161,4 +161,4 @@ end buildplots!(p, amps); plot!(p; size=(600,400), ylims=(22, 95), - xlabel="Range (km)", ylabel="Amplitude (dB)", legendtitle="1.816 ν₀, a")


This page was generated using Literate.jl.

+ xlabel="Range (km)", ylabel="Amplitude (dB)", legendtitle="1.816 ν₀, a")


This page was generated using Literate.jl.

diff --git a/dev/generated/io/index.html b/dev/generated/io/index.html index e713777..a992853 100644 --- a/dev/generated/io/index.html +++ b/dev/generated/io/index.html @@ -173,7 +173,7 @@ 900000, 1000000 ] -}

BatchInput

Both the ExponentialInput and TableInput types can be collected together in a BatchInput which has fields for a name, description, datetime, and vector of Inputs. This is useful for keeping a set of scenarios together. See the test/IO.jl file for additional help on how these should be formatted.

Running the model from a JSON file

To run the model, propagate accepts a filename input (see the help for optional arguments). However, instead of returning a tuple of complex electric field, amplitude, and phase, it returns an Output type. Additionally, it saves the output to a JSON file.

output = propagate(filename);

Outputs

There are only two LongwaveModePropagator.Output types: BasicOutput and BatchOutput. Both ExponentialInputs and TableInputs create BasicOutputs, but the BatchInput creates a BatchOutput.

The BasicOutput contains fields for

where name and description are directly copied from the input and datetime is when the model was run.

output
BasicOutput("basic", "Test ExponentialInput", Dates.DateTime("2024-03-16T05:36:47.696"), [0.0, 100000.0, 200000.0, 300000.0, 400000.0, 500000.0, 600000.0, 700000.0, 800000.0, 900000.0, 1.0e6], [0.0, 69.0422209373873, 63.22960630343484, 60.32692576011322, 52.46122800119692, 56.88034398278663, 54.30222245936574, 47.34843486581329, 40.459413291030714, 40.88025467719066, 43.8123104785962], [0.7853981633974483, 1.9977776128507398, 1.744763177858933, 1.6657027389205428, 1.087507387578484, 1.2322178477902987, 1.664225992977897, 2.061413457330575, 2.690613816419203, 4.464992218244768, 5.0671281550666105])

Not surprisingly, a BatchOutput is simply a container holding a Vector of BasicOutputs, as well as some additional metadata from the corresponding BatchInput.

JSON I/O from Matlab

Here's an example of how to encode the above ExponentialInput to JSON and decode the output using Matlab. It's also in the file examples/io.m.

% Matlab script
+}

BatchInput

Both the ExponentialInput and TableInput types can be collected together in a BatchInput which has fields for a name, description, datetime, and vector of Inputs. This is useful for keeping a set of scenarios together. See the test/IO.jl file for additional help on how these should be formatted.

Running the model from a JSON file

To run the model, propagate accepts a filename input (see the help for optional arguments). However, instead of returning a tuple of complex electric field, amplitude, and phase, it returns an Output type. Additionally, it saves the output to a JSON file.

output = propagate(filename);

Outputs

There are only two LongwaveModePropagator.Output types: BasicOutput and BatchOutput. Both ExponentialInputs and TableInputs create BasicOutputs, but the BatchInput creates a BatchOutput.

The BasicOutput contains fields for

where name and description are directly copied from the input and datetime is when the model was run.

output
BasicOutput("basic", "Test ExponentialInput", Dates.DateTime("2024-03-22T00:26:25.582"), [0.0, 100000.0, 200000.0, 300000.0, 400000.0, 500000.0, 600000.0, 700000.0, 800000.0, 900000.0, 1.0e6], [0.0, 69.03793070620536, 63.23417345887722, 60.32545411257551, 52.463979714590664, 56.883072656141884, 54.30149029776226, 47.34877154362522, 40.46102741446798, 40.87896697013488, 43.810027346338245], [0.7853981633974483, 1.9977501255480048, 1.7445362124076118, 1.6657354711950825, 1.0869981959615773, 1.2323543807678279, 1.6642027856966908, 2.0611344533705203, 2.6901388711083407, 4.465200767571669, 5.067248706976456])

Not surprisingly, a BatchOutput is simply a container holding a Vector of BasicOutputs, as well as some additional metadata from the corresponding BatchInput.

JSON I/O from Matlab

Here's an example of how to encode the above ExponentialInput to JSON and decode the output using Matlab. It's also in the file examples/io.m.

% Matlab script
 
 input.name = "basic";
 input.description = "Test ExponentialInput";
@@ -227,4 +227,4 @@
 
 with open('basic_python.json', 'w') as file:
     file.write(json_str)

Let's ensure that the JSON file is correctly parsed.

python_input = LMP.parse(joinpath(examples_dir, "basic_python.json"))
ExponentialInput("basic", "Test ExponentialInput", Dates.DateTime("2020-12-29T11:35:11.989"), [0.0], [75.0], [0.35], [5.0e-5], [1.5707963267948966], [0.0], [0.001], [4], 24000.0, [0.0, 100000.0, 200000.0, 300000.0, 400000.0, 500000.0, 600000.0, 700000.0, 800000.0, 900000.0])

And run the file.

python_output = propagate(joinpath(examples_dir, "basic_python.json"));

To read the results:

with open('basic_python_output.json', 'r') as file:
-    output = json.load(file)

This page was generated using Literate.jl.

+ output = json.load(file)

This page was generated using Literate.jl.

diff --git a/dev/generated/magneticfield/index.html b/dev/generated/magneticfield/index.html index 694ffa2..e1faa8a 100644 --- a/dev/generated/magneticfield/index.html +++ b/dev/generated/magneticfield/index.html @@ -156,4 +156,4 @@ plot(OUTPUT_RANGES/1000, agrid; linewidth=1.5, palette=colors, colorbar=false, xlabel="range (km)", ylabel="amplitude (dB)", - labels=permutedims(labels), legendtitle=" dip, az", legend=true)

Progress:  22%|█████████▏                               |  ETA: 0:00:42
Progress:  33%|█████████████▋                           |  ETA: 0:00:40
Progress:  44%|██████████████████▎                      |  ETA: 0:00:32
Progress:  56%|██████████████████████▊                  |  ETA: 0:00:26
Progress:  67%|███████████████████████████▍             |  ETA: 0:00:19
Progress:  78%|███████████████████████████████▉         |  ETA: 0:00:13
Progress:  89%|████████████████████████████████████▌    |  ETA: 0:00:06
Progress: 100%|█████████████████████████████████████████| Time: 0:00:57

At these lower reflection altitudes the effect of Earth's magnetic field is decreased.


This page was generated using Literate.jl.

+ labels=permutedims(labels), legendtitle=" dip, az", legend=true)

Progress:  22%|█████████▏                               |  ETA: 0:00:42
Progress:  33%|█████████████▋                           |  ETA: 0:00:38
Progress:  44%|██████████████████▎                      |  ETA: 0:00:31
Progress:  56%|██████████████████████▊                  |  ETA: 0:00:26
Progress:  67%|███████████████████████████▍             |  ETA: 0:00:19
Progress:  78%|███████████████████████████████▉         |  ETA: 0:00:13
Progress:  89%|████████████████████████████████████▌    |  ETA: 0:00:06
Progress: 100%|█████████████████████████████████████████| Time: 0:00:56

At these lower reflection altitudes the effect of Earth's magnetic field is decreased.


This page was generated using Literate.jl.

diff --git a/dev/generated/magneticfield_daytime_amplitude.png b/dev/generated/magneticfield_daytime_amplitude.png index ca568ac..c98e522 100644 Binary files a/dev/generated/magneticfield_daytime_amplitude.png and b/dev/generated/magneticfield_daytime_amplitude.png differ diff --git a/dev/generated/meshgrid/index.html b/dev/generated/meshgrid/index.html index 63e36fb..523d015 100644 --- a/dev/generated/meshgrid/index.html +++ b/dev/generated/meshgrid/index.html @@ -36,7 +36,7 @@ end phase = modeequationphase(day_mid_me, mesh);
┌ Warning: Instability detected. Aborting
-└ @ SciMLBase ~/.julia/packages/SciMLBase/RHbdj/src/integrator_interface.jl:626

If an instability occurs in the integration of the reflection coefficient, it likely happened at the angle 90° + i0°, which is not a valid mode. This isn't a problem for plotting though!

Plotting the results, we can see that there are clearly identifiable locations where white, black, blue, and orange, each representing a different quadrant of the complex plane, all meet. Each of these locations are either a root or pole in the daytime ionosphere.

heatmap(x, y, reshape(phase, length(x), length(y))';
+└ @ SciMLBase ~/.julia/packages/SciMLBase/DLqDb/src/integrator_interface.jl:626

If an instability occurs in the integration of the reflection coefficient, it likely happened at the angle 90° + i0°, which is not a valid mode. This isn't a problem for plotting though!

Plotting the results, we can see that there are clearly identifiable locations where white, black, blue, and orange, each representing a different quadrant of the complex plane, all meet. Each of these locations are either a root or pole in the daytime ionosphere.

heatmap(x, y, reshape(phase, length(x), length(y))';
         color=:twilight, clims=(-180, 180),
         xlims=(0, 90), ylims=(-40, 0),
         xlabel="real(θ)", ylabel="imag(θ)",
@@ -54,7 +54,7 @@
         xlabel="real(θ)", ylabel="imag(θ)",
         title=night_mid_title,
         right_margin=2mm)
┌ Warning: Instability detected. Aborting
-└ @ SciMLBase ~/.julia/packages/SciMLBase/RHbdj/src/integrator_interface.jl:626

At lower frequencies, the roots/poles move further apart.

phase = modeequationphase(day_low_me, mesh);
+└ @ SciMLBase ~/.julia/packages/SciMLBase/DLqDb/src/integrator_interface.jl:626

At lower frequencies, the roots/poles move further apart.

phase = modeequationphase(day_low_me, mesh);
 
 heatmap(x, y, reshape(phase, length(x), length(y))';
         color=:twilight, clims=(-180, 180),
@@ -62,7 +62,7 @@
         xlabel="real(θ)", ylabel="imag(θ)",
         title=day_low_title,
         right_margin=2mm)
┌ Warning: Instability detected. Aborting
-└ @ SciMLBase ~/.julia/packages/SciMLBase/RHbdj/src/integrator_interface.jl:626

Global complex roots and poles finding

The global complex roots and poles finding (GRPF) algorithm is most efficient when the initial mesh grid consists of equilateral triangles. Such a grid can be produced with the rectangulardomain function from RootsAndPoles, but as seen in the evaluation of the modal equation above, no roots or poles appear in the lower right diagonal half of the domain. Even if they did, they would correspond to highly attenuated modes. Therefore, to save compute time, we can exclude the lower right triangle of the domain from the initial mesh.

The function LongwaveModePropagator.trianglemesh is built into LongwaveModePropagator for this purpose. The inputs are specified by the complex bottom left corner zbl, the top right corner ztr, and the mesh spacing Δr in radians.

zbl = deg2rad(complex(30.0, -10.0))
+└ @ SciMLBase ~/.julia/packages/SciMLBase/DLqDb/src/integrator_interface.jl:626

Global complex roots and poles finding

The global complex roots and poles finding (GRPF) algorithm is most efficient when the initial mesh grid consists of equilateral triangles. Such a grid can be produced with the rectangulardomain function from RootsAndPoles, but as seen in the evaluation of the modal equation above, no roots or poles appear in the lower right diagonal half of the domain. Even if they did, they would correspond to highly attenuated modes. Therefore, to save compute time, we can exclude the lower right triangle of the domain from the initial mesh.

The function LongwaveModePropagator.trianglemesh is built into LongwaveModePropagator for this purpose. The inputs are specified by the complex bottom left corner zbl, the top right corner ztr, and the mesh spacing Δr in radians.

zbl = deg2rad(complex(30.0, -10.0))
 ztr = deg2rad(complex(89.9, 0.0))
 Δr = deg2rad(0.5)
 
@@ -145,4 +145,4 @@
 plot!(img, real(rootsdeg), imag(rootsdeg); color="red",
       seriestype=:scatter, markersize=5);
 plot!(img, real(polesdeg), imag(polesdeg); color="red",
-      seriestype=:scatter, markershape=:utriangle, markersize=5)

The example continues in Mesh grid for mode finding - Part 2.


This page was generated using Literate.jl.

+ seriestype=:scatter, markershape=:utriangle, markersize=5)

The example continues in Mesh grid for mode finding - Part 2.


This page was generated using Literate.jl.

diff --git a/dev/generated/meshgrid2/index.html b/dev/generated/meshgrid2/index.html index 51996bb..4753a2d 100644 --- a/dev/generated/meshgrid2/index.html +++ b/dev/generated/meshgrid2/index.html @@ -28,7 +28,7 @@ xlabel="real(θ)", ylabel="imag(θ)", title=title, right_margin=2mm)
┌ Warning: Instability detected. Aborting
-└ @ SciMLBase ~/.julia/packages/SciMLBase/RHbdj/src/integrator_interface.jl:626

Let's run the grpf with Δr = 0.5.

zbl = deg2rad(complex(30.0, -10.0))
+└ @ SciMLBase ~/.julia/packages/SciMLBase/DLqDb/src/integrator_interface.jl:626

Let's run the grpf with Δr = 0.5.

zbl = deg2rad(complex(30.0, -10.0))
 ztr = deg2rad(complex(89.9, 0.0))
 Δr = deg2rad(0.5)
 
@@ -92,4 +92,4 @@
            xlabel="real(θ)", ylabel="imag(θ)",
            size=(450,375), legend=false);
 plot!(img, [30, 90], [0, 0]; color="red");
-plot!(img, [80, 90], [-10, 0]; color="red")


This page was generated using Literate.jl.

+plot!(img, [80, 90], [-10, 0]; color="red")


This page was generated using Literate.jl.

diff --git a/dev/generated/meshgrid2_20knightfinemesh.png b/dev/generated/meshgrid2_20knightfinemesh.png index 514cdb0..60df009 100644 Binary files a/dev/generated/meshgrid2_20knightfinemesh.png and b/dev/generated/meshgrid2_20knightfinemesh.png differ diff --git a/dev/generated/meshgrid2_20knightfinemeshzoom.png b/dev/generated/meshgrid2_20knightfinemeshzoom.png index 649376b..d64ba4a 100644 Binary files a/dev/generated/meshgrid2_20knightfinemeshzoom.png and b/dev/generated/meshgrid2_20knightfinemeshzoom.png differ diff --git a/dev/generated/meshgrid2_20knightmesh.png b/dev/generated/meshgrid2_20knightmesh.png index 7d279e2..2ace966 100644 Binary files a/dev/generated/meshgrid2_20knightmesh.png and b/dev/generated/meshgrid2_20knightmesh.png differ diff --git a/dev/generated/meshgrid_100kdaymesh.png b/dev/generated/meshgrid_100kdaymesh.png index cb48a43..b3e87e6 100644 Binary files a/dev/generated/meshgrid_100kdaymesh.png and b/dev/generated/meshgrid_100kdaymesh.png differ diff --git a/dev/generated/meshgrid_10kdaymesh.png b/dev/generated/meshgrid_10kdaymesh.png index de25d78..8a27ca1 100644 Binary files a/dev/generated/meshgrid_10kdaymesh.png and b/dev/generated/meshgrid_10kdaymesh.png differ diff --git a/dev/generated/meshgrid_20kdaymesh.png b/dev/generated/meshgrid_20kdaymesh.png index ba70e1e..cb424e3 100644 Binary files a/dev/generated/meshgrid_20kdaymesh.png and b/dev/generated/meshgrid_20kdaymesh.png differ diff --git a/dev/generated/meshgrid_20knightmesh.png b/dev/generated/meshgrid_20knightmesh.png index c26bf17..9d25f49 100644 Binary files a/dev/generated/meshgrid_20knightmesh.png and b/dev/generated/meshgrid_20knightmesh.png differ diff --git a/dev/generated/multiplespecies/index.html b/dev/generated/multiplespecies/index.html index a247da0..94d190b 100644 --- a/dev/generated/multiplespecies/index.html +++ b/dev/generated/multiplespecies/index.html @@ -28,4 +28,4 @@ plot!(p1, rx.distance/1000, aei, label="electrons & ions") p2 = plot(rx.distance/1000, aei-ae, ylims=(-0.5, 0.5), xlabel="Range (km)", ylabel="Δ", legend=false) -plot(p1, p2, layout=grid(2,1,heights=[0.7, 0.3]))

The influence here is minor; the difference is hardly above the noise floor of many VLF receivers. Also, running with 3 species increases the runtime over 1 species by ~50%.


This page was generated using Literate.jl.

+plot(p1, p2, layout=grid(2,1,heights=[0.7, 0.3]))

The influence here is minor; the difference is hardly above the noise floor of many VLF receivers. Also, running with 3 species increases the runtime over 1 species by ~50%.


This page was generated using Literate.jl.

diff --git a/dev/generated/multiplespecies_amplitude.png b/dev/generated/multiplespecies_amplitude.png index bf39c1c..4df1f5e 100644 Binary files a/dev/generated/multiplespecies_amplitude.png and b/dev/generated/multiplespecies_amplitude.png differ diff --git a/dev/generated/wavefieldintegration/index.html b/dev/generated/wavefieldintegration/index.html index 11cecb0..04b826f 100644 --- a/dev/generated/wavefieldintegration/index.html +++ b/dev/generated/wavefieldintegration/index.html @@ -102,17 +102,17 @@ label=permutedims(solverstrings), legend=:topright)

The times to run each...

TO
 ──────────────────────────────────────────────────────────────────────
                               Time                    Allocations      
                      ───────────────────────   ────────────────────────
-  Tot / % measured:       22.8s /  38.8%           6.69GiB /  74.0%    
+  Tot / % measured:       22.5s /  38.2%           6.70GiB /  73.9%    
 
  Section     ncalls     time    %tot     avg     alloc    %tot      avg
  ──────────────────────────────────────────────────────────────────────
- OwrenZen5      400    1.63s   18.4%  4.07ms    785MiB   15.5%  1.96MiB
- Vern9          400    1.57s   17.7%  3.91ms    759MiB   15.0%  1.90MiB
- Vern7          400    1.20s   13.5%  2.99ms    718MiB   14.2%  1.79MiB
- Tsit5          400    1.17s   13.2%  2.93ms    693MiB   13.7%  1.73MiB
- Vern6          400    1.15s   13.0%  2.88ms    722MiB   14.2%  1.81MiB
- Vern8          400    1.14s   12.9%  2.85ms    692MiB   13.6%  1.73MiB
- BS5            400    992ms   11.2%  2.48ms    703MiB   13.9%  1.76MiB
+ OwrenZen5      400    1.65s   19.2%  4.13ms    785MiB   15.5%  1.96MiB
+ Vern9          400    1.56s   18.2%  3.91ms    759MiB   15.0%  1.90MiB
+ Vern7          400    1.20s   14.0%  3.00ms    718MiB   14.2%  1.79MiB
+ Vern6          400    1.16s   13.4%  2.89ms    722MiB   14.2%  1.81MiB
+ Vern8          400    1.14s   13.2%  2.84ms    692MiB   13.6%  1.73MiB
+ BS5            400    992ms   11.5%  2.48ms    703MiB   13.9%  1.76MiB
+ Tsit5          400    895ms   10.4%  2.24ms    693MiB   13.7%  1.73MiB
  ──────────────────────────────────────────────────────────────────────

The Tsit5, BS5, and 6th, 7th, and 8th order Vern methods all have similar performance. In fact, rerunning these same tests multiple times can result in different solvers being "fastest".

We use Tsit5()as the default in LongwaveModePropagator, which is similar to MATLAB's ode45, but usually more efficient.

Why not a strict RK4 or a more basic method? I tried them and they produce some discontinuities around the reflection height. It is admittedly difficult to tell if this is a true failure of the methods at this height or a problem related to the scaling and saving callbacks that occur during the integration. In any case, none of the methods tested above exhibit that issue.

Pitteway figure 2

Let's reproduce the wavefields in figure 2 of Pitteway (1965).

zs = 110e3:-50:50e3
 zskm = zs/1000
 
@@ -157,4 +157,4 @@
 
 ey1p = plotfield(ey1; ylims=(75, 102), title="\$E_{y,1}\$");
 hx2p = plotfield(hx2; ylims=(75, 102), title="\$H_{x,2}\$");
-plot(ey1p, hx2p; layout=(1,2), size=(400,500))


This page was generated using Literate.jl.

+plot(ey1p, hx2p; layout=(1,2), size=(400,500))


This page was generated using Literate.jl.

diff --git a/dev/index.html b/dev/index.html index d9da3c6..62eeeb3 100644 --- a/dev/index.html +++ b/dev/index.html @@ -25,4 +25,4 @@ plot(rx.distance/1000, a, xlabel="Distance (km)", ylabel="Amplitude (dB μV/m)")

Note

SI units (MKS) and radians are used throughout LongwaveModePropagator.

The only exception in the current version of the package is the use of kilometers and inverse kilometers to define Wait and Spies $h'$ and $\beta$ parameters for the electron density profile in the function waitprofile. In practice, the units of these parameters are often implicitly taken to be kilometers and inverse kilometers.

Users are encouraged to browse the Examples section for more complex scenarios.

New to Julia?

Julia is a relatively new general programming language that shines for technical computing. It has similarities to Matlab and Python, but is high performance and attempts to solve the "two language problem". In part, it achieves its high performance by compiling functions to efficient native code via LLVM. Julia is dynamically typed and uses multiple dispatch, so that the first time a given function is passed arguments of a certain type, the function is compiled for those types. In practice, this means that the first time a function is called, it takes longer than it will on subsequent calls, because at the first call the function also had to be compiled.

Finding help

I highly recommend reading the Julia Documentation. It is very thorough and combines significant textual explanations with examples.

Besides the regular REPL prompt julia> and the package mode accessed with ], there is also a help mode accessible with ?. The help functionality works "automatically", even for user-defined functions with docstrings. Most internal functions of LongwaveModePropagator are documented, so e.g.

? LongwaveModePropagator.bookerquartic

prints an explanation of the LongwaveModePropagator.bookerquartic function even though it's not exported from the package.

References

K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955, doi: 10.1098/rspa.1955.0027.

-

K. G. Budden, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962, doi: 10.1098/rspa.1962.0041.

Citing

We encourage you to cite the following paper (or see CITATION.bib) if this package is used in scientific work:

F. Gasdia and R. A. Marshall, "A New Longwave Mode Propagator for the Earth–Ionosphere Waveguide," in IEEE Transactions on Antennas and Propagation, vol. 69, no. 12, pp. 8675-8688, Dec. 2021, doi: 10.1109/TAP.2021.3083753.

+

K. G. Budden, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962, doi: 10.1098/rspa.1962.0041.

Citing

We encourage you to cite the following paper (or see CITATION.bib) if this package is used in scientific work:

F. Gasdia and R. A. Marshall, "A New Longwave Mode Propagator for the Earth–Ionosphere Waveguide," in IEEE Transactions on Antennas and Propagation, vol. 69, no. 12, pp. 8675-8688, Dec. 2021, doi: 10.1109/TAP.2021.3083753.

diff --git a/dev/lib/internals/index.html b/dev/lib/internals/index.html index ad8a8de..7d16271 100644 --- a/dev/lib/internals/index.html +++ b/dev/lib/internals/index.html @@ -1,6 +1,6 @@ -Internals · LongwaveModePropagator

Internals

Documentation of all consts, structs, functions, etc.

LongwaveModePropagator.AbstractDipoleType
AbstractDipole <: Antenna

Abstract type for dipole antennas.

Subtypes of AbstractDipole have an orientation azimuth_angle ($ϕ$) and inclination_angle ($γ$) where

[rad]ϕγ
0end firevertical
π/2broadsidehorizontal
Note

Angles describe the orientation of the antenna, not the radiation pattern.

source
LongwaveModePropagator.bookerquarticFunction
bookerquartic(ea::EigenAngle, M)
-bookerquartic(T::TMatrix)

Compute roots q and the coefficients B of the Booker quartic described by the susceptibility tensor M or T matrix.

References

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.

source
LongwaveModePropagator.bookerreflectionFunction
bookerreflection(ea::EigenAngle, M::SMatrix{3,3})
+Internals · LongwaveModePropagator

Internals

Documentation of all consts, structs, functions, etc.

LongwaveModePropagator.AbstractDipoleType
AbstractDipole <: Antenna

Abstract type for dipole antennas.

Subtypes of AbstractDipole have an orientation azimuth_angle ($ϕ$) and inclination_angle ($γ$) where

[rad]ϕγ
0end firevertical
π/2broadsidehorizontal
Note

Angles describe the orientation of the antenna, not the radiation pattern.

source
LongwaveModePropagator.bookerquarticFunction
bookerquartic(ea::EigenAngle, M)
+bookerquartic(T::TMatrix)

Compute roots q and the coefficients B of the Booker quartic described by the susceptibility tensor M or T matrix.

References

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.

source
LongwaveModePropagator.bookerreflectionFunction
bookerreflection(ea::EigenAngle, M::SMatrix{3,3})
 bookerreflection(ea::EigenAngle, e)

Compute the ionosphere reflection coefficient matrix for a sharply bounded ionosphere from 4×2 wavefields matrix e or the susceptibility matrix M.

The ionosphere reflection coefficient matrix is computed from a ratio of the downgoing to upgoing plane waves in the free space beneath the ionosphere [Budden1988] pg. 307. These are obtained from the two upgoing characteristic waves found from the Booker quartic. Each make up a column of e.

\[R = \begin{pmatrix} Ce₁[4] - e₁[1] & Ce₂[4] - e₂[1] \\ @@ -9,16 +9,16 @@ \begin{pmatrix} Ce₁[4] + e₁[1] & Ce₂[4] + e₂[1] \\ -Ce₁[2] - e₁[3] & -Ce₂[2] - e₂[3] - \end{pmatrix}^{-1}\]

The reflection coefficient matrix for the sharply bounded case is commonly used as a starting solution for integration of the reflection coefficient matrix through the ionosphere.

References

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.

Extended help

The set of horizontal field components $e = (Ex, -Ey, Z₀Hx, Z₀Hy)ᵀ$ can be separated into an upgoing and downgoing wave, each of which is generally elliptically polarized. A ratio of the amplitudes of these two waves give a reflection coefficient, except it would only apply for an incident wave of that particular elliptical polarization. However, the first set of fields can be linearly combined with a second independent solution for the fields, which will generally have a different elliptical polarization than the first. Two linear combinations of the two sets of fields are formed with unit amplitude, linearly polarized incident waves. The reflected waves then give the components $R₁₁$, $R₂₁$ or $R₁₂$, $R₂₂$ for the incident wave in the plane of incidence and perpendicular to it, respectively [Budden1988] pg 552.

The process for determining the reflection coefficient requires resolving the two sets of fields $e₁$ and $e₂$ into the four linearly polarized vacuum modes. The layer of vacuum can be assumed to be so thin that it does not affect the fields. There will be two upgoing waves and two downgoing waves, each which has one $E$ and one $H$ in the plane of incidence. If $f₁, f₂, f₃, f₄$ are the complex amplitudes of the four component waves, then in matrix notation $e = Lf$ where $L$ is the appropriate transformation matrix.

For $e₁$ and $e₂$, we can find the corresponding vectors $f1$ and $f2$ by $f1 = L⁻¹e₁$, $f2 = L⁻¹e₂$ where the two column vectors are partitioned such that $f1 = (u1, d1)ᵀ$ and $f2 = (u2, d2)ᵀ$ for upgoing and downgoing 2-element vectors $u$ and $d$. From the definition of the reflection coefficient $R$, $d = Ru$. Letting $U = (u1, u2)$, $D = (d1, d2)$, then $D = RU$ and the reflection coefficient is $R = DU⁻¹$. Because the reflection coefficient matrix is a ratio of fields, either $e₁$ and/or $e₂$ can be independently multiplied by an arbitrary constant and the value of $R$ is unaffected.

This function directly computes $D$ and $U$ and solves for $R$ using the right division operator R = D/U.

For additional details, see [Budden1988], chapter 18, section 7.

source
LongwaveModePropagator.bookerreflectionMethod
bookerreflection(ea::EigenAngle, M, ::Dθ)

Compute the ionosphere reflection coefficient matrix $R$ for a sharply bounded ionosphere with susceptibility tensor M, as well as its derivative $dR/dθ$ returned as the tuple (R, dR).

source
LongwaveModePropagator.bookerwavefieldsFunction
bookerwavefields(ea::EigenAngle, M)
+    \end{pmatrix}^{-1}\]

The reflection coefficient matrix for the sharply bounded case is commonly used as a starting solution for integration of the reflection coefficient matrix through the ionosphere.

References

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.

Extended help

The set of horizontal field components $e = (Ex, -Ey, Z₀Hx, Z₀Hy)ᵀ$ can be separated into an upgoing and downgoing wave, each of which is generally elliptically polarized. A ratio of the amplitudes of these two waves give a reflection coefficient, except it would only apply for an incident wave of that particular elliptical polarization. However, the first set of fields can be linearly combined with a second independent solution for the fields, which will generally have a different elliptical polarization than the first. Two linear combinations of the two sets of fields are formed with unit amplitude, linearly polarized incident waves. The reflected waves then give the components $R₁₁$, $R₂₁$ or $R₁₂$, $R₂₂$ for the incident wave in the plane of incidence and perpendicular to it, respectively [Budden1988] pg 552.

The process for determining the reflection coefficient requires resolving the two sets of fields $e₁$ and $e₂$ into the four linearly polarized vacuum modes. The layer of vacuum can be assumed to be so thin that it does not affect the fields. There will be two upgoing waves and two downgoing waves, each which has one $E$ and one $H$ in the plane of incidence. If $f₁, f₂, f₃, f₄$ are the complex amplitudes of the four component waves, then in matrix notation $e = Lf$ where $L$ is the appropriate transformation matrix.

For $e₁$ and $e₂$, we can find the corresponding vectors $f1$ and $f2$ by $f1 = L⁻¹e₁$, $f2 = L⁻¹e₂$ where the two column vectors are partitioned such that $f1 = (u1, d1)ᵀ$ and $f2 = (u2, d2)ᵀ$ for upgoing and downgoing 2-element vectors $u$ and $d$. From the definition of the reflection coefficient $R$, $d = Ru$. Letting $U = (u1, u2)$, $D = (d1, d2)$, then $D = RU$ and the reflection coefficient is $R = DU⁻¹$. Because the reflection coefficient matrix is a ratio of fields, either $e₁$ and/or $e₂$ can be independently multiplied by an arbitrary constant and the value of $R$ is unaffected.

This function directly computes $D$ and $U$ and solves for $R$ using the right division operator R = D/U.

For additional details, see [Budden1988], chapter 18, section 7.

source
LongwaveModePropagator.bookerreflectionMethod
bookerreflection(ea::EigenAngle, M, ::Dθ)

Compute the ionosphere reflection coefficient matrix $R$ for a sharply bounded ionosphere with susceptibility tensor M, as well as its derivative $dR/dθ$ returned as the tuple (R, dR).

source
LongwaveModePropagator.bookerwavefieldsFunction
bookerwavefields(ea::EigenAngle, M)
 bookerwavefields(T::TMatrix)

Compute the two-column wavefields matrix e from the ionosphere with susceptibility tensor M or T matrix for the two upgoing wavefields.

The first column of e is the evanescent wave and the second is the travelling wave.

\[e = \begin{pmatrix} Ex₁ & Ex₂ \\ -Ey₁ & -Ey₂ \\ Hx₁ & Hx₂ \\ Hy₁ & Hy₂ - \end{pmatrix}\]

This function solves the eigenvalue problem $Te = qe$. First, the Booker quartic is solved for the roots q. Then they are sorted so that the roots associated with the two upgoing waves can be selected. e is solved as the eigenvectors for the two qs. An analytical solution is used where e[2,:] = 1.

source
LongwaveModePropagator.bookerwavefieldsMethod
bookerwavefields(ea::EigenAngle, M, ::Dθ)
-bookerwavefields(T::TMatrix, dT, ::Dθ)

Compute the two-column wavefields matrix e as well as its derivative with respect to $θ$, returned as a tuple (e, de) for the ionosphere with susceptibility tensor M or T matrix and its derivative with respect to $θ$, dT.

source
LongwaveModePropagator.dbookerquarticFunction
dbookerquartic(ea::EigenAngle, M, q, B)
-dbookerquartic(T::TMatrix, dT, q, B)

Compute derivative dq of the Booker quartic roots q with respect to $θ$ for the ionosphere described by susceptibility tensor M or T matrix.

source
LongwaveModePropagator.sortquarticroots!Method
sortquarticroots!(q)

Sort array of quartic roots q in place such that the first two correspond to upgoing waves and the latter two correspond to downgoing waves.

General locations of the four roots of the Booker quartic on the complex plane corresponding to the:

1) upgoing evanescent wave
+    \end{pmatrix}\]

This function solves the eigenvalue problem $Te = qe$. First, the Booker quartic is solved for the roots q. Then they are sorted so that the roots associated with the two upgoing waves can be selected. e is solved as the eigenvectors for the two qs. An analytical solution is used where e[2,:] = 1.

source
LongwaveModePropagator.bookerwavefieldsMethod
bookerwavefields(ea::EigenAngle, M, ::Dθ)
+bookerwavefields(T::TMatrix, dT, ::Dθ)

Compute the two-column wavefields matrix e as well as its derivative with respect to $θ$, returned as a tuple (e, de) for the ionosphere with susceptibility tensor M or T matrix and its derivative with respect to $θ$, dT.

source
LongwaveModePropagator.dbookerquarticFunction
dbookerquartic(ea::EigenAngle, M, q, B)
+dbookerquartic(T::TMatrix, dT, q, B)

Compute derivative dq of the Booker quartic roots q with respect to $θ$ for the ionosphere described by susceptibility tensor M or T matrix.

source
LongwaveModePropagator.sortquarticroots!Method
sortquarticroots!(q)

Sort array of quartic roots q in place such that the first two correspond to upgoing waves and the latter two correspond to downgoing waves.

General locations of the four roots of the Booker quartic on the complex plane corresponding to the:

1) upgoing evanescent wave
 2) upgoing travelling wave
 3) downgoing evanescent wave
 4) downgoing travelling wave
          Im
@@ -30,47 +30,47 @@
           |      . 2
           |
           |
-          | . 1

Based on [Pitteway1965] fig. 5.

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.upgoingMethod
upgoing(q)

Calculate the absolute angle of q in radians from 315°×π/180 on the complex plane. Smaller values indicate upgoing waves.

source
Base.islessMethod
isless(x::EigenAngle, y::EigenAngle)

Calls Base.isless for complex EigenAngle by real and then imag component.

By defining isless, calling sort on EigenAngles sorts by real component first and imaginary component second.

source
LongwaveModePropagator.isdetachedMethod
isdetached(ea::EigenAngle, frequency::Frequency; params=LMPParams())

Return true if this is likely an earth detached (whispering gallery) mode according to the criteria in [Pappert1981] eq. 1 with the additional criteria that the frequency be above 100 kHz.

References

[Pappert1981]: R. A. Pappert, “LF daytime earth ionosphere waveguide calculations,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-647, Jan. 1981. [Online]. Available: https://apps.dtic.mil/docs/citations/ADA096098.

source
LongwaveModePropagator.magnetoionicparametersMethod
magnetoionicparameters(z, frequency::Frequency, bfield::BField, species::Species)

Compute the magnetoionic parameters X, Y, and Z for height z.

\[X = N e² / (ϵ₀ m ω²) + | . 1

Based on [Pitteway1965] fig. 5.

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.upgoingMethod
upgoing(q)

Calculate the absolute angle of q in radians from 315°×π/180 on the complex plane. Smaller values indicate upgoing waves.

source
Base.islessMethod
isless(x::EigenAngle, y::EigenAngle)

Calls Base.isless for complex EigenAngle by real and then imag component.

By defining isless, calling sort on EigenAngles sorts by real component first and imaginary component second.

source
LongwaveModePropagator.isdetachedMethod
isdetached(ea::EigenAngle, frequency::Frequency; params=LMPParams())

Return true if this is likely an earth detached (whispering gallery) mode according to the criteria in [Pappert1981] eq. 1 with the additional criteria that the frequency be above 100 kHz.

References

[Pappert1981]: R. A. Pappert, “LF daytime earth ionosphere waveguide calculations,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-647, Jan. 1981. [Online]. Available: https://apps.dtic.mil/docs/citations/ADA096098.

source
LongwaveModePropagator.magnetoionicparametersMethod
magnetoionicparameters(z, frequency::Frequency, bfield::BField, species::Species)

Compute the magnetoionic parameters X, Y, and Z for height z.

\[X = N e² / (ϵ₀ m ω²) Y = e B / (m ω) -Z = ν / ω\]

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955, pp. 517.

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988, pp. 39.

[Ratcliffe1959]: J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.

source
LongwaveModePropagator.buildrunFunction
buildrun(s::ExponentialInput; mesh=nothing, unwrap=true, params=LMPParams())
+Z = ν / ω\]

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955, pp. 517.

[Budden1988]: K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988, pp. 39.

[Ratcliffe1959]: J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.

source
LongwaveModePropagator.buildrunFunction
buildrun(s::ExponentialInput; mesh=nothing, unwrap=true, params=LMPParams())
 buildrun(s::TableInput; mesh=nothing, unwrap=true, params=LMPParams())
-buildrun(s::BatchInput; mesh=nothing, unwrap=true, params=LMPParams())

Build LMP structs from an Input and run LMP.

For TableInputs, a FritschButland monotonic interpolation is performed over density and collision_frequency.

source
LongwaveModePropagator.buildrunsaveMethod
buildrunsave(outfile, s::BatchInput; append=false, mesh=nothing, unwrap=true, params=LMPParams())

Similar to buildrun, except it saves results into outfile as s is processed.

If append=true, this function parses outfile for preexisting results and only runs the remaining scenarios in s. Otherwise, a new BatchOutput is created.

source
LongwaveModePropagator.buildwaveguideMethod
buildwaveguide(s::TableInput, i)

Return HomogeneousWaveguide from the ith entry in each field of s with a FritschButland monotonic interpolation over density and collision_frequency.

Outside of s.altitude the nearest s.density or s.collision_frequency is used.

source
LongwaveModePropagator.ModeEquationType
ModeEquation

Functions can dispatch on subtypes of ModeEquation, although currently only PhysicalModeEquation is supported.

Future work might include the ModifiedModeEquation of [Morfitt1976].

References

[Morfitt1976]: D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976. [Online]. Available: http://www.dtic.mil/docs/citations/ADA032573.

source
LongwaveModePropagator.susceptibilityMethod
susceptibility(altitude, frequency, bfield, species; params=LMPParams())
+buildrun(s::BatchInput; mesh=nothing, unwrap=true, params=LMPParams())

Build LMP structs from an Input and run LMP.

For TableInputs, a FritschButland monotonic interpolation is performed over density and collision_frequency.

source
LongwaveModePropagator.buildrunsaveMethod
buildrunsave(outfile, s::BatchInput; append=false, mesh=nothing, unwrap=true, params=LMPParams())

Similar to buildrun, except it saves results into outfile as s is processed.

If append=true, this function parses outfile for preexisting results and only runs the remaining scenarios in s. Otherwise, a new BatchOutput is created.

source
LongwaveModePropagator.buildwaveguideMethod
buildwaveguide(s::TableInput, i)

Return HomogeneousWaveguide from the ith entry in each field of s with a FritschButland monotonic interpolation over density and collision_frequency.

Outside of s.altitude the nearest s.density or s.collision_frequency is used.

source
LongwaveModePropagator.ModeEquationType
ModeEquation

Functions can dispatch on subtypes of ModeEquation, although currently only PhysicalModeEquation is supported.

Future work might include the ModifiedModeEquation of [Morfitt1976].

References

[Morfitt1976]: D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976. [Online]. Available: http://www.dtic.mil/docs/citations/ADA032573.

source
LongwaveModePropagator.susceptibilityMethod
susceptibility(altitude, frequency, bfield, species; params=LMPParams())
 susceptibility(altitude, frequency, w::HomogeneousWaveguide; params=LMPParams())
 susceptibility(altitude, me::ModeEquation; params=LMPParams())

Compute the ionosphere susceptibility tensor M as a SMatrix{3,3} using species.numberdensity and species.collisionfrequency at altitude.

Multiple species can be passed as an iterable. Use a tuple of Species, rather than a Vector, for better performance.

If params.earthcurvature == true, M includes a first order correction for earth curvature by means of a fictitious refractive index [Pappert1967].

The susceptibility matrix is calculated from the constitutive relations presented in [Ratcliffe1959]. This includes the effect of earth's magnetic field vector and collisional damping on electron motion.

The tensor is:

\[M = -\frac{X}{U(U²-Y²)} \begin{pmatrix} U² - x²Y² & -izUY - xyY² & iyUY - xzY² \\ izUY - xyY² & U² - y²Y² & -ixUY - yzY² \\ -iyUY - xzY² & ixUY - yzY² & U² - z²Y² - \end{pmatrix}\]

where $X = ωₚ²/ω²$, $Y = |ωₕ/ω|$, $Z = ν/ω$, and $U = 1 - iZ$. The earth curvature correction subtracts $2/Rₑ*(H - altitude)$ from the diagonal of $M$ where $H$ is params.curvatureheight.

References

[Pappert1967]: R. A. Pappert, E. E. Gossard, and I. J. Rothmuller, “A numerical investigation of classical approximations used in VLF propagation,” Radio Science, vol. 2, no. 4, pp. 387–400, Apr. 1967, doi: 10.1002/rds196724387.

[Ratcliffe1959]: J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.

source
LongwaveModePropagator.susceptibilitysplineMethod
susceptibilityspline(frequency, bfield, species; params=LMPParams())
+        \end{pmatrix}\]

where $X = ωₚ²/ω²$, $Y = |ωₕ/ω|$, $Z = ν/ω$, and $U = 1 - iZ$. The earth curvature correction subtracts $2/Rₑ*(H - altitude)$ from the diagonal of $M$ where $H$ is params.curvatureheight.

References

[Pappert1967]: R. A. Pappert, E. E. Gossard, and I. J. Rothmuller, “A numerical investigation of classical approximations used in VLF propagation,” Radio Science, vol. 2, no. 4, pp. 387–400, Apr. 1967, doi: 10.1002/rds196724387.

[Ratcliffe1959]: J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.

source
LongwaveModePropagator.susceptibilitysplineMethod
susceptibilityspline(frequency, bfield, species; params=LMPParams())
 susceptibilityspline(frequency, w::HomogeneousWaveguide; params=LMPParams())
-susceptibilityspline(me::ModeEquation; params=LMPParams())

Construct a cubic interpolating spline of susceptibility and return the callable Interpolations type.

params.susceptibilitysplinestep is the altitude step in meters used to construct the spline between BOTTOMHEIGHT and params.topheight.

source
LongwaveModePropagator.modeconversionMethod
modeconversion(previous_wavefields::Wavefields, wavefields::Wavefields,
-    adjoint_wavefields::Wavefields; params=LMPParams())

Compute the mode conversion matrix a from the modes associated with previous_wavefields to modes associated with wavefields and its adjoint_wavefields.

This is used in the approach known as full mode conversion [Pappert1972b].

References

[Pappert1972b]: R. A. Pappert and R. R. Smith, “Orthogonality of VLF height gains in the earth ionosphere waveguide,” Radio Science, vol. 7, no. 2, pp. 275–278, 1972, doi: 10.1029/RS007i002p00275.

source
LongwaveModePropagator.dRdzFunction
dRdz(R, modeequation, z, susceptibilityfcn=z->susceptibility(z, modeequation; params=LMPParams()))

Compute the differential of the reflection matrix R, $dR/dz$, at height z. susceptibilityfcn is a function returning the ionosphere susceptibility at height z.

Following the Budden formalism for the reflection of an (obliquely) incident plane wave from a horizontally stratified ionosphere [Budden1955a], the differential of the reflection matrix R with height z can be described by

\[dR/dz = k/(2i)⋅(W₂₁ + W₂₂R - RW₁₁ - RW₁₂R)\]

Integrating $dR/dz$ downwards through the ionosphere gives the reflection matrix $R$ for the ionosphere as if it were a sharp boundary at the stopping level with free space below.

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

source
LongwaveModePropagator.dRdθdzMethod
dRdθdz(RdRdθ, p, z)

Compute the differential $dR/dθ/dz$ at height z returned as an SMatrix{4,2} with $dR/dz$ in the first 2 rows and $dR/dθ/dz$ in the bottom 2 rows.

p is a tuple containing instances (PhysicalModeEquation(), LMPParams()).

source
LongwaveModePropagator.defaultmeshMethod
defaultmesh(frequency; rmin=deg2rad(30.0), imin=deg2rad(-10.0),
+susceptibilityspline(me::ModeEquation; params=LMPParams())

Construct a cubic interpolating spline of susceptibility and return the callable Interpolations type.

params.susceptibilitysplinestep is the altitude step in meters used to construct the spline between BOTTOMHEIGHT and params.topheight.

source
LongwaveModePropagator.modeconversionMethod
modeconversion(previous_wavefields::Wavefields, wavefields::Wavefields,
+    adjoint_wavefields::Wavefields; params=LMPParams())

Compute the mode conversion matrix a from the modes associated with previous_wavefields to modes associated with wavefields and its adjoint_wavefields.

This is used in the approach known as full mode conversion [Pappert1972b].

References

[Pappert1972b]: R. A. Pappert and R. R. Smith, “Orthogonality of VLF height gains in the earth ionosphere waveguide,” Radio Science, vol. 7, no. 2, pp. 275–278, 1972, doi: 10.1029/RS007i002p00275.

source
LongwaveModePropagator.dRdzFunction
dRdz(R, modeequation, z, susceptibilityfcn=z->susceptibility(z, modeequation; params=LMPParams()))

Compute the differential of the reflection matrix R, $dR/dz$, at height z. susceptibilityfcn is a function returning the ionosphere susceptibility at height z.

Following the Budden formalism for the reflection of an (obliquely) incident plane wave from a horizontally stratified ionosphere [Budden1955a], the differential of the reflection matrix R with height z can be described by

\[dR/dz = k/(2i)⋅(W₂₁ + W₂₂R - RW₁₁ - RW₁₂R)\]

Integrating $dR/dz$ downwards through the ionosphere gives the reflection matrix $R$ for the ionosphere as if it were a sharp boundary at the stopping level with free space below.

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

source
LongwaveModePropagator.dRdθdzMethod
dRdθdz(RdRdθ, p, z)

Compute the differential $dR/dθ/dz$ at height z returned as an SMatrix{4,2} with $dR/dz$ in the first 2 rows and $dR/dθ/dz$ in the bottom 2 rows.

p is a tuple containing instances (PhysicalModeEquation(), LMPParams()).

source
LongwaveModePropagator.defaultmeshMethod
defaultmesh(frequency; rmin=deg2rad(30.0), imin=deg2rad(-10.0),
     Δr_coarse=deg2rad(0.5), Δr_fine=deg2rad(0.1),
-    rtransition=deg2rad(75.0), itransition=deg2rad(-1.5))

Generate vector of complex coordinates to be used by GRPF in the search for waveguide modes.

rmin is the lower bound of the real axis and imin is the lower bound of the imaginary axis.

At frequencies above 12 kHz the mesh spacing in the upper right corner of the domain with real values above rtransition and imaginary values above itransition is Δr_fine and is Δr_coarse everywhere else.

At frequencies below 12 kHz the mesh spacing is always Δr_coarse.

The lower right diagonal of the lower right quadrant of the complex plane is excluded from the mesh.

See also: findmodes

source
LongwaveModePropagator.dwmatrixMethod
dwmatrix(ea::EigenAngle, T, dT)

Compute the four submatrix elements of $dW/dθ$ returned as the tuple (dW₁₁, dW₂₁, dW₁₂, dW₂₂) from the ionosphere with T matrix and its derivative with respect to $θ$, dT.

source
LongwaveModePropagator.fresnelreflectionFunction
fresnelreflection(ea::EigenAngle, ground::Ground, frequency::Frequency)
-fresnelreflection(m::PhysicalModeEquation)

Compute the Fresnel reflection coefficient matrix for the ground-freespace interface at the ground.

source
LongwaveModePropagator.fresnelreflectionMethod
fresnelreflection(ea::EigenAngle, ground::Ground, frequency::Frequency, ::Dθ)
-fresnelreflection(m::PhysicalModeEquation, ::Dθ)

Compute the Fresnel reflection coefficient matrix for the ground as well as its derivative with respect to $θ$ returned as the tuple (Rg, dRg).

source
LongwaveModePropagator.integratedreflectionMethod
integratedreflection(modeequation::PhysicalModeEquation, ::Dθ; params=LMPParams())

Compute $R$ and $dR/dθ$ as an SMatrix{4,2} with $R$ in rows (1, 2) and $dR/dθ$ in rows (3, 4).

The params.integrationparams.tolerance is hardcoded to 1e-10 in this version of the function.

source
LongwaveModePropagator.integratedreflectionMethod
integratedreflection(modeequation::PhysicalModeEquation;
-    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Integrate $dR/dz$ downward through the ionosphere described by modeequation from params.topheight, returning the ionosphere reflection coefficient R at the ground. susceptibilityfcn is a function returning the ionosphere susceptibility tensor as a function of altitude z in meters.

params.integrationparams are passed to DifferentialEquations.jl.

source
LongwaveModePropagator.modalequationMethod
modalequation(R, Rg)

Compute the determinental mode equation $det(Rg R - I)$ given reflection coefficients R and Rg.

A propagating waveguide mode requires that a wave, having reflected from the ionosphere and then the ground, must be identical with the original upgoing wave. This criteria is met at roots of the mode equation [Budden1962].

References

[Budden1962]: K. G. Budden and N. F. Mott, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962.

source
LongwaveModePropagator.solvedmodalequationMethod
solvedmodalequation(modeequation::PhysicalModeEquation; params=LMPParams())

Compute the derivative of the modal equation with respect to $θ$ returned as the tuple (dF, R, Rg) for the ionosphere and ground reflection coefficients.

source
LongwaveModePropagator.solvemodalequationMethod
solvemodalequation(θ, modeequation::PhysicalModeEquation;
-    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Set θ for modeequation and then solve the modal equation.

source
LongwaveModePropagator.solvemodalequationMethod
solvemodalequation(modeequation::PhysicalModeEquation;
-    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Compute the ionosphere and ground reflection coefficients and return the value of the determinental modal equation associated with modeequation. susceptibilityfcn is a function that returns the ionosphere susceptibility as a function of altitude z in meters.

See also: solvedmodalequation

source
LongwaveModePropagator.trianglemeshMethod
trianglemesh(zbl, ztr, Δr)

Generate initial mesh node coordinates for a right triangle domain from complex coordinate zbl in the bottom left and ztr in the top right with initial mesh step Δr.

zbl and ztr are located on the complex plane at the locations marked in the diagram below:

       im
+    rtransition=deg2rad(75.0), itransition=deg2rad(-1.5))

Generate vector of complex coordinates to be used by GRPF in the search for waveguide modes.

rmin is the lower bound of the real axis and imin is the lower bound of the imaginary axis.

At frequencies above 12 kHz the mesh spacing in the upper right corner of the domain with real values above rtransition and imaginary values above itransition is Δr_fine and is Δr_coarse everywhere else.

At frequencies below 12 kHz the mesh spacing is always Δr_coarse.

The lower right diagonal of the lower right quadrant of the complex plane is excluded from the mesh.

See also: findmodes

source
LongwaveModePropagator.dwmatrixMethod
dwmatrix(ea::EigenAngle, T, dT)

Compute the four submatrix elements of $dW/dθ$ returned as the tuple (dW₁₁, dW₂₁, dW₁₂, dW₂₂) from the ionosphere with T matrix and its derivative with respect to $θ$, dT.

source
LongwaveModePropagator.fresnelreflectionFunction
fresnelreflection(ea::EigenAngle, ground::Ground, frequency::Frequency)
+fresnelreflection(m::PhysicalModeEquation)

Compute the Fresnel reflection coefficient matrix for the ground-freespace interface at the ground.

source
LongwaveModePropagator.fresnelreflectionMethod
fresnelreflection(ea::EigenAngle, ground::Ground, frequency::Frequency, ::Dθ)
+fresnelreflection(m::PhysicalModeEquation, ::Dθ)

Compute the Fresnel reflection coefficient matrix for the ground as well as its derivative with respect to $θ$ returned as the tuple (Rg, dRg).

source
LongwaveModePropagator.integratedreflectionMethod
integratedreflection(modeequation::PhysicalModeEquation, ::Dθ; params=LMPParams())

Compute $R$ and $dR/dθ$ as an SMatrix{4,2} with $R$ in rows (1, 2) and $dR/dθ$ in rows (3, 4).

The params.integrationparams.tolerance is hardcoded to 1e-10 in this version of the function.

source
LongwaveModePropagator.integratedreflectionMethod
integratedreflection(modeequation::PhysicalModeEquation;
+    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Integrate $dR/dz$ downward through the ionosphere described by modeequation from params.topheight, returning the ionosphere reflection coefficient R at the ground. susceptibilityfcn is a function returning the ionosphere susceptibility tensor as a function of altitude z in meters.

params.integrationparams are passed to DifferentialEquations.jl.

source
LongwaveModePropagator.modalequationMethod
modalequation(R, Rg)

Compute the determinental mode equation $det(Rg R - I)$ given reflection coefficients R and Rg.

A propagating waveguide mode requires that a wave, having reflected from the ionosphere and then the ground, must be identical with the original upgoing wave. This criteria is met at roots of the mode equation [Budden1962].

References

[Budden1962]: K. G. Budden and N. F. Mott, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962.

source
LongwaveModePropagator.solvedmodalequationMethod
solvedmodalequation(modeequation::PhysicalModeEquation; params=LMPParams())

Compute the derivative of the modal equation with respect to $θ$ returned as the tuple (dF, R, Rg) for the ionosphere and ground reflection coefficients.

source
LongwaveModePropagator.solvemodalequationMethod
solvemodalequation(θ, modeequation::PhysicalModeEquation;
+    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Set θ for modeequation and then solve the modal equation.

source
LongwaveModePropagator.solvemodalequationMethod
solvemodalequation(modeequation::PhysicalModeEquation;
+    params=LMPParams(), susceptibilityfcn=z->susceptibility(z, modeequation; params=params))

Compute the ionosphere and ground reflection coefficients and return the value of the determinental modal equation associated with modeequation. susceptibilityfcn is a function that returns the ionosphere susceptibility as a function of altitude z in meters.

See also: solvedmodalequation

source
LongwaveModePropagator.trianglemeshMethod
trianglemesh(zbl, ztr, Δr)

Generate initial mesh node coordinates for a right triangle domain from complex coordinate zbl in the bottom left and ztr in the top right with initial mesh step Δr.

zbl and ztr are located on the complex plane at the locations marked in the diagram below:

       im
        |
 -re ---|------ ztr
        |     /
        |    /
        |   /
        |  /
-       zbl
source
LongwaveModePropagator.wmatrixMethod
wmatrix(ea::EigenAngle, T)

Compute the four submatrix elements of W used in the equation $dR/dz$ from the ionosphere with T matrix returned as a tuple (W₁₁, W₂₁, W₁₂, W₂₂).

Following Budden's formalism for the reflection matrix of a plane wave obliquely incident on the ionosphere [Budden1955a], the wave below the ionosphere can be resolved into upgoing and downgoing waves of elliptical polarization, each of whose components are themselves resolved into a component with the electric field in the plane of propagation and a component perpendicular to the plane of propagation. The total field can be written in matrix form as $e = Lf$ where $L$ is a 4×4 matrix that simply selects and specifies the incident angle of the components and $f$ is a column matrix of the complex amplitudes of the component waves. By inversion, $f = L⁻¹e$ and its derivative with respect to height $z$ is $f′ = -iL⁻¹TLf = -½iWf$. Then $W = 2L⁻¹TL$ describes the change in amplitude of the upgoing and downgoing component waves.

$W$ is also known as $S$ in many texts.

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

source
LongwaveModePropagator.ExcitationFactorType
ExcitationFactor{T,T2}

Constants used in calculating excitation factors and height gains.

Fields

  • F₁::T: height gain constant. See [Pappert1976].
  • F₂::T
  • F₃::T
  • F₄::T
  • h₁0::T: first modified Hankel function of order 1/3 at the ground.
  • h₂0::T: second modified Hankel function of order 1/3 at the ground.
  • EyHy::T: polarization ratio $Ey/Hy$, derived from reflection coefficients (or $T$s).
  • Rg::T2: ground reflection coefficient matrix.

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

source
LongwaveModePropagator.EfieldMethod
Efield(modes, waveguide::HomogeneousWaveguide, tx::Emitter, rx::AbstractSampler;
-       params=LMPParams())

Compute the complex electric field by summing modes in waveguide for emitter tx at sampler rx.

References

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

source
LongwaveModePropagator.excitationfactorMethod
excitationfactor(ea, dFdθ, R, Rg, efconstants::ExcitationFactor; params=LMPParams())

Compute excitation factors for the $Hy$ field at the emitter returned as the tuple (λv, λb, λe) for vertical, broadside, and end-on dipoles. dFdθ is the derivative of the modal equation with respect to $θ$.

The excitation factor describes how efficiently the field component can be excited in the waveguide.

This function most closely follows the approach taken in [Pappert1983], which makes use of $T$ (different from TMatrix) rather than $τ$. From the total $Hy$ excitation factor (the sum product of the λs with the antenna orientation terms), the excitation factor for electric fields can be found as:

  • $λz = -S₀λ$
  • $λx = EyHy⋅λ$
  • $λy = -λ$
Note

This function assumes that reflection coefficients R and Rg are referenced to $d = z = 0$.

References

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

[Pappert1986]: R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.

source
LongwaveModePropagator.excitationfactorconstantsMethod
excitationfactorconstants(ea₀, R, Rg, frequency, ground; params=LMPParams())

Return an ExcitationFactor struct used in calculating height-gain functions and excitation factors where eigenangle ea₀ is referenced to the ground.

Note

This function assumes that reflection coefficients R and Rg are referenced to $d = z = 0$.

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

[Ferguson1980]: J. A. Ferguson and F. P. Snyder, “Approximate VLF/LF waveguide mode conversion model: Computer applications: FASTMC and BUMP,” Naval Ocean Systems Center, San Diego, CA, NOSC-TD-400, Nov. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA096240.

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

source
LongwaveModePropagator.heightgainsMethod
heightgains(z, ea₀, frequency, efconstants::ExcitationFactor; params=LMPParams())

Compute height gain functions at height z returned as the tuple (fz, fy, fx) where eigenangle ea₀ is referenced to the ground.

  • fz is the height gain for the vertical electric field component $Ez$.
  • fy is the height gain for the transverse electric field component $Ey$.
  • fx is the height gain for the horizontal electric field component $Ex$.

[Pappert1983]

Note

This function assumes that reflection coefficients are referenced to $d = z = 0$.

See also: excitationfactorconstants

References

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

[Pappert1986]: R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.

source
LongwaveModePropagator.modetermsMethod
modeterms(modeequation, tx::Emitter, rx::AbstractSampler; params=LMPParams())

Compute tx and rx height-gain and excitation factor products and ExcitationFactor constants returned as the tuple (txterm, rxterm).

The returned txterm is:

\[λ_v \cos(γ) f_z(zₜ) + λ_b \sin(γ)\sin(ϕ) f_y(zₜ) + λ_e \sin(γ)\cos(ϕ) f_z(zₜ)\]

and rxterm is the height-gain function $f(zᵣ)$ appropriate for rx.fieldcomponent:

fieldcomponent$f(zᵣ)$
$z$$-S₀⋅f_z$
$y$$EyHy⋅f_y$
$x$$-f_x$

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

source
LongwaveModePropagator.radiationresistanceMethod
radiationresistance(k, Cγ, zt)

Calculate radiation resistance correction for transmitting antenna elevated above the ground. Based on [Pappert1986] below, is derived from the time-averaged Poynting vector, which uses total E and H fields calculated assuming a point dipole over perfectly reflecting ground.

If a point dipole at height z is radiating known power Pz, the power that should be input to LMP is $P/Pz = 2/f(kz,γ)$. Also note that E ∝ √P, hence the square root below.

References

[Pappert1986]: R. A. Pappert, “Radiation resistance of thin antennas of arbitrary elevation and configuration over perfectly conducting ground.,” Naval Ocean Systems Center, San Diego, CA, Technical Report 1112, Jun. 1986. Accessed: Mar. 10, 2024. [Online]. Available: https://apps.dtic.mil/sti/citations/ADA170945

source
LongwaveModePropagator.TMatrixType
TMatrix <: SMatrix{4, 4, T}

A custom SMatrix subtype that represents the T matrix from [Clemmow1954] that is semi-sparse. The form of the matrix is:

┌                ┐
+       zbl
source
LongwaveModePropagator.wmatrixMethod
wmatrix(ea::EigenAngle, T)

Compute the four submatrix elements of W used in the equation $dR/dz$ from the ionosphere with T matrix returned as a tuple (W₁₁, W₂₁, W₁₂, W₂₂).

Following Budden's formalism for the reflection matrix of a plane wave obliquely incident on the ionosphere [Budden1955a], the wave below the ionosphere can be resolved into upgoing and downgoing waves of elliptical polarization, each of whose components are themselves resolved into a component with the electric field in the plane of propagation and a component perpendicular to the plane of propagation. The total field can be written in matrix form as $e = Lf$ where $L$ is a 4×4 matrix that simply selects and specifies the incident angle of the components and $f$ is a column matrix of the complex amplitudes of the component waves. By inversion, $f = L⁻¹e$ and its derivative with respect to height $z$ is $f′ = -iL⁻¹TLf = -½iWf$. Then $W = 2L⁻¹TL$ describes the change in amplitude of the upgoing and downgoing component waves.

$W$ is also known as $S$ in many texts.

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

source
LongwaveModePropagator.ExcitationFactorType
ExcitationFactor{T,T2}

Constants used in calculating excitation factors and height gains.

Fields

  • F₁::T: height gain constant. See [Pappert1976].
  • F₂::T
  • F₃::T
  • F₄::T
  • h₁0::T: first modified Hankel function of order 1/3 at the ground.
  • h₂0::T: second modified Hankel function of order 1/3 at the ground.
  • EyHy::T: polarization ratio $Ey/Hy$, derived from reflection coefficients (or $T$s).
  • Rg::T2: ground reflection coefficient matrix.

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

source
LongwaveModePropagator.EfieldMethod
Efield(modes, waveguide::HomogeneousWaveguide, tx::Emitter, rx::AbstractSampler;
+       params=LMPParams())

Compute the complex electric field by summing modes in waveguide for emitter tx at sampler rx.

References

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

source
LongwaveModePropagator.excitationfactorMethod
excitationfactor(ea, dFdθ, R, Rg, efconstants::ExcitationFactor; params=LMPParams())

Compute excitation factors for the $Hy$ field at the emitter returned as the tuple (λv, λb, λe) for vertical, broadside, and end-on dipoles. dFdθ is the derivative of the modal equation with respect to $θ$.

The excitation factor describes how efficiently the field component can be excited in the waveguide.

This function most closely follows the approach taken in [Pappert1983], which makes use of $T$ (different from TMatrix) rather than $τ$. From the total $Hy$ excitation factor (the sum product of the λs with the antenna orientation terms), the excitation factor for electric fields can be found as:

  • $λz = -S₀λ$
  • $λx = EyHy⋅λ$
  • $λy = -λ$
Note

This function assumes that reflection coefficients R and Rg are referenced to $d = z = 0$.

References

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

[Pappert1986]: R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.

source
LongwaveModePropagator.excitationfactorconstantsMethod
excitationfactorconstants(ea₀, R, Rg, frequency, ground; params=LMPParams())

Return an ExcitationFactor struct used in calculating height-gain functions and excitation factors where eigenangle ea₀ is referenced to the ground.

Note

This function assumes that reflection coefficients R and Rg are referenced to $d = z = 0$.

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

[Ferguson1980]: J. A. Ferguson and F. P. Snyder, “Approximate VLF/LF waveguide mode conversion model: Computer applications: FASTMC and BUMP,” Naval Ocean Systems Center, San Diego, CA, NOSC-TD-400, Nov. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA096240.

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

source
LongwaveModePropagator.heightgainsMethod
heightgains(z, ea₀, frequency, efconstants::ExcitationFactor; params=LMPParams())

Compute height gain functions at height z returned as the tuple (fz, fy, fx) where eigenangle ea₀ is referenced to the ground.

  • fz is the height gain for the vertical electric field component $Ez$.
  • fy is the height gain for the transverse electric field component $Ey$.
  • fx is the height gain for the horizontal electric field component $Ex$.

[Pappert1983]

Note

This function assumes that reflection coefficients are referenced to $d = z = 0$.

See also: excitationfactorconstants

References

[Pappert1983]: R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. [Online]. Available: http://www.dtic.mil/docs/citations/ADA133876.

[Pappert1986]: R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.

source
LongwaveModePropagator.modetermsMethod
modeterms(modeequation, tx::Emitter, rx::AbstractSampler; params=LMPParams())

Compute tx and rx height-gain and excitation factor products and ExcitationFactor constants returned as the tuple (txterm, rxterm).

The returned txterm is:

\[λ_v \cos(γ) f_z(zₜ) + λ_b \sin(γ)\sin(ϕ) f_y(zₜ) + λ_e \sin(γ)\cos(ϕ) f_z(zₜ)\]

and rxterm is the height-gain function $f(zᵣ)$ appropriate for rx.fieldcomponent:

fieldcomponent$f(zᵣ)$
$z$$-S₀⋅f_z$
$y$$EyHy⋅f_y$
$x$$-f_x$

References

[Pappert1976]: R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. [Online]. Available: http://archive.org/details/DTIC_ADA033412.

[Morfitt1980]: D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. [Online]. Available: http://www.dtic.mil/docs/citations/ADA082695.

source
LongwaveModePropagator.radiationresistanceMethod
radiationresistance(k, Cγ, zt)

Calculate radiation resistance correction for transmitting antenna elevated above the ground. Based on [Pappert1986] below, is derived from the time-averaged Poynting vector, which uses total E and H fields calculated assuming a point dipole over perfectly reflecting ground.

If a point dipole at height z is radiating known power Pz, the power that should be input to LMP is $P/Pz = 2/f(kz,γ)$. Also note that E ∝ √P, hence the square root below.

References

[Pappert1986]: R. A. Pappert, “Radiation resistance of thin antennas of arbitrary elevation and configuration over perfectly conducting ground.,” Naval Ocean Systems Center, San Diego, CA, Technical Report 1112, Jun. 1986. Accessed: Mar. 10, 2024. [Online]. Available: https://apps.dtic.mil/sti/citations/ADA170945

source
LongwaveModePropagator.TMatrixType
TMatrix <: SMatrix{4, 4, T}

A custom SMatrix subtype that represents the T matrix from [Clemmow1954] that is semi-sparse. The form of the matrix is:

┌                ┐
 | T₁₁ T₁₂ 0  T₁₄ |
 | 0   0   1  0   |
 | T₃₁ T₃₂ 0  T₃₄ |
 | T₄₁ T₄₂ 0  T₄₄ |
-└                ┘

TMatrix implements efficient matrix-vector multiplication and other math based on its special form.

See also: tmatrix

References

[Clemmow1954]: P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954.

source
LongwaveModePropagator.tmatrixMethod
tmatrix(ea::EigenAngle, M)

Compute the matrix T as a TMatrix for the differential equations of a wave propagating at angle ea in an ionosphere with susceptibility M.

Clemmow and Heading derived the T matrix from Maxwell's equations for an electromagnetic wave in the anisotropic, collisional cold plasma of the ionosphere in a coordinate frame where $z$ is upward, propagation is directed obliquely in the $x$-$z$ plane and invariance is assumed in $y$. For the four characteristic wave components $e = (Ex, -Ey, Z₀Hx, Z₀Hy)ᵀ$, the differential equations are $de/dz = -ikTe$.

See also: susceptibility, dtmatrix

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

[Clemmow1954]: P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954.

source
LongwaveModePropagator.ScaleRecordType
ScaleRecord

Struct for saving wavefield scaling information used in a callback during Pitteway integration of wavefields [Pitteway1965].

Fields

  • z::Float64: current height in meters.
  • e::SMatrix{4,2,Complex{Float64},8}: wavefield matrix.
  • ortho_scalar::Complex{Float64}: scalar for Gram-Schmidt orthogonalization.
  • e1_scalar::Float64: scalar for wavefield vector 1.
  • e2_scalar::Float64: scalar for wavefield vector 2.
source
LongwaveModePropagator.WavefieldIntegrationParamsType
WavefieldIntegrationParams{S,T,T2,H}

Parameters passed to Pitteway integration of wavefields [Pitteway1965].

Fields

  • z::Float64: height in meters.
  • bottomz::Float64: bottom height of integration in meters.
  • ortho_scalar::Complex{Float64}: scalar for Gram-Schmidt orthogonalization.
  • e1_scalar::Float64: scalar for wavefield vector 1.
  • e2_scalar::Float64: scalar for wavefield vector 2.
  • ea::EigenAngle: wavefield eigenangle.
  • frequency::Frequency: electromagentic wave frequency in Hz.
  • bfield::BField: Earth's magnetic field in Tesla.
  • species::S: species in the ionosphere.
  • params::LMPParams{T,T2,H}: module-wide parameters.
source
LongwaveModePropagator.WavefieldIntegrationParamsMethod
WavefieldIntegrationParams(topheight, ea, frequency, bfield, species, params)

Initialize a WavefieldIntegrationParams for downward Pitteway scaled integration [Pitteway1965].

Automatically set values are:

  • bottomz = BOTTOMHEIGHT
  • ortho_scalar = zero(ComplexF64)
  • e1_scalar = one(Float64)
  • e2_scalar = one(Float64)
source
LongwaveModePropagator.WavefieldsType
Wavefields{H<:AbstractRange}

Struct containing wavefield components for each mode of eas at heights.

The six electromagnetic field components are stored in the v field of the struct and accessed as a Matrix of SVector{6,ComplexF64} corresponding to [height, mode].

source
LongwaveModePropagator.WavefieldsMethod
Wavefields(heights, eas::Vector{EigenAngle})

A constructor for initializing Wavefields with an appropriately sized undef Matrix given eigenangles eas and heights.

source
Base.:==Method
==(A::Wavefields, B::Wavefields)

Check for equality == between A.v and B.v, heights, and eas.

source
LongwaveModePropagator.boundaryscalarsFunction
boundaryscalars(R, Rg, e1, e2, isotropic::Bool=false)
-boundaryscalars(R, Rg, e, isotropic::Bool=false)

Compute coefficients (b1, b2) required to sum the two wavefields vectors e1 and e2 or both columns of e for the total wavefield at the ground as $e = b1*e1 + b2*e2$.

The b1 and b2 that satisfy the waveguide boundary conditions are only valid for true eigenangles of the waveguide.

Note

This function assumes that the reflection coefficients R and Rg and the wavefield vectors e1, e2 are at the ground.

These boundary conditions

source
LongwaveModePropagator.calculate_wavefields!Method
calculate_wavefields!(wavefields, adjoint_wavefields, frequency, waveguide,
-    adjoint_waveguide; params=LMPParams())

Compute fields of wavefields in-place scaled to satisfy the waveguide boundary conditions.

This function implements the method of integrating wavefields suggested by [Pitteway1965].

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.dedzMethod
dedz(e, p, z)

Compute derivative of field components vector e at height z.

The parameter p should be a WavefieldIntegrationParams.

source
LongwaveModePropagator.fieldstrengths!Method
fieldstrengths!(EH, zs, me::ModeEquation; params=LMPParams())
+└                ┘

TMatrix implements efficient matrix-vector multiplication and other math based on its special form.

See also: tmatrix

References

[Clemmow1954]: P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954.

source
LongwaveModePropagator.tmatrixMethod
tmatrix(ea::EigenAngle, M)

Compute the matrix T as a TMatrix for the differential equations of a wave propagating at angle ea in an ionosphere with susceptibility M.

Clemmow and Heading derived the T matrix from Maxwell's equations for an electromagnetic wave in the anisotropic, collisional cold plasma of the ionosphere in a coordinate frame where $z$ is upward, propagation is directed obliquely in the $x$-$z$ plane and invariance is assumed in $y$. For the four characteristic wave components $e = (Ex, -Ey, Z₀Hx, Z₀Hy)ᵀ$, the differential equations are $de/dz = -ikTe$.

See also: susceptibility, dtmatrix

References

[Budden1955a]: K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955.

[Clemmow1954]: P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954.

source
LongwaveModePropagator.ScaleRecordType
ScaleRecord

Struct for saving wavefield scaling information used in a callback during Pitteway integration of wavefields [Pitteway1965].

Fields

  • z::Float64: current height in meters.
  • e::SMatrix{4,2,Complex{Float64},8}: wavefield matrix.
  • ortho_scalar::Complex{Float64}: scalar for Gram-Schmidt orthogonalization.
  • e1_scalar::Float64: scalar for wavefield vector 1.
  • e2_scalar::Float64: scalar for wavefield vector 2.
source
LongwaveModePropagator.WavefieldIntegrationParamsType
WavefieldIntegrationParams{S,T,T2,H}

Parameters passed to Pitteway integration of wavefields [Pitteway1965].

Fields

  • z::Float64: height in meters.
  • bottomz::Float64: bottom height of integration in meters.
  • ortho_scalar::Complex{Float64}: scalar for Gram-Schmidt orthogonalization.
  • e1_scalar::Float64: scalar for wavefield vector 1.
  • e2_scalar::Float64: scalar for wavefield vector 2.
  • ea::EigenAngle: wavefield eigenangle.
  • frequency::Frequency: electromagentic wave frequency in Hz.
  • bfield::BField: Earth's magnetic field in Tesla.
  • species::S: species in the ionosphere.
  • params::LMPParams{T,T2,H}: module-wide parameters.
source
LongwaveModePropagator.WavefieldIntegrationParamsMethod
WavefieldIntegrationParams(topheight, ea, frequency, bfield, species, params)

Initialize a WavefieldIntegrationParams for downward Pitteway scaled integration [Pitteway1965].

Automatically set values are:

  • bottomz = BOTTOMHEIGHT
  • ortho_scalar = zero(ComplexF64)
  • e1_scalar = one(Float64)
  • e2_scalar = one(Float64)
source
LongwaveModePropagator.WavefieldsType
Wavefields{H<:AbstractRange}

Struct containing wavefield components for each mode of eas at heights.

The six electromagnetic field components are stored in the v field of the struct and accessed as a Matrix of SVector{6,ComplexF64} corresponding to [height, mode].

source
LongwaveModePropagator.WavefieldsMethod
Wavefields(heights, eas::Vector{EigenAngle})

A constructor for initializing Wavefields with an appropriately sized undef Matrix given eigenangles eas and heights.

source
Base.:==Method
==(A::Wavefields, B::Wavefields)

Check for equality == between A.v and B.v, heights, and eas.

source
LongwaveModePropagator.boundaryscalarsFunction
boundaryscalars(R, Rg, e1, e2, isotropic::Bool=false)
+boundaryscalars(R, Rg, e, isotropic::Bool=false)

Compute coefficients (b1, b2) required to sum the two wavefields vectors e1 and e2 or both columns of e for the total wavefield at the ground as $e = b1*e1 + b2*e2$.

The b1 and b2 that satisfy the waveguide boundary conditions are only valid for true eigenangles of the waveguide.

Note

This function assumes that the reflection coefficients R and Rg and the wavefield vectors e1, e2 are at the ground.

These boundary conditions

source
LongwaveModePropagator.calculate_wavefields!Method
calculate_wavefields!(wavefields, adjoint_wavefields, frequency, waveguide,
+    adjoint_waveguide; params=LMPParams())

Compute fields of wavefields in-place scaled to satisfy the waveguide boundary conditions.

This function implements the method of integrating wavefields suggested by [Pitteway1965].

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.dedzMethod
dedz(e, p, z)

Compute derivative of field components vector e at height z.

The parameter p should be a WavefieldIntegrationParams.

source
LongwaveModePropagator.fieldstrengths!Method
fieldstrengths!(EH, zs, me::ModeEquation; params=LMPParams())
 fieldstrengths!(EH, zs, ea::EigenAngle, frequency::Frequency, bfield::BField,
-    species, ground::Ground; params=LMPParams())

Compute $(Ex, Ey, Ez, Hx, Hy, Hz)ᵀ$ wavefields vectors as elements of EH by fullwave integration at each height in zs.

The wavefields are scaled to satisfy the waveguide boundary conditions, which is only valid at solutions of the mode equation.

source
LongwaveModePropagator.integratewavefieldsMethod
integratewavefields(zs, ea::EigenAngle, frequency::Frequency, bfield::BField,
-    species; params=LMPParams(), unscale=true)

Compute wavefields vectors e at zs by downward integration over heights zs.

params.wavefieldintegrationparams is used by this function rather than params.integrationparams.

unscale corrects scaling of wavefields with unscalewavefields.

source
LongwaveModePropagator.scalewavefieldsFunction
scalewavefields(e1, e2)
-scalewavefields(e::SMatrix{4,2})

Orthonormalize the vectors e1 and e2 or the columns of e, and also return the scaling terms a, e1_scale_val, and e2_scale_val applied to the original vectors.

This first applies Gram-Schmidt orthogonalization and then scales the vectors so they each have length 1, i.e. norm(e1) == norm(e2) == 1. This is the technique suggested by [Pitteway1965] to counter numerical swamping during integration of wavefields.

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.scalingconditionMethod
scalingcondition(e, z, int)

Return true if wavefields should be scaled, otherwise false for wavefields e at height z and integrator int.

Wavefields should be scaled if any component of real(e) or imag(e) are >= 1. In addition, force scaling at z <= bottomz to ensure initial upgoing wave is unit amplitude.

source
LongwaveModePropagator.unscalewavefieldsMethod
unscalewavefields(saved_values::SavedValues)

Return the unscaled integrated wavefields originally scaled by scalewavefields.

The bottom level does not get unscaled. We reference the higher levels to the bottom. The level above the bottom level is additionally scaled by the amount that was applied to originally get from this level down to the bottom level. The next level up (2 above the bottom level) is scaled by the amount applied to the next level and then the bottom level, i.e. we keep track of a cumulative correction on the way back up.

Assumes fields have been scaled by scalewavefields during integration.

See also: unscalewavefields!

source
+ species, ground::Ground; params=LMPParams())

Compute $(Ex, Ey, Ez, Hx, Hy, Hz)ᵀ$ wavefields vectors as elements of EH by fullwave integration at each height in zs.

The wavefields are scaled to satisfy the waveguide boundary conditions, which is only valid at solutions of the mode equation.

source
LongwaveModePropagator.fieldstrengthsMethod
fieldstrengths(zs, me::ModeEquation; params=LMPParams())

Preallocate vector of wavefields EH, then call fieldstrengths! and return EH.

Each element of EH is an SVector of $ex, ey, ez, hx, hy, hz$.

source
LongwaveModePropagator.integratewavefieldsMethod
integratewavefields(zs, ea::EigenAngle, frequency::Frequency, bfield::BField,
+    species; params=LMPParams(), unscale=true)

Compute wavefields vectors e at zs by downward integration over heights zs.

params.wavefieldintegrationparams is used by this function rather than params.integrationparams.

unscale corrects scaling of wavefields with unscalewavefields.

source
LongwaveModePropagator.savevaluesMethod
savevalues(u, t, integrator)

Return a ScaleRecord from u, t, and integrator.

source
LongwaveModePropagator.scale!Method
scale!(integrator)

Apply wavefield scaling with scalewavefields to the integrator.

source
LongwaveModePropagator.scalewavefieldsFunction
scalewavefields(e1, e2)
+scalewavefields(e::SMatrix{4,2})

Orthonormalize the vectors e1 and e2 or the columns of e, and also return the scaling terms a, e1_scale_val, and e2_scale_val applied to the original vectors.

This first applies Gram-Schmidt orthogonalization and then scales the vectors so they each have length 1, i.e. norm(e1) == norm(e2) == 1. This is the technique suggested by [Pitteway1965] to counter numerical swamping during integration of wavefields.

References

[Pitteway1965]: M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.

source
LongwaveModePropagator.scalingconditionMethod
scalingcondition(e, z, int)

Return true if wavefields should be scaled, otherwise false for wavefields e at height z and integrator int.

Wavefields should be scaled if any component of real(e) or imag(e) are >= 1. In addition, force scaling at z <= bottomz to ensure initial upgoing wave is unit amplitude.

source
LongwaveModePropagator.unscalewavefields!Method
unscalewavefields!(e, saved_values::SavedValues)

Unscale the integrated wavefields, a vector of fields at each integration step e, in place.

See also: unscalewavefields

source
LongwaveModePropagator.unscalewavefieldsMethod
unscalewavefields(saved_values::SavedValues)

Return the unscaled integrated wavefields originally scaled by scalewavefields.

The bottom level does not get unscaled. We reference the higher levels to the bottom. The level above the bottom level is additionally scaled by the amount that was applied to originally get from this level down to the bottom level. The next level up (2 above the bottom level) is scaled by the amount applied to the next level and then the bottom level, i.e. we keep track of a cumulative correction on the way back up.

Assumes fields have been scaled by scalewavefields during integration.

See also: unscalewavefields!

source
LongwaveModePropagator.WaveguideType
Waveguide

A waveguide propagation path with a background BField, ionosphere Species, and Ground.

source
LongwaveModePropagator.adjointMethod
adjoint(w::HomogeneousWaveguide)

Return w with an adjoint BField having an x component of opposite sign.

source
diff --git a/dev/lib/public/index.html b/dev/lib/public/index.html index 3681174..4c882ed 100644 --- a/dev/lib/public/index.html +++ b/dev/lib/public/index.html @@ -1,13 +1,13 @@ Public Interface · LongwaveModePropagator

Public Interface

Documentation of LongwaveModePropagator.jl's exported structs and functions.

Contents

Basic Functions

LongwaveModePropagator.propagateFunction
propagate(waveguide::HomogeneousWaveguide, tx::Emitter, rx::AbstractSampler;
           modes::Union{Nothing,Vector{EigenAngle}}=nothing, mesh=nothing,
-          params=LMPParams())

Compute electric field E, amplitude, and phase at rx.

Precomputed waveguide modes can optionally be provided as a Vector{EigenAngle}. By default modes are found with findmodes.

If mesh = nothing, use defaultmesh to generate mesh for the mode finding algorithm. This is ignored if modes is not nothing.

source
propagate(waveguide::SegmentedWaveguide, tx::Emitter, rx::AbstractSampler;
-          mesh=nothing, params=LMPParams())

Compute electric field E, amplitude, and phase at rx through a SegmentedWaveguide.

If mesh = nothing, use defaultmesh to generate mesh for the mode finding algorithm.

source
propagate(file::AbstractString, outfile=missing; incrementalwrite=false, append=false,
-          mesh=nothing)

Run the model scenario described by file and save the results as outfile.

If outfile = missing, the output file name will be $(file)_output.json.

source
LongwaveModePropagator.LMPParamsType
LMPParams{T,T2,H <: AbstractRange{Float64}}

Parameters for the LongwaveModePropagator module with defaults:

  • topheight::Float64 = 110e3: starting height for integration of the ionosphere reflection coefficient.
  • earthradius::Float64 = 6369e3: Earth radius in meters.
  • earthcurvature::Bool = true: toggle inclusion of Earth curvature in calculations. This is not supported by all functions.
  • curvatureheight::Float64 = 50e3: reference height for Earth curvature in meters. At this height, the index of refraction is 1, and is therefore the reference height for eigenangles.
  • approxsusceptibility::Bool = false: use a cubic interpolating spline representation of susceptibility during the integration of dRdz.
  • susceptibilitysplinestep::Float64 = 10.0: altitude step in meters used to build the spline representation of susceptibility if approxsusceptibility == true.
  • grpfparams::GRPFParams = GRPFParams(100000, 1e-5, true): parameters for the GRPF complex root-finding algorithm.
  • integrationparams::IntegrationParams{T} = IntegrationParams(solver=Vern7(), tolerance=1e-5): parameters passed to DifferentialEquations.jl for integration of the ionosphere reflection coefficient.
  • wavefieldheights::H = range(topheight, 0, length=2049): heights in meters at which wavefields will be integrated.
  • wavefieldintegrationparams::IntegrationParams{T2} = IntegrationParams(solver=Tsit5(), tolerance=1e-6): parameters passed to DifferentialEquations.jl for integration of the wavefields used in mode conversion. The solver cannot be lazy.
  • radiationresistancecorrection::Bool = false: Perform a radiation resistance correction to the calculated field amplitude for transmitter antennas with altitude > 0.

The struct is created using Parameters.jl @with_kw and supports that package's instantiation capabilities, e.g.:

p = LMPParams()
+          params=LMPParams())

Compute electric field E, amplitude, and phase at rx.

Precomputed waveguide modes can optionally be provided as a Vector{EigenAngle}. By default modes are found with findmodes.

If mesh = nothing, use defaultmesh to generate mesh for the mode finding algorithm. This is ignored if modes is not nothing.

source
propagate(waveguide::SegmentedWaveguide, tx::Emitter, rx::AbstractSampler;
+          mesh=nothing, params=LMPParams())

Compute electric field E, amplitude, and phase at rx through a SegmentedWaveguide.

If mesh = nothing, use defaultmesh to generate mesh for the mode finding algorithm.

source
propagate(file::AbstractString, outfile=missing; incrementalwrite=false, append=false,
+          mesh=nothing)

Run the model scenario described by file and save the results as outfile.

If outfile = missing, the output file name will be $(file)_output.json.

source
LongwaveModePropagator.LMPParamsType
LMPParams{T,T2,H <: AbstractRange{Float64}}

Parameters for the LongwaveModePropagator module with defaults:

  • topheight::Float64 = 110e3: starting height for integration of the ionosphere reflection coefficient.
  • earthradius::Float64 = 6369e3: Earth radius in meters.
  • earthcurvature::Bool = true: toggle inclusion of Earth curvature in calculations. This is not supported by all functions.
  • curvatureheight::Float64 = 50e3: reference height for Earth curvature in meters. At this height, the index of refraction is 1, and is therefore the reference height for eigenangles.
  • approxsusceptibility::Bool = false: use a cubic interpolating spline representation of susceptibility during the integration of dRdz.
  • susceptibilitysplinestep::Float64 = 10.0: altitude step in meters used to build the spline representation of susceptibility if approxsusceptibility == true.
  • grpfparams::GRPFParams = GRPFParams(100000, 1e-5, true): parameters for the GRPF complex root-finding algorithm.
  • integrationparams::IntegrationParams{T} = IntegrationParams(solver=Vern7(), tolerance=1e-5): parameters passed to DifferentialEquations.jl for integration of the ionosphere reflection coefficient.
  • wavefieldheights::H = range(topheight, 0, length=2049): heights in meters at which wavefields will be integrated.
  • wavefieldintegrationparams::IntegrationParams{T2} = IntegrationParams(solver=Tsit5(), tolerance=1e-6): parameters passed to DifferentialEquations.jl for integration of the wavefields used in mode conversion. The solver cannot be lazy.
  • radiationresistancecorrection::Bool = false: Perform a radiation resistance correction to the calculated field amplitude for transmitter antennas with altitude > 0.

The struct is created using Parameters.jl @with_kw and supports that package's instantiation capabilities, e.g.:

p = LMPParams()
 p2 = LMPParams(earth_radius=6370e3)
-p3 = LMPParams(p2; grpf_params=GRPFParams(100000, 1e-6, true))

See also: IntegrationParams

source

Mode Finder

LongwaveModePropagator.findmodesFunction
findmodes(modeequation::ModeEquation, mesh=nothing; params=LMPParams())

Find EigenAngles associated with modeequation.waveguide within the domain of mesh.

mesh should be an array of complex numbers that make up the original grid over which the GRPF algorithm searches for roots of modeequation. If mesh === nothing, it is computed with defaultmesh.

There is a check for redundant modes that requires modes to be separated by at least 1 orders of magnitude greater than grpfparams.tolerance in real and/or imaginary component. For example, if grpfparams.tolerance = 1e-5, then either the real or imaginary component of each mode must be separated by at least 1e-4 from every other mode.

source

Mode Finder

LongwaveModePropagator.findmodesFunction
findmodes(modeequation::ModeEquation, mesh=nothing; params=LMPParams())

Find EigenAngles associated with modeequation.waveguide within the domain of mesh.

mesh should be an array of complex numbers that make up the original grid over which the GRPF algorithm searches for roots of modeequation. If mesh === nothing, it is computed with defaultmesh.

There is a check for redundant modes that requires modes to be separated by at least 1 orders of magnitude greater than grpfparams.tolerance in real and/or imaginary component. For example, if grpfparams.tolerance = 1e-5, then either the real or imaginary component of each mode must be separated by at least 1e-4 from every other mode.

source
LongwaveModePropagator.PhysicalModeEquationType
PhysicalModeEquation{W<:HomogeneousWaveguide} <: ModeEquation

Parameters for solving the physical mode equation $\det(Rg*R - I)$.

Fields:

- ea::EigenAngle
 - frequency::Frequency
-- waveguide::W
source
LongwaveModePropagator.IntegrationParamsType
IntegrationParams{T}

Parameters passed to OrdinaryDiffEq.jl during the integration of the ionosphere reflection coefficient matrix in modefinder.jl.

Fields

  • tolerance::Float64 = 1e-5: integration atol and rtol.
  • solver::T = Vern7(): a DifferentialEquations.jl solver.
  • dt::Float64 = 1.0: height step in meters (many methods use a variable step size).
  • force_dtmin::Bool = false: if true, continue integration when solver reaches minimum step size.
  • maxiters::Int = 100_000: maximum number of iterations before stopping.
source

EigenAngle

LongwaveModePropagator.EigenAngleType
EigenAngle

Plane-wave propagation direction in angle θ from the vertical in radians.

Common trigonometric function values of this angle are calculated to increase performance.

Fields

  • θ::ComplexF64
  • cosθ::ComplexF64
  • sinθ::ComplexF64
  • secθ::ComplexF64
  • cos²θ::ComplexF64
  • sin²θ::ComplexF64

Real θ will be automatically converted to Complex.

Note

Technically this is an angle of incidence from the vertical, and not necessarily an eigenangle unless it is found to be associated with a propagated mode in the waveguide.

source
LongwaveModePropagator.attenuationFunction
attenuation(ea, frequency::Frequency; params=LMPParams())

Compute attenuation of eigenangle ea at the ground.

ea will be converted to an EigenAngle if needed.

This function internally references ea to the ground.

source
LongwaveModePropagator.phasevelocityFunction
phasevelocity(ea)

Compute the relative phase velocity $v/c$ associated with the eigenangle θ.

ea will be converted to an EigenAngle if needed.

This function internally references ea to the ground.

source
LongwaveModePropagator.referencetogroundFunction
referencetoground(ea::EigenAngle; params=LMPParams())

Reference ea from params.curvatureheight to ground ($z = 0$).

source
referencetoground(sinθ; params=LMPParams())

Reference $sin(θ)$ from params.curvatureheight to the ground and return $sin(θ₀)$ at the ground.

source

Geophysics

LongwaveModePropagator.BFieldType
BField

Background magnetic field vector of strength B in Tesla with direction cosines dcl, dcm, and dcn corresponding to $x$, $y$, and $z$ directions parallel, perpendicular, and up to the waveguide.

source
LongwaveModePropagator.SpeciesType
Species

Ionosphere constituent Species.

Fields

  • charge::Float64: signed species charged in Coulombs.
  • mass::Float64: species mass in kilograms.
  • numberdensity: a callable that returns number density in number per cubic meter as a function of height in meters.
  • collisionfrequency: a callable that returns the collision frequency in collisions per second as a function of height in meters.
Note

numberdensity and collisionfrequency will be converted to FunctionerWrapper types that tell the compiler that these functions will always return values of type Float64. A limited test is run to check if this is true, but otherwise it is up to the user to ensure these functions return only values of type Float64.

source
LongwaveModePropagator.waitprofileFunction
waitprofile(z, h′, β; cutoff_low=0, threshold=1e12)

Compute the electron number density in electrons per cubic meter at altitude z in meters using Wait's exponential profile [[Wait1964]; [Thomson1993]] with parameters h′ in kilometers and β in inverse kilometers.

The profile is:

\[Nₑ = 1.43 × 10¹³ \exp(-0.15 h') \exp[(β - 0.15)(z/1000 - h')]\]

Optional arguments:

  • cutoff_low=0: when z is below cutoff_low, return zero.
  • threshold=1e12: when density is greater than threshold, return threshold.

See also: electroncollisionfrequency, ioncollisionfrequency

References

[Wait1964]: J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964.

[Thomson1993]: N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.

source
LongwaveModePropagator.electroncollisionfrequencyFunction
electroncollisionfrequency(z)

Compute the electron-neutral collision frequency in collisions per second at height z in meters based on Wait's conductivity profile [[Wait1964]; [Thomson1993]].

The profile is:

\[νₑ(z) = 1.816 × 10¹¹ \exp(-0.15⋅z/1000)\]

See also: waitprofile, ioncollisionfrequency

References

[Wait1964]: J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964.

[Thomson1993]: N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.

source
LongwaveModePropagator.ioncollisionfrequencyFunction
ioncollisionfrequency(z)

Compute the ion-neutral collision frequency in collisions per second at height z in meters from [Morfitt1976].

The profile is:

\[νᵢ(z) = 4.54 × 10⁹ \exp(-0.15⋅z/1000)\]

See also: waitprofile, electroncollisionfrequency

References

[Morfitt1976]: D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976.

source

Samplers

LongwaveModePropagator.SamplerType
Sampler{T} <: AbstractSampler{T}

Sampler types sample (measure) the electromagnetic field in the waveguide.

Fields

  • distance::T: ground distance from the transmitter in meters.
  • fieldcomponent::Fields.Field: field component measured by the Sampler.
  • altitude::Float64: height above the ground in meters.
source
LongwaveModePropagator.GroundSamplerType
GroundSampler{T} <: AbstractSampler{T}

GroundSamplers are Sampler types with an altitude of zero.

Fields

  • distance::T: ground distance from the transmitter in meters.
  • fieldcomponent::Fields.Field: field component measured by the GroundSampler.
source
LongwaveModePropagator.FieldsModule
Fields

This baremodule allows scoped enum-like access to electric field components Ex, Ey, and Ez.

Examples

julia> Fields.Ex
+- waveguide::W
source
LongwaveModePropagator.IntegrationParamsType
IntegrationParams{T}

Parameters passed to OrdinaryDiffEq.jl during the integration of the ionosphere reflection coefficient matrix in modefinder.jl.

Fields

  • tolerance::Float64 = 1e-5: integration atol and rtol.
  • solver::T = Vern7(): a DifferentialEquations.jl solver.
  • dt::Float64 = 1.0: height step in meters (many methods use a variable step size).
  • force_dtmin::Bool = false: if true, continue integration when solver reaches minimum step size.
  • maxiters::Int = 100_000: maximum number of iterations before stopping.
source

EigenAngle

LongwaveModePropagator.EigenAngleType
EigenAngle

Plane-wave propagation direction in angle θ from the vertical in radians.

Common trigonometric function values of this angle are calculated to increase performance.

Fields

  • θ::ComplexF64
  • cosθ::ComplexF64
  • sinθ::ComplexF64
  • secθ::ComplexF64
  • cos²θ::ComplexF64
  • sin²θ::ComplexF64

Real θ will be automatically converted to Complex.

Note

Technically this is an angle of incidence from the vertical, and not necessarily an eigenangle unless it is found to be associated with a propagated mode in the waveguide.

source
LongwaveModePropagator.attenuationFunction
attenuation(ea, frequency::Frequency; params=LMPParams())

Compute attenuation of eigenangle ea at the ground.

ea will be converted to an EigenAngle if needed.

This function internally references ea to the ground.

source
LongwaveModePropagator.phasevelocityFunction
phasevelocity(ea)

Compute the relative phase velocity $v/c$ associated with the eigenangle θ.

ea will be converted to an EigenAngle if needed.

This function internally references ea to the ground.

source
LongwaveModePropagator.referencetogroundFunction
referencetoground(ea::EigenAngle; params=LMPParams())

Reference ea from params.curvatureheight to ground ($z = 0$).

source
referencetoground(sinθ; params=LMPParams())

Reference $sin(θ)$ from params.curvatureheight to the ground and return $sin(θ₀)$ at the ground.

source

Geophysics

LongwaveModePropagator.BFieldType
BField

Background magnetic field vector of strength B in Tesla with direction cosines dcl, dcm, and dcn corresponding to $x$, $y$, and $z$ directions parallel, perpendicular, and up to the waveguide.

source
LongwaveModePropagator.SpeciesType
Species

Ionosphere constituent Species.

Fields

  • charge::Float64: signed species charged in Coulombs.
  • mass::Float64: species mass in kilograms.
  • numberdensity: a callable that returns number density in number per cubic meter as a function of height in meters.
  • collisionfrequency: a callable that returns the collision frequency in collisions per second as a function of height in meters.
Note

numberdensity and collisionfrequency will be converted to FunctionerWrapper types that tell the compiler that these functions will always return values of type Float64. A limited test is run to check if this is true, but otherwise it is up to the user to ensure these functions return only values of type Float64.

source
LongwaveModePropagator.waitprofileFunction
waitprofile(z, h′, β; cutoff_low=0, threshold=1e12)

Compute the electron number density in electrons per cubic meter at altitude z in meters using Wait's exponential profile [[Wait1964]; [Thomson1993]] with parameters h′ in kilometers and β in inverse kilometers.

The profile is:

\[Nₑ = 1.43 × 10¹³ \exp(-0.15 h') \exp[(β - 0.15)(z/1000 - h')]\]

Optional arguments:

  • cutoff_low=0: when z is below cutoff_low, return zero.
  • threshold=1e12: when density is greater than threshold, return threshold.

See also: electroncollisionfrequency, ioncollisionfrequency

References

[Wait1964]: J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964.

[Thomson1993]: N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.

source
LongwaveModePropagator.electroncollisionfrequencyFunction
electroncollisionfrequency(z)

Compute the electron-neutral collision frequency in collisions per second at height z in meters based on Wait's conductivity profile [[Wait1964]; [Thomson1993]].

The profile is:

\[νₑ(z) = 1.816 × 10¹¹ \exp(-0.15⋅z/1000)\]

See also: waitprofile, ioncollisionfrequency

References

[Wait1964]: J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964.

[Thomson1993]: N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.

source
LongwaveModePropagator.ioncollisionfrequencyFunction
ioncollisionfrequency(z)

Compute the ion-neutral collision frequency in collisions per second at height z in meters from [Morfitt1976].

The profile is:

\[νᵢ(z) = 4.54 × 10⁹ \exp(-0.15⋅z/1000)\]

See also: waitprofile, electroncollisionfrequency

References

[Morfitt1976]: D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976.

source

Samplers

LongwaveModePropagator.SamplerType
Sampler{T} <: AbstractSampler{T}

Sampler types sample (measure) the electromagnetic field in the waveguide.

Fields

  • distance::T: ground distance from the transmitter in meters.
  • fieldcomponent::Fields.Field: field component measured by the Sampler.
  • altitude::Float64: height above the ground in meters.
source
LongwaveModePropagator.GroundSamplerType
GroundSampler{T} <: AbstractSampler{T}

GroundSamplers are Sampler types with an altitude of zero.

Fields

  • distance::T: ground distance from the transmitter in meters.
  • fieldcomponent::Fields.Field: field component measured by the GroundSampler.
source
LongwaveModePropagator.FieldsModule
Fields

This baremodule allows scoped enum-like access to electric field components Ex, Ey, and Ez.

Examples

julia> Fields.Ex
 Ex::Field = 0
 julia> Fields.Ey
-Ey::Field = 1
source
LongwaveModePropagator.ReceiverType
Receiver{<:Antenna}

Represent a physical receiver.

A default Receiver{VerticalDipole} is returned with Receiver().

Fields

  • name::String = "": receiver name.
  • latitude::Float64 = 0.0: geographic latitude in degrees.
  • longitude::Float64 = 0.0: geographic longitude in degrees.
  • altitude::Float64 = 0.0: receiver altitude in meters above the ground.
  • antenna::Antenna = VerticalDipole(): receiver antenna.
source

Emitters

LongwaveModePropagator.FrequencyType
Frequency

Electromagnetic wave defined by frequency f, but also carrying angular wave frequency ω, wavenumber k, and wavelength λ, all in SI units.

source
LongwaveModePropagator.TransmitterType
Transmitter{A<:Antenna} <: Emitter

Typical ground-based Transmitter.

Fields

  • name::String: transmitter name.
  • latitude::Float64: transmitter geographic latitude in degrees.
  • longitude::Float64: transmitter geographic longitude in degrees.
  • antenna::Antenna: transmitter antenna.
  • frequency::Frequency: transmit frequency.
  • power::Float64: transmit power in Watts.
source

Waveguides

LongwaveModePropagator.HomogeneousWaveguideType
HomogeneousWaveguide{S} <: Waveguide

Defines a homogeneous segment of waveguide.

Fields

  • bfield::BField: background magnetic field.
  • species::S: ionosphere constituents.
  • ground::Ground: waveguide ground.
  • distance::Float64: distance from the Emitter at the start of the segment in meters.
source

IO

LongwaveModePropagator.ExponentialInputType
ExponentialInput

Type for Wait and Spies (1964) exponential ionosphere profiles defined by waitprofile. The electroncollisionfrequency is used for the electron-neutral collision frequency profile.

  • The electron density profile begins at 40 km altitude and extends to 110 km.
  • The transmitter power is 1 kW.

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • segment_ranges::Vector{Float64}: distance from transmitter to the beginning of each HomogeneousWaveguide segment in meters.
  • hprimes::Vector{Float64}: Wait's $h′$ parameter for each HomogeneousWaveguide segment.
  • betas::Vector{Float64}: Wait's $β$ parameter for each HomogeneousWaveguide segment.
  • b_mags::Vector{Float64}: magnetic field magnitude for each HomogeneousWaveguide segment.
  • b_dips::Vector{Float64}: magnetic field dip angles in radians for each HomogeneousWaveguide segment.
  • b_azs::Vector{Float64}: magnetic field azimuth in radians "east" of the propagation direction for each HomogeneousWaveguide segment.
  • ground_sigmas::Vector{Float64}: ground conductivity in Siemens per meter for each HomogeneousWaveguide segment.
  • ground_epsrs::Vector{Int}: ground relative permittivity for each HomogeneousWaveguide segment.
  • frequency::Float64: transmitter frequency in Hertz.
  • output_ranges::Vector{Float64}: distances from the transmitter at which the field will be calculated.
source
LongwaveModePropagator.TableInputType
TableInput <: Input

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • segment_ranges::Vector{Float64}: distance from transmitter to the beginning of each HomogeneousWaveguide segment in meters.
  • altitude::Vector{Float64}: altitude above ground in meters for which the density and collision_frequency profiles are specified.
  • density::Vector{Float64}: electron density at each altitude in $m⁻³$.
  • collision_frequency::Vector{Float64}: electron-ion collision frequency at each altitude in $s⁻¹$.
  • b_dips::Vector{Float64}: magnetic field dip angles in radians for each HomogeneousWaveguide segment.
  • b_azs::Vector{Float64}: magnetic field azimuth in radians "east" of the propagation direction for each HomogeneousWaveguide segment.
  • ground_sigmas::Vector{Float64}: ground conductivity in Siemens per meter for each HomogeneousWaveguide segment.
  • ground_epsrs::Vector{Int}: ground relative permittivity for each HomogeneousWaveguide segment.
  • frequency::Float64: transmitter frequency in Hertz.
  • output_ranges::Vector{Float64}: distances from the transmitter at which the field will be calculated.
source
LongwaveModePropagator.BasicOutputType
BasicOutput <: Output

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • output_ranges::Vector{Float64}
  • amplitude::Vector{Float64}
  • phase::Vector{Float64}
source
+Ey::Field = 1
source
LongwaveModePropagator.ReceiverType
Receiver{<:Antenna}

Represent a physical receiver.

A default Receiver{VerticalDipole} is returned with Receiver().

Fields

  • name::String = "": receiver name.
  • latitude::Float64 = 0.0: geographic latitude in degrees.
  • longitude::Float64 = 0.0: geographic longitude in degrees.
  • altitude::Float64 = 0.0: receiver altitude in meters above the ground.
  • antenna::Antenna = VerticalDipole(): receiver antenna.
source

Emitters

LongwaveModePropagator.FrequencyType
Frequency

Electromagnetic wave defined by frequency f, but also carrying angular wave frequency ω, wavenumber k, and wavelength λ, all in SI units.

source
LongwaveModePropagator.TransmitterType
Transmitter{A<:Antenna} <: Emitter

Typical ground-based Transmitter.

Fields

  • name::String: transmitter name.
  • latitude::Float64: transmitter geographic latitude in degrees.
  • longitude::Float64: transmitter geographic longitude in degrees.
  • antenna::Antenna: transmitter antenna.
  • frequency::Frequency: transmit frequency.
  • power::Float64: transmit power in Watts.
source
LongwaveModePropagator.DipoleType
Dipole

Dipole antenna with arbitrary orientation described by azimuth_angle and inclination_angle from vertical.

See also: AbstractDipole

source
LongwaveModePropagator.VerticalDipoleType
VerticalDipole

Dipole antenna with inclination angle $γ = 0$ from the vertical.

source
LongwaveModePropagator.HorizontalDipoleType
HorizontalDipole

Dipole antenna with inclination angle $γ = π/2$ from the vertical and azimuth_angle orientation $ϕ$ where:

ϕ [rad]orientation
0end fire
π/2broadside
source
LongwaveModePropagator.inclinationFunction
inclination(d::AbstractDipole)

Return the inclination (dip) angle $γ$ of d measured from vertical.

See also: AbstractDipole

source
LongwaveModePropagator.azimuthFunction
azimuth(d::AbstractDipole)

Return the azimuth angle $ϕ$ of d measured towards positive y direction from x.

See also: AbstractDipole

source

Waveguides

LongwaveModePropagator.HomogeneousWaveguideType
HomogeneousWaveguide{S} <: Waveguide

Defines a homogeneous segment of waveguide.

Fields

  • bfield::BField: background magnetic field.
  • species::S: ionosphere constituents.
  • ground::Ground: waveguide ground.
  • distance::Float64: distance from the Emitter at the start of the segment in meters.
source
LongwaveModePropagator.SegmentedWaveguideType
SegmentedWaveguide{T<:Vector{<:Waveguide}} <: Waveguide

A collection of Waveguides make up an inhomogeneous segmented waveguide.

source

IO

LongwaveModePropagator.ExponentialInputType
ExponentialInput

Type for Wait and Spies (1964) exponential ionosphere profiles defined by waitprofile. The electroncollisionfrequency is used for the electron-neutral collision frequency profile.

  • The electron density profile begins at 40 km altitude and extends to 110 km.
  • The transmitter power is 1 kW.

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • segment_ranges::Vector{Float64}: distance from transmitter to the beginning of each HomogeneousWaveguide segment in meters.
  • hprimes::Vector{Float64}: Wait's $h′$ parameter for each HomogeneousWaveguide segment.
  • betas::Vector{Float64}: Wait's $β$ parameter for each HomogeneousWaveguide segment.
  • b_mags::Vector{Float64}: magnetic field magnitude for each HomogeneousWaveguide segment.
  • b_dips::Vector{Float64}: magnetic field dip angles in radians for each HomogeneousWaveguide segment.
  • b_azs::Vector{Float64}: magnetic field azimuth in radians "east" of the propagation direction for each HomogeneousWaveguide segment.
  • ground_sigmas::Vector{Float64}: ground conductivity in Siemens per meter for each HomogeneousWaveguide segment.
  • ground_epsrs::Vector{Int}: ground relative permittivity for each HomogeneousWaveguide segment.
  • frequency::Float64: transmitter frequency in Hertz.
  • output_ranges::Vector{Float64}: distances from the transmitter at which the field will be calculated.
source
LongwaveModePropagator.TableInputType
TableInput <: Input

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • segment_ranges::Vector{Float64}: distance from transmitter to the beginning of each HomogeneousWaveguide segment in meters.
  • altitude::Vector{Float64}: altitude above ground in meters for which the density and collision_frequency profiles are specified.
  • density::Vector{Float64}: electron density at each altitude in $m⁻³$.
  • collision_frequency::Vector{Float64}: electron-ion collision frequency at each altitude in $s⁻¹$.
  • b_dips::Vector{Float64}: magnetic field dip angles in radians for each HomogeneousWaveguide segment.
  • b_azs::Vector{Float64}: magnetic field azimuth in radians "east" of the propagation direction for each HomogeneousWaveguide segment.
  • ground_sigmas::Vector{Float64}: ground conductivity in Siemens per meter for each HomogeneousWaveguide segment.
  • ground_epsrs::Vector{Int}: ground relative permittivity for each HomogeneousWaveguide segment.
  • frequency::Float64: transmitter frequency in Hertz.
  • output_ranges::Vector{Float64}: distances from the transmitter at which the field will be calculated.
source
LongwaveModePropagator.BatchInputType
BatchInput{T} <: Input

A collection of inputs with a batch name, description, and datetime.

source
LongwaveModePropagator.BasicOutputType
BasicOutput <: Output

Fields

  • name::String
  • description::String
  • datetime::DateTime
  • output_ranges::Vector{Float64}
  • amplitude::Vector{Float64}
  • phase::Vector{Float64}
source
LongwaveModePropagator.BatchOutputType
BatchOutput{T} <: Output

A collection of outputs with a batch name, description, and datetime.

See also: BatchInput

source
diff --git a/dev/references/index.html b/dev/references/index.html index ba2a65a..1c35216 100644 --- a/dev/references/index.html +++ b/dev/references/index.html @@ -1,2 +1,2 @@ -References · LongwaveModePropagator

References

  • K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955, doi: 10.1098/rspa.1955.0027.
  • K. G. Budden, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962, doi: 10.1098/rspa.1962.0041.
  • K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.
  • P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954, doi: 10.1017/S030500410002939X.
  • J. A. Ferguson and F. P. Snyder, “Approximate VLF/LF waveguide mode conversion model: Computer applications: FASTMC and BUMP,” Naval Ocean Systems Center, San Diego, CA, NOSC-TD-400, Nov. 1980. Accessed: May 08, 2017. Available: https://www.dtic.mil/docs/citations/ADA096240.
  • D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976. Accessed: Dec. 13, 2017. Available: https://www.dtic.mil/docs/citations/ADA032573.
  • D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. Accessed: Jan. 15, 2018. Available: https://www.dtic.mil/docs/citations/ADA082695.
  • R. A. Pappert, E. E. Gossard, and I. J. Rothmuller, “A numerical investigation of classical approximations used in VLF propagation,” Radio Science, vol. 2, no. 4, pp. 387–400, Apr. 1967, doi: 10.1002/rds196724387.
  • R. A. Pappert and R. R. Smith, “Orthogonality of VLF height gains in the earth ionosphere waveguide,” Radio Science, vol. 7, no. 2, pp. 275–278, 1972, doi: 10.1029/RS007i002p00275.
  • R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. Accessed: Dec. 03, 2019. Available: https://archive.org/details/DTIC_ADA033412.
  • R. A. Pappert, “LF daytime earth ionosphere waveguide calculations,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-647, Jan. 1981. Accessed: Jan. 23, 2020. Available: https://apps.dtic.mil/docs/citations/ADA096098.
  • R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. Accessed: Jul. 04, 2018. Available: https://www.dtic.mil/docs/citations/ADA133876.
  • R. A. Pappert, “Radiation resistance of thin antennas of arbitrary elevation and configuration over perfectly conducting ground.,” Naval Ocean Systems Center, San Diego, CA, Technical Report 1112, Jun. 1986. Accessed: Mar. 10, 2024. Available: https://apps.dtic.mil/sti/citations/ADA170945.
  • R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.
  • M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.
  • J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.
  • N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.
  • J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964. Accessed: Feb. 18, 2017. Available: https://archive.org/details/characteristicso300wait.
+References · LongwaveModePropagator

References

  • K. G. Budden, “The numerical solution of differential equations governing reflexion of long radio waves from the ionosphere,” Proc. R. Soc. Lond. A, vol. 227, no. 1171, pp. 516–537, Feb. 1955, doi: 10.1098/rspa.1955.0027.
  • K. G. Budden, “The influence of the earth’s magnetic field on radio propagation by wave-guide modes,” Proceedings of the Royal Society of London. Series A. Mathematical and Physical Sciences, vol. 265, no. 1323, pp. 538–553, Feb. 1962, doi: 10.1098/rspa.1962.0041.
  • K. G. Budden, “The propagation of radio waves: the theory of radio waves of low power in the ionosphere and magnetosphere,” First paperback edition. New York: Cambridge University Press, 1988.
  • P. C. Clemmow and J. Heading, “Coupled forms of the differential equations governing radio propagation in the ionosphere,” Mathematical Proceedings of the Cambridge Philosophical Society, vol. 50, no. 2, pp. 319–333, Apr. 1954, doi: 10.1017/S030500410002939X.
  • J. A. Ferguson and F. P. Snyder, “Approximate VLF/LF waveguide mode conversion model: Computer applications: FASTMC and BUMP,” Naval Ocean Systems Center, San Diego, CA, NOSC-TD-400, Nov. 1980. Accessed: May 08, 2017. Available: https://www.dtic.mil/docs/citations/ADA096240.
  • D. G. Morfitt and C. H. Shellman, “‘MODESRCH’, an improved computer program for obtaining ELF/VLF/LF mode constants in an Earth-ionosphere waveguide,” Naval Electronics Laboratory Center, San Diego, CA, NELC/IR-77T, Oct. 1976. Accessed: Dec. 13, 2017. Available: https://www.dtic.mil/docs/citations/ADA032573.
  • D. G. Morfitt, “‘Simplified’ VLF/LF mode conversion computer programs: GRNDMC and ARBNMC,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-514, Jan. 1980. Accessed: Jan. 15, 2018. Available: https://www.dtic.mil/docs/citations/ADA082695.
  • R. A. Pappert, E. E. Gossard, and I. J. Rothmuller, “A numerical investigation of classical approximations used in VLF propagation,” Radio Science, vol. 2, no. 4, pp. 387–400, Apr. 1967, doi: 10.1002/rds196724387.
  • R. A. Pappert and R. R. Smith, “Orthogonality of VLF height gains in the earth ionosphere waveguide,” Radio Science, vol. 7, no. 2, pp. 275–278, 1972, doi: 10.1029/RS007i002p00275.
  • R. A. Pappert and L. R. Shockey, “Simplified VLF/LF mode conversion program with allowance for elevated, arbitrarily oriented electric dipole antennas,” Naval Electronics Laboratory Center, San Diego, CA, Interim Report 771, Oct. 1976. Accessed: Dec. 03, 2019. Available: https://archive.org/details/DTIC_ADA033412.
  • R. A. Pappert, “LF daytime earth ionosphere waveguide calculations,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-647, Jan. 1981. Accessed: Jan. 23, 2020. Available: https://apps.dtic.mil/docs/citations/ADA096098.
  • R. A. Pappert, L. R. Hitney, and J. A. Ferguson, “ELF/VLF (Extremely Low Frequency/Very Low Frequency) long path pulse program for antennas of arbitrary elevation and orientation,” Naval Ocean Systems Center, San Diego, CA, NOSC/TR-891, Aug. 1983. Accessed: Jul. 04, 2018. Available: https://www.dtic.mil/docs/citations/ADA133876.
  • R. A. Pappert, “Radiation resistance of thin antennas of arbitrary elevation and configuration over perfectly conducting ground.,” Naval Ocean Systems Center, San Diego, CA, Technical Report 1112, Jun. 1986. Accessed: Mar. 10, 2024. Available: https://apps.dtic.mil/sti/citations/ADA170945.
  • R. A. Pappert and J. A. Ferguson, “VLF/LF mode conversion model calculations for air to air transmissions in the earth-ionosphere waveguide,” Radio Sci., vol. 21, no. 4, pp. 551–558, Jul. 1986, doi: 10.1029/RS021i004p00551.
  • M. L. V. Pitteway, “The numerical calculation of wave-fields, reflexion coefficients and polarizations for long radio waves in the lower ionosphere. I.,” Phil. Trans. R. Soc. Lond. A, vol. 257, no. 1079, pp. 219–241, Mar. 1965, doi: 10.1098/rsta.1965.0004.
  • J. A. Ratcliffe, "The magneto-ionic theory & its applications to the ionosphere," Cambridge University Press, 1959.
  • N. R. Thomson, “Experimental daytime VLF ionospheric parameters,” Journal of Atmospheric and Terrestrial Physics, vol. 55, no. 2, pp. 173–184, Feb. 1993, doi: 10.1016/0021-9169(93)90122-F.
  • J. R. Wait and K. P. Spies, “Characteristics of the earth-ionosphere waveguide for VLF radio waves,” U.S. National Bureau of Standards, Boulder, CO, Technical Note 300, Dec. 1964. Accessed: Feb. 18, 2017. Available: https://archive.org/details/characteristicso300wait.