AIMAll
(Version 17.01.25)

Copyright © by Todd A. Keith
1997-2017 (aim@tkgristmill.com)

Format specification for AIM Extended Wavefunction Files (.wfx files)
Version 1.0.4c

Todd A. Keith, 9/2010
Modified on 6/22/2014 to convey that the inclusion of "Additional Electron Density Function (EDF)" data is recommended (rather than required) for wavefunctions derived from calculations using ECPs.


"AIM Extended Wavefunction Files" (.wfx files) are newer versions of "AIM Traditional Wavefunction Files" (.wfn files).  The original purpose of .wfx files (relative to .wfn files) was to present essentially the same data as in .wfn files, but in a cleaner way that allows easy, free-format reading and writing of wavefunction data of unlimited size, range and precision and that allows for the possible addition of more kinds of data in a non-disruptive way.

In the current specification, .wfx files (like .wfn files) are limited to first-order density matrices (total or alpha and beta) expressed in an MO basis.  For SCF single-determinant methods like Hartree-Fock and Kohn-Sham DFT, this is sufficient to determine all properties.  For post-SCF multi-determinant methods like MP2, CCSD, etc., first-order density matrices are sufficient to determine all one-electron properties but are not sufficient to exactly determine two-electron properties.  Thus, for two-electron properties to be calculated from a post-SCF .wfx file, approximations of the second-order density matrix in terms of the first-order density matrix are necessary.

Data in a .wfx file consists of sections of similar data, the sections being marked using descriptive opening and closing tags, similar to XML (A .wfx file is technically NOT a "well formed" XML file, however). For example:

<Net Charge>
1.0
</Net Charge>

or

<Nuclear Charges>
6.0
8.0
1.0
1.0
</Nuclear Charges>

or

<Nuclear Charges>
6.0 8.0 1.0 1.0
</Nuclear Charges>

The opening and closing tags of a data section MUST appear alone on separate lines before and after the corresponding data.  Thus, unlike XML, single-line statements like <Net Charge>1.0</Net Charge> are NOT allowed.  Also note that, unlike XML, spaces are allowed in tags and "attributes" are not recognized as such.

When a data section consists of multiple data items, they must be separated by spaces. For the purposes of parsing data items, a newline is considered a space.

There is no required order for the data sections.

Top level tags (e.g, <Number of Primitives>) should be globally unique, i.e., should appear only once in a file and should not be used as child tags.

Tags are not case sensitive.

The Fortran D (or d) descriptor for numbers expressed in scientific notation is NOT allowed because this causes problems for C readers.  Fortran writers should use the E (or e) descriptor for all scientific notation.

The format and written precision of floating point data is up to the .wfx writer.  Written precision is not necessarily indicative of the numerical accuracy of the data.  It is better to write numbers that are too precise rather than not precise enough.

The term "Molecular Orbital" or "MO" refers to canonical SCF spatial orbitals or spin orbitals in the case of Hartree-Fock and KSDFT and "natural orbitals" (eigenvectors of the first-order density matrix) or "natural spin orbitals" (eigenvectors of the first-order alpha and beta density matrices) in post-SCF cases like CISD, CCSD, MP2, etc.

Molecular orbitals are expressed in terms of their normalized linear expansion in raw primitive Cartesian Gaussian basis functions.

Molecular orbitals should be written in the order:  "doubly" occupied, "singly" occupied Alpha, "singly" occupied Beta.  For Restricted-Open SCF, this means all doubly occupied MOs are written first, then all singly-occupied Alpha MOs.  For Unrestricted SCF or post-SCF this means that all Alpha MOs are written first, then all Beta MOs. Within a block of SCF MOs, the SCF MOs should be written in order of increasing MO energy (i.e., most negative to least negative).  Within a block of post-SCF natural MOs, they should be written in order of decreasing occupancy.

Non-nuclear attractors can be added to the .wfx file as nuclei with atomic number 0, nuclear charge 0.0 and with names beginning with NNA (e.g., NNA8).  The coordinates of non-nuclear attractors must appear in the appropriate position of the <Nuclear Cartesian Coordinates> section of the .wfx file.

