Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]
This TiddlyWiki tracks some of my attempts at modeling amateur radio antennas using software available on Ubuntu. All of the modeling programs I could find that run natively in Ubuntu are based on the [[NEC-2|http://en.wikipedia.org/wiki/Numerical_Electromagnetics_Code]] engine. I found that many of the antenna modeling programs that run on ~MS-Windows could also be run on Ubuntu using [[wine|http://www.winehq.org/]]. The ~MS-Windows programs also appear to be based on [[NEC-2|http://en.wikipedia.org/wiki/Numerical_Electromagnetics_Code]] or the older MINNEC engine.

This wiki concentrates on using the programs that can be run natively on Ubuntu (and Linux in general).

Things to do:
* Compare horizontal dipole to inverted-V
* Compare horizontal yagi to vertical orientation over ground
** How high over ground does the antenna have to be to ignore ground effects?
* Create a model Alpha-Delta DX-CC antenna
** Compare horizontal to inverted-V configuration
** Determine effects of adding another wire for the 30m band
** Add trees to the near field, how does that effect the RF pattern and SWR
Jerry Dunmire
You can contact me by email at {{{arrl.net}}} using my call sign.
[[Antenna Modeling]]
All antennas should be compared against a dipole at 1/2 wave-length over an ideal ground.

Using a dipole for 40m as an example, the input file would look like this:
CM Dipole_40m.nec
GW 1  21 0.00E+00 -1.0272E+01 0.00E+00 0.00E+00 1.0272E+01 0.00E+00 2.05E-03
GM  0  0 0.00E+00  0.000E+00 0.00E+00 0.00E+00 0.000E+00 2.0965E+01 0.000E+00
GE  1
GN  1    0    0    0  0   0
EX  0    1   11   00  1.000E+00 0.000E+00
FR  0   20    0    0  6.700E+00 5.000E-02
RP  0   37   72 1001  0.000E+00 0.000E+00 5.000E+00 5.000E+0 0.000E+00 0.000E+00
EN  0    0    0    0
!! Line-by-line explanation
: Comments are required
; GW
: This defines a single wire that is divided into 21 segments. The wire is 12 gauge (2.05mm dia). Notice that the overall wire length (20.545m) is only 98% of the 1/2 wave length in free space.
; GM
: Using the coordinate transformation card is an easy way to adjust the antenna height. Notice that the antenna height is a full 1/2 wave length.
; GE
: End of graphics cards. The defined geometry would be adjusted if it touched the ground (gpflag = 1).
; GN
: This ground specification is for an ideal ground.
; EX
: Excitation is 1 volt applied to the middle segment (11) of the first wire (1)
; FR
: Evaluate the model at 20 frequencies, starting at 6.7 MHz in 50 KHz steps.
; RP
: Calculate the radiation pattern. Theta from 0-180 deg in 5 deg steps and Phi from 0-360 deg in 5 deg steps. The fourth field specified the output format. The 2nd 1 (at the end of the field) specifies that the average gain over the whole field calculation should be calculate. Note that the average gain calculation is mainly used to evaluate the model, but only when evaluated in free space. Since this model is evaluated over a ground, the average gain calculation could be script (1000 in the fourth field.
; EN
: End
!! Summary output
[[xnecview]] parses the nec2 output and prints a summary for each frequency:

#  freq.       Zr       Zi      SWR     gain      f/b      phi    theta
     6.7   63.086   -95.71  4.74776     7.88        -        0       60
    6.75   63.719  -85.482  4.10929     7.95        -        0       60
     6.8   64.355   -75.25  3.54146     8.01        -        0       60
    6.85   64.995  -65.013  3.04097     8.07        -        0       60
     6.9    65.64  -54.765   2.6044     8.13        -        0       60
    6.95   66.291  -44.502  2.22892     8.19        -        0       60
       7    66.95  -34.222  1.91292     8.24        -        0       60
    7.05    67.62   -23.92  1.65787      8.3        -        0       60
     7.1   68.302  -13.593  1.47356     8.35        -        0       60
    7.15   68.998  -3.2377  1.38633     8.41        -        0       60
     7.2    69.71    7.151  1.42377     8.46        -        0       60
    7.25    70.44   17.576  1.56898     8.51        -        0       60
     7.3    71.19   28.041  1.78765     8.56        -        0       60
    7.35   71.962   38.549  2.06211     8.61        -        0       60
     7.4    72.76   49.104  2.38607     8.65        -        0       60
    7.45   73.585    59.71  2.75757      8.7        -        0       60
     7.5    74.44   70.369  3.17604     8.74        -        0       60
    7.55   75.329   81.086  3.64137     8.78        -        0       60
     7.6   76.253   91.863  4.15338     8.81        -        0       60
    7.65   77.216    102.7   4.7115     8.85        -        0       60
!! Radiation Pattern and SWR Graph
To get a more real-world model of the dipole we can change one line in the card file to change from an ideal ground to a model of a real world ground:
; Ideal Ground
: {{{
GN  1    0    0    0  0   0
; ~Non-Ideal Ground, Sommerfield/Norton with values for a 'sandy, dry, flat, coastal'  ground
: {{{
GN  2    0    0    0  1.0000E+01 2.000E-03
A list of common ground values is available at [[http://5b4az.chronos.org.uk/pkg/nec2/examples/ground.txt]]
!! Summary Output
The [[xnecview]] summary output for this new model is:

#  freq.       Zr       Zi      SWR     gain      f/b      phi    theta
     6.7   60.802  -88.482  4.38563     6.91        -        0       60
    6.75   61.716   -78.05  3.75211     6.94        -        0       60
     6.8   62.601  -67.636  3.19972     6.98        -        0       60
    6.85   63.522  -57.219  2.72087     7.02        -        0       60
     6.9   64.387  -46.819  2.31281     7.05        -        0       60
    6.95   65.142  -36.446  1.97081      7.1        -        0       60
       7   65.797  -26.083  1.69143     7.15        -        0       60
    7.05   66.834  -15.608  1.48372     7.18        -        0       60
     7.1   67.895  -5.1214  1.37454     7.21        -        0       60
    7.15   68.985   5.3783  1.39713     7.23        -        0       60
     7.2   70.102   15.895  1.53657     7.26        -        0       65
    7.25    71.25   26.432  1.75213     7.31        -        0       65
     7.3   72.429   36.992  2.02228     7.35        -        0       65
    7.35   73.643   47.576  2.33899     7.39        -        0       65
     7.4   74.892   58.189  2.69921     7.42        -        0       65
    7.45   76.179   68.832  3.10136     7.46        -        0       65
     7.5   77.505   79.508  3.54433     7.49        -        0       65
    7.55   78.873    90.22  4.02706     7.53        -        0       65
     7.6   80.284   100.97  4.54833     7.56        -        0       65
    7.65   81.741   111.76  5.10676     7.59        -        0       65
!! Radiation Pattern and SWR Graph
!! Analysis
* The gain has gone down at all frequencies.
* The minimum SWR frequency has moved down.
* Adjust to get the Average gain as close to 1.000 as possible
  The number of points calculated in the radiation pattern will effect the average gain, but that does not indicate anything about the model. Chose a calculation pattern (say every 5 or 10 degrees over a full sphere) and just stick with it. For a simple dipole, the {{{nec2c}}} program gives the following values for average gain:
|Angle|AG@ 11 segments|
|10 Deg|9.8044E-01|
|5 Deg|9.8845E-01|
|1 Deg|9.9536E-01|
Note that small angles will make the calculation times longer.
* Adjust, per Cebik, to 'converge' the impedance
  Note that an absolute  minimum is not necessary and may not be practical. As long as the change between runs is smaller than could reasonably be measured, the model is //good enough//.

You adjust the number of segments, alignment of nodes, and intersection of wires. NEC-2 does not do well with wires that intersect at small angles. This seems to show up most clearly in the Average Gain.

The calculations should be performed at the resonant frequency(ies) of the antenna. The radiation pattern should be calculated for a full sphere.

The frequency and control cards should look like this (for an antenna resonate at 14.1MHz):
FR  0    1    0    0  1.410E+01 1.000E-01
RP  0   37   72 1001  0.000E+00 0.000E+00 5.000E+00 5.000E+00 0.000E+00 0.000E+00

# Set the number of segments so that they are equal and something near 1/10 wave-length.
# Run the model and note the impedance and Average Gain.
# Chose an increment that is about 50% of the number of segments chosen in step 1. This isn't a critical number. Don't change this increment since the convergence process will compare the results between successive calculations and a variation in the increment size would also yield a variation.
# Add the increment to the number of segments and repeat run the model again.
# Calculate the difference between impedance values and between the average gain values.
# Repeat setps 3-5 until a minimum difference is obtained. The number of segments that gives a minimum is the 'best' number for the model.
In part 4 of //A Beginner's Guide to Modeling with NEC//, L. B. Cebik, W4RNL(SK), describes two tests for evaluating models:
; Average Gain
: The average gain of the antenna in free space (for horizontal antennas) or above an ideal ground (for vertical antennas) should be close to 1.000.
; Convergence
: The minimum number of segments is evaluated by recording the gain and source impedance and then increasing the number of segments by 50%. If the gain and source impedance for the new model do not change significantly is then the original number of segments is adequate.
These cards define the antenna and nearby structures. While the NEC2 modeling engine supports surfaces, helix, and cylinders, the HF antennas I am interested in can be modeled using wires. So a typical model would be built the two comment cards (required for any model) and the just two or three different geometry input cards.
!!Comment Cards
; CM - comment
: There must at least one of these cards. Additional cards can be used. All comments will be included in the report.
; CE - comment end
: There must be one and only one of these cards, which marks the end of the comments.
!! Structure Geometry Cards
The common cards I use are:
; GW - Wire specification
; GM - Coordinate Transformation
; GE - Geometry End
: There must be one and only one of these cards. In addition to marking the end of the geometry this card has a field to indicate the type of ground that will used in the model.
: ''NOTE:'' The ground type specified here only impacts the way the geometry cards are interpreted and then only if portions of the geometry are in contact with the ground plane. A ''GN'' control card must be specified to include the calculation of ground plane effects. If a ''GN'' card is not specified, then a '''free space''' calculation will be preformed, regardless of the ground type specified on this (GE) card.
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
* [[Notebook|NotebookSetup]]: Instructions for setting up the default notebook format.
You'll also need to enter your username for signing your edits: <<option txtUserName>>
1. [[Evaluate Model in Free Space]]
* Adjust to get the Average gain as close to 1.000 as possible.
* Adjust, per Cebik, to 'converge' the impedance.
2.  [[Add Ground]]
3.  [[Detailed Evaluation]]
* Compare results with a dipole at the same elevation over the same type of ground.
Input to the NEC-2 program on Ubuntu is a file in which each line of the file represents a '''card'''. A '''card''' is short for [[Hollerith Card|http://en.wikipedia.org/wiki/Punched_card]] which is a punched card that was the input media for the original Fortran version of NEC-2.

The cards are one of two groups, [[Geometry|Geometry Control Cards]] or [[Program|Program Control Cards]] control cards. The formatting of the cards is relaxed from the original [[Hollerith|http://en.wikipedia.org/wiki/Punched_card]] column positioning, but does not allow leading fields to be blank.

Each input file has the following general format:
: Comment cards
: Geometry Control Cards
: Program Control Cards
The Ubuntu package repositories include multiple versions of the NEC-2 modeling engine, GUI wrappers for the engines, and viewers.

NEC-2 was written in Fortran by Lawrence Livermore Laboratory in 1981. The model has been extensively tested and is in wide-spread use. Newer versions of the NEC engine are available, with the most recent being NEC-4 released in 1992. However the newer versions are available only under license from Lawrence Livermore Laboratory. Additional information and history is available in the [[Wikipedia|http://en.wikipedia.org/wiki/Numerical_Electromagnetics_Code]].
!!Modeling Engines
; [[nec2]]
: This the original version of the NEC-2 engine, written in Fortran. The code is written using single precision floating point operations and was hand entered from a published report.
: This version is primarily for historical and reference use. In order to use the Sommerfield/Norton ground requires a separately generated input file. The other models below generate the required input internally.
; [[nec2c]]
: This is a (largely) hand translation of the Fortran code to C. The resulting translation has been expanded to include the SOMNEC engine (to generate data for the Sommerfield/Norton ground model), optimized, and expanded to use dynamic array allocation.
; [[nec2++]]
: NEC2++ is an extensive rewrite of NEC-2 in C++. See the [[project website|http://alioth.debian.org/projects/necpp/]] for more information.
!!GUI wrappers
; [[xnec2c]]
: [[xnec2c]] is a GUI wrapper for [[nec2c]]. It reads NEC-2 input files, runs the NEC-2 engine ([[nec2c]]), and displays the results in graphical form. An editor for the NEC-2 input is included.
; [[antennavis]]
: [[antennavis]] is a GUI wrapper for [[nec2++]]. The results are displayed graphically using the included, and integrated, TkAnt program.
: I feel that there are several disadvantages to this program: the input file can not be specified on the command line and the selected input file is modified and written to a new file, named {{{input.nec}}} before being fed to [[nec2++]]. The graphics displays are limited, compared to [[xnec2c]] and [[xnecview]], though that is offset some by since the output from [[nec2++]] is saved in the {{{output.nec}}}.
; [[qantenna]]
: [[qantenna]] is re-implementation of [[antennavis]] using Qt. In this case the engine is the [[nec2++]] program. The 3-D graphical views of the antenna geometry and RF field are better than those in [[xnec2c]] and [[xnecview]], but [[qantenna]] lacks 2-D graphs for things link VSWR and gain. The output from the NEC-2 engine is not avaliable as it is from [[antennavis]].
; [[xnecview]]
: This is a plotting program that displays both NEC-2 input geometry and modeling results in graphical form. It makes not attempt to run one of the modeling programs but will read the output files from [[nec2]], [[nec2c]], or [[nec2++]].
: Plots can also be written to files in Postscript or PNG formats.
; [[python-necpp]]
: This is intended more as an interface library to make NEC-2 functionality available to Python programs, but an example viewer is included. That said, and despite it's inclusion in the Ubuntu repository, the package included in the Ubuntu repository, it does not run  on Ubuntu 10.04.
I have started to use a //Digital Notebook// for my various projects. Each notebook is portable (at least between systems running Ubuntu) and requires only the [[FireFox|http://www.mozilla.com/en-US/firefox/]] with the [[Scrapbook|https://addons.mozilla.org/en-US/firefox/addon/427]] add-on.

The notebook content is stored in a wiki based on [[TiddlyWiki|http://www.tiddlywiki.com]]. The [[Scrapbook|https://addons.mozilla.org/en-US/firefox/addon/427]] add-on is used to manage related links. The wiki, scrapbook, and any additional data files are stored on a USB memory stick.

To setup a //Digital Notebook// like this, look at the tiddlers listed in the tagging box, to the left.

To access the notebook from a new computer, following the instructions in the listed tiddlers.
These cards determine the types processing to be applied to the antenna defined by the [[Geometry Control Cards]] and provide arguments for that processing.

As a starting point, I use the following cards:
GN  2    0    0    0  1.000E+01 2.000E-03
EX  0    T    M   00  1.000E+00 0.000E+00
FR  0    5    0    0  1.390E+01 1.000E-01
RP  0   19   36 1000  0.000E+00 0.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00
EN  0    0    0    0
; GN - Ground Parameters
: This specifies use of the Sommerfield/Norton method (2) for ground calculations using the dielectric and conductivity values for 'sandy, dry, flat, coastal' from the list at [[http://5b4az.chronos.org.uk/pkg/nec2/examples/ground.txt]
; EX - Excitation
: Voltage (0) source located at segment M of element T. The voltage is set for 1 volt.
: Of course M and T must be replaced integers.
; FR - Frequency
: This specifies a linear (0) sweep of 5 frequencies beginning at 13.9MHz (1.390E+01) in steps of 100KHz (1.000E-01).
; RP - Radiation Pattern
: This specifies a normal mode (0)  sweep of 19 theta points and 37 phi points. The 1000 values specifies the output format and the following four floating point values set the initial value for theta, phi, theta increment and phi increment. The values shown sweep theta from 0-90 degrees and phi from 0-360 degrees.
: The values on this card are suitable for use with a ground plane. When used in free space, the theta value should go from 0-180 degrees.
; EN - End
: This card marks the end of the control cards.
Note that the order of the cards is important, in particular the ''GN'' card must occur before the ''FR'' and ''RP'' cards.
ScrapBook is a plugin for the [[FireFox|http://www.mozilla.com/firefox]] browser.

The ScrapBook repository associated with the project is located on the USB memory stick with this wiki. See WikiSetup for more information.

Once the ScrapBook plugin has been installed, set the options to enable //Multi-ScrapBook//. To manage the scrapbooks, ScrapBook must be displayed in the side bar. A Multi-ScrapBook icon will be displayed and associated drop down window will have a //Manage// option.

For consistency, give the scrapbook the same name as the wiki when adding to the Scapbook manager on a new system.
For reference this wiki includes a [[Links|../index.html]] item in the MainMenu that can be populated with an HTML version of the ScrapBook.

The HTML version is generated exported using the {{{Tools->Output Tree as HTML}}} function in ScrapBook. The resulting files will be in the ../scrapbook/tree/ directory.

../index.html is a modified version of the ../scrapbook/tree/frame.html file created by the {{{Tools->Output Tree as HTML}}} function.
Things to try with a simple dipole model:
* Different segment lengths
** Confirm that I can get convergence
** Confirm average gain
** See what happens when segments are not the same length
* Different antenna heights over ground
** An animation would be nice, PNG images can be written from {{{xnecview}}}, but some sort of script would be needed to automate the process.
* Experiment with different ground conditions
|Author|Eric Shulman|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
>see [[SinglePageModePluginInfo]]
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release.  Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};
config.paramifiers.SPM = { onstart: function(v) {
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		config.lastURL = window.location.hash;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
} };
if (config.options.chkSinglePageMode==undefined)
if (config.options.chkSinglePagePermalink==undefined)
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
if (config.options.chkTopOfPageMode==undefined)
if (config.options.chkBottomOfPageMode==undefined)
if (config.options.chkSinglePageAutoScroll==undefined)
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash) return; // no change in hash
	var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();

if (Story.prototype.SPM_coreDisplayTiddler==undefined)
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
	else if (top)
	else if (bottom)
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
		else if (bottom)
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=document.getElementById(story.idPrefix+title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes when showing multiple tiddlers
	var opt=config.options;
	var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
	var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
	var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
Modeling Amateur Radio Antennas on Ubuntu
[[Antenna Modeling]]
Here are some scripts that I'm using:
!! Execute model and display results
# nec_run.sh - run NEC-2 and display results graphically


if [[ $# -ne 1 ]]
    echo "Wrong number of arguments." >&2
    exit 1

outfile=$(basename $1 .nec).out

rm -f ${outfile}

${NEC2} -i $1 -o ${outfile}
if [[ $? -eq 0 ]]
    ${VIEWER} $1 ${outfile}
    echo "Calculation error, see above and check ${outfile}." >&2
    exit 1
!! Transform EPS files to PNG files
This script is needed because the PNG export function of [[xnecview]] is broken.
# mkpng4tw.sh - make png from an eps and scale for tiddlywiki
# eps2png is a script by Wouter Kager, http://www.few.vu.nl/~wkager/tools.htm

eps2png -h $HEIGHT -w $WIDTH $1
This wiki is based on [[TiddlyWiki|http://www.tiddlywiki.com]] and the wiki file is located on a removable USB memory stick. Some configuration is needed for smooth operation.

To avoid the Firefox security dialog, add the following two lines to {{{~/.mozilla/firefox/<profile>/user.js}}}. If the user.js file does not exist, create it with mode 600.
user_pref("capability.principal.DigitalCommCenter.granted", "UniversalXPConnect");
user_pref("capability.principal.DigitalCommCenter.id", "file:///media/geda_usb/DigitalCommCenter/wiki/index.html");
A sample user.js file is available in {{{/media/geda_usb/DigitalCommCenter/wiki}}}. If you still get the security dialog, check the permissions on the user.js file. 

!User Name
Set the username for signing edits on each browser. The username is saved as a browser cookie, so it must be set any time the browser is changed, cookies are cleared, or when the notebook is first used on a new computer.

Set the username by selecting {{{options}}} from the menu in the right column of the  this page.

!File Locations
To ensure that the wiki file is located at the same path on the multiple computers I use, the volume name on the memory stick is set to 'geda_usb'. That way the path is /media/geda_usb/... on all of the systems (of course this assumes mounting methods that are compatible with the Ubuntu distribution).
!File Permissions
Since the USB stick is used on multiple computers and since my UID is different on those computers, file access is controlled by group permissions. Set umask to 0002 so that new files are created with group write permission. The shell script {{{/media/geda_usb/bin/geda_env.sh}}} should can be sourced to set the appropriate umask.

To preserve the group settings on this wiki file, Firefox should be restarted from a command prompt (not the drop-down menu) after sourcing the geda_env.sh file. For example:
$ source /media/geda_usb/bin/geda_env.sh
$ /media/geda_usb/bin/start_firefox.sh

The shell script {{{/media/geda_usb/bin/setgrp_wx.sh}}} will, recursively, set group write permissions. It uses sudo(1) and will request your password.
!More Info
See the GettingStarted tiddler for basic information getting started with TiddlyWiki.
xnecview is the best of the Linux visualization tools I've found so far. Here is a list of things I wish it did better:
 * Scale values on the field strength graphs
 * 3dB width lines on the field strength graphs
 * scriptable export for additional graphs like the SWR and gain graphs
 * SWR 2.0 line on the SWR graph and frequencies at which the SWR is 2.0

There is also a bug in the PNG export, the resulting files are all black.