Subversion Repositories public iLand

Rev

Rev 705 | Rev 707 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 705 Rev 706
1
Redirecting to URL 'https://iland.boku.ac.at/svn/iland/tags/release_1.0/src/core/global.h':
1
Redirecting to URL 'https://iland.boku.ac.at/svn/iland/tags/release_1.0/src/core/global.h':
2
/********************************************************************************************
2
/********************************************************************************************
3
**    iLand - an individual based forest landscape and disturbance model
3
**    iLand - an individual based forest landscape and disturbance model
4
**    http://iland.boku.ac.at
4
**    http://iland.boku.ac.at
5
**    Copyright (C) 2009-  Werner Rammer, Rupert Seidl
5
**    Copyright (C) 2009-  Werner Rammer, Rupert Seidl
6
**
6
**
7
**    This program is free software: you can redistribute it and/or modify
7
**    This program is free software: you can redistribute it and/or modify
8
**    it under the terms of the GNU General Public License as published by
8
**    it under the terms of the GNU General Public License as published by
9
**    the Free Software Foundation, either version 3 of the License, or
9
**    the Free Software Foundation, either version 3 of the License, or
10
**    (at your option) any later version.
10
**    (at your option) any later version.
11
**
11
**
12
**    This program is distributed in the hope that it will be useful,
12
**    This program is distributed in the hope that it will be useful,
13
**    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
**    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
**    GNU General Public License for more details.
15
**    GNU General Public License for more details.
16
**
16
**
17
**    You should have received a copy of the GNU General Public License
17
**    You should have received a copy of the GNU General Public License
18
**    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
**    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
********************************************************************************************/
19
********************************************************************************************/
20
20
21
#ifndef GLOBAL_H
21
#ifndef GLOBAL_H
22
#define GLOBAL_H
22
#define GLOBAL_H
23
23
24
#define MSGRETURN(x) { qDebug() << x; return; }
24
#define MSGRETURN(x) { qDebug() << x; return; }
25
#define WARNINGRETURN(x) { qWarning() << x; return; }
25
#define WARNINGRETURN(x) { qWarning() << x; return; }
26
#define ERRORRETURN(x) { qError() << x; return; }
26
#define ERRORRETURN(x) { qError() << x; return; }
27
// conversions rad/degree
27
// conversions rad/degree
28
#define RAD(x) (x*M_PI/180.)
28
#define RAD(x) (x*M_PI/180.)
29
#define GRAD(x) (x/M_PI*180.)
29
#define GRAD(x) (x/M_PI*180.)
30
#define PI2 2*M_PI
30
#define PI2 2*M_PI
31
31
32
-
 
-
 
32
#include <cstdlib>
-
 