Ghost atoms can be added to the .wfx file as nuclei with atomic number 0, nuclear charge 0.0 and with names beginning with Bq (e.g., Bq12).  The coordinates of ghost nuclei must appear in the appropriate position of the <Nuclear Cartesian Coordinates> section of the .wfx file.

All data must be in atomic units.

For human readability and consistency, it is recommended (but not strictly necessary) that comment lines start with the # character.  Comments must not be used inside data sections, i.e., between opening and closing tags.

Water Example, With Use or Discussion of Most Official Version 1.0.4 Tags.


# Title
# Required
# The Title data section is required and can be more than one line.
<Title>
H2O HF/STO-3G//HF/STO-3G
</Title>

# Keywords
# Required
# The Keywords data section is required and must contain GTO if the basis functions are
# Gaussians (currently the only supported form of basis function).  Some other possible
# keywords are GIAO if the wavefunction is a GIAO magnetic wavefunction and CSGT if the
# wavefunction is a CSGT-style magnetic wavefunction.
<Keywords>
GTO
</Keywords>

# Number of Nuclei
# Required
<Number of Nuclei>
3
</Number of Nuclei>

# Number of Primitives
# Required
<Number of Primitives>
21
</Number of Primitives>

# Number of Occupied Molecular Orbitals
# Required
<Number of Occupied Molecular Orbitals>
5
</Number of Occupied Molecular Orbitals>

# Number of Perturbations
# Required
# This is usually zero.  For GIAO it should be 3 (corresponding to Lx, Ly and Lz) and for
# CSGT it should be 6 (corresponding to Lx, Ly, Lz, Px, Py and Pz).
<Number of Perturbations>
0
</Number of Perturbations>

# Nuclear Names
# Required
# Nuclear names must be specified on separate lines.  Names can be up to 8 characters long,
# starting with the first non-blank character on the line. Names must NOT contain spaces.
<Nuclear Names>
O1
H2
H3
</Nuclear Names>

# Atomic Numbers
# Recommended in all cases.  Required when at least one atom has an ECP.
# An atomic number is greater than a nuclear charge when when an ECP is used for the atom.
# The atomic numbers in this section are the real atomic numbers of the nuclei.  Ghost atoms
# and NNACPs have atomic number 0.
<Atomic Numbers>
8
1
1
</Atomic Numbers>

# Nuclear Charges
# Required
# When an ECP is used, the written nuclear charge is less than the real nuclear charge by the
# number of core electrons modeled by the ECP.  Thus, for Cl and a valency-only ECP, the atomic
# number is 17 but the nuclear charge is 7.  Ghost atoms and NNACPs have nuclear charge 0.0.
<Nuclear Charges>
8.00000000000000E+000
1.00000000000000E+000
1.00000000000000E+000
</Nuclear Charges>

# Nuclear Cartesian Coordinates
# Required
# X1 Y1 Z1 X2 Y2 Z2 ...
# But for human readability, it is recommended that each nucleus be given its own line.
# X1 Y1 Z1
# X2 Y2 Z2
# ...
<Nuclear Cartesian Coordinates>
0.00000000000000E+000 0.00000000000000E+000 2.40242907000000E-001
0.00000000000000E+000 1.43244242000000E+000 -9.60971627000000E-001
-1.75417809000000E-016 -1.43244242000000E+000 -9.60971627000000E-001
</Nuclear Cartesian Coordinates>

# Net Charge
# Required
# The net charge of the molecule.
<Net Charge>
0.00000000000000E+000
</Net Charge>

# Number of Electrons
# Required
<Number of Electrons>
10
</Number of Electrons>

# Number of Alpha Electrons
# Required
<Number of Alpha Electrons>
5
</Number of Alpha Electrons>

# Number of Beta Electrons
# Required.
<Number of Beta Electrons>
5
</Number of Beta Electrons>

# Electronic Spin Multiplicity
# Recommended but not required
<Electronic Spin Multiplicity>
1
</Electronic Spin Multiplicity>

