anzhi2710gmailcom's picture
Upload folder using huggingface_hub
10f2621 verified
Raw
History Blame Contribute Delete
38.1 kB
/** @defgroup Vhal Vhal class
* @brief A "class" which consists solely of macro definitions which are
* used by several other classes
*/
/**
* @file vhal.h
* @ingroup Vhal
* @brief Contains generic macro definitions for APBS
* @version $Id$
* @author Nathan A. Baker
*
* @attention
* @verbatim
*
* APBS -- Adaptive Poisson-Boltzmann Solver
*
* Nathan A. Baker (nathan.baker@pnl.gov)
* Pacific Northwest National Laboratory
*
* Additional contributing authors listed in the code documentation.
*
* Copyright (c) 2010-2020 Battelle Memorial Institute. Developed at the Pacific Northwest National Laboratory, operated by Battelle Memorial Institute, Pacific Northwest Division for the U.S. Department Energy. Portions Copyright (c) 2002-2010, Washington University in St. Louis. Portions Copyright (c) 2002-2010, Nathan A. Baker. Portions Copyright (c) 1999-2002, The Regents of the University of California. Portions Copyright (c) 1995, Michael Holst.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of Washington University in St. Louis nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @endverbatim
*/
#ifndef _VAPBSHAL_H_
#define _VAPBSHAL_H_
#include "stdio.h"
/**
* @ingroup Vhal
* @author David Gohara
* @brief Return code enumerations
* @note Note that the enumerated values are opposite the standard for FAILURE and SUCCESS
*/
enum eVrc_Codes {
VRC_WARNING=-1, /** A non-fatal error */
VRC_FAILURE=0, /** A fatal error */
VRC_SUCCESS=1 /** A successful execution */
};
typedef enum eVrc_Codes Vrc_Codes;
/**
* @ingroup Vhal
* @author David Gohara
* @brief Solution Method enumerations
* @note Note that the enumerated values are opposite the standard for FAILURE and SUCCESS
*/
enum eVsol_Meth {
VSOL_CGMG, /* 0: conjugate gradient multigrid */
VSOL_Newton, /* 1: newton */
VSOL_MG, /* 2: multigrid */
VSOL_CG, /* 3: conjugate gradient */
VSOL_SOR, /* 4: sucessive overrelaxation */
VSOL_RBGS, /* 5: red-black gauss-seidel */
VSOL_WJ, /* 6: weighted jacobi */
VSOL_Richardson,/* 7: richardson */
VSOL_CGMGAqua, /* 8: conjugate gradient multigrid aqua */
VSOL_NewtonAqua /* 9: newton aqua */
};
typedef enum eVsol_Meth Vsol_Meth;
/**
* @ingroup Vhal
* @author Nathan Baker
* @brief Types of molecular surface definitions
*/
enum eVsurf_Meth {
VSM_MOL=0, /**< Ion accessibility is defined using inflated van der Waals
* radii, the dielectric coefficient ( ) is defined using the
* molecular (Conolly) surface definition without
* smoothing */
VSM_MOLSMOOTH=1, /**< As VSM_MOL but with a simple harmonic average
* smoothing */
VSM_SPLINE=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. */
VSM_SPLINE3=3, /**< A 5th order polynomial spline is used to create
* a smoothly varying characteristic function
* (continuity through 2nd derivatives) for surface
* based paramters. */
VSM_SPLINE4=4 /**< A 7th order polynomial spline is used to create
* a smoothly varying characteristic function
* (continuity through 3rd derivatives) for surface
* based paramters. */
};
/** @typedef Vsurf_Meth
* @ingroup Vhal
* @brief Declaration of the Vsurf_Meth type as the Vsurf_Meth enum
*/
typedef enum eVsurf_Meth Vsurf_Meth;
/**
* @brief Version of PBE to solve
* @ingroup Vhal
*/
enum eVhal_PBEType {
PBE_LPBE, /**< Traditional Poisson-Boltzmann equation, linearized */
PBE_NPBE, /**< Traditional Poisson-Boltzmann equation, full */
PBE_LRPBE, /**< Regularized Poisson-Boltzmann equation, linearized */
PBE_NRPBE, /** < Regularized Poisson-Boltzmann equation, full */
PBE_SMPBE /**< SM PBE */
};
/**
* @brief Declaration of the Vhal_PBEType type as the Vhal_PBEType enum
* @ingroup Vhal
*/
typedef enum eVhal_PBEType Vhal_PBEType;
/**
* @brief Type of ipkey to use for MG methods
* @ingroup Vhal
*/
enum eVhal_IPKEYType {
IPKEY_SMPBE = -2, /**< SMPBE ipkey */
IPKEY_LPBE, /**< LPBE ipkey */
IPKEY_NPBE /**< NPBE ipkey */
};
/**
* @brief Declaration of the Vhal_IPKEYType type as the Vhal_IPKEYType enum
* @ingroup Vhal
*/
typedef enum eVhal_IPKEYType Vhal_IPKEYType;
/**
* @brief Type of nonlinear to use for MG methods
* @ingroup Vhal
*/
enum eVhal_NONLINType {
NONLIN_LPBE = 0,
NONLIN_NPBE,
NONLIN_SMPBE,
NONLIN_LPBEAQUA,
NONLIN_NPBEAQUA
};
/**
* @brief Declaration of the Vhal_NONLINType type as the Vhal_NONLINType enum
* @ingroup Vhal
*/
typedef enum eVhal_NONLINType Vhal_NONLINType;
/**
* @brief Output file format
* @ingroup Vhal
*/
enum eVoutput_Format {
OUTPUT_NULL, /**< No output */
OUTPUT_FLAT, /**< Output in flat-file format */
};
/**
* @brief Declaration of the Voutput_Format type as the VOutput_Format enum
* @ingroup Vhal
*/
typedef enum eVoutput_Format Voutput_Format;
/**
* @ingroup Vhal
* @author Nathan Baker
* @brief Types of boundary conditions
*/
enum eVbcfl {
BCFL_ZERO=0, /**< Zero Dirichlet boundary conditions */
BCFL_SDH=1, /**< Single-sphere Debye-Huckel Dirichlet boundary
* condition */
BCFL_MDH=2, /**< Multiple-sphere Debye-Huckel Dirichlet boundary
* condition */
BCFL_UNUSED=3, /**< Unused boundary condition method (placeholder) */
BCFL_FOCUS=4, /**< Focusing Dirichlet boundary condition */
BCFL_MEM=5, /**< Focusing membrane boundary condition */
BCFL_MAP=6 /**< Skip first level of focusing use an external map */
};
/**
* @brief Declare Vbcfl type
* @ingroup Vhal
*/
typedef enum eVbcfl Vbcfl;
/**
* @ingroup Vhal
* @author Nathan Baker
* @brief Types of charge discretization methods
*/
enum eVchrg_Meth {
VCM_TRIL=0, /**< Trilinear interpolation of charge to 8 nearest grid
* points. The traditional method; not particularly good to
* use with PBE forces. */
VCM_BSPL2=1, /**< Cubic B-spline across nearest- and
* next-nearest-neighbors. Mainly for use in grid-sensitive
* applications (such as force calculations). */
VCM_BSPL4=2 /**< 5th order B-spline for AMOEBA permanent multipoles. */
};
/** @typedef Vchrg_Meth
* @ingroup Vhal
* @brief Declaration of the Vchrg_Meth type as the Vchrg_Meth enum
*/
typedef enum eVchrg_Meth Vchrg_Meth;
/**
* @ingroup Vhal
* @author Michael Schnieders
* @brief Charge source
*/
enum eVchrg_Src {
VCM_CHARGE=0, /**< Partial Charge source distribution */
VCM_PERMANENT=1, /**< Permanent Multipole source distribution */
VCM_INDUCED=2, /**< Induced Dipole source distribution */
VCM_NLINDUCED=3 /**< NL Induced Dipole source distribution */
};
/** @typedef Vchrg_Src
* @ingroup Vhal
* @brief Declaration of the Vchrg_Src type as the Vchrg_Meth enum
*/
typedef enum eVchrg_Src Vchrg_Src;
/**
* @ingroup Vhal
* @author Nathan Baker
* @brief Types of (scalar) data that can be written out of APBS
*/
enum eVdata_Type {
VDT_CHARGE, /**< Charge distribution (e) */
VDT_POT, /**< Potential (kT/e) */
VDT_ATOMPOT, /**< Atom potential (kT/e) */
VDT_SMOL, /**< Solvent accessibility defined by molecular/Connolly
* surface definition (1 = accessible, 0 = inaccessible) */
VDT_SSPL, /**< Spline-based solvent accessibility (1 = accessible, 0 =
* inaccessible) */
VDT_VDW, /**< van der Waals-based accessibility (1 = accessible, 0 =
* inaccessible) */
VDT_IVDW, /**< Ion accessibility/inflated van der Waals (1 =
* accessible, 0 = inaccessible) */
VDT_LAP, /**< Laplacian of potential (kT/e/A^2) */
VDT_EDENS, /**< Energy density \f$\epsilon (\nabla u)^2\f$, where \f$u\f$
* is potential (kT/e/A)^2 */
VDT_NDENS, /**< Ion number density \f$\sum c_i \exp (-q_i u)^2\f$,
* where \f$u\f$ is potential (output in M) */
VDT_QDENS, /**< Ion charge density \f$\sum q_i c_i \exp (-q_i u)^2\f$,
* where \f$u\f$ is potential (output in \f$e_c M\f$) */
VDT_DIELX, /**< Dielectric x-shifted map as calculated with the currently
* specified scheme (dimensionless) */
VDT_DIELY, /**< Dielectric y-shifted map as calculated with the currently
* specified scheme (dimensionless) */
VDT_DIELZ, /**< Dielectric y-shifted map as calculated with the currently
* specified scheme (dimensionless) */
VDT_KAPPA /**< Kappa map as calculated with the currently
* specified scheme (\f$\AA^{-3}\f$) */
};
/** @typedef Vdata_Type
* @ingroup Vhal
* @brief Declaration of the Vdata_Type type as the Vdata_Type enum
*/
typedef enum eVdata_Type Vdata_Type;
/**
* @ingroup Vhal
* @author Nathan Baker
* @brief Format of data for APBS I/O
*/
enum eVdata_Format {
VDF_DX=0, /**< OpenDX (Data Explorer) format */
VDF_UHBD=1, /**< UHBD format */
VDF_AVS=2, /**< AVS UCD format */
VDF_MCSF=3, /**< FEtk MC Simplex Format (MCSF) */
VDF_GZ=4, /**< Binary file (GZip) */
VDF_FLAT=5, /**< Write flat file */
VDF_DXBIN=6 /**< OpendDX (Data Explorer) binary format */
};
/** @typedef Vdata_Format
* @ingroup Vhal
* @brief Declaration of the Vdata_Format type as the Vdata_Format enum
*/
typedef enum eVdata_Format Vdata_Format;
/**
* @brief APBS total execution timer ID
* @ingroup Vhal
*/
#define APBS_TIMER_WALL_CLOCK 26
/**
* @brief APBS setup timer ID
* @ingroup Vhal
*/
#define APBS_TIMER_SETUP 27
/**
* @brief APBS solver timer ID
* @ingroup Vhal
*/
#define APBS_TIMER_SOLVER 28
/**
* @brief APBS energy timer ID
* @ingroup Vhal
*/
#define APBS_TIMER_ENERGY 29
/**
* @brief APBS force timer ID
* @ingroup Vhal
*/
#define APBS_TIMER_FORCE 30
/**
* @brief APBS temp timer #1 ID
* @ingroup Vhal
*/
#define APBS_TIMER_TEMP1 31
/**
* @brief APBS temp timer #2 ID
* @ingroup Vhal
*/
#define APBS_TIMER_TEMP2 32
/** @brief The maximum number of molecules that can be involved in a single
* PBE calculation
* @ingroup Vhal
*/
#define MAXMOL 5
/** @brief The maximum number of ion species that can be involved in a single
* PBE calculation
* @ingroup Vhal
*/
#define MAXION 10
/** @brief The maximum number of times an MG calculation can be focused
* @ingroup Vhal
*/
#define MAXFOCUS 5
/** @brief Minimum number of levels in a multigrid calculations
* @ingroup Vhal
*/
#define VMGNLEV 4
/** @brief Maximum reduction of grid spacing during a focusing calculation
* @ingroup Vhal
*/
#define VREDFRAC 0.25
/** @brief Number of vertices per simplex (hard-coded to 3D)
* @ingroup Vhal
*/
#define VAPBS_NVS 4
/** @brief Our dimension
* @ingroup Vhal
*/
#define VAPBS_DIM 3
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_RIGHT 0
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_FRONT 1
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_UP 2
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_LEFT 3
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_BACK 4
/** @brief Face definition for a volume
* @note Consistent with PMG if RIGHT = EAST, BACK = SOUTH
* @ingroup Vhal
*/
#define VAPBS_DOWN 5
/** @brief A small number used in Vpmg to decide if points are on/off
* grid-lines or non-zer0 (etc.)
* @ingroup Vhal
*/
#define VPMGSMALL 1e-12
/** @brief Used to set the min values acceptable for sinh chopping
* @def SINH_MIN
* @ingroup Vhal
*/
#define SINH_MIN -85.0
/** @brief Used to set the max values acceptable for sinh chopping
* @def SINH_MAX
* @ingroup Vhal
*/
#define SINH_MAX 85.0
#define MAX_HASH_DIM 75
#if defined(VDEBUG)
# if !defined(APBS_NOINLINE)
# define APBS_NOINLINE 1
# endif
#endif
#if !defined(APBS_NOINLINE)
/** @brief Turns on inlining macros in Vacc class if defined
* @ingroup Vhal
*/
# define VINLINE_VACC
/** @brief Turns on inlining macros in Vatom class if defined
* @ingroup Vhal
*/
# define VINLINE_VATOM
/** @brief Turns on inlining macros in Vcsm class if defined
* @ingroup Vhal
*/
# define VINLINE_VCSM
/** @brief Turns on inlining macros in Vpbe class if defined
* @ingroup Vhal
*/
# define VINLINE_VPBE
/** @brief Turns on inlining macros in Vpee class if defined
* @ingroup Vhal
*/
# define VINLINE_VPEE
/** @brief Turns on inlining macros in Vgreen class if defined
* @ingroup Vhal
*/
# define VINLINE_VGREEN
/** @brief Turns on inlining macros in Vfetk class if defined
* @ingroup Vhal
*/
# define VINLINE_VFETK
/** @brief Turns on inlining macros in Vpmg class if defined
* @ingroup Vhal
*/
# define VINLINE_VPMG
/** @brief Defines the maximum hash table size in any direction
* @ingroup Vhal
*/
#endif
/* Fortran name mangling */
#if defined(VF77_UPPERCASE)
# if defined(VF77_NOUNDERSCORE)
# define VF77_MANGLE(name,NAME) NAME
# elif defined(VF77_ONEUNDERSCORE)
# define VF77_MANGLE(name,NAME) NAME ## _
# else
# define VF77_MANGLE(name,NAME) name
# endif
#else
# if defined(VF77_NOUNDERSCORE)
# define VF77_MANGLE(name,NAME) name
# elif defined(VF77_ONEUNDERSCORE)
# define VF77_MANGLE(name,NAME) name ## _
# else
/** @brief Name-mangling macro for using FORTRAN functions in C code
* @ingroup Vhal
*/
# define VF77_MANGLE(name,NAME) name
# endif
#endif
/* Floating Point Error */
#if defined(FLOAT_EPSILON)
# define VFLOOR(value) \
((floor(value) != floor(value + FLOAT_EPSILON)) ? \
floor(value + FLOAT_EPSILON) : floor(value))
#else
/** @brief Wrapped floor to fix floating point issues in the Intel
* compiler
* @author Todd Dolinksy
* @ingroup Vhal
*/
# define VFLOOR(value) floor(value)
#endif
/* String embedding for ident */
#if defined(HAVE_EMBED)
/**
* @brief Allows embedding of RCS ID tags in object files.
* @author Mike Holst
* @ingroup Vhal */
# define VEMBED(rctag) \
VPRIVATE const char* rctag; \
static void* use_rcsid=(0 ? &use_rcsid : (void**)&rcsid);
#else
/**
* @brief Allows embedding of RCS ID tags in object files.
* @author Mike Holst
* @ingroup Vhal */
# define VEMBED(rctag)
#endif /* if defined(HAVE_EMBED) */
/** OS specific flags and etcetera */
#if !defined(_WIN32) || defined(__MINGW32__)
#define PRINT_FUNC __PRETTY_FUNCTION__
#define OS_SEP_STR "/"
#define OS_SEP_CHAR '/'
#else
#define OS_SEP_STR "\\"
#define OS_SEP_CHAR '\\'
#define PRINT_FUNC __FUNCSIG__
#define snprintf sprintf_s
#endif
#ifdef VERGBOSE_DEBUG
#define ANNOUNCE_FUNCTION \
do { \
Vnm_prrint(2, "%s() [%s:%d]\n", \
PRINT_FUNC, __FILE__, __LINE__ ); \
} while(0)
#define WARN_UNTESTED \
do { \
Vnm_print(2, "%s() [%s:%d]: Untested Translation!\n", \
__FUNCTION__, __FILE__, __LINE__); \
} while(0)
#define WARN_PARTTESTED \
do{ \
Vnm_print(2, "%s() [%s:%d]: Partially Tested Translation.\n", \
__FUNCTION__, __FILE__, __LINE__); \
} while(0)
#else
#define ANNOUNCE_FUNCTION
#define WARN_UNTESTED
#define WARN_PARTTESTED
#endif
/* Utility messages. Print out messages with location information */
#ifdef DEBUG
#define VCHANNELEDMESSAGE0(channel, msg) \
do { \
Vnm_print(channel, "%s:%d [%s()]: MESSAGE:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, msg); \
} while(0)
#define VCHANNELEDMESSAGE1(channel, msg, arg) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg ); \
Vnm_print(channel, "%s:%d [%s()]: MESSAGE:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, buff); \
} while(0)
#define VCHANNELEDMESSAGE2(channel, msg, arg0, arg1) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1 ); \
Vnm_print(channel, "%s:%d [%s()]: MESSAGE:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, buff); \
} while(0)
#define VCHANNELEDMESSAGE3(channel, msg, arg0, arg1, arg2) \
do { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0, arg1, arg2); \
Vnm_print(channel, "%s:%d [%s()]: MESSAGE:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, buff); \
} while(0)
#define VMESSAGE0(msg) VCHANNELEDMESSAGE0(2, msg)
#define VMESSAGE1(msg, arg0) VCHANNELEDMESSAGE1(2, msg, arg0)
#define VMESSAGE2(msg, arg0, arg1) VCHANNELEDMESSAGE2(2, msg, arg0, arg1)
#define VMESSAGE3(msg, arg0, arg1, arg2) VCHANNELEDMESSAGE3(2, msg, arg0, arg1, arg2)
#define VERRMSG0(msg) VMESSAGE0(msg)
#define VERRMSG1(msg, arg0) VMESSAGE1(msg, arg0)
#define VERRMSG2(msg, arg0, arg1) VMESSAGE2(msg, arg0, arg1)
#define VERRMSG3(msg, arg0, arg1, arg2) VMESSAGE3(msg, arg0, arg1, arg2)
#else
#define VCHANNELEDMESSAGE0(channel, msg) \
do { \
Vnm_print(channel, "%s: %s\n", __FUNCTION__, msg); \
} while(0)
#define VCHANNELEDMESSAGE1(channel, msg, arg0) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0 ); \
Vnm_print(channel, "%s: %s\n", __FUNCTION__, buff); \
} while(0)
#define VCHANNELEDMESSAGE2(channel, msg, arg0, arg1) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1 ); \
Vnm_print(channel, "%s: %s\n", __FUNCTION__, buff); \
} while(0)
#define VCHANNELEDMESSAGE3(channel, msg, arg0, arg1, arg2) \
do { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0, arg1, arg2); \
Vnm_print(channel, "%s: %s\n", __FUNCTION__, buff); \
} while(0)
#define VMESSAGE0(msg) VCHANNELEDMESSAGE0(0, msg)
#define VMESSAGE1(msg, arg0) VCHANNELEDMESSAGE1(0, msg, arg0)
#define VMESSAGE2(msg, arg0, arg1) VCHANNELEDMESSAGE2(0, msg, arg0, arg1)
#define VMESSAGE3(msg, arg0, arg1, arg2) VCHANNELEDMESSAGE3(0, msg, arg0, arg1, arg2)
#define VERRMSG0(msg) VCHANNELEDMESSAGE0(2, msg)
#define VERRMSG1(msg, arg0) VCHANNELEDMESSAGE1(2, msg, arg0)
#define VERRMSG2(msg, arg0, arg1) VCHANNELEDMESSAGE2(2, msg, arg0, arg1)
#define VERRMSG3(msg, arg0, arg1, arg2) VCHANNELEDMESSAGE3(2, msg, arg0, arg1, arg2)
#endif
/* Utility assertions. If they fail, they print out messages with possible
* arguments and then abort
* The do{...} while(0) simply enforces that a semicolon appears at the end
*/
#ifdef DEBUG
#define VASSERT_MSG0(cnd, msg) \
do { \
if( (cnd) == 0 ) { \
Vnm_print(2, "%s:%d [%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, #cnd, msg); \
abort(); \
} \
} while(0)
#define VASSERT_MSG1(cnd, msg, arg) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg ); \
Vnm_print(2, "%s:%d [%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, #cnd, buff); \
abort(); \
} \
} while(0)
#define VASSERT_MSG2(cnd, msg, arg0, arg1) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1 ); \
Vnm_print(2, "%s:%d [%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, #cnd, buff); \
abort(); \
} \
} while(0)
#else
#define VASSERT_MSG0(cnd, msg) \
do { \
if( (cnd) == 0 ) { \
Vnm_print(2, "%[%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FUNCTION__, #cnd, msg); \
abort(); \
} \
} while(0)
#define VASSERT_MSG1(cnd, msg, arg) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg ); \
Vnm_print(2, "[%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FUNCTION__, #cnd, buff); \
abort(); \
} \
} while(0)
#define VASSERT_MSG2(cnd, msg, arg0, arg1) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1 ); \
Vnm_print(2, "[%s()]: ERROR:\n" \
" Assertion Failed (%s): %s\n\n", \
__FUNCTION__, #cnd, buff); \
abort(); \
} \
} while(0)
#endif
/* Utility warning. Tests a condition and if it fails prints out a message
* with optional arguments
* The do{...} while(0) simply enforces that a semicolon at the end
*/
#ifdef DEBUG
#define VWARN_MSG0(cnd, msg) \
do { \
if( (cnd) == 0 ) { \
Vnm_print( \
2, \
"%s:%d [%s()]: WARNING:\n" \
" Condition Failed (%s):\n %s\n\n", \
__FILE__, \
__LINE__, \
__FUNCTION__, \
#cnd, \
msg \
); \
} \
} while(0)
#define VWARN_MSG1(cnd, msg, arg0) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0); \
Vnm_print( \
2, \
"%s:%d [%s()]: WARNING:\n" \
" Condition Failed (%s):\n %s\n\n", \
__FILE__, \
__LINE__, \
__FUNCTION__, \
#cnd, \
buff \
); \
} \
} while(0)
#define VWARN_MSG2(cnd, msg, arg0, arg1) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0, arg1); \
Vnm_print( \
2, \
"%s:%d [%s()]: WARNING:\n" \
" Condition Failed (%s):\n %s\n\n", \
__FILE__, \
__LINE__, \
__FUNCTION__, \
#cnd, \
buff \
); \
} \
} while(0)
#else
#define VWARN_MSG0(cnd, msg) \
do { \
if( (cnd) == 0 ) { \
Vnm_print( \
2, \
"[%s()]: WARNING:\n" \
" %s\n\n", \
__FUNCTION__, \
msg \
); \
} \
} while(0)
#define VWARN_MSG1(cnd, msg, arg0) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0); \
Vnm_print( \
2, \
"[%s()]: WARNING:\n" \
" %s\n\n", \
__FUNCTION__, \
buff \
); \
} \
} while(0)
#define VWARN_MSG2(cnd, msg, arg0, arg1) \
do { \
if( (cnd) == 0 ) { \
char buff[1000]; \
snprintf(buff, 1000, msg, arg0, arg1); \
Vnm_print( \
2, \
"[%s()]: WARNING:\n" \
" %s\n\n", \
__FUNCTION__, \
buff \
); \
} \
} while(0)
#endif
/* Utility Abort. Prints a message with optional arugments and aborts */
#ifdef DEBUG
#define VABORT_MSG0(msg) \
do { \
Vnm_print(2, "%s:%d [%s()]: ABORTING:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, msg); \
abort(); \
} while(0)
#define VABORT_MSG1(msg, arg) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg ); \
Vnm_print(2, "%s:%d [%s()]: ABORTING:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, buff); \
abort(); \
} while(0)
#define VABORT_MSG2(msg, arg0, arg1) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1); \
Vnm_print(2, "%s:%d [%s()]: ABORTING:\n" \
" %s\n\n", \
__FILE__, __LINE__, __FUNCTION__, buff); \
abort(); \
} while(0)
#else
#define VABORT_MSG0(msg) \
do { \
Vnm_print(2, "%[%s()]: ABORTING:\n" \
" %s\n\n", \
__FUNCTION__, msg); \
abort(); \
} while(0)
#define VABORT_MSG1(msg, arg) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg ); \
Vnm_print(2, "[%s()]: ABORTING:\n" \
" %s\n\n", \
__FUNCTION__, buff); \
abort(); \
} while(0)
#define VABORT_MSG2(msg, arg0, arg1) \
do { \
char buff[1000]; \
snprintf( buff, 1000, msg, arg0, arg1); \
Vnm_print(2, "[%s()]: ABORTING:\n" \
" %s\n\n", \
__FUNCTION__, buff); \
abort(); \
} while(0)
#endif
/* Utility expression printers. Print the expression and its value */
#ifdef DEBUG
#define PRINT_INT(expr) \
do { \
Vnm_print(2, "%s:%d [%s()]: %s == %d\n", \
__FILE__, __LINE__, __FUNCTION__, #expr, expr); \
} while(0)
#define PRINT_DBL(expr) \
do { \
Vnm_print(2, "%s:%d [%s()]: %s == %f\n\n", \
__FILE__, __LINE__, __FUNCTION__, #expr, expr); \
} while(0)
#else
#define PRINT_INT(expr)
#define PRINT_DBL(expr)
#endif
#define VMALLOC(vmem, n, type) ((type*)Vmem_malloc(vmem, n, sizeof(type)))
#define VFREE(vmem, n, type, ptr) (Vmem_free(vmem, n, sizeof(type), (void **)&(ptr)))
#define VFILL(vec, n, val) \
do { \
int fill_idx; \
for (fill_idx = 0; fill_idx < n; fill_idx++) \
vec[fill_idx] = val; \
} while(0)
#define VCOPY(srcvec, dstvec, i, n) \
do { \
for (i = 0; i < n; i++) \
dstvec[i] = srcvec[i]; \
} while(0)
char* wrap_text( char* str, int right_margin, int left_padding );
#define VAT(array, i) ((array)[(i) - 1])
#define RAT(array, i) ((array) + i - 1)
#endif /* #ifndef _VAPBSHAL_H_ */