space.h 3.68 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*******************************************************************************
 * This file is part of GadgetSMP.
 * Coypright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 ******************************************************************************/


Pedro Gonnet's avatar
Pedro Gonnet committed
21
22
23
24
25
26


/* Some constants. */
#define space_maxdepth                  10
#define space_cellallocchunk            1000
#define space_splitratio                0.875
Pedro Gonnet's avatar
Pedro Gonnet committed
27
#define space_splitsize_default         400
28
#define space_subsize_default           1000
Pedro Gonnet's avatar
Pedro Gonnet committed
29
#define space_dosub                     1
30
#define space_stretch                   1.0
Pedro Gonnet's avatar
Pedro Gonnet committed
31
32


Pedro Gonnet's avatar
Pedro Gonnet committed
33
34
35
/* Convert cell location to ID. */
#define cell_getid( cdim , i , j , k ) ( (int)(k) + (cdim)[2]*( (int)(j) + (cdim)[1]*(int)(i) ) )

Pedro Gonnet's avatar
Pedro Gonnet committed
36
37
/* Split size. */
extern int space_splitsize;
38
extern int space_subsize;
Pedro Gonnet's avatar
Pedro Gonnet committed
39

Pedro Gonnet's avatar
Pedro Gonnet committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* Map shift vector to sortlist. */
extern const int sortlistID[27];
    
    
/* Entry in a list of sorted indices. */
struct entry {
    float d;
    int i;
    };
    
    
/* The space in which the cells reside. */
struct space {

    /* Spatial extent. */
    double dim[3];
    
    /* Cell widths. */
    double h[3], ih[3];
    
    /* The minimum and maximum cutoff radii. */
61
    double h_min, h_max;
Pedro Gonnet's avatar
Pedro Gonnet committed
62
    
63
64
65
    /* Current time step for particles. */
    float dt;
    
Pedro Gonnet's avatar
Pedro Gonnet committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    /* Number of cells. */
    int nr_cells, tot_cells;
    
    /* Space dimensions in number of cells. */
    int maxdepth, cdim[3];
    
    /* The (level 0) cells themselves. */
    struct cell *cells;
    
    /* Buffer of unused cells. */
    struct cell *cells_new;
    
    /* The particle data (cells have pointers to this). */
    struct part *parts;
80
    struct cpart *cparts;
Pedro Gonnet's avatar
Pedro Gonnet committed
81
82
83
84
85
86
87
88
89
90
91
92
    
    /* The sortlist data (cells hold pointers to these). */
    struct entry *sortlist;
    
    /* The total number of parts in the space. */
    int nr_parts;
    
    /* Is the space periodic? */
    int periodic;
    
    /* The list of tasks. */
    struct task *tasks;
93
    int nr_tasks, tasks_size;
Pedro Gonnet's avatar
Pedro Gonnet committed
94
    int *tasks_ind;
95
96
97
    
    /* General-purpose lock for this space. */
    lock_type lock;
Pedro Gonnet's avatar
Pedro Gonnet committed
98
99
100
101
102
    
    };


/* function prototypes. */
103
void parts_sort ( struct part *parts , int *ind , int N , int min , int max );
Pedro Gonnet's avatar
Pedro Gonnet committed
104
105
struct cell *space_getcell ( struct space *s );
struct task *space_gettask ( struct space *s );
106
struct task *space_addtask ( struct space *s , int type , int subtype , int flags , int wait , struct cell *ci , struct cell *cj , struct task *unlock_tasks[] , int nr_unlock_tasks , struct cell *unlock_cells[] , int nr_unlock_cells );
Pedro Gonnet's avatar
Pedro Gonnet committed
107
108
void space_init ( struct space *s , double dim[3] , struct part *parts , int N , int periodic , double h_max );
void space_maketasks ( struct space *s , int do_sort );
109
void space_map_cells ( struct space *s , int full , void (*fun)( struct cell *c , void *data ) , void *data );
Pedro Gonnet's avatar
Pedro Gonnet committed
110
void space_map_parts ( struct space *s , void (*fun)( struct part *p , struct cell *c , void *data ) , void *data );
Pedro Gonnet's avatar
Pedro Gonnet committed
111
int space_rebuild ( struct space *s , int force , double h_max );
Pedro Gonnet's avatar
Pedro Gonnet committed
112
void space_recycle ( struct space *s , struct cell *c );
113
void space_split ( struct space *s , struct cell *c );
Pedro Gonnet's avatar
Pedro Gonnet committed
114
115
116