# Model
# Strongly recommended.
# A recognized name for the underlying model from which the wavefunction was derived.
# Typical model names are:
# Restricted HF
# Unrestricted HF
# Restricted-Open HF
# Restricted MP2
# Unrestricted MP2
# Restricted MP3
# Unrestricted MP3
# Restricted MP4
# Unrestricted MP4
# Restricted CC
# Unrestricted CC
# Restricted CI
# Unrestricted CI
# Restricted CASSCF
# Unrestricted CASSCF
# Restricted LSDA
# Unrestricted LSDA
# Restricted-Open LSDA
# Restricted B3LYP
# Unrestricted B3LYP
# Restricted-Open B3LYP
# Restricted M062X
# Unrestricted M062X
# Restricted-Open M062X
# etc.
<Model>
Restricted HF
</Model>

# Primitive Centers
# Required
# Space-separated list of nuclear numbers upon which the primitive basis functions are centered.
# Nuclear numbering starts at 1.
# The number of items per line is optional, but for human readability 10 per line is recommended
<Primitive Centers>
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 2 2 2 3 3
3
</Primitive Centers>

# Primitive Types
# Required
# Space-separated list of primitive types.
# Primitive type numbering starts at 1.
# The number of items per line is optional, but for human readability 10 per line is recommended.
# The definition of the Cartesian Gaussian primitive types (through G shells) is:
#
# 1 S
# 2 PX
# 3 PY
# 4 PZ
# 5 DXX
# 6 DYY
# 7 DZZ
# 8 DXY
# 9 DXZ
# 10 DYZ
# 11 FXXX
# 12 FYYY
# 13 FZZZ
# 14 FXXY
# 15 FXXZ
# 16 FYYZ
# 17 FXYY
# 18 FXZZ
# 19 FYZZ
# 20 FXYZ
# 21 GXXXX
# 22 GYYYY
# 23 GZZZZ
# 24 GXXXY
# 25 GXXXZ
# 26 GXYYY
# 27 GYYYZ
# 28 GXZZZ
# 29 GYZZZ
# 30 GXXYY
# 31 GXXZZ
# 32 GYYZZ
# 33 GXXYZ
# 34 GXYYZ
# 35 GXYZZ
#
# For H and higher-shells, the order is given by:
#
# Do IX = 0, L
# Do IY = 0, (L-IX)
# IZ = L - IX - IY
#
# Thus, for H shells (L = 5), this leads to
# 36 HZZZZZ (005)
# 37 HYZZZZ (014)
# 38 HYYZZZ (023)
# 39 HYYYZZ (032)
# 40 HYYYYZ (041)
# 41 HYYYYY (050)
# 42 HXZZZZ (104)
# 43 HXYZZZ (113)
# 44 HXYYZZ (122)
# 45 HXYYYZ (131)
# 46 HXYYYY (140)
# 47 HXXZZZ (203)
# 48 HXXYZZ (212)
# 49 HXXYYZ (221)
# 50 HXXYYY (230)
# 51 HXXXZZ (302)
# 52 HXXXYZ (311)
# 53 HXXXYY (320)
# 54 HXXXXZ (401)
# 55 HXXXXY (410)
# 56 HXXXXX (500)
<Primitive Types>
1 1 1 1 1 1 2 3 4 2
3 4 2 3 4 1 1 1 1 1
1
</Primitive Types>

# Primitive Exponents
# Required
# Space-separated list of primitive exponents.
# The number of items per line is optional, but for human readability only a few per line is recommended.
<Primitive Exponents>
1.30709321000000E+002 2.38088661000000E+001 6.44360831000000E+000 5.03315132000000E+000
1.16959612000000E+000 3.80388960000000E-001 5.03315132000000E+000 5.03315132000000E+000
5.03315132000000E+000 1.16959612000000E+000 1.16959612000000E+000 1.16959612000000E+000
3.80388960000000E-001 3.80388960000000E-001 3.80388960000000E-001 3.42525091000000E+000
6.23913730000000E-001 1.68855404000000E-001 3.42525091000000E+000 6.23913730000000E-001
1.68855404000000E-001
</Primitive Exponents>

# Molecular Orbital Occupation Numbers
# Required
# Space-separated list of MO occupation numbers, which will typically be less than 2 for post-SCF
# natural spatial orbitals and less than 1 for post-SCF natural spin orbitals.
# For human readability, one per line is recommended.
<Molecular Orbital Occupation Numbers>
2.00000000000000E+000
2.00000000000000E+000
2.00000000000000E+000
2.00000000000000E+000
2.00000000000000E+000
</Molecular Orbital Occupation Numbers>

