OSHUN  beta
Arbitrary Order Spherical-Harmonic 1D-3P Vlasov-Fokker-Planck-Maxwell code
collisions.cpp
Go to the documentation of this file.
1 
14 // Standard libraries
15 #include <iostream>
16 #include <vector>
17 #include <valarray>
18 #include <complex>
19 #include <algorithm>
20 #include <cstdlib>
21 
22 #include <math.h>
23 #include <map>
24 
25 // My libraries
26 #include "lib-array.h"
27 #include "lib-algorithms.h"
28 #include "exprtk.hpp"
29 
30 // Declarations
31 #include "input.h"
32 #include "state.h"
33 #include "setup.h"
34 #include "formulary.h"
35 #include "nmethods.h"
36 #include "collisions.h"
37 
38 
39 
40 
41 //---------------------------------------------------------------------------------------------
42 //---------------------------------------------------------------------------------------------
43 //*********************************************************************************************
44 self_f00_implicit_step::self_f00_implicit_step(const size_t &nump, const double &pmax, const double &_mass, const double& _deltat, bool& _ib):
45  vr(Algorithms::MakeCAxis(0.0,pmax,nump)), C_RB(0.0,nump+1), D_RB(0.0,nump+1), delta_CC(0.0,nump+1),
46  mass(_mass), dt(_deltat),
47  dvr(0.0,nump), vrh(0.0,nump), dtoverv2(nump),
48  p2dp(0.0,nump),p2dpm1(0.0,nump),phdp(0.0,nump),phdpm1(0.0,nump), p4dp(0.0,nump), laser_Inv_Uav6(0.0,nump),
49  I4_Lnee(0.0), ib(_ib)
50 {
51 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
54  //classical electron radius
55  double re(2.8179402894e-13); //< classical electron radius
56  double kp(sqrt(4.0*M_PI*(Input::List().density_np)*re)); //< sqrt(4*pi*n_{e0}*re).
57  c_kpre = re*kp; //< (4*pi*re)^1.5*sqrt(n_{e0})/3.
58 
59  // Determine vr
60  for (size_t i(0); i < vr.size(); ++i) {
61  vr[i] /= mass;
62  }
63 
64  for (size_t i(0); i < vr.size()-1; ++i) {
65  vrh[i] = 0.5*(vr[i+1] - vr[i]);
66  dvr[i] = (vr[i+1] - vr[i]);
67  }
68  vrh[vrh.size()-1] = 0.0;
69  dvr[vrh.size()-1] = dvr[vrh.size()-2];
70 
71  for (size_t i(1); i < vr.size(); ++i) {
72  p2dp[i] = 0.5 * vr[i]*vr[i] * (vr[i]-vr[i-1]);
73  p2dpm1[i] = 0.5 * vr[i-1]*vr[i-1] * (vr[i]-vr[i-1]);
74  p4dp[i] = 0.5 * pow(vr[i],4) * (vr[i]-vr[i-1]);
75 // p4dpm1[i] = 0.5 * pow(vr[i-1],4) * (vr[i]-vr[i-1]);
76  phdp[i] = 0.5 * vrh[i] * (vrh[i]-vrh[i-1]);
77  phdpm1[i] = 0.5 * vrh[i-1] * (vrh[i]-vrh[i-1]);
78  }
79 
80 
81  for (size_t i(0); i < vr.size(); ++i) {
82  dtoverv2[i] = dt / vr[i] / vr[i] / dvr[i];
83  }
84 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
85 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
87  for (size_t i(0); i < vr.size(); ++i) {
88  laser_Inv_Uav6[i] = pow( 2.0/(vr[i+1]+vr[i]), 6);
89  }
90 
91  double omega_0(3.0e+10*2.0*M_PI/(1.0e-4*Input::List().lambda_0));
92  double omega_p(5.64 * 1.0e+4*sqrt(Input::List().density_np));
93  vw_coeff_cube = omega_p/omega_0 * c_kpre;
94 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
95 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
97 
98 }
99 //---------------------------------------------------------------------------------------------
100 //---------------------------------------------------------------------------------------------
101 //*********************************************************************************************
102 //---------------------------------------------------------------------------------------------
103 //---------------------------------------------------------------------------------------------
104 void self_f00_implicit_step::update_C_Rosenbluth(valarray<double> &fin) {
108 
109  C_RB[0] = 0.0;
110  I4_Lnee = 0.0;
111  for (int n(1); n < C_RB.size(); ++n) {
112 // C_RB[n] = p2dp[n-1] * fin[n-1] + p2dpm1[n-1] * fin[n - 2];
113  C_RB[n] = vr[n - 1] * vr[n - 1] * dvr[n - 1] * fin[n - 1];
114 
115 
116  C_RB[n] += C_RB[n - 1];
117 
118 
119  I4_Lnee += p4dp[n - 1] * fin[n - 1];
120 
121  }
122  C_RB *= 4.0 * M_PI;
123  I4_Lnee *= 4.0 * M_PI;
124 }
125 //---------------------------------------------------------------------------------------------
126 //---------------------------------------------------------------------------------------------
127 double self_f00_implicit_step::update_D_Rosenbluth(const size_t& k, valarray<double>& fin, const double& delta) {
128 
129  double answer(0.0);
130 
131  valarray<double> innersum(fin.size() - 1);
132 
133  int n(innersum.size()-1);
134 
136  innersum[n] = (1.0 - delta) * fin[n + 1] + delta * fin[n];
137  innersum[n] *= (vr[n + 1] * vr[n + 1] - vr[n] * vr[n]);
138 
139 
140  --n;
141 
142  for (n; n > -1; --n) {
143  innersum[n] = (1.0 - delta) * fin[n + 1] + delta * fin[n];
144  innersum[n] *= (vr[n + 1] * vr[n + 1] - vr[n] * vr[n]);
145 
146  innersum[n] += innersum[n + 1];
147 
148 // std::cout << "\n innersum[" << n << "] = " << innersum[n] << "\n";
149 
150  }
151 
155  for (size_t l(1); l < k + 1; ++l) {
156  answer += vr[l - 1] * vr[l - 1] * dvr[l - 1] * innersum[l - 1];
157  }
158 
159  answer *= 4.0 * M_PI;
160  answer *= 1.0 / (vr[k - 1] + vr[k]);
161 
162  return answer;
163 }
164 //---------------------------------------------------------------------------------------------
165 //---------------------------------------------------------------------------------------------
166 void self_f00_implicit_step::update_D_and_delta(valarray<double>& fin){
167  size_t iterations(0);
168  bool iteration_check(0);
169  double D(0.0);
170  double Dold(10.0);
171  double delta(0.5);
172 
173 
177 
178 
179  D_RB[0] = 0.0;
180  D_RB[D_RB.size()-1] = 0.0;
181 
182  delta_CC[0] = 0.5;
183  delta_CC[D_RB.size()-1] = 0.0;
184 
185  for (size_t k(1); k < fin.size(); ++k){
186  delta = 0.5;
187  D = 0.0;
188  Dold = 10.0;
189  iterations = 0;
190  iteration_check = 0;
191  do
192  {
193  D = update_D_Rosenbluth(k,fin,delta);
194 // std::cout << ", D[" << k << "] = " << D;
195  if (fabs(D-Dold) < Input::List().RB_D_tolerance*(1.0+fabs(D+Dold))) iteration_check = 1;
196 
197  delta = calc_delta_ChangCooper(k, C_RB[k], D);
198 // std::cout << ", delta[" << k << "] = " << delta;
199  ++iterations;
200 
201  if (iterations > Input::List().RB_D_itmax) iteration_check = 1;
202  Dold = D;
203 
204  } while(!iteration_check);
205 // std::cout << "\n Chang-cooper iterations = " << iterations << "\n";
206 
207 
208  D_RB[k] = D;
209  delta_CC[k] = delta;
210 
211 
212 
213 // std::cout << "\n C[" << k << "] = " << C_RB[k];
214 // std::cout << ", D[" << k << "] = " << D;
215 // std::cout << ", delta[" << k << "] = " << delta;
216 
217 
218  }
219 // exit(1);
220 
221 }
222 //---------------------------------------------------------------------------------------------
223 //---------------------------------------------------------------------------------------------
224 double self_f00_implicit_step::calc_delta_ChangCooper(const size_t& k, const double& C, const double& D){
225  double answer(0.5);
226  double W = 0.5*(dvr[k-1]+dvr[k])*C/D;
227 
228  if (W > 1.0e-8){
229  answer = 1.0/W - 1.0/(exp(W)-1.0);
230  }
231  return answer;
232 }
233 //---------------------------------------------------------------------------------------------
234 //---------------------------------------------------------------------------------------------
235 void self_f00_implicit_step::update_D_inversebremsstrahlung(const double& Z0, const double& heating_coefficient, const double& vos){
236 
237  double vw_cube;// = vw_coeff_cube; * ZLn_ei * 4.0*M_PI*I2;;
238 
239  double temperature = I4_Lnee/3.0/C_RB[C_RB.size()-1];
240  vw_cube = Z0*formulas.Zeta*formulas.LOGei(C_RB[C_RB.size()-1],temperature,Z0*formulas.Zeta);
241  vw_cube *= vw_coeff_cube * C_RB[C_RB.size()-1];
242 
243  double ZLnee = Z0*formulas.Zeta*formulas.LOGee(C_RB[C_RB.size()-1],temperature);
244 
245  double g, b0, nueff, xsi;
246 
247 // xsi = 3.84+(142.59-65.48*vos/sqrt(temperature)/(27.3*vos/sqrt(temperature)+vos*vos/temperature);
248 
249 
250  for (size_t ip(1); ip < D_RB.size()-1; ++ip){
251 // b0 = (vos*vos+5.0*vr[ip]*vr[ip])/(5.0*vr[ip]*vr[ip]);
252 // nueff = ZLnee/pow(vr[ip]*vr[ip]+vos*vos/xsi,1.5);
253 // g = 1.0 - b0*nueff*vw_cube/(1.0+b0*b0*nuOeff*vw_cube);
254 
255 
256 
257  g = laser_Inv_Uav6[ip] * vw_cube * vw_cube;
258  g = 1.0 / (1.0 + g);
259 
260  D_RB[ip] += heating_coefficient * g / vr[ip];
261  }
262 
263 }
264 //---------------------------------------------------------------------------------------------
265 //---------------------------------------------------------------------------------------------
266 void self_f00_implicit_step::takestep(valarray<double> &fin, valarray<double> &fh, const double& Z0, const double& vos, const double& cooling) {
267 
268  double collisional_coefficient;
269  double heating_coefficient;
270 
271  Array2D<double> LHS(fin.size(),fin.size());
272 
274  update_C_Rosenbluth(fin);
275  update_D_and_delta(fin);
276 
278  collisional_coefficient = formulas.LOGee(C_RB[C_RB.size()-1],I4_Lnee/3.0/C_RB[C_RB.size()-1]);
279  collisional_coefficient *= 4.0*M_PI/3.0*c_kpre;
280 
281 
282 
283  heating_coefficient = formulas.Zeta*Z0*formulas.LOGei(C_RB[C_RB.size()-1],I4_Lnee/3.0/C_RB[C_RB.size()-1],Z0*formulas.Zeta);
284  heating_coefficient *= c_kpre / 6.0 * pow(vos,2.0) * C_RB[C_RB.size()-1];
285  heating_coefficient /= collisional_coefficient;
286 
287  if (ib) update_D_inversebremsstrahlung(Z0, heating_coefficient, vos);
288 
290 
291  size_t ip(0);
292 
294  LHS(ip, ip + 1) = - dtoverv2[ip] * collisional_coefficient
295  * (C_RB[ip + 1] * (1.0 - delta_CC[ip + 1])
296  + D_RB[ip + 1] / dvr[ip + 1]);
297 
298  LHS(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
299  * (C_RB[ip + 1] * delta_CC[ip + 1] - D_RB[ip + 1] / dvr[ip + 1]
300  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
301 
302 
303  for (ip = 1; ip < fin.size() - 1; ++ip){
304  LHS(ip, ip + 1) = - dtoverv2[ip] * collisional_coefficient
305  * (C_RB[ip + 1] * (1.0 - delta_CC[ip + 1])
306  + D_RB[ip + 1] / dvr[ip + 1]);
307 
308  LHS(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
309  * (C_RB[ip + 1] * delta_CC[ip + 1] - D_RB[ip + 1] / dvr[ip + 1]
310  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
311 
312  LHS(ip, ip - 1) = dtoverv2[ip] * collisional_coefficient
313  * (C_RB[ip] * delta_CC[ip]
314  - D_RB[ip] / dvr[ip]);
315 
316  }
317 
318  ip = fin.size() - 1;
319 
320  LHS(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
321  * (C_RB[ip + 1] * delta_CC[ip + 1]
322  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
323 
324  LHS(ip, ip - 1) = dtoverv2[ip] * collisional_coefficient
325  * (C_RB[ip] * delta_CC[ip]
326  - D_RB[ip] / dvr[ip]);
327 
328 // std::cout << "\n\n LHS = \n";
329 // for (size_t i(0); i < LHS.dim1(); ++i) {
330 // std::cout << "i = " << i << " :::: ";
331 // for (size_t j(0); j < LHS.dim2(); ++j) {
332 // std::cout << LHS(i, j) << " ";
333 // }
334 // std::cout << "\n";
335 // }
336 
337 
338  Thomas_Tridiagonal(LHS,fin,fh);
339 
340 }
341 //---------------------------------------------------------------------------------------------
342 //---------------------------------------------------------------------------------------------
343 void self_f00_implicit_step::getleftside(valarray<double> &fin, const double& Z0, const double& vos, const double& cooling, Array2D<double> &LHStemp) {
344 
345  double collisional_coefficient;
346  double heating_coefficient;
347 
348 // Array2D<double> LHS(fin.size(),fin.size());
349 
351  update_C_Rosenbluth(fin);
352  update_D_and_delta(fin);
353 
355  collisional_coefficient = formulas.LOGee(C_RB[C_RB.size()-1],I4_Lnee/3.0/C_RB[C_RB.size()-1]);
356  collisional_coefficient *= 4.0*M_PI/3.0*c_kpre;
357 
358 
359 
360  heating_coefficient = formulas.Zeta*Z0*formulas.LOGei(C_RB[C_RB.size()-1],I4_Lnee/3.0/C_RB[C_RB.size()-1],Z0*formulas.Zeta);
361  heating_coefficient *= c_kpre / 6.0 * pow(vos,2.0) * C_RB[C_RB.size()-1];
362  heating_coefficient /= collisional_coefficient;
363 
364  if (ib) update_D_inversebremsstrahlung(Z0, heating_coefficient,vos);
365 
367 
368  size_t ip(0);
369 
371  LHStemp(ip, ip + 1) = - dtoverv2[ip] * collisional_coefficient
372  * (C_RB[ip + 1] * (1.0 - delta_CC[ip + 1])
373  + D_RB[ip + 1] / dvr[ip + 1]);
374 
375  LHStemp(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
376  * (C_RB[ip + 1] * delta_CC[ip + 1] - D_RB[ip + 1] / dvr[ip + 1]
377  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
378 
379 
380  for (ip = 1; ip < fin.size() - 1; ++ip){
381  LHStemp(ip, ip + 1) = - dtoverv2[ip] * collisional_coefficient
382  * (C_RB[ip + 1] * (1.0 - delta_CC[ip + 1])
383  + D_RB[ip + 1] / dvr[ip + 1]);
384 
385  LHStemp(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
386  * (C_RB[ip + 1] * delta_CC[ip + 1] - D_RB[ip + 1] / dvr[ip + 1]
387  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
388 
389  LHStemp(ip, ip - 1) = dtoverv2[ip] * collisional_coefficient
390  * (C_RB[ip] * delta_CC[ip]
391  - D_RB[ip] / dvr[ip]);
392 
393  }
394 
395  ip = fin.size() - 1;
396 
397  LHStemp(ip , ip) = 1.0 - dtoverv2[ip] * collisional_coefficient
398  * (C_RB[ip + 1] * delta_CC[ip + 1]
399  - C_RB[ip] * (1.0 - delta_CC[ip]) - D_RB[ip] / dvr[ip]);
400 
401  LHStemp(ip, ip - 1) = dtoverv2[ip] * collisional_coefficient
402  * (C_RB[ip] * delta_CC[ip]
403  - D_RB[ip] / dvr[ip]);
404 
405 // std::cout << "\n\n LHS = \n";
406 // for (size_t i(0); i < LHS.dim1(); ++i) {
407 // std::cout << "i = " << i << " :::: ";
408 // for (size_t j(0); j < LHS.dim2(); ++j) {
409 // std::cout << LHS(i, j) << " ";
410 // }
411 // std::cout << "\n";
412 // }
413 
414 //
415 // Thomas_Tridiagonal(LHS,fin,fh);
416 
417 }
418 //---------------------------------------------------------------------------------------------
419 //---------------------------------------------------------------------------------------------
420 //*********************************************************************************************
421 //---------------------------------------------------------------------------------------------
422 //---------------------------------------------------------------------------------------------
424 //-------------------------------------------------------------------
425 // Constructor
426 //-------------------------------------------------------------------
427  : fin(0.0, DFin(0,0).nump()), fout(0.0, DFin(0,0).nump()),
428  xgrid(Algorithms::MakeCAxis(Input::List().xminLocal[0],Input::List().xmaxLocal[0],Input::List().NxLocal[0])),
429  IB_heating(Input::List().IB_heating), MX_cooling(Input::List().MX_cooling),
430  heatingprofile(0.0,DFin(0,0).numx()), coolingprofile(0.0,DFin(0,0).numx()),
431  ib(((DFin.q() == -1) && (DFin.mass() == 1))),
432  collide(DFin(0,0).nump(),DFin.pmax(),DFin.mass(), deltat, ib)
433 {
434 
436  szx = Input::List().NxLocal[0]; // size of useful x axis
437 }
438 //-------------------------------------------------------------------
439 
440 
441 //-------------------------------------------------------------------
442 void self_f00_implicit_collisions::loop(SHarmonic1D& f00, valarray<double>& Zarray, const double time, SHarmonic1D& f00h){
443 
444  //-------------------------------------------------------------------
445  // This loop scans all the locations in configuration space
446  // and calls the implicit Chang-Cooper/Langdon/Epperlein algorithm
447  //-------------------------------------------------------------------
448  // Initialization
449  //-------------------------------------------------------------------
450 
451  int ixtimesnump;
452  Array2D<double> LHS(f00.numx()*f00.nump(),f00.numx()*f00.nump());
453  valarray<double> RHSv(0.0,f00.numx()*f00.nump());
454  valarray<double> solution(0.0,f00.numx()*f00.nump());
455 
456  Array2D<double> LHStemp(f00.nump(),f00.nump());
457 
458  double timecoeff;
459  if (IB_heating && ib){
460 
463  Setup_Y::parseprofile(xgrid, Input::List().intensity_profile_str, heatingprofile);
464  Setup_Y::parseprofile(time, Input::List().intensity_time_profile_str, timecoeff);
465 
467  heatingprofile *= (Input::List().lambda_0 * sqrt(7.3e-19*Input::List().I_0))*timecoeff;
468 
469  }
470 
471 
472  for (size_t ix(0); ix < szx; ++ix){
473  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
474  // Copy data for a specific location in space to valarray
475  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
476  for (size_t ip(0); ip < fin.size(); ++ip){
477  fin[ip] = (f00(ip,ix)).real();
478 // std::cout << "fin[" << ip << "] = " << fin[ip] << "\n";
479  }
480 //
481 // collide.takestep(fin,fout,Zarray[ix],heatingprofile[ix],coolingprofile[ix]);
482 
483  collide.getleftside(fin,Zarray[ix],heatingprofile[ix],coolingprofile[ix],LHStemp);
484 
485  ixtimesnump = ix * f00.nump();
486 
487  for (size_t ip(0); ip < fin.size(); ++ip){
488  if (ip == 0)
489  {
490  LHS(ip + ixtimesnump, ip + 1 + ixtimesnump) = LHStemp(ip, ip + 1);
491  }
492  else if (ip == f00.nump() - 1)
493  {
494  LHS(ip + ixtimesnump, ip - 1 + ixtimesnump) = LHStemp(ip, ip - 1);
495  }
496  else {
497  LHS(ip + ixtimesnump, ip - 1 + ixtimesnump) = LHStemp(ip, ip - 1);
498  LHS(ip + ixtimesnump, ip + 1 + ixtimesnump) = LHStemp(ip, ip + 1);
499  }
500 
501  LHS(ip + ixtimesnump, ip + ixtimesnump) = LHStemp(ip, ip);
502 
503  RHSv[ip + ixtimesnump] = fin[ip];
504 // std::cout << "fin[" << ip << "] = " << fin[ip] << "\n";
505  }
506 
507 
508  // Return updated data to the harmonic
509  /*for (size_t ip(0); ip < fin.size(); ++ip){
510  f00h(ip,ix) = fout[ip];
511 // std::cout << "fout[" << ip << "] = " << fout[ip] << "\n";
512  }*/
513  }
514 
515  Thomas_Tridiagonal(LHS,RHSv,solution);
516 
518  for (size_t ix(0); ix < szx; ++ix){
519  ixtimesnump = ix * f00.nump();
520  for (size_t ip(0); ip < fin.size(); ++ip){
521  f00h(ip,ix) = solution[ip + ixtimesnump];
522  }
523  }
524 
525 
526  //-------------------------------------------------------------------
527 
528 }
529 //-------------------------------------------------------------------
530 //-------------------------------------------------------------------
536 self_f00_explicit_step::self_f00_explicit_step(const size_t& nump, const double& pmax, const double& _mass)
537 //--------------------------------------------------------------
538 // Constructor
539 //--------------------------------------------------------------
540 // : fh(0.0, nump), ///< Dummy distribution
541 // :fh(fslope), ///< Dummy distribution
542 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
544  :
545  mass(_mass),
546 // vr(Algorithms::MakeAxis(pmax/(2.0*nump-1.0),pmax,nump)),
547  vr(Algorithms::MakeCAxis(0.0,pmax,nump)),
548 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
549 
550  U4(0.0, nump),
551  U4m1(0.0, nump),
552  U2(0.0, nump),
553  U2m1(0.0, nump),
554  U1(0.0, nump),
555  U1m1(0.0, nump),
556 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
557 
558  J1(0.0, nump),
559  I2(0.0, nump),
560  I4(0.0, nump),
561 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
562  U3(0.0, nump),
563  Qn(0.0, nump),
564  Pn(0.0, nump)
565 
567 {
568 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
569 
570  //classical electron radius
571  double re(2.8179402894e-13); //< classical electron radius
572  double kp(sqrt(4.0*M_PI*(Input::List().density_np)*re)); //< sqrt(4*pi*n_{e0}*re).
573  c_kpre = 4.0*M_PI/3.0*re*kp; //< (4*pi*re)^1.5*sqrt(n_{e0})/3.
575 
576 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
577 
578  // Determine vr
579  for (size_t i(0); i < vr.size(); ++i) {
580  vr[i] = vr[i] / (sqrt(1.0+vr[i]*vr[i]));
581  }
582 
583 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
584  // Determine U4, U4m1, U2, U2m1, U1, U1m1
585  for (size_t i(1); i < U4.size(); ++i) {
586  U4[i] = 0.5 * pow(vr[i],4) * (vr[i]-vr[i-1]);
587  U4m1[i] = 0.5 * pow(vr[i-1],4) * (vr[i]-vr[i-1]);
588  U2[i] = 0.5 * vr[i]*vr[i] * (vr[i]-vr[i-1]);
589  U2m1[i] = 0.5 * vr[i-1]*vr[i-1] * (vr[i]-vr[i-1]);
590  U1[i] = 0.5 * vr[i] * (vr[i]-vr[i-1]);
591  U1m1[i] = 0.5 * vr[i-1] * (vr[i]-vr[i-1]);
592  }
593 
594 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
595  // Determine U3
596  for (size_t i(0); i < U3.size(); ++i) {
597  U3[i] = pow(vr[i],3);
598  }
599  // Determine Qn
600  Qn[0] = 1.0 / ((vr[0]*vr[0]*vr[1])/2.0);
601  for (size_t i(1); i < Qn.size()-1; ++i) {
602  Qn[i] = 1.0 / (vr[i]*vr[i]*(vr[i+1]-vr[i-1])/2.0);
603  }
604  // Determine Pn
605  for (size_t i(0); i < Pn.size()-1; ++i) {
606  Pn[i] = 1.0 / ((vr[i+1]-vr[i])/2.0*(vr[i+1]+vr[i]));
607 
608 
609  }
610 
611 }
612 //--------------------------------------------------------------
613 
621 double self_f00_explicit_step::G(const int& n, const valarray<double>& fin) {
622 //-------------------------------------------------------------------
623  double i2s, i4s;
624  double f00( (fin[0] - fin[1]*(vr[0]*vr[0])/(vr[1]*vr[1]))/
625  (1.0 - (vr[0]*vr[0])/(vr[1]*vr[1])) );
626 
627  i2s = f00*pow(vr[n],3)/3.0 + (fin[1]-f00)*pow(vr[n],5)/(vr[1]*vr[1])*0.2;
628  i4s = f00*pow(vr[n],5)*0.2 + (fin[1]-f00)*pow(vr[n],7)/(vr[1]*vr[1]*7.0);
629 
630  return fin[n]*i4s + (pow(vr[n],3)*fin[n]-3.0*i2s) * J1[n];
631 }
632 //-------------------------------------------------------------------
633 
639 void self_f00_explicit_step::takestep(const valarray<double>& fin, valarray<double>& fh) {
640 //-------------------------------------------------------------------
641 // Collisions
642 //-------------------------------------------------------------------
643  double Ln_ee;
644 
645 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
646 // Evaluate the integrals in a standard manner
647  I4[0] = 0;
648  for (int n(1); n < I4.size(); ++n) {
649  I4[n] = U4[n]*fin[n]+U4m1[n]*fin[n-1];
650  I4[n] += I4[n-1];
651  }
652 
653  I2[0] = 0;
654  for (int n(1); n < I2.size(); ++n) {
655  I2[n] = U2[n]*fin[n]+U2m1[n]*fin[n-1];
656  I2[n] += I2[n-1];
657  }
658 
659  J1[J1.size()-1] = 0;
660  for (int n(J1.size()-2); n > -1; --n) {
661  J1[n] = U1[n+1]*fin[n+1]+U1m1[n+1]*fin[n];
662  J1[n] += J1[n+1];
663 
664  }
665 
666 
667 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
668 // Use I2 and I4 to calculate the Coulomb logarithm now, the
669 // arrays I2 I4 will be modified later and it will be too late.
670 
671  // if (mass == 100.0){
672  // std::cout<< "\n\n\n temp = " << mass*I4[I4.size()-1]/3.0/I2[I4.size()-1] << "\n\n\n";
673  // }
674  Ln_ee = formulas.LOGee(4.0*M_PI*I2[I2.size()-1],I4[I4.size()-1]/3.0/I2[I4.size()-1]);
675 
676  // // I2_temperature = I2[I2.size()-1];
677  // for (int k(0); k < I4.size(); ++k){
678  // I4[k] /= vr[k]*vr[k];
679  // }
680 
681 
682 // <><><><><><><><><><><><><><><><><><>
683 // Tony's Energy Conserving Algorithm
684 // <><><><><><><><><><><><><><><><><><>
685 
686 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
687 // Evaluate G using the standard integrals
688 // J1 needs to be used again later so it is not modified!
689  for (int n(0); n < I4.size(); ++n) {
690  I2[n] *= J1[n]; // J1(n) * I2(n)
691  I2[n] *= -3.0; // -3 * J1(n) * I2(n)
692  I4[n] += U3[n] * J1[n]; // I4(n) + u_n^3 * J1(n)
693  I4[n] *= fin[n]; // fn * I4(n) + u_n^3 * fn * J1(n)
694  I4[n] += I2[n]; // Gn = fn * I4(n) + u_n^3 * fn * J1(n) - 3 * J1(n) * I2(n)
695  //
696 
697  }
698 
699 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
700 // Evaluate G assuming a parabolic f(v << vt)
701  for (int n(0); n < NB; ++n) {
702  I4[n] = G(n,fin);
703 
704  }
705 
706 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
707 // Find -DG
708  fh[0] = (-1.0)*I4[0];
709  for (int n(0); n < I4.size()-1; ++n) I4[n] -= I4[n+1];
710 
711 // Find -DG/(vDv)
712  fh[0] *= 2.0/ (vr[0]*vr[0]);
713  for (int n(0); n < I4.size()-1; ++n) I4[n] *= Pn[n];
714 
715 // Find DDG/(vDv)
716  fh[0] -= I4[0];
717  for (int n(0); n < I4.size()-1; ++n) I4[n] -= I4[n+1];
718 
719 // Find DDG/(v^3*DDv)
720  fh[0] *= Qn[0];
721  for (int n(0); n < I4.size()-1; ++n) fh[n+1] = Qn[n+1]*I4[n];
722 
723 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
724 // Normalize
725  fh *= c_kpre * Ln_ee;
726 }
727 //-------------------------------------------------------------------
728 //*******************************************************************
729 
730 //*******************************************************************
731 //*******************************************************************
732 // Runge Kutta loop for the electron-electron collisions
733 //*******************************************************************
734 
735 //-------------------------------------------------------------------
736 //*******************************************************************
737 //------------------------------------------------------------------------------
743 self_f00_RKfunctor::self_f00_RKfunctor(const size_t& nump, const double& pmax, const double& mass)
744 //-------------------------------------------------------------------
745 // Constructor
746 //-------------------------------------------------------------------
747  :collide(nump,pmax,mass){}
748 //--------------------------------------------------------------
749 
753 void self_f00_RKfunctor::operator()(const valarray<double>& fin, valarray<double>& fslope) {
754  collide.takestep(fin,fslope);
755 }
756 
757 void self_f00_RKfunctor::operator()(const valarray<double>& fin, valarray<double>& fslope, size_t dir) {}
758 void self_f00_RKfunctor::operator()(const valarray<double>& fin, const valarray<double>& f2in, valarray<double>& fslope) {}
759 //*******************************************************************
760 //*******************************************************************
761 // Definition for the Explicit Integration method for the
762 // energy relaxation of the distribution function
763 //*******************************************************************
764 //*******************************************************************
765 
766 
767 //*******************************************************************
768 //-------------------------------------------------------------------
769 self_f00_explicit_collisions::self_f00_explicit_collisions(const DistFunc1D& DFin, const double& deltat)//, int tout_start) //DistFunc1D& DFin,
770 //-------------------------------------------------------------------
771 // Constructor
772 //-------------------------------------------------------------------
773  : fin(0.0, DFin(0,0).nump()),
774  RK(fin),
775  rkf00(DFin(0,0).nump(), DFin.pmax(), DFin.mass()),
776  num_h(size_t(deltat/Input::List().small_dt)+1)
777 {
778  h = deltat/static_cast<double>(num_h);
779 
781  szx = Input::List().NxLocal[0]; // size of useful x axis
782 }
783 //-------------------------------------------------------------------
784 
785 
786 //-------------------------------------------------------------------
788 
789  //-------------------------------------------------------------------
790  // This loop scans all the locations in configuration space
791  // and calls the RK4 for explicit integration at each location
792  //-------------------------------------------------------------------
793  // Initialization
794 
795  for (size_t ix(0); ix < szx; ++ix){
796  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
797 
798  // Copy data for a specific location in space to valarray
799  for (size_t ip(0); ip < fin.size(); ++ip){
800  fin[ip] = (f00(ip,ix)).real();
801  }
802 
803  // std::cout << "\n\n h = " << num_h << ", \n \n";
804  // Time loop: Update the valarray
805  for (size_t h_step(0); h_step < num_h; ++h_step){
806  fin = RK(fin,h,&rkf00);
807  }
808 
809  // Return updated data to the harmonic
810  for (int ip(0); ip < fin.size(); ++ip){
811  f00h(ip,ix) = fin[ip];
812  }
813 
814 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
815  }
816 
817 
818 }
819 
820 //*******************************************************************
821 //*******************************************************************
822 // Definition of collisions with high order harmonics FLM
823 //*******************************************************************
824 //*******************************************************************
825 
826 
827 //*******************************************************************
828 //--------------------------------------------------------------
829 self_flm_implicit_step::self_flm_implicit_step(double pmax, size_t nump, double _mass)
830 //--------------------------------------------------------------
831 // Constructor
832 //--------------------------------------------------------------
833  :
834 // Pre-Calculated Constants
835 
836 // vr(Algorithms::MakeAxis(pmax/(2.0*nump-1.0),pmax,nump)),
837  vr(Algorithms::MakeCAxis(0.0,pmax,nump)),
838 // Constants for Integrals
839  U4(0.0, nump),
840  U4m1(0.0,nump),
841  U2(0.0, nump),
842  U2m1(0.0,nump),
843  U1(0.0, nump),
844  U1m1(0.0,nump),
845 // Integrals
846  J1m(0.0, nump),
847  I0(0.0, nump),
848  I2(0.0, nump),
849  Scattering_Term(0.0, nump),
850  df0(0.0, nump),
851  ddf0(0.0, nump),
852 // Matrices
853  Alpha_Tri(nump, nump),
854  if_tridiagonal(Input::List().if_tridiagonal),
855  mass(_mass)
856 // Make matrix vk/vn
857 {
858 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
859 
860  double re(2.8179402894e-13); //classical electron radius
861  double kp(sqrt(4.0*M_PI*(Input::List().density_np)*re));
862 
863  kpre = re*kp;
864 
865  // Determine vr
866  for (size_t i(0); i < vr.size(); ++i) {
867 // vr[i] = vr[i] / (sqrt(1.0+vr[i]*vr[i]));
868  vr[i] /= mass;
869  }
870 
871 // U4[0] = pow(vr[0],4) * (vr[1]-vr[0]);
872 // U2[0] = vr[0]*vr[0] * (vr[1]-vr[0]);
873 // U1[0] = vr[0] * (vr[1]-vr[0]);
874 
875  // Determine U4, U4m1, U2, U2m1, U1, U1m1 for the integrals
876  for (size_t i(1); i < U4.size(); ++i) {
877  U4[i] = 0.5 * pow(vr[i],4) * (vr[i]-vr[i-1]);
878  U4m1[i] = 0.5 * pow(vr[i-1],4) * (vr[i]-vr[i-1]);
879  U2[i] = 0.5 * vr[i]*vr[i] * (vr[i]-vr[i-1]);
880  U2m1[i] = 0.5 * vr[i-1]*vr[i-1] * (vr[i]-vr[i-1]);
881  U1[i] = 0.5 * vr[i] * (vr[i]-vr[i-1]);
882  U1m1[i] = 0.5 * vr[i-1] * (vr[i]-vr[i-1]);
883 
884 // U4[i] = pow(vr[i],4) * (vr[i]-vr[i-1]);
885 // U2[i] = vr[i]*vr[i] * (vr[i]-vr[i-1]);
886 // U1[i] = vr[i] * (vr[i]-vr[i-1]);
887 
888  }
889 }
890 //--------------------------------------------------------------
891 
892 //------------------------------------------------------------------------------
898 void self_flm_implicit_step::reset_coeff(const valarray<double>& fin, double Zvalue, const double Delta_t) {
899 //-------------------------------------------------------------------
900 // Reset the coefficients based on f_0^0
901 //-------------------------------------------------------------------
902 
903 // Calculate Dt
904  Dt = Delta_t;
905 
906  double idp = 1.0/(vr[2] - vr[1]);
907 
908 
909 // INTEGRALS
910 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
911 // Temperature integral I2 = 4*pi / (v^2) * int_0^v f(u)*u^4du
912 // Density integral I0 = 4*pi*int_0^v f(u)*u^2du
913 
914 // I2[0] = U4[0]*fin[0];
915 // I0[0] = U2[0]*fin[0];
916  I2[0] = 0;
917  I0[0] = 0;
918 
919  for (int k(1); k < I2.size(); ++k) {
920  I2[k] = U4[k]*fin[k]+U4m1[k]*fin[k-1];
921  I2[k] += I2[k-1];
922 
923  I0[k] = U2[k]*fin[k]+U2m1[k]*fin[k-1];
924  I0[k] += I0[k-1];
925 
926 // I2[k] = U4[k]*fin[k];
927 // I2[k] += I2[k-1];
928 //
929 // I0[k] = U2[k]*fin[k];
930 // I0[k] += I0[k-1];
931  }
932  I0_density = 4.0*M_PI*I0[I0.size()-1];
933 
934 
935  I2_temperature = I2[I2.size()-1]/3.0/I0[I0.size()-1];
936 
937 
938  // Integral J_(-1) = 4*pi * v * int_0^v f(u)*u^4du
939  J1m[J1m.size()-1] = 0;
940  for (int k(J1m.size()-2); k > -1; --k) {
941  J1m[k] = U1[k+1]*fin[k+1]+U1m1[k+1]*fin[k];
942  J1m[k] += J1m[k+1];
943  }
944 
945 
946  /*J1m[J1m.size()-1] = fin[J1m.size()-1]*U1[U1.size()-1];
947 
948  *//*std::cout << "\nI2[" << U1.size()-1 << "] = " << I2[U1.size()-1] << endl;
949  std::cout << "I0[" << U1.size()-1 << "] = " << I0[U1.size()-1] << endl;
950  std::cout << "J1[" << U1.size()-1 << "] = " << J1m[U1.size()-1] << endl;
951  std::cout << "\n\n";*//*
952 
953 
954  for (int k(J1m.size()-2); k > -1; --k) {
955  J1m[k] = U1[k]*fin[k];//+U1m1[k+1]*fin[k];
956  J1m[k] += J1m[k+1];
957 
958  *//*std::cout << "\nI2[" << k << "] = " << I2[k] << endl;
959  std::cout << "I0[" << k << "] = " << I0[k] << endl;
960  std::cout << "J1[" << k << "] = " << J1m[k] << endl;
961  std::cout << "\n\n";*//*
962  }*/
963 
964 
965  for (int k(0); k < J1m.size(); ++k){
966  I2[k] /= vr[k] * vr[k] / 4.0 / M_PI;
967  I0[k] *= 4.0 * M_PI;
968  J1m[k] *= 4.0 * M_PI * vr[k];
969  }
970 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
971 
972 // COULOMB LOGARITHMS
973 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
976 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
977 
978 
979 // BASIC INTEGRALS FOR THE TRIDIAGONAL PART
980 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
981 // Temporary arrays
982  valarray<double> TriI1(fin), TriI2(fin);
983 
984  for (int i(0); i < TriI1.size(); ++i){
985  TriI1[i] = I0[i] + (2.0*J1m[i] - I2[i]) / 3.0 ; // (-I2 + 2*J_{-1} + 3*I0) / 3
986  TriI2[i] = ( I2[i] + J1m[i] ) / 3.0 ; // ( I2 + J_{-1} ) / 3
987  }
988 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
989 
990 
991 // SCATTERING TERM
992 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
993  Scattering_Term = TriI1;
994  Scattering_Term *= _LOGee; // Electron-electron contribution
995  Scattering_Term[0] = 0.0;
996  Scattering_Term += _ZLOGei * I0_density; // Ion-electron contribution
997 
998  for (int i(0); i < Scattering_Term.size(); ++i){ // Multiply by 1/v^3
999  Scattering_Term[i] /= pow(vr[i],3);
1000  }
1001  Scattering_Term *= kpre * Dt;
1002 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1003 
1004 
1005 // MAKE TRIDIAGONAL ARRAY
1006 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1007  Alpha_Tri = 0.0;
1008 
1009 
1010  double IvDnDm1, IvDnDp1, Ivsq2Dn;
1011  Alpha_Tri(0,0) = 8.0 * M_PI * fin[0]; // 8*pi*f0[0]
1012  for (int i(1); i < TriI1.size()-1; ++i){
1013  IvDnDm1 = 1.0 / (vr[i] * 0.5*(vr[i+1]-vr[i-1]) * (vr[i] - vr[i-1])); // ( v*D_n*D_{n-1/2} )^(-1)
1014  IvDnDp1 = 1.0 / (vr[i] * 0.5*(vr[i+1]-vr[i-1]) * (vr[i+1] - vr[i] )); // ( v*D_n*D_{n+1/2} )^(-1)
1015  Ivsq2Dn = 1.0 / (vr[i] * vr[i] * (vr[i+1] - vr[i-1])); // ( v^2 * 2*D_n )^(-1)
1016  Alpha_Tri(i, i ) = 8.0 * M_PI * fin[i] - TriI2[i] * (IvDnDm1 + IvDnDp1);
1017  Alpha_Tri(i, i-1) = TriI2[i] * IvDnDm1 - TriI1[i] * Ivsq2Dn;
1018  Alpha_Tri(i, i+1) = TriI2[i] * IvDnDp1 + TriI1[i] * Ivsq2Dn;
1019  }
1020 
1021  /*Alpha_Tri(0,0) = 8.0 * M_PI * fin[0]; // 8*pi*f0[0]
1022  for (int i(1); i < TriI1.size()-1; ++i){
1023  Alpha_Tri(i, i ) = - 2.0 * TriI2[i] / vr[i] * idp * idp;
1024  Alpha_Tri(i, i-1) = TriI2[i] / vr[i] * idp * idp - TriI1[i] / 2.0 / vr[i] / vr[i] * idp;
1025  Alpha_Tri(i, i+1) = TriI2[i] / vr[i] * idp * idp + TriI1[i] / 2.0 / vr[i] / vr[i] * idp;
1026  }*/
1027 
1028 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1029 
1030 
1031  Alpha_Tri *= (-1.0) * _LOGee * kpre * Dt; // (-1) because the matrix moves to the LHS in the equation
1032 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1033 /*
1034 
1035 // CALCULATE DERIVATIVES
1036 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1037 
1038  df0[0] = (fin[1] - fin[0]);
1039  df0[0] /= (vr[1] - vr[0]);
1040 // Evaluate the derivative
1041  for (int n(1); n < fin.size()-1; ++n) {
1042  df0[n] = fin[n+1] - fin[n-1];
1043  df0[n] /= vr[n+1] - vr[n-1];
1044  }
1045  df0[df0.size()-1] = fin[df0.size()-1] - fin[df0.size()-2];
1046  df0[df0.size()-1] /= vr[df0.size()-1] - vr[df0.size()-2];
1047 
1048  ddf0[0] = fin[0] - 2.0*fin[1] + fin[2];
1049  ddf0[0] /= vr[1] - vr[0];
1050  ddf0[0] /= vr[1] - vr[0];
1051 // Evaluate the second derivative
1052 // -df/dv_{n-1/2}
1053  for (int n(1); n < fin.size()-1; ++n) {
1054  ddf0[n] = fin[n+1] - 2.0*fin[n] + fin[n-1];
1055  ddf0[n] /= vr[n] - vr[n-1];
1056  ddf0[n] /= vr[n] - vr[n-1];
1057 // ddf0[n] = (fin[n-1]-fin[n]) ;
1058 // ddf0[n] /= vr[n] - vr[n-1] ;
1059  }
1060 
1061  ddf0[ddf0.size()-1] = fin[ddf0.size()-1] - 2.0*fin[ddf0.size()-2] + fin[ddf0.size()-3];
1062  ddf0[ddf0.size()-1] /= vr[vr.size()-1] - vr[vr.size()-2];
1063  ddf0[ddf0.size()-1] /= vr[vr.size()-1] - vr[vr.size()-2];
1064 
1065 // D(df/dv)/Dv
1066 // for (int n(1); n < fin.size()-1; ++n) {
1067 // ddf0[n] -= ddf0[n+1];
1068 // ddf0[n] /= 0.5*(vr[n+1]-vr[n-1]);
1069 // }
1070 
1071 // Calculate zeroth cell
1072 // double f00 = ( fin[0] - ( (vr[0]*vr[0])/(vr[1]*vr[1]) ) *fin[1] )
1073 // / (1.0 - (vr[0]*vr[0])/(vr[1]*vr[1]));
1074 // ddf0[0] = 2.0 * (fin[1] - f00) / (vr[1]*vr[1]);
1075 // df0[0] = ddf0[0] * vr[0];
1076 
1077 // Calculate 1/(2v)*(d^2f)/(dv^2), 1/v^2*df/dv
1078  for (int n(0); n < fin.size()-1; ++n) {
1079  df0[n] /= vr[n]*vr[n];
1080  ddf0[n] /= 2.0 *vr[n];
1081  }
1082 */
1083 
1084 
1085  // Evaluate the derivative
1086  for (int n(1); n < fin.size()-1; ++n) {
1087  df0[n] = fin[n+1]-fin[n-1];
1088  df0[n] /= vr[n+1]-vr[n-1];
1089  }
1090 
1091 // Evaluate the second derivative
1092 // -df/dv_{n-1/2}
1093  for (int n(1); n < fin.size(); ++n) {
1094  ddf0[n] = (fin[n-1]-fin[n]) ;
1095  ddf0[n] /= vr[n] - vr[n-1] ;
1096  }
1097 // D(df/dv)/Dv
1098  for (int n(1); n < fin.size()-1; ++n) {
1099  ddf0[n] -= ddf0[n+1];
1100  ddf0[n] /= 0.5*(vr[n+1]-vr[n-1]);
1101  }
1102 
1103 // Calculate zeroth cell
1104  double f00 = ( fin[0] - ( (vr[0]*vr[0])/(vr[1]*vr[1]) ) *fin[1] )
1105  / (1.0 - (vr[0]*vr[0])/(vr[1]*vr[1]));
1106  ddf0[0] = 2.0 * (fin[1] - f00) / (vr[1]*vr[1]);
1107  df0[0] = ddf0[0] * vr[0];
1108 
1109 // Calculate 1/(2v)*(d^2f)/(dv^2), 1/v^2*df/dv
1110  for (int n(0); n < fin.size()-1; ++n) {
1111  df0[n] /= vr[n]*vr[n];
1112  ddf0[n] /= 2.0 *vr[n];
1113  }
1114 
1115 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1116 
1117 }
1118 //-------------------------------------------------------------------
1119 
1120 //------------------------------------------------------------------------------
1126 void self_flm_implicit_step::advance(valarray<complex<double> >& fin, const int el) {
1127 //-------------------------------------------------------------------
1128 // Collisions
1129 //-------------------------------------------------------------------
1130  Array2D<double> Alpha(Alpha_Tri);
1131  valarray<complex<double> > fout(fin);
1132 
1133 
1134 // ZEROTH CELL FOR TRIDIAGONAL ARRAY
1135 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1136  if (el > 1) {
1137  Alpha(0,0) = 0.0;
1138  }
1139 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1140 
1141  if ( !(if_tridiagonal) ) {
1142 
1143 // CONSTRUCT COEFFICIENTS and then full array
1144 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1145  double LL(el);
1146  double A1( (LL+1.0)*(LL+2.0) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
1147  double A2( (-1.0) *(LL-1.0)* LL / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
1148  double B1( (-1.0) *( 0.5 *LL*(LL+1.0) +(LL+1.0) ) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
1149  double B2( ( (-0.5)*LL*(LL+1.0) +(LL+2.0) ) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
1150  double B3( ( 0.5 *LL*(LL+1.0) +(LL-1.0) ) / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
1151  double B4( ( 0.5 *LL*(LL+1.0) - LL ) / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
1152 
1153 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1154  for (int i(0); i < Alpha.dim1()-1; ++i){
1155  double t1( A1*ddf0[i] + B1*df0[i] );
1156  t1 *= (-1.0) * _LOGee * kpre * Dt;
1157  double t2( A1*ddf0[i] + B2*df0[i] );
1158  t2 *= (-1.0) * _LOGee * kpre * Dt;
1159  double t3( A2*ddf0[i] + B3*df0[i] );
1160  t3 *= (-1.0) * _LOGee * kpre * Dt;
1161  double t4( A2*ddf0[i] + B4*df0[i] );
1162  t4 *= (-1.0) * _LOGee * kpre * Dt;
1163 
1164  Alpha(i,0) += t1 * ( 2.0*M_PI*pow(vr[0]/vr[i],el+2)*vr[0]*vr[0]*(vr[1]-vr[0]) );
1165  Alpha(i,0) += t3 * ( 2.0*M_PI*pow(vr[0]/vr[i],el) *vr[0]*vr[0]*(vr[1]-vr[0]) );
1166 
1167  for (int j(1); j < i; ++j){
1168  Alpha(i,j) += t1 * ( 2.0*M_PI*pow(vr[j]/vr[i],el+2)*vr[j]*vr[j]*(vr[j+1]-vr[j-1]) );
1169  Alpha(i,j) += t3 * ( 2.0*M_PI*pow(vr[j]/vr[i],el) *vr[j]*vr[j]*(vr[j+1]-vr[j-1]) );
1170  }
1171 
1172  Alpha(i,i) += t1 * ( 2.0*M_PI *vr[i]*vr[i]*(vr[i]-vr[i-1]) );
1173  Alpha(i,i) += t3 * ( 2.0*M_PI *vr[i]*vr[i]*(vr[i]-vr[i-1]) );
1174 
1175  Alpha(i,i) += t2 * ( 2.0*M_PI *vr[i]*vr[i]*(vr[i+1]-vr[i]) );
1176  Alpha(i,i) += t4 * ( 2.0*M_PI *vr[i]*vr[i]*(vr[i+1]-vr[i]) );
1177 
1178  for (int j(i+1); j < Alpha.dim2()-1; ++j){
1179  Alpha(i,j) += t2 * ( 2.0*M_PI*pow(vr[j]/vr[i],-el-1)*vr[j]*vr[j]*(vr[j+1]-vr[j-1]) );
1180  Alpha(i,j) += t4 * ( 2.0*M_PI*pow(vr[j]/vr[i],-el+1)*vr[j]*vr[j]*(vr[j+1]-vr[j-1]) );
1181  }
1182  }
1183 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1184  }
1185 
1186 // INCLUDE SCATTERING TERM
1187 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1188  double ll1(static_cast<double>(el));
1189  ll1 *= (-0.5)*(ll1 + 1.0);
1190 
1191  for (int i(0); i < Alpha.dim1(); ++i){
1192  Alpha(i,i) += 1.0 - ll1 * Scattering_Term[i];
1193  }
1194 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1195 
1196 
1197 
1198 
1200  //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1201 // for (int i(0); i < fin.size(); ++i){ // Estimate Fout = Fin / A(i,i)
1202 // fout[i] /= Alpha(i,i);
1203 // }
1204 
1205  if ( if_tridiagonal ) {
1206  if ( !(Thomas_Tridiagonal(Alpha, fin, fout)) ) { // Invert A * fout = fin
1207  cout << "WARNING: Matrix is not diagonally dominant" << endl;
1208  }
1209  }
1210  else {
1211  if ( !(Gauss_Seidel(Alpha, fin, fout)) ) { // Invert A * fout = fin
1212  cout << "WARNING: Matrix is not diagonally dominant" << endl;
1213  }
1214  }
1215 
1216 
1217 
1218 
1219 
1220  fin = fout;
1221 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1222 
1223 }
1224 //-------------------------------------------------------------------
1225 //*******************************************************************
1226 
1227 
1228 //*******************************************************************
1229 //*******************************************************************
1230 // Definition for the Anisotropic Collisions
1231 //*******************************************************************
1232 //*******************************************************************
1233 
1234 
1235 //*******************************************************************
1236 //-------------------------------------------------------------------
1238 //-------------------------------------------------------------------
1239 // Constructor
1240 //-------------------------------------------------------------------
1241  : f00(0.0, DFin(0).nump()),
1242  fc(0.0,DFin(0).nump()),
1243  l0(DFin.l0()),
1244  m0(DFin.m0()),//Yin.SH(0,0).m0())
1245  implicit_step(DFin.pmax(),DFin(0).nump(),DFin.mass()),
1246  Dt(deltat) //
1247 {
1248 
1249 
1251  szx = Input::List().NxLocal[0];
1252 
1253  if (m0 == 0) {
1254  f1_m_upperlimit = 1;
1255  }
1256  else {
1257  f1_m_upperlimit = 2;
1258  }
1259 
1260 
1261 }
1262 //-------------------------------------------------------------------
1263 
1264 
1265 //-------------------------------------------------------------------
1266 void self_flm_implicit_collisions::advancef1(DistFunc1D& DF, valarray<double>& Zarray, DistFunc1D& DFh){
1267 //-------------------------------------------------------------------
1268 // This is the collision calculation for the harmonics f10, f11
1269 //-------------------------------------------------------------------
1270 
1271 // For every location in space within the domain of this node
1272 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1273  for (size_t ix(0); ix < szx; ++ix){
1274 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1275  // "00" harmonic --> Valarray
1276  for (size_t ip(0); ip < fc.size(); ++ip){
1277  f00[ip] = (DF(0,0)(ip,ix)).real();
1278  }
1279  // Reset the integrals and coefficients
1280  implicit_step.reset_coeff(f00, Zarray[ix], Dt);
1281 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1282 
1283 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1284  // Loop over the harmonics for this (x,y)
1285  for(int m(0); m < f1_m_upperlimit; ++m){
1286 
1287  // This harmonic --> Valarray
1288  for (int ip(0); ip < DF(1,m).nump(); ++ip) {
1289  fc[ip] = DF(1,m)(ip,ix);
1290  }
1291 
1292 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1293  // Take an implicit step
1294  implicit_step.advance(fc, 1);
1295 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1296 
1297  // Valarray --> This harmonic
1298  for (int ip(0); ip < DF(1,m).nump(); ++ip) {
1299  DFh(1,m)(ip,ix) = fc[ip];
1300  }
1301  }
1302 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1303  }
1304 }
1305 //-------------------------------------------------------------------
1306 
1307 
1308 
1309 //-------------------------------------------------------------------
1310 void self_flm_implicit_collisions::advanceflm(DistFunc1D& DF, valarray<double>& Zarray, DistFunc1D& DFh)
1311 {
1312 //-------------------------------------------------------------------
1313 // This is the calculation for the high order harmonics
1314 // To be specific, this routine does l=2 to l0
1315 // To be specific, this routine differs from 'flm_loop1D' aboe only in one place: the loop over m all m from 0 to ((m0 < l)? m0:l)
1316 //-------------------------------------------------------------------
1317 
1318  // For every location in space within the domain of this node
1319 
1320  for (size_t ix(0); ix < szx; ++ix){
1321 
1322 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1323  // "00" harmonic --> Valarray
1324  for (size_t ip(0); ip < fc.size(); ++ip){
1325  f00[ip] = (DF(0,0)(ip,ix)).real();
1326  }
1327  // Reset the integrals and coefficients
1328  // --> Assume you did that when you called f1_loop
1329  implicit_step.reset_coeff(f00, Zarray[ix], Dt);
1330  // Loop over the harmonics for this (x,y)
1331  for(int l(2); l < l0+1 ; ++l){
1332  for(int m(0); m < ((m0 < l)? m0:l)+1; ++m){
1333 // std::cout << "(l,m) = " << l << "," << m << "\n";
1334  // This harmonic --> Valarray
1335  for (size_t ip(0); ip < fc.size(); ++ip){
1336  fc[ip] = (DF(l,m))(ip,ix);
1337  }
1338 
1339  // Take an implicit step
1340  implicit_step.advance(fc, l);
1341 
1342  // Valarray --> This harmonic
1343  for (size_t ip(0); ip < fc.size(); ++ip){
1344  DFh(l,m)(ip,ix) = fc[ip];
1345  }
1346  }
1347  }
1348  }
1349 
1350  // return;
1351 
1352 }
1353 //-------------------------------------------------------------------
1354 
1355 
1357 //-------------------------------------------------------------------
1358 self_collisions::self_collisions(const DistFunc1D& DFin, const double& deltat)
1359 //-------------------------------------------------------------------
1360 // Constructor
1361 //-------------------------------------------------------------------
1362  : self_f00_exp_collisions(DFin, deltat),
1363  self_f00_imp_collisions(DFin, deltat),
1364  self_flm_collisions(DFin, deltat){}
1365 //-------------------------------------------------------------------
1366 
1367 
1368 //-------------------------------------------------------------------
1369 void self_collisions::advancef00(SHarmonic1D& f00, valarray<double>& Zarray, const double time,SHarmonic1D& f00h){
1370 //-------------------------------------------------------------------
1371 
1372  if (Input::List().f00_implicitorexplicit){
1373  if (Input::List().f00_implicitorexplicit == 2) {
1374  self_f00_imp_collisions.loop(f00,Zarray,time,f00h);
1375  }
1376  else if (Input::List().f00_implicitorexplicit == 1) {
1377  self_f00_exp_collisions.loop(f00,f00h);
1378  }
1379  }
1380 }
1381 //-------------------------------------------------------------------
1382 //-------------------------------------------------------------------
1383 void self_collisions::advanceflm(DistFunc1D& DFin, valarray<double>& Zarray, DistFunc1D& DFh){
1384 //-------------------------------------------------------------------
1385  self_flm_collisions.advanceflm(DFin,Zarray,DFh);
1386 }
1387 
1388 //-------------------------------------------------------------------
1389 void self_collisions::advancef1(DistFunc1D& DFin, valarray<double>& Zarray, DistFunc1D& DFh){
1390 //-------------------------------------------------------------------
1391  self_flm_collisions.advancef1(DFin,Zarray,DFh);
1392 }
1394 //-------------------------------------------------------------------
1395 collisions::collisions(const State1D& Yin, const double& deltat):Yh(Yin)
1396 //-------------------------------------------------------------------
1397 // Constructor
1398 //-------------------------------------------------------------------
1399 {
1400  for(size_t s(0); s < Yin.Species(); ++s){
1401  self_coll.push_back( self_collisions(Yin.DF(s),deltat) );
1402 
1403 
1404  if (Yin.Species() > 1){
1405  for (size_t sind(0); sind < Yin.Species(); ++sind){
1406 // if (s!=sind) unself_f00_coll.push_back(interspecies_f00_explicit_collisions(Yin.DF(s),Yin.DF(sind),deltat));
1407  }
1408 
1409 
1410 
1411  }
1412 
1413  }
1414  // exit(1);
1415 }
1416 //-------------------------------------------------------------------
1417 void collisions::advance(State1D& Yin, const Clock& W)
1418 //-------------------------------------------------------------------
1419 {
1420  Yh = complex<double>(0.0,0.0);
1421 
1422  if (Input::List().f00_implicitorexplicit > 0) advancef0(Yin,W,Yh);
1423 
1424  if (Input::List().flm_collisions){
1425  advancef1(Yin,Yh);
1426  advanceflm(Yin,Yh);
1427  }
1428 
1429  for (size_t s(0); s < Yin.Species(); ++s){
1430  for (size_t i(0); i < Yin.DF(s).dim(); ++i){
1431  Yin.DF(s)(i) = Yh.DF(s)(i);
1432  }
1433  }
1434 }
1435 //-------------------------------------------------------------------
1437 //-------------------------------------------------------------------
1438 {
1439  size_t sdummy(0);
1440 
1441 
1442  for(size_t s(0); s < Yin.Species(); ++s)
1443  {
1444  self_coll[s].advancef00(Yin.DF(s)(0,0),Yin.HYDRO().Zarray(),W.time(),Yh.DF(s)(0,0));
1445 
1446  if (Yin.Species() > 1)
1447  {
1448  for (size_t sind(0); sind < Yin.Species(); ++sind){
1449  // std::cout << "\n\n sdummy = " << sdummy << ",sind = " << sind << ", s = " << s << "\n\n";
1450  if (s!=sind) {
1451  // std::cout << "\n\n12\n\n";
1452  // unself_f00_coll[sdummy].rkloop(Yin.SH(s,0,0),Yin.SH(sind,0,0)); ++sdummy;
1453 
1454  }
1455  }
1456  }
1457 
1458 
1459  // Yin.DF(s).checknan();
1460 
1461  }
1462 
1463 }
1464 
1465 
1466 //-------------------------------------------------------------------
1468 //-------------------------------------------------------------------
1469 {
1470  size_t sdummy(0);
1471 
1472 
1473  for(size_t s(0); s < Yin.Species(); ++s)
1474  {
1475  self_coll[s].advancef1(Yin.DF(s), Yin.HYDRO().Zarray(), Yh.DF(s) );
1476 
1477  if (Yin.Species() > 1)
1478  {
1479  for (size_t sind(0); sind < Yin.Species(); ++sind){
1480 
1481  if (s!=sind) {
1482 
1483 
1484  }
1485  }
1486  }
1487 
1488  }
1489 
1490 }
1491 //-------------------------------------------------------------------
1493 //-------------------------------------------------------------------
1494 {
1495  size_t sdummy(0);
1496 
1497 
1498  for(size_t s(0); s < Yin.Species(); ++s)
1499  {
1500  self_coll[s].advanceflm(Yin.DF(s), Yin.HYDRO().Zarray(), Yh.DF(s) );
1501 
1502  if (Yin.Species() > 1)
1503  {
1504  for (size_t sind(0); sind < Yin.Species(); ++sind){
1505 
1506  if (s!=sind) {
1507 
1508 
1509  }
1510  }
1511  }
1512 
1513 
1514  // Yin.DF(s).checknan();
1515 
1516  }
1517 
1518 }
1519 
1520 
1521 //-------------------------------------------------------------------
1522 //-------------------------------------------------------------------
1523 vector<self_collisions> collisions::self(){
1524 
1525  return self_coll;
1526 
1527 }
1528 // t = tnew;
1529 
1530 //-------------------------------------------------------------------
1531 
1532 
1533 
1534 //*******************************************************************
Algorithms
int Nbc
Number of boundary cells in each direction.
Definition: collisions.h:103
Plasma Formulary and Units - Declarations.
double c_kpre
Constants.
Definition: collisions.h:48
valarray< double > vr
Define the velocity axis.
Definition: collisions.h:31
void advanceflm(State1D &Y, State1D &Yh)
void update_D_inversebremsstrahlung(const double &Z0, const double &heatingcoefficient, const double &vos)
Definition: collisions.cpp:235
bool Thomas_Tridiagonal(Array2D< double > &A, valarray< double > &d, valarray< double > &xk)
The tridiagonal solver for implicit collisions.
Definition: nmethods.cpp:216
std::vector< size_t > NxLocal
Definition: input.h:168
valarray< double > coolingprofile
Definition: collisions.h:100
int szx
Total cells including boundary cells in x-direction.
Definition: collisions.h:218
self_f00_RKfunctor rkf00
Definition: collisions.h:212
Input reader - Declarations.
int szx
Total cells including boundary cells in x-direction.
Definition: collisions.h:308
Underlying data structures.
void takestep(const valarray< double > &fin, valarray< double > &fh)
Definition: collisions.cpp:639
valarray< double > fin
Definition: collisions.h:90
The top-level container for self collisions over all species on l=0.
Definition: collisions.h:331
valarray< double > Pn
Definition: collisions.h:132
void getleftside(valarray< double > &fin, const double &Z0, const double &heating, const double &cooling, Array2D< double > &LHStemp)
Definition: collisions.cpp:343
valarray< double > xgrid
Definition: collisions.h:91
self_f00_explicit_collisions self_f00_exp_collisions
Definition: collisions.h:343
valarray< double > I2
Definition: collisions.h:135
double Zeta
Definition: formulary.h:104
valarray< double > df0
Definition: collisions.h:252
void operator()(const valarray< double > &fin, valarray< double > &fslope)
Definition: collisions.cpp:753
valarray< double > I0
Definition: collisions.h:249
valarray< double > I2
Definition: collisions.h:249
double LOGee(double ne, double Te)
Definition: formulary.cpp:226
self_f00_implicit_collisions self_f00_imp_collisions
Definition: collisions.h:344
valarray< double > dvr
Definition: collisions.h:32
void update_D_and_delta(valarray< double > &fin)
Definition: collisions.cpp:166
valarray< double > p4dp
Definition: collisions.h:38
void loop(SHarmonic1D &SHin, valarray< double > &Zarray, const double time, SHarmonic1D &SHout)
Definition: collisions.cpp:442
size_t dim1() const
Definition: lib-array.h:289
valarray< double > fin
Definition: collisions.h:203
int Nbc
Number of boundary cells in each direction.
Definition: collisions.h:217
valarray< double > p2dp
Various coefficients for the integrals.
Definition: collisions.h:38
valarray< double > phdp
Definition: collisions.h:38
void loop(SHarmonic1D &SHin, SHarmonic1D &SHout)
Definition: collisions.cpp:787
size_t l0
Number of m harmonics.
Definition: collisions.h:311
valarray< double > f00
Array for isotropic component distribution function. Needed for calculating coefficients.
Definition: collisions.h:315
valarray< double > phdpm1
Definition: collisions.h:38
valarray< complex< double > > fc
Dummy array.
Definition: collisions.h:314
valarray< double > U4m1
Definition: collisions.h:132
size_t dim2() const
Definition: lib-array.h:290
double mass
Array output by getslope.
Definition: collisions.h:127
collisions(const State1D &Yin, const double &deltat)
Constructors/Destructors.
void advanceflm(DistFunc1D &DF, valarray< double > &Zarray, DistFunc1D &DFh)
Advance flm_loop for 2D code.
valarray< double > vr
Define the velocity axis.
Definition: collisions.h:129
void reset_coeff(const valarray< double > &f00, double Zvalue, const double Delta_t)
Resets coefficients and integrals to use in the matrix solve.
Definition: collisions.cpp:898
double LOGei(double ne, double Te, double Z)
Definition: formulary.cpp:249
valarray< double > U1m1
Definition: collisions.h:246
Collisions - Declarations.
valarray< double > U4
Various coefficients for the integrals.
Definition: collisions.h:132
valarray< double > U1m1
Definition: collisions.h:132
double G(const int &n, const valarray< double > &fin)
Definition: collisions.cpp:621
int szx
Total cells including boundary cells in x-direction.
Definition: collisions.h:104
size_t numx() const
Definition: state.h:72
valarray< double > U2
Definition: collisions.h:246
size_t dim() const
Definition: state.h:395
valarray< double > vr
Definition: collisions.h:243
A 1D Spherical Harmonic.
Definition: state.h:57
vector< self_collisions > self_coll
Definition: collisions.h:373
valarray< double > U2m1
Definition: collisions.h:132
valarray< double > U2
Definition: collisions.h:132
valarray< double > U1
Definition: collisions.h:132
valarray< double > p2dpm1
Definition: collisions.h:38
valarray< double > U3
Definition: collisions.h:132
self_f00_implicit_collisions(const DistFunc1D &DFin, const double &deltat)
Constructors/Destructors.
Definition: collisions.cpp:423
Definition: state.h:577
void advanceflm(DistFunc1D &DF, valarray< double > &Zarray, DistFunc1D &DFh)
valarray< double > laser_Inv_Uav6
Definition: collisions.h:38
void advancef1(DistFunc1D &DF, valarray< double > &Zarray, DistFunc1D &DFh)
valarray< double > & Zarray() const
Definition: state.h:550
Hydro1D & HYDRO()
Definition: state.h:613
self_f00_RKfunctor(const size_t &nump, const double &pmax, const double &mass)
Constructor for RK4 method on f00.
Definition: collisions.cpp:743
double time() const
self_collisions(const DistFunc1D &DFin, const double &deltat)
Constructors/Destructors.
size_t nump() const
Definition: state.h:71
void advance(State1D &Y, const Clock &W)
double update_D_Rosenbluth(const size_t &k, valarray< double > &fin, const double &delta)
Definition: collisions.cpp:127
valarray< double > U4
Definition: collisions.h:246
self_flm_implicit_collisions self_flm_collisions
Definition: collisions.h:345
DistFunc1D & DF(size_t s)
Definition: state.h:602
State1D Yh
Definition: collisions.h:372
Grid Setup - Declaration.
valarray< double > Qn
Definition: collisions.h:132
size_t m0
Number of m harmonics.
Definition: collisions.h:312
double c_kpre
Constants.
Definition: collisions.h:138
valarray< double > C_RB
Rosenbluth Potentials.
Definition: collisions.h:41
Fields, Distributions, Harmonics, States - Declarations.
self_f00_explicit_collisions(const DistFunc1D &DFin, const double &deltat)
Constructors/Destructors.
Definition: collisions.cpp:769
void advancef0(State1D &Y, const Clock &W, State1D &Yh)
self_f00_implicit_step collide
Definition: collisions.h:93
valarray< double > U2m1
Definition: collisions.h:246
self_f00_explicit_step collide
Definition: collisions.h:170
void takestep(valarray< double > &fin, valarray< double > &fh, const double &Z0, const double &heating, const double &cooling)
Definition: collisions.cpp:266
valarray< double > I4
Definition: collisions.h:135
void advance(valarray< complex< double > > &fin, const int el)
Perform a matrix solve to calculate effect of collisions on f >= 1.
valarray< T > MakeCAxis(const T min, const T max, const size_t N)
Input_List & List()
Definition: input.cpp:1585
valarray< double > dtoverv2
Definition: collisions.h:34
bool IB_heating
Switches for inverse bremsstrahlung and maxwellian cooling.
Definition: collisions.h:96
valarray< double > ddf0
Definition: collisions.h:252
valarray< double > U4m1
Definition: collisions.h:246
void advancef1(State1D &Y, State1D &Yh)
Algorithms::RK4< valarray< double > > RK
Definition: collisions.h:210
int Nbc
Number of boundary cells in each direction.
Definition: collisions.h:307
valarray< double > J1
The integrals.
Definition: collisions.h:135
valarray< double > D_RB
Definition: collisions.h:41
valarray< double > delta_CC
Chang-Cooper weighting delta.
Definition: collisions.h:45
self_flm_implicit_collisions(const DistFunc1D &DFin, const double &deltat)
Constructors/Destructors.
valarray< double > vrh
Definition: collisions.h:33
self_flm_implicit_step implicit_step
The object that is responsible for performing the algebra required for the integrals.
Definition: collisions.h:318
valarray< double > J1m
Definition: collisions.h:249
void parseprofile(const valarray< double > &grid, std::string &str_profile, valarray< double > &profile)
{ function_description }
Definition: setup.cpp:410
valarray< double > U1
Definition: collisions.h:246
self_flm_implicit_step(double pmax, size_t nump, double mass)
Definition: collisions.cpp:829
double calc_delta_ChangCooper(const size_t &k, const double &C, const double &D)
Definition: collisions.cpp:224
self_f00_implicit_step(const size_t &nump, const double &pmax, const double &_mass, const double &_deltat, bool &_ib)
Definition: collisions.cpp:44
Definition: input.h:18
valarray< double > Scattering_Term
Definition: collisions.h:255
int BoundaryCells
Definition: input.h:50
Array2D< double > Alpha_Tri
Definition: collisions.h:256
size_t Species() const
Definition: state.h:596
self_f00_explicit_step(const size_t &nump, const double &pmax, const double &_mass)
Constructor that needs a distribution function input.
Definition: collisions.cpp:536
void advancef00(SHarmonic1D &f00, valarray< double > &Zarray, const double time, SHarmonic1D &f00h)
bool Gauss_Seidel(Array2D< double > &A, valarray< complex< double > > &b, valarray< complex< double > > &xk)
Performs Gauss-Seidel method on Ax = b.
Definition: nmethods.cpp:29
void advancef1(DistFunc1D &DF, valarray< double > &Zarray, DistFunc1D &DFh)
Advance f1_loop for 2D code.
The 1D distribution function is the container for all SHarmonic1D per species.
Definition: state.h:376
void update_C_Rosenbluth(valarray< double > &fin)
Definition: collisions.cpp:104
valarray< double > heatingprofile
Definition: collisions.h:99
vector< self_collisions > self()
int NB_algorithms
Definition: input.h:78
double lambda_0
Definition: input.h:120
Numerical Methods - Declarations.