PLUTO
fundamental_derivative.c
Go to the documentation of this file.
1 /* ///////////////////////////////////////////////////////////////////// */
2 /*!
3  \file
4  \brief PVTE_LAW for a partially ionized gas.
5 
6  Compute the internal energy for a partially ionized hydrogen gas.
7 
8  \author A. Mignone (mignone@ph.unito.it)\n
9  B. Vaidya
10  \date 29 Aug 2014
11 
12  \b Reference
13  - PLUTO Users' guide.
14 */
15 /* /////////////////////////////////////////////////////////////////// */
16 #include "pluto.h"
17 
18 #define INTE_EXACT (TV_ENERGY_TABLE == 1 ? 0:1)
19 #define SEC_ORDER 0
20 
21 /* ****************************************************************** */
22 double FundamentalDerivative(double *v, double T)
23 /*!
24  * To compute the fundamental derivative
25  * for each point.
26  *
27  *
28  ******************************************************************** */
29 {
30  int nv;
31  double FDeriv, cs, Gam1, Gam2, Gam3;
32  double prs, rho, e, dT, drho, rho2, rho3, rho4;
33  double dPdr, d2Pdr2, dPdt, d2Pdt2, d2Pdrdt, dEdt, d2Edt2;
34 
35  double prs_rmm, prs_rpp, prs_rm, prs_rp;
36  double prs_tmm, prs_tpp, prs_tm, prs_tp;
37  double prs_rm_tm, prs_rp_tm, prs_rm_tp, prs_rp_tp;
38  double prs_rmm_tmm, prs_rpp_tpp, prs_rmm_tpp, prs_rpp_tmm;
39  double prs_rp_tmm, prs_rpp_tm, prs_rmm_tp, prs_rm_tpp;
40  double prs_rm_tmm, prs_rmm_tm, prs_rp_tpp, prs_rpp_tp;
41 
42  double epp, emm, ep, em;
43  double vm[NVAR], vp[NVAR], vpp[NVAR], vmm[NVAR];
44 
45  VAR_LOOP(nv) vm[nv] = vp[nv] = vpp[nv] = vmm[nv] = v[nv];
46 
47  rho = v[RHO];
48  rho2 = rho*rho;
49  rho3 = rho2*rho;
50  rho4 = rho2*rho2;
51 
52 #if INTE_EXACT
53  e = InternalEnergyFunc(v, T)/rho;
54 #else
55  e = InternalEnergy(v, T)/rho;
56 #endif
57 
58  prs = Pressure(v, T);
59  v[PRS] = prs;
60  cs = Gamma1(v)*prs/rho;
61 
62  dT = 1.0e-3;
63  drho = 1.0e-3;
64 
65 /* Compute fist and second derivative of Pressure w.r.t Density */
66 
67 
68  vmm[RHO] = rho*(1.0 - 2.0*drho);
69  vm[RHO] = rho*(1.0 - 1.0*drho);
70  vp[RHO] = rho*(1.0 + 1.0*drho);
71  vpp[RHO] = rho*(1.0 + 2.0*drho);
72 
73  prs_rmm = Pressure(vmm, T);
74  prs_rm = Pressure(vm, T);
75  prs_rp = Pressure(vp, T);
76  prs_rpp = Pressure(vpp, T);
77 
78 #if SEC_ORDER
79  dPdr = prs_rp - prs_rm;
80  dPdr /= 2.0*rho*drho;
81 
82  d2Pdr2 = prs_rp - 2.0*prs + prs_rm;
83  d2Pdr2 /= rho2*drho*drho;
84 #else
85  dPdr = prs_rmm - 8.0*prs_rm + 8.0*prs_rp - prs_rpp ;
86  dPdr /= 12.0*rho*drho;
87 
88  d2Pdr2 = -prs_rmm + 16.0*prs_rm - 30.0*prs + 16.0*prs_rp - prs_rpp;
89  d2Pdr2 /= 12.0*rho2*drho*drho;
90 #endif
91 
92  /* Compute fist and second derivative of Pressure w.r.t Temperature */
93 
94  prs_tmm = Pressure(v, T*(1.0 - 2.0*dT));
95  prs_tm = Pressure(v, T*(1.0 - 1.0*dT));
96  prs_tp = Pressure(v, T*(1.0 + 1.0*dT));
97  prs_tpp = Pressure(v, T*(1.0 + 2.0*dT));
98 
99 #if SEC_ORDER
100  dPdt = prs_tp - prs_tm;
101  dPdt /= 2.0*T*dT;
102 
103  d2Pdt2 = prs_tp - 2.0*prs + prs_tm;
104  d2Pdt2 /= T*T*dT*dT;
105 #else
106  dPdt = prs_tmm - 8.0*prs_tm + 8.0*prs_tp - prs_tpp;
107  dPdt /= 12.0*T*dT;
108 
109  d2Pdt2 = -prs_tmm + 16.0*prs_tm - 30.0*prs + 16.0*prs_tp - prs_tpp;
110  d2Pdt2 /= 12.0*T*T*dT*dT;
111 #endif
112 
113 
114  /* Compute fist and second derivative of Internal energy w.r.t Temperature */
115 
116 #if INTE_EXACT
117  emm = InternalEnergyFunc(v, T*(1.0 - 2.0*dT))/rho;
118  em = InternalEnergyFunc(v, T*(1.0 - 1.0*dT))/rho;
119  ep = InternalEnergyFunc(v, T*(1.0 + 1.0*dT))/rho;
120  epp = InternalEnergyFunc(v, T*(1.0 + 2.0*dT))/rho;
121 #else
122  emm = InternalEnergy(v, T*(1.0 - 2.0*dT))/rho;
123  em = InternalEnergy(v, T*(1.0 - 1.0*dT))/rho;
124  ep = InternalEnergy(v, T*(1.0 + 1.0*dT))/rho;
125  epp = InternalEnergy(v, T*(1.0 + 2.0*dT))/rho;
126 #endif
127 
128 #if SEC_ORDER
129  dEdt = ep - em;
130  dEdt /= 2.0*T*dT;
131 
132  d2Edt2 = ep - 2.0*e + em;
133  d2Edt2 /= T*T*dT*dT;
134 #else
135  dEdt = emm - 8.0*em + 8.0*ep - epp;
136  dEdt /= 12.0*T*dT;
137 
138  d2Edt2 = -emm + 16.0*em -30.0*e + 16.0*ep - epp;
139  d2Edt2 /= 12.0*T*T*dT*dT;
140 #endif
141 
142  /* Compute mixed derivative of Pressure w.r.t Temperature and Density */
143 
144  prs_rm_tm = Pressure(vm, T*(1.0 - 1.0*dT));
145  prs_rp_tm = Pressure(vp, T*(1.0 - 1.0*dT));
146  prs_rm_tp = Pressure(vm, T*(1.0 + 1.0*dT));
147  prs_rp_tp = Pressure(vp, T*(1.0 + 1.0*dT));
148 
149  prs_rmm_tmm = Pressure(vmm, T*(1.0 - 2.0*dT));
150  prs_rpp_tmm = Pressure(vpp, T*(1.0 - 2.0*dT));
151  prs_rmm_tpp = Pressure(vmm, T*(1.0 + 2.0*dT));
152  prs_rpp_tpp = Pressure(vpp, T*(1.0 + 2.0*dT));
153 
154  prs_rp_tmm = Pressure(vp, T*(1.0 - 2.0*dT));
155  prs_rpp_tm = Pressure(vpp, T*(1.0 - 1.0*dT));
156  prs_rmm_tp = Pressure(vmm, T*(1.0 + 1.0*dT));
157  prs_rm_tpp = Pressure(vm, T*(1.0 + 2.0*dT));
158 
159  prs_rm_tmm = Pressure(vm, T*(1.0 - 2.0*dT));
160  prs_rmm_tm = Pressure(vmm, T*(1.0 - 1.0*dT));
161  prs_rp_tpp = Pressure(vp, T*(1.0 + 2.0*dT));
162  prs_rpp_tp = Pressure(vpp, T*(1.0 + 1.0*dT));
163 
164 
165 
166 #if SEC_ORDER
167  d2Pdrdt = (prs_rp_tp + prs_rm_tm - prs_rp_tm - prs_rm_tp);
168  d2Pdrdt /= 4.0*T*dT*rho*drho;
169 #else
170  d2Pdrdt = 74.0*(prs_rp_tp + prs_rm_tm - prs_rp_tm - prs_rm_tp) \
171  + 44.0*(prs_rpp_tpp + prs_rmm_tmm - prs_rpp_tmm - prs_rmm_tpp) \
172  - 63.0*(prs_rp_tmm + prs_rpp_tm + prs_rmm_tp + prs_rm_tpp) \
173  + 63.0*(prs_rm_tmm + prs_rmm_tm + prs_rp_tpp + prs_rpp_tp);
174 
175  d2Pdrdt /= 600.0*T*dT*rho*drho;
176 #endif
177 
178 /* Compute three terms for the fundamental Gas derivative */
179 
180  Gam1 = rho4*d2Pdr2 + 2.0*rho2*dPdr;
181  Gam2 = 3.0*T*(rho2/dEdt)*dPdt*d2Pdrdt;
182  Gam3 = (T/dEdt)*(T/dEdt)*dPdt*dPdt;
183  Gam3 *= 3.0*d2Pdt2 + (1./T)*dPdt*(1.0 - (T/dEdt)*d2Edt2);
184 
185  FDeriv = (Gam1 + Gam2 + Gam3)/(2.0*cs*cs*rho3);
186 
187  return FDeriv;
188 }
tuple T
Definition: Sph_disk.py:33
double InternalEnergy(double *v, double T)
double FundamentalDerivative(double *v, double T)
#define RHO
Definition: mod_defs.h:19
#define VAR_LOOP(n)
Definition: macros.h:226
double Gamma1(double *v)
Definition: pvte_law.c:231
PLUTO main header file.
double Pressure(double *v, double T)
Definition: thermal_eos.c:179
#define NVAR
Definition: pluto.h:609
double InternalEnergyFunc(double *v, double T)
Definition: pvte_law.c:47