# Molecular Orbital Energies
# Required
# Space-separated list of MO energies, which should be zero for post-SCF natural orbitals.
# For human readability, one per line is recommended.
<Molecular Orbital Energies>
-2.02515479000000E+001
-1.25760928000000E+000
-5.93941119000000E-001
-4.59728723000000E-001
-3.92618460000000E-001
</Molecular Orbital Energies>

# Molecular Orbital Spin Types
# Required
# One MO per line.
# The three possible choices are:
# Alpha and Beta
# Alpha
# Beta
<Molecular Orbital Spin Types>
Alpha and Beta
Alpha and Beta
Alpha and Beta
Alpha and Beta
Alpha and Beta
</Molecular Orbital Spin Types>

# Molecular Orbital Primitive Coefficients
# Required
# Raw-Primitive Expansion coefficients for each normalized MO.
# For GIAO and CSGT, see other examples.
# The coefficients are given as a space-separated list of numbers.
# The number of items per line is optional, but for human readability only a few per line is recommended.
<Molecular Orbital Primitive Coefficients>
<MO Number>
1
</MO Number>
4.22735025664585E+000 4.08850914632625E+000 1.27420971692421E+000 -6.18883321546465E-003
8.27806436882009E-003 6.24757868903820E-003 0.00000000000000E+000 0.00000000000000E+000
-6.97905144921135E-003 0.00000000000000E+000 0.00000000000000E+000 -4.38861481239680E-003
0.00000000000000E+000 0.00000000000000E+000 -6.95230322147800E-004 -1.54680714141406E-003
-1.49600452906993E-003 -4.66239267760156E-004 -1.54680714141406E-003 -1.49600452906993E-003
-4.66239267760156E-004
<MO Number>
2
</MO Number>
-9.93934027465106E-001 -9.61289724159333E-001 -2.99592018377613E-001 -2.02159553670646E-001
2.70404733783394E-001 2.04078487063151E-001 0.00000000000000E+000 0.00000000000000E+000
-2.05880464366463E-001 0.00000000000000E+000 0.00000000000000E+000 -1.29463160155366E-001
0.00000000000000E+000 0.00000000000000E+000 -2.05091397601904E-002 4.30931212730961E-002
4.16777908960109E-002 1.29891469789185E-002 4.30931212730961E-002 4.16777908960109E-002
1.29891469789185E-002
<MO Number>
3
</MO Number>
0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000 -0.00000000000000E+000
0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000 1.02652120092148E+000
0.00000000000000E+000 0.00000000000000E+000 6.45504074642182E-001 0.00000000000000E+000
0.00000000000000E+000 1.02258690941279E-001 0.00000000000000E+000 1.24402010368969E-001
1.20316208759709E-001 3.74973069812026E-002 -1.24402010368969E-001 -1.20316208759709E-001
-3.74973069812026E-002
<MO Number>
4
</MO Number>
-4.42374945058045E-001 -4.27845789719456E-001 -1.33340844570570E-001 -1.28852672024973E-001
1.72350857743564E-001 1.30075763838210E-001 0.00000000000000E+000 0.00000000000000E+000
1.26652576885278E+000 0.00000000000000E+000 0.00000000000000E+000 7.96425386733271E-001
0.00000000000000E+000 0.00000000000000E+000 1.26167162499928E-001 -8.17067717603127E-002
-7.90232326554732E-002 -2.46280899645633E-002 -8.17067717603127E-002 -7.90232326554732E-002
-2.46280899645633E-002
<MO Number>
5
</MO Number>
0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000 -0.00000000000000E+000
0.00000000000000E+000 0.00000000000000E+000 1.67545019558903E+000 0.00000000000000E+000
0.00000000000000E+000 1.05356803847979E+000 0.00000000000000E+000 0.00000000000000E+000
1.66902878951205E-001 0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000
0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000 0.00000000000000E+000
0.00000000000000E+000
</Molecular Orbital Primitive Coefficients>

