AMROC Main     Blockstructured Adaptive Mesh Refinement in object-oriented C++


Main Page   Class Hierarchy   Compound List   File List  

IndexGridData1.h

Go to the documentation of this file.
00001 #ifndef _included_IndexGridData1_h
00002 #define _included_IndexGridData1_h
00003 
00010 #include <generic.h>
00011 
00012 /*
00013 *************************************************************************
00014 *                                                                       *
00015 * Define some looping constructs for GridData.  Note that these will    *
00016 * take either an array or a region as the second argument.              *
00017 *                                                                       *
00018 * Copy the region extents into a local constant integer to aid the      *
00019 * compiler in doing some loop optimizations.                            *
00020 *                                                                       *
00021 *************************************************************************
00022 */
00023 
00024 #ifndef for_1
00025 #define for_1(i, r, s) {                                                \
00026    const int name2(i,_L) = (((r).lower(0)+((r).lower(0)<0?-s(0)+1:s(0)-1))/s(0))*s(0);      \
00027    const int name2(i,_U) = (r).upper(0);                                \
00028    const int name2(si,_S) = (s(0));                                     \
00029    for (register int i = name2(i,_L); i <= name2(i,_U); i+=name2(si,_S)) {
00030 #endif
00031 #ifndef end_for
00032 #define end_for } }
00033 #endif
00034 
00035 /*
00036 *************************************************************************
00037 *                                                                       *
00038 * These macros provide simple access to ``fast indexing'' from C++.     *
00039 * Current C++ compilers do not do a good job of optimizing C++ loops    *
00040 * with array access.  Using these macros should speed up loops by a     *
00041 * factor of about three.  Note that we still use the Fortran indexing   *
00042 * convention.                                                           *
00043 *                                                                       *
00044 * These macros should be used as follows:                               *
00045 *                                                                       *
00046 *       BeginFastIndex1(a, double);                                     *
00047 *       for_1(i, a)                                                     *
00048 *          FastIndex1(a, i) = 0.0;                                      *
00049 *       end_for                                                         *
00050 *       EndFastIndex1(a);                                               *
00051 *                                                                       *
00052 *************************************************************************
00053 */
00054 
00055 #ifndef BeginFastIndex1
00056 #define BeginFastIndex1(a, b, d, type) {                                \
00057 const int   name2(a,_B)  = b.bottom();                                  \
00058 type *const name2(a,_D)  = d;                                           \
00059 const int   name2(a,_s0) = b.stepsize(0)
00060 #define FastIndex1(a, i)                                                \
00061 name2(a,_D)[name2(a,_B)+((i)/name2(a,_s0))]
00062 #define EndFastIndex1(a) }
00063 #endif
00064 
00065 #endif


Quickstart     Users Guide     Programmers Reference     Installation      Examples     Download



AMROC Main      Home      Contact
last update: 06/01/04