HARM
harm and utilities
 All Data Structures Files Functions Variables Typedefs Macros Pages
u2p_util.c
Go to the documentation of this file.
1 
8 //#include "u2p_defs.h"
9 
10 
11 
12 /*
13  * reference implementation of transformation from
14  * primitive to conserved variables.
15  *
16  * cfg 7-6-04
17  *
18  * input:
19  *
20  * primitive variables in 8 element array
21  * metric in contravariant and covariant form
22  *
23  * output:
24  *
25  * conserved variables in 8 element array
26  *
27  */
28 
33 
34 
35 #include "global.grmhd.h"
36 //#include "decs.h"
37 
38 
39 static void primtoU_g(struct of_geom *ptrgeom, FTYPE *prim,FTYPE gcov[SYMMATRIXNDIM],FTYPE gcon[SYMMATRIXNDIM],FTYPE *U);
40 static void ucon_calc_g(FTYPE prim[],FTYPE *gcov,FTYPE *gcon,FTYPE ucon[]);
41 static void raise_g(FTYPE vcov[], FTYPE *gcon, FTYPE vcon[]);
42 static void lower_g(FTYPE vcon[], FTYPE *gcov, FTYPE vcov[]);
43 static void ncov_calc(FTYPE *gcon,FTYPE ncov[]) ;
44 static void bcon_calc_g(FTYPE prim[],FTYPE ucon[],FTYPE ucov[],FTYPE ncov[],FTYPE bcon[]);
45 
46 
51 static void primtoU_g(struct of_geom *ptrgeom, FTYPE *prim,FTYPE gcov[SYMMATRIXNDIM],FTYPE gcon[SYMMATRIXNDIM],FTYPE *U)
52 {
53  int i,j ;
54  FTYPE rho0 ;
55  FTYPE ucon[NDIM],ucov[NDIM],bcon[NDIM],bcov[NDIM],ncov[NDIM] ;
56  FTYPE gamma,n_dot_b,bsq,u,p,w ;
57 
58  // preliminaries
59  ucon_calc_g(prim,gcov,gcon,ucon) ;
60  lower_g(ucon,gcov,ucov) ;
61  ncov_calc(gcon,ncov) ;
62 
63  gamma = -ncov[0]*ucon[0] ;
64 
65  bcon_calc_g(prim,ucon,ucov,ncov,bcon) ;
66  lower_g(bcon,gcov,bcov) ;
67 
68  n_dot_b = 0. ;
69  for(i=0;i<NDIM;i++) n_dot_b += ncov[i]*bcon[i] ;
70  bsq = 0. ;
71  for(i=0;i<NDIM;i++) bsq += bcov[i]*bcon[i] ;
72 
73  rho0 = prim[RHO] ;
74  u = prim[UU] ;
75  p = pressure_rho0_u_simple(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,rho0,u) ;
76  w = rho0 + u + p ;
77 
78  U[RHO] = gamma*rho0 ;
79 
80  for(i=0;i<NDIM;i++)
81  U[QCOV0+i] = gamma*(w + bsq)*ucov[i]
82  - (p + bsq/2.)*ncov[i]
83  + n_dot_b*bcov[i] ;
84 
85  U[BCON1] = prim[BCON1] ;
86  U[BCON2] = prim[BCON2] ;
87  U[BCON3] = prim[BCON3] ;
88 
89  return ;
90 }
91 
93 static void ucon_calc_g(FTYPE prim[8],FTYPE gcov[SYMMATRIXNDIM],FTYPE gcon[SYMMATRIXNDIM],FTYPE ucon[NDIM])
94 {
95  FTYPE u_tilde_con[NDIM] ;
96  FTYPE u_tilde_sq ;
97  FTYPE gamma,lapse ;
98  int i,j ;
99 
100  u_tilde_con[0] = 0. ;
101  u_tilde_con[1] = prim[UTCON1] ;
102  u_tilde_con[2] = prim[UTCON2] ;
103  u_tilde_con[3] = prim[UTCON3] ;
104 
105  u_tilde_sq = 0. ;
106  for(i=0;i<NDIM;i++)
107  for(j=0;j<NDIM;j++)
108  u_tilde_sq += gcov[GIND(i,j)]*u_tilde_con[i]*u_tilde_con[j] ;
109  u_tilde_sq = fabs(u_tilde_sq) ;
110 
111  gamma = sqrt(1. + u_tilde_sq) ;
112 
113  lapse = sqrt(-1./gcon[GIND(0,0)]) ;
114 
115  for(i=0;i<NDIM;i++) ucon[i] = u_tilde_con[i] - lapse*gamma*gcon[GIND(0,i)] ;
116 
117  return ;
118 }
119 
121 static void raise_g(FTYPE vcov[NDIM], FTYPE gcon[SYMMATRIXNDIM], FTYPE vcon[NDIM])
122 {
123  int i,j;
124 
125 
126 
127  for(i=0;i<NDIM;i++) {
128  vcon[i] = 0. ;
129  for(j=0;j<NDIM;j++)
130  vcon[i] += gcon[GIND(i,j)]*vcov[j] ;
131  }
132 
133  return ;
134 }
136 static void lower_g(FTYPE vcon[NDIM], FTYPE gcov[SYMMATRIXNDIM], FTYPE vcov[NDIM])
137 {
138  int i,j;
139 
140  for(i=0;i<NDIM;i++) {
141  vcov[i] = 0. ;
142  for(j=0;j<NDIM;j++)
143  vcov[i] += gcov[GIND(i,j)]*vcon[j] ;
144  }
145 
146  return ;
147 }
148 
150 static void ncov_calc(FTYPE gcon[SYMMATRIXNDIM],FTYPE ncov[NDIM])
151 {
152  FTYPE lapse ;
153 
154  lapse = sqrt(-1./gcon[GIND(0,0)]) ;
155 
156  ncov[0] = -lapse ;
157  ncov[1] = 0. ;
158  ncov[2] = 0. ;
159  ncov[3] = 0. ;
160 
161  return ;
162 }
163 
164 
165 
167 static void ncov_calc_fromlapse(FTYPE lapse,FTYPE ncov[NDIM])
168 {
169 
170  ncov[0] = -lapse ;
171  ncov[1] = 0. ;
172  ncov[2] = 0. ;
173  ncov[3] = 0. ;
174 
175  return ;
176 }
177 
179 static void bcon_calc_g(FTYPE prim[8],FTYPE ucon[NDIM],FTYPE ucov[NDIM],FTYPE ncov[NDIM],FTYPE bcon[NDIM])
180 {
181  FTYPE Bcon[NDIM] ;
182  FTYPE u_dot_B ;
183  FTYPE gamma ;
184  int i ;
185 
186  Bcon[0] = 0. ;
187  for(i=1;i<NDIM;i++) Bcon[i] = prim[BCON1+i-1] ;
188 
189  u_dot_B = 0. ;
190  for(i=0;i<NDIM;i++) u_dot_B += ucov[i]*Bcon[i] ;
191 
192  gamma = -ucon[0]*ncov[0] ;
193  for(i=0;i<NDIM;i++) bcon[i] = (Bcon[i] + ucon[i]*u_dot_B)/gamma ;
194 }
195 
196