# Energy
# Required
# The total energy of the molecule.
# For Hartree-Fock and KSDFT, this is the SCF energy.
# For MP2, this is the MP2 total energy.
# For CCSD, this is the CCSD total energy.
# etc.
<Energy = T + Vne + Vee + Vnn>
-7.49659011707870E+001
</Energy = T + Vne + Vee + Vnn>

# Virial Ratio (-V/T)
# Required
# Given that E = T + V, this is just: -E/T + 1, where T is calculated using the first-order
# density matrix associated with the method used to obtain the total energy. Note that for
# KSDFT, T in practice usually refers to the "non-interacting" kinetic energy Ts (Tc is buried
# in V) and -V/Ts is not 2 for stationary point geometries even in theory for KSDFT. Still
# this data is useful for KSDFT (Ts(A)*E/Ts is a decent simple correction to -Ts(A) for
# stationary point geometries) and should be included.
<Virial Ratio (-V/T)>
2.00599838291596E+000
</Virial Ratio (-V/T)>

# Nuclear Cartesian Energy Gradients
# Highly recommended but not required.
# Space separated list of nuclear names and corresponding Cartesian energy gradients.
# One nucleus per line.
# This section is a little less free and mixes names and corresponding numerical data
# because of the possibility of not all "nuclei" having gradient data.
<Nuclear Cartesian Energy Gradients>
O1         6.09070231000000E-016 -5.55187875000000E-016 -2.29270172000000E-004
H2         -2.46849911000000E-016 -1.18355659000000E-004 1.14635086000000E-004
H3         -3.62220320000000E-016 1.18355659000000E-004 1.14635086000000E-004
</Nuclear Cartesian Energy Gradients>

# Nuclear Virial of Energy-Gradient-Based Forces on Nuclei, W
# Not required.
# This is just -Sum_Over_Nuclei[R * GradE].
# This section should be absent if the gradients are not available.
<Nuclear Virial of Energy-Gradient-Based Forces on Nuclei, W>
6.14477996016389E-004
</Nuclear Virial of Energy-Gradient-Based Forces on Nuclei, W>

# Full Virial Ratio, -(V - W)/T
# Not required.
# This is just -(E + W)/T + 1
# This section should be absent if the gradients are not available.
# Note that for KSDFT, T actually refers to Ts (Tc is buried in V).
<Full Virial Ratio, -(V - W)/T>
2.00600662884992E+000
</Full Virial Ratio, -(V - W)/T>

When effective Core Potentials (ECPs) are used in the ab initio calculation, it can be useful or necessary for some applications (such as AIMAll) for the .wfx file to include additional electron density function (EDF) data in the wavefunction file in the form given below to represent the core electron density distribution from the ECP-modeled core electrons. Note that the core electron density is simply represented as a linear combination of primitive Gaussian functions, usually just S-type functions if, as is usually the case, the model core electron density distribution is spherically symmetric and can therefore be fit to a linear combination of S-type Gaussian functions.

The following example is from a .wfx file (created by Gaussian 09 B.01) for CH2BrCl in which the 3 inner shells of 28 electrons (1s2,2s2,2p6,3s2,3p6,3d10) of the Br atom and the 2 inner shells of 10 electrons (1s2,2s2,2p6) of the Cl atom were modeled using LANL2DZ ECPs in the ab initio B3LYP calculation.  In this case, the electron density function (EDF) was pre-determined by Gaussian 09 B.01 by separately fitting the actual core electron densities of free Br atoms and free Cl atoms obtained from high-level, all-electron calculations.

Note that more than one set of EDF data can be present per wavefunction file.  For example, instead of specifying one combined set of EDF data for all centers with ECP-modeled core electrons (as is done below), one can equivalently specify separate sets of EDF data for each center.  This makes it easier to manually add EDF data to a .wfx file.

Of course, the additional EDFs should be defined to try and reasonably model just the appropriate core densities of the atoms with ECP-modeled core electrons and should be defined so that their integral over all space equals the number of ECP-modeled core electrons.  Note that in the context of ECPs and corresponding core EDFs, the definition of a "core" for an atom depends on the number of ECP-modeled core electrons for that atom.  For those wishing to construct their own core own densities, great care must be taken not to significantly "contaminate" the non-core regions with the EDFs.  For an EDF defined simply as a linear combination of S-type Gaussian functions, it is noteworthy that the integral of an S-type gaussian function with exponent alpha over all space is simply:  (pi/alpha)**1.5

