File indexing completed on 2025-08-05 08:19:15
0001 #include <iostream>
0002 #include <fstream>
0003 #include <cmath>
0004 #include <iomanip>
0005 #include "rmn.h"
0006 #include "cll.h"
0007
0008 using namespace std;
0009
0010
0011 double minmod(double a, double b) {
0012 if (a * b <= 0.) return 0.;
0013
0014 if (fabs(a) > fabs(b))
0015 return b;
0016 else
0017 return a;
0018 }
0019
0020
0021 int index44(const int &i, const int &j) {
0022 if (i > 3 || j > 3 || i < 0 || j < 0) {
0023 std::cout << "index44: i j " << i << " " << j << endl;
0024 exit(1);
0025 }
0026 if (j < i)
0027 return (i * (i + 1)) / 2 + j;
0028 else
0029 return (j * (j + 1)) / 2 + i;
0030 }
0031
0032 Cell::Cell() {
0033 for (int i = 0; i < 7; i++) {
0034 Q[i] = 0.;
0035 Qh[i] = 0.;
0036 Qprev[i] = 0.;
0037 flux[i] = 0.;
0038 }
0039 viscCorrCut = 1.;
0040 for (int i = 0; i < 10; i++) {
0041 pi[i] = 0.0;
0042 piH[i] = 0.0;
0043 pi0[i] = 0.0;
0044 piH0[i] = 0.0;
0045 }
0046 Pi = 0.0;
0047 PiH = 0.0;
0048 Pi0 = 0.0;
0049 PiH0 = 0.0;
0050 setAllM(0.);
0051 }
0052
0053 void Cell::updateByFlux() {
0054 for (int i = 0; i < 7; i++) Q[i] += flux[i];
0055 }
0056
0057 void Cell::updateQtoQhByFlux() {
0058 for (int i = 0; i < 7; i++) Qh[i] = Q[i] + flux[i];
0059 }
0060
0061 void Cell::getPrimVar(EoS *eos, double tau, double &_e, double &_p, double &_nb,
0062 double &_nq, double &_ns, double &_vx, double &_vy,
0063 double &_vz) {
0064 double _Q[7];
0065 for (int i = 0; i < 7; i++) _Q[i] = Q[i] / tau;
0066 transformPV(eos, _Q, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0067
0068 if (_nb != _nb) {
0069 cout << "---error in getPrimVar:\n";
0070 Dump(tau);
0071 }
0072
0073 }
0074
0075 void Cell::getPrimVarLeft(EoS *eos, double tau, double &_e, double &_p,
0076 double &_nb, double &_nq, double &_ns, double &_vx,
0077 double &_vy, double &_vz, int dir) {
0078 double Qr[7], Ql[7], dQ[7];
0079
0080 next[dir - 1]->getQ(Qr);
0081 prev[dir - 1]->getQ(Ql);
0082
0083 for (int i = 0; i < 7; i++)
0084 dQ[i] = minmod((Qr[i] - Q[i]) / 2., (Q[i] - Ql[i]) / 2.);
0085
0086 for (int i = 0; i < 7; i++) Ql[i] = (Q[i] - dQ[i]) / tau;
0087
0088 transformPV(eos, Ql, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0089
0090
0091 if (_nb != _nb) {
0092 cout << "---error in getPrimVarLeft:\n";
0093 Dump(tau);
0094 next[dir - 1]->Dump(tau);
0095 prev[dir - 1]->Dump(tau);
0096 }
0097
0098 }
0099
0100 void Cell::getPrimVarRight(EoS *eos, double tau, double &_e, double &_p,
0101 double &_nb, double &_nq, double &_ns, double &_vx,
0102 double &_vy, double &_vz, int dir) {
0103 double Qr[7], Ql[7], dQ[7];
0104
0105 next[dir - 1]->getQ(Qr);
0106 prev[dir - 1]->getQ(Ql);
0107
0108 for (int i = 0; i < 7; i++)
0109 dQ[i] = minmod((Qr[i] - Q[i]) / 2., (Q[i] - Ql[i]) / 2.);
0110
0111 for (int i = 0; i < 7; i++) Qr[i] = (Q[i] + dQ[i]) / tau;
0112
0113 transformPV(eos, Qr, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0114
0115
0116 if (_nb != _nb) {
0117 cout << "---error in getPrimVarRight:\n";
0118 Dump(tau);
0119 next[dir - 1]->Dump(tau);
0120 prev[dir - 1]->Dump(tau);
0121 }
0122
0123 }
0124
0125 void Cell::getPrimVarHLeft(EoS *eos, double tau, double &_e, double &_p,
0126 double &_nb, double &_nq, double &_ns, double &_vx,
0127 double &_vy, double &_vz, int dir) {
0128 double Qr[7], Ql[7], dQ[7];
0129
0130 next[dir - 1]->getQh(Qr);
0131 prev[dir - 1]->getQh(Ql);
0132
0133 for (int i = 0; i < 7; i++)
0134 dQ[i] = minmod((Qr[i] - Qh[i]) / 2., (Qh[i] - Ql[i]) / 2.);
0135
0136 for (int i = 0; i < 7; i++) Ql[i] = (Qh[i] - dQ[i]) / tau;
0137
0138 transformPV(eos, Ql, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0139
0140
0141 if (_nb != _nb) {
0142 cout << "---error in getPrimVarHLeft:\n";
0143 Dump(tau);
0144 next[dir - 1]->Dump(tau);
0145 prev[dir - 1]->Dump(tau);
0146 }
0147
0148 }
0149
0150 void Cell::getPrimVarHRight(EoS *eos, double tau, double &_e, double &_p,
0151 double &_nb, double &_nq, double &_ns, double &_vx,
0152 double &_vy, double &_vz, int dir) {
0153 double Qr[7], Ql[7], dQ[7];
0154
0155 next[dir - 1]->getQh(Qr);
0156 prev[dir - 1]->getQh(Ql);
0157
0158 for (int i = 0; i < 7; i++)
0159 dQ[i] = minmod((Qr[i] - Qh[i]) / 2., (Qh[i] - Ql[i]) / 2.);
0160
0161 for (int i = 0; i < 7; i++) Qr[i] = (Qh[i] + dQ[i]) / tau;
0162
0163 transformPV(eos, Qr, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0164
0165
0166 if (_nb != _nb) {
0167 cout << "---error in getPrimVarHRight:\n";
0168 Dump(tau);
0169 next[dir - 1]->Dump(tau);
0170 prev[dir - 1]->Dump(tau);
0171 }
0172
0173 }
0174
0175 void Cell::getPrimVarHCenter(EoS *eos, double tau, double &_e, double &_p,
0176 double &_nb, double &_nq, double &_ns, double &_vx,
0177 double &_vy, double &_vz) {
0178 double _Q[7];
0179 for (int i = 0; i < 7; i++) _Q[i] = Qh[i] / tau;
0180 transformPV(eos, _Q, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0181 }
0182
0183 void Cell::getPrimVarPrev(EoS *eos, double tau, double &_e, double &_p,
0184 double &_nb, double &_nq, double &_ns, double &_vx,
0185 double &_vy, double &_vz) {
0186 double _Q[7];
0187 for (int i = 0; i < 7; i++) _Q[i] = Qprev[i] / tau;
0188 transformPV(eos, _Q, _e, _p, _nb, _nq, _ns, _vx, _vy, _vz);
0189 }
0190
0191
0192 void Cell::setPrimVar(EoS *eos, double tau, double _e, double _nb, double _nq,
0193 double _ns, double _vx, double _vy, double _vz) {
0194 const double gamma2 = 1. / (1 - _vx * _vx - _vy * _vy - _vz * _vz);
0195 const double p = eos->p(_e, _nb, _nq, _ns);
0196 Q[T_] = tau * (_e + p * (_vx * _vx + _vy * _vy + _vz * _vz)) * gamma2;
0197 Q[X_] = tau * (_e + p) * _vx * gamma2;
0198 Q[Y_] = tau * (_e + p) * _vy * gamma2;
0199 Q[Z_] = tau * (_e + p) * _vz * gamma2;
0200 Q[NB_] = tau * _nb * sqrt(gamma2);
0201 Q[NQ_] = tau * _nq * sqrt(gamma2);
0202 Q[NS_] = tau * _ns * sqrt(gamma2);
0203 if (Q[NB_] != Q[NB_]) {
0204 cout << "init error!\n";
0205 eos->p(_e, _nb, _nq, _ns);
0206 cout << "e = " << _e << " p = " << p << " vx = " << _vx << " vy = " << _vy
0207 << " vz = " << _vz << " gamma2 = " << gamma2 << endl;
0208
0209 return;
0210 }
0211 }
0212
0213 void Cell::Dump(double tau) {
0214 cout << "---------cell values dump-------\n";
0215 cout << setw(5) << ix << setw(5) << iy << setw(5) << iz << endl;
0216 cout << setw(14) << Q[0] / tau << setw(14) << Q[1] / tau << setw(14)
0217 << Q[2] / tau << setw(14) << Q[3] / tau << endl;
0218 cout << setw(14) << Q[4] / tau << setw(14) << Q[5] / tau << setw(14)
0219 << Q[6] / tau << endl;
0220 cout << setw(14) << Qh[0] / tau << setw(14) << Qh[1] / tau << setw(14)
0221 << Qh[2] / tau << setw(14) << Qh[3] / tau << endl;
0222 cout << setw(14) << Qh[4] / tau << setw(14) << Qh[5] / tau << setw(14)
0223 << Qh[6] / tau << endl;
0224
0225 cout << "--------------------------------\n";
0226 }