phigrape/drag_force.c
2019-08-25 16:22:03 +08:00

185 lines
5.5 KiB
C

/*****************************************************************************
File Name : "Drag Force.c"
Contents : Drag force calculus.
: Converted & optimized from Chingis Omarov Fortran code.
Coded by : Taras Panamarev,
: Denis Yurin, Maxim Makukov & Peter Berczik :-)
Last redaction : 2012-11-15 15:33
*****************************************************************************/
// main parameters
const double Md = 0.01;
const double s=4, beta_s=0.7, alpha=0.75, h=0.001;
const double r_lim2=(0.5*0.5), h_lim2=(5e-3*5e-3);
const double gradP_rho = 0.90; // account for -grad(P)/rho in gas disk...
const double Qtot = 0.01; // 16e3
/*
const double Qtot = 0.00547000; // 8e3
const double Qtot = 0.00296975; // 16e3
const double Qtot = 0.00193372; // 32e3
const double Qtot = 0.00054215; // 128KB
*/
int K;
double RDISC, //projection of radius vector to the disc plane
h_z, // disc profile
RDISC2, Z2, RDISC_3over2, R, RR0, RR02, RR0_s, RDISC_5over2, R_zeta, R0_zeta, RRcrit, RRcrit_zeta,Rcrit_zeta, R_zetaR,
inner_hole, temp, sqrt_m_bh, pot_drag,
sigma0, R02, hR02, Rcrit, R0, zeta,
R_DOT, //the first derivative of absolute value of projection
COEFDENS,
RHO, RHODOT, //disc density and it's firs derivative with respect to time
VXDISC, VYDISC,//disc particle velocity components
VXRE, VYRE, VZRE, VRE,//the absolute value of relative (star-disc) velocity and it's components
coef,
FDRAGX, FDRAGY, FDRAGZ,//drag force components
DVXRE, DVYRE, DVZRE, DVRE,//first derivative of relative velocity and it's absolute value
KFDOT;
void init_drag_force()
{
R0 = R_0;
Rcrit = R_CRIT;
sigma0 = (2-alpha)*Md/(TWOPi*sqrt_TWOPi*h*R0);
R02 = SQR(R0);
hR02 = SQR(h*R0);
}
void calc_drag_force()
{
if (min_t < t_diss_on) return;
// if (min_t == t_diss_on) init_drag_force();
init_drag_force();
for (i=0; i<n_act; i++)
{
K = ind_act[i];
RDISC2 = SQR(x_act_new[i][0]) + SQR(x_act_new[i][1]);
Z2 = SQR(x_act_new[i][2]);
if( (RDISC2 < r_lim2) && (Z2 < h_lim2) )
{
RDISC2 = SQR(x_act_new[i][0]) + SQR(x_act_new[i][1]);
R = sqrt(RDISC2 + SQR(x_act_new[i][2]));
RDISC = sqrt(RDISC2);
R_DOT = ( x_act_new[i][0]*v_act_new[i][0] + x_act_new[i][1]*v_act_new[i][1] )/RDISC;
RR0 = RDISC/R0;
RR02 = SQR(RR0);
// RR0_s = pow(RR0, s);
RR0_s = SQR(RR02);
RRcrit = RDISC/Rcrit;
/*
if (RDISC < Rcrit) zeta = 1; else zeta = 0;
RRcrit_zeta = pow(RRcrit, zeta);
R_zeta = pow(RDISC, -2*zeta);
R0_zeta = pow(R0, -2*zeta);
Rcrit_zeta = pow(Rcrit, -2*zeta);
*/
if (RDISC < Rcrit)
{
zeta = 1;
RRcrit_zeta = RRcrit;
R_zeta = 1.0/RDISC2;
R0_zeta = 1.0/R02;
Rcrit_zeta = 1.0/SQR(Rcrit);
}
else
{
zeta = 0;
RRcrit_zeta = 1.0;
R_zeta = 1.0;
R0_zeta = 1.0;
Rcrit_zeta = 1.0;
}
R_zetaR = R_zeta/R;
COEFDENS = pow(RR0, -alpha) * exp(-beta_s*RR0_s)/RRcrit_zeta;
RHO = sigma0*COEFDENS*exp(-Z2/(2.0*hR02*SQR(RRcrit_zeta)));
RHODOT = - R_DOT*(zeta+alpha+beta_s*s*RR0_s )/RDISC
- (v_act_new[i][2]*x_act_new[i][2]*R_zeta-zeta*R_zetaR*Z2*R_DOT)/(hR02*Rcrit_zeta);
RDISC_3over2 = sqrt(RDISC2*RDISC);
RDISC_5over2 = RDISC_3over2*RDISC;
sqrt_m_bh = sqrt(m_bh);
sqrt_m_bh *= gradP_rho; // account for -grad(P)/rho in gas disk...
VXDISC = -sqrt_m_bh * x_act_new[i][1]/RDISC_3over2;
VYDISC = +sqrt_m_bh * x_act_new[i][0]/RDISC_3over2;
VXRE = VXDISC - v_act_new[i][0];
VYRE = VYDISC - v_act_new[i][1];
VZRE = - v_act_new[i][2];
VRE = sqrt( SQR(VXRE) + SQR(VYRE) + SQR(VZRE) );
coef = Qtot*RHO*VRE;
FDRAGX = coef*VXRE;
FDRAGY = coef*VYRE;
FDRAGZ = coef*VZRE;
DVXRE = -sqrt_m_bh * v_act_new[i][1]/RDISC_3over2
+sqrt_m_bh * 1.5*x_act_new[i][1]*R_DOT/RDISC_5over2
-a_act_new[i][0];
DVYRE = +sqrt_m_bh * v_act_new[i][0]/RDISC_3over2
-sqrt_m_bh * 1.5*x_act_new[i][0]*R_DOT/RDISC_5over2
-a_act_new[i][1];
DVZRE = -a_act_new[i][2];
DVRE = (VXRE*DVXRE + VYRE*DVYRE + VZRE*DVZRE)/VRE;
KFDOT = Qtot*RHO;
adot_drag[K][0] = KFDOT*(RHODOT*VXRE*VRE + DVRE*VXRE + DVXRE*VRE);
adot_drag[K][1] = KFDOT*(RHODOT*VYRE*VRE + DVRE*VYRE + DVYRE*VRE);
adot_drag[K][2] = KFDOT*(RHODOT*VZRE*VRE + DVRE*VZRE + DVZRE*VRE);
pot_drag = -0.5*( (a_drag[K][0]+FDRAGX)*(x_act_new[i][0]-x_act[i][0]) +
(a_drag[K][1]+FDRAGY)*(x_act_new[i][1]-x_act[i][1]) +
(a_drag[K][2]+FDRAGZ)*(x_act_new[i][2]-x_act[i][2]) );
E_sd += m[K]*pot_drag;
a_drag[K][0] = FDRAGX;
a_drag[K][1] = FDRAGY;
a_drag[K][2] = FDRAGZ;
}
else
{
adot_drag[K][0] = 0.0;
adot_drag[K][1] = 0.0;
adot_drag[K][2] = 0.0;
a_drag[K][0] = 0.0;
a_drag[K][1] = 0.0;
a_drag[K][2] = 0.0;
} /* if( (RDISC2 < r_lim2) && (Z2 < h_lim2) ) */
} /* i */
}
/***************************************************************/
/***************************************************************/
/***************************************************************/