The file ch2brcl_b3lyp_lanl2dz_combinededfs.wfx is the full .wfx file for CH2BrCl at B3LYP/LANL2DZ//B3LYP/LANL2DZ with one combined set of EDF data for Br and Cl.

The file ch2brcl_b3lyp_lanl2dz_separateedfs.wfx is the full .wfx file for CH2BrCl at B3LYP/LANL2DZ//B3LYP/LANL2DZ with separate sets of EDF data for Br and Cl.

Note:  The above .wfx files will NOT render properly in web browsers.  To view the files, download them and view them with a text editor.

# Number of Core Electrons
# Recommended for ECPs.
# The total number of core electrons modeled by ECPs
<Number of Core Electrons>
38
</Number of Core Electrons>

# Additional Electron Density Function (EDF)
# Recommended for ECPs.
<Additional Electron Density Function (EDF)>
<Number of EDF Primitives>
49
</Number of EDF Primitives>
<EDF Primitive Centers>
4 4 4 4 4
4 4 4 4 4
4 4 4 4 4
4 4 4 4 4
4 4 4 4 4
4 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5
</EDF Primitive Centers>
<EDF Primitive Types>
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1
</EDF Primitive Types>
<EDF Primitive Exponents>
4.459566346600e+007 2.277438917020e+007 1.163056588380e+007 5.939569301590e+006 3.033255977470e+006
1.549041918310e+006 7.910743051340e+005 4.039907176480e+005 2.063124777110e+005 1.053609318230e+005
5.380637214860e+004 2.747817083330e+004 1.403272218880e+004 7.166317336820e+003 3.659739249530e+003
1.868978269460e+003 9.544613792240e+002 4.874302389260e+002 2.489238883750e+002 1.271219905030e+002
6.491944415170e+001 3.315346316010e+001 1.693101556660e+001 4.415615257680e+000 2.254993703160e+000
1.151594127780e+000 5.939569301590e+006 3.033255977470e+006 1.549041918310e+006 7.910743051340e+005
4.039907176480e+005 2.063124777110e+005 1.053609318230e+005 5.380637214860e+004 2.747817083330e+004
1.403272218880e+004 7.166317336820e+003 3.659739249530e+003 1.868978269460e+003 9.544613792240e+002
4.874302389260e+002 2.489238883750e+002 1.271219905030e+002 6.491944415170e+001 3.315346316010e+001
1.693101556660e+001 8.646435720220e+000 4.415615257680e+000 2.254993703160e+000
</EDF Primitive Exponents>
<EDF Primitive Coefficients>
7.487900912270e+002 1.995198887630e+004 -1.051775310550e+004 1.511945457420e+004 -1.530581814380e+003
7.473773106890e+003 2.557337101310e+003 4.879670599210e+003 3.593392191520e+003 7.566316297390e+003
2.045060403160e+003 8.346936656130e+003 4.464742448850e+003 4.802771166360e+003 6.825921849576e+003
4.521493682700e+003 3.134312247727e+003 1.372563088957e+003 1.722377326180e+002 2.859393067010e+000
3.262155912880e+002 1.533389423812e+002 -2.112187740940e-001 2.679767784061e+001 1.855573804510e-002
4.098181567201e-001 1.871504693790e+002 4.702293155340e+002 -1.570032436790e+002 3.338771301530e+002
1.064310876220e+002 1.671641111610e+002 1.928741244180e+002 1.664547652900e+002 2.221025750370e+002
6.990568432720e+002 2.866893784760e+002 3.345152960450e+002 4.155348021290e+002 5.999669639920e+002
4.836882984020e+002 3.760977922740e+002 1.786090102550e+002 3.350395287220e+001 1.205528578710e+000
7.956941591424e+000 2.584199626783e+001 1.898716467978e+000 3.283109046630e-001
</EDF Primitive Coefficients>
</Additional Electron Density Function (EDF)>



Copyright © 1997-2017 by Todd A. Keith