PLUTO
tc_functions.c
Go to the documentation of this file.
1 #include "pluto.h"
2 
3 /* ******************************************************************** */
4 void GetGradient (double ***T, double **gradT,
5  int beg, int end, Grid *grid)
6 /*
7  *
8  * PURPOSE
9  *
10  * Compute the gradient of a 3D scalar quantity T in the direction
11  * given by g_dir.
12  * Return a 1D array (dT/dx, dT/dy, dT/dz) along that direction
13  * computed at cell interfaces, e.g.
14  *
15  * if g_dir == IDIR --> compute
16  *
17  * [ dT/dl1, dT/dl2, dT/dl3 ] at interface (i+1/2,j,k)
18  *
19  * if g_dir == JDIR --> compute
20  *
21  * [ dT/dl1, dT/dl2, dT/dl3 ] at interface (i,j+1/2,k)
22  *
23  * if g_dir == KDIR --> compute
24  *
25  * [ dT/dl1, dT/dl2, dT/dl3 ] at interface (i,j,k+1/2)
26  *
27  *
28  * Here dl1, dl2 and dl3 are the line element in the
29  * thre directions:
30  *
31  * Cartesian: {dl1, dl2, dl3} = {dx, dy, dz}
32  * Cylindrical: {dl1, dl2, dl3} = {dr, dz, - }
33  * Polar: {dl1, dl2, dl3} = {dr, r.dphi, dz}
34  * Spherical: {dl1, dl2, dl3} = {dr, r.dtheta, r.sin(theta).dphi}
35  *
36  * LAST MODIFIED
37  *
38  * 14 Apr 2011 by T. Matsakos, A. Mignone
39  *
40  *
41  ************************************************************* */
42 {
43  int i,j,k;
44  double *r, *rp;
45  double *inv_dx, *inv_dy, *inv_dz;
46  double *inv_dxi, *inv_dyi, *inv_dzi;
47  double dl1, dl2, dl3, theta, r_1, s_1;
48  double dx1, dx2, dx3;
49 
50  D_EXPAND(inv_dx = grid[IDIR].inv_dx; inv_dxi = grid[IDIR].inv_dxi; ,
51  inv_dy = grid[JDIR].inv_dx; inv_dyi = grid[JDIR].inv_dxi; ,
52  inv_dz = grid[KDIR].inv_dx; inv_dzi = grid[KDIR].inv_dxi;)
53 
54  r = grid[IDIR].x;
55  rp = grid[IDIR].xr;
56 
57  i = g_i; j = g_j; k = g_k;
58 
59  if (g_dir == IDIR) {
60 
61  #if GEOMETRY == SPHERICAL
62  theta = grid[JDIR].x[j];
63  s_1 = 1.0/sin(theta);
64  #endif
65  D_EXPAND( ,
66  dl2 = dx2 = inv_dy[j]; ,
67  dl3 = dx3 = inv_dz[k];
68  )
69  for (i = beg; i <= end; i++){
70  dl1 = inv_dxi[i];
71  #if GEOMETRY == POLAR && DIMENSIONS >= 2
72  dl2 = dx2/rp[i];
73  #elif GEOMETRY == SPHERICAL
74  D_EXPAND( ,
75  dl2 = dx2/rp[i]; ,
76  dl3 = dx3*s_1/rp[i];)
77  #endif
78  D_EXPAND(
79  gradT[i][0] = (T[k][j][i+1] - T[k][j][i])*dl1; ,
80  gradT[i][1] = 0.25*( T[k][j+1][i] + T[k][j+1][i+1]
81  - T[k][j-1][i] - T[k][j-1][i+1])*dl2; ,
82  gradT[i][2] = 0.25*( T[k+1][j][i] + T[k+1][j][i+1]
83  - T[k-1][j][i] - T[k-1][j][i+1])*dl3;
84  )
85  }
86 
87  }else if (g_dir == JDIR) {
88 
89  r_1 = 1.0/r[i];
90  D_EXPAND(
91  dl1 = dx1 = inv_dx[i]; ,
92  ,
93  dl3 = dx3 = inv_dz[k];
94  )
95  for (j = beg; j <= end; j++){
96  dl2 = inv_dyi[j];
97  #if GEOMETRY == POLAR
98  dl2 *= r_1;
99  #elif GEOMETRY == SPHERICAL
100  D_EXPAND( ,
101  dl2 *= r_1; ,
102  theta = grid[JDIR].xr[j];
103  dl3 = dx3*r_1/sin(theta);)
104  #endif
105  D_EXPAND(
106  gradT[j][0] = 0.25*( T[k][j][i+1] + T[k][j+1][i+1]
107  - T[k][j][i-1] - T[k][j+1][i-1])*dl1; ,
108  gradT[j][1] = (T[k][j+1][i] - T[k][j][i])*dl2; ,
109  gradT[j][2] = 0.25*( T[k+1][j][i] + T[k+1][j+1][i]
110  - T[k-1][j][i] - T[k-1][j+1][i])*dl3;
111  )
112  }
113 
114  }else if (g_dir == KDIR){
115 
116  dl1 = inv_dx[i];
117  dl2 = inv_dy[j];
118  #if GEOMETRY == POLAR || GEOMETRY == SPHERICAL
119  r_1 = 1.0/r[i];
120  dl2 *= r_1;
121  #endif
122  #if GEOMETRY == SPHERICAL
123  theta = grid[JDIR].x[j];
124  s_1 = 1.0/sin(theta);
125  #endif
126 
127  for (k = beg; k <= end; k++){
128  dl3 = inv_dzi[k];
129  #if GEOMETRY == SPHERICAL
130  dl3 *= r_1*s_1;
131  #endif
132  gradT[k][0] = 0.25*( T[k][j][i+1] + T[k+1][j][i+1]
133  - T[k][j][i-1] - T[k+1][j][i-1])*dl1;
134  gradT[k][1] = 0.25*( T[k][j+1][i] + T[k+1][j+1][i]
135  - T[k][j-1][i] - T[k+1][j-1][i])*dl2;
136  gradT[k][2] = (T[k+1][j][i] - T[k][j][i])*dl3;
137  }
138  }
139 }
tuple T
Definition: Sph_disk.py:33
double * xr
Definition: structs.h:81
#define KDIR
Definition: pluto.h:195
double * inv_dx
Definition: structs.h:90
int g_i
x1 grid index when sweeping along the x2 or x3 direction.
Definition: globals.h:82
#define IDIR
Definition: pluto.h:193
int g_dir
Specifies the current sweep or direction of integration.
Definition: globals.h:86
int g_j
x2 grid index when sweeping along the x1 or x3 direction.
Definition: globals.h:83
Definition: structs.h:78
int j
Definition: analysis.c:2
int k
Definition: analysis.c:2
double * x
Definition: structs.h:80
int g_k
x3 grid index when sweeping along the x1 or x2 direction.
Definition: globals.h:84
PLUTO main header file.
D_EXPAND(tot/[n]=(double) grid[IDIR].np_int_glob;, tot/[n]=(double) grid[JDIR].np_int_glob;, tot/[n]=(double) grid[KDIR].np_int_glob;)
Definition: analysis.c:27
int i
Definition: analysis.c:2
void GetGradient(double ***T, double **gradT, int beg, int end, Grid *grid)
Definition: tc_functions.c:4
#define JDIR
Definition: pluto.h:194
double * inv_dxi
inverse of the distance between the center of two cells, inv_dxi = .
Definition: structs.h:91