File indexing completed on 2025-08-05 08:19:30
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include "CausalLiquefier.h"
0020 #include "JetScapeLogger.h"
0021 #include "JetScapeXML.h"
0022 #include <cfloat>
0023
0024 namespace Jetscape {
0025
0026
0027 CausalLiquefier::CausalLiquefier(){
0028 VERBOSE(8);
0029 dtau = 0.6;
0030 dx = 0.3;
0031 dy = 0.3;
0032 deta = 0.3;
0033 tau_delay = 2.0;
0034 time_relax = 0.1;
0035 d_diff = 0.08;
0036 width_delta = 0.1;
0037 Init();
0038 c_diff = sqrt(d_diff/time_relax);
0039 gamma_relax = 0.5/time_relax;
0040 if( c_diff > 1.0 ){
0041 JSWARN << "Bad Signal Velocity in CausalLiquefier";
0042 }
0043
0044
0045
0046
0047
0048 }
0049
0050 CausalLiquefier::CausalLiquefier(double dtau_in, double dx_in, double dy_in, double deta_in){
0051 VERBOSE(8);
0052 JSINFO<<"Initialize CausalLiquefier (for Unit Test) ...";
0053 dtau = dtau_in;
0054 dx = dx_in;
0055 dy = dy_in;
0056 deta = deta_in;
0057 tau_delay = 2.0;
0058 time_relax = 0.1;
0059 d_diff = 0.08;
0060 width_delta = 0.1;
0061
0062 c_diff = sqrt(d_diff/time_relax);
0063 gamma_relax = 0.5/time_relax;
0064
0065 JSINFO
0066 << "<CausalLiquefier> Fluid Time Step and Cell Size: dtau="
0067 << dtau << " fm, dx="
0068 << dx << " fm, dy="
0069 << dy << " fm, deta="
0070 << deta;
0071 JSINFO
0072 << "<CausalLiquefier> Parameters: tau_delay="
0073 << tau_delay << " fm, time_relax="
0074 << time_relax << " fm, d_diff="
0075 << d_diff << " fm, width_delta="
0076 << width_delta <<" fm";
0077 }
0078
0079 void CausalLiquefier::Init(){
0080
0081
0082 JSINFO<<"Initialize CausalLiquefier ...";
0083
0084 dtau = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "dtau"});
0085 dx = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "dx"});
0086 dy = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "dy"});
0087 deta = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "deta"});
0088 tau_delay = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "tau_delay"});
0089 time_relax = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "time_relax"});
0090 d_diff = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "d_diff"});
0091 width_delta = JetScapeXML::Instance()->GetElementDouble({"Liquefier", "CausalLiquefier", "width_delta"});
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 }
0108
0109
0110
0111
0112 void CausalLiquefier::smearing_kernel(
0113 Jetscape::real tau, Jetscape::real x, Jetscape::real y,
0114 Jetscape::real eta, const Droplet drop_i,
0115 std::array<Jetscape::real, 4> &jmu) const {
0116
0117 jmu = {0., 0, 0, 0};
0118
0119 const auto p_drop = drop_i.get_pmu();
0120 auto x_drop = drop_i.get_xmu();
0121 double tau_drop = x_drop[0];
0122 double eta_drop = x_drop[3];
0123 x_drop[0] = get_t(tau_drop, eta_drop);
0124 x_drop[3] = get_z(tau_drop, eta_drop);
0125
0126 if( tau - 0.5*dtau <= tau_drop + tau_delay &&
0127 tau + 0.5*dtau > tau_drop + tau_delay ){
0128
0129 double t = get_t(tau, eta);
0130 double z = get_z(tau, eta);
0131
0132 double delta_t = t - x_drop[0];
0133 double delta_r = sqrt((x-x_drop[1])*(x-x_drop[1])+(y-x_drop[2])*(y-x_drop[2])+(z-x_drop[3])*(z-x_drop[3]));
0134
0135
0136 double jt = kernel_rho( delta_t, delta_r )/dtau;
0137 double jz;
0138 if( delta_r <= DBL_MIN ){
0139 jz = 0.0;
0140 }else{
0141 jz = ((z-x_drop[3])/delta_r)*kernel_j( delta_t, delta_r )/dtau;
0142 }
0143
0144 double jtau = get_ptau(jt, jz, eta);
0145
0146
0147 jmu[0] = jtau*get_ptau(p_drop[0], p_drop[3], eta);
0148 jmu[1] = jtau*p_drop[1];
0149 jmu[2] = jtau*p_drop[2];
0150 jmu[3] = jtau*get_peta(p_drop[0], p_drop[3], eta);
0151
0152 }
0153
0154 }
0155
0156
0157
0158 double CausalLiquefier::kernel_rho(double t, double r) const {
0159 return dumping(t)*(rho_smooth(t, r)+rho_delta(t, r));
0160 }
0161
0162
0163 double CausalLiquefier::kernel_j(double t, double r) const {
0164 return dumping(t)*(j_smooth(t, r)+j_delta(t, r));
0165 }
0166
0167
0168 double CausalLiquefier::dumping(double t) const {
0169 return exp(-gamma_relax*t)/(4.0*M_PI);
0170 }
0171
0172
0173 double CausalLiquefier::rho_smooth(double t, double r) const {
0174 if( r < c_diff*t ){
0175 double u = sqrt( c_diff*c_diff*t*t - r*r );
0176 double x = gamma_relax*u/c_diff;
0177
0178 double i1 = gsl_sf_bessel_I1(x)/(c_diff*u);
0179 double i2 = gsl_sf_bessel_In(2,x)*t/u/u;
0180 double f = gamma_relax*gamma_relax/c_diff;
0181
0182 return f * (i1+i2);
0183 }else{
0184 return 0.0;
0185 }
0186 }
0187
0188
0189 double CausalLiquefier::j_smooth(double t, double r) const {
0190 if( r < c_diff*t ){
0191 double u = sqrt( c_diff*c_diff*t*t - r*r );
0192 double x = gamma_relax*u/c_diff;
0193
0194 double i2 = gsl_sf_bessel_In(2,x)*r/u/u;
0195 double f = gamma_relax*gamma_relax/c_diff;
0196
0197 return f * i2;
0198
0199 }else{
0200 return 0.0;
0201 }
0202 }
0203
0204
0205 double CausalLiquefier::rho_delta(double t, double r) const {
0206
0207 double r_w = width_delta;
0208 if( c_diff*t <= width_delta ){
0209 r_w = c_diff*t;
0210 }
0211
0212 if( r >= c_diff*t - r_w && r < c_diff*t ){
0213 double x = gamma_relax*t;
0214 return (1.0 + x + x*x/2.0)/r_w/r/r;
0215 }else{
0216 return 0.0;
0217 }
0218
0219 }
0220
0221
0222 double CausalLiquefier::j_delta(double t, double r) const {
0223 return c_diff*rho_delta(t, r);
0224 }
0225
0226
0227 double CausalLiquefier::get_t(double tau, double eta)const{
0228 return tau*cosh(eta);
0229 }
0230
0231
0232 double CausalLiquefier::get_z(double tau, double eta)const{
0233 return tau*sinh(eta);
0234 }
0235
0236
0237 double CausalLiquefier::get_ptau(double p0, double p3, double eta)const{
0238 return p0*cosh(eta) - p3*sinh(eta);
0239 }
0240
0241
0242 double CausalLiquefier::get_peta(double p0, double p3, double eta)const{
0243 return p3*cosh(eta) - p0*sinh(eta);
0244 }
0245
0246
0247 void CausalLiquefier::set_t_delay(double new_tau_delay){
0248 tau_delay = new_tau_delay;
0249 }
0250
0251 };