41 if (gamma_in > 1.0+ep)
43 return ((gamma_in-1)*
gamma(gamma_in-1));
48 if ((gamma_in-ep<1.0) && (gamma_in+ep>1.0))
50 else if ((gamma_in-ep<0.5) && (gamma_in+ep>0.5))
53 return std::numeric_limits<Mdouble>::quiet_NaN();
64 Mdouble mainfactor = pow(x,k/2.0-1)*exp(x/-2.0);
66 return mainfactor/prefactor;
82 const int num_steps_per_unit=100;
85 long int num_steps=
static_cast<int>(num_steps_per_unit*x_max);
87 for (
int i=0;i<num_steps;i++)
89 x=x_max/num_steps*(i+0.5);
92 return 1.0-sum*x_max/num_steps;
110 b0 = x * b1 - b2 + *p++;
114 return( 0.5*(b0-b2) );
122 -4.415341646479339379501E-18,
123 3.330794518822238097831E-17,
124 -2.431279846547954693591E-16,
125 1.715391285555133030611E-15,
126 -1.168533287799345168081E-14,
127 7.676185498604935616881E-14,
128 -4.856446783111929460901E-13,
129 2.955052663129639834611E-12,
130 -1.726826291441555707231E-11,
131 9.675809035373236912241E-11,
132 -5.189795601635262906661E-10,
133 2.659823724682386650351E-9,
134 -1.300025009986248042121E-8,
135 6.046995022541918949321E-8,
136 -2.670793853940611733911E-7,
137 1.117387539120103718151E-6,
138 -4.416738358458750563591E-6,
139 1.644844807072889708931E-5,
140 -5.754195010082103703981E-5,
141 1.885028850958416557291E-4,
142 -5.763755745385823658851E-4,
143 1.639475616941335798421E-3,
144 -4.324309995050575944301E-3,
145 1.054646039459499831831E-2,
146 -2.373741480589946881561E-2,
147 4.930528423967070848781E-2,
148 -9.490109704804764442101E-2,
149 1.716209015222087753491E-1,
150 -3.046826723431983986831E-1,
151 6.767952744094760849951E-1
157 -7.233180487874753954561E-18,
158 -4.830504485944182071261E-18,
159 4.465621420296759999011E-17,
160 3.461222867697461093101E-17,
161 -2.827623980516583484941E-16,
162 -3.425485619677219134621E-16,
163 1.772560133056526383601E-15,
164 3.811680669352622420751E-15,
165 -9.554846698828307648701E-15,
166 -4.150569347287222086631E-14,
167 1.540086217521409826911E-14,
168 3.852778382742142701141E-13,
169 7.180124451383666233671E-13,
170 -1.794178531506806117781E-12,
171 -1.321581184044771311881E-11,
172 -3.149916527963241364541E-11,
173 1.188914710784643834241E-11,
174 4.940602388224969589101E-10,
175 3.396232025708386345151E-9,
176 2.266668990498178064591E-8,
177 2.048918589469063741831E-7,
178 2.891370520834756482971E-6,
179 6.889758346916823984261E-5,
180 3.369116478255694089901E-3,
181 8.044904110141088316081E-1
194 return(
chebyshev( 32.0/x - 2.0, B, 25 ) / sqrt(x) );
201 return exp(x) *
I0_exp(x);
206 std::string line_string;
207 getline(in,line_string);
208 out.str(line_string);
215 ans.
disp = - 2.0 * mass * std::log(r) / tc;
224 ans.
disp = - 2.0 * mass * log(r) / tc;
228 else ans.
dispt = 2.*sqrt(1.0/7.0*mass*ans.
kt);
238 std::cerr <<
"Error in get_collision_time(Mdouble mass) mass is not set or has an unexpected value, (get_collision_time("<<mass<<
"))"<< std::endl;
243 std::cerr <<
"Error in get_collision_time(Mdouble mass) stiffness is not set or has an unexpected value, (get_collision_time("<<mass<<
"), with stiffness="<<k<<
")"<< std::endl;
248 std::cerr <<
"Error in get_collision_time(Mdouble mass) dissipation is not set or has an unexpected value, (get_collision_time("<<mass<<
"), with dissipation="<<disp<<
")"<< std::endl;
257 std::cerr <<
"Error in get_collision_time(Mdouble mass) values for mass, stiffness and dissipation lead to an over-damped system, (get_collision_time("<<mass<<
"), with stiffness="<<k<<
" and dissipation="<<disp<<
")"<< std::endl;
276 Mdouble w = sqrt(k/mass -
sqr(disp/(2.0*mass)));
278 Mdouble DispCorrection = exp(-disp/mass/w)*asin(w/w0);
280 return radius * sqrt(8.0*k/mass) / DispCorrection;
Mdouble chebyshev(Mdouble x, const Mdouble coef[], int N)
KAndDisp computeKAndDispFromCollisionTimeAndRestitutionCoefficientAndEffectiveMass(Mdouble tc, Mdouble r, Mdouble mass)
Set disp and k such that is matches a given collision time tc and restitution coefficient r for a col...
Mdouble getMaximumVelocity(Mdouble k, Mdouble disp, Mdouble radius, Mdouble mass)
Calculates the maximum relative velocity allowed for a normal collision of two particles of radius r ...
return type specifically for fuctions returning k and disp at once
void getLineFromStringStream(std::istream &in, std::stringstream &out)
Mdouble I0_exp(Mdouble x)
return type specifically for fuctions returning k, disp, kt, dispt at once
Mdouble getRestitutionCoefficient(Mdouble k, Mdouble disp, Mdouble mass)
Calculates restitution coefficient for two copies of given disp, k, effective mass.
Mdouble gamma(Mdouble gamma_in)
This is the gamma function returns the true value for the half integer value.
KAndDispAndKtAndDispt computeDisptFromCollisionTimeAndRestitutionCoefficientAndTangentialRestitutionCoefficientAndEffectiveMass(Mdouble tc, Mdouble r, Mdouble beta, Mdouble mass)
Set disp, k, dispt and kt such that is matches a given collision time tc and a normal andtangential r...
Mdouble chi_squared_prob(Mdouble x, int k)
This is the function which actually gives the probability back using a chi squared test...
Mdouble getCollisionTime(Mdouble k, Mdouble disp, Mdouble mass)
Calculates collision time for two copies of a particle of given disp, k, effective mass...
Mdouble chi_squared(Mdouble x, int k)
This is a chi_squared function return the value x and degrees of freedom k.