33
#include "math.h"
33
#include "exception.h"
34
#include "exception.h"
34
// general datatypes
35
// general datatypes
35
//typedef int TreeSpecies;
36
//typedef int TreeSpecies;
36
37
37
// global debug helpers (used by macros!)
38
// global debug helpers (used by macros!)
38
void dbg_helper(const char *where, const char *what,const char* file,int line);
39
void dbg_helper(const char *where, const char *what,const char* file,int line);
39
void dbg_helper_ext(const char *where, const char *what,const char* file,int line, const QString &s);
40
void dbg_helper_ext(const char *where, const char *what,const char* file,int line, const QString &s);
40
41
41
// change to enabled detailed debug messages.
42
// change to enabled detailed debug messages.
42
// if NO_DEBUG_MSGS is defined, NO debug outputs are generated.
43
// if NO_DEBUG_MSGS is defined, NO debug outputs are generated.
43
#if defined(QT_NO_DEBUG)
44
#if defined(QT_NO_DEBUG)
44
#define NO_DEBUG_MSGS
45
#define NO_DEBUG_MSGS
45
#endif
46
#endif
46
47
47
#if !defined(DBG_IF)
48
#if !defined(DBG_IF)
48
#  ifndef NO_DEBUG_MSGS
49
#  ifndef NO_DEBUG_MSGS
49
#    define DBG_IF(cond, where, what) ((cond) ? dbg_helper(where, what, __FILE__, __LINE__) : qt_noop())
50
#    define DBG_IF(cond, where, what) ((cond) ? dbg_helper(where, what, __FILE__, __LINE__) : qt_noop())
50
#  else
51
#  else
51
#    define DBG_IF(cond, where, what) qt_noop()
52
#    define DBG_IF(cond, where, what) qt_noop()
52
#  endif
53
#  endif
53
#endif
54
#endif
54
55
55
#if !defined(DBG_IF_X)
56
#if !defined(DBG_IF_X)
56
#  ifndef NO_DEBUG_MSGS
57
#  ifndef NO_DEBUG_MSGS
57
#    define DBG_IF_X(cond, where, what,more) ((cond) ? dbg_helper_ext(where, what, __FILE__, __LINE__,more) : qt_noop())
58
#    define DBG_IF_X(cond, where, what,more) ((cond) ? dbg_helper_ext(where, what, __FILE__, __LINE__,more) : qt_noop())
58
#  else
59
#  else
59
#    define DBG_IF_X(cond, where, what,more) qt_noop()
60
#    define DBG_IF_X(cond, where, what,more) qt_noop()
60
#  endif
61
#  endif
61
#endif
62
#endif
62
63
63
#if !defined(DBGMODE)
64
#if !defined(DBGMODE)
64
#  ifndef NO_DEBUG_MSGS
65
#  ifndef NO_DEBUG_MSGS
65
#    define DBGMODE(stmts) { stmts }
66
#    define DBGMODE(stmts) { stmts }
66
#  else
67
#  else
67
#    define DBGMODE(stmts) qt_noop()
68
#    define DBGMODE(stmts) qt_noop()
68
#  endif
69
#  endif
69
#endif
70
#endif
70
71
71
// log level functions
72
// log level functions
72
bool logLevelDebug(); // true, if detailed debug information is logged
73
bool logLevelDebug(); // true, if detailed debug information is logged
73
bool logLevelInfo(); // true, if only important aggreate info is logged
74
bool logLevelInfo(); // true, if only important aggreate info is logged
74
bool logLevelWarning(); // true if only severe warnings/errors are logged.
75
bool logLevelWarning(); // true if only severe warnings/errors are logged.
75
void setLogLevel(int loglevel); // setter function
76
void setLogLevel(int loglevel); // setter function
76
// choose the random number generator:
77
// choose the random number generator:
77
// either:
78
// either:
78
// cool random number generator (using the mersenne-twister) by http://www-personal.umich.edu/~wagnerr/MersenneTwister.html
79
// cool random number generator (using the mersenne-twister) by http://www-personal.umich.edu/~wagnerr/MersenneTwister.html
79
// #include "../3rdparty/MersenneTwister.h"
-
 
-
 
80
#include "../3rdparty/MersenneTwister.h"
80
// or
81
// or
81
#include "randomwell.h"
-
 
-
 
