Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

APBS User's Guide

0.2.1

APBS was written by Nathan A. Baker.
Additional contributing authors listed in the code documentation.



License

Copyright (c) 1999-2002. Nathan A. Baker. All Rights Reserved.

Permission to use, copy, modify, and distribute this software and its documentation for educational, research, and not-for-profit purposes, without fee and without a signed licensing agreement, is hereby granted, provided that the above copyright notice, this paragraph and the following two paragraphs appear in all copies, modifications, and distributions.

IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". THE AUTHORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.


Table of Contents


Introduction

APBS was primarily written by Nathan Baker during his graduate work with J. Andrew McCammon and Michael Holst. APBS relies several libraries written by Mike Holst and members of the Holst group. These include PMG (multigrid solver for Cartesian mesh discretization), FEtk (provides finite element framework, error estimators, and solvers), and MALOC (hardware abstraction library for code portability).

Please acknowledge your use of APBS by citing: N. A. Baker, D. Sept, S. Joseph, M. J. Holst, J. A. McCammon. Electrostatics of nanosystems: application to microtubules and the ribosome. Proc. Natl. Acad. Sci. USA 98, 10037-10041, 2001. (Link to paper)

This version of the APBS code contains sequential and parallel fast multigrid Poisson-Boltzmann solver. Subsequent releases will include adaptive finite element technology. This release is primarily intended to allow users to get familiar with the code and break it. Before going too much farther in this guide, please view the License.


Installation

Prerequisites:
You will definitely need

It may also be useful to have

Directories: These instructions will assume a local (home directory, etc.) installation of APBS. It may also be worthwhile to check out Machine-specific notes prior to starting the installation.

  1. Choose a directory where you'd like APBS and MALOC to be installed, we'll choose /home/nbaker/pbe. Using a Bourne-like shell (bash or sh), do:
     # mkdir -p /home/nbaker/pbe /home/nbaker/pbe/dist
     # TOP=/home/nbaker/pbe; export TOP
     # FETK_INCLUDE=${TOP}/dist/include; export FETK_INCLUDE
     # FETK_LIBRARY=${TOP}/dist/lib; export FETK_LIBRARY
     
    or, using a C-shell-like shell (csh or tcsh), do
     # mkdir -p /home/nbaker/pbe /home/nbaker/pbe/dist
     # setenv TOP /home/nbaker/pbe
     # setenv FETK_INCLUDE ${TOP}/dist/include
     # setenv FETK_LIBRARY ${TOP}/dist/lib
     
    The dist subdirectory will be used to store header files and libraries for APBS and MALOC.S

    If you're planning on using MPI, you'll also need to set some additional environmental variables. The variable FETK_MPI_INCLUDE points to the directory where the MPI header files reside (mpi.h) and the variable FETK_MPI_LIBRARY gives the directory with the MPI libraries (either libmpi.a or libmpich.a). These variables need to be defined using commands like

     # FETK_MPI_INCLUDE=/usr/share/mpi/include; export FETK_MPI_INCLUDE
     # FETK_MPI_LIBRARY=/usr/share/mpi/lib; export FETK_MPI_LIBRARY
     
    for a Bourne-like shell and
     # setenv FETK_MPI_INCLUDE /usr/share/mpi/include
     # setenv FETK_MPI_LIBRARY /usr/share/mpi/lib
     
    for a C-shell type of environment. Note that the paths given in the above example are system-dependent; your variable definitions will likely be different.

  2. Unpack the MALOC and APBS source code:
     # cd ${TOP}
     # gzip -dc maloc.tar.gz | tar xvf -
     # gzip -dc apbs-0.2.1.tar.gz | tar xvf -
     
  3. Compile and install the MALOC libraries. You should read the MALOC installation guide before doing this, but if you just want a simple sequential code, the following should work:
     # cd ${TOP}/maloc
     
    If you are not starting from a clean distribution (i.e., the tar file), you need to run make distclean now (and ignore any error messages). There are two common installation options that APBS users will need to choose from: With either installation option, you should find the MALOC headers and libraries installed in the directory ${TOP}/dist.
  4. Compile and install APBS. There aren't any special configuration options for stable features of APBS. Therefore, you simply:
     # cd ${TOP}/apbs
     
    If you are not starting from a clean distribution (i.e., the tar file), you need to run make distclean now (and ignore any error messages).
     # ./configure --prefix=${TOP}/dist
     # make
     # make install
     
    <font color="red">If you have vendor-supplied BLAS libraries for your platform, set the environmental variable
    BLASPATH
    to their location and use them with APBS by inkoving the
    --with-blas=${BLASPATH}
    flag during configurationa.</font>
  5. You should now find the APBS executable in the ${TOP}/dist/bin/${triplet} directory,
