1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*@@
@file MaskUtils.c
@date October 2002
@author Denis Pollney
@desc
Function prototypes and macros mask utilities.
@desc
@version $Header$
@@*/
#ifndef __CACTUSEINSTEIN_SPACEMASK_H__
#define __CACTUSEINSTEIN_SPACEMASK_H__
#define DEBUG 0
/********************************************************************
********************* Routine Prototypes *************************
********************************************************************/
#ifdef CCODE
#ifdef __cplusplus
extern "C"
{
#endif
int SpaceMask_RegisterType(char*, int, char**);
int SpaceMask_AppendStatesToType(char*, int, char**);
void SpaceMask_SetState(CCTK_INT8*, int, char*, char*);
int SpaceMask_CheckState(CCTK_INT8*, int, char*, char*);
CCTK_INT8 SpaceMask_GetTypeBits(char*);
CCTK_INT8 SpaceMask_GetStateBits(char*, char*);
#ifdef __cplusplus
}
#endif
#endif
/********************************************************************
********************* Local Data Types **********************
********************************************************************/
#ifdef CCODE
typedef struct
{
char* name;
CCTK_INT8 bitmask;
} SpaceMask_State;
typedef struct
{
char* name;
int nstates;
CCTK_INT8 bitmask;
SpaceMask_State** state_list;
} SpaceMask_Type;
typedef struct
{
int ntypes;
SpaceMask_Type** type_list;
} SpaceMask_Registry;
extern SpaceMask_Registry* spacemask_Registry;
#endif
/********************************************************************
********************* Macros ******************************
********************************************************************/
/*@@
@routine SpaceMask_SetStateBits
@author Denis Pollney
@date 15 October 2002
@desc
Sets the mask at a point to the given state, as specified
using a bitmask.
@enddesc
@@*/
#ifdef FCODE
#define SpaceMask_SetStateBitsF90(mask, i, j, k, type_bits, state_bits) \
mask(i,j,k) = ior(iand(mask(i,j,k), not(type_bits)), state_bits)
#endif
#ifdef CCODE
#define SpaceMask_SetStateBits(mask, ijk, type_bits, state_bits) \
mask[ijk] = (mask[ijk] & ~type_bits) | state_bits;
#endif
/*@@
@routine SpaceMask_CheckStateBits
@author Denis Pollney
@date 15 October 2002
@desc
Checks that the mask at a point has the specified state,
in which case return 1, otherwise return 0.
@enddesc
@@*/
#ifdef FCODE
#define SpaceMask_CheckStateBitsF90(mask, i, j, k, type_bits, state_bits) \
(iand(mask(i,j,k), type_bits) .eq. state_bits)
#endif
#ifdef CCODE
#define SpaceMask_CheckStateBits(mask, ijk, type_bits, state_bits) \
(mask[ijk] & type_bits) == state_bits
#endif
#endif /* __CACTUSEINSTEIN_SPACEMASK_H__ */
|