82
//#include "randomwell.h"
82
83
83
MTRand *randomGenerator(); // static object lives in globalsettings
84
MTRand *randomGenerator(); // static object lives in globalsettings
84
/// nrandom returns a random number from [p1, p2] -> p2 is a possible result!
85
/// nrandom returns a random number from [p1, p2] -> p2 is a possible result!
85
inline double nrandom(const double& p1, const double& p2)
86
inline double nrandom(const double& p1, const double& p2)
86
{
87
{
87
    return p1 + randomGenerator()->rand(p2-p1);
88
    return p1 + randomGenerator()->rand(p2-p1);
88
    //return p1 + (p2-p1)*(rand()/double(RAND_MAX));
89
    //return p1 + (p2-p1)*(rand()/double(RAND_MAX));
89
}
90
}
90
/// returns a random number in [0,1] (i.e.="1" is a possible result!)
91
/// returns a random number in [0,1] (i.e.="1" is a possible result!)
91
inline double drandom()
92
inline double drandom()
92
{
93
{
93
    return randomGenerator()->rand();
94
    return randomGenerator()->rand();
94
    //return rand()/double(RAND_MAX);
95
    //return rand()/double(RAND_MAX);
95
}
96
}
96
/// return a random number from "from" to "to" (incl.), i.e. irandom(3,5) results in 3, 4 or 5.
97
/// return a random number from "from" to "to" (incl.), i.e. irandom(3,5) results in 3, 4 or 5.
97
inline int irandom(int from, int to)
98
inline int irandom(int from, int to)
98
{
99
{
99
    return from + randomGenerator()->randInt(to-from);
100
    return from + randomGenerator()->randInt(to-from);
100
    //return from +  rand()%(to-from);
101
    //return from +  rand()%(to-from);
101
}
102
}
102
103
103
// random number function with additional ptr to random function
104
// random number function with additional ptr to random function
104
inline double nrandom(MTRand *random, const double& p1, const double& p2)
105
inline double nrandom(MTRand *random, const double& p1, const double& p2)
105
{
106
{
106
    return p1 + random->rand(p2-p1);
107
    return p1 + random->rand(p2-p1);
107
    //return p1 + (p2-p1)*(rand()/double(RAND_MAX));
108
    //return p1 + (p2-p1)*(rand()/double(RAND_MAX));
108
}
109
}
109
/// returns a random number in [0,1] (i.e.="1" is a possible result!)
110
/// returns a random number in [0,1] (i.e.="1" is a possible result!)
110
inline double drandom(MTRand *random)
111
inline double drandom(MTRand *random)
111
{
112
{
112
    return random->rand();
113
    return random->rand();
113
    //return rand()/double(RAND_MAX);
114
    //return rand()/double(RAND_MAX);
114
}
115
}
115
/// return a random number from "from" to "to" (incl.), i.e. irandom(3,5) results in 3, 4 or 5.
116
/// return a random number from "from" to "to" (incl.), i.e. irandom(3,5) results in 3, 4 or 5.
116
inline int irandom(MTRand *random, int from, int to)
117
inline int irandom(MTRand *random, int from, int to)
117
{
118
{
118
    return from + random->randInt(to-from);
119
    return from + random->randInt(to-from);
119
    //return from +  rand()%(to-from);
120
    //return from +  rand()%(to-from);
120
}
121
}
121
122
122
123
123
124
124
inline double limit(const double value, const double lower, const double upper)
125
inline double limit(const double value, const double lower, const double upper)
125
{
126
{
126
    return qMax(qMin(value, upper), lower);
127
    return qMax(qMin(value, upper), lower);
127
}
128
}
128
inline int limit(const int value, const int lower, const int upper)
129
inline int limit(const int value, const int lower, const int upper)
129
{
130
{
130
    return qMax(qMin(value, upper), lower);
131
    return qMax(qMin(value, upper), lower);
131
}
132
}
132
inline void setBit(int &rTarget, const int bit, const bool value)
133
inline void setBit(int &rTarget, const int bit, const bool value)
133
{
134
{
134
    if (value)
135
    if (value)
135
        rTarget |= (1 << bit);  // set bit
136
        rTarget |= (1 << bit);  // set bit
136
    else
137
    else
137
        rTarget &= ( (1 << bit) ^ 0xffffff ); // clear bit
138
        rTarget &= ( (1 << bit) ^ 0xffffff ); // clear bit
138
}
139
}
139
inline bool isBitSet(const int value, const int bit)
140
inline bool isBitSet(const int value, const int bit)
140
{
141
{
141
    return value & (1 << bit);
142
    return value & (1 << bit);
142
}
143
}
143
144
144
// define a global isnan() function
145
// define a global isnan() function
-
 
146
#ifndef isnan
145
#define isnan(x) ((x) != (x))
147
#define isnan(x) ((x) != (x))
-
 
148
#endif
146
149
147
#include "globalsettings.h"
150
#include "globalsettings.h"
148
151
149
#endif // GLOBAL_H
152
#endif // GLOBAL_H
150
 
153