Timothy  0.9
Tissue Modelling Framework
 All Data Structures Files Functions Variables Typedefs Macros
grid.c File Reference

contains functions that build the computational grid More...

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <inttypes.h>
#include "global.h"
#include "fields.h"
Include dependency graph for grid.c:

Go to the source code of this file.

Functions

void computeGridSize ()
 
void allocateGrid ()
 

Detailed Description

contains functions that build the computational grid

Definition in file grid.c.

Function Documentation

void allocateGrid ( )

This function allocates grid arrays.

Definition at line 81 of file grid.c.

References grid, gridBuffer, gridEndIdx, gridResolution, gridSize, gridStartIdx, MPIcoords, MPIrank, MPIsize, sdim, stopRun(), int64Vector3d::x, int64Vector3d::y, and int64Vector3d::z.

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
int MPIrank
Definition: global.h:134
struct int64Vector3d * gridEndIdx
Definition: fields.h:42
int MPIsize
Definition: global.h:135
struct doubleVector3d * gridBuffer
Definition: fields.h:43
int64_t z
Definition: global.h:231
int sdim
Definition: global.h:160
struct int64Vector3d gridSize
Definition: fields.h:41
struct int64Vector3d * gridStartIdx
Definition: fields.h:42
double gridResolution
Definition: fields.h:45
#define grid(i, j, k)
Definition: fields.h:44
int64_t y
Definition: global.h:230
int ** MPIcoords
Definition: global.h:144
void stopRun(int ierr, char *name, char *file, int line)
Definition: utils.c:72

Here is the call graph for this function:

Here is the caller graph for this function:

void computeGridSize ( )

This function computes the sizes of the grid.

Definition at line 38 of file grid.c.

References boxVolume, csize, csizeInUnits, gfH, globalGridSize, gridI, gridJ, gridK, gridResolution, gridSize, MPIdim, MPIrank, nx, ny, nz, sdim, upperGridCorner, doubleVector3d::x, int64Vector3d::x, doubleVector3d::y, int64Vector3d::y, doubleVector3d::z, and int64Vector3d::z.

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 }
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
int64_t gridK
Definition: fields.h:40
struct doubleVector3d lowerGridCorner upperGridCorner
Definition: fields.h:46
int64_t z
Definition: global.h:231
float gfH
Definition: global.h:250
int sdim
Definition: global.h:160
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
double gridResolution
Definition: fields.h:45
int nz
Definition: global.h:164
int64_t y
Definition: global.h:230
int ny
Definition: global.h:163
int64_t gridI
Definition: fields.h:40
int nx
Definition: global.h:162
struct doubleVector3d globalGridSize
Definition: fields.h:47
int64_t gridJ
Definition: fields.h:40

Here is the caller graph for this function: