Timothy  0.9
Tissue Modelling Framework
 All Data Structures Files Functions Variables Typedefs Macros
grid.c
Go to the documentation of this file.
1 /* **************************************************************************
2  * This file is part of Timothy
3  *
4  * Copyright (c) 2014/15 Maciej Cytowski
5  * Copyright (c) 2014/15 ICM, University of Warsaw, Poland
6  *
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
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  * *************************************************************************/
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <math.h>
26 #include <inttypes.h>
27 
28 #include "global.h"
29 #include "fields.h"
30 
39 {
41  boxVolume = pow((gridResolution / csize) * csizeInUnits * 0.0001, 3);
42  lowerGridCorner.x = 0.0;
43  lowerGridCorner.y = 0.0;
44  lowerGridCorner.z = 0.0;
45  upperGridCorner.x = (double) nx - 1;
46  upperGridCorner.y = (double) ny - 1;
47  upperGridCorner.z = (double) nz - 1;
48 
49 
50  globalGridSize.x = upperGridCorner.x - lowerGridCorner.x + 1;
51  globalGridSize.y = upperGridCorner.y - lowerGridCorner.y + 1;
52  globalGridSize.z = upperGridCorner.z - lowerGridCorner.z + 1;
53 
54  gridI = (int64_t) ((globalGridSize.x + 1) / gridResolution);
55  gridJ = (int64_t) ((globalGridSize.y + 1) / gridResolution);
56  if (sdim == 3)
57  gridK = (int64_t) ((globalGridSize.z + 1) / gridResolution);
58  else
59  gridK = 0;
60 
61  gridI = gridI + (MPIdim[0] - gridI % MPIdim[0]);
62  gridJ = gridJ + (MPIdim[1] - gridJ % MPIdim[1]);
63  if (sdim == 3)
64  gridK = gridK + (MPIdim[2] - gridK % MPIdim[2]);
65 
66  gridSize.x = gridI / MPIdim[0];
67  gridSize.y = gridJ / MPIdim[1];
68  if (sdim == 3)
69  gridSize.z = gridK / MPIdim[2];
70  else
71  gridSize.z = 1;
72 
73  if (MPIrank == 0)
74  printf("Grid size:%" PRId64 "x%" PRId64 "x%" PRId64 "\n", gridI, gridJ,
75  gridK);
76 }
77 
82 {
83  int i, j, k;
84 
85  gridStartIdx =
86  (struct int64Vector3d *) malloc(MPIsize *
87  sizeof(struct int64Vector3d));
88  gridEndIdx =
89  (struct int64Vector3d *) malloc(MPIsize *
90  sizeof(struct int64Vector3d));
91 
92  for (i = 0; i < MPIsize; i++) {
93  gridStartIdx[i].x = gridSize.x * MPIcoords[i][0];
94  gridStartIdx[i].y = gridSize.y * MPIcoords[i][1];
95  if (sdim == 3)
96  gridStartIdx[i].z = gridSize.z * MPIcoords[i][2];
97  else
98  gridStartIdx[i].z = 0;
99  gridEndIdx[i].x = gridStartIdx[i].x + gridSize.x - 1;
100  gridEndIdx[i].y = gridStartIdx[i].y + gridSize.y - 1;
101  if (sdim == 3)
102  gridEndIdx[i].z = gridStartIdx[i].z + gridSize.z - 1;
103  else
104  gridEndIdx[i].z = 0;
105  }
106 
107  if (!
108  (gridBuffer =
109  (struct doubleVector3d *) calloc(gridSize.x * gridSize.y *
110  gridSize.z,
111  sizeof(struct doubleVector3d))))
112  stopRun(106, "gridBuffer", __FILE__, __LINE__);
113 
114 
115  for (i = 0; i < gridSize.x; i++)
116  for (j = 0; j < gridSize.y; j++)
117  for (k = 0; k < gridSize.z; k++) {
118  grid(i, j, k).x =
119  lowerGridCorner.x + gridResolution * (gridStartIdx[MPIrank].x +
120  i);
121  grid(i, j, k).y =
122  lowerGridCorner.y + gridResolution * (gridStartIdx[MPIrank].y +
123  j);
124  grid(i, j, k).z =
125  lowerGridCorner.z + gridResolution * (gridStartIdx[MPIrank].z +
126  k);
127  }
128 }
int64_t x
Definition: global.h:229
double z
Definition: global.h:225
int MPIdim[3]
Definition: global.h:136
double csizeInUnits
Definition: global.h:198
int MPIrank
Definition: global.h:134
struct int64Vector3d * gridEndIdx
Definition: fields.h:42
int64_t gridK
Definition: fields.h:40
struct doubleVector3d lowerGridCorner upperGridCorner
Definition: fields.h:46
int MPIsize
Definition: global.h:135
struct doubleVector3d * gridBuffer
Definition: fields.h:43
int64_t z
Definition: global.h:231
float gfH
Definition: global.h:250
contains the most important global variables, arrays and defines
void allocateGrid()
Definition: grid.c:81
int sdim
Definition: global.h:160
void computeGridSize()
Definition: grid.c:38
double boxVolume
Definition: fields.h:48
double y
Definition: global.h:224
struct int64Vector3d gridSize
Definition: fields.h:41
double x
Definition: global.h:223
double csize
Definition: global.h:197
struct int64Vector3d * gridStartIdx
Definition: fields.h:42
double gridResolution
Definition: fields.h:45
int nz
Definition: global.h:164
#define grid(i, j, k)
Definition: fields.h:44
int64_t y
Definition: global.h:230
contains variables and arrays for global fields
int ** MPIcoords
Definition: global.h:144
int ny
Definition: global.h:163
int64_t gridI
Definition: fields.h:40
int nx
Definition: global.h:162
void stopRun(int ierr, char *name, char *file, int line)
Definition: utils.c:72
struct doubleVector3d globalGridSize
Definition: fields.h:47
int64_t gridJ
Definition: fields.h:40