where ${triplet} is a machine/compiler/os-specific directory to facilitate compilation across platforms. If at any point you made a mess and need to start over, simply
 # make distclean
 
in the APBS or MALOC package directories and repeat the installation process.


Machine-specific notes Of course, every machine seems to behave a bit differently. Here are a few notes; if you encounter interesting configuration/compilation behavior, please let me know.


Quick tour of APBS

Main executable

Right now, there is only one executable (${TOP}/dist/bin/${prefix}/apbs) for APBS, where ${TOP} is the top-level install directory (see Installation section) and ${prefix} is a machine/compiler/os-specific string to facilitate compilation across multiple platforms. The executable invoked with the syntax
    apbs input-path;
 
where input-path is the path to a specially formatted input file (see Using the APBS executable for more information on the input file). Besides the output files specified in input-path (i.e., for visualization), APBS writes output to three places:

Test systems and examples

The directory apbs/examples contains several test systems and example scripts which show how to use APBS for binding energy, solvation energy, and force calculations. The file apbs/examples/README.html contains descriptions of the test cases as well as anticipated results.

Tools, scripts, and parameters

The apbs/tools directory contains several (hopefully) useful accessories for working with APBS:
conversion/pdb2qr
Convert a PDB file to PQR format (as read by APBS) with the help of a parameter file (see conversion/param). Contributed by Dave Sept.
PDB2PQR web service
Fix, protonate, and convert a PDB file to PQR format using an NBCR-supported web portal with a WHATIF backend. Provided by Jens Nielsen and Jerry Greenberg; supported by NBCR.
conversion/pdb2qcd
Convert a QCD file (i.e., UHBD format for a molecule) to PQR format.
conversion/amber2charmm
A script which converts a PDB file with AMBER atom names to a PDB file with CHARMm atom names. Useful for preprocessing files before converting with pdb2pqr

conversion/WHATIF2AMBER.sed
A sed script for converting a PDB file with WHATIF atom names to a PDB file with CHARMm atom names. Useful for preprocessing files before converting with pdb2pqr. Contributed by Chiansan Ma.

conversion/param
A collection of parameter files in UHBD format (contributed by Dave Sept and Adrian Elcock) suitable for use with pdb2pqr.

manip/acc
A program for calculating molecular volumes, surface areas, etc. from molecules in PQR format.

manip/collisions
Useful for looking for collisions between two molecules when trying to set up a binding energy calculation. Contributed by Dave Sept.

manip/psize
Get the dimensions and center of a molecule in PQR format. Very useful for setting up input files (i.e., grid dimensions, lengths, spacings, etc.) for APBS calculations. Contributed by Dave Sept.

manip/shift
Move the center of a molecule in PQR format around. Contributed by Dave Sept.

mesh/mgmesh
List acceptable grid dimensions/multigrid levels combinations. Saves considerable headaches with math. :)

mesh/dxmath
Perform arithmetic operations on OpenDX-format grids and scalar quantities. Similar to UHBD's gridcalc utility; run code with no arguments for instructions.

mesh/uhbd_asc2bin
Converts UHBD-format grid files from ASCII to binary. Contributed by Dave Sept.

opendx/average
Basically example code for OpenDX manipulation in APBS. Averages potential along an axis.

opendx/read
Basically example code for OpenDX manipulation in APBS. Reads in DX file and spits out some information.

opendx/dx2mol
For converting the OpenDX format of the electrostatic potential to the MOLMOL format. MOLMOL is a popular free molecular display program (http://www.mol.biol.ethz.ch/wuthrich/software/molmol/). Contributed by Jung-Hsin Lin.

opendx/potacc.*
OpenDX visual program (*.net) and accessory files for looking at potentials and molecular surfaces.

opendx/pot.*
OpenDX visual program (*.net) and accessory files for looking at potentials only.

opendx/multipot.*
Sample OpenDX visual program (*.net) and accessory files for looking at potentials as output by a parallel focusing calculation.

vmd/read_dx
Tcl commands for visualizing electrostatic potentials in VMD. Contributed by Dave Sept.

vmd/loadstuff.vmd
Sample command script for visualizing electrostatic potentials in VMD. Contributed by Dave Sept.

\section example-code

There is a more concise source-code-only driver for APBS in test/mg that should provide a starting point for those who wish to integrate APBS into their own applications. Such users should also become familiar with the APBS Programmer's Guide.


Using the APBS executable

The only executable for APBS is located at ${TOP}/dist/bin/${triplet}/apbs, where ${TOP} is the top-level install directory (see Installation section) and ${triplet} is a machine-specific directory that allows the installation of multiple architechtures in the same directory. The executable is invoked as

   apbs input-path
 
where input-path is the path to a specially formatted input file. The syntax of this input file closely resembles UHBD input with a few significant changes and additions. Input is divided into sections of the form
        READ
          ....
        END
        ELEC
          ....
        END
        PRINT
          ....
        END
        QUIT
 
where READ, ELEC, and PRINT designate the start of specific sections. Each section is ended by the END keyword and the entire input file is terminated by the QUIT keyword. The sections/commands currently available are: These sections can occur in any order, however, they are clearly interdependent. For example, PRINT requires ELEC and ELEC requires one or more READ sections. Sections can also be repeated; several READ statements may be used to load molecules and multiple ELEC sections would specify various electrostatics calculations on one or more molecules.

READ statements

One of these sections must be present for every molecule involved in the APBS calculation. Molecule and "map" IDs are assigned implicitly assigned for each molecule/map read, based on order and starting at 1. The sections have the following keywords:
mol format path
Read in molecular data from the file path. The acceptable format flags are:
diel format path-x path-y path-z
Read in the dielectric function mapped to a Cartesian mesh. The result is a map of values between the solvent and biomolecular dielectric constants. The values in this file have no units. Acceptable format keywords include: The x-shifted dielectric map is read from path-x, the y-shifted map is read from path-y, and the z-shifted map is read from path-z.
kappa format path
Read in the map from the file path. The values in this file have units of . Acceptable format keywords include:
charge format path
Read in the molecular charge distribution from the file path. The values in this file have units of e_c, the electron charge (i.e., they are unitless). Acceptable format keywords include:

ELEC statements

This section is the main component of all APBS runs. There may be several ELEC sections, operating on different molecules or using different parameters for multiple runs on the same molecule. Each of the ELEC sections begins with one of the following keywords:



Manual multigrid calculation syntax (mg-manual)
This section always has the form

 elec
   mg-manual
   ...
 end
 
where the ... denotes the various parameter keywords listed below. To avoid confusion during run-time, there are no default parameter values. Therefore, unless otherwise indicated, all of the following keywords should be specified:



Automatic multigrid focusing calculation syntax (mg-auto)
This section always has the form

 elec
   mg-auto
   ...
 end
 
where the ... denotes the various parameter keywords listed below. This form of multigrid calculations is most useful for focusing; the user simply provides information about the coarsest and finest meshes desired and the code sets up the rest, including number of focusing levels, centers, dimensions, etc.
As before, there are no default parameter values. Therefore, unless otherwise indicated, all of the following keywords should be specified:



Automatic multigrid parallel focusing calculation syntax (mg-para)

PLEASE NOTE: In versions 0.2.1 and earlier, parallel focusing should not be used for energy calculations if the fine grid does not completely contain all atoms of interest!

This section always has the form

 elec
   mg-para
   ...
 end
 
where the ... denotes the various parameter keywords listed below. This form of multigrid calculations is most useful for focusing; the user simply provides information about the coarsest and finest meshes desired and the code sets up the rest, including number of focusing levels, centers, dimensions, etc.
As before, there are no default parameter values. Therefore, unless otherwise indicated, all of the following keywords should be specified:



Keyword definitions

dime nx ny nz
Number of grid points in the x, y, and z directions. The nx, ny, and nz are related to the value l specified in the nlev keyword by the formula
nx = c *
 2^(l+1) + 1
, where c is an integer. Use the program apbs/tools/mesh/mgmesh to find the correct values of nx, ny, and nz. The most common values are 65, 97, and 161 (can be different in each direction); these are all compatible with nlev 4. If you happen to pick an "bad" value for the dimensions (i.e., mismatch with nlev), the code will adjust the specified dime to more appropriate values.

nlev l
The number of levels in the multilevel hierarchy. Dependent on the values set by the dime keyword; see discussion.

grid hx hy hz
The mesh grid spacing (in Å); may be different in each direction. Either this keyword or <href="name">glen must be specified.

glen> xlen ylen zlen
The mesh lengths (in Å); may be different in each direction. Either this keyword or grid must be specified.

gcent {mol id | xcent ycent zcent}
The grid center. If the grid mol is used, * id must be the ID of a molecule read in a previous READ section. Molecule IDs are assigned in the order they're read, starting at 1. If just grid is used, the next three numbers should be the x, y, and z coordinates for the center of the grid.

mol id
The ID of a molecule read in a previous READ section; this is the molecule for which the PBE is solved.

lpbe
Specifies that the linearized PBE should be solved. (See also npbe).

npbe
Specifies that the nonlinear (full) PBE should be solved. (See also lpbe).

bcfl flag
Boundary condition flag; where flag is one of the following:
0
Zero boundary conditions.
1
Boundary conditions assigned using the analytical (Debye-Hückel) expression for a single spherical ion with the molecule's radius and net charge.
2
The analytical (Debye-Hückel) expression for a single spherical ion is used for each ion (i.e., superposition) to assign boundary conditions. Tends to capture more moments of the molecular multipole, but is (much) slower to evaluate.
4
The solution from the previous calculation is used to assign boundary conditions for the current calculation. Clearly, the domain for the current calculation must be a subset of the previous domain.

ion charge conc radius
These specify the different counterion species present in solution with the given charge (in e), concentration (in M), and radius (in ). Several of these keywords can be present to describe a variety of ionic species in solution. Varying ion valencies and concetrations are taken into account in the mobile ion PBE term, however, only the largest ionic radius is used to determine the ion accessibility function.

pdie dielectric
Solute dielectric constant (unitless). Typically 2 to 20.

sdie dielectric
Solvent dielectric constant (unitless). Typically 78.54 (water).

srfm flag
Method used to define the various surface-based coefficients; flag is one of the following:
0
Ion accessibility ( ) is defined using inflated van der Waals radii, the dielectric coefficient ( ) is defined using the molecular (Conolly) surface definition without smoothing.
1
Ion accessibility ( ) is defined using inflated van der Waals radii, the dielectric coefficient ( ) is defined using the molecular (Conolly) surface definition with a simple harmonic average smoothing.
2
Spline-based surface definitions. This is primarily for use with force calculations, since it requires substantial reparameterization of radii. This is based on the work of Im et al, Comp. Phys. Comm. 111, (1998) and uses a cubic spline to define a smoothly varying characteristic function for the surface-based parameters. Ion accessibility ( ) is defined using inflated van der Waals radii with the spline function and the dielectric coefficient ( ) is defined using the standard van der Waals radii with the spline function.

usemap type ID
Use a pre-calculated map(s) (as provided by a write statement in an earlier calculation and read in with a READ statement) to set up a calculation. The type flag refers to the coefficient to be assigned from the map:
diel
Dielectric function ( ) -- this causes the srad parameter and the radii/location of atoms in the PQR file to be ignored
kappa
Ion accessibility ( ) -- this causes the ion radius parameter to be ignored
charge
Biomolecule charge distribution -- this causes the charges/locations in the PQR file to be ignored

srad radius
Solvent molecular radius (in ) used to define molecular surfaces. Typically 1.4 (water).

swin window
Spline window (in ) used to define surface-based properties. Typically 0.3 .

temp temperature
System tempertature (in K).

gamma parameter
Surface tension parameter for apolar forces (in kJ/mol/Å). Often 0.105 kJ/mol/ . <font color="red">This parameter is only used if forces are calculated but still must be present for other calculations.</font>

calcenergy flag
Controls electrostatic energy output.
0
No energies are written.
1
Total electrostatic energies are written to stdout.
2
Total electrostatic energies and individual per-atom components are written to stdout.

calcforce flag
OPTIONAL KEYWORD. Controls electrostatic force output.
0
No forces are written.
1
Net forces on molecule are written to stdout.
2
Forces on each atom are written to stdout.
write type format stem
Controls output of data; all arguments must be present. This keyword can be repeated several times to provide various types of output.
type
  • charge Write out the biomolecular charge distribution in units of e
  • pot Write out potential in units of kT/e
  • smol Write out solvent accessibility defined by molecular/Connolly surface definition (1 = accessible, 0 = inaccessible)
  • sspl Write out spline-based solvent accessibility (1 = accessible, 0 = inaccessible)
  • vdw Write out van der Waals-based accessibility (1 = accessible, 0 = inaccessible)
  • ivdw Write out ion accessibility/inflated van der Waals (1 = accessible, 0 = inaccessible)
  • lap Write out Laplacian of potential (kT/e/ )
  • edens Write out energy density , where is potential
  • ndens Write out ion number density , where is potential (output in M)
  • qdens Write out ion charge density , where is potential (output in e_c M)
  • dielx Write out the x-shifted dielectric map of the dielectric function for use in subsequent calculations (see read diel (unitless)
  • diely Write out the y-shifted dielectric map of the dielectric function for use in subsequent calculations (see read diel (unitless)
  • dielz Write out the z-shifted dielectric map of the dielectric function for use in subsequent calculations (see read diel (unitless)
  • kappa Write out the map of the function for use in subsequent calculations (see read kappa (units of )
format
dx for OpenDX format, avs for AVS UCD format, uhbd for UHBD format.
stem
The filename will be stem.XXX, where XXX is determined from the file format.

writemat type stem
Controls output of operator matrix in Harwell-Boeing column-compressed format. This keyword is optional.
type
  • poisson Write out the operator

    corresponding to Poisson's equation.

  • full Write out the linearization (functional derivative) of the full non-linear Poisson-Boltzmann operator

    around the current solution .

stem
The filename will be stem.mat.

cglen xlen ylen zlen
The coarsest mesh lengths (in ); may be different in each direction.

fglen xlen ylen zlen
The finest mesh lengths (in ); may be different in each direction.

cgcent {mol id | xcent ycent zcent}
The center of the coarsest mesh. If the grid mol is used, id must be the ID of a molecule read in a previous READ section. Molecule IDs are assigned in the order they're read, starting at 1. If just grid is used, the next three numbers should be the x, y, and z coordinates for the center of the grid.

fgcent {mol id | xcent ycent zcent}
The center of the finest mesh. If the grid mol is used, id must be the ID of a molecule read in a previous READ section. Molecule IDs are assigned in the order they're read, starting at 1. If just grid is used, the next three numbers should be the x, y, and z coordinates for the center of the grid.

pdime npx npy npz
Array of processors for the calculation; processors are laid out on Cartesian grid over the actual mesh -- this specifies the number of processors in each direction.

ofrac fraction
The amount of overlap to include between processors' meshes. This should be between 0 and 1; empirical evidence suggests that 0.1 is a good choice.

PRINT statement

This is a very simple section that allows linear combinations of calculated properties to be written to standard output. It has the format print keyword id op id op id ... end where spaces are important and the components are

keyword
Specifies the observable to operate on and is one of the following:
energy
Perform the calculations on the total energy
id
ELEC statement ID (they are assigned in increasing order of declaration in the input file, starting at 1)
op
Is the operation to perform and is one of the following:
+
Addition
-
Subtraction
So a typical declaration might look like
 print energy 3 - 2 - 1 end
 
and be interpreted as "subtract the energy from ELEC statements #1 and #2 from the energy in ELEC statement #3" (i.e., a binding energy calculation).

NOTE: It is important to realize that, in the case of automatic focusing (mg-auto), PRINT works using ELEC statement numbers, not the calculation numbers which appear while APBS is running.


Bugs and reporting problems

The following is a list of some of the bugs in APBS, a list of bugs in specific functions can be found here.

Problems can be reported to the APBS User mailing list at apbs-users@mccammon.ucsd.edu. To subscribe, simply send an e-mail to majordomo@mccammon.ucsd.edu with the body

    subscribe apbs-users
 
However, while the code is in beta, you should also e-mail the problem to nbaker@wasabi.ucsd.edu.


Further reading

More detailed information about APBS can be found in the following papers:

APBS has been featured in:

Programmer's Guide

This documentation provides information about the programming interface provided by the APBS software and a general guide to linking to the APBS libraries. Information about installation, configuration, and general usage can be found in the User's Guide.

APBS was primarily written by Nathan Baker during his graduate work with J. Andrew McCammon and Michael Holst. APBS relies several libraries written by Mike Holst and members of the Holst group. These include PMG (multigrid solver for Cartesian mesh discretization), FEtk (provides finite element framework, error estimators, and solvers), and MALOC (hardware abstraction library for code portability).

Please acknowledge your use of APBS by citing N. A. Baker, D. Sept, S. Joseph, M. J. Holst, J. A. McCammon. Electrostatics of nanosystems: application to microtubules and the ribosome. Proc. Natl. Acad. Sci. USA 98, 10037-10041 2001.

Programming Style

APBS was developed following the Clean OO C style of Mike Holst. In short, Clean OO C code is written in a object-oriented, ISO C-compliant fashion, and can be compiled with either a C or C++ compiler.

Following this formalism, all public data is enclosed in structures which resemble C++ classes. These structures and member functions are then declared in a public header file which provides a concise description of the interface for the class. Private functions and data are included in private header files (or simply the source code files themselves) which are not distributed. When using the library, the end-user only sees the public header file and the compiled library and is therefore (hopefully) oblivious to the private members and functions. Each class is also equipped with a constructor and destructor function which is responsible for allocating and freeing any memory required by the instatiated objects.

As mentioned above, public data members are enclosed in C structures which are visible to the end-user. Public member functions are generated by mangling the class and function names and passing a pointer to the object on which the member function is supposed to act. For example, a public member function with the C++ declaration

   public double Foo::bar(int i, double d)
   
would be declared as
   double Foo_bar(Foo *thee, int i, double d)
   
where VEXTERNC is a compiler-dependent macro, the underscore _ replaces the C++ double-colon ::, and thee replaces the this variable implicit in all C++ classes. Since they do not appear in public header files, private functions could be declared in any format pleasing to the user, however, the above declaration convention should generally be used for both public and private functions. Within the source code, the public and private function declarations/definitions are prefaced by the macros VPUBLIC and VPRIVATE, respectively. These are macros which reduce global name pollution, similar to encapsulating private data withing C++ classes.

The only C++ functions not explicitly covered by the above declaration scheme are the constructors (used to allocate and initialize class data members) and destructors (used to free allocated memory). These are declared in the following fashion: a constructor with the C++ declaration

    public void Foo::Foo(int i, double d)
    
would be declared as
     Foo* Foo_ctor(int i, double d)
     
which returns a pointer to the newly constructed Foo object. Likewise, a destructor declared as
     public void Foo::~Foo()
     
in C++ would be
     void Foo_dtor(Foo **thee)
     
in Clean OO C.

Finally, inline functions in C++ are simply treated as macros in Clean OO C and declared/defined using define statements in the public header file.

See any of the APBS header files for more information on Clean OO C programming styles.

Application programming interface documentation

The API documentation for this code was generated by doxygen. You can either view the API documentation by using the links at the top of this page, or the slight re-worded/re-interpreted list below:


Generated at Tue Apr 23 16:59:16 2002 for APBS by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001