49 int nv,
k,
j,
i, stiff, status;
50 double err,
scrh, min_tol = 2.e-5;
51 double mu0, T0, T1, mu1, prs;
61 var_list.
indx[0] = PRS;
82 #if INTERNAL_BOUNDARY == YES
97 v0[RHOE] = v1[RHOE] = prs/(
g_gamma-1.0);
103 print (
"! CoolingSource: negative initial temperature\n");
104 print (
" %12.6e %12.6e\n",v0[RHOE], v0[
RHO]);
117 stiff = (dt*maxrate > 1.0 ? 1:0);
131 if (scrh < 0.0)
SolveODE_CK45 (v0, k1, v1, dt, min_tol, &var_list);
138 double dtsub, dtnew, t;
140 nsub = ceil(dt*maxrate);
141 dtsub = dt/(double)nsub;
149 dtnew =
SolveODE_CK45 (v0, k1, v1, dtsub, min_tol, &var_list);
155 if (fabs(t/dt - 1.0) < 1.e-9)
break;
161 dtsub =
MIN (dtnew, dt - t);
164 if (k > 100)
print (
"! CoolingSource: Number of substeps exceeded 100 (%d)\n",k);
165 if (fabs(t/dt - 1.0) > 1.e-12) {
166 print (
"! CoolingSource: dt mismatch\n");
174 v1[nv] =
MAX(v1[nv], 0.0);
175 v1[nv] =
MIN(v1[nv], 1.0);
177 #if COOLING == H2_COOL
185 prs = v1[RHOE]*(
g_gamma - 1.0);
187 #elif EOS == PVTE_LAW
198 prs = g_minCoolingTemp*v1[
RHO]/(
KELVIN*mu1);
205 err = fabs(prs/d->
Vc[PRS][k][j][i] - 1.0);
212 err =
MAX(err, fabs(d->
Vc[nv][k][j][i] - v1[nv]));
220 d->
Vc[PRS][
k][
j][
i] = prs;
249 for (nv = 0; nv <
NVAR; nv++){
250 vp[nv] = vm[nv] = v[nv];
252 vp[PRS] *= 1.0 +
eps;
253 vm[PRS] *= 1.0 -
eps;
258 for (k = 0; k < n - 1; k++){
259 J[
k][n - 1] = (Rp[k +
NFLX] - Rm[k +
NFLX])/(2.0*v[PRS]*eps);
261 J[n - 1][n - 1] = (Rp[PRS] - Rm[PRS])/(2.0*v[PRS]*eps);
265 for (l = 0; l < n - 1; l++){
267 for (nv = 0; nv <
NVAR; nv++){
268 vp[nv] = vm[nv] = v[nv];
279 for (k = 0; k < n - 1; k++){
282 J[n - 1][l] = (Rp[PRS] - Rm[PRS])/(vp[l +
NFLX] - vm[l +
NFLX]);
#define FLAG_INTERNAL_BOUNDARY
Zone belongs to an internal boundary region and should be excluded from being updated in time...
double GetMaxRate(double *, double *, double)
double InternalEnergy(double *v, double T)
void Radiat(double *, double *)
void Numerical_Jacobian(double *v, double **J)
double **** Vc
The main four-index data array used for cell-centered primitive variables.
double g_smallPressure
Small value for pressure fix.
void CoolingSource(const Data *d, double dt, Time_Step *Dts, Grid *GXYZ)
unsigned char *** flag
Pointer to a 3D array setting useful integration flags that are retrieved during integration.
int nvar
Number of variables.
#define FLAG_SPLIT_CELL
Zone is covered by a finer level (AMR only).
double SolveODE_CK45(double *v0, double *k1, double *v5th, double dt, double tol, intList *vars)
double SolveODE_RKF12(double *v0, double *k1, double *v2nd, double dt, double tol, intList *vars)
double dt_cool
Cooling time step.
int GetEV_Temperature(double rhoe, double *v, double *T)
void print(const char *fmt,...)
double g_minCoolingTemp
The minimum temperature (in K) below which cooling is suppressed.
int indx[2046]
Array of integers containg variables indices.
double MeanMolecularWeight(double *V)
double g_maxCoolingRate
The maximum fractional variation due to cooling from one step to the next.
#define QUIT_PLUTO(e_code)