-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathplanet.c
More file actions
119 lines (90 loc) · 2.95 KB
/
Copy pathplanet.c
File metadata and controls
119 lines (90 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "paul.h"
double PHI_ORDER = 2.0;
double get_dp( double , double );
double phigrav( double M , double r , double eps ){
double n = PHI_ORDER;
return( M/pow( pow(r,n) + pow(eps,n) , 1./n ) ) ;
}
double fgrav( double M , double r , double eps ){
double n = PHI_ORDER;
return( M*pow(r,n-1.)/pow( pow(r,n) + pow(eps,n) ,1.+1./n) );
}
void adjust_gas( struct planet * pl , double * x , double * prim , double gam ){
double r = x[0];
double phi = x[1];
double rp = pl->r;
double pp = pl->phi;
double cosp = cos(phi);
double sinp = sin(phi);
double dx = r*cosp-rp*cos(pp);
double dy = r*sinp-rp*sin(pp);
double script_r = sqrt(dx*dx+dy*dy);
double pot = phigrav( pl->M , script_r , pl->eps );
double c2 = gam*prim[PPP]/prim[RHO];
double factor = 1. + (gam-1.)*pot/c2;
prim[RHO] *= factor;
prim[PPP] *= pow( factor , gam );
}
void planetaryForce( struct planet * pl , double r , double phi , double z , double * fr , double * fp , double * fz , int mode ){
z = 0.0;
double rp = pl->r;
double pp = pl->phi;
double cosp = cos(phi);
double sinp = sin(phi);
double dx = r*cosp-rp*cos(pp);
double dy = r*sinp-rp*sin(pp);
double script_r = sqrt(dx*dx+dy*dy+z*z);
double script_r_perp = sqrt(dx*dx+dy*dy);
double f1 = -fgrav( pl->M , script_r , pl->eps );
double cosa = dx/script_r;
double sina = dy/script_r;
double cosap = cosa*cosp+sina*sinp;
double sinap = sina*cosp-cosa*sinp;
if( mode==1 ){
cosap = cosa*cos(pp)+sina*sin(pp);
sinap = sina*cos(pp)-cosa*sin(pp);
}
/*
double rH = rp*pow( pl->M/3.,1./3.);
double pd = 0.8;
double fd = 1./(1.+exp(-( script_r/rH-pd)/(pd/10.)));
*/
double sint = script_r_perp/script_r;
double cost = z/script_r;
*fr = cosap*f1*sint; //*fd;
*fp = sinap*f1*sint; //*fd;
*fz = f1*cost;
}
void planet_src( struct planet * pl , double * prim , double * cons , double * xp , double * xm , double dVdt ){
double rp = xp[0];
double rm = xm[0];
double rho = prim[RHO];
double vr = prim[URR];
double vz = prim[UZZ];
double omega = prim[UPP];
double r = 0.5*(rp+rm);
double vp = r*omega;
double dphi = get_dp(xp[1],xm[1]);
double phi = xm[1] + 0.5*dphi;
double z = .5*(xp[2]+xm[2]);
double Fr,Fp,Fz;
planetaryForce( pl , r , phi , z , &Fr , &Fp , &Fz , 0 );
cons[SRR] += rho*Fr*dVdt;
cons[SZZ] += rho*Fz*dVdt;
cons[LLL] += rho*Fp*r*dVdt;
cons[TAU] += rho*( Fr*vr + Fz*vz + Fp*vp )*dVdt;
}
void planet_RK_copy( struct planet * pl ){
pl->RK_r = pl->r;
pl->RK_phi = pl->phi;
pl->RK_M = pl->M;
pl->RK_omega = pl->omega;
pl->RK_vr = pl->vr;
}
void planet_RK_adjust( struct planet * pl , double RK ){
pl->r = (1.-RK)*pl->r + RK*pl->RK_r;
pl->phi = (1.-RK)*pl->phi + RK*pl->RK_phi;
pl->M = (1.-RK)*pl->M + RK*pl->RK_M;
pl->omega = (1.-RK)*pl->omega + RK*pl->RK_omega;
pl->vr = (1.-RK)*pl->vr + RK*pl->RK_vr;
}