summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/usage.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/usage.texi')
-rw-r--r--gsl-1.9/doc/usage.texi489
1 files changed, 489 insertions, 0 deletions
diff --git a/gsl-1.9/doc/usage.texi b/gsl-1.9/doc/usage.texi
new file mode 100644
index 0000000..adcd494
--- /dev/null
+++ b/gsl-1.9/doc/usage.texi
@@ -0,0 +1,489 @@
+@cindex standards conformance, ANSI C
+@cindex ANSI C, use of
+@cindex C extensions, compatible use of
+@cindex compatibility
+This chapter describes how to compile programs that use GSL, and
+introduces its conventions.
+
+@menu
+* An Example Program::
+* Compiling and Linking::
+* Shared Libraries::
+* ANSI C Compliance::
+* Inline functions::
+* Long double::
+* Portability functions::
+* Alternative optimized functions::
+* Support for different numeric types::
+* Compatibility with C++::
+* Aliasing of arrays::
+* Thread-safety::
+* Deprecated Functions::
+* Code Reuse::
+@end menu
+
+@node An Example Program
+@section An Example Program
+
+The following short program demonstrates the use of the library by
+computing the value of the Bessel function @math{J_0(x)} for @math{x=5},
+
+@example
+@verbatiminclude examples/intro.c
+@end example
+
+@noindent
+The output is shown below, and should be correct to double-precision
+accuracy,
+
+@example
+@verbatiminclude examples/intro.out
+@end example
+
+@noindent
+The steps needed to compile this program are described in the following
+sections.
+
+@node Compiling and Linking
+@section Compiling and Linking
+@cindex compiling programs, include paths
+@cindex including GSL header files
+@cindex header files, including
+The library header files are installed in their own @file{gsl}
+directory. You should write any preprocessor include statements with a
+@file{gsl/} directory prefix thus,
+
+@example
+#include <gsl/gsl_math.h>
+@end example
+
+@noindent
+If the directory is not installed on the standard search path of your
+compiler you will also need to provide its location to the preprocessor
+as a command line flag. The default location of the @file{gsl}
+directory is @file{/usr/local/include/gsl}. A typical compilation
+command for a source file @file{example.c} with the GNU C compiler
+@code{gcc} is,
+
+@example
+$ gcc -Wall -I/usr/local/include -c example.c
+@end example
+
+@noindent
+This results in an object file @file{example.o}. The default
+include path for @code{gcc} searches @file{/usr/local/include} automatically so
+the @code{-I} option can actually be omitted when GSL is installed
+in its default location.
+
+@menu
+* Linking programs with the library::
+* Linking with an alternative BLAS library::
+@end menu
+
+@node Linking programs with the library
+@subsection Linking programs with the library
+@cindex compiling programs, library paths
+@cindex linking with GSL libraries
+@cindex libraries, linking with
+The library is installed as a single file, @file{libgsl.a}. A shared
+version of the library @file{libgsl.so} is also installed on systems
+that support shared libraries. The default location of these files is
+@file{/usr/local/lib}. If this directory is not on the standard search
+path of your linker you will also need to provide its location as a
+command line flag.
+
+To link against the library you need to specify
+both the main library and a supporting @sc{cblas} library, which
+provides standard basic linear algebra subroutines. A suitable
+@sc{cblas} implementation is provided in the library
+@file{libgslcblas.a} if your system does not provide one. The following
+example shows how to link an application with the library,
+
+@example
+$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
+@end example
+
+@noindent
+The default library path for @code{gcc} searches @file{/usr/local/lib}
+automatically so the @code{-L} option can be omitted when GSL is
+installed in its default location.
+
+@node Linking with an alternative BLAS library
+@subsection Linking with an alternative BLAS library
+
+The following command line shows how you would link the same application
+with an alternative @sc{cblas} library called @file{libcblas},
+
+@example
+$ gcc example.o -lgsl -lcblas -lm
+@end example
+
+@noindent
+For the best performance an optimized platform-specific @sc{cblas}
+library should be used for @code{-lcblas}. The library must conform to
+the @sc{cblas} standard. The @sc{atlas} package provides a portable
+high-performance @sc{blas} library with a @sc{cblas} interface. It is
+free software and should be installed for any work requiring fast vector
+and matrix operations. The following command line will link with the
+@sc{atlas} library and its @sc{cblas} interface,
+
+@example
+$ gcc example.o -lgsl -lcblas -latlas -lm
+@end example
+
+@noindent
+For more information see @ref{BLAS Support}.
+
+@comment The program @code{gsl-config} provides information on the local version
+@comment of the library. For example, the following command shows that the
+@comment library has been installed under the directory @file{/usr/local},
+
+@comment @example
+@comment $ gsl-config --prefix
+@comment /usr/local
+@comment @end example
+@comment @noindent
+@comment Further information is available using the command @code{gsl-config --help}.
+
+@node Shared Libraries
+@section Shared Libraries
+@cindex shared libraries
+@cindex libraries, shared
+@cindex LD_LIBRARY_PATH
+To run a program linked with the shared version of the library the
+operating system must be able to locate the corresponding @file{.so}
+file at runtime. If the library cannot be found, the following error
+will occur:
+
+@example
+$ ./a.out
+./a.out: error while loading shared libraries:
+libgsl.so.0: cannot open shared object file: No such
+file or directory
+@end example
+
+@noindent
+To avoid this error, define the shell variable @code{LD_LIBRARY_PATH} to
+include the directory where the library is installed.
+
+For example, in the Bourne shell (@code{/bin/sh} or @code{/bin/bash}),
+the library search path can be set with the following commands:
+
+@example
+$ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+$ export LD_LIBRARY_PATH
+$ ./example
+@end example
+
+@noindent
+In the C-shell (@code{/bin/csh} or @code{/bin/tcsh}) the equivalent
+command is,
+
+@example
+% setenv LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH
+@end example
+
+@noindent
+The standard prompt for the C-shell in the example above is the percent
+character @samp{%}, and should not be typed as part of the command.
+
+To save retyping these commands each session they should be placed in an
+individual or system-wide login file.
+
+To compile a statically linked version of the program, use the
+@code{-static} flag in @code{gcc},
+
+@example
+$ gcc -static example.o -lgsl -lgslcblas -lm
+@end example
+
+@node ANSI C Compliance
+@section ANSI C Compliance
+
+The library is written in ANSI C and is intended to conform to the ANSI
+C standard (C89). It should be portable to any system with a working
+ANSI C compiler.
+
+The library does not rely on any non-ANSI extensions in the interface it
+exports to the user. Programs you write using GSL can be ANSI
+compliant. Extensions which can be used in a way compatible with pure
+ANSI C are supported, however, via conditional compilation. This allows
+the library to take advantage of compiler extensions on those platforms
+which support them.
+
+When an ANSI C feature is known to be broken on a particular system the
+library will exclude any related functions at compile-time. This should
+make it impossible to link a program that would use these functions and
+give incorrect results.
+
+To avoid namespace conflicts all exported function names and variables
+have the prefix @code{gsl_}, while exported macros have the prefix
+@code{GSL_}.
+
+@node Inline functions
+@section Inline functions
+
+@cindex inline functions
+@cindex HAVE_INLINE
+The @code{inline} keyword is not part of the original ANSI C standard
+(C89) and the library does not export any inline function definitions by
+default. However, the library provides optional inline versions of
+performance-critical functions by conditional compilation. The inline
+versions of these functions can be included by defining the macro
+@code{HAVE_INLINE} when compiling an application,
+
+@example
+$ gcc -Wall -c -DHAVE_INLINE example.c
+@end example
+
+@noindent
+If you use @code{autoconf} this macro can be defined automatically. If
+you do not define the macro @code{HAVE_INLINE} then the slower
+non-inlined versions of the functions will be used instead.
+
+Note that the actual usage of the inline keyword is @code{extern
+inline}, which eliminates unnecessary function definitions in @sc{gcc}.
+If the form @code{extern inline} causes problems with other compilers a
+stricter autoconf test can be used, see @ref{Autoconf Macros}.
+
+@node Long double
+@section Long double
+@cindex long double
+The extended numerical type @code{long double} is part of the ANSI C
+standard and should be available in every modern compiler. However, the
+precision of @code{long double} is platform dependent, and this should
+be considered when using it. The IEEE standard only specifies the
+minimum precision of extended precision numbers, while the precision of
+@code{double} is the same on all platforms.
+
+In some system libraries the @code{stdio.h} formatted input/output
+functions @code{printf} and @code{scanf} are not implemented correctly
+for @code{long double}. Undefined or incorrect results are avoided by
+testing these functions during the @code{configure} stage of library
+compilation and eliminating certain GSL functions which depend on them
+if necessary. The corresponding line in the @code{configure} output
+looks like this,
+
+@example
+checking whether printf works with long double... no
+@end example
+
+@noindent
+Consequently when @code{long double} formatted input/output does not
+work on a given system it should be impossible to link a program which
+uses GSL functions dependent on this.
+
+If it is necessary to work on a system which does not support formatted
+@code{long double} input/output then the options are to use binary
+formats or to convert @code{long double} results into @code{double} for
+reading and writing.
+
+@node Portability functions
+@section Portability functions
+
+To help in writing portable applications GSL provides some
+implementations of functions that are found in other libraries, such as
+the BSD math library. You can write your application to use the native
+versions of these functions, and substitute the GSL versions via a
+preprocessor macro if they are unavailable on another platform.
+
+For example, after determining whether the BSD function @code{hypot} is
+available you can include the following macro definitions in a file
+@file{config.h} with your application,
+
+@example
+/* Substitute gsl_hypot for missing system hypot */
+
+#ifndef HAVE_HYPOT
+#define hypot gsl_hypot
+#endif
+@end example
+
+@noindent
+The application source files can then use the include command
+@code{#include <config.h>} to replace each occurrence of @code{hypot} by
+@code{gsl_hypot} when @code{hypot} is not available. This substitution
+can be made automatically if you use @code{autoconf}, see @ref{Autoconf
+Macros}.
+
+In most circumstances the best strategy is to use the native versions of
+these functions when available, and fall back to GSL versions otherwise,
+since this allows your application to take advantage of any
+platform-specific optimizations in the system library. This is the
+strategy used within GSL itself.
+
+@node Alternative optimized functions
+@section Alternative optimized functions
+
+@cindex alternative optimized functions
+@cindex optimized functions, alternatives
+The main implementation of some functions in the library will not be
+optimal on all architectures. For example, there are several ways to
+compute a Gaussian random variate and their relative speeds are
+platform-dependent. In cases like this the library provides alternative
+implementations of these functions with the same interface. If you
+write your application using calls to the standard implementation you
+can select an alternative version later via a preprocessor definition.
+It is also possible to introduce your own optimized functions this way
+while retaining portability. The following lines demonstrate the use of
+a platform-dependent choice of methods for sampling from the Gaussian
+distribution,
+
+@example
+#ifdef SPARC
+#define gsl_ran_gaussian gsl_ran_gaussian_ratio_method
+#endif
+#ifdef INTEL
+#define gsl_ran_gaussian my_gaussian
+#endif
+@end example
+
+@noindent
+These lines would be placed in the configuration header file
+@file{config.h} of the application, which should then be included by all
+the source files. Note that the alternative implementations will not
+produce bit-for-bit identical results, and in the case of random number
+distributions will produce an entirely different stream of random
+variates.
+
+@node Support for different numeric types
+@section Support for different numeric types
+
+Many functions in the library are defined for different numeric types.
+This feature is implemented by varying the name of the function with a
+type-related modifier---a primitive form of C++ templates. The
+modifier is inserted into the function name after the initial module
+prefix. The following table shows the function names defined for all
+the numeric types of an imaginary module @code{gsl_foo} with function
+@code{fn},
+
+@example
+gsl_foo_fn double
+gsl_foo_long_double_fn long double
+gsl_foo_float_fn float
+gsl_foo_long_fn long
+gsl_foo_ulong_fn unsigned long
+gsl_foo_int_fn int
+gsl_foo_uint_fn unsigned int
+gsl_foo_short_fn short
+gsl_foo_ushort_fn unsigned short
+gsl_foo_char_fn char
+gsl_foo_uchar_fn unsigned char
+@end example
+
+@noindent
+The normal numeric precision @code{double} is considered the default and
+does not require a suffix. For example, the function
+@code{gsl_stats_mean} computes the mean of double precision numbers,
+while the function @code{gsl_stats_int_mean} computes the mean of
+integers.
+
+A corresponding scheme is used for library defined types, such as
+@code{gsl_vector} and @code{gsl_matrix}. In this case the modifier is
+appended to the type name. For example, if a module defines a new
+type-dependent struct or typedef @code{gsl_foo} it is modified for other
+types in the following way,
+
+@example
+gsl_foo double
+gsl_foo_long_double long double
+gsl_foo_float float
+gsl_foo_long long
+gsl_foo_ulong unsigned long
+gsl_foo_int int
+gsl_foo_uint unsigned int
+gsl_foo_short short
+gsl_foo_ushort unsigned short
+gsl_foo_char char
+gsl_foo_uchar unsigned char
+@end example
+
+@noindent
+When a module contains type-dependent definitions the library provides
+individual header files for each type. The filenames are modified as
+shown in the below. For convenience the default header includes the
+definitions for all the types. To include only the double precision
+header file, or any other specific type, use its individual filename.
+
+@example
+#include <gsl/gsl_foo.h> All types
+#include <gsl/gsl_foo_double.h> double
+#include <gsl/gsl_foo_long_double.h> long double
+#include <gsl/gsl_foo_float.h> float
+#include <gsl/gsl_foo_long.h> long
+#include <gsl/gsl_foo_ulong.h> unsigned long
+#include <gsl/gsl_foo_int.h> int
+#include <gsl/gsl_foo_uint.h> unsigned int
+#include <gsl/gsl_foo_short.h> short
+#include <gsl/gsl_foo_ushort.h> unsigned short
+#include <gsl/gsl_foo_char.h> char
+#include <gsl/gsl_foo_uchar.h> unsigned char
+@end example
+
+@node Compatibility with C++
+@section Compatibility with C++
+@cindex C++, compatibility
+The library header files automatically define functions to have
+@code{extern "C"} linkage when included in C++ programs. This allows
+the functions to be called directly from C++.
+
+To use C++ exception handling within user-defined functions passed to
+the library as parameters, the library must be built with the
+additional @code{CFLAGS} compilation option @option{-fexceptions}.
+
+@node Aliasing of arrays
+@section Aliasing of arrays
+@cindex aliasing of arrays
+The library assumes that arrays, vectors and matrices passed as
+modifiable arguments are not aliased and do not overlap with each other.
+This removes the need for the library to handle overlapping memory
+regions as a special case, and allows additional optimizations to be
+used. If overlapping memory regions are passed as modifiable arguments
+then the results of such functions will be undefined. If the arguments
+will not be modified (for example, if a function prototype declares them
+as @code{const} arguments) then overlapping or aliased memory regions
+can be safely used.
+
+@node Thread-safety
+@section Thread-safety
+
+The library can be used in multi-threaded programs. All the functions
+are thread-safe, in the sense that they do not use static variables.
+Memory is always associated with objects and not with functions. For
+functions which use @dfn{workspace} objects as temporary storage the
+workspaces should be allocated on a per-thread basis. For functions
+which use @dfn{table} objects as read-only memory the tables can be used
+by multiple threads simultaneously. Table arguments are always declared
+@code{const} in function prototypes, to indicate that they may be
+safely accessed by different threads.
+
+There are a small number of static global variables which are used to
+control the overall behavior of the library (e.g. whether to use
+range-checking, the function to call on fatal error, etc). These
+variables are set directly by the user, so they should be initialized
+once at program startup and not modified by different threads.
+
+@node Deprecated Functions
+@section Deprecated Functions
+@cindex deprecated functions
+
+From time to time, it may be necessary for the definitions of some
+functions to be altered or removed from the library. In these
+circumstances the functions will first be declared @dfn{deprecated} and
+then removed from subsequent versions of the library. Functions that
+are deprecated can be disabled in the current release by setting the
+preprocessor definition @code{GSL_DISABLE_DEPRECATED}. This allows
+existing code to be tested for forwards compatibility.
+
+@node Code Reuse
+@section Code Reuse
+@cindex code reuse in applications
+@cindex source code, reuse in applications
+Where possible the routines in the library have been written to avoid
+dependencies between modules and files. This should make it possible to
+extract individual functions for use in your own applications, without
+needing to have the whole library installed. You may need to define
+certain macros such as @code{GSL_ERROR} and remove some @code{#include}
+statements in order to compile the files as standalone units. Reuse of
+the library code in this way is encouraged, subject to the terms of the
+GNU General Public License.