OSHUN  beta
Arbitrary Order Spherical-Harmonic 1D-3P Vlasov-Fokker-Planck-Maxwell code
main.cpp File Reference

Main Loop. More...

#include <mpi.h>
#include <iostream>
#include <vector>
#include <valarray>
#include <complex>
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <float.h>
#include <stdarg.h>
#include <map>
#include <string>
#include <iomanip>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <ctime>
#include "lib-array.h"
#include "lib-algorithms.h"
#include "H5Cpp.h"
#include "exprtk.hpp"
#include "input.h"
#include "state.h"
#include "formulary.h"
#include "setup.h"
#include "fluid.h"
#include "vlasov.h"
#include "collisions.h"
#include "functors.h"
#include "parallel.h"
#include "implicitE.h"
#include "export.h"
Include dependency graph for main.cpp:

Go to the source code of this file.

Functions

double startmessages (State1D &Y)
 
int main (int argc, char **argv)
 

Detailed Description

Main Loop.

Author
PICKSC
Date
September 1, 2016

This file includes

  • the main loop.
  • the definition for the clock class
  • the definition of periodic boundaries

Definition in file main.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Initiate the Parallel Environment and decompose the Computational Domain

Set up the grid Moves all of the relevant data from the input deck into a single container

Clock

INITIALIZATION

Vlasov - Updates the distribution function: Spatial Advection and B Field "action".

Boundaries

Finds new electric field

Uses new electric field to push distribution functions

Fokker-Planck

Hydro Motion

Error Checking

Boundaries

Vlasov //

Fokker-Planck //

Hydro //

Boundaries //

Vlasov - Updates the distribution function: Spatial Advection and B Field "action".

Boundaries

Finds new electric field

Uses new electric field to push distribution functions

Fokker-Planck

Hydro Motion

Boundaries

Vlasov //

Fokker-Planck //

Hydro //

Boundaries //

Definition at line 129 of file main.cpp.

References collisions::advance(), Setup_Y::applyexternalfields(), Setup_Y::applytravelingwave(), Grid_Info::axis, Grid_Info::charge, Input::Input_List::collisions, Output_Data::Output_Preprocessor_1D::distdump(), Input::Input_List::ext_fields, Export_Files::Folders(), Input::Input_List::hydrocharge, Input::Input_List::hydromass, Setup_Y::initialize(), Input::List(), Input::Input_List::ls, Grid_Info::mass, Input::Input_List::ms, Parallel_Environment_1D::Neighbor_Communications(), Parallel_Environment_1D::Neighbor_ImplicitE_Communications(), Grid_Info::Np, Algorithms::AxisBundle< T >::Nx(), Input::Input_List::pmax, Parallel_Environment_1D::RANK(), Input::Input_List::restart_time, startmessages(), Clock::tick(), Input::Input_List::trav_wave, Algorithms::AxisBundle< T >::xmax(), and Algorithms::AxisBundle< T >::xmin().

129  {
130 
131  MPI_Init(&argc,&argv);
132 
135 
136  time_t tstart, tend;
137  tstart = time(0);
138 
139 
142  Grid_Info grid(Input::List().ls, Input::List().ms,
143  Input::List().mass, Input::List().qs,
144  Input::List().xminLocal, Input::List().xmaxLocal, Input::List().NxLocal,
145  Input::List().xminGlobal, Input::List().xmaxGlobal, Input::List().NxGlobal,
146  Input::List().pmax, Input::List().ps, Input::List().Npx, Input::List().Npy, Input::List().Npz);
147 
148 
150  int tout_start;
151  if (Input::List().isthisarestart) tout_start = Input::List().restart_time;
152  else tout_start = 0;
153 
154  double dt_out(Input::List().t_stop / Input::List().n_outsteps);
155  double CLF(Input::List().clf_dp);
156  size_t n_outsteps(Input::List().n_outsteps);
157  double numh = size_t(static_cast<int>(dt_out/CLF))+1;
158  double h = dt_out/static_cast<double>(numh);
159 
161  if (PE.RANK() == 0) {
163  }
164 
166 
167  State1D Y( grid.axis.Nx(0), Input::List().ls, Input::List().ms, grid.Np, Input::List().pmax, grid.charge, grid.mass, Input::List().hydromass, Input::List().hydrocharge);
168  Y = 0.0;
169  Setup_Y::initialize(Y, grid);
170 
171 
172  collisions collide(Y,h);
173 // InverseBremsstrahlung IB(Y.DF(0).pmax(),Y.SH(0,0,0).nump(),Y.SH(0,0,0).numx(),tout_start,grid.axis.x(0));
174  Hydro_Functor HydroFunc(grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
175 
177 
178  // Algorithms::LEAPs<State1D> LEAP(Y);
179  // Algorithms::PEFRL<State1D> MAGIC(Y);
180 
181 
182  if (Input::List().isthisarestart) Re.Read(PE.RANK(),tout_start,Y);
183 
184  Output_Data::Output_Preprocessor_1D output( grid, Input::List().oTags);
185  output( Y, grid, tout_start, PE );
186  output.distdump(Y, grid, tout_start, PE );
187 
188 
189  double plasmaperiod;
190  if (!(PE.RANK())){
191  plasmaperiod = startmessages(Y);
192  }
193 
194 // --------------------------------------------------------------------------------------------------------------------------------
195 // --------------------------------------------------------------------------------------------------------------------------------
196 // --------------------------------------------------------------------------------------------------------------------------------
197 // ITERATION LOOP
198 // --------------------------------------------------------------------------------------------------------------------------------
199 // --------------------------------------------------------------------------------------------------------------------------------
200  if (Input::List().implicit_B) {
201  if (Input::List().implicit_E) {
202  // --------------------------------------------------------------------------------------------------------------------------------
203  // --------------------------------------------------------------------------------------------------------------------------------
204  // --------------------------------------------------------------------------------------------------------------------------------
205  // IMPLICIT E-FIELD
206  // --------------------------------------------------------------------------------------------------------------------------------
208  Input::List().ps,
209  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
210 
211  VlasovFunctor1D_implicitE_p2 impE_p2_Functor(Input::List().ls, Input::List().ms, Input::List().pmax,
212  Input::List().ps,
213  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
214 
215 // Magnetic_Field_1D Bfield(Input::List().ls[0], Input::List().ms[0], Input::List().pmax[0]/(2.0*Input::List().ps[0]-1), Input::List().pmax[0],
216 // Input::List().ps[0],
217 // grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
218 
219 
220  Magnetic_Field_1D Bfield(Input::List().ls[0], Input::List().ms[0],
221  0.0, Input::List().pmax[0], Input::List().ps[0],
222  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
223 
224 
225 
226  // --------------------------------------------------------------------------------------------------------------------------------
229  (grid.axis.xmax(0) - grid.axis.xmin(0)) / grid.axis.Nx(0));
230 
231  if (!Input::List().collisions) {
232  if (!PE.RANK())
233  std::cout << "\n Need collisions for implicit E field solver. \n Exiting. \n";
234  exit(0);
235  }
236 
237  for (size_t t_out(tout_start + 1); t_out < n_outsteps + 1; ++t_out) {
238  // --------------------------------------------------------------------------------------------------------------------------------
239  for (Clock W(t_out - 1, dt_out, CLF); W.tick() < W.numh(); ++W) {
240  // --------------------------------------------------------------------------------------------------------------------------------
241  // if (!(PE.RANK())) {
242  // // cout << "Time = " << W.time()<< "\n";
243  // printf("\r Time = %4.4f tau_p = %4.4f fs", W.time(), W.time() * plasmaperiod);
244  // fflush(stdout);
245  // }
246  // --------------------------------------------------------------------------------------------------------------------------------
247  // --------------------------------------------------------------------------------------------------------------------------------
248  // --------------------------------------------------------------------------------------------------------------------------------
249  // --------------------------------------------------------------------------------------------------------------------------------
250  // the guts
251  // --------------------------------------------------------------------------------------------------------------------------------
252  if (Input::List().ext_fields) Setup_Y::applyexternalfields(grid, Y, W.time());
253 
254  Y = RK(Y, W.h(),&impE_p1_Functor);
256  eim.advance(&RK, Y, collide,&impE_p2_Functor);
257  Y = RK(Y, W.h(),&impE_p2_Functor);
258 
260  for (size_t s(0); s < Y.Species(); ++s)
261  {
262  Bfield.implicit(Y.DF(s),Y.EMF().Bx(),Y.EMF().By(),Y.EMF().Bz(),W.h());
263  Y.DF(s) = Y.DF(s).Filterp();
264  }
265 
266  collide.advance(Y,W);
267 
268  if (Input::List().hydromotion)
269  Y = RK(Y, W.h(), &HydroFunc);
272  // --------------------------------------------------------------------------------------------------------------------------------
273  // --------------------------------------------------------------------------------------------------------------------------------
274  // --------------------------------------------------------------------------------------------------------------------------------
275  // --------------------------------------------------------------------------------------------------------------------------------
276  // --------------------------------------------------------------------------------------------------------------------------------
277  }
278 
279  if (!(PE.RANK())) cout << " \n Output #" << t_out << "\n";
280  output(Y, grid, t_out, PE);
281  Y.checknan();
282 
283  if (!(t_out%Input::List().n_distoutsteps))
284  output.distdump(Y, grid, t_out, PE);
285  }
286  } else {
287  // --------------------------------------------------------------------------------------------------------------------------------
288  // --------------------------------------------------------------------------------------------------------------------------------
289  // --------------------------------------------------------------------------------------------------------------------------------
290  // EXPLICIT E-FIELD
291  // --------------------------------------------------------------------------------------------------------------------------------
293  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
294 
295  Magnetic_Field_1D Bfield(Input::List().ls[0], Input::List().ms[0],
296  0.0, Input::List().pmax[0], Input::List().ps[0],
297  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
298 
299  // --------------------------------------------------------------------------------------------------------------------------------
300  for (size_t t_out(tout_start + 1); t_out < n_outsteps + 1; ++t_out) {
301  for (Clock W(t_out - 1, dt_out, CLF); W.tick() < W.numh(); ++W) {
302  // --------------------------------------------------------------------------------------------------------------------------------
303  // if (!(PE.RANK())) {
304 
305  // printf("\r Time = %4.4f tau_p = %4.4f fs", W.time(), W.time() * plasmaperiod);
306  // fflush(stdout);
307  // }
308  // --------------------------------------------------------------------------------------------------------------------------------
309  // the guts
310  // --------------------------------------------------------------------------------------------------------------------------------
311 
312  if (Input::List().ext_fields) Setup_Y::applyexternalfields(grid, Y, W.time());
313 
314  Y = RK(Y, W.h(), &rkF);
315 
316  for (size_t s(0); s < Y.Species(); ++s)
317  {
318  Bfield.implicit(Y.DF(s),Y.EMF().Bx(),Y.EMF().By(),Y.EMF().Bz(),W.h());
319  Y.DF(s) = Y.DF(s).Filterp();
320  }
321 
322  if (Input::List().collisions)
323  collide.advance(Y,W);
324 
325  if (Input::List().hydromotion)
326  Y = RK(Y, W.h(), &HydroFunc);
327 
329  }
330 
331  if (!(PE.RANK())) cout << " \n Output #" << t_out << "\n";
332  output(Y, grid, t_out, PE);
333  Y.checknan();
334 
335  if (!(t_out%Input::List().n_distoutsteps))
336  output.distdump(Y, grid, t_out, PE);
337 
338 
339  }
340  }
341  }
342  else {
343  if (Input::List().implicit_E) {
344  // --------------------------------------------------------------------------------------------------------------------------------
345  // --------------------------------------------------------------------------------------------------------------------------------
346  // --------------------------------------------------------------------------------------------------------------------------------
347  // IMPLICIT E-FIELD
348  // --------------------------------------------------------------------------------------------------------------------------------
349  VlasovFunctor1D_implicitE_p1 impE_p1_Functor(Input::List().ls, Input::List().ms, Input::List().pmax,
350  Input::List().ps,
351  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
352  VlasovFunctor1D_implicitE_p2 impE_p2_Functor(Input::List().ls, Input::List().ms, Input::List().pmax,
353  Input::List().ps,
354  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
355  // --------------------------------------------------------------------------------------------------------------------------------
356  using Electric_Field_Methods::Efield_Method;
358  (grid.axis.xmax(0) - grid.axis.xmin(0)) / grid.axis.Nx(0));
359 
360  if (!Input::List().collisions) {
361  if (!PE.RANK())
362  std::cout << "\n Need collisions for implicit E field solver. \n Exiting. \n";
363  exit(0);
364  }
365 
366  for (size_t t_out(tout_start + 1); t_out < n_outsteps + 1; ++t_out) {
367  // --------------------------------------------------------------------------------------------------------------------------------
368  for (Clock W(t_out - 1, dt_out, CLF); W.tick() < W.numh(); ++W) {
369  // --------------------------------------------------------------------------------------------------------------------------------
370  // if (!(PE.RANK())) {
371  // // cout << "Time = " << W.time()<< "\n";
372  // printf("\r Time = %4.4f tau_p = %4.4f fs", W.time(), W.time() * plasmaperiod);
373  // fflush(stdout);
374  // }
375  // --------------------------------------------------------------------------------------------------------------------------------
376  // --------------------------------------------------------------------------------------------------------------------------------
377  // --------------------------------------------------------------------------------------------------------------------------------
378  // --------------------------------------------------------------------------------------------------------------------------------
379  // the guts
380  // --------------------------------------------------------------------------------------------------------------------------------
381  if (Input::List().ext_fields) Setup_Y::applyexternalfields(grid, Y, W.time());
382 
383  Y = RK(Y, W.h(),
384  &impE_p1_Functor);
386  eim.advance(&RK, Y, collide,
387  &impE_p2_Functor);
388  Y = RK(Y, W.h(),
389  &impE_p2_Functor);
390  collide.advance(Y,W);
391 // if (Input::List().inverse_bremsstrahlung)
392 // IB.loop(Y.SH(0, 0, 0), Y.HYDRO().Zarray(), W.time()); /// Explicit IB heating for f00
393  if (Input::List().hydromotion)
394  Y = RK(Y, W.h(), &HydroFunc);
395  // Y.checknan(); /// Error Checking
397  Y);
398  // --------------------------------------------------------------------------------------------------------------------------------
399  // --------------------------------------------------------------------------------------------------------------------------------
400  // --------------------------------------------------------------------------------------------------------------------------------
401  // --------------------------------------------------------------------------------------------------------------------------------
402  // --------------------------------------------------------------------------------------------------------------------------------
403  }
404 
405  if (!(PE.RANK())) cout << " \n Output #" << t_out << "\n";
406  output(Y, grid, t_out, PE);
407  Y.checknan();
408 
409  if (!(t_out%Input::List().n_distoutsteps))
410  output.distdump(Y, grid, t_out, PE);
411  }
412  } else {
413  // --------------------------------------------------------------------------------------------------------------------------------
414  // --------------------------------------------------------------------------------------------------------------------------------
415  // --------------------------------------------------------------------------------------------------------------------------------
416  // EXPLICIT E-FIELD
417  // --------------------------------------------------------------------------------------------------------------------------------
419  grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
420 
421  // VlasovFunctor1D_spatialpush SA(Input::List().ls, Input::List().ms, Input::List().pmax, Input::List().ps,
422  // grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
423 
424  // VlasovFunctor1D_momentumpush PA(Input::List().ls, Input::List().ms, Input::List().pmax, Input::List().ps,
425  // grid.axis.xmin(0), grid.axis.xmax(0), grid.axis.Nx(0));
426  // --------------------------------------------------------------------------------------------------------------------------------
427  for (size_t t_out(tout_start + 1); t_out < n_outsteps + 1; ++t_out) {
428  for (Clock W(t_out - 1, dt_out, CLF); W.tick() < W.numh(); ++W) {
429 
430  // --------------------------------------------------------------------------------------------------------------------------------
431  // if (!(PE.RANK())) {
432 
433  // printf("\r Time = %4.4f tau_p = %4.4f fs", W.time(), W.time() * plasmaperiod);
434 
435 
436  // }
437  // --------------------------------------------------------------------------------------------------------------------------------
438  // the guts
439  // --------------------------------------------------------------------------------------------------------------------------------
440 
441  if (Input::List().ext_fields) Setup_Y::applyexternalfields(grid, Y, W.time());
442  // if (Input::List().ext_fields) Setup_Y::applyexternalfields(grid, Y, t);
443  if (Input::List().trav_wave) Setup_Y::applytravelingwave(grid, Y, W.time());
444 
445  Y = RK(Y, W.h(), &rkF);
446  // Y = LEAP(Y, W.h(), &SA, &PA); /// Vlasov //
447  // Y = MAGIC(Y, W.h(), &SA, &PA); /// Vlasov //
448  if (Input::List().collisions)
449  collide.advance(Y,W);
450 
451  if (Input::List().hydromotion)
452  Y = RK(Y, W.h(), &HydroFunc);
453 
455  }
456 
457 
458  if (!(PE.RANK())) cout << " \n Output #" << t_out << "\n";
459 
460  output(Y, grid, t_out, PE);
461  Y.checknan();
462 
463  if (!(t_out%Input::List().n_distoutsteps))
464  output.distdump(Y, grid, t_out, PE);
465 
466  if (!(t_out%Input::List().n_restarts))
467  Re.Write(PE.RANK(), t_out, Y);
468  }
469  }
470  }
471  tend = time(0);
472  if (!(PE.RANK())){
473  cout << "Simulation took "<< difftime(tend, tstart) <<" second(s)."<< endl;
474  }
475  MPI_Finalize();
476  return 0;
477 }
void applyexternalfields(Grid_Info &grid, State1D &Y, double time)
Definition: setup.cpp:51
bool ext_fields
External fields.
Definition: input.h:117
void Folders()
Definition: export.cpp:74
void initialize(State1D &Y, Grid_Info &grid)
Definition: setup.cpp:177
double hydrocharge
Definition: input.h:83
void Neighbor_Communications(State1D &Y)
Definition: parallel.cpp:1151
std::vector< size_t > ls
Definition: input.h:156
size_t tick() const
bool trav_wave
Definition: input.h:117
void Neighbor_ImplicitE_Communications(State1D &Y)
Definition: parallel.cpp:1099
std::vector< size_t > ms
Definition: input.h:157
Definition: state.h:577
bool collisions
Definition: input.h:46
double startmessages(State1D &Y)
Definition: main.cpp:63
int restart_time
Definition: input.h:54
std::vector< double > pmax
Definition: input.h:38
double xmin
Definition: input.h:35
double hydromass
Definition: input.h:83
void applytravelingwave(Grid_Info &grid, State1D &Y, double time)
Definition: setup.cpp:95
Input_List & List()
Definition: input.cpp:1585
Here is the call graph for this function:

◆ startmessages()

double startmessages ( State1D Y)

Definition at line 63 of file main.cpp.

References Formulary::B0, Formulary::cL, Input::List(), Formulary::LOGee(), Formulary::LOGei(), Formulary::n, Formulary::pi, Input::Input_List::pth_ref, Formulary::skindepth, Formulary::T0, Formulary::Tau_e(), Formulary::wp, and Formulary::Zeta.

Referenced by main().

63  {
64 
65  Formulary formulas;
66  // double Tref = Input::List().pth_ref*Input::List().pth_ref;
67  double ND = 1.72e9*sqrt(pow(formulas.T0,3.0)/formulas.n);
68  double nuei_wp = sqrt(2.0/Formulary::pi)/9.0/ND*
69  formulas.LOGei(1.0,pow(Input::List().pth_ref,2.0),formulas.Zeta)*formulas.Zeta;
70 
71  double nu_ei = nuei_wp * formulas.wp;
72  double dt_out(Input::List().t_stop / Input::List().n_outsteps);
73  double CLF(Input::List().clf_dp);
74  size_t n_outsteps(Input::List().n_outsteps);
75  double numh = size_t(static_cast<int>(dt_out/CLF))+1;
76  double h = dt_out/static_cast<double>(numh);
77 
78 
79  std::cout << "\n\n";
80  std::cout<< "------- ---------------- */*/*/*/*/* ---------------- -------\n";
81  std::cout<< "------- ,-----. ,---. ,--. ,--.,--. ,--.,--. ,--. -------\n";
82  std::cout<< "-------' .-. '' .-' | '--' || | | || ,'.| | -------\n";
83  std::cout<< "-------| | | |`. `-. | .--. || | | || |' ' | -------\n";
84  std::cout<< "-------' '-' '.-' || | | |' '-' '| | ` | -------\n";
85  std::cout<< "------- `-----' `-----' `--' `--' `-----' `--' `--' -------\n";
86  std::cout<< "------- ---------------- */*/*/*/*/* ---------------- -------\n";
87 
88 
89 
90  std::cout << "\n\n";
91  std::cout << "---------------- OSHUN Beta - 1D 3P ---------------- \n";
92  std::cout << " Particle-in-Cell and Kinetic Simulation Center \n";
93  std::cout << "------------------- UCLA - 2017 -------------------- \n";
94 
95  std::cout << "----------------- Reference Units ------------------ \n";
96  std::cout << "normalizing density = " << formulas.n << " / cc \n";
97  std::cout << "plasma frequency = " << formulas.wp << " Hz \n";
98  std::cout << "background ions - Z = " << formulas.Zeta << " \n";
99  std::cout << "normalizing magnetic field = " << formulas.B0 << " T \n";
100  std::cout << "Reference Temperature = " << formulas.T0 << " eV \n";
101  std::cout << "Corresponding thermal velocity = " << Input::List().pth_ref*Formulary::cL << " m/s \n";
102 
103  std::cout << "\n";
104  std::cout << "Corresponding e-i log Lambda = " << formulas.LOGei(1.0,pow(Input::List().pth_ref,2.0),formulas.Zeta) << " \n";
105  std::cout << "Corresponding e-i collision frequency = " << nu_ei << " Hz \n";
106  std::cout << "Corresponding tau_e-i / tau_p = " << 1.0/nuei_wp << " \n";
107  std::cout << "Corresponding e-i mean free path = " << Input::List().pth_ref*Formulary::cL/nu_ei *1e6<< " microns \n";
108 
109  std::cout << "\n";
110  std::cout << "Corresponding e-e log Lambda = " << formulas.LOGee(1.0,pow(Input::List().pth_ref,2.0)) << " \n";
111  std::cout << "Corresponding e-e collision frequency = " << 1.0/formulas.Tau_e(1.0,pow(Input::List().pth_ref,2.0)) << " Hz \n";
112  // std::cout << "Corresponding thermal mean free path =" << Input::List().pth_ref/cL / nu_ei << "\n";
113  // std::cout << "Corresponding thermal velocity c =" << pow(Input::List().pth_ref*cL,2.0)*0.5*me << "\n";
114  std::cout << "\n";
115  std::cout << "\n";
116  std::cout << "-------------- Simulation parameters -------------- \n";
117  std::cout << "skin depth (normalizing distance) = " << formulas.skindepth*1e6 << " microns \n";
118  std::cout << "plasma period (normalizing time) = " << 1.0/formulas.wp*1e15 << " fs \n";
119  std::cout << "Time step (normalizing time) = " << h << " plasma periods \n";
120  std::cout << "\n";
121  std::cout << "\n";
122 
123 
124 
125  return 1.0/formulas.wp*1e15;
126  }
double Tau_e(double ne, double Te)
Definition: formulary.cpp:306
double T0
Definition: formulary.h:103
double wp
Definition: formulary.h:100
double Zeta
Definition: formulary.h:104
static constexpr double cL
Definition: formulary.h:112
double LOGee(double ne, double Te)
Definition: formulary.cpp:226
double LOGei(double ne, double Te, double Z)
Definition: formulary.cpp:249
static constexpr double pi
Definition: formulary.h:110
double B0
Definition: formulary.h:102
double n
Definition: formulary.h:99
double skindepth
Definition: formulary.h:101
Input_List & List()
Definition: input.cpp:1585
double pth_ref
Definition: input.h:96
Here is the call graph for this function:
Here is the caller graph for this function: