Merge branch 'feature/electromagnetic' into 'development'

Restructuring pushsers and addition to first electromagnetic pusher

See merge request JorgeGonz/fpakc!27
This commit is contained in:
Jorge Gonzalez 2022-12-12 18:20:34 +00:00
commit 239552f715
66 changed files with 42726 additions and 3010 deletions

1
.gitignore vendored
View file

@ -4,4 +4,5 @@ obj/
doc/user_manual/ doc/user_manual/
doc/coding_style/ doc/coding_style/
json-fortran-8.2.0/ json-fortran-8.2.0/
json-fortran/
runs/ runs/

204
data/collisions/EL_e-Ar.dat Normal file
View file

@ -0,0 +1,204 @@
# EL cross sections extracted from PROGRAM MAGBOLTZ, VERSION 7.1 JUNE 2004 www.lxcat.net/Biagi-v7.1
# Relative energy (eV) cross section (m^2)
0.000000e+0 7.100000e-20
1.000000e-3 6.298400e-20
2.000000e-3 5.835000e-20
5.000000e-3 4.977500e-20
1.000000e-2 4.113000e-20
2.000000e-2 3.071300e-20
5.000000e-2 1.570900e-20
1.000000e-1 6.062200e-21
1.092000e-1 5.117000e-21
1.482000e-1 2.519100e-21
1.885000e-1 1.330700e-21
2.303000e-1 9.762900e-22
2.735000e-1 1.139000e-21
3.183000e-1 1.628900e-21
3.646000e-1 2.326700e-21
4.125000e-1 3.155200e-21
4.622000e-1 4.064500e-21
5.136000e-1 5.023100e-21
5.668000e-1 6.012300e-21
6.218000e-1 7.023300e-21
6.788000e-1 8.054600e-21
7.378000e-1 9.110500e-21
7.989000e-1 1.020000e-20
8.621000e-1 1.133700e-20
9.275000e-1 1.253700e-20
9.953000e-1 1.382100e-20
1.065400e+0 1.479100e-20
1.138000e+0 1.576700e-20
1.213100e+0 1.677000e-20
1.290900e+0 1.778100e-20
1.371400e+0 1.882800e-20
1.454700e+0 1.991100e-20
1.541000e+0 2.107400e-20
1.630300e+0 2.232400e-20
1.722700e+0 2.358000e-20
1.818400e+0 2.476000e-20
1.917400e+0 2.598200e-20
2.020000e+0 2.729100e-20
2.126100e+0 2.884100e-20
2.235900e+0 3.044500e-20
2.349700e+0 3.210500e-20
2.467400e+0 3.382400e-20
2.589200e+0 3.558500e-20
2.715400e+0 3.740100e-20
2.845900e+0 3.928100e-20
2.981100e+0 4.122700e-20
3.121000e+0 4.331500e-20
3.265800e+0 4.548700e-20
3.415700e+0 4.773600e-20
3.570900e+0 5.006300e-20
3.731500e+0 5.247300e-20
3.897800e+0 5.496700e-20
4.069900e+0 5.775100e-20
4.248100e+0 6.093800e-20
4.432500e+0 6.423700e-20
4.623400e+0 6.765200e-20
4.821000e+0 7.118700e-20
5.025600e+0 7.507600e-20
5.237300e+0 7.901500e-20
5.456500e+0 8.309200e-20
5.683400e+0 8.731200e-20
5.918300e+0 9.168100e-20
6.161400e+0 9.628400e-20
6.413100e+0 1.010900e-19
6.673600e+0 1.060800e-19
6.943300e+0 1.118000e-19
7.222400e+0 1.170000e-19
7.511400e+0 1.222000e-19
7.810500e+0 1.275900e-19
8.120100e+0 1.326900e-19
8.440600e+0 1.372100e-19
8.772400e+0 1.416500e-19
9.115800e+0 1.451600e-19
9.471300e+0 1.487100e-19
9.839300e+0 1.523900e-19
1.022020e+1 1.548800e-19
1.061450e+1 1.564600e-19
1.100000e+1 1.580000e-19
1.160000e+1 1.580000e-19
1.220000e+1 1.571000e-19
1.280380e+1 1.547800e-19
1.328890e+1 1.525600e-19
1.379110e+1 1.495700e-19
1.431090e+1 1.458200e-19
1.484890e+1 1.420600e-19
1.540590e+1 1.373500e-19
1.598240e+1 1.321600e-19
1.657920e+1 1.291500e-19
1.719700e+1 1.225700e-19
1.783650e+1 1.157400e-19
1.849840e+1 1.110100e-19
1.918370e+1 1.069000e-19
1.989300e+1 1.026400e-19
2.062720e+1 9.899000e-20
2.138720e+1 9.534100e-20
2.217390e+1 9.156500e-20
2.298830e+1 8.765600e-20
2.383130e+1 8.361000e-20
2.470400e+1 7.942100e-20
2.560730e+1 7.611800e-20
2.654230e+1 7.321900e-20
2.751020e+1 7.021800e-20
2.851210e+1 6.711300e-20
2.954920e+1 6.389700e-20
3.062280e+1 6.137900e-20
3.173410e+1 5.937900e-20
3.288440e+1 5.730800e-20
3.407520e+1 5.516500e-20
3.530780e+1 5.294600e-20
3.658370e+1 5.064900e-20
3.790450e+1 4.827200e-20
3.927170e+1 4.581100e-20
4.068690e+1 4.384700e-20
4.215190e+1 4.245600e-20
4.366840e+1 4.101500e-20
4.523810e+1 3.952400e-20
4.686300e+1 3.798000e-20
4.854500e+1 3.638200e-20
5.028610e+1 3.480000e-20
5.208840e+1 3.353800e-20
5.395410e+1 3.223200e-20
5.588530e+1 3.088000e-20
5.788440e+1 2.948100e-20
5.995370e+1 2.803200e-20
6.209570e+1 2.674300e-20
6.431310e+1 2.541200e-20
6.660830e+1 2.403500e-20
6.898420e+1 2.260900e-20
7.144360e+1 2.171100e-20
7.398940e+1 2.120200e-20
7.662470e+1 2.067500e-20
7.935260e+1 2.012900e-20
8.217640e+1 1.940100e-20
8.509940e+1 1.859800e-20
8.812510e+1 1.776600e-20
9.125710e+1 1.690400e-20
9.449930e+1 1.601300e-20
9.785530e+1 1.509000e-20
1.013293e+2 1.435400e-20
1.049254e+2 1.395800e-20
1.086478e+2 1.354900e-20
1.125011e+2 1.312500e-20
1.164898e+2 1.268600e-20
1.206186e+2 1.223200e-20
1.248925e+2 1.176200e-20
1.293167e+2 1.127500e-20
1.338963e+2 1.077100e-20
1.386368e+2 1.025000e-20
1.435440e+2 9.710200e-21
1.486236e+2 9.151400e-21
1.538817e+2 8.790400e-21
1.593245e+2 8.496500e-21
1.649587e+2 8.192200e-21
1.707908e+2 7.877300e-21
1.768279e+2 7.551300e-21
1.830772e+2 7.213800e-21
1.895461e+2 6.864500e-21
1.962423e+2 6.502900e-21
2.031738e+2 6.244500e-21
2.103489e+2 6.118900e-21
2.177762e+2 5.988900e-21
2.254644e+2 5.854400e-21
2.334229e+2 5.715100e-21
2.416610e+2 5.570900e-21
2.501886e+2 5.421700e-21
2.590160e+2 5.267200e-21
2.681535e+2 5.107300e-21
2.776121e+2 4.941800e-21
2.874032e+2 4.770400e-21
2.975383e+2 4.593100e-21
3.080295e+2 4.409500e-21
3.188895e+2 4.219400e-21
3.301311e+2 4.022700e-21
3.417678e+2 3.819100e-21
3.538134e+2 3.608300e-21
3.662823e+2 3.390100e-21
3.791894e+2 3.164200e-21
3.925501e+2 2.930400e-21
4.063803e+2 2.789400e-21
4.355158e+2 2.740800e-21
4.667351e+2 2.688800e-21
4.831724e+2 2.661400e-21
5.001872e+2 2.633000e-21
5.178000e+2 2.603700e-21
5.360318e+2 2.573300e-21
5.549043e+2 2.541800e-21
5.744399e+2 2.509300e-21
5.946621e+2 2.475600e-21
6.155950e+2 2.440700e-21
6.372635e+2 2.404600e-21
6.596934e+2 2.367200e-21
6.829116e+2 2.328500e-21
7.069458e+2 2.288400e-21
7.318245e+2 2.247000e-21
7.575776e+2 2.204000e-21
7.842356e+2 2.159600e-21
8.118305e+2 2.113600e-21
8.403951e+2 2.066000e-21
8.699636e+2 2.016700e-21
9.005711e+2 1.965700e-21
9.322543e+2 1.912900e-21
9.650509e+2 1.858200e-21

View file

@ -1,34 +1,203 @@
# H. C. Straub et. al, Physical Review A, 55,2(1995) # EL cross sections extracted from PROGRAM MAGBOLTZ, VERSION 7.1 JUNE 2004 www.lxcat.net/Biagi-v7.1
# Relative energy (eV) cross section (m^2) # Relative energy (eV) cross section (m^2)
17 1.700E-22 1.570000e+1 0.000000e+0
20 4.600E-21 1.571000e+1 1.033000e-25
25 1.240E-20 1.574000e+1 3.631000e-23
30 1.840E-20 1.577000e+1 7.390000e-23
35 2.260E-20 1.581000e+1 1.128000e-22
40 2.550E-20 1.585000e+1 1.531000e-22
45 2.660E-20 1.589000e+1 1.948000e-22
50 2.700E-20 1.593000e+1 2.379000e-22
55 2.690E-20 1.597000e+1 2.826000e-22
60 2.670E-20 1.602000e+1 3.330000e-22
65 2.670E-20 1.606000e+1 3.914000e-22
70 2.670E-20 1.611000e+1 4.518000e-22
75 2.660E-20 1.616000e+1 5.143000e-22
80 2.690E-20 1.621000e+1 5.791000e-22
85 2.700E-20 1.627000e+1 6.461000e-22
90 2.690E-20 1.632000e+1 7.155000e-22
95 2.670E-20 1.638000e+1 7.873000e-22
100 2.640E-20 1.644000e+1 8.616000e-22
110 2.610E-20 1.650000e+1 9.386000e-22
120 2.550E-20 1.656000e+1 1.026000e-21
140 2.450E-20 1.663000e+1 1.116000e-21
160 2.350E-20 1.670000e+1 1.209000e-21
180 2.270E-20 1.677000e+1 1.306000e-21
200 2.180E-20 1.684000e+1 1.406000e-21
225 2.100E-20 1.691000e+1 1.510000e-21
250 1.990E-20 1.699000e+1 1.617000e-21
275 1.870E-20 1.707000e+1 1.733000e-21
300 1.790E-20 1.715000e+1 1.853000e-21
350 1.630E-20 1.724000e+1 1.977000e-21
400 1.510E-20 1.733000e+1 2.106000e-21
450 1.390E-20 1.742000e+1 2.239000e-21
500 1.310E-20 1.752000e+1 2.378000e-21
1.762000e+1 2.526000e-21
1.772000e+1 2.680000e-21
1.783000e+1 2.839000e-21
1.794000e+1 3.004000e-21
1.805000e+1 3.175000e-21
1.817000e+1 3.354000e-21
1.829000e+1 3.540000e-21
1.842000e+1 3.731000e-21
1.855000e+1 3.933000e-21
1.868000e+1 4.146000e-21
1.882000e+1 4.367000e-21
1.897000e+1 4.596000e-21
1.912000e+1 4.837000e-21
1.927000e+1 5.089000e-21
1.943000e+1 5.349000e-21
1.960000e+1 5.618000e-21
1.977000e+1 5.897000e-21
1.995000e+1 6.186000e-21
2.013000e+1 6.498000e-21
2.032000e+1 6.826000e-21
2.052000e+1 7.161000e-21
2.073000e+1 7.464000e-21
2.094000e+1 7.777000e-21
2.116000e+1 8.092000e-21
2.138000e+1 8.414000e-21
2.162000e+1 8.757000e-21
2.186000e+1 9.122000e-21
2.211000e+1 9.468000e-21
2.237000e+1 9.786000e-21
2.264000e+1 1.013000e-20
2.292000e+1 1.050000e-20
2.321000e+1 1.085000e-20
2.351000e+1 1.121000e-20
2.382000e+1 1.158000e-20
2.414000e+1 1.197000e-20
2.447000e+1 1.237000e-20
2.482000e+1 1.278000e-20
2.517000e+1 1.317000e-20
2.554000e+1 1.355000e-20
2.592000e+1 1.400000e-20
2.631000e+1 1.440000e-20
2.672000e+1 1.479000e-20
2.715000e+1 1.519000e-20
2.758000e+1 1.560000e-20
2.804000e+1 1.604000e-20
2.850000e+1 1.650000e-20
2.899000e+1 1.699000e-20
2.949000e+1 1.749000e-20
3.001000e+1 1.801000e-20
3.055000e+1 1.844000e-20
3.111000e+1 1.888000e-20
3.168000e+1 1.935000e-20
3.228000e+1 1.981000e-20
3.290000e+1 2.027000e-20
3.354000e+1 2.075000e-20
3.420000e+1 2.123000e-20
3.488000e+1 2.167000e-20
3.559000e+1 2.214000e-20
3.633000e+1 2.255000e-20
3.709000e+1 2.289000e-20
3.787000e+1 2.324000e-20
3.869000e+1 2.351000e-20
3.953000e+1 2.376000e-20
4.040000e+1 2.398000e-20
4.131000e+1 2.416000e-20
4.224000e+1 2.435000e-20
4.321000e+1 2.454000e-20
4.421000e+1 2.474000e-20
4.525000e+1 2.492000e-20
4.632000e+1 2.501000e-20
4.743000e+1 2.509000e-20
4.858000e+1 2.519000e-20
4.978000e+1 2.528000e-20
5.101000e+1 2.544000e-20
5.228000e+1 2.562000e-20
5.360000e+1 2.580000e-20
5.497000e+1 2.600000e-20
5.639000e+1 2.617000e-20
5.785000e+1 2.634000e-20
5.937000e+1 2.652000e-20
6.094000e+1 2.673000e-20
6.256000e+1 2.696000e-20
6.425000e+1 2.719000e-20
6.599000e+1 2.738000e-20
6.779000e+1 2.752000e-20
6.965000e+1 2.767000e-20
7.159000e+1 2.786000e-20
7.358000e+1 2.806000e-20
7.565000e+1 2.823000e-20
7.780000e+1 2.831000e-20
8.001000e+1 2.840000e-20
8.231000e+1 2.845000e-20
8.468000e+1 2.849000e-20
8.714000e+1 2.854000e-20
8.969000e+1 2.859000e-20
9.232000e+1 2.860000e-20
9.505000e+1 2.860000e-20
9.788000e+1 2.854000e-20
1.008000e+2 2.848000e-20
1.038000e+2 2.842000e-20
1.070000e+2 2.836000e-20
1.102000e+2 2.830000e-20
1.136000e+2 2.823000e-20
1.170000e+2 2.816000e-20
1.206000e+2 2.807000e-20
1.243000e+2 2.788000e-20
1.282000e+2 2.769000e-20
1.322000e+2 2.753000e-20
1.363000e+2 2.741000e-20
1.406000e+2 2.727000e-20
1.450000e+2 2.705000e-20
1.496000e+2 2.682000e-20
1.543000e+2 2.654000e-20
1.592000e+2 2.625000e-20
1.643000e+2 2.598000e-20
1.696000e+2 2.572000e-20
1.750000e+2 2.545000e-20
1.807000e+2 2.516000e-20
1.865000e+2 2.478000e-20
1.925000e+2 2.439000e-20
1.988000e+2 2.398000e-20
2.052000e+2 2.367000e-20
2.119000e+2 2.337000e-20
2.189000e+2 2.307000e-20
2.260000e+2 2.275000e-20
2.335000e+2 2.243000e-20
2.412000e+2 2.209000e-20
2.491000e+2 2.174000e-20
2.574000e+2 2.142000e-20
2.659000e+2 2.110000e-20
2.747000e+2 2.076000e-20
2.839000e+2 2.041000e-20
2.933000e+2 2.005000e-20
3.031000e+2 1.969000e-20
3.132000e+2 1.935000e-20
3.237000e+2 1.899000e-20
3.346000e+2 1.862000e-20
3.458000e+2 1.824000e-20
3.575000e+2 1.791000e-20
3.695000e+2 1.759000e-20
3.820000e+2 1.727000e-20
3.949000e+2 1.693000e-20
4.083000e+2 1.659000e-20
4.221000e+2 1.623000e-20
4.364000e+2 1.585000e-20
4.512000e+2 1.548000e-20
4.666000e+2 1.520000e-20
4.824000e+2 1.492000e-20
4.989000e+2 1.462000e-20
5.159000e+2 1.435000e-20
5.335000e+2 1.406000e-20
5.517000e+2 1.377000e-20
5.706000e+2 1.347000e-20
5.901000e+2 1.316000e-20
6.104000e+2 1.285000e-20
6.313000e+2 1.256000e-20
6.530000e+2 1.226000e-20
6.754000e+2 1.194000e-20
6.986000e+2 1.162000e-20
7.226000e+2 1.137000e-20
7.475000e+2 1.112000e-20
7.733000e+2 1.087000e-20
7.999000e+2 1.060000e-20
8.275000e+2 1.039000e-20
8.561000e+2 1.018000e-20
8.857000e+2 9.958000e-21
9.163000e+2 9.736000e-21
9.480000e+2 9.514000e-21
9.808000e+2 9.285000e-21

148
data/collisions/IO_e-Li.dat Normal file
View file

@ -0,0 +1,148 @@
# Rusudan I., et al., Atoms 9(4):90 2021
# Relative energy (eV) cross section (m^2)
5.393 1.061E-23
6.000 5.885E-21
7.000 1.352E-20
8.000 1.927E-20
9.000 2.364E-20
10.000 2.698E-20
11.000 2.956E-20
12.000 3.156E-20
13.000 3.309E-20
14.000 3.427E-20
15.000 3.517E-20
16.000 3.585E-20
17.000 3.635E-20
18.000 3.670E-20
19.000 3.694E-20
20.000 3.708E-20
21.000 3.714E-20
22.000 3.714E-20
23.000 3.709E-20
24.000 3.700E-20
25.000 3.686E-20
26.000 3.671E-20
27.000 3.652E-20
28.000 3.632E-20
29.000 3.610E-20
30.000 3.588E-20
31.000 3.564E-20
32.000 3.539E-20
33.000 3.514E-20
34.000 3.488E-20
35.000 3.462E-20
36.000 3.435E-20
37.000 3.409E-20
38.000 3.383E-20
39.000 3.356E-20
40.000 3.330E-20
41.000 3.304E-20
42.000 3.277E-20
43.000 3.252E-20
44.000 3.226E-20
45.000 3.201E-20
46.000 3.175E-20
47.000 3.151E-20
48.000 3.126E-20
49.000 3.102E-20
50.000 3.078E-20
51.000 3.054E-20
52.000 3.031E-20
53.000 3.008E-20
54.000 2.985E-20
55.000 2.963E-20
56.000 2.941E-20
57.000 2.919E-20
58.000 2.898E-20
59.000 2.877E-20
60.000 2.856E-20
61.000 2.835E-20
62.000 2.815E-20
63.000 2.795E-20
64.000 2.776E-20
65.000 2.756E-20
66.000 2.737E-20
67.000 2.719E-20
68.000 2.700E-20
69.000 2.682E-20
70.000 2.664E-20
71.000 2.646E-20
72.000 2.629E-20
73.000 2.612E-20
74.000 2.595E-20
75.000 2.578E-20
76.000 2.562E-20
77.000 2.546E-20
78.000 2.530E-20
79.000 2.514E-20
80.000 2.499E-20
81.000 2.483E-20
82.000 2.468E-20
83.000 2.453E-20
84.000 2.439E-20
85.000 2.424E-20
86.000 2.410E-20
87.000 2.396E-20
88.000 2.382E-20
89.000 2.369E-20
90.000 2.355E-20
91.000 2.342E-20
92.000 2.329E-20
93.000 2.316E-20
94.000 2.303E-20
95.000 2.290E-20
96.000 2.278E-20
97.000 2.266E-20
98.000 2.253E-20
99.000 2.241E-20
100.000 2.230E-20
101.000 2.218E-20
102.000 2.206E-20
103.000 2.195E-20
104.000 2.184E-20
105.000 2.173E-20
106.000 2.162E-20
107.000 2.151E-20
108.000 2.140E-20
109.000 2.129E-20
110.000 2.119E-20
111.000 2.109E-20
112.000 2.098E-20
113.000 2.088E-20
114.000 2.078E-20
115.000 2.068E-20
116.000 2.059E-20
117.000 2.049E-20
118.000 2.039E-20
119.000 2.030E-20
120.000 2.021E-20
121.000 2.011E-20
122.000 2.002E-20
123.000 1.993E-20
124.000 1.984E-20
125.000 1.976E-20
126.000 1.967E-20
127.000 1.958E-20
128.000 1.950E-20
129.000 1.941E-20
130.000 1.933E-20
131.000 1.924E-20
132.000 1.916E-20
133.000 1.908E-20
134.000 1.900E-20
135.000 1.892E-20
136.000 1.884E-20
137.000 1.877E-20
138.000 1.869E-20
139.000 1.861E-20
140.000 1.854E-20
141.000 1.846E-20
142.000 1.839E-20
143.000 1.831E-20
144.000 1.824E-20
145.000 1.817E-20
146.000 1.810E-20
147.000 1.803E-20
148.000 1.796E-20
149.000 1.789E-20
150.000 1.782E-20

Binary file not shown.

View file

@ -47,6 +47,7 @@
\newglossaryentry{git}{name={Git},description={Git is a distributed version-control system for tracking changes in a set of files}} \newglossaryentry{git}{name={Git},description={Git is a distributed version-control system for tracking changes in a set of files}}
\newglossaryentry{gitlab}{name={GitLab},description={GitLab is a web-based lifecycle tool that provides a \Gls{git}-repository manager}} \newglossaryentry{gitlab}{name={GitLab},description={GitLab is a web-based lifecycle tool that provides a \Gls{git}-repository manager}}
\newglossaryentry{gmsh}{name={Gmsh},description={A three-dimensional finite element mesh generator with built-in pre- and post-processing facilities.}} \newglossaryentry{gmsh}{name={Gmsh},description={A three-dimensional finite element mesh generator with built-in pre- and post-processing facilities.}}
\newglossaryentry{gnuplot}{name={Gnuplot},description={A portable command-line driven graphing utility for Linux, OS/2, MS Windows, OSX, VMS, and many other platforms.}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bibliography{bibliography} \bibliography{bibliography}
@ -287,7 +288,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Gmsh} \subsection{Gmsh}
Although \Gls{gmsh}\cite{gmshURL} is not required to compile and run \Gls{fpakc}, it is the default tool to generate finite element meshes and post-processing. Although \Gls{gmsh}\cite{gmshURL} is not required to compile and run \Gls{fpakc}, it is the default tool to generate finite element meshes and post-processing.
Right now, the only \acrshort{io} format available in \Gls{fpakc} is the v2.0 .msh format. Right now, the only \acrshort{io} format available in \Gls{fpakc} is the v2.0 \lstinline|.msh| format.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Installation steps} \section{Installation steps}
@ -340,7 +341,7 @@ make
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Mesh file} \section{Mesh file}
\Gls{fpakc} accepts right now the version 2.0 of \Gls{gmsh} mesh format .msh in ASCII format. \Gls{fpakc} accepts right now the version 2.0 of \Gls{gmsh} mesh format \lstinline|.msh| in ASCII format.
This file contains information about the nodes, edges and volumes that define the finite element mesh used by \Gls{fpakc} to scatter particle properties and compute the self-consistent electromagnetic field. This file contains information about the nodes, edges and volumes that define the finite element mesh used by \Gls{fpakc} to scatter particle properties and compute the self-consistent electromagnetic field.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -405,28 +406,30 @@ make
The object \textbf{geometry} contains information about the type of geometry, the mesh file format and the mesh filename. The object \textbf{geometry} contains information about the type of geometry, the mesh file format and the mesh filename.
The accepted parameters are: The accepted parameters are:
\begin{itemize} \begin{itemize}
\item \textbf{type}: Character. \item \textbf{dimension}: Integer.
Type of geometry. Number of spatial dimensions of the geometry.
Current accepted vaules are Current values are: $0$, $1$, $2$ or $3$.
\begin{itemize} Zero dimension is a fictitious volume.
\item \textbf{3DCart}: Three-dimensional grid ($x \hyphen y \hyphen z$) in Cartesian coordinates..
For \Gls{gmsh} mesh format, the coordinates $x$, $y$ and $z$ correspond to $x$, $y$ and $z$ respectively.
\item \textbf{2DCyl}: Two-dimensional grid ($z \hyphen r$) with symmetry axis at $r = 0$.
For \Gls{gmsh} mesh format, the coordinates $x$ and $y$ correspond to $z$ and $r$ respectively.
\item \textbf{2DCart}: Two-dimensional grid ($x \hyphen y$) in Cartesian coordinates..
For \Gls{gmsh} mesh format, the coordinates $x$ and $y$ correspond to $x$ and $y$ respectively.
\item \textbf{1DRad}: One-dimensional grid ($r$) in radial coordinates
For \Gls{gmsh} mesh format, the coordinates $x$ corresponds to $r$.
\item \textbf{1DCart}: One-dimensional grid ($x$) in Cartesian coordinates
For \Gls{gmsh} mesh format, the coordinates $x$ corresponds to $x$.
\item \textbf{0D}: Zero dimension ficticius volume.
Geometry used mostly to test collisional effects. Geometry used mostly to test collisional effects.
No boundary or EM field is solved. No boundary or EM field is solved.
No injection can be implemented. No injection can be implemented.
Initial state must be read from file. Initial state must be read from file.
No mesh file is required. No mesh file is required.
The optional argument \textbf{geometry.volume} can be used to set a ficticius volume. The optional argument \textbf{geometry.volume} can be used to set a value for the fictitious volume.
Otherwise, the volume is set to 1 in non-dimensional units. Otherwise, the volume is set to 1 in non-dimensional units.
\item \textbf{type}: Character.
Type of geometry.
Current accepted vaules are
\begin{itemize}
\item \textbf{Cart}: Cartesian coordinates.
Available for \textbf{geometry.dimension} $1$, $2$ and $3$.
For \Gls{gmsh} mesh format, the coordinates $x$, $y$ and $z$ correspond to $x$, $y$ and $z$ respectively.
\item \textbf{Cyl}: Cylindrical coordinates ($z \hyphen r$) with symmetry axis at $r = 0$.
Only available for \textbf{geometry.dimension} $2$.
For \Gls{gmsh} mesh format, the coordinates $x$ and $y$ correspond to $z$ and $r$ respectively.
\item \textbf{Rad}: One-dimensional radial space ($r$).
Only available for \textbf{geometry.dimension} $1$.
For \Gls{gmsh} mesh format, the coordinates $x$ corresponds to $r$.
\end{itemize} \end{itemize}
\item \textbf{meshType}: Character. \item \textbf{meshType}: Character.
Format of mesh file. Format of mesh file.
@ -437,9 +440,9 @@ make
\item \textbf{meshFile}: Character. \item \textbf{meshFile}: Character.
Mesh filename. Mesh filename.
This file is searched in the path \textbf{output.path} and must contain the file extension. This file is searched in the path \textbf{output.path} and must contain the file extension.
\item \textbf{volume}: Real \item \textbf{volume}: Real.
Units of $\unit{m^-3}$. Units of $\unit{m^-3}$.
Used to set a ficticius volume for the \textbf{0D} geometry. Used to set a fictitious volume for the $0$ dimension.
Ignored in the other cases. Ignored in the other cases.
\end{itemize} \end{itemize}
@ -624,11 +627,12 @@ make
\end{itemize} \end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{case} \subsection{solver}
This object determines the simulation time, time step, pushers, weighting scheme and solver for the electromagnetic field. This object determines the input parameters for the solvers used in the case, both for particle pushers and electromagnetic field.
Accepted variables are: Accepted variables are:
\begin{itemize} \begin{itemize}
\item \textbf{tau}: Real. \item \textbf{tau}: Real.
Units of $\unit{s}$.
Array dimension 'number of species'. Array dimension 'number of species'.
Defines the different time steps for each species. Defines the different time steps for each species.
Even if all time steps are equal, they need to be defined as an array. Even if all time steps are equal, they need to be defined as an array.
@ -643,18 +647,9 @@ make
Array dimension 'number of species'. Array dimension 'number of species'.
Indicates the type of pusher used for each species: Indicates the type of pusher used for each species:
\begin{itemize} \begin{itemize}
\item \textbf{3DCartNeutral}: Pushes particles in a 3D Cartesian space ($x \hyphen y \hyphen z$) without any external force. \item \textbf{Neutral}: Pushes a particle without any external force.
\item \textbf{3DCartCharged}: Pushes particles in a 3D Cartesian space ($x \hyphen y \hyphen z$) including the effect of the electrostatic field. \item \textbf{Electrostatic}: Pushes a particle including the effect of the electrostatic field.
\item \textbf{2DCylNeutral}: Pushes particles in a 2D cylindrical space ($z \hyphen r$) without any external force. \item \textbf{Electromagnetic}: Pushes particles accounting for the electromagnetic field.
\item \textbf{2DCylCharged}: Pushes particles in a 2D cylindrical space ($z \hyphen r$) including the effect of the electrostatic field.
\item \textbf{2DCartNeutral}: Pushes particles in a 2D Cartesian space ($x \hyphen y$) without any external force.
\item \textbf{2DCartCharged}: Pushes particles in a 2D Cartesian space ($x \hyphen y$) including the effect of the electrostatic field.
\item \textbf{1DRadNeutral}: Pushes particles in a 1D cylindrical space ($r$) without any external force.
\item \textbf{1DRadCharged}: Pushes particles in a 1D cylindrical space ($r$) accounting the the electrostatic field.
\item \textbf{1DCartNeutral}: Pushes particles in a 1D Cartesian space ($x$) without any external force.
\item \textbf{1DCartCharged}: Pushes particles in a 1D Cartesian space ($x$) accounting the the electrostatic field.
\item \textbf{0D}: Dummy pusher for 0D geometry.
No pushing is actually done.
\end{itemize} \end{itemize}
\item \textbf{WeightingScheme}: Character. \item \textbf{WeightingScheme}: Character.
Indicates the variable weighting scheme to be used in the simulation. Indicates the variable weighting scheme to be used in the simulation.
@ -669,7 +664,13 @@ make
If no value is supplied, no field is solved. If no value is supplied, no field is solved.
\begin{itemize} \begin{itemize}
\item \textbf{Electrostatic}: Solves the Poison equation to obtain the self-consistent electrostatic potential. \item \textbf{Electrostatic}: Solves the Poison equation to obtain the self-consistent electrostatic potential.
\item \textbf{ConstantB}: Assumes a constant magnetic field in all the domain.
It solves the Poisson equation as in the \textbf{solver.EMSolver} option.
\end{itemize} \end{itemize}
\item \textbf{B}: Real.
Units of $\unit{T}$.
Array of dimension $3$.
Provides the value of constant magnetic field for the option \textbf{solver.EMSolver} \textbf{ConstantB}.
\item \textbf{initial}: Array of objects. \item \textbf{initial}: Array of objects.
Determines initial values for the species. Determines initial values for the species.
Required values are: Required values are:
@ -743,6 +744,8 @@ make
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Example runs}\label{ch:exampleRuns} \chapter{Example runs}\label{ch:exampleRuns}
This chapter presents a description of the different example files distributed with \acrshort{fpakc}. This chapter presents a description of the different example files distributed with \acrshort{fpakc}.
All examples in the repository have a \lstinline|README.txt| file and a reference output.
Plotting of the output is done with \Gls{gnuplot} or \Gls{gmsh}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{1D Emissive Cathode (1D\_Cathode)} \section{1D Emissive Cathode (1D\_Cathode)}
@ -754,7 +757,7 @@ make
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{0D \ce{Ar}-\ce{Ar+} Elastic Collision (0D\_Argon)} \section{0D \ce{Ar}-\ce{Ar+} Elastic Collision (0D\_Argon)}
Test case to check the 0D geometry that includes the elastic collision between \ce{Ar} and \ce{Ar+}. Test case to check the 0D geometry that includes the elastic collision between \ce{Ar} and \ce{Ar+}.
Initial states are read from the Argon\_Initial.dat and Argon+\_Initial.dat Initial states are read from the \lstinline|Argon_Initial.dat| and \lstinline|Argon+_Initial.dat|.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{ALPHIE Grid system (ALPHIE\_Grid)} \section{ALPHIE Grid system (ALPHIE\_Grid)}
@ -765,7 +768,7 @@ make
\section{Flow around cylinder (cylFlow)} \section{Flow around cylinder (cylFlow)}
Simple case of neutral Argon flow around a cylinder in a 2D axial-symmetry geometry. Simple case of neutral Argon flow around a cylinder in a 2D axial-symmetry geometry.
Elastic collisions between argon particles are included. Elastic collisions between argon particles are included.
Two cases are presented here: one in which the same mesh (meshSingle.msh) for scattering and collisions is used (input.json) and a second one (inputDualMesh.json) in which a mesh is used for scattering (mesh.msh) and a second one is used only for collisions (meshColl.msh). Two cases are presented here: one in which the same mesh (\lstinline|meshSingle.msh|) for scattering and collisions is used (\lstinline|input.json|) and a second one (\lstinline|inputDualMesh.json|) in which a mesh is used for scattering (\lstinline|mesh.msh|) and a second one is used only for collisions (\lstinline|meshColl.msh|).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\printglossaries \printglossaries

View file

@ -6,7 +6,7 @@ SRCDIR := $(TOPDIR)/src# source folder
# compiler # compiler
# gfortran: # gfortran:
FC := gfortran FC := gfortran
JSONDIR := $(TOPDIR)/json-fortran-8.2.0/build-gfortran JSONDIR := $(TOPDIR)/json-fortran/build-gfortran
# ifort: # ifort:
# FC := ifort # FC := ifort
# JSONDIR := $(TOPDIR)/json-fortran-8.2.0/build-ifort # JSONDIR := $(TOPDIR)/json-fortran-8.2.0/build-ifort

11
runs/0D_Argon/README.txt Normal file
View file

@ -0,0 +1,11 @@
Example of 0D geometry.
Mostly used to test collision processes.
This example includes Ar and Ar+ with self-collisions for Ar and elastic collisions for AR-Ar+.
Different starting temperatures for each species that end up in equilibrium.
The gnuplpot script 'plot_Temperature.gp' generates a plot of the species temperatures.
The result is provided in the output folder to compare if modifications to the code are made.

View file

@ -1,7 +1,7 @@
{ {
"output": { "output": {
"path": "./runs/0D_test/", "path": "./runs/0D_Argon/",
"triggerOutput": 1, "triggerOutput": 1,
"numColl": true, "numColl": true,
"folder": "test" "folder": "test"
@ -13,21 +13,19 @@
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"geometry": { "geometry": {
"type": "1DCart", "dimension": 0,
"meshType": "0D",
"volume": 1e-11 "volume": 1e-11
}, },
"species": [ "species": [
{"name": "Argon+", "type": "charged", "mass": 6.633e-26, "charge": 1.0, "weight": 1.0e0}, {"name": "Argon+", "type": "charged", "mass": 6.633e-26, "charge": 1.0, "weight": 1.0e0},
{"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 1.0e0} {"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 1.0e0}
], ],
"case": { "solver": {
"tau": [1.0e-6, 1.0e-6], "tau": [1.0e-3, 1.0e-3],
"time": 1.0e-3, "finalTime": 1.0e0,
"pusher": ["0D", "0D"],
"initial": [ "initial": [
{"speciesName": "Argon+", "initialState": "Argon+_Initial.dat"}, {"species": "Argon+", "file": "Argon+_Initial.dat"},
{"speciesName": "Argon", "initialState": "Argon_Initial.dat"} {"species": "Argon", "file": "Argon_Initial.dat"}
] ]
}, },
"interactions": { "interactions": {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -43,6 +43,8 @@ set output "comp_temp.eps"
filename1 = "OUTPUT_Argon.dat" filename1 = "OUTPUT_Argon.dat"
filename2 = "OUTPUT_Argon+.dat" filename2 = "OUTPUT_Argon+.dat"
folder = 'output/'
set lmargin at screen lmar set lmargin at screen lmar
set rmargin at screen rmar set rmargin at screen rmar
@ -58,7 +60,6 @@ set ylabel "Temperature (K)" offset 1.4,0.0
set key width 0.5 height 0.1 spacing 1.3 samplen 0.2 box opaque font ",16" set key width 0.5 height 0.1 spacing 1.3 samplen 0.2 box opaque font ",16"
set key at graph 0.95, graph 0.9 right top set key at graph 0.95, graph 0.9 right top
plot filename1 u ($1):($7) t "Ar" ls 1 with lines, \ plot folder.filename1 u ($1):($7) t "Ar" ls 1 with lines, \
filename2 u ($1):($7) t "Ar^{+}" ls 2 with lines, \ folder.filename2 u ($1):($7) t "Ar^{+}" ls 2 with lines
'< paste OUTPUT_Argon.dat OUTPUT_Argon+.dat' u ($1):($7 + $14) t "Sum" ls 3 with lines

View file

@ -1,51 +0,0 @@
#Element Density(m^-3) Velocity (m/2) Temperature (K)
1 1.8672E+15 -4.2433E+04 0.0000E+00 0.0000E+00 1.7536E+03
2 1.7491E+15 -4.1621E+04 0.0000E+00 0.0000E+00 1.8298E+03
3 1.7130E+15 -4.0665E+04 0.0000E+00 0.0000E+00 1.6838E+03
4 1.7346E+15 -3.9729E+04 0.0000E+00 0.0000E+00 1.5787E+03
5 1.7565E+15 -3.8817E+04 0.0000E+00 0.0000E+00 1.5641E+03
6 1.7107E+15 -3.7924E+04 0.0000E+00 0.0000E+00 1.4574E+03
7 1.6611E+15 -3.7036E+04 0.0000E+00 0.0000E+00 1.3561E+03
8 1.6543E+15 -3.6166E+04 0.0000E+00 0.0000E+00 1.2648E+03
9 1.6850E+15 -3.5302E+04 0.0000E+00 0.0000E+00 1.1812E+03
10 1.7615E+15 -3.4449E+04 0.0000E+00 0.0000E+00 1.1669E+03
11 1.7123E+15 -3.3627E+04 0.0000E+00 0.0000E+00 1.1458E+03
12 1.6138E+15 -3.2791E+04 0.0000E+00 0.0000E+00 1.0411E+03
13 1.6308E+15 -3.1965E+04 0.0000E+00 0.0000E+00 9.6919E+02
14 1.6581E+15 -3.1161E+04 0.0000E+00 0.0000E+00 9.8432E+02
15 1.6576E+15 -3.0359E+04 0.0000E+00 0.0000E+00 9.8741E+02
16 1.6780E+15 -2.9560E+04 0.0000E+00 0.0000E+00 9.1285E+02
17 1.6906E+15 -2.8768E+04 0.0000E+00 0.0000E+00 8.5525E+02
18 1.6773E+15 -2.7987E+04 0.0000E+00 0.0000E+00 8.5787E+02
19 1.6571E+15 -2.7208E+04 0.0000E+00 0.0000E+00 8.3556E+02
20 1.6547E+15 -2.6431E+04 0.0000E+00 0.0000E+00 7.9246E+02
21 1.6878E+15 -2.5659E+04 0.0000E+00 0.0000E+00 7.6169E+02
22 1.7458E+15 -2.4887E+04 0.0000E+00 0.0000E+00 7.4698E+02
23 1.7634E+15 -2.4124E+04 0.0000E+00 0.0000E+00 7.5560E+02
24 1.8070E+15 -2.3350E+04 0.0000E+00 0.0000E+00 7.3385E+02
25 1.8616E+15 -2.2579E+04 0.0000E+00 0.0000E+00 7.1475E+02
26 1.8601E+15 -2.1822E+04 0.0000E+00 0.0000E+00 7.1208E+02
27 1.8291E+15 -2.1053E+04 0.0000E+00 0.0000E+00 6.8693E+02
28 1.8542E+15 -2.0280E+04 0.0000E+00 0.0000E+00 6.5924E+02
29 1.9410E+15 -1.9518E+04 0.0000E+00 0.0000E+00 6.4794E+02
30 1.9685E+15 -1.8749E+04 0.0000E+00 0.0000E+00 6.4988E+02
31 2.0048E+15 -1.7973E+04 0.0000E+00 0.0000E+00 6.2752E+02
32 2.1060E+15 -1.7194E+04 0.0000E+00 0.0000E+00 6.1567E+02
33 2.1705E+15 -1.6418E+04 0.0000E+00 0.0000E+00 6.1351E+02
34 2.1947E+15 -1.5629E+04 0.0000E+00 0.0000E+00 6.0244E+02
35 2.2625E+15 -1.4824E+04 0.0000E+00 0.0000E+00 6.0286E+02
36 2.4096E+15 -1.4023E+04 0.0000E+00 0.0000E+00 5.9199E+02
37 2.5632E+15 -1.3209E+04 0.0000E+00 0.0000E+00 5.8388E+02
38 2.6774E+15 -1.2384E+04 0.0000E+00 0.0000E+00 5.8875E+02
39 2.8107E+15 -1.1544E+04 0.0000E+00 0.0000E+00 5.8973E+02
40 2.9409E+15 -1.0692E+04 0.0000E+00 0.0000E+00 5.9631E+02
41 3.1254E+15 -9.8219E+03 0.0000E+00 0.0000E+00 5.9943E+02
42 3.4330E+15 -8.9344E+03 0.0000E+00 0.0000E+00 5.9491E+02
43 3.7218E+15 -8.0260E+03 0.0000E+00 0.0000E+00 5.9949E+02
44 4.0857E+15 -7.0817E+03 0.0000E+00 0.0000E+00 6.4591E+02
45 4.5046E+15 -6.1015E+03 0.0000E+00 0.0000E+00 5.9669E+02
46 5.4123E+15 -5.0997E+03 0.0000E+00 0.0000E+00 5.7835E+02
47 6.7144E+15 -4.2183E+03 0.0000E+00 0.0000E+00 4.7454E+02
48 9.1344E+15 -3.1141E+03 0.0000E+00 0.0000E+00 3.0000E+02
49 1.4157E+16 -1.8530E+03 0.0000E+00 0.0000E+00 3.0000E+02
50 2.3064E+16 -9.7547E+02 0.0000E+00 0.0000E+00 2.7186E+02

View file

@ -1,51 +0,0 @@
#Element Density(m^-3) Velocity (m/2) Temperature (K)
1 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
2 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
3 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
4 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
5 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
6 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
7 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
8 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
9 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
10 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
11 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
12 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
13 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
14 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
15 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
16 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
17 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
18 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
19 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
20 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
21 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
22 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
23 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
24 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
25 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
26 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
27 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
28 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
29 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
30 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
31 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
32 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
33 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
34 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
35 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
36 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
37 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
38 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
39 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
40 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
41 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
42 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
43 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
44 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
45 7.5916E+12 1.8413E+05 0.0000E+00 0.0000E+00 5.7527E+03
46 7.5916E+12 1.8413E+05 0.0000E+00 0.0000E+00 5.7527E+03
47 4.0201E+14 -2.3775E+04 0.0000E+00 0.0000E+00 1.1359E+04
48 4.0201E+14 -2.3775E+04 0.0000E+00 0.0000E+00 1.1359E+04
49 6.9489E+15 -8.8002E+03 0.0000E+00 0.0000E+00 9.5125E+03
50 6.9489E+15 -8.8002E+03 0.0000E+00 0.0000E+00 9.5125E+03

View file

@ -0,0 +1,8 @@
This case is useful to explain how fpakc can work with different geometries (Cartisian and Radial in this case) using very similar input files and the same mesh.
From the position to the left, electrons are emitted at a constant rate.
The electric potential at the left is fixed at 0.
Depending on the geometry (which affects the symmetry) different distributions of the electron density and electric potential are achieved.
The last iteration obtained for these cases is in the output folder.

View file

@ -1,22 +0,0 @@
#Export the potential curves from Gmsh into a txt file.
reset
set terminal qt persist enhanced 1 size 600, 400
set style line 1 pt 1 lc rgb "red"
set style line 2 pt 2 lc rgb "blue"
set style line 3 pt 4 lc rgb "#006400"
set style line 4 pt 6 lc rgb "orange"
set style line 5 pt 8 lc rgb "black"
set style line 6 pt 10 lc rgb "#ADD8E6"
set xlabel "x/r (mm)"
set autoscale y
set ylabel "Potential (V)"
set key box at 90,-10
set title "Effect of geometry"
plot "Cartesian.dat" u ($5*1e3):($8) every 100 ls 1 t "Cartesian", \
"Radial.dat" u ($5*1e3):($8) every 100 ls 2 t "Radial"

View file

@ -14,21 +14,19 @@
"temperature": 11604.0 "temperature": 11604.0
}, },
"geometry": { "geometry": {
"type": "1DCart", "dimension": 1,
"type": "Cart",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
"species": [ "species": [
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}, {"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
{"name": "Argon+", "type": "charged", "mass": 6.633e-26, "charge": 1.0, "weight": 1.0e1}
], ],
"boundary": [ "boundary": [
{"name": "Cathode", "physicalSurface": 1, "bTypes": [ {"name": "Cathode", "physicalSurface": 1, "bTypes": [
{"type": "absorption"},
{"type": "absorption"} {"type": "absorption"}
]}, ]},
{"name": "Infinite", "physicalSurface": 2, "bTypes": [ {"name": "Infinite", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"} {"type": "transparent"}
]} ]}
], ],
@ -36,22 +34,14 @@
{"name": "Cathode", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1} {"name": "Cathode", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1}
], ],
"inject": [ "inject": [
{"name": "Plasma Inf Ar+", "species": "Argon+", "flow": 1.00e-6, "units": "A", "v": 300.0, "T": [ 500.0, 500.0, 500.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2},
{"name": "Plasma Inf e", "species": "Electron", "flow": 2.64e-4, "units": "A", "v": 0.0, "T": [11604.0, 11604.0, 11604.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2},
{"name": "Plasma Cat e", "species": "Electron", "flow": 2.64e-5, "units": "A", "v": 180000.0, "T": [ 2300.0, 2300.0, 2300.0], {"name": "Plasma Cat e", "species": "Electron", "flow": 2.64e-5, "units": "A", "v": 180000.0, "T": [ 2300.0, 2300.0, 2300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1} "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}
], ],
"case": { "solver": {
"tau": [1.0e-11, 1.0e-11], "tau": [1.0e-11],
"time": 4.0e-6, "finalTime": 1.0e-8,
"pusher": ["1DCartCharged", "1DCartCharged"], "pusher": ["Electrostatic"],
"EMSolver": "Electrostatic", "EMSolver": "Electrostatic"
"initial": [
{"speciesName": "Argon+", "initialState": "Argon+_Background.dat"},
{"speciesName": "Electron", "initialState": "Electron_Background.dat"}
]
}, },
"parallel": { "parallel": {
"OpenMP":{ "OpenMP":{

View file

@ -14,21 +14,19 @@
"temperature": 11604.0 "temperature": 11604.0
}, },
"geometry": { "geometry": {
"type": "1DRad", "dimension": 1,
"type": "Rad",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
"species": [ "species": [
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}, {"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
{"name": "Argon+", "type": "charged", "mass": 6.633e-26, "charge": 1.0, "weight": 1.0e1}
], ],
"boundary": [ "boundary": [
{"name": "Cathode", "physicalSurface": 1, "bTypes": [ {"name": "Cathode", "physicalSurface": 1, "bTypes": [
{"type": "absorption"},
{"type": "absorption"} {"type": "absorption"}
]}, ]},
{"name": "Infinite", "physicalSurface": 2, "bTypes": [ {"name": "Infinite", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"} {"type": "transparent"}
]} ]}
], ],
@ -36,22 +34,14 @@
{"name": "Cathode", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1} {"name": "Cathode", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1}
], ],
"inject": [ "inject": [
{"name": "Plasma Inf Ar+", "species": "Argon+", "flow": 1.00e-6, "units": "A", "v": 323.0, "T": [ 500.0, 500.0, 500.0],
"velDist": ["Delta", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2},
{"name": "Plasma Inf e", "species": "Electron", "flow": 2.64e-4, "units": "A", "v": 0.0, "T": [11604.0, 11604.0, 11604.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2},
{"name": "Plasma Cat e", "species": "Electron", "flow": 2.64e-2, "units": "A", "v": 180000.0, "T": [ 2300.0, 2300.0, 2300.0], {"name": "Plasma Cat e", "species": "Electron", "flow": 2.64e-2, "units": "A", "v": 180000.0, "T": [ 2300.0, 2300.0, 2300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1} "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}
], ],
"case": { "solver": {
"tau": [1.0e-11, 1.0e-11], "tau": [1.0e-11],
"time": 3.0e-7, "finalTime": 1.0e-8,
"pusher": ["1DRadCharged", "1DRadCharged"], "pusher": ["Electrostatic"],
"EMSolver": "Electrostatic", "EMSolver": "Electrostatic"
"initial": [
{"speciesName": "Argon+", "initialState": "Argon+_Background.dat"},
{"speciesName": "Electron", "initialState": "Electron_Background.dat"}
]
}, },
"parallel": { "parallel": {
"OpenMP":{ "OpenMP":{

View file

@ -0,0 +1,185 @@
$MeshFormat
2.2 0 8
$EndMeshFormat
$NodeData
1
"Potential (V)"
1
1.0000000000000000E-008
3
1000
1
51
1 -7.2180834934653183E-012
2 -1.6164415181357834
3 -0.36980461527280883
4 -0.57492573345192088
5 -0.71403100967357258
6 -0.82100545766928923
7 -0.90752842743341133
8 -0.97972921034487059
9 -1.0411791818607907
10 -1.0939318279574932
11 -1.1399404313046071
12 -1.1807139724083482
13 -1.2174163304531369
14 -1.2504990809463861
15 -1.2803540949915220
16 -1.3073500616819811
17 -1.3316282169084139
18 -1.3537385275137412
19 -1.3739696197563589
20 -1.3927592194128697
21 -1.4103076231740377
22 -1.4266496533259061
23 -1.4418485519615323
24 -1.4562354448986332
25 -1.4697852468324024
26 -1.4825221356246889
27 -1.4946048104025964
28 -1.5059524644639768
29 -1.5166545901603037
30 -1.5269837565446036
31 -1.5366931422515575
32 -1.5457467079858906
33 -1.5541298965687140
34 -1.5618551829370724
35 -1.5689172611267244
36 -1.5752150587183313
37 -1.5808462624732060
38 -1.5860612571248669
39 -1.5910404498436017
40 -1.5957279636246224
41 -1.5998828959091791
42 -1.6032394878414955
43 -1.6059267946667977
44 -1.6082423003097928
45 -1.6102897646308323
46 -1.6120678175170864
47 -1.6134998424675298
48 -1.6146588662864141
49 -1.6155317189248377
50 -1.6160774066120194
51 -1.6163242439958503
$EndNodeData
$ElementData
1
"Electric Field (V m^-1)"
1
1.0000000000000000E-008
3
1000
3
50
3 9245.1153816612405 0.0000000000000000 0.0000000000000000
4 5128.0279544843424 0.0000000000000000 0.0000000000000000
5 3477.6319055457411 0.0000000000000000 0.0000000000000000
6 2674.3611998963270 0.0000000000000000 0.0000000000000000
7 2163.0742441058046 0.0000000000000000 0.0000000000000000
8 1805.0195727920382 0.0000000000000000 0.0000000000000000
9 1536.2492879082888 0.0000000000000000 0.0000000000000000
10 1318.8161524257080 0.0000000000000000 0.0000000000000000
11 1150.2150836799428 0.0000000000000000 0.0000000000000000
12 1019.3385275948289 0.0000000000000000 0.0000000000000000
13 917.55895112089058 0.0000000000000000 0.0000000000000000
14 827.06876233228445 0.0000000000000000 0.0000000000000000
15 746.37535112673595 0.0000000000000000 0.0000000000000000
16 674.89916726183060 0.0000000000000000 0.0000000000000000
17 606.95388066159535 0.0000000000000000 0.0000000000000000
18 552.75776513387154 0.0000000000000000 0.0000000000000000
19 505.77730606825133 0.0000000000000000 0.0000000000000000
20 469.73999141591514 0.0000000000000000 0.0000000000000000
21 438.71009403214083 0.0000000000000000 0.0000000000000000
22 408.55075379944572 0.0000000000000000 0.0000000000000000
23 379.97246589319053 0.0000000000000000 0.0000000000000000
24 359.67232342854714 0.0000000000000000 0.0000000000000000
25 338.74504834466700 0.0000000000000000 0.0000000000000000
26 318.42221980693205 0.0000000000000000 0.0000000000000000
27 302.06686944643235 0.0000000000000000 0.0000000000000000
28 283.69135153333235 0.0000000000000000 0.0000000000000000
29 267.55314240706213 0.0000000000000000 0.0000000000000000
30 258.22915960642655 0.0000000000000000 0.0000000000000000
31 242.73464267283171 0.0000000000000000 0.0000000000000000
32 226.33914335739505 0.0000000000000000 0.0000000000000000
33 209.57971456971421 0.0000000000000000 0.0000000000000000
34 193.13215920815529 0.0000000000000000 0.0000000000000000
35 176.55195474056683 0.0000000000000000 0.0000000000000000
36 157.44493979054459 0.0000000000000000 0.0000000000000000
37 140.78009387281193 0.0000000000000000 0.0000000000000000
38 130.37486629147924 0.0000000000000000 0.0000000000000000
39 124.47981796785177 0.0000000000000000 0.0000000000000000
40 117.18784452503036 0.0000000000000000 0.0000000000000000
41 103.87330711348883 0.0000000000000000 0.0000000000000000
42 83.914798307876424 0.0000000000000000 0.0000000000000000
43 67.182670633004349 0.0000000000000000 0.0000000000000000
44 57.887641075013939 0.0000000000000000 0.0000000000000000
45 51.186608025777616 0.0000000000000000 0.0000000000000000
46 44.451322156171258 0.0000000000000000 0.0000000000000000
47 35.800623760933746 0.0000000000000000 0.0000000000000000
48 28.975595471990374 0.0000000000000000 0.0000000000000000
49 21.821315960497699 0.0000000000000000 0.0000000000000000
50 13.642192179482622 0.0000000000000000 0.0000000000000000
51 6.1709345957464548 0.0000000000000000 0.0000000000000000
52 2.9318534983186093 0.0000000000000000 0.0000000000000000
$EndElementData
$NodeData
1
"Magnetic Field (T)"
1
1.0000000000000000E-008
3
1000
3
51
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
2 0.0000000000000000 0.0000000000000000 0.0000000000000000
3 0.0000000000000000 0.0000000000000000 0.0000000000000000
4 0.0000000000000000 0.0000000000000000 0.0000000000000000
5 0.0000000000000000 0.0000000000000000 0.0000000000000000
6 0.0000000000000000 0.0000000000000000 0.0000000000000000
7 0.0000000000000000 0.0000000000000000 0.0000000000000000
8 0.0000000000000000 0.0000000000000000 0.0000000000000000
9 0.0000000000000000 0.0000000000000000 0.0000000000000000
10 0.0000000000000000 0.0000000000000000 0.0000000000000000
11 0.0000000000000000 0.0000000000000000 0.0000000000000000
12 0.0000000000000000 0.0000000000000000 0.0000000000000000
13 0.0000000000000000 0.0000000000000000 0.0000000000000000
14 0.0000000000000000 0.0000000000000000 0.0000000000000000
15 0.0000000000000000 0.0000000000000000 0.0000000000000000
16 0.0000000000000000 0.0000000000000000 0.0000000000000000
17 0.0000000000000000 0.0000000000000000 0.0000000000000000
18 0.0000000000000000 0.0000000000000000 0.0000000000000000
19 0.0000000000000000 0.0000000000000000 0.0000000000000000
20 0.0000000000000000 0.0000000000000000 0.0000000000000000
21 0.0000000000000000 0.0000000000000000 0.0000000000000000
22 0.0000000000000000 0.0000000000000000 0.0000000000000000
23 0.0000000000000000 0.0000000000000000 0.0000000000000000
24 0.0000000000000000 0.0000000000000000 0.0000000000000000
25 0.0000000000000000 0.0000000000000000 0.0000000000000000
26 0.0000000000000000 0.0000000000000000 0.0000000000000000
27 0.0000000000000000 0.0000000000000000 0.0000000000000000
28 0.0000000000000000 0.0000000000000000 0.0000000000000000
29 0.0000000000000000 0.0000000000000000 0.0000000000000000
30 0.0000000000000000 0.0000000000000000 0.0000000000000000
31 0.0000000000000000 0.0000000000000000 0.0000000000000000
32 0.0000000000000000 0.0000000000000000 0.0000000000000000
33 0.0000000000000000 0.0000000000000000 0.0000000000000000
34 0.0000000000000000 0.0000000000000000 0.0000000000000000
35 0.0000000000000000 0.0000000000000000 0.0000000000000000
36 0.0000000000000000 0.0000000000000000 0.0000000000000000
37 0.0000000000000000 0.0000000000000000 0.0000000000000000
38 0.0000000000000000 0.0000000000000000 0.0000000000000000
39 0.0000000000000000 0.0000000000000000 0.0000000000000000
40 0.0000000000000000 0.0000000000000000 0.0000000000000000
41 0.0000000000000000 0.0000000000000000 0.0000000000000000
42 0.0000000000000000 0.0000000000000000 0.0000000000000000
43 0.0000000000000000 0.0000000000000000 0.0000000000000000
44 0.0000000000000000 0.0000000000000000 0.0000000000000000
45 0.0000000000000000 0.0000000000000000 0.0000000000000000
46 0.0000000000000000 0.0000000000000000 0.0000000000000000
47 0.0000000000000000 0.0000000000000000 0.0000000000000000
48 0.0000000000000000 0.0000000000000000 0.0000000000000000
49 0.0000000000000000 0.0000000000000000 0.0000000000000000
50 0.0000000000000000 0.0000000000000000 0.0000000000000000
51 0.0000000000000000 0.0000000000000000 0.0000000000000000
$EndNodeData

View file

@ -0,0 +1,247 @@
$MeshFormat
2.2 0 8
$EndMeshFormat
$NodeData
1
"Electron density (m^-3)"
1
1.0000000000000000E-008
3
1000
1
51
1 1.663355E+017
2 1.635218E+014
3 6.971311E+016
4 2.630990E+016
5 1.405426E+016
6 9.465391E+015
7 6.637877E+015
8 4.988303E+015
9 4.189069E+015
10 3.156337E+015
11 2.494143E+015
12 1.855358E+015
13 1.740443E+015
14 1.546003E+015
15 1.316731E+015
16 1.372680E+015
17 9.737899E+014
18 9.388176E+014
19 6.512445E+014
20 5.832764E+014
21 5.692614E+014
22 5.935914E+014
23 3.292208E+014
24 4.143419E+014
25 4.100487E+014
26 2.728780E+014
27 3.714897E+014
28 3.455677E+014
29 9.442239E+013
30 3.445456E+014
31 3.018612E+014
32 3.256579E+014
33 3.148337E+014
34 2.986174E+014
35 3.894979E+014
36 3.315681E+014
37 1.927240E+014
38 8.916509E+013
39 1.257294E+014
40 2.430101E+014
41 4.270402E+014
42 3.345209E+014
43 1.510759E+014
44 1.256626E+014
45 1.136905E+014
46 1.909151E+014
47 1.133460E+014
48 1.373180E+014
49 1.567058E+014
50 1.725501E+014
51 8.718697E+012
$EndNodeData
$NodeData
1
"Electron velocity (m s^-1)"
1
1.0000000000000000E-008
3
1000
3
51
1 6.822573E+002 7.341184E+002 -1.294679E+003
2 2.275900E+005 -1.156323E+005 -3.994264E+004
3 6.011992E+003 -2.085702E+003 -6.955356E+003
4 2.674256E+003 -1.413909E+003 1.028663E+003
5 -6.262168E+003 -5.034055E+003 1.381887E+004
6 1.057957E+003 8.436700E+002 -1.017065E+004
7 1.182090E+004 1.797951E+004 6.390618E+003
8 1.868273E+004 1.131158E+004 1.107675E+004
9 1.821590E+004 5.287286E+003 9.958486E+003
10 5.545844E+003 -1.134700E+003 -1.747390E+004
11 4.595683E+004 1.909957E+004 4.055354E+004
12 5.242670E+004 -1.209486E+003 1.046959E+004
13 -6.508610E+003 4.362341E+004 -8.868030E+003
14 -5.779804E+003 7.888582E+003 -1.190795E+004
15 -3.256102E+003 -2.423327E+004 1.680404E+004
16 2.026515E+004 5.900866E+003 4.573129E+004
17 1.881938E+004 -5.907004E+004 4.787712E+003
18 2.471440E+004 3.126628E+004 3.276285E+004
19 1.927866E+004 -1.774386E+004 1.728677E+004
20 4.357578E+004 -1.754746E+004 2.441953E+004
21 -2.293113E+004 5.501146E+003 3.536741E+004
22 2.289073E+004 2.308340E+004 5.214795E+004
23 1.380393E+005 8.134296E+004 6.839466E+004
24 1.059159E+005 7.461802E+003 -9.633646E+003
25 1.093199E+004 -1.991657E+004 -1.139848E+005
26 2.642203E+004 -2.481740E+004 3.143777E+004
27 9.005040E+004 8.070628E+003 -3.359234E+004
28 1.241325E+005 5.096109E+004 7.419358E+002
29 1.346489E+005 -1.573873E+005 6.203455E+003
30 5.610495E+004 -3.368553E+004 1.507073E+005
31 3.535163E+004 1.988632E+004 6.165400E+004
32 9.376597E+004 1.073849E+004 1.451017E+004
33 1.084345E+005 3.421118E+004 2.083726E+004
34 7.746595E+004 3.203130E+004 6.852780E+003
35 1.133766E+005 2.337750E+003 -4.867282E+004
36 1.025276E+005 1.014552E+005 -8.405875E+004
37 7.241202E+004 2.972254E+002 1.876103E+004
38 4.204461E+004 9.161183E+004 -8.625228E+004
39 2.000094E+004 1.616608E+005 -4.124777E+004
40 1.065082E+005 1.060744E+005 -9.625557E+004
41 2.353957E+005 -3.660256E+003 -6.119245E+003
42 2.043649E+005 1.172239E+003 -2.283045E+004
43 1.632956E+005 -3.766183E+004 -5.714495E+004
44 2.139853E+005 -1.091968E+005 -7.473445E+004
45 6.523701E+004 -5.437454E+004 2.092413E+005
46 6.804248E+004 2.190917E+004 -3.051095E+004
47 1.247063E+005 9.312863E+004 -2.110944E+004
48 1.488446E+005 4.703577E+003 1.162251E+005
49 1.444633E+005 2.511461E+004 7.188944E+004
50 1.343558E+005 -1.246722E+004 2.197029E+005
51 1.789699E+005 -1.338478E+005 -5.783810E+004
$EndNodeData
$NodeData
1
"Electron pressure (Pa)"
1
1.0000000000000000E-008
3
1000
1
51
1 5.385580E-003
2 1.002571E-006
3 2.356496E-003
4 8.962727E-004
5 4.794124E-004
6 3.503273E-004
7 2.442948E-004
8 1.546660E-004
9 1.322598E-004
10 9.957574E-005
11 8.063749E-005
12 5.468381E-005
13 5.120468E-005
14 4.099773E-005
15 4.147335E-005
16 4.439409E-005
17 3.060211E-005
18 3.239301E-005
19 1.928871E-005
20 1.720661E-005
21 1.615443E-005
22 2.301910E-005
23 9.019928E-006
24 8.246059E-006
25 9.022171E-006
26 5.090623E-006
27 1.430550E-005
28 1.078930E-005
29 2.237441E-006
30 8.720790E-006
31 7.185960E-006
32 1.040168E-005
33 8.947370E-006
34 8.505472E-006
35 1.011847E-005
36 1.009116E-005
37 6.487404E-006
38 9.794017E-007
39 1.137051E-006
40 4.115733E-006
41 1.110521E-005
42 5.195716E-006
43 2.249886E-006
44 2.702675E-006
45 1.909427E-006
46 4.939937E-006
47 1.983386E-006
48 2.345377E-006
49 4.284590E-006
50 4.071858E-006
51 4.700991E-008
$EndNodeData
$NodeData
1
"Electron temperature (K)"
1
1.0000000000000000E-008
3
1000
1
51
1 2.345117E+003
2 4.440750E+002
3 2.448325E+003
4 2.467391E+003
5 2.470690E+003
6 2.680725E+003
7 2.665642E+003
8 2.245737E+003
9 2.286795E+003
10 2.285004E+003
11 2.341707E+003
12 2.134754E+003
13 2.130918E+003
14 1.920730E+003
15 2.281334E+003
16 2.342463E+003
17 2.276161E+003
18 2.499120E+003
19 2.145241E+003
20 2.136672E+003
21 2.055403E+003
22 2.808779E+003
23 1.984416E+003
24 1.441466E+003
25 1.593648E+003
26 1.351199E+003
27 2.789158E+003
28 2.261399E+003
29 1.716301E+003
30 1.833268E+003
31 1.724227E+003
32 2.313443E+003
33 2.058406E+003
34 2.063004E+003
35 1.881598E+003
36 2.204374E+003
37 2.438102E+003
38 7.955782E+002
39 6.550284E+002
40 1.226704E+003
41 1.883539E+003
42 1.124965E+003
43 1.078654E+003
44 1.557774E+003
45 1.216454E+003
46 1.874123E+003
47 1.267412E+003
48 1.237093E+003
49 1.980347E+003
50 1.709206E+003
51 3.905303E+002
$EndNodeData

View file

@ -0,0 +1,185 @@
$MeshFormat
2.2 0 8
$EndMeshFormat
$NodeData
1
"Potential (V)"
1
1.0000000000000000E-008
3
1000
1
51
1 -2.0125602360500233E-012
2 -2.1476540511245403
3 -0.92254600934286035
4 -1.1693722452494442
5 -1.3055892978798838
6 -1.4090596211031350
7 -1.4933143808451328
8 -1.5638362561671308
9 -1.6231896643635058
10 -1.6740175110100952
11 -1.7185366931231973
12 -1.7583784348355216
13 -1.7946512154913346
14 -1.8278278087327231
15 -1.8580164245432433
16 -1.8852831251773992
17 -1.9099218127680115
18 -1.9323133093677307
19 -1.9527025003199079
20 -1.9712632206620335
21 -1.9881621423695754
22 -2.0035781018067564
23 -2.0176479044718039
24 -2.0305087603061467
25 -2.0422748378993707
26 -2.0530348175074842
27 -2.0628746022811000
28 -2.0718874967016756
29 -2.0801381491382527
30 -2.0876833658364853
31 -2.0945891263065528
32 -2.1008985562257543
33 -2.1066381420356524
34 -2.1118556546612779
35 -2.1165897969031175
36 -2.1208699819402956
37 -2.1247303076336199
38 -2.1281989125689238
39 -2.1312983972494055
40 -2.1340576795392843
41 -2.1364955581097296
42 -2.1386339190704353
43 -2.1405011196666606
44 -2.1421213004925956
45 -2.1435109859394803
46 -2.1446785599633511
47 -2.1456400594108116
48 -2.1464001968748745
49 -2.1469649987104309
50 -2.1473539773488697
51 -2.1475805166422961
$EndNodeData
$ElementData
1
"Electric Field (V m^-1)"
1
1.0000000000000000E-008
3
1000
3
50
3 23063.650233574754 0.0000000000000000 0.0000000000000000
4 6170.6558976724700 0.0000000000000000 0.0000000000000000
5 3405.4263157653404 0.0000000000000000 0.0000000000000000
6 2586.7580805845814 0.0000000000000000 0.0000000000000000
7 2106.3689935526277 0.0000000000000000 0.0000000000000000
8 1763.0468830553750 0.0000000000000000 0.0000000000000000
9 1483.8352049193140 0.0000000000000000 0.0000000000000000
10 1270.6961661725816 0.0000000000000000 0.0000000000000000
11 1112.9795528295804 0.0000000000000000 0.0000000000000000
12 996.04354280937548 0.0000000000000000 0.0000000000000000
13 906.81951639648162 0.0000000000000000 0.0000000000000000
14 829.41483103577525 0.0000000000000000 0.0000000000000000
15 754.71539526132392 0.0000000000000000 0.0000000000000000
16 681.66751585425504 0.0000000000000000 0.0000000000000000
17 615.96718976609407 0.0000000000000000 0.0000000000000000
18 559.78741499368221 0.0000000000000000 0.0000000000000000
19 509.72977380725575 0.0000000000000000 0.0000000000000000
20 464.01800855624742 0.0000000000000000 0.0000000000000000
21 422.47304269137754 0.0000000000000000 0.0000000000000000
22 385.39898593210717 0.0000000000000000 0.0000000000000000
23 351.74506662853850 0.0000000000000000 0.0000000000000000
24 321.52139585948811 0.0000000000000000 0.0000000000000000
25 294.15193983097186 0.0000000000000000 0.0000000000000000
26 268.99949020263892 0.0000000000000000 0.0000000000000000
27 245.99461933938235 0.0000000000000000 0.0000000000000000
28 225.32236051344728 0.0000000000000000 0.0000000000000000
29 206.26631091357709 0.0000000000000000 0.0000000000000000
30 188.63041745502420 0.0000000000000000 0.0000000000000000
31 172.64401175097743 0.0000000000000000 0.0000000000000000
32 157.73574797938116 0.0000000000000000 0.0000000000000000
33 143.48964524685633 0.0000000000000000 0.0000000000000000
34 130.43781564009393 0.0000000000000000 0.0000000000000000
35 118.35355604550293 0.0000000000000000 0.0000000000000000
36 107.00462592970442 0.0000000000000000 0.0000000000000000
37 96.508142333755885 0.0000000000000000 0.0000000000000000
38 86.715123382567057 0.0000000000000000 0.0000000000000000
39 77.487117011718453 0.0000000000000000 0.0000000000000000
40 68.982057246684732 0.0000000000000000 0.0000000000000000
41 60.946964260881018 0.0000000000000000 0.0000000000000000
42 53.459024017616187 0.0000000000000000 0.0000000000000000
43 46.680014905952270 0.0000000000000000 0.0000000000000000
44 40.504520648464592 0.0000000000000000 0.0000000000000000
45 34.742136171983248 0.0000000000000000 0.0000000000000000
46 29.189350596637517 0.0000000000000000 0.0000000000000000
47 24.037486186421319 0.0000000000000000 0.0000000000000000
48 19.003436601487543 0.0000000000000000 0.0000000000000000
49 14.120045888854746 0.0000000000000000 0.0000000000000000
50 9.7244659609280415 0.0000000000000000 0.0000000000000000
51 5.6634823356386530 0.0000000000000000 0.0000000000000000
52 1.8383620561016323 0.0000000000000000 0.0000000000000000
$EndElementData
$NodeData
1
"Magnetic Field (T)"
1
1.0000000000000000E-008
3
1000
3
51
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
2 0.0000000000000000 0.0000000000000000 0.0000000000000000
3 0.0000000000000000 0.0000000000000000 0.0000000000000000
4 0.0000000000000000 0.0000000000000000 0.0000000000000000
5 0.0000000000000000 0.0000000000000000 0.0000000000000000
6 0.0000000000000000 0.0000000000000000 0.0000000000000000
7 0.0000000000000000 0.0000000000000000 0.0000000000000000
8 0.0000000000000000 0.0000000000000000 0.0000000000000000
9 0.0000000000000000 0.0000000000000000 0.0000000000000000
10 0.0000000000000000 0.0000000000000000 0.0000000000000000
11 0.0000000000000000 0.0000000000000000 0.0000000000000000
12 0.0000000000000000 0.0000000000000000 0.0000000000000000
13 0.0000000000000000 0.0000000000000000 0.0000000000000000
14 0.0000000000000000 0.0000000000000000 0.0000000000000000
15 0.0000000000000000 0.0000000000000000 0.0000000000000000
16 0.0000000000000000 0.0000000000000000 0.0000000000000000
17 0.0000000000000000 0.0000000000000000 0.0000000000000000
18 0.0000000000000000 0.0000000000000000 0.0000000000000000
19 0.0000000000000000 0.0000000000000000 0.0000000000000000
20 0.0000000000000000 0.0000000000000000 0.0000000000000000
21 0.0000000000000000 0.0000000000000000 0.0000000000000000
22 0.0000000000000000 0.0000000000000000 0.0000000000000000
23 0.0000000000000000 0.0000000000000000 0.0000000000000000
24 0.0000000000000000 0.0000000000000000 0.0000000000000000
25 0.0000000000000000 0.0000000000000000 0.0000000000000000
26 0.0000000000000000 0.0000000000000000 0.0000000000000000
27 0.0000000000000000 0.0000000000000000 0.0000000000000000
28 0.0000000000000000 0.0000000000000000 0.0000000000000000
29 0.0000000000000000 0.0000000000000000 0.0000000000000000
30 0.0000000000000000 0.0000000000000000 0.0000000000000000
31 0.0000000000000000 0.0000000000000000 0.0000000000000000
32 0.0000000000000000 0.0000000000000000 0.0000000000000000
33 0.0000000000000000 0.0000000000000000 0.0000000000000000
34 0.0000000000000000 0.0000000000000000 0.0000000000000000
35 0.0000000000000000 0.0000000000000000 0.0000000000000000
36 0.0000000000000000 0.0000000000000000 0.0000000000000000
37 0.0000000000000000 0.0000000000000000 0.0000000000000000
38 0.0000000000000000 0.0000000000000000 0.0000000000000000
39 0.0000000000000000 0.0000000000000000 0.0000000000000000
40 0.0000000000000000 0.0000000000000000 0.0000000000000000
41 0.0000000000000000 0.0000000000000000 0.0000000000000000
42 0.0000000000000000 0.0000000000000000 0.0000000000000000
43 0.0000000000000000 0.0000000000000000 0.0000000000000000
44 0.0000000000000000 0.0000000000000000 0.0000000000000000
45 0.0000000000000000 0.0000000000000000 0.0000000000000000
46 0.0000000000000000 0.0000000000000000 0.0000000000000000
47 0.0000000000000000 0.0000000000000000 0.0000000000000000
48 0.0000000000000000 0.0000000000000000 0.0000000000000000
49 0.0000000000000000 0.0000000000000000 0.0000000000000000
50 0.0000000000000000 0.0000000000000000 0.0000000000000000
51 0.0000000000000000 0.0000000000000000 0.0000000000000000
$EndNodeData

View file

@ -0,0 +1,247 @@
$MeshFormat
2.2 0 8
$EndMeshFormat
$NodeData
1
"Electron density (m^-3)"
1
1.0000000000000000E-008
3
1000
1
51
1 6.926728E+018
2 4.338487E+014
3 1.201033E+018
4 1.505055E+017
5 7.986344E+016
6 4.403063E+016
7 3.228092E+016
8 2.775434E+016
9 2.012556E+016
10 1.435034E+016
11 1.012383E+016
12 7.086783E+015
13 6.226656E+015
14 6.362452E+015
15 6.664819E+015
16 5.946772E+015
17 4.875712E+015
18 4.419041E+015
19 4.092162E+015
20 3.771210E+015
21 3.309077E+015
22 3.071732E+015
23 2.732966E+015
24 2.484798E+015
25 2.313440E+015
26 2.142727E+015
27 1.892093E+015
28 1.776155E+015
29 1.672823E+015
30 1.493186E+015
31 1.407724E+015
32 1.403006E+015
33 1.262097E+015
34 1.182309E+015
35 1.134819E+015
36 1.047928E+015
37 9.865986E+014
38 9.544875E+014
39 8.680888E+014
40 8.440321E+014
41 7.961164E+014
42 7.174005E+014
43 6.589875E+014
44 6.158189E+014
45 6.203645E+014
46 5.604593E+014
47 5.677392E+014
48 5.696204E+014
49 5.003183E+014
50 4.735248E+014
51 4.522101E+014
$EndNodeData
$NodeData
1
"Electron velocity (m s^-1)"
1
1.0000000000000000E-008
3
1000
3
51
1 6.755624E+003 2.474633E+002 2.390054E+002
2 2.054354E+005 -5.163376E+003 -9.846850E+003
3 1.851665E+004 5.899050E+001 2.941097E+002
4 5.874981E+003 -2.544408E+001 3.338329E+002
5 5.745724E+003 -2.992103E+002 -1.562428E+002
6 9.042765E+003 5.755962E+002 -7.509840E+002
7 1.189973E+004 1.251817E+003 -1.278355E+003
8 1.171915E+004 2.483533E+002 -1.798212E+003
9 1.539467E+004 -4.794788E+002 -1.578985E+002
10 1.749366E+004 -2.133315E+003 2.884641E+003
11 3.073569E+004 -1.813877E+003 2.015157E+002
12 4.338021E+004 4.080113E+003 -1.903833E+002
13 4.108799E+004 1.245391E+003 -1.163594E+003
14 3.541737E+004 2.090477E+003 2.419701E+002
15 3.427041E+004 2.013895E+003 -2.234277E+003
16 4.230007E+004 -2.398689E+003 1.371723E+002
17 4.749322E+004 1.597246E+003 -3.628288E+003
18 4.997666E+004 1.160104E+003 -8.401792E+003
19 5.195058E+004 -8.364161E+002 -1.802101E+003
20 5.591312E+004 -3.939060E+003 2.388800E+003
21 6.333098E+004 -6.945454E+002 2.258530E+002
22 6.525072E+004 -3.210740E+003 1.801044E+003
23 7.399242E+004 -1.986068E+003 2.887907E+002
24 7.895156E+004 3.349907E+003 -2.339613E+003
25 8.100325E+004 3.214988E+003 9.916669E+002
26 8.973728E+004 7.594115E+002 -3.305504E+003
27 9.309609E+004 1.417677E+003 -1.436153E+002
28 9.726401E+004 -3.383752E+003 2.393699E+003
29 1.004495E+005 -2.281003E+003 3.209291E+003
30 1.107262E+005 -1.404186E+003 7.470032E+002
31 1.202574E+005 -2.703508E+003 4.930279E+003
32 1.224420E+005 -3.973287E+002 -7.416719E+003
33 1.312544E+005 -5.905453E+003 -9.093921E+002
34 1.347764E+005 -3.491930E+003 -4.010455E+003
35 1.376741E+005 1.357565E+003 2.096097E+003
36 1.419675E+005 1.982650E+003 6.535850E+002
37 1.437177E+005 9.484341E+002 -1.187650E+004
38 1.468643E+005 2.894937E+003 -5.271059E+002
39 1.559764E+005 2.200720E+003 -6.344991E+003
40 1.599147E+005 -2.663692E+003 5.719357E+003
41 1.567097E+005 -7.359025E+000 -4.033384E+003
42 1.690415E+005 -6.956095E+002 3.022908E+003
43 1.814588E+005 -9.615306E+001 6.917210E+003
44 1.863152E+005 -7.990127E+002 1.523384E+004
45 1.886311E+005 4.934329E+003 4.438134E+002
46 1.938832E+005 -3.121504E+002 -3.067774E+003
47 1.900862E+005 -1.160531E+003 -4.620352E+003
48 1.923784E+005 -3.210640E+003 2.151672E+003
49 2.043583E+005 2.368308E+003 1.749902E+002
50 2.054704E+005 4.364283E+003 1.393513E+003
51 2.125792E+005 -4.749345E+003 -2.018864E+003
$EndNodeData
$NodeData
1
"Electron pressure (Pa)"
1
1.0000000000000000E-008
3
1000
1
51
1 2.252567E-001
2 7.546705E-006
3 4.045878E-002
4 5.008147E-003
5 2.551765E-003
6 1.488666E-003
7 1.021884E-003
8 7.937038E-004
9 5.788516E-004
10 4.290930E-004
11 3.263161E-004
12 2.445814E-004
13 2.004129E-004
14 1.799644E-004
15 1.711394E-004
16 1.505493E-004
17 1.238843E-004
18 1.124456E-004
19 9.851639E-005
20 8.889251E-005
21 7.626551E-005
22 6.799265E-005
23 5.942787E-005
24 5.395244E-005
25 4.992406E-005
26 4.474483E-005
27 4.103992E-005
28 3.826699E-005
29 3.404848E-005
30 3.038250E-005
31 2.882086E-005
32 2.844685E-005
33 2.486692E-005
34 2.305064E-005
35 2.204186E-005
36 2.045655E-005
37 1.912248E-005
38 1.817270E-005
39 1.663693E-005
40 1.616886E-005
41 1.470869E-005
42 1.249547E-005
43 1.189200E-005
44 1.112158E-005
45 1.148139E-005
46 1.015354E-005
47 9.973794E-006
48 9.467041E-006
49 8.605269E-006
50 8.068109E-006
51 8.336811E-006
$EndNodeData
$NodeData
1
"Electron temperature (K)"
1
1.0000000000000000E-008
3
1000
1
51
1 2.355409E+003
2 1.259899E+003
3 2.439915E+003
4 2.410136E+003
5 2.314246E+003
6 2.448833E+003
7 2.292833E+003
8 2.071307E+003
9 2.083225E+003
10 2.165738E+003
11 2.334589E+003
12 2.499719E+003
13 2.331244E+003
14 2.048702E+003
15 1.859852E+003
16 1.833641E+003
17 1.840328E+003
18 1.843025E+003
19 1.743703E+003
20 1.707266E+003
21 1.669315E+003
22 1.603229E+003
23 1.574972E+003
24 1.572667E+003
25 1.563034E+003
26 1.512492E+003
27 1.571017E+003
28 1.560488E+003
29 1.474228E+003
30 1.473759E+003
31 1.482881E+003
32 1.468559E+003
33 1.427073E+003
34 1.412111E+003
35 1.406820E+003
36 1.413897E+003
37 1.403850E+003
38 1.379006E+003
39 1.388116E+003
40 1.387513E+003
41 1.338179E+003
42 1.261559E+003
43 1.307058E+003
44 1.308069E+003
45 1.340493E+003
46 1.312170E+003
47 1.272414E+003
48 1.203776E+003
49 1.245762E+003
50 1.234087E+003
51 1.335293E+003
$EndNodeData

View file

@ -0,0 +1,7 @@
Alphie grid system.
The file mesh.geo can be easily modified to generate new grids to test different configurations.
Two cases are provided:
Clasical case in which ions and electrons are input from the ionization chamber.
Ionization case in which ion-electron pairs are generated due to the influx of electrons using the Ionization boundary condition.

View file

@ -8,7 +8,8 @@
"folder": "base_case" "folder": "base_case"
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
@ -45,14 +46,15 @@
"boundaryEM": [ "boundaryEM": [
{"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4}, {"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4},
{"name": "Acceleration Grid", "type": "dirichlet", "potential": -600.0, "physicalSurface": 5}, {"name": "Acceleration Grid", "type": "dirichlet", "potential": -600.0, "physicalSurface": 5},
{"name": "Ionization Chamber", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1} {"name": "Ionization Chamber", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1},
{"name": "Infinite", "type": "dirichlet", "potential": -600.0, "physicalSurface": 2}
], ],
"inject": [ "inject": [
{"name": "Ionization Argon+", "species": "Argon+", "flow": 27.0e-6, "units": "A", "v": 322.0, "T": [ 500.0, 500.0, 500.0], {"name": "Ionization Argon+", "species": "Argon+", "flow": 1.0e-5, "units": "A", "v": 2500.0, "T": [ 500.0, 500.0, 500.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}, "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1},
{"name": "Ionization Electron", "species": "Electron", "flow": 27.0e-6, "units": "A", "v": 87000.0, "T": [ 500.0, 500.0, 500.0], {"name": "Ionization Electron", "species": "Electron", "flow": 1.0e-5, "units": "A", "v": 87000.0, "T": [30000.0, 30000.0, 30000.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}, "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1},
{"name": "Cathode Electron", "species": "Electron", "flow": 9.0e-5, "units": "A", "v": 87000.0, "T": [2500.0, 2500.0, 2500.0], {"name": "Cathode Electron", "species": "Electron", "flow": 1.0e-4, "units": "A", "v": 87000.0, "T": [30000.0, 30000.0, 30000.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2} "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2}
], ],
"reference": { "reference": {
@ -61,10 +63,10 @@
"temperature": 2500.0, "temperature": 2500.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [1.0e-9, 1.0e-11], "tau": [1.0e-9, 1.0e-11],
"time": 1.0e-6, "finalTime": 1.0e-6,
"pusher": ["2DCylCharged", "2DCylCharged"], "pusher": ["Electrostatic", "Electrostatic"],
"WeightingScheme": "Volume", "WeightingScheme": "Volume",
"EMSolver": "Electrostatic" "EMSolver": "Electrostatic"
}, },

View file

@ -8,7 +8,8 @@
"folder": "ionization_0.10mA" "folder": "ionization_0.10mA"
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
@ -19,7 +20,7 @@
"boundary": [ "boundary": [
{"name": "Ionization Chanber", "physicalSurface": 1, "bTypes": [ {"name": "Ionization Chanber", "physicalSurface": 1, "bTypes": [
{"type": "transparent"}, {"type": "transparent"},
{"type": "ionization", "neutral": {"ion": "Argon+", "mass": 6.633e-26, "density": 1.0e17, "velocity": [323, 0, 0], "temperature": 300}, {"type": "ionization", "neutral": {"ion": "Argon+", "mass": 6.633e-26, "density": 5.0e16, "velocity": [2500, 0, 0], "temperature": 300},
"effectiveTime": 5.0e-6,"energyThreshold": 15.76, "crossSection": "./data/collisions/IO_e-Ar.dat"} "effectiveTime": 5.0e-6,"energyThreshold": 15.76, "crossSection": "./data/collisions/IO_e-Ar.dat"}
]}, ]},
{"name": "Vacuum Chamber", "physicalSurface": 2, "bTypes": [ {"name": "Vacuum Chamber", "physicalSurface": 2, "bTypes": [
@ -46,10 +47,11 @@
"boundaryEM": [ "boundaryEM": [
{"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4}, {"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4},
{"name": "Acceleration Grid", "type": "dirichlet", "potential": -600.0, "physicalSurface": 5}, {"name": "Acceleration Grid", "type": "dirichlet", "potential": -600.0, "physicalSurface": 5},
{"name": "Ionization Chamber", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1} {"name": "Ionization Chamber", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1},
{"name": "Infinite", "type": "dirichlet", "potential": -600.0, "physicalSurface": 2}
], ],
"inject": [ "inject": [
{"name": "Cathode Electron", "species": "Electron", "flow": 1.0e-4, "units": "A", "v": 87000.0, "T": [2500.0, 2500.0, 2500.0], {"name": "Cathode Electron", "species": "Electron", "flow": 1.0e-4, "units": "A", "v": 87000.0, "T": [30000.0, 30000.0, 30000.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2} "velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [-1, 0, 0], "physicalSurface": 2}
], ],
"reference": { "reference": {
@ -58,10 +60,10 @@
"temperature": 2500.0, "temperature": 2500.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [1.0e-9, 1.0e-11], "tau": [1.0e-9, 1.0e-11],
"time": 1.0e-6, "finalTime": 1.0e-6,
"pusher": ["2DCylCharged", "2DCylCharged"], "pusher": ["Electrostatic", "Electrostatic"],
"WeightingScheme": "Volume", "WeightingScheme": "Volume",
"EMSolver": "Electrostatic" "EMSolver": "Electrostatic"
}, },

View file

@ -1,11 +1,11 @@
zg1 = 0.0025; zg1 = 0.0020;
tg1 = 0.0004; tg1 = 0.0003;
rg1 = 0.0005; rg1 = 0.0005;
dg = 0.0025; dg = 0.0020;
zg2 = zg1+tg1+dg; zg2 = zg1 + tg1 + dg;
tg2 = tg1; tg2 = tg1;
rg2 = rg1; rg2 = rg1;
zEnd = 0.0042; zEnd = 0.0050;
Lz = zg2 + tg2 + zEnd; Lz = zg2 + tg2 + zEnd;
Lr = rg1 + 0.0001; Lr = rg1 + 0.0001;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,8 @@
"folder": "CX_case" "folder": "CX_case"
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
@ -41,10 +42,10 @@
"temperature": 300.0, "temperature": 300.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [1.0e-6, 1.0e-6], "tau": [1.0e-6, 1.0e-6],
"time": 4.0e-3, "finalTime": 4.0e-3,
"pusher": ["2DCylNeutral", "2DCylNeutral"], "pusher": ["Neutral", "Neutral"],
"WeightingScheme": "Volume" "WeightingScheme": "Volume"
}, },
"interactions": { "interactions": {

View file

@ -7,7 +7,8 @@
"folder": "Elastic_case" "folder": "Elastic_case"
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
@ -41,10 +42,10 @@
"temperature": 300.0, "temperature": 300.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [1.0e-6, 1.0e-6], "tau": [1.0e-6, 1.0e-6],
"time": 4.0e-3, "finalTime": 4.0e-3,
"pusher": ["2DCylNeutral", "2DCylNeutral"], "pusher": ["Neutral", "Neutral"],
"WeightingScheme": "Volume" "WeightingScheme": "Volume"
}, },
"interactions": { "interactions": {

View file

@ -7,7 +7,8 @@
"folder": "Nocoll_case" "folder": "Nocoll_case"
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh"
}, },
@ -41,10 +42,10 @@
"temperature": 300.0, "temperature": 300.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [1.0e-6, 1.0e-6], "tau": [1.0e-6, 1.0e-6],
"time": 4.0e-3, "finalTime": 4.0e-3,
"pusher": ["2DCylNeutral", "2DCylNeutral"], "pusher": ["Neutral", "Neutral"],
"WeightingScheme": "Volume" "WeightingScheme": "Volume"
}, },
"parallel": { "parallel": {

7
runs/cylFlow/README.txt Normal file
View file

@ -0,0 +1,7 @@
Neutral flow around a cylinder with elastic collisions.
Case with the same mesh for particle weighting and collisions and another case using the dual mesh mode, with a more refined mesh around the cylinder.
This demostrates the capacity of fpakc to work with independent meshes for particles and collisions.
CPU time is outputed.
Gnuplot scripts for plotting the CPU time are provided.

View file

@ -6,7 +6,8 @@
"numColl": true "numColl": true
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "meshSingle.msh" "meshFile": "meshSingle.msh"
}, },
@ -40,11 +41,10 @@
"temperature": 300.0, "temperature": 300.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [5.0e-7], "tau": [5.0e-7],
"time": 1.0e-3, "finalTime": 5.0e-4,
"pusher": ["2DCylNeutral"], "pusher": ["Neutral"],
"WeightingScheme": "Volume"
}, },
"interactions": { "interactions": {
"folderCollisions": "./data/collisions/", "folderCollisions": "./data/collisions/",

View file

@ -6,9 +6,11 @@
"numColl": true "numColl": true
}, },
"geometry": { "geometry": {
"type": "2DCyl", "dimension": 2,
"type": "Cyl",
"meshType": "gmsh2", "meshType": "gmsh2",
"meshFile": "mesh.msh" "meshFile": "mesh.msh",
"meshCollisions": "meshColl.msh"
}, },
"species": [ "species": [
{"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 5.0e8} {"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 5.0e8}
@ -40,15 +42,14 @@
"temperature": 300.0, "temperature": 300.0,
"radius": 1.88e-10 "radius": 1.88e-10
}, },
"case": { "solver": {
"tau": [5.0e-7], "tau": [5.0e-7],
"time": 1.0e-3, "finalTime": 5.0e-4,
"pusher": ["2DCylNeutral"], "pusher": ["Neutral"],
"WeightingScheme": "Volume" "WeightingScheme": "Volume"
}, },
"interactions": { "interactions": {
"folderCollisions": "./data/collisions/", "folderCollisions": "./data/collisions/",
"meshCollisions": "meshColl.msh",
"collisions": [ "collisions": [
{"species_i": "Argon", "species_j": "Argon", {"species_i": "Argon", "species_j": "Argon",
"cTypes": [ "cTypes": [

View file

@ -1,629 +0,0 @@
General.AxesFormatX = "%.3g";
General.AxesFormatY = "%.3g";
General.AxesFormatZ = "%.3g";
General.AxesLabelX = "z (m)";
General.AxesLabelY = "r (m)";
General.AxesLabelZ = "";
General.BackgroundImageFileName = "";
General.BuildOptions = " 64Bit ALGLIB Bamg Blas Blossom DIntegration Dlopen DomHex Fltk GMP Gmm[system] Hxt Hxt3D Jpeg Kbipack Lapack LinuxJoystick MathEx Mesh Metis[system] Mmg3d Mpeg NativeFileChooser Netgen ONELAB ONELABMetamodel OpenCASCADE OpenCASCADE-CAF OpenGL OpenMP OptHom Parser Plugins Png Post QuadTri Solver TetGen/BR Zlib";
General.DefaultFileName = "untitled.geo";
General.Display = "";
General.ErrorFileName = ".gmsh-errors";
General.ExecutableFileName = "/usr/bin/gmsh";
General.FileName = "/home/jorge/PPartiC/runs/cylFlow/mesh.msh";
General.FltkTheme = "";
General.GraphicsFont = "Helvetica";
General.GraphicsFontEngine = "Native";
General.GraphicsFontTitle = "Helvetica";
General.OptionsFileName = ".gmsh-options";
General.RecentFile0 = "/home/jorge/PPartiC/runs/cylFlow/mesh.msh";
General.RecentFile1 = "untitled.geo";
General.RecentFile2 = "mesh/Neutral_Expansion_Div.geo";
General.RecentFile3 = "mesh/Neutral_Expansion_Div.msh";
General.RecentFile4 = "Neutral_Expansion_Div.msh";
General.RecentFile5 = "Neutral_Expansion.geo";
General.RecentFile6 = "Neutral_Expansion_Div.geo";
General.RecentFile7 = "/home/jorge/Dropbox/UPMPlasmaLab/Post-Doc/Codes/PICCIL2D/PIC-FEM/Neutral_Expansion_Div.msh";
General.RecentFile8 = "Neutral_Expansion.msh";
General.RecentFile9 = "/home/jorge/Dropbox/UPMPlasmaLab/Post-Doc/Codes/PICCIL2D/PIC-FEM/Neutral_Expansion.msh";
General.TextEditor = "gedit '%s'";
General.TmpFileName = ".gmsh-tmp";
General.Version = "4.4.1";
General.WatchFilePattern = "";
General.AlphaBlending = 1;
General.Antialiasing = 0;
General.ArrowHeadRadius = 0.12;
General.ArrowStemLength = 0.5600000000000001;
General.ArrowStemRadius = 0.02;
General.Axes = 1;
General.AxesMikado = 0;
General.AxesAutoPosition = 1;
General.AxesForceValue = 0;
General.AxesMaxX = 1;
General.AxesMaxY = 1;
General.AxesMaxZ = 1;
General.AxesMinX = 0;
General.AxesMinY = 0;
General.AxesMinZ = 0;
General.AxesTicsX = 8;
General.AxesTicsY = 4;
General.AxesTicsZ = 5;
General.AxesValueMaxX = 1;
General.AxesValueMaxY = 1;
General.AxesValueMaxZ = 1;
General.AxesValueMinX = 0;
General.AxesValueMinY = 0;
General.AxesValueMinZ = 0;
General.BackgroundGradient = 1;
General.BackgroundImage3D = 0;
General.BackgroundImagePage = 0;
General.BackgroundImagePositionX = 0;
General.BackgroundImagePositionY = 0;
General.BackgroundImageWidth = -1;
General.BackgroundImageHeight = -1;
General.BoundingBoxSize = 0.07615773105863909;
General.Camera = 0;
General.CameraAperture = 40;
General.CameraEyeSeparationRatio = 1.5;
General.CameraFocalLengthRatio = 1;
General.Clip0A = 1;
General.Clip0B = 0;
General.Clip0C = 0;
General.Clip0D = 0;
General.Clip1A = 0;
General.Clip1B = 1;
General.Clip1C = 0;
General.Clip1D = 0;
General.Clip2A = 0;
General.Clip2B = 0;
General.Clip2C = 1;
General.Clip2D = 0;
General.Clip3A = -1;
General.Clip3B = 0;
General.Clip3C = 0;
General.Clip3D = 1;
General.Clip4A = 0;
General.Clip4B = -1;
General.Clip4C = 0;
General.Clip4D = 1;
General.Clip5A = 0;
General.Clip5B = 0;
General.Clip5C = -1;
General.Clip5D = 1;
General.ClipFactor = 5;
General.ClipOnlyDrawIntersectingVolume = 0;
General.ClipOnlyVolume = 0;
General.ClipPositionX = 650;
General.ClipPositionY = 150;
General.ClipWholeElements = 0;
General.ColorScheme = 1;
General.ConfirmOverwrite = 1;
General.ContextPositionX = 235;
General.ContextPositionY = 962;
General.DetachedMenu = 0;
General.DisplayBorderFactor = 0.2;
General.DoubleBuffer = 1;
General.DrawBoundingBoxes = 0;
General.ExpertMode = 0;
General.ExtraPositionX = 650;
General.ExtraPositionY = 350;
General.ExtraHeight = 100;
General.ExtraWidth = 100;
General.FastRedraw = 0;
General.FieldPositionX = 650;
General.FieldPositionY = 550;
General.FieldHeight = 488;
General.FieldWidth = 651;
General.FileChooserPositionX = 200;
General.FileChooserPositionY = 200;
General.FltkColorScheme = 0;
General.FontSize = -1;
General.GraphicsFontSize = 15;
General.GraphicsFontSizeTitle = 18;
General.GraphicsHeight = 1003;
General.GraphicsPositionX = 274;
General.GraphicsPositionY = 263;
General.GraphicsWidth = 1920;
General.HighOrderToolsPositionX = 650;
General.HighOrderToolsPositionY = 150;
General.HighResolutionGraphics = 1;
General.HighResolutionPointSizeFactor = 2;
General.InitialModule = 0;
General.InputScrolling = 1;
General.Light0 = 1;
General.Light0X = 0.65;
General.Light0Y = 0.65;
General.Light0Z = 1;
General.Light0W = 0;
General.Light1 = 0;
General.Light1X = 0.5;
General.Light1Y = 0.3;
General.Light1Z = 1;
General.Light1W = 0;
General.Light2 = 0;
General.Light2X = 0.5;
General.Light2Y = 0.3;
General.Light2Z = 1;
General.Light2W = 0;
General.Light3 = 0;
General.Light3X = 0.5;
General.Light3Y = 0.3;
General.Light3Z = 1;
General.Light3W = 0;
General.Light4 = 0;
General.Light4X = 0.5;
General.Light4Y = 0.3;
General.Light4Z = 1;
General.Light4W = 0;
General.Light5 = 0;
General.Light5X = 0.5;
General.Light5Y = 0.3;
General.Light5Z = 1;
General.Light5W = 0;
General.LineWidth = 1;
General.ManipulatorPositionX = 650;
General.ManipulatorPositionY = 150;
General.MaxX = 0.07000000000000001;
General.MaxY = 0.03;
General.MaxZ = 0;
General.MenuWidth = 219;
General.MenuHeight = 200;
General.MenuPositionX = 400;
General.MenuPositionY = 400;
General.MessageFontSize = -1;
General.MessageHeight = 300;
General.MinX = 0;
General.MinY = 0;
General.MinZ = 0;
General.MouseHoverMeshes = 0;
General.MouseSelection = 1;
General.MouseInvertZoom = 0;
General.NonModalWindows = 1;
General.NoPopup = 0;
General.NumThreads = 1;
General.OptionsPositionX = 827;
General.OptionsPositionY = 541;
General.Orthographic = 1;
General.PluginPositionX = 58;
General.PluginPositionY = 658;
General.PluginHeight = 488;
General.PluginWidth = 708;
General.PointSize = 3;
General.PolygonOffsetAlwaysOn = 0;
General.PolygonOffsetFactor = 1;
General.PolygonOffsetUnits = 1;
General.ProgressMeterStep = 20;
General.QuadricSubdivisions = 6;
General.RotationX = -0;
General.RotationY = 0;
General.RotationZ = -0;
General.RotationCenterGravity = 1;
General.RotationCenterX = 0;
General.RotationCenterY = 0;
General.RotationCenterZ = 0;
General.SaveOptions = 0;
General.SaveSession = 1;
General.ScaleX = 1;
General.ScaleY = 1;
General.ScaleZ = 1;
General.Shininess = 0.4;
General.ShininessExponent = 40;
General.ShowModuleMenu = 1;
General.ShowOptionsOnStartup = 0;
General.ShowMessagesOnStartup = 0;
General.SmallAxes = 1;
General.SmallAxesPositionX = -60;
General.SmallAxesPositionY = -40;
General.SmallAxesSize = 30;
General.StatisticsPositionX = 650;
General.StatisticsPositionY = 150;
General.Stereo = 0;
General.SystemMenuBar = 1;
General.Terminal = 0;
General.Tooltips = 1;
General.Trackball = 1;
General.TrackballHyperbolicSheet = 1;
General.TrackballQuaternion0 = 0;
General.TrackballQuaternion1 = 0;
General.TrackballQuaternion2 = 0;
General.TrackballQuaternion3 = 1;
General.TranslationX = 0;
General.TranslationY = 0;
General.TranslationZ = 0;
General.VectorType = 4;
General.Verbosity = 5;
General.VisibilityPositionX = 1118;
General.VisibilityPositionY = 464;
General.ZoomFactor = 4;
General.Color.Background = {255,255,255};
General.Color.BackgroundGradient = {208,215,255};
General.Color.Foreground = {85,85,85};
General.Color.Text = {0,0,0};
General.Color.Axes = {0,0,0};
General.Color.SmallAxes = {0,0,0};
General.Color.AmbientLight = {25,25,25};
General.Color.DiffuseLight = {255,255,255};
General.Color.SpecularLight = {255,255,255};
Geometry.DoubleClickedPointCommand = "";
Geometry.DoubleClickedLineCommand = "";
Geometry.DoubleClickedSurfaceCommand = "";
Geometry.DoubleClickedVolumeCommand = "";
Geometry.OCCTargetUnit = "";
Geometry.AutoCoherence = 1;
Geometry.Clip = 0;
Geometry.CopyMeshingMethod = 0;
Geometry.DoubleClickedEntityTag = 0;
Geometry.ExactExtrusion = 1;
Geometry.ExtrudeReturnLateralEntities = 1;
Geometry.ExtrudeSplinePoints = 5;
Geometry.HighlightOrphans = 0;
Geometry.LabelType = 0;
Geometry.Light = 1;
Geometry.LightTwoSide = 1;
Geometry.Lines = 1;
Geometry.LineNumbers = 0;
Geometry.LineSelectWidth = 3;
Geometry.LineType = 0;
Geometry.LineWidth = 2;
Geometry.MatchGeomAndMesh = 0;
Geometry.MatchMeshScaleFactor = 1;
Geometry.MatchMeshTolerance = 1e-06;
Geometry.Normals = 0;
Geometry.NumSubEdges = 40;
Geometry.OCCAutoFix = 1;
Geometry.OCCBooleanPreserveNumbering = 1;
Geometry.OCCDisableSTL = 0;
Geometry.OCCFixDegenerated = 0;
Geometry.OCCFixSmallEdges = 0;
Geometry.OCCFixSmallFaces = 0;
Geometry.OCCImportLabels = 1;
Geometry.OCCParallel = 0;
Geometry.OCCScaling = 1;
Geometry.OCCSewFaces = 0;
Geometry.OffsetX = 0;
Geometry.OffsetY = 0;
Geometry.OffsetZ = 0;
Geometry.OldCircle = 0;
Geometry.OldRuledSurface = 0;
Geometry.OldNewReg = 1;
Geometry.Points = 1;
Geometry.PointNumbers = 0;
Geometry.PointSelectSize = 6;
Geometry.PointSize = 4;
Geometry.PointType = 0;
Geometry.ReparamOnFaceRobust = 0;
Geometry.ScalingFactor = 1;
Geometry.OrientedPhysicals = 1;
Geometry.SnapX = 0.1;
Geometry.SnapY = 0.1;
Geometry.SnapZ = 0.1;
Geometry.Surfaces = 0;
Geometry.SurfaceNumbers = 0;
Geometry.SurfaceType = 0;
Geometry.Tangents = 0;
Geometry.Tolerance = 1e-08;
Geometry.ToleranceBoolean = 0;
Geometry.Transform = 0;
Geometry.TransformXX = 1;
Geometry.TransformXY = 0;
Geometry.TransformXZ = 0;
Geometry.TransformYX = 0;
Geometry.TransformYY = 1;
Geometry.TransformYZ = 0;
Geometry.TransformZX = 0;
Geometry.TransformZY = 0;
Geometry.TransformZZ = 1;
Geometry.Volumes = 0;
Geometry.VolumeNumbers = 0;
Geometry.Color.Points = {90,90,90};
Geometry.Color.Lines = {0,0,255};
Geometry.Color.Surfaces = {128,128,128};
Geometry.Color.Volumes = {255,255,0};
Geometry.Color.Selection = {255,0,0};
Geometry.Color.HighlightZero = {255,0,0};
Geometry.Color.HighlightOne = {255,150,0};
Geometry.Color.HighlightTwo = {255,255,0};
Geometry.Color.Tangents = {255,255,0};
Geometry.Color.Normals = {255,0,0};
Geometry.Color.Projection = {0,255,0};
Mesh.Algorithm = 2;
Mesh.Algorithm3D = 1;
Mesh.AngleSmoothNormals = 30;
Mesh.AngleToleranceFacetOverlap = 0.1;
Mesh.AnisoMax = 9.999999999999999e+32;
Mesh.AllowSwapAngle = 10;
Mesh.BdfFieldFormat = 1;
Mesh.Binary = 0;
Mesh.BoundaryLayerFanPoints = 5;
Mesh.CgnsImportOrder = 1;
Mesh.CgnsConstructTopology = 0;
Mesh.CharacteristicLengthExtendFromBoundary = 1;
Mesh.CharacteristicLengthFactor = 1;
Mesh.CharacteristicLengthMin = 0;
Mesh.CharacteristicLengthMax = 1e+22;
Mesh.CharacteristicLengthFromCurvature = 0;
Mesh.CharacteristicLengthFromPoints = 1;
Mesh.Clip = 0;
Mesh.ColorCarousel = 0;
Mesh.CompoundClassify = 1;
Mesh.CompoundCharacteristicLengthFactor = 0.5;
Mesh.CpuTime = 0;
Mesh.DrawSkinOnly = 0;
Mesh.Dual = 0;
Mesh.ElementOrder = 1;
Mesh.Explode = 1;
Mesh.FlexibleTransfinite = 0;
Mesh.NewtonConvergenceTestXYZ = 0;
Mesh.Format = 10;
Mesh.Hexahedra = 1;
Mesh.HighOrderIterMax = 100;
Mesh.HighOrderNumLayers = 6;
Mesh.HighOrderOptimize = 0;
Mesh.HighOrderPassMax = 25;
Mesh.HighOrderPeriodic = 0;
Mesh.HighOrderPoissonRatio = 0.33;
Mesh.HighOrderPrimSurfMesh = 0;
Mesh.HighOrderDistCAD = 0;
Mesh.HighOrderThresholdMin = 0.1;
Mesh.HighOrderThresholdMax = 2;
Mesh.LabelSampling = 1;
Mesh.LabelType = 0;
Mesh.LcIntegrationPrecision = 1e-09;
Mesh.Light = 1;
Mesh.LightLines = 2;
Mesh.LightTwoSide = 1;
Mesh.Lines = 1;
Mesh.LineNumbers = 0;
Mesh.LineWidth = 1;
Mesh.MaxNumThreads1D = 0;
Mesh.MaxNumThreads2D = 0;
Mesh.MaxNumThreads3D = 0;
Mesh.MeshOnlyVisible = 0;
Mesh.MetisAlgorithm = 1;
Mesh.MetisEdgeMatching = 2;
Mesh.MetisMaxLoadImbalance = -1;
Mesh.MetisObjective = 1;
Mesh.MetisMinConn = -1;
Mesh.MetisRefinementAlgorithm = 2;
Mesh.MinimumCirclePoints = 7;
Mesh.MinimumCurvePoints = 3;
Mesh.MshFileVersion = 4.1;
Mesh.MedFileMinorVersion = -1;
Mesh.MedImportGroupsOfNodes = 0;
Mesh.MedSingleModel = 0;
Mesh.PartitionHexWeight = -1;
Mesh.PartitionLineWeight = -1;
Mesh.PartitionPrismWeight = -1;
Mesh.PartitionPyramidWeight = -1;
Mesh.PartitionQuadWeight = -1;
Mesh.PartitionTrihedronWeight = 0;
Mesh.PartitionTetWeight = -1;
Mesh.PartitionTriWeight = -1;
Mesh.PartitionCreateTopology = 1;
Mesh.PartitionCreatePhysicals = 1;
Mesh.PartitionCreateGhostCells = 0;
Mesh.PartitionSplitMeshFiles = 0;
Mesh.PartitionTopologyFile = 0;
Mesh.PartitionOldStyleMsh2 = 1;
Mesh.NbHexahedra = 0;
Mesh.NbNodes = 27248;
Mesh.NbPartitions = 0;
Mesh.NbPrisms = 0;
Mesh.NbPyramids = 0;
Mesh.NbTrihedra = 0;
Mesh.NbQuadrangles = 26877;
Mesh.NbTetrahedra = 0;
Mesh.NbTriangles = 0;
Mesh.Normals = 0;
Mesh.NumSubEdges = 2;
Mesh.Optimize = 1;
Mesh.OptimizeThreshold = 0.3;
Mesh.OptimizeNetgen = 0;
Mesh.Points = 0;
Mesh.PointNumbers = 0;
Mesh.PointSize = 4;
Mesh.PointType = 0;
Mesh.Prisms = 1;
Mesh.Pyramids = 1;
Mesh.Trihedra = 1;
Mesh.Quadrangles = 1;
Mesh.QualityInf = 0;
Mesh.QualitySup = 0;
Mesh.QualityType = 2;
Mesh.RadiusInf = 0;
Mesh.RadiusSup = 0;
Mesh.RandomFactor = 1e-09;
Mesh.RandomFactor3D = 1e-12;
Mesh.RandomSeed = 1;
Mesh.PreserveNumberingMsh2 = 0;
Mesh.IgnorePeriodicity = 0;
Mesh.RecombinationAlgorithm = 1;
Mesh.RecombineAll = 0;
Mesh.RecombineOptimizeTopology = 5;
Mesh.Recombine3DAll = 0;
Mesh.Recombine3DLevel = 0;
Mesh.Recombine3DConformity = 0;
Mesh.RefineSteps = 10;
Mesh.Renumber = 1;
Mesh.SaveAll = 0;
Mesh.SaveElementTagType = 1;
Mesh.SaveTopology = 0;
Mesh.SaveParametric = 0;
Mesh.SaveGroupsOfNodes = 0;
Mesh.ScalingFactor = 1;
Mesh.SecondOrderExperimental = 0;
Mesh.SecondOrderIncomplete = 0;
Mesh.SecondOrderLinear = 0;
Mesh.Smoothing = 1;
Mesh.SmoothCrossField = 0;
Mesh.CrossFieldClosestPoint = 1;
Mesh.SmoothNormals = 0;
Mesh.SmoothRatio = 1.8;
Mesh.StlOneSolidPerSurface = 0;
Mesh.StlRemoveDuplicateTriangles = 0;
Mesh.SubdivisionAlgorithm = 0;
Mesh.SurfaceEdges = 0;
Mesh.SurfaceFaces = 0;
Mesh.SurfaceNumbers = 0;
Mesh.SwitchElementTags = 0;
Mesh.Tangents = 0;
Mesh.Tetrahedra = 1;
Mesh.ToleranceEdgeLength = 0;
Mesh.ToleranceInitialDelaunay = 1e-08;
Mesh.Triangles = 1;
Mesh.UnvStrictFormat = 1;
Mesh.VolumeEdges = 1;
Mesh.VolumeFaces = 0;
Mesh.VolumeNumbers = 0;
Mesh.Voronoi = 0;
Mesh.ZoneDefinition = 0;
Mesh.Color.Points = {0,0,255};
Mesh.Color.PointsSup = {255,0,255};
Mesh.Color.Lines = {0,0,0};
Mesh.Color.Triangles = {160,150,255};
Mesh.Color.Quadrangles = {130,120,225};
Mesh.Color.Tetrahedra = {160,150,255};
Mesh.Color.Hexahedra = {130,120,225};
Mesh.Color.Prisms = {232,210,23};
Mesh.Color.Pyramids = {217,113,38};
Mesh.Color.Trihedra = {20,255,0};
Mesh.Color.Tangents = {255,255,0};
Mesh.Color.Normals = {255,0,0};
Mesh.Color.Zero = {255,120,0};
Mesh.Color.One = {0,255,132};
Mesh.Color.Two = {255,160,0};
Mesh.Color.Three = {0,255,192};
Mesh.Color.Four = {255,200,0};
Mesh.Color.Five = {0,216,255};
Mesh.Color.Six = {255,240,0};
Mesh.Color.Seven = {0,176,255};
Mesh.Color.Eight = {228,255,0};
Mesh.Color.Nine = {0,116,255};
Mesh.Color.Ten = {188,255,0};
Mesh.Color.Eleven = {0,76,255};
Mesh.Color.Twelve = {148,255,0};
Mesh.Color.Thirteen = {24,0,255};
Mesh.Color.Fourteen = {108,255,0};
Mesh.Color.Fifteen = {84,0,255};
Mesh.Color.Sixteen = {68,255,0};
Mesh.Color.Seventeen = {104,0,255};
Mesh.Color.Eighteen = {0,255,52};
Mesh.Color.Nineteen = {184,0,255};
Solver.Executable0 = "";
Solver.Executable1 = "";
Solver.Executable2 = "";
Solver.Executable3 = "";
Solver.Executable4 = "";
Solver.Executable5 = "";
Solver.Executable6 = "";
Solver.Executable7 = "";
Solver.Executable8 = "";
Solver.Executable9 = "";
Solver.Name0 = "GetDP";
Solver.Name1 = "";
Solver.Name2 = "";
Solver.Name3 = "";
Solver.Name4 = "";
Solver.Name5 = "";
Solver.Name6 = "";
Solver.Name7 = "";
Solver.Name8 = "";
Solver.Name9 = "";
Solver.Extension0 = ".pro";
Solver.Extension1 = "";
Solver.Extension2 = "";
Solver.Extension3 = "";
Solver.Extension4 = "";
Solver.Extension5 = "";
Solver.Extension6 = "";
Solver.Extension7 = "";
Solver.Extension8 = "";
Solver.Extension9 = "";
Solver.OctaveInterpreter = "octave";
Solver.PythonInterpreter = "python";
Solver.RemoteLogin0 = "";
Solver.RemoteLogin1 = "";
Solver.RemoteLogin2 = "";
Solver.RemoteLogin3 = "";
Solver.RemoteLogin4 = "";
Solver.RemoteLogin5 = "";
Solver.RemoteLogin6 = "";
Solver.RemoteLogin7 = "";
Solver.RemoteLogin8 = "";
Solver.RemoteLogin9 = "";
Solver.SocketName = ".gmshsock";
Solver.AlwaysListen = 0;
Solver.AutoArchiveOutputFiles = 0;
Solver.AutoCheck = 1;
Solver.AutoLoadDatabase = 0;
Solver.AutoSaveDatabase = 1;
Solver.AutoMesh = 2;
Solver.AutoMergeFile = 1;
Solver.AutoShowViews = 2;
Solver.AutoShowLastStep = 1;
Solver.Plugins = 0;
Solver.ShowInvisibleParameters = 0;
Solver.Timeout = 5;
PostProcessing.DoubleClickedGraphPointCommand = "";
PostProcessing.GraphPointCommand = "";
PostProcessing.AnimationDelay = 0.1;
PostProcessing.AnimationCycle = 0;
PostProcessing.AnimationStep = 1;
PostProcessing.CombineRemoveOriginal = 1;
PostProcessing.DoubleClickedGraphPointX = 0;
PostProcessing.DoubleClickedGraphPointY = 0;
PostProcessing.DoubleClickedView = 0;
PostProcessing.ForceElementData = 0;
PostProcessing.ForceNodeData = 0;
PostProcessing.Format = 10;
PostProcessing.GraphPointX = 0;
PostProcessing.GraphPointY = 0;
PostProcessing.HorizontalScales = 1;
PostProcessing.Link = 0;
PostProcessing.NbViews = 0;
PostProcessing.Plugins = 1;
PostProcessing.SaveInterpolationMatrices = 1;
PostProcessing.SaveMesh = 1;
PostProcessing.Smoothing = 0;
Print.ParameterCommand = "Mesh.Clip=1; View.Clip=1; General.ClipWholeElements=1; General.Clip0D=Print.Parameter; SetChanged;";
Print.Parameter = 0;
Print.ParameterFirst = -1;
Print.ParameterLast = 1;
Print.ParameterSteps = 10;
Print.Background = 0;
Print.CompositeWindows = 0;
Print.PgfTwoDim = 1;
Print.PgfExportAxis = 0;
Print.PgfHorizontalBar = 0;
Print.DeleteTemporaryFiles = 1;
Print.EpsBestRoot = 1;
Print.EpsCompress = 0;
Print.EpsLineWidthFactor = 1;
Print.EpsOcclusionCulling = 1;
Print.EpsPointSizeFactor = 1;
Print.EpsPS3Shading = 0;
Print.EpsQuality = 1;
Print.Format = 10;
Print.GeoLabels = 1;
Print.GeoOnlyPhysicals = 0;
Print.GifDither = 0;
Print.GifInterlace = 0;
Print.GifSort = 1;
Print.GifTransparent = 0;
Print.Height = -1;
Print.JpegQuality = 100;
Print.JpegSmoothing = 0;
Print.PostElementary = 1;
Print.PostElement = 0;
Print.PostGamma = 0;
Print.PostEta = 0;
Print.PostSICN = 0;
Print.PostSIGE = 0;
Print.PostDisto = 0;
Print.TexAsEquation = 0;
Print.Text = 1;
Print.X3dCompatibility = 0;
Print.X3dPrecision = 1e-09;
Print.X3dRemoveInnerBorders = 0;
Print.X3dTransparency = 0;
Print.Width = -1;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -19,6 +19,7 @@ MODULE moduleMesh0D
PROCEDURE, PASS:: randPos => randPos0D PROCEDURE, PASS:: randPos => randPos0D
PROCEDURE, NOPASS:: fPsi => fPsi0D PROCEDURE, NOPASS:: fPsi => fPsi0D
PROCEDURE, PASS:: gatherEF => gatherEF0D PROCEDURE, PASS:: gatherEF => gatherEF0D
PROCEDURE, PASS:: gatherMF => gatherMF0D
PROCEDURE, PASS:: elemK => elemK0D PROCEDURE, PASS:: elemK => elemK0D
PROCEDURE, PASS:: elemF => elemF0D PROCEDURE, PASS:: elemF => elemF0D
PROCEDURE, PASS:: phy2log => phy2log0D PROCEDURE, PASS:: phy2log => phy2log0D
@ -62,6 +63,7 @@ MODULE moduleMesh0D
!Inits dummy 0D volume !Inits dummy 0D volume
SUBROUTINE initVol0D(self, n, p, nodes) SUBROUTINE initVol0D(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
CLASS(meshVol0D), INTENT(out):: self CLASS(meshVol0D), INTENT(out):: self
@ -75,10 +77,11 @@ MODULE moduleMesh0D
self%volume = 1.D0 self%volume = 1.D0
self%n1%v = 1.D0 self%n1%v = 1.D0
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVol0D END SUBROUTINE initVol0D
PURE FUNCTION getNodes0D(self) RESULT(n) PURE FUNCTION getNodes0D(self) RESULT(n)
@ -123,6 +126,17 @@ MODULE moduleMesh0D
END FUNCTION gatherEF0D END FUNCTION gatherEF0D
PURE FUNCTION gatherMF0D(self, xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol0D), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: MF(1:3)
MF = 0.D0
END FUNCTION gatherMF0D
PURE FUNCTION elemK0D(self) RESULT(localK) PURE FUNCTION elemK0D(self) RESULT(localK)
IMPLICIT NONE IMPLICIT NONE

View file

@ -77,6 +77,7 @@ MODULE moduleMesh1DCart
PROCEDURE, PASS:: elemF => elemFSegm PROCEDURE, PASS:: elemF => elemFSegm
PROCEDURE, NOPASS:: inside => insideSegm PROCEDURE, NOPASS:: inside => insideSegm
PROCEDURE, PASS:: gatherEF => gatherEFSegm PROCEDURE, PASS:: gatherEF => gatherEFSegm
PROCEDURE, PASS:: gatherMF => gatherMFSegm
PROCEDURE, PASS:: getNodes => getNodesSegm PROCEDURE, PASS:: getNodes => getNodesSegm
PROCEDURE, PASS:: phy2log => phy2logSegm PROCEDURE, PASS:: phy2log => phy2logSegm
PROCEDURE, PASS:: nextElement => nextElementSegm PROCEDURE, PASS:: nextElement => nextElementSegm
@ -215,10 +216,11 @@ MODULE moduleMesh1DCart
self%n1%v = self%n1%v + self%arNodes(1) self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2) self%n2%v = self%n2%v + self%arNodes(2)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVol1DCartSegm END SUBROUTINE initVol1DCartSegm
!Calculates a random position in 1D volume !Calculates a random position in 1D volume
@ -388,6 +390,28 @@ MODULE moduleMesh1DCart
END FUNCTION gatherEFSegm END FUNCTION gatherEFSegm
PURE FUNCTION gatherMFSegm(self, xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol1DCartSegm), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:2)
REAL(8):: MF_Nodes(1:2, 1:3)
REAL(8):: MF(1:3)
REAL(8):: invJ
MF_Nodes(1:2,1) = (/ self%n1%emData%B(1), &
self%n2%emData%B(1) /)
MF_Nodes(1:2,2) = (/ self%n1%emData%B(2), &
self%n2%emData%B(2) /)
MF_Nodes(1:2,3) = (/ self%n1%emData%B(3), &
self%n2%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi, MF_Nodes)
END FUNCTION gatherMFSegm
!Get nodes from 1D volume !Get nodes from 1D volume
PURE FUNCTION getNodesSegm(self) RESULT(n) PURE FUNCTION getNodesSegm(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE

View file

@ -78,6 +78,7 @@ MODULE moduleMesh1DRad
PROCEDURE, PASS:: elemF => elemFRad PROCEDURE, PASS:: elemF => elemFRad
PROCEDURE, NOPASS:: inside => insideRad PROCEDURE, NOPASS:: inside => insideRad
PROCEDURE, PASS:: gatherEF => gatherEFRad PROCEDURE, PASS:: gatherEF => gatherEFRad
PROCEDURE, PASS:: gatherMF => gatherMFRad
PROCEDURE, PASS:: getNodes => getNodesRad PROCEDURE, PASS:: getNodes => getNodesRad
PROCEDURE, PASS:: phy2log => phy2logRad PROCEDURE, PASS:: phy2log => phy2logRad
PROCEDURE, PASS:: nextElement => nextElementRad PROCEDURE, PASS:: nextElement => nextElementRad
@ -217,10 +218,11 @@ MODULE moduleMesh1DRad
self%n1%v = self%n1%v + self%arNodes(1) self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2) self%n2%v = self%n2%v + self%arNodes(2)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVol1DRadSegm END SUBROUTINE initVol1DRadSegm
!Calculates a random position in 1D volume !Calculates a random position in 1D volume
@ -400,6 +402,28 @@ MODULE moduleMesh1DRad
END FUNCTION gatherEFRad END FUNCTION gatherEFRad
PURE FUNCTION gatherMFRad(self, xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol1DRadSegm), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:2)
REAL(8):: MF_Nodes(1:2, 1:3)
REAL(8):: MF(1:3)
REAL(8):: invJ
MF_Nodes(1:2,1) = (/ self%n1%emData%B(1), &
self%n2%emData%B(1) /)
MF_Nodes(1:2,2) = (/ self%n1%emData%B(2), &
self%n2%emData%B(2) /)
MF_Nodes(1:2,3) = (/ self%n1%emData%B(3), &
self%n2%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi, MF_Nodes)
END FUNCTION gatherMFRad
!Get nodes from 1D volume !Get nodes from 1D volume
PURE FUNCTION getNodesRad(self) RESULT(n) PURE FUNCTION getNodesRad(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE

View file

@ -85,6 +85,7 @@ MODULE moduleMesh2DCart
PROCEDURE, PASS:: elemF => elemFQuad PROCEDURE, PASS:: elemF => elemFQuad
PROCEDURE, NOPASS:: inside => insideQuad PROCEDURE, NOPASS:: inside => insideQuad
PROCEDURE, PASS:: gatherEF => gatherEFQuad PROCEDURE, PASS:: gatherEF => gatherEFQuad
PROCEDURE, PASS:: gatherMF => gatherMFQuad
PROCEDURE, PASS:: getNodes => getNodesQuad PROCEDURE, PASS:: getNodes => getNodesQuad
PROCEDURE, PASS:: phy2log => phy2logQuad PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: nextElement => nextElementQuad PROCEDURE, PASS:: nextElement => nextElementQuad
@ -114,6 +115,7 @@ MODULE moduleMesh2DCart
PROCEDURE, PASS:: elemF => elemFTria PROCEDURE, PASS:: elemF => elemFTria
PROCEDURE, NOPASS:: inside => insideTria PROCEDURE, NOPASS:: inside => insideTria
PROCEDURE, PASS:: gatherEF => gatherEFTria PROCEDURE, PASS:: gatherEF => gatherEFTria
PROCEDURE, PASS:: gatherMF => gatherMFTria
PROCEDURE, PASS:: getNodes => getNodesTria PROCEDURE, PASS:: getNodes => getNodesTria
PROCEDURE, PASS:: phy2log => phy2logTria PROCEDURE, PASS:: phy2log => phy2logTria
PROCEDURE, PASS:: nextElement => nextElementTria PROCEDURE, PASS:: nextElement => nextElementTria
@ -305,10 +307,11 @@ MODULE moduleMesh2DCart
self%n3%v = self%n3%v + self%arNodes(3) self%n3%v = self%n3%v + self%arNodes(3)
self%n4%v = self%n4%v + self%arNodes(4) self%n4%v = self%n4%v + self%arNodes(4)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVolQuad2DCart END SUBROUTINE initVolQuad2DCart
!Computes element area !Computes element area
@ -505,6 +508,33 @@ MODULE moduleMesh2DCart
END FUNCTION gatherEFQuad END FUNCTION gatherEFQuad
PURE FUNCTION gatherMFQuad(self,xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol2DCartQuad), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:4)
REAL(8):: MF_Nodes(1:4,1:3)
REAL(8):: MF(1:3)
MF_Nodes(1:4,1) = (/self%n1%emData%B(1), &
self%n2%emData%B(1), &
self%n3%emData%B(1), &
self%n4%emData%B(1) /)
MF_Nodes(1:4,2) = (/self%n1%emData%B(2), &
self%n2%emData%B(2), &
self%n3%emData%B(2), &
self%n4%emData%B(2) /)
MF_Nodes(1:4,3) = (/self%n1%emData%B(3), &
self%n2%emData%B(3), &
self%n3%emData%B(3), &
self%n4%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi(:), MF_Nodes)
END FUNCTION gatherMFQuad
!Gets nodes from quadrilateral element !Gets nodes from quadrilateral element
PURE FUNCTION getNodesQuad(self) RESULT(n) PURE FUNCTION getNodesQuad(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -605,10 +635,11 @@ MODULE moduleMesh2DCart
self%n2%v = self%n2%v + self%arNodes(2) self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3) self%n3%v = self%n3%v + self%arNodes(3)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVolTria2DCart END SUBROUTINE initVolTria2DCart
!Random position in quadrilateral volume !Random position in quadrilateral volume
@ -816,6 +847,30 @@ MODULE moduleMesh2DCart
END FUNCTION gatherEFTria END FUNCTION gatherEFTria
PURE FUNCTION gatherMFTria(self,xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol2DCartTria), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:3)
REAL(8):: MF_Nodes(1:3,1:3)
REAL(8):: MF(1:3)
MF_Nodes(1:3,1) = (/self%n1%emData%B(1), &
self%n2%emData%B(1), &
self%n3%emData%B(1) /)
MF_Nodes(1:3,2) = (/self%n1%emData%B(2), &
self%n2%emData%B(2), &
self%n3%emData%B(2) /)
MF_Nodes(1:3,3) = (/self%n1%emData%B(3), &
self%n2%emData%B(3), &
self%n3%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi, MF_Nodes)
END FUNCTION gatherMFTria
!Gets node indexes from triangular element !Gets node indexes from triangular element
PURE FUNCTION getNodesTria(self) RESULT(n) PURE FUNCTION getNodesTria(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE

View file

@ -86,6 +86,7 @@ MODULE moduleMesh2DCyl
PROCEDURE, PASS:: elemF => elemFQuad PROCEDURE, PASS:: elemF => elemFQuad
PROCEDURE, NOPASS:: inside => insideQuad PROCEDURE, NOPASS:: inside => insideQuad
PROCEDURE, PASS:: gatherEF => gatherEFQuad PROCEDURE, PASS:: gatherEF => gatherEFQuad
PROCEDURE, PASS:: gatherMF => gatherMFQuad
PROCEDURE, PASS:: getNodes => getNodesQuad PROCEDURE, PASS:: getNodes => getNodesQuad
PROCEDURE, PASS:: phy2log => phy2logQuad PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: nextElement => nextElementQuad PROCEDURE, PASS:: nextElement => nextElementQuad
@ -115,6 +116,7 @@ MODULE moduleMesh2DCyl
PROCEDURE, PASS:: elemF => elemFTria PROCEDURE, PASS:: elemF => elemFTria
PROCEDURE, NOPASS:: inside => insideTria PROCEDURE, NOPASS:: inside => insideTria
PROCEDURE, PASS:: gatherEF => gatherEFTria PROCEDURE, PASS:: gatherEF => gatherEFTria
PROCEDURE, PASS:: gatherMF => gatherMFTria
PROCEDURE, PASS:: getNodes => getNodesTria PROCEDURE, PASS:: getNodes => getNodesTria
PROCEDURE, PASS:: phy2log => phy2logTria PROCEDURE, PASS:: phy2log => phy2logTria
PROCEDURE, PASS:: nextElement => nextElementTria PROCEDURE, PASS:: nextElement => nextElementTria
@ -293,10 +295,11 @@ MODULE moduleMesh2DCyl
self%n3%v = self%n3%v + self%arNodes(3) self%n3%v = self%n3%v + self%arNodes(3)
self%n4%v = self%n4%v + self%arNodes(4) self%n4%v = self%n4%v + self%arNodes(4)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVolQuad2DCyl END SUBROUTINE initVolQuad2DCyl
!Computes element area !Computes element area
@ -526,6 +529,33 @@ MODULE moduleMesh2DCyl
END FUNCTION gatherEFQuad END FUNCTION gatherEFQuad
PURE FUNCTION gatherMFQuad(self,xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol2DCylQuad), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:4)
REAL(8):: MF_Nodes(1:4,1:3)
REAL(8):: MF(1:3)
MF_Nodes(1:4,1) = (/self%n1%emData%B(1), &
self%n2%emData%B(1), &
self%n3%emData%B(1), &
self%n4%emData%B(1) /)
MF_Nodes(1:4,2) = (/self%n1%emData%B(2), &
self%n2%emData%B(2), &
self%n3%emData%B(2), &
self%n4%emData%B(2) /)
MF_Nodes(1:4,3) = (/self%n1%emData%B(3), &
self%n2%emData%B(3), &
self%n3%emData%B(3), &
self%n4%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi(:), MF_Nodes)
END FUNCTION gatherMFQuad
!Gets nodes from quadrilateral element !Gets nodes from quadrilateral element
PURE FUNCTION getNodesQuad(self) RESULT(n) PURE FUNCTION getNodesQuad(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -626,10 +656,11 @@ MODULE moduleMesh2DCyl
self%n2%v = self%n2%v + self%arNodes(2) self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3) self%n3%v = self%n3%v + self%arNodes(3)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVolTria2DCyl END SUBROUTINE initVolTria2DCyl
!Random position in quadrilateral volume !Random position in quadrilateral volume
@ -845,6 +876,30 @@ MODULE moduleMesh2DCyl
END FUNCTION gatherEFTria END FUNCTION gatherEFTria
PURE FUNCTION gatherMFTria(self,xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol2DCylTria), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:3)
REAL(8):: MF_Nodes(1:3,1:3)
REAL(8):: MF(1:3)
MF_Nodes(1:3,1) = (/self%n1%emData%B(1), &
self%n2%emData%B(1), &
self%n3%emData%B(1) /)
MF_Nodes(1:3,2) = (/self%n1%emData%B(2), &
self%n2%emData%B(2), &
self%n3%emData%B(2) /)
MF_Nodes(1:3,3) = (/self%n1%emData%B(3), &
self%n2%emData%B(3), &
self%n3%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi, MF_Nodes)
END FUNCTION gatherMFTria
!Gets node indexes from triangular element !Gets node indexes from triangular element
PURE FUNCTION getNodesTria(self) RESULT(n) PURE FUNCTION getNodesTria(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE

View file

@ -78,6 +78,7 @@ MODULE moduleMesh3DCart
PROCEDURE, PASS:: elemF => elemFTetra PROCEDURE, PASS:: elemF => elemFTetra
PROCEDURE, NOPASS:: inside => insideTetra PROCEDURE, NOPASS:: inside => insideTetra
PROCEDURE, PASS:: gatherEF => gatherEFTetra PROCEDURE, PASS:: gatherEF => gatherEFTetra
PROCEDURE, PASS:: gatherMF => gatherMFTetra
PROCEDURE, PASS:: getNodes => getNodesTetra PROCEDURE, PASS:: getNodes => getNodesTetra
PROCEDURE, PASS:: phy2log => phy2logTetra PROCEDURE, PASS:: phy2log => phy2logTetra
PROCEDURE, PASS:: nextElement => nextElementTetra PROCEDURE, PASS:: nextElement => nextElementTetra
@ -280,10 +281,11 @@ MODULE moduleMesh3DCart
self%n3%v = self%n3%v + volNodes(3) self%n3%v = self%n3%v + volNodes(3)
self%n4%v = self%n4%v + volNodes(4) self%n4%v = self%n4%v + volNodes(4)
self%sigmaVrelMax = sigma_ref/L_ref**2
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initVolTetra3DCart END SUBROUTINE initVolTetra3DCart
!Random position in volume tetrahedron !Random position in volume tetrahedron
@ -498,6 +500,33 @@ MODULE moduleMesh3DCart
END FUNCTION gatherEFTetra END FUNCTION gatherEFTetra
PURE FUNCTION gatherMFTetra(self, xi) RESULT(MF)
IMPLICIT NONE
CLASS(meshVol3DCartTetra), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:4)
REAL(8):: MF_Nodes(1:4,1:3)
REAL(8):: MF(1:3)
MF_Nodes(1:4,1) = (/self%n1%emData%B(1), &
self%n2%emData%B(1), &
self%n3%emData%B(1), &
self%n4%emData%B(1) /)
MF_Nodes(1:4,2) = (/self%n1%emData%B(2), &
self%n2%emData%B(2), &
self%n3%emData%B(2), &
self%n4%emData%B(2) /)
MF_Nodes(1:4,3) = (/self%n1%emData%B(3), &
self%n2%emData%B(3), &
self%n3%emData%B(3), &
self%n4%emData%B(3) /)
fPsi = self%fPsi(xi)
MF = MATMUL(fPsi, MF_Nodes)
END FUNCTION gatherMFTetra
PURE FUNCTION getNodesTetra(self) RESULT(n) PURE FUNCTION getNodesTetra(self) RESULT(n)
IMPLICIT NONE IMPLICIT NONE

View file

@ -45,6 +45,7 @@ MODULE moduleMeshOutput0D
CLASS(meshGeneric), INTENT(inout):: self CLASS(meshGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
CHARACTER(:), ALLOCATABLE:: fileName CHARACTER(:), ALLOCATABLE:: fileName
INTEGER:: k
fileName='OUTPUT_Collisions.dat' fileName='OUTPUT_Collisions.dat'
IF (t == 0) THEN IF (t == 0) THEN
@ -56,7 +57,7 @@ MODULE moduleMeshOutput0D
END IF END IF
OPEN(20, file = path // folder // '/' // fileName, position = 'append', action = 'write') OPEN(20, file = path // folder // '/' // fileName, position = 'append', action = 'write')
WRITE(20, "(ES20.6E3, I20)") REAL(t)*tauMin*ti_ref, self%vols(1)%obj%nColl WRITE(20, "(ES20.6E3, 10I20)") REAL(t)*tauMin*ti_ref, (self%vols(1)%obj%tallyColl(k)%tally, k=1,nCollPairs)
CLOSE(20) CLOSE(20)
END SUBROUTINE printColl0D END SUBROUTINE printColl0D

View file

@ -67,24 +67,35 @@ MODULE moduleMeshInputGmsh2
!Read the nodes information !Read the nodes information
DO e = 1, self%numNodes DO e = 1, self%numNodes
READ(10, *) n, r(1), r(2), r(3) READ(10, *) n, r(1), r(2), r(3)
SELECT CASE(self%geometry) SELECT CASE(self%dimen)
CASE("3DCart") CASE(3)
ALLOCATE(meshNode3Dcart::self%nodes(n)%obj) ALLOCATE(meshNode3Dcart::self%nodes(n)%obj)
self%connectMesh => connectMesh3DCart
CASE("2DCyl") CASE(2)
SELECT CASE(self%geometry)
CASE("Cyl")
ALLOCATE(meshNode2DCyl:: self%nodes(n)%obj) ALLOCATE(meshNode2DCyl:: self%nodes(n)%obj)
r(3) = 0.D0 self%connectMesh => connectMesh2DCyl
CASE("2DCart") CASE("Cart")
ALLOCATE(meshNode2DCart:: self%nodes(n)%obj) ALLOCATE(meshNode2DCart:: self%nodes(n)%obj)
self%connectMesh => connectMesh2DCart
END SELECT
r(3) = 0.D0 r(3) = 0.D0
CASE("1DRad") CASE(1)
SELECT CASE(self%geometry)
CASE("Rad")
ALLOCATE(meshNode1DRad:: self%nodes(n)%obj) ALLOCATE(meshNode1DRad:: self%nodes(n)%obj)
r(2:3) = 0.D0 self%connectMesh => connectMesh1DRad
CASE("1DCart") CASE("Cart")
ALLOCATE(meshNode1DCart:: self%nodes(n)%obj) ALLOCATE(meshNode1DCart:: self%nodes(n)%obj)
self%connectMesh => connectMesh1DCart
END SELECT
r(2:3) = 0.D0 r(2:3) = 0.D0
END SELECT END SELECT
@ -92,7 +103,6 @@ MODULE moduleMeshInputGmsh2
END DO END DO
!Skip comments !Skip comments
READ(10, *) READ(10, *)
READ(10, *) READ(10, *)
@ -106,16 +116,16 @@ MODULE moduleMeshInputGmsh2
self%numEdges = 0 self%numEdges = 0
DO e = 1, totalNumElem DO e = 1, totalNumElem
READ(10, *) eTemp, elemType READ(10, *) eTemp, elemType
SELECT CASE(self%geometry) SELECT CASE(self%dimen)
CASE("3DCart") CASE(3)
!Element type 2 is triangle in gmsh !Element type 2 is triangle in gmsh
IF (elemType == 2) self%numEdges = e IF (elemType == 2) self%numEdges = e
CASE("2DCyl","2DCart") CASE(2)
!Element type 1 is segment in Gmsh !Element type 1 is segment in Gmsh
IF (elemType == 1) self%numEdges = e IF (elemType == 1) self%numEdges = e
CASE("1DRad","1DCart") CASE(1)
!Element type 15 is physical point in Gmsh !Element type 15 is physical point in Gmsh
IF (elemType == 15) self%numEdges = e IF (elemType == 15) self%numEdges = e
@ -148,8 +158,8 @@ MODULE moduleMeshInputGmsh2
!Reads edges !Reads edges
DO e=1, self%numEdges DO e=1, self%numEdges
!Reads the edge according to the geometry !Reads the edge according to the geometry
SELECT CASE(self%geometry) SELECT CASE(self%dimen)
CASE("3DCart") CASE(3)
READ(10, *) n, elemType, eTemp, boundaryType READ(10, *) n, elemType, eTemp, boundaryType
BACKSPACE(10) BACKSPACE(10)
@ -167,7 +177,9 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
CASE("2DCyl") CASE (2)
SELECT CASE(self%geometry)
CASE("Cyl")
ALLOCATE(p(1:2)) ALLOCATE(p(1:2))
READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2) READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2)
@ -176,7 +188,7 @@ MODULE moduleMeshInputGmsh2
ALLOCATE(meshEdge2DCyl:: self%edges(e)%obj) ALLOCATE(meshEdge2DCyl:: self%edges(e)%obj)
CASE("2DCart") CASE("Cart")
ALLOCATE(p(1:2)) ALLOCATE(p(1:2))
READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2) READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2)
@ -185,7 +197,11 @@ MODULE moduleMeshInputGmsh2
ALLOCATE(meshEdge2DCart:: self%edges(e)%obj) ALLOCATE(meshEdge2DCart:: self%edges(e)%obj)
CASE("1DRad") END SELECT
CASE(1)
SELECT CASE(self%geometry)
CASE("Rad")
ALLOCATE(p(1:1)) ALLOCATE(p(1:1))
READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1) READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1)
@ -194,7 +210,7 @@ MODULE moduleMeshInputGmsh2
ALLOCATE(meshEdge1DRad:: self%edges(e)%obj) ALLOCATE(meshEdge1DRad:: self%edges(e)%obj)
CASE("1DCart") CASE("Cart")
ALLOCATE(p(1:1)) ALLOCATE(p(1:1))
READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1) READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1)
@ -205,6 +221,8 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
END SELECT
CALL self%edges(e)%obj%init(n, p, bt, boundaryType) CALL self%edges(e)%obj%init(n, p, bt, boundaryType)
DEALLOCATE(p) DEALLOCATE(p)
@ -215,8 +233,8 @@ MODULE moduleMeshInputGmsh2
!Read and initialize volumes !Read and initialize volumes
DO e = 1, self%numVols DO e = 1, self%numVols
!Reads the volume according to the geometry !Reads the volume according to the geometry
SELECT CASE(self%geometry) SELECT CASE(self%dimen)
CASE("3DCart") CASE(3)
READ(10, *) n, elemType READ(10, *) n, elemType
BACKSPACE(10) BACKSPACE(10)
@ -229,7 +247,9 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
CASE("2DCyl") CASE(2)
SELECT CASE(self%geometry)
CASE("Cyl")
READ(10,*) n, elemType READ(10,*) n, elemType
BACKSPACE(10) BACKSPACE(10)
@ -248,7 +268,7 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
CASE("2DCart") CASE("Cart")
READ(10,*) n, elemType READ(10,*) n, elemType
BACKSPACE(10) BACKSPACE(10)
@ -267,13 +287,17 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
CASE("1DRad") END SELECT
CASE(1)
SELECT CASE(self%geometry)
CASE("Rad")
ALLOCATE(p(1:2)) ALLOCATE(p(1:2))
READ(10, *) n, elemType, eTemp, eTemp, eTemp, p(1:2) READ(10, *) n, elemType, eTemp, eTemp, eTemp, p(1:2)
ALLOCATE(meshVol1DRadSegm:: self%vols(e)%obj) ALLOCATE(meshVol1DRadSegm:: self%vols(e)%obj)
CASE("1DCart") CASE("Cart")
ALLOCATE(p(1:2)) ALLOCATE(p(1:2))
READ(10, *) n, elemType, eTemp, eTemp, eTemp, p(1:2) READ(10, *) n, elemType, eTemp, eTemp, eTemp, p(1:2)
@ -281,6 +305,8 @@ MODULE moduleMeshInputGmsh2
END SELECT END SELECT
END SELECT
CALL self%vols(e)%obj%init(n - numEdges, p, self%nodes) CALL self%vols(e)%obj%init(n - numEdges, p, self%nodes)
DEALLOCATE(p) DEALLOCATE(p)
@ -288,6 +314,9 @@ MODULE moduleMeshInputGmsh2
CLOSE(10) CLOSE(10)
!Call mesh connectivity
CALL self%connectMesh
END SUBROUTINE readGmsh2 END SUBROUTINE readGmsh2
!Reads the initial information from an output file for an species !Reads the initial information from an output file for an species

View file

@ -98,6 +98,7 @@ MODULE moduleMeshOutputGmsh2
CLASS(meshGeneric), INTENT(inout):: self CLASS(meshGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
INTEGER:: numEdges INTEGER:: numEdges
INTEGER:: k, c
INTEGER:: n INTEGER:: n
REAL(8):: time REAL(8):: time
CHARACTER(:), ALLOCATABLE:: fileName CHARACTER(:), ALLOCATABLE:: fileName
@ -125,9 +126,11 @@ MODULE moduleMeshOutputGmsh2
WRITE(60, "(A)") '$MeshFormat' WRITE(60, "(A)") '$MeshFormat'
WRITE(60, "(A)") '2.2 0 8' WRITE(60, "(A)") '2.2 0 8'
WRITE(60, "(A)") '$EndMeshFormat' WRITE(60, "(A)") '$EndMeshFormat'
DO k = 1, nCollPairs
DO c = 1, interactionMatrix(k)%amount
WRITE(60, "(A)") '$ElementData' WRITE(60, "(A)") '$ElementData'
WRITE(60, "(A)") '1' WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"Collisions"' WRITE(60, "(5A,I2)") '"Pair ', interactionMatrix(k)%sp_i%name, '-', interactionMatrix(k)%sp_j%name, ' collision ', c
WRITE(60, *) 1 WRITE(60, *) 1
WRITE(60, *) time WRITE(60, *) time
WRITE(60, *) 3 WRITE(60, *) 3
@ -135,9 +138,11 @@ MODULE moduleMeshOutputGmsh2
WRITE(60, *) 1 WRITE(60, *) 1
WRITE(60, *) self%numVols WRITE(60, *) self%numVols
DO n=1, self%numVols DO n=1, self%numVols
WRITE(60, "(I6,I10)") n + numEdges, self%vols(n)%obj%nColl WRITE(60, "(I6,I10)") n + numEdges, self%vols(n)%obj%tallyColl(k)%tally(c)
END DO END DO
WRITE(60, "(A)") '$EndElementData' WRITE(60, "(A)") '$EndElementData'
END DO
END DO
CLOSE(60) CLOSE(60)
@ -200,6 +205,21 @@ MODULE moduleMeshOutputGmsh2
WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref
END DO END DO
WRITE(20, "(A)") '$EndElementData' WRITE(20, "(A)") '$EndElementData'
WRITE(20, "(A)") '$NodeData'
WRITE(20, "(A)") '1'
WRITE(20, "(A)") '"Magnetic Field (T)"'
WRITE(20, *) 1
WRITE(20, *) time
WRITE(20, *) 3
WRITE(20, *) t
WRITE(20, *) 3
WRITE(20, *) self%numNodes
DO n=1, self%numNodes
WRITE(20, *) n, self%nodes(n)%obj%emData%B * B_ref
END DO
WRITE(20, "(A)") '$EndNodeData'
CLOSE(20) CLOSE(20)
END IF END IF

View file

@ -3,6 +3,7 @@ MODULE moduleMesh
USE moduleList USE moduleList
USE moduleOutput USE moduleOutput
USE moduleBoundary USE moduleBoundary
USE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
!Generic mesh element !Generic mesh element
@ -148,17 +149,17 @@ MODULE moduleMesh
!Parent of Volume element !Parent of Volume element
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshElement):: meshVol TYPE, PUBLIC, ABSTRACT, EXTENDS(meshElement):: meshVol
!Maximum collision rate !Maximum collision rate
REAL(8):: sigmaVrelMax = 0.D0 REAL(8), ALLOCATABLE:: sigmaVrelMax(:)
!Arrays for counting number of collisions
TYPE(tallyCollisions), ALLOCATABLE:: tallyColl(:)
!Volume !Volume
REAL(8):: volume = 0.D0 REAL(8):: volume = 0.D0
!List of particles inside the volume !List of particles inside the volume
TYPE(listNode):: listPart_in TYPE(listNode), ALLOCATABLE:: listPart_in(:)
!Lock indicator for listPart_in !Lock indicator for listPart_in
INTEGER(KIND=OMP_LOCK_KIND):: lock INTEGER(KIND=OMP_LOCK_KIND):: lock
!Number of collisions per volume
INTEGER:: nColl = 0
!Total weight of particles inside cell !Total weight of particles inside cell
REAL(8):: totalWeight = 0.D0 REAL(8), ALLOCATABLE:: totalWeight(:)
CONTAINS CONTAINS
PROCEDURE(initVol_interface), DEFERRED, PASS:: init PROCEDURE(initVol_interface), DEFERRED, PASS:: init
PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes
@ -166,6 +167,7 @@ MODULE moduleMesh
PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi
PROCEDURE, PASS:: scatter PROCEDURE, PASS:: scatter
PROCEDURE(gatherEF_interface), DEFERRED, PASS:: gatherEF PROCEDURE(gatherEF_interface), DEFERRED, PASS:: gatherEF
PROCEDURE(gatherMF_interface), DEFERRED, PASS:: gatherMF
PROCEDURE(elemK_interface), DEFERRED, PASS:: elemK PROCEDURE(elemK_interface), DEFERRED, PASS:: elemK
PROCEDURE(elemF_interface), DEFERRED, PASS:: elemF PROCEDURE(elemF_interface), DEFERRED, PASS:: elemF
PROCEDURE, PASS:: findCell PROCEDURE, PASS:: findCell
@ -194,6 +196,14 @@ MODULE moduleMesh
END FUNCTION gatherEF_interface END FUNCTION gatherEF_interface
PURE FUNCTION gatherMF_interface(self, xi) RESULT(MF)
IMPORT:: meshVol
CLASS(meshVol), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: MF(1:3)
END FUNCTION gatherMF_interface
PURE FUNCTION getNodesVol_interface(self) RESULT(n) PURE FUNCTION getNodesVol_interface(self) RESULT(n)
IMPORT:: meshVol IMPORT:: meshVol
CLASS(meshVol), INTENT(in):: self CLASS(meshVol), INTENT(in):: self
@ -262,6 +272,8 @@ MODULE moduleMesh
!Generic mesh type !Generic mesh type
TYPE, ABSTRACT:: meshGeneric TYPE, ABSTRACT:: meshGeneric
!Dimension of the mesh
INTEGER:: dimen
!Geometry of the mesh !Geometry of the mesh
CHARACTER(:), ALLOCATABLE:: geometry CHARACTER(:), ALLOCATABLE:: geometry
!Number of elements !Number of elements
@ -505,6 +517,7 @@ MODULE moduleMesh
CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell
REAL(8):: xi(1:3) REAL(8):: xi(1:3)
CLASS(meshElement), POINTER:: nextElement CLASS(meshElement), POINTER:: nextElement
INTEGER:: sp
xi = self%phy2log(part%r) xi = self%phy2log(part%r)
!Checks if particle is inside 'self' cell !Checks if particle is inside 'self' cell
@ -514,8 +527,9 @@ MODULE moduleMesh
part%n_in = .TRUE. part%n_in = .TRUE.
!Assign particle to listPart_in !Assign particle to listPart_in
CALL OMP_SET_LOCK(self%lock) CALL OMP_SET_LOCK(self%lock)
CALL self%listPart_in%add(part) sp = part%species%n
self%totalWeight = self%totalWeight + part%weight CALL self%listPart_in(sp)%add(part)
self%totalWeight(sp) = self%totalWeight(sp) + part%weight
CALL OMP_UNSET_LOCK(self%lock) CALL OMP_UNSET_LOCK(self%lock)
ELSE ELSE
@ -575,6 +589,7 @@ MODULE moduleMesh
CLASS(meshVol), POINTER:: vol CLASS(meshVol), POINTER:: vol
REAL(8), DIMENSION(1:3):: xii REAL(8), DIMENSION(1:3):: xii
CLASS(meshElement), POINTER:: nextElement CLASS(meshElement), POINTER:: nextElement
INTEGER:: sp
found = .FALSE. found = .FALSE.
@ -584,8 +599,9 @@ MODULE moduleMesh
IF (vol%inside(xii)) THEN IF (vol%inside(xii)) THEN
part%volColl = vol%n part%volColl = vol%n
CALL OMP_SET_LOCK(vol%lock) CALL OMP_SET_LOCK(vol%lock)
CALL vol%listPart_in%add(part) sp = part%species%n
vol%totalWeight = vol%totalWeight + part%weight CALL vol%listPart_in(sp)%add(part)
vol%totalWeight(sp) = vol%totalWeight(sp) + part%weight
CALL OMP_UNSET_LOCK(vol%lock) CALL OMP_UNSET_LOCK(vol%lock)
found = .TRUE. found = .TRUE.
@ -643,61 +659,133 @@ MODULE moduleMesh
USE moduleList USE moduleList
use moduleRefParam use moduleRefParam
USE moduleRandom USE moduleRandom
USE moduleOutput
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(meshGeneric), INTENT(inout), TARGET:: self CLASS(meshGeneric), INTENT(inout), TARGET:: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
INTEGER:: e INTEGER:: e
CLASS(meshVol), POINTER:: vol CLASS(meshVol), POINTER:: vol
INTEGER:: nPart !Number of particles inside the cell INTEGER:: k, i, j
INTEGER:: nPart_i, nPart_j, nPart!Number of particles inside the cell
REAL(8):: pMax !Maximum probability of collision REAL(8):: pMax !Maximum probability of collision
INTEGER:: rnd !random index INTEGER:: nColl
TYPE(pointerArray), ALLOCATABLE:: partTemp_i(:), partTemp_j(:)
TYPE(particle), POINTER:: part_i, part_j TYPE(particle), POINTER:: part_i, part_j
INTEGER:: n !collision INTEGER:: n, c
INTEGER:: ij, k REAL(8):: vRel, rMass, eRel
REAL(8):: sigmaVrelMaxNew REAL(8):: sigmaVrelTotal
TYPE(pointerArray), ALLOCATABLE:: partTemp(:) REAL(8), ALLOCATABLE:: sigmaVrel(:), probabilityColl(:)
REAL(8):: rnd !Random number for collision
IF (MOD(t, everyColl) == 0) THEN IF (MOD(t, everyColl) == 0) THEN
!Collisions need to be performed in this iteration !Collisions need to be performed in this iteration
!$OMP DO SCHEDULE(DYNAMIC) !$OMP DO SCHEDULE(DYNAMIC) PRIVATE(part_i, part_j, partTemp_i, partTemp_j)
DO e=1, self%numVols DO e=1, self%numVols
vol => self%vols(e)%obj vol => self%vols(e)%obj
nPart = vol%listPart_in%amount
!Resets the number of collisions !TODO: Simplify this, to many sublevels
vol%nColl = 0 !Iterate over the number of pairs
DO k = 1, nCollPairs
!Reset tally of collisions
IF (collOutput) THEN
vol%tallyColl(k)%tally = 0
!Calculates number of collisions if there is more than one particle in the cell END IF
IF (nPart > 1) THEN
!Probability of collision IF (interactionMatrix(k)%amount > 0) THEN
pMax = vol%totalWeight*vol%sigmaVrelMax*tauColl/vol%volume !Select the species for the collision pair
i = interactionMatrix(k)%sp_i%n
j = interactionMatrix(k)%sp_j%n
!Number of particles per species in the collision pair
nPart_i = vol%listPart_in(i)%amount
nPart_j = vol%listPart_in(j)%amount
IF (nPart_i > 0 .AND. nPart_j > 0) THEN
!Total number of particles for the collision pair
nPart = nPart_i + nPart_j
!Resets the number of collisions in the cell
nColl = 0
!Probability of collision for pair i-j
pMax = (vol%totalWeight(i) + vol%totalWeight(j))*vol%sigmaVrelMax(k)*tauColl/vol%volume
!Number of collisions in the cell !Number of collisions in the cell
vol%nColl = NINT(REAL(nPart)*pMax*0.5D0) nColl = NINT(REAL(nPart)*pMax*0.5D0)
IF (vol%nColl > 0) THEN
!Converts the list of particles to an array for easy access !Converts the list of particles to an array for easy access
partTemp = vol%listPart_in%convert2Array() IF (nColl > 0) THEN
partTemp_i = vol%listPart_in(i)%convert2Array()
partTemp_j = vol%listPart_in(j)%convert2Array()
END IF END IF
DO n = 1, vol%nColl DO n = 1, nColl
!Select random numbers !Select random particles
rnd = random(1, nPart) part_i => NULL()
part_i => partTemp(rnd)%part part_j => NULL()
rnd = random(1, nPart) rnd = random(1, nPart_i)
part_j => partTemp(rnd)%part part_i => partTemp_i(rnd)%part
ij = interactionIndex(part_i%species%n, part_j%species%n) rnd = random(1, nPart_j)
sigmaVrelMaxNew = 0.D0 part_j => partTemp_j(rnd)%part
DO k = 1, interactionMatrix(ij)%amount !If they are the same particle, skip
CALL interactionMatrix(ij)%collisions(k)%obj%collide(vol%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j) !TODO: Maybe try to improve this
IF (ASSOCIATED(part_i, part_j)) THEN
CYCLE
END IF
!If particles do not belong to the species, skip collision
!This can happen, for example, if particle has been previously ionized or removed
!TODO: Try to find a way to no lose these collisions. Maybe check new 'k' and use that for the collision, maybe?
IF (part_i%species%n /= i .OR. &
part_j%species%n /= j) THEN
CYCLE
END IF
!Obtain the cross sections for the different processes
!TODO: From here it might be a procedure in interactionMatrix
vRel = NORM2(part_i%v-part_j%v)
rMass = reducedMass(part_i%weight*part_i%species%m, part_j%weight*part_j%species%m)
eRel = rMass*vRel**2
CALL interactionMatrix(k)%getSigmaVrel(vRel, eRel, sigmaVrelTotal, sigmaVrel)
!Update maximum sigma*v_rel
IF (sigmaVrelTotal > vol%sigmaVrelMax(k)) THEN
vol%sigmaVrelMax(k) = sigmaVrelTotal
END IF
ALLOCATE(probabilityColl(0:interactionMatrix(k)%amount))
probabilityColl = 0.0
DO c = 1, interactionMatrix(k)%amount
probabilityColl(c) = sigmaVrel(c)/vol%sigmaVrelMax(k) + SUM(probabilityColl(0:c-1))
END DO END DO
!Update maximum cross section*v_rel per each collision !Selects random number between 0 and 1
IF (sigmaVrelMaxNew > vol%sigmaVrelMax) THEN rnd = random()
vol%sigmaVrelMax = sigmaVrelMaxNew
!If the random number is below the total probability of collision, collide particles
IF (rnd < sigmaVrelTotal / vol%sigmaVrelMax(k)) THEN
!Loop over collisions
DO c = 1, interactionMatrix(k)%amount
IF (rnd <= probabilityColl(c)) THEN
CALL interactionMatrix(k)%collisions(c)%obj%collide(part_i, part_j, vRel)
!If collisions are gonna be output, count the collision
IF (collOutput) THEN
vol%tallyColl(k)%tally(c) = vol%tallyColl(k)%tally(c) + 1
END IF
!A collision has ocurred, exit the loop
EXIT
END IF END IF
@ -705,6 +793,20 @@ MODULE moduleMesh
END IF END IF
!Deallocate arrays for next collision
DEALLOCATE(sigmaVrel, probabilityColl)
!End loop collisions in cell
END DO
END IF
END IF
!End loop collision pairs
END DO
!End loop volumes
END DO END DO
!$OMP END DO !$OMP END DO

View file

@ -110,31 +110,34 @@ MODULE moduleMeshBoundary
USE moduleMesh USE moduleMesh
USE moduleRefParam USE moduleRefParam
USE moduleRandom USE moduleRandom
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part CLASS(particle), INTENT(inout):: part
REAL(8):: vRel, eRel, mRel !relative velocity, energy and mass REAL(8):: vRel, eRel, mRel !relative velocity, energy and mass
REAL(8):: ionizationRate INTEGER:: nIonizations !Number of ionizations based on eRel
INTEGER:: ionizationPair, p REAL(8):: pIonization !Probability of ionization of each event
INTEGER:: p
REAL(8):: v0(1:3) !random velocity of neutral REAL(8):: v0(1:3) !random velocity of neutral
TYPE(particle), POINTER:: newElectron TYPE(particle), POINTER:: newElectron
TYPE(particle), POINTER:: newIon TYPE(particle), POINTER:: newIon
SELECT TYPE(bound => edge%boundary%bTypes(part%species%n)%obj) SELECT TYPE(bound => edge%boundary%bTypes(part%species%n)%obj)
TYPE IS(boundaryIonization) TYPE IS(boundaryIonization)
mRel = (bound%m0*part%species%m)*(bound%m0+part%species%m) mRel = reducedMass(bound%m0, part%species%m)
vRel = SUM(DABS(part%v-bound%v0)) vRel = SUM(DABS(part%v-bound%v0))
eRel = mRel*vRel**2*5.D-1 eRel = mRel*vRel**2*5.D-1
IF (eRel > bound%eThreshold) THEN !Maximum number of possible ionizations based on relative energy
ionizationRate = part%weight*bound%n0*bound%crossSection%get(eRel)*vRel nIonizations = FLOOR(eRel/bound%eThreshold)
!Rounds the number of particles up DO p = 1, nIonizations
ionizationPair = NINT(ionizationRate*bound%effectiveTime/bound%species%weight) !Get probability of ionization
pIonization = 1.D0 - DEXP(-bound%n0*bound%crossSection%get(eRel)*vRel*bound%effectiveTime/REAL(nIonizations))
!Create the new pair of particles !If a random number is below the probability of ionization, create new pair of ion-electron
DO p = 1, ionizationPair IF (random() < pIonization) THEN
!Assign random velocity to the neutral !Assign random velocity to the neutral
v0(1) = bound%v0(1) + bound%vTh*randomMaxwellian() v0(1) = bound%v0(1) + bound%vTh*randomMaxwellian()
v0(2) = bound%v0(2) + bound%vTh*randomMaxwellian() v0(2) = bound%v0(2) + bound%vTh*randomMaxwellian()
@ -159,14 +162,7 @@ MODULE moduleMeshBoundary
newElectron%xi = mesh%vols(part%vol)%obj%phy2log(newElectron%r) newElectron%xi = mesh%vols(part%vol)%obj%phy2log(newElectron%r)
newIon%xi = newElectron%xi newIon%xi = newElectron%xi
newElectron%qm = part%qm newElectron%weight = part%weight
SELECT TYPE(spe => bound%species)
TYPE IS(speciesCharged)
newIon%qm = spe%qm
END SELECT
newElectron%weight = bound%species%weight
newIon%weight = newElectron%weight newIon%weight = newElectron%weight
newElectron%n_in = .TRUE. newElectron%n_in = .TRUE.
@ -178,10 +174,14 @@ MODULE moduleMeshBoundary
CALL partSurfaces%add(newIon) CALL partSurfaces%add(newIon)
CALL OMP_UNSET_LOCK(lockSurfaces) CALL OMP_UNSET_LOCK(lockSurfaces)
END DO !Electron loses energy due to ionization
eRel = eRel - bound%eThreshold
vRel = 2.D0*DSQRT(eRel)/mRel
END IF END IF
END DO
END SELECT END SELECT
!Removes ionizing electron regardless the number of pair created !Removes ionizing electron regardless the number of pair created

View file

@ -7,8 +7,6 @@ MODULE moduleCollisions
!Abstract type for collision between two particles !Abstract type for collision between two particles
TYPE, ABSTRACT:: collisionBinary TYPE, ABSTRACT:: collisionBinary
REAL(8):: rMass !Reduced mass
REAL(8):: sMassInv !Summed mass
TYPE(table1D):: crossSec !cross section of collision TYPE(table1D):: crossSec !cross section of collision
CONTAINS CONTAINS
PROCEDURE(collideBinary_interface), PASS, DEFERRED:: collide PROCEDURE(collideBinary_interface), PASS, DEFERRED:: collide
@ -16,14 +14,13 @@ MODULE moduleCollisions
END TYPE collisionBinary END TYPE collisionBinary
ABSTRACT INTERFACE ABSTRACT INTERFACE
SUBROUTINE collideBinary_interface(self, sigmaVRelMax, sigmaVrelMaxNew, part_i, part_j) SUBROUTINE collideBinary_interface(self, part_i, part_j, vRel)
USE moduleSpecies USE moduleSpecies
IMPORT:: collisionBinary IMPORT:: collisionBinary
CLASS(collisionBinary), INTENT(in):: self CLASS(collisionBinary), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
REAL(8), INTENT(in):: vRel
END SUBROUTINE END SUBROUTINE
@ -70,13 +67,24 @@ MODULE moduleCollisions
!Type for interaction matrix !Type for interaction matrix
TYPE:: interactionsBinary TYPE:: interactionsBinary
CLASS(speciesGeneric), POINTER:: sp_i
CLASS(speciesGeneric), POINTER:: sp_j
INTEGER:: amount INTEGER:: amount
TYPE(collisionCont), ALLOCATABLE:: collisions(:) TYPE(collisionCont), ALLOCATABLE:: collisions(:)
CONTAINS CONTAINS
PROCEDURE, PASS:: init => initInteractionBinary PROCEDURE, PASS:: init => initInteractionBinary
PROCEDURE, PASS:: getSigmaVrel => getSigmaVrelBinary
END TYPE interactionsBinary END TYPE interactionsBinary
!Type to count number of collisions
TYPE:: tallyCollisions
INTEGER, ALLOCATABLE:: tally(:)
END TYPE
!Number of collision pairs (nSpecies*(nSpecies+1)/2)
INTEGER:: nCollPairs = 0
!Collision 'Matrix'. A symmetric 2D matrix put into a 1D array to save memory !Collision 'Matrix'. A symmetric 2D matrix put into a 1D array to save memory
TYPE(interactionsBinary), ALLOCATABLE, TARGET:: interactionMatrix(:) TYPE(interactionsBinary), ALLOCATABLE, TARGET:: interactionMatrix(:)
!Folder for collision cross section tables !Folder for collision cross section tables
@ -85,13 +93,14 @@ MODULE moduleCollisions
CONTAINS CONTAINS
!Velocity of center of mass of two particles !Velocity of center of mass of two particles
PURE FUNCTION velocityCM(m_i, v_i, m_j, v_j) RESULT(vCM) PURE FUNCTION velocityCM(m_i, v_i, m_j, v_j) RESULT(vCM)
IMPLICIT NONE IMPLICIT NONE
REAL(8), INTENT(in):: m_i, m_j REAL(8), INTENT(in):: m_i, m_j
REAL(8), INTENT(in), DIMENSION(1:3):: v_i, v_j REAL(8), INTENT(in), DIMENSION(1:3):: v_i, v_j
REAL(8):: vCM(1:3) REAL(8):: vCM(1:3)
vCM = (m_i*v_i + m_j*v_j)/(m_i + m_j) vCM = (m_i*v_i + m_j*v_j) / (m_i + m_j)
END FUNCTION velocityCM END FUNCTION velocityCM
@ -118,10 +127,11 @@ MODULE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
TYPE(interactionsBinary), INTENT(inout), ALLOCATABLE:: interactionMatrix(:) TYPE(interactionsBinary), INTENT(inout), ALLOCATABLE:: interactionMatrix(:)
INTEGER:: nInteractions
nInteractions = (nSpecies*(nSpecies+1))/2 nCollPairs = (nSpecies*(nSpecies+1))/2
ALLOCATE(interactionMatrix(1:nInteractions)) ALLOCATE(interactionMatrix(1:nCollPairs))
interactionMatrix(:)%amount = 0
END SUBROUTINE initInteractionMatrix END SUBROUTINE initInteractionMatrix
@ -139,21 +149,52 @@ MODULE moduleCollisions
END FUNCTION interactionIndex END FUNCTION interactionIndex
!Inits the binary interaction !Inits the binary interaction
SUBROUTINE initInteractionBinary(self, amount) SUBROUTINE initInteractionBinary(self, amount, i, j)
USE moduleMath
USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
CLASS(interactionsBinary), INTENT(inout):: self CLASS(interactionsBinary), INTENT(inout):: self
INTEGER, INTENT(in):: amount INTEGER, INTENT(in):: amount
INTEGER, INTENT(in):: i, j
REAL(8):: mass_i, mass_j
self%sp_i => species(i)%obj
self%sp_j => species(j)%obj
self%amount = amount self%amount = amount
mass_i = species(i)%obj%m
mass_j = species(j)%obj%m
ALLOCATE(self%collisions(1:self%amount)) ALLOCATE(self%collisions(1:self%amount))
END SUBROUTINE initInteractionBinary END SUBROUTINE initInteractionBinary
SUBROUTINE getSigmaVrelBinary (self, vRel, eRel, sigmaVrelTotal, sigmaVrel)
IMPLICIT NONE
CLASS(interactionsBinary), INTENT(in):: self
REAL(8), INTENT(in):: vRel, eRel
REAL(8), INTENT(out):: sigmaVrelTotal
REAL(8), INTENT(out), ALLOCATABLE:: sigmaVrel(:)
INTEGER:: c
sigmaVrelTotal = 0.D0
ALLOCATE(sigmaVrel(1:self%amount))
DO c = 1, self%amount
sigmaVrel(c) = self%collisions(c)%obj%crossSec%get(eRel)*vRel
END DO
sigmaVrelTotal = SUM(sigmaVrel)
END SUBROUTINE getSigmaVrelBinary
!ELASTIC COLLISIONS !ELASTIC COLLISIONS
!Inits binary elastic collision !Inits binary elastic collision
SUBROUTINE initBinaryElastic(collision, crossSectionFilename, mass_i, mass_j) SUBROUTINE initBinaryElastic(collision, crossSectionFilename)
USE moduleTable USE moduleTable
USE moduleRefParam USE moduleRefParam
USE moduleConstParam USE moduleConstParam
@ -161,7 +202,6 @@ MODULE moduleCollisions
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: mass_i, mass_j
ALLOCATE(collisionBinaryElastic:: collision) ALLOCATE(collisionBinaryElastic:: collision)
@ -171,15 +211,10 @@ MODULE moduleCollisions
!Convert to no-dimensional units !Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2) CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
END SUBROUTINE initBinaryElastic END SUBROUTINE initBinaryElastic
!Binary elastic process !Binary elastic process
SUBROUTINE collideBinaryElastic(self, sigmaVrelMax, sigmaVrelMaxNew, & SUBROUTINE collideBinaryElastic(self, part_i, part_j, vRel)
part_i, part_j)
USE moduleSpecies USE moduleSpecies
USE moduleConstParam USE moduleConstParam
USE moduleRandom USE moduleRandom
@ -187,38 +222,26 @@ MODULE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
CLASS(collisionBinaryElastic), INTENT(in):: self CLASS(collisionBinaryElastic), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
REAL(8):: sigmaVrel REAL(8), INTENT(in):: vRel
REAL(8):: vRel !relative velocity
REAL(8):: eRel !relative energy
REAL(8):: m_i, m_j REAL(8):: m_i, m_j
REAL(8), DIMENSION(1:3):: vCM REAL(8), DIMENSION(1:3):: vCM, vp
REAL(8):: vp(1:3)
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
m_i = part_i%species%m m_i = part_i%species%m
m_j = part_j%species%m m_j = part_j%species%m
!Applies the collision !Applies the collision
vCM = velocityCM(m_i, part_i%v, m_j, part_j%v) vCM = velocityCM(part_i%weight*m_i, part_i%v, part_j%weight*m_j, part_j%v)
vp = vRel*randomDirectionVHS() vp = vRel*randomDirectionVHS()
!Assign velocities to particles !Assign velocities to particles
part_i%v = vCM + m_j*vp*self%sMassInv part_i%v = vCM + m_j*vp / (m_i + m_j)
part_j%v = vCM - m_i*vp*self%sMassInv part_j%v = vCM - m_i*vp / (m_i + m_j)
END IF
END SUBROUTINE collideBinaryElastic END SUBROUTINE collideBinaryElastic
!ELECTRON IMPACT IONIZATION !ELECTRON IMPACT IONIZATION
!Inits electron impact ionization !Inits electron impact ionization
SUBROUTINE initBinaryIonization(collision, crossSectionFilename, energyThreshold, mass_i, mass_j, electron) SUBROUTINE initBinaryIonization(collision, crossSectionFilename, energyThreshold, electron)
USE moduleTable USE moduleTable
USE moduleRefParam USE moduleRefParam
USE moduleConstParam USE moduleConstParam
@ -229,7 +252,6 @@ MODULE moduleCollisions
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: energyThreshold REAL(8), INTENT(in):: energyThreshold
REAL(8), INTENT(in):: mass_i, mass_j
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
INTEGER:: electronIndex INTEGER:: electronIndex
@ -241,10 +263,6 @@ MODULE moduleCollisions
!Convert to no-dimensional units !Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2) CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
!Specific parameters for ionization collision !Specific parameters for ionization collision
SELECT TYPE(collision) SELECT TYPE(collision)
TYPE IS(collisionBinaryIonization) TYPE IS(collisionBinaryIonization)
@ -252,23 +270,27 @@ MODULE moduleCollisions
!Input energy is in eV. Convert to J with ev2J and then to !Input energy is in eV. Convert to J with ev2J and then to
!non-dimensional units. !non-dimensional units.
collision%eThreshold = energyThreshold*eV2J/(m_ref*v_ref**2) collision%eThreshold = energyThreshold*eV2J/(m_ref*v_ref**2)
!species for impacting electron
electronIndex = speciesName2Index(electron) electronIndex = speciesName2Index(electron)
SELECT TYPE(sp => species(electronIndex)%obj) SELECT TYPE(sp => species(electronIndex)%obj)
TYPE IS(speciesCharged) TYPE IS(speciesCharged)
collision%electron => sp collision%electron => sp
CLASS DEFAULT CLASS DEFAULT
CALL criticalError("Species " // sp%name // " chosen for ionization is not a charged species", 'initBinaryIonization') CALL criticalError("Species " // sp%name // " chosen for " // &
"secondary electron is not a charged species", 'initBinaryIonization')
END SELECT END SELECT
!momentum change per ionization process
collision%deltaV = sqrt(collision%eThreshold / collision%electron%m)
END SELECT END SELECT
END SUBROUTINE initBinaryIonization END SUBROUTINE initBinaryIonization
!Binary electron impact ionization process !Binary electron impact ionization process
SUBROUTINE collideBinaryIonization(self, sigmaVrelMax, sigmaVrelMaxNew, & SUBROUTINE collideBinaryIonization(self, part_i, part_j, vRel)
part_i, part_j)
USE moduleSpecies USE moduleSpecies
USE moduleErrors USE moduleErrors
USE moduleList USE moduleList
@ -278,24 +300,17 @@ MODULE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
CLASS(collisionBinaryIonization), INTENT(in):: self CLASS(collisionBinaryIonization), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
REAL(8), INTENT(in):: vRel
REAL(8):: rMass, eRel
TYPE(particle), POINTER:: electron => NULL(), neutral => NULL() TYPE(particle), POINTER:: electron => NULL(), neutral => NULL()
REAL(8), DIMENSION(1:3):: vChange
TYPE(particle), POINTER:: newElectron TYPE(particle), POINTER:: newElectron
REAL(8):: vRel, eRel
REAL(8):: sigmaVrel
REAL(8), DIMENSION(1:3):: vp_e, vp_n
!eRel (in units of [m][L]^2[t]^-2 rMass = reducedMass(part_i%weight*part_i%species%m, part_j%weight*part_j%species%m)
vRel = NORM2(part_i%v-part_j%v) eRel = rMass*vRel**2
eRel = self%rMass*vRel**2
!Relative energy must be higher than threshold !Relative energy must be higher than threshold
IF (eRel > self%eThreshold) THEN IF (eRel > self%eThreshold) THEN
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
!Find which particle is the ionizing electron
IF (ASSOCIATED(part_i%species, self%electron)) THEN IF (ASSOCIATED(part_i%species, self%electron)) THEN
electron => part_i electron => part_i
neutral => part_j neutral => part_j
@ -309,35 +324,35 @@ MODULE moduleCollisions
END IF END IF
!Exchange energy between
vp_e = electron%v*(1.D0 - self%deltaV/NORM2(electron%v))
vp_n = neutral%v* (1.D0 + self%deltaV/NORM2(neutral%v) )
!Changes velocity of impacting electron
electron%v = vp_e
!Creates a new electron from ionization
ALLOCATE(newElectron)
newElectron%species => electron%species
newElectron%v = vp_n
newElectron%r = neutral%r
newElectron%xi = neutral%xi
newElectron%n_in = .TRUE.
newElectron%vol = neutral%vol
newElectron%volColl = neutral%volColl
newElectron%weight = neutral%weight
newElectron%qm = electron%qm
!Ionize neutral particle !Ionize neutral particle
SELECT TYPE(sp => neutral%species) SELECT TYPE(sp => neutral%species)
TYPE IS(speciesNeutral) TYPE IS(speciesNeutral)
CALL sp%ionize(neutral) CALL sp%ionize(neutral)
CLASS DEFAULT CLASS DEFAULT
CALL criticalError(sp%name // " is not a neutral", 'collideBinaryIonization') ! CALL criticalError(sp%name // " is not a neutral", 'collideBinaryIonization')
RETURN
END SELECT END SELECT
!Exchange of velocity between particles
vChange = self%deltaV*randomDirectionVHS()
!Energy is loss by the primary electron
electron%v = electron%v - vChange
!Creates a new electron from ionization
ALLOCATE(newElectron)
newElectron%species => electron%species
!Secondary electorn gains energy from ionization
newElectron%v = vChange
newElectron%r = neutral%r
newElectron%xi = neutral%xi
newElectron%n_in = .TRUE.
newElectron%vol = neutral%vol
newElectron%volColl = neutral%volColl
newElectron%weight = neutral%weight
!Adds new electron to list of new particles from collisions !Adds new electron to list of new particles from collisions
CALL OMP_SET_LOCK(lockCollisions) CALL OMP_SET_LOCK(lockCollisions)
CALL partCollisions%add(newElectron) CALL partCollisions%add(newElectron)
@ -345,13 +360,11 @@ MODULE moduleCollisions
END IF END IF
END IF
END SUBROUTINE collideBinaryIonization END SUBROUTINE collideBinaryIonization
!ELECTRON ION RESONANT RECOMBINATION !ELECTRON ION RESONANT RECOMBINATION
!Inits electron ion recombination !Inits electron ion recombination
SUBROUTINE initBinaryRecombination(collision, crossSectionFilename, energyBinding, mass_i, mass_j, electron) SUBROUTINE initBinaryRecombination(collision, crossSectionFilename, energyBinding, electron)
USE moduleTable USE moduleTable
USE moduleRefParam USE moduleRefParam
USE moduleConstParam USE moduleConstParam
@ -362,7 +375,6 @@ MODULE moduleCollisions
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: energyBinding REAL(8), INTENT(in):: energyBinding
REAL(8), INTENT(in):: mass_i, mass_j
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
INTEGER:: electronIndex INTEGER:: electronIndex
@ -374,10 +386,6 @@ MODULE moduleCollisions
!Convert to no-dimensional units !Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2) CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
!Specific parameters for ionization collision !Specific parameters for ionization collision
SELECT TYPE(collision) SELECT TYPE(collision)
TYPE IS(collisionBinaryRecombination) TYPE IS(collisionBinaryRecombination)
@ -399,9 +407,8 @@ MODULE moduleCollisions
END SUBROUTINE initBinaryRecombination END SUBROUTINE initBinaryRecombination
!Binary electron impact ionization process !Binary recombination
SUBROUTINE collideBinaryRecombination(self, sigmaVrelMax, sigmaVrelMaxNew, & SUBROUTINE collideBinaryRecombination(self, part_i, part_j, vRel)
part_i, part_j)
USE moduleSpecies USE moduleSpecies
USE moduleErrors USE moduleErrors
USE moduleList USE moduleList
@ -410,22 +417,12 @@ MODULE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
CLASS(collisionBinaryRecombination), INTENT(in):: self CLASS(collisionBinaryRecombination), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax REAL(8), INTENT(in):: vRel
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
TYPE(particle), POINTER:: electron => NULL(), ion => NULL() TYPE(particle), POINTER:: electron => NULL(), ion => NULL()
REAL(8):: vRel, eRel
REAL(8):: sigmaVrel REAL(8):: sigmaVrel
REAL(8), DIMENSION(1:3):: vp_i REAL(8), DIMENSION(1:3):: vp_i
!eRel (in units of [m][L]^2[t]^-2
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
!Relative energy must be higher than threshold
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
!Find which particle is the ionizing electron
IF (ASSOCIATED(part_i%species, self%electron)) THEN IF (ASSOCIATED(part_i%species, self%electron)) THEN
electron => part_i electron => part_i
ion => part_j ion => part_j
@ -456,13 +453,11 @@ MODULE moduleCollisions
END SELECT END SELECT
END IF
END SUBROUTINE collideBinaryRecombination END SUBROUTINE collideBinaryRecombination
!RESONANT CHARGE EXCHANGE !RESONANT CHARGE EXCHANGE
!Inits resonant charge exchange !Inits resonant charge exchange
SUBROUTINE initBinaryChargeExchange(collision, crossSectionFilename, mass_i, mass_j) SUBROUTINE initBinaryChargeExchange(collision, crossSectionFilename)
USE moduleTable USE moduleTable
USE moduleRefParam USE moduleRefParam
USE moduleConstParam USE moduleConstParam
@ -470,7 +465,6 @@ MODULE moduleCollisions
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: mass_i, mass_j
ALLOCATE(collisionBinaryChargeExchange:: collision) ALLOCATE(collisionBinaryChargeExchange:: collision)
@ -480,33 +474,18 @@ MODULE moduleCollisions
!Convert to no-dimensional units !Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2) CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)/collision%sMassInv
END SUBROUTINE initBinaryChargeExchange END SUBROUTINE initBinaryChargeExchange
SUBROUTINE collideBinaryChargeExchange(self, sigmaVrelMax, sigmaVrelMaxNew, & SUBROUTINE collideBinaryChargeExchange(self, part_i, part_j, vRel)
part_i, part_j)
USE moduleSpecies USE moduleSpecies
USE moduleRandom USE moduleRandom
USE moduleMath USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(collisionBinaryChargeExchange), INTENT(in):: self CLASS(collisionBinaryChargeExchange), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax REAL(8), INTENT(in):: vRel
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
REAL(8):: sigmaVrel
REAL(8):: vRel !relative velocity
REAL(8):: eRel !relative energy
!eRel (in units of [m][L]^2[t]^-2
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
SELECT TYPE(sp => part_i%species) SELECT TYPE(sp => part_i%species)
TYPE IS (speciesNeutral) TYPE IS (speciesNeutral)
!Species i is neutral, ionize particle i !Species i is neutral, ionize particle i
@ -529,8 +508,6 @@ MODULE moduleCollisions
END SELECT END SELECT
END IF
END SUBROUTINE collideBinaryChargeExchange END SUBROUTINE collideBinaryChargeExchange
END MODULE moduleCollisions END MODULE moduleCollisions

View file

@ -62,6 +62,23 @@ MODULE moduleEM
END FUNCTION gatherElecField END FUNCTION gatherElecField
PURE FUNCTION gatherMagnField(part) RESULT(BField)
USE moduleSpecies
USE moduleMesh
IMPLICIT NONE
TYPE(particle), INTENT(in):: part
REAl(8):: xi(1:3) !Logical coordinates of particle in element
REAL(8):: BField(1:3)
BField = 0.D0
xi = part%xi
BField = mesh%vols(part%vol)%obj%gatherMF(xi)
END FUNCTION gatherMagnField
SUBROUTINE assembleSourceVector(vectorF) SUBROUTINE assembleSourceVector(vectorF)
USE moduleMesh USE moduleMesh
USE moduleRefParam USE moduleRefParam

View file

@ -82,6 +82,7 @@ MODULE moduleInject
INTEGER, INTENT(in):: i INTEGER, INTENT(in):: i
REAL(8), INTENT(in):: v, n(1:3), T(1:3) REAL(8), INTENT(in):: v, n(1:3), T(1:3)
INTEGER, INTENT(in):: sp, physicalSurface INTEGER, INTENT(in):: sp, physicalSurface
REAL(8):: tauInject
REAL(8), INTENT(in):: flow REAL(8), INTENT(in):: flow
CHARACTER(:), ALLOCATABLE, INTENT(in):: units CHARACTER(:), ALLOCATABLE, INTENT(in):: units
INTEGER:: e, et INTEGER:: e, et
@ -93,18 +94,19 @@ MODULE moduleInject
self%n = n / NORM2(n) self%n = n / NORM2(n)
self%T = T / T_ref self%T = T / T_ref
self%species => species(sp)%obj self%species => species(sp)%obj
tauInject = tau(self%species%n)
SELECT CASE(units) SELECT CASE(units)
CASE ("sccm") CASE ("sccm")
!Standard cubic centimeter per minute !Standard cubic centimeter per minute
self%nParticles = INT(flow*sccm2atomPerS*tauMin*ti_ref/species(sp)%obj%weight) self%nParticles = INT(flow*sccm2atomPerS*tauInject*ti_ref/species(sp)%obj%weight)
CASE ("A") CASE ("A")
!Input current in Ampers !Input current in Ampers
self%nParticles = INT(flow*tauMin*ti_ref/(qe*species(sp)%obj%weight)) self%nParticles = INT(flow*tauInject*ti_ref/(qe*species(sp)%obj%weight))
CASE ("part/s") CASE ("part/s")
!Input current in Ampers !Input current in Ampers
self%nParticles = INT(flow*tauMin*ti_ref/species(sp)%obj%weight) self%nParticles = INT(flow*tauInject*ti_ref/species(sp)%obj%weight)
CASE DEFAULT CASE DEFAULT
CALL criticalError("No support for units: " // units, 'initInject') CALL criticalError("No support for units: " // units, 'initInject')
@ -154,6 +156,7 @@ MODULE moduleInject
!Calculates cumulative probability !Calculates cumulative probability
ALLOCATE(self%cumWeight(1:self%nEdges)) ALLOCATE(self%cumWeight(1:self%nEdges))
et = 1
self%cumWeight(1) = mesh%edges(self%edges(et))%obj%weight self%cumWeight(1) = mesh%edges(self%edges(et))%obj%weight
DO et = 2, self%nEdges DO et = 2, self%nEdges
self%cumWeight(et) = mesh%edges(self%edges(et))%obj%weight + self%cumWeight(et-1) self%cumWeight(et) = mesh%edges(self%edges(et))%obj%weight + self%cumWeight(et-1)
@ -161,8 +164,6 @@ MODULE moduleInject
END DO END DO
self%sumWeight = self%cumWeight(self%nEdges) self%sumWeight = self%cumWeight(self%nEdges)
nPartInj = nPartInj + self%nParticles
END SUBROUTINE initInject END SUBROUTINE initInject
!Injection of particles !Injection of particles
@ -174,12 +175,24 @@ MODULE moduleInject
INTEGER:: i INTEGER:: i
!$OMP SINGLE !$OMP SINGLE
nPartInj = 0
DO i = 1, nInject
IF (solver%pusher(inject(i)%species%n)%pushSpecies) THEN
nPartInj = nPartInj + inject(i)%nParticles
END IF
END DO
IF (ALLOCATED(partInj)) DEALLOCATE(partInj) IF (ALLOCATED(partInj)) DEALLOCATE(partInj)
ALLOCATE(partInj(1:nPartInj)) ALLOCATE(partInj(1:nPartInj))
!$OMP END SINGLE !$OMP END SINGLE
DO i=1, nInject DO i=1, nInject
IF (solver%pusher(inject(i)%species%n)%pushSpecies) THEN
CALL inject(i)%addParticles() CALL inject(i)%addParticles()
END IF
END DO END DO
END SUBROUTINE doInjects END SUBROUTINE doInjects
@ -240,23 +253,27 @@ MODULE moduleInject
CLASS(injectGeneric), INTENT(in):: self CLASS(injectGeneric), INTENT(in):: self
INTEGER:: randomX INTEGER:: randomX
INTEGER, SAVE:: nMin, nMax !Min and Max index in partInj array INTEGER, SAVE:: nMin, nMax !Min and Max index in partInj array
INTEGER:: n INTEGER:: i
INTEGER:: n, sp
CLASS(meshEdge), POINTER:: randomEdge CLASS(meshEdge), POINTER:: randomEdge
!Insert particles !Insert particles
!$OMP SINGLE !$OMP SINGLE
nMin = SUM(inject(1:(self%id-1))%nParticles) + 1 nMin = 0
DO i = 1, self%id -1
IF (solver%pusher(inject(i)%species%n)%pushSpecies) THEN
nMin = nMin + inject(i)%nParticles
END IF
END DO
nMin = nMin + 1
nMax = nMin + self%nParticles - 1 nMax = nMin + self%nParticles - 1
!Assign weight to particle. !Assign weight to particle.
partInj(nMin:nMax)%weight = self%species%weight partInj(nMin:nMax)%weight = self%species%weight
!Particle is considered to be outside the domain !Particle is considered to be outside the domain
partInj(nMin:nMax)%n_in = .FALSE. partInj(nMin:nMax)%n_in = .FALSE.
!Assign charge/mass to charged particle.
SELECT TYPE(sp => self%species)
TYPE IS(speciesCharged)
partInj(nMin:nMax)%qm = sp%qm
END SELECT
!$OMP END SINGLE !$OMP END SINGLE
!$OMP DO !$OMP DO
@ -278,6 +295,7 @@ MODULE moduleInject
END IF END IF
partInj(n)%volColl = randomEdge%eColl%n partInj(n)%volColl = randomEdge%eColl%n
sp = self%species%n
!Assign particle type !Assign particle type
partInj(n)%species => self%species partInj(n)%species => self%species
@ -289,7 +307,7 @@ MODULE moduleInject
!Obtain natural coordinates of particle in cell !Obtain natural coordinates of particle in cell
partInj(n)%xi = mesh%vols(partInj(n)%vol)%obj%phy2log(partInj(n)%r) partInj(n)%xi = mesh%vols(partInj(n)%vol)%obj%phy2log(partInj(n)%r)
!Push new particle with the minimum time step !Push new particle with the minimum time step
CALL solver%pusher(self%species%n)%pushParticle(partInj(n), tauMin) CALL solver%pusher(sp)%pushParticle(partInj(n), tau(sp))
!Assign cell to new particle !Assign cell to new particle
CALL solver%updateParticleCell(partInj(n)) CALL solver%updateParticleCell(partInj(n))

View file

@ -40,16 +40,6 @@ MODULE moduleInput
CALL readSpecies(config) CALL readSpecies(config)
CALL checkStatus(config, "readSpecies") CALL checkStatus(config, "readSpecies")
!Reads case parameters
CALL verboseError('Reading Case parameters...')
CALL readCase(config)
CALL checkStatus(config, "readCase")
!Read interactions between species
CALL verboseError('Reading interaction between species...')
CALL readInteractions(config)
CALL checkStatus(config, "readInteractions")
!Read boundaries !Read boundaries
CALL verboseError('Reading boundary conditions...') CALL verboseError('Reading boundary conditions...')
CALL readBoundary(config) CALL readBoundary(config)
@ -60,6 +50,16 @@ MODULE moduleInput
CALL readGeometry(config) CALL readGeometry(config)
CALL checkStatus(config, "readGeometry") CALL checkStatus(config, "readGeometry")
!Read solver parameters
CALL verboseError('Reading Solver parameters...')
CALL readSolver(config)
CALL checkStatus(config, "readSolver")
!Read interactions between species
CALL verboseError('Reading interaction between species...')
CALL readInteractions(config)
CALL checkStatus(config, "readInteractions")
!Read probes !Read probes
CALL verboseError('Reading Probes...') CALL verboseError('Reading Probes...')
CALL readProbes(config) CALL readProbes(config)
@ -85,12 +85,15 @@ MODULE moduleInput
!Copies input file to output folder !Copies input file to output folder
CALL EXECUTE_COMMAND_LINE('cp ' // inputFile // ' ' // path // folder) CALL EXECUTE_COMMAND_LINE('cp ' // inputFile // ' ' // path // folder)
!Copies particle mesh !Copies particle mesh
IF (mesh%dimen > 0) THEN
CALL EXECUTE_COMMAND_LINE('cp ' // pathMeshParticle // ' ' // path // folder) CALL EXECUTE_COMMAND_LINE('cp ' // pathMeshParticle // ' ' // path // folder)
IF (doubleMesh) THEN IF (doubleMesh) THEN
CALL EXECUTE_COMMAND_LINE('cp ' // pathMeshColl // ' ' // path // folder) CALL EXECUTE_COMMAND_LINE('cp ' // pathMeshColl // ' ' // path // folder)
END IF END IF
END IF
END SUBROUTINE readConfig END SUBROUTINE readConfig
!Checks the status of the JSON case file and, if failed, exits the execution. !Checks the status of the JSON case file and, if failed, exits the execution.
@ -129,22 +132,6 @@ MODULE moduleInput
CALL config%get(object // '.temperature', T_ref, found) CALL config%get(object // '.temperature', T_ref, found)
IF (.NOT. found) CALL criticalError('Reference temperature not found','readReference') IF (.NOT. found) CALL criticalError('Reference temperature not found','readReference')
!If a reference cross section is given, it is used
CALL config%get(object // '.crossSection', sigma_ref, found)
!If not, the reference radius is searched
IF (.NOT. found) THEN
CALL config%get(object // '.radius', r_ref, found)
IF (found) THEN
sigma_ref = PI*(r_ref+r_ref)**2 !reference cross section
ELSE
sigma_ref = 0.D0 !Assume no collisions
END IF
END IF
!Derived parameters !Derived parameters
L_ref = DSQRT(kb*T_ref*eps_0/n_ref)/qe !reference length L_ref = DSQRT(kb*T_ref*eps_0/n_ref)/qe !reference length
v_ref = DSQRT(kb*T_ref/m_ref) !reference velocity v_ref = DSQRT(kb*T_ref/m_ref) !reference velocity
@ -152,11 +139,28 @@ MODULE moduleInput
Vol_ref = L_ref**3 !reference volume Vol_ref = L_ref**3 !reference volume
EF_ref = qe*n_ref*L_ref/eps_0 !reference electric field EF_ref = qe*n_ref*L_ref/eps_0 !reference electric field
Volt_ref = EF_ref*L_ref !reference voltage Volt_ref = EF_ref*L_ref !reference voltage
B_ref = m_ref / (ti_ref * qe) !reference magnetic field
!If a reference cross section is given, it is used
CALL config%get(object // '.sigmaVrel', sigmavRel_ref, found)
!If not, the reference radius is searched
IF (.NOT. found) THEN
CALL config%get(object // '.radius', r_ref, found)
IF (found) THEN
sigmaVrel_ref = PI*(r_ref+r_ref)**2*v_ref !reference cross section times velocity
ELSE
sigmaVrel_ref = 0.D0 !Assume no collisions
END IF
END IF
END SUBROUTINE readReference END SUBROUTINE readReference
!Reads the specific case parameters !Reads the specific case parameters
SUBROUTINE readCase(config) SUBROUTINE readSolver(config)
USE moduleRefParam USE moduleRefParam
USE moduleErrors USE moduleErrors
USE moduleCaseParam USE moduleCaseParam
@ -164,6 +168,7 @@ MODULE moduleInput
USE moduleSpecies USE moduleSpecies
USE moduleCollisions USE moduleCollisions
USE moduleOutput USE moduleOutput
USE moduleMesh
USE json_module USE json_module
IMPLICIT NONE IMPLICIT NONE
@ -172,47 +177,68 @@ MODULE moduleInput
CHARACTER(:), ALLOCATABLE:: object CHARACTER(:), ALLOCATABLE:: object
!simulation final and initial times in [t] !simulation final and initial times in [t]
REAL(8):: finalTime, initialTime REAL(8):: finalTime, initialTime
CHARACTER(:), ALLOCATABLE:: pusherType, WSType CHARACTER(:), ALLOCATABLE:: pusherType, WSType, EMType
REAL(8):: B(1:3)
INTEGER:: nTau, nSolver INTEGER:: nTau, nSolver
INTEGER:: i INTEGER:: i, n
CHARACTER(2):: iString CHARACTER(2):: iString
CHARACTER(1):: tString CHARACTER(1):: tString
object = 'case' object = 'solver'
!Time parameters !Time parameters
CALL config%info(object // '.tau', found, n_children = nTau) CALL config%info(object // '.tau', found, n_children = nTau)
IF (.NOT. found .OR. nTau == 0) CALL criticalError('Required parameter tau not found','readCase') IF (.NOT. found .OR. nTau == 0) THEN
CALL criticalError('Required parameter tau not found','readSolver')
END IF
ALLOCATE(tau(1:nSpecies)) ALLOCATE(tau(1:nSpecies))
DO i = 1, nTau DO i = 1, nTau
WRITE(iString, '(I2)') i WRITE(iString, '(I2)') i
CALL config%get(object // '.tau(' // TRIM(iString) // ')', tau(i), found) CALL config%get(object // '.tau(' // TRIM(iString) // ')', tau(i), found)
END DO END DO
tauMin = MINVAL(tau(1:nTau))
IF (nTau < nSpecies) THEN IF (nTau < nSpecies) THEN
CALL warningError('Using minimum time step for some species') CALL warningError('Using minimum time step for some species')
tau(nTau+1:nSpecies) = MINVAL(tau(1:nTau)) tau(nTau+1:nSpecies) = tauMin
END IF END IF
tauMin = MINVAL(tau)
!Gets the simulation final time !Gets the simulation final time
CALL config%get(object // '.finalTime', finalTime, found) CALL config%get(object // '.finalTime', finalTime, found)
IF (.NOT. found) CALL criticalError('Required parameter finalTime not found','readCase') IF (.NOT. found) THEN
CALL criticalError('Required parameter finalTime not found','readSolver')
END IF
!Convert simulation time to number of iterations !Convert simulation time to number of iterations
tFinal = INT(finalTime / tauMin) tFinal = INT(finalTime / tauMin)
!Gets the simulation initial time !Gets the simulation initial time
CALL config%get(object // '.initialTime', initialTime, found) CALL config%get(object // '.initialTime', initialTime, found)
IF (found) tInitial = INT(initialTime / tauMin) IF (found) THEN
tInitial = INT(initialTime / tauMin)
END IF
!Gest the pusher for each species !Gest the pusher for each species
IF (mesh%dimen > 0) THEN
CALL config%info(object // '.pusher', found, n_children = nSolver) CALL config%info(object // '.pusher', found, n_children = nSolver)
IF (.NOT. found .OR. nSolver /= nSpecies) CALL criticalError('Required parameter pusher not found','readCase') IF (.NOT. found .OR. nSolver /= nSpecies) THEN
CALL criticalError('Required parameter pusher not found','readSolver')
END IF
END IF
!Allocates all the pushers for particles !Allocates all the pushers for particles
ALLOCATE(solver%pusher(1:nSpecies)) ALLOCATE(solver%pusher(1:nSpecies))
!Initialize pushers !Initialize pushers
DO i = 1, nSolver DO i = 1, nSpecies
WRITE(iString, '(I2)') i WRITE(iString, '(I2)') i
CALL config%get(object // '.pusher(' // TRIM(iString) // ')', pusherType, found) CALL config%get(object // '.pusher(' // TRIM(iString) // ')', pusherType, found)
@ -221,22 +247,63 @@ MODULE moduleInput
END DO END DO
!Gest the non-analogue scheme !Get the non-analogue scheme
CALL config%get(object // '.WeightingScheme', WSType, found) CALL config%get(object // '.WeightingScheme', WSType, found)
CALL solver%initWS(WSType) CALL solver%initWS(WSType)
!Makes tau(s) non-dimensional !Make tau(s) non-dimensional
tau = tau / ti_ref tau = tau / ti_ref
tauMin = tauMin / ti_ref tauMin = tauMin / ti_ref
!Sets the format of output files accordint to iteration number !Set the format of output files accordint to iteration number
iterationDigits = INT(LOG10(REAL(tFinal))) + 1 iterationDigits = INT(LOG10(REAL(tFinal))) + 1
WRITE(tString, '(I1)') iterationDigits WRITE(tString, '(I1)') iterationDigits
iterationFormat = "(I" // tString // "." // tString // ")" iterationFormat = "(I" // tString // "." // tString // ")"
END SUBROUTINE readCase !Get EM solver
CALL config%get(object // '.EMSolver', EMType, found)
IF (found) THEN
CALL solver%initEM(EMType)
SELECT CASE(EMType)
CASE("Electrostatic")
!Read BC
CALL readEMBoundary(config)
!Reads the initial information for the species CASE("ConstantB")
!Read BC
CALL readEMBoundary(config)
!Read constant magnetic field
DO i = 1, 3
WRITE(istring, '(i2)') i
CALL config%get(object // '.B(' // istring // ')', B(i), found)
IF (.NOT. found) THEN
CALL criticalError('Constant magnetic field not provided in direction ' // iString, 'readSolver')
END IF
END DO
!Non-dimensional magnetic field
B = B / B_ref
!Assign it to the nodes
DO n =1, mesh%numNodes
mesh%nodes(n)%obj%emData%B(1) = B(1)
mesh%nodes(n)%obj%emData%B(2) = B(2)
mesh%nodes(n)%obj%emData%B(3) = B(3)
END DO
CASE DEFAULT
CALL criticalError('EM Solver ' // EMType // ' not found', 'readSolver')
END SELECT
END IF
END SUBROUTINE readSolver
!Read the initial information for the species
SUBROUTINE readInitial(config) SUBROUTINE readInitial(config)
USE moduleSpecies USE moduleSpecies
USE moduleMesh USE moduleMesh
@ -266,17 +333,18 @@ MODULE moduleInput
!Mean velocity and temperature at particle position !Mean velocity and temperature at particle position
REAL(8):: velocityXi(1:3), temperatureXi REAL(8):: velocityXi(1:3), temperatureXi
INTEGER:: nNewPart = 0.D0 INTEGER:: nNewPart = 0.D0
CLASS(meshVol), POINTER:: vol
TYPE(particle), POINTER:: partNew TYPE(particle), POINTER:: partNew
REAL(8):: vTh REAL(8):: vTh
TYPE(lNode), POINTER:: partCurr, partNext TYPE(lNode), POINTER:: partCurr, partNext
CALL config%info('case.initial', found, n_children = nInitial) CALL config%info('solver.initial', found, n_children = nInitial)
IF (found) THEN IF (found) THEN
!Reads the information from initial species !Reads the information from initial species
DO i = 1, nInitial DO i = 1, nInitial
WRITE(iString, '(I2)') i WRITE(iString, '(I2)') i
object = 'case.initial(' // iString // ')' object = 'solver.initial(' // iString // ')'
CALL config%get(object // '.species', spName, found) CALL config%get(object // '.species', spName, found)
sp = speciesName2Index(spName) sp = speciesName2Index(spName)
CALL config%get(object // '.file', spFile, found) CALL config%get(object // '.file', spFile, found)
@ -289,7 +357,6 @@ MODULE moduleInput
!Density at centroid of cell !Density at centroid of cell
nodes = mesh%vols(e)%obj%getNodes() nodes = mesh%vols(e)%obj%getNodes()
nNodes = SIZE(nodes) nNodes = SIZE(nodes)
!TODO: Procedure to obtain centroid from element (also for printing Electric Field)
fPsi = mesh%vols(e)%obj%fPsi((/0.D0, 0.D0, 0.D0/)) fPsi = mesh%vols(e)%obj%fPsi((/0.D0, 0.D0, 0.D0/))
ALLOCATE(source(1:nNodes)) ALLOCATE(source(1:nNodes))
DO j = 1, nNodes DO j = 1, nNodes
@ -350,19 +417,17 @@ MODULE moduleInput
END IF END IF
partNew%n_in = .TRUE. partNew%n_in = .TRUE.
partNew%weight = species(sp)%obj%weight partNew%weight = species(sp)%obj%weight
!If charged species, add qm to particle
SELECT TYPE(sp => species(sp)%obj)
TYPE IS (speciesCharged)
partNew%qm = sp%qm
CLASS DEFAULT
partNew%qm = 0.D0
END SELECT
!Assign particle to temporal list of particles !Assign particle to temporal list of particles
CALL partInitial%add(partNew) CALL partInitial%add(partNew)
!Assign particle to list in volume
vol => meshforMCC%vols(partNew%volColl)%obj
CALL OMP_SET_LOCK(vol%lock)
CALL vol%listPart_in(sp)%add(partNew)
vol%totalWeight(sp) = vol%totalWeight(sp) + partNew%weight
CALL OMP_UNSET_LOCK(vol%lock)
END DO END DO
DEALLOCATE(source) DEALLOCATE(source)
@ -372,7 +437,7 @@ MODULE moduleInput
END DO END DO
!Convert temporal list of particles into initial partOld array !Convert temporal list of particles into initial partOld array
!Deallocates the list of initial particles !Deallocate the list of initial particles
nNewPart = partInitial%amount nNewPart = partInitial%amount
IF (nNewPart > 0) THEN IF (nNewPart > 0) THEN
ALLOCATE(partOld(1:nNewPart)) ALLOCATE(partOld(1:nNewPart))
@ -504,13 +569,13 @@ MODULE moduleInput
END DO END DO
!Reads relations between species !Read relations between species
DO i = 1, nSpecies DO i = 1, nSpecies
WRITE(iString, '(I2)') i WRITE(iString, '(I2)') i
object = 'species(' // TRIM(iString) // ')' object = 'species(' // TRIM(iString) // ')'
SELECT TYPE(sp => species(i)%obj) SELECT TYPE(sp => species(i)%obj)
TYPE IS (speciesNeutral) TYPE IS (speciesNeutral)
!Gets species linked ion !Get species linked ion
CALL config%get(object // '.ion', linkName, found) CALL config%get(object // '.ion', linkName, found)
IF (found) THEN IF (found) THEN
linkID = speciesName2Index(linkName) linkID = speciesName2Index(linkName)
@ -519,7 +584,7 @@ MODULE moduleInput
END IF END IF
TYPE IS (speciesCharged) TYPE IS (speciesCharged)
!Gets species linked neutral !Get species linked neutral
CALL config%get(object // '.neutral', linkName, found) CALL config%get(object // '.neutral', linkName, found)
IF (found) THEN IF (found) THEN
linkID = speciesName2Index(linkName) linkID = speciesName2Index(linkName)
@ -568,11 +633,13 @@ MODULE moduleInput
CHARACTER(:), ALLOCATABLE:: crossSecFilePath CHARACTER(:), ALLOCATABLE:: crossSecFilePath
CHARACTER(:), ALLOCATABLE:: cType CHARACTER(:), ALLOCATABLE:: cType
LOGICAL:: found LOGICAL:: found
INTEGER:: nInteractions, nCollisions INTEGER:: nPairs, nCollisions
INTEGER:: i, k, ij INTEGER:: i, k, ij
INTEGER:: pt_i, pt_j INTEGER:: pt_i, pt_j
REAL(8):: energyThreshold, energyBinding REAL(8):: energyThreshold, energyBinding
CHARACTER(:), ALLOCATABLE:: electron CHARACTER(:), ALLOCATABLE:: electron
INTEGER:: e
CLASS(meshVol), POINTER:: vol
!Firstly, checks if the object 'interactions' exists !Firstly, checks if the object 'interactions' exists
CALL config%info('interactions', found) CALL config%info('interactions', found)
@ -580,19 +647,6 @@ MODULE moduleInput
!Checks if MC collisions have been defined !Checks if MC collisions have been defined
CALL config%info('interactions.collisions', found) CALL config%info('interactions.collisions', found)
IF (found) THEN IF (found) THEN
!Checks if a mesh for collisions has been defined
!The mesh will be initialized and reader in readGeometry
CALL config%info('interactions.meshCollisions', found)
IF (found) THEN
!Points meshForMCC to the specific mesh defined
meshForMCC => meshColl
ELSE
!Points the meshForMCC pointer to the Particles Mesh
meshForMCC => mesh
END IF
!Reads collision time step !Reads collision time step
CALL config%info('interactions.timeStep', found) CALL config%info('interactions.timeStep', found)
IF (found) THEN IF (found) THEN
@ -620,8 +674,8 @@ MODULE moduleInput
!Inits lock for list of particles !Inits lock for list of particles
CALL OMP_INIT_LOCK(lockCollisions) CALL OMP_INIT_LOCK(lockCollisions)
CALL config%info('interactions.collisions', found, n_children = nInteractions) CALL config%info('interactions.collisions', found, n_children = nPairs)
DO i = 1, nInteractions DO i = 1, nPairs
WRITE(iString, '(I2)') i WRITE(iString, '(I2)') i
object = 'interactions.collisions(' // TRIM(iString) // ')' object = 'interactions.collisions(' // TRIM(iString) // ')'
CALL config%get(object // '.species_i', species_i, found) CALL config%get(object // '.species_i', species_i, found)
@ -630,8 +684,9 @@ MODULE moduleInput
pt_j = speciesName2Index(species_j) pt_j = speciesName2Index(species_j)
CALL config%info(object // '.cTypes', found, n_children = nCollisions) CALL config%info(object // '.cTypes', found, n_children = nCollisions)
ij = interactionIndex(pt_i,pt_j) ij = interactionIndex(pt_i,pt_j)
!Allocates the required number of collisions per each pair of species ij !Allocates the required number of collisions per each pair of species ij
CALL interactionMatrix(ij)%init(nCollisions) CALL interactionMatrix(ij)%init(nCollisions, pt_i, pt_j)
DO k = 1, nCollisions DO k = 1, nCollisions
WRITE (kString, '(I2)') k WRITE (kString, '(I2)') k
@ -646,13 +701,11 @@ MODULE moduleInput
SELECT CASE(cType) SELECT CASE(cType)
CASE ('elastic') CASE ('elastic')
!Elastic collision !Elastic collision
CALL initBinaryElastic(interactionMatrix(ij)%collisions(k)%obj, & CALL initBinaryElastic(interactionMatrix(ij)%collisions(k)%obj, crossSecFilePath)
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
CASE ('chargeExchange') CASE ('chargeExchange')
!Resonant charge exchange !Resonant charge exchange
CALL initBinaryChargeExchange(interactionMatrix(ij)%collisions(k)%obj, & CALL initBinaryChargeExchange(interactionMatrix(ij)%collisions(k)%obj, crossSecFilePath)
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
CASE ('ionization') CASE ('ionization')
!Electorn impact ionization !Electorn impact ionization
@ -661,7 +714,7 @@ MODULE moduleInput
CALL config%get(object // '.electron', electron, found) CALL config%get(object // '.electron', electron, found)
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions') IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, & CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, energyThreshold, species(pt_i)%obj%m, species(pt_j)%obj%m, electron) crossSecFilePath, energyThreshold, electron)
CASE ('recombination') CASE ('recombination')
!Electorn impact ionization !Electorn impact ionization
@ -670,10 +723,10 @@ MODULE moduleInput
CALL config%get(object // '.electron', electron, found) CALL config%get(object // '.electron', electron, found)
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions') IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
CALL initBinaryRecombination(interactionMatrix(ij)%collisions(k)%obj, & CALL initBinaryRecombination(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, energyBinding, species(pt_i)%obj%m, species(pt_j)%obj%m, electron) crossSecFilePath, energyBinding, electron)
CASE DEFAULT CASE DEFAULT
CALL criticalError('Collision type' // cType // 'not defined yet', 'readInteractions') CALL criticalError('Collision type' // cType // 'not defined', 'readInteractions')
END SELECT END SELECT
@ -681,6 +734,26 @@ MODULE moduleInput
END DO END DO
!Init the required arrays in each volume to account for MCC.
DO e = 1, meshForMCC%numVols
vol => meshForMCC%vols(e)%obj
!Allocate Maximum cross section per collision pair and assign the initial collision rate
ALLOCATE(vol%sigmaVrelMax(1:nCollPairs))
vol%sigmaVrelMax = sigmaVrel_ref/(L_ref**2 * v_ref)
IF (collOutput) THEN
ALLOCATE(vol%tallyColl(1:nCollPairs))
DO k = 1, nCollPairs
ALLOCATE(vol%tallyColl(k)%tally(1:interactionmatrix(k)%amount))
vol%tallyColl(k)%tally = 0
END DO
END IF
END DO
END IF END IF
END IF END IF
@ -792,11 +865,6 @@ MODULE moduleInput
USE moduleMesh USE moduleMesh
USE moduleMeshInputGmsh2, ONLY: initGmsh2 USE moduleMeshInputGmsh2, ONLY: initGmsh2
USE moduleMeshInput0D, ONLY: init0D USE moduleMeshInput0D, ONLY: init0D
USE moduleMesh3DCart, ONLY: connectMesh3DCart
USE moduleMesh2DCyl, ONLY: connectMesh2DCyl
USE moduleMesh2DCart, ONLY: connectMesh2DCart
USE moduleMesh1DRad, ONLY: connectMesh1DRad
USE moduleMesh1DCart, ONLY: connectMesh1DCart
USE moduleErrors USE moduleErrors
USE moduleOutput USE moduleOutput
USE moduleRefParam USE moduleRefParam
@ -805,87 +873,122 @@ MODULE moduleInput
IMPLICIT NONE IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config TYPE(json_file), INTENT(inout):: config
CHARACTER(:), ALLOCATABLE:: object
LOGICAL:: found LOGICAL:: found
CHARACTER(:), ALLOCATABLE:: meshFormat, meshFile, EMType CHARACTER(:), ALLOCATABLE:: meshFormat, meshFile
REAL(8):: volume REAL(8):: volume
!Firstly, indicates if a specific mesh for MC collisions is being use object = 'geometry'
doubleMesh = ASSOCIATED(meshForMCC, meshColl)
!Selects the type of geometry. !Checks if a mesh for collisions has been defined
CALL config%get('geometry.type', mesh%geometry, found) !The mesh will be initialized and reader in readGeometry
IF (doubleMesh) meshColl%geometry = mesh%geometry CALL config%info(object // '.meshCollisions', found)
IF (found) THEN
!Points meshForMCC to the specific mesh defined
meshForMCC => meshColl
doubleMesh = .TRUE.
!Gets the type of mesh ELSE
CALL config%get('geometry.meshType', meshFormat, found) CALL config%info('interactions', found)
SELECT CASE(meshFormat) IF (found) THEN
CASE ("gmsh2") !Points the meshForMCC pointer to the Particles Mesh
CALL initGmsh2(mesh) meshForMCC => mesh
IF (doubleMesh) CALL initGmsh2(meshColl)
CASE ("0D") END IF
CALL config%get('geometry.meshType', meshFormat, found) doubleMesh = .FALSE.
CALL init0D(mesh)
CASE DEFAULT
CALL criticalError("Mesh format " // meshFormat // " not recogniced", "readGeometry")
END SELECT
!Reads the mesh file
CALL config%get('geometry.meshFile', meshFile, found)
pathMeshParticle = path // meshFile
CALL mesh%readMesh(pathMeshParticle)
DEALLOCATE(meshFile)
IF (doubleMesh) THEN
!Reads the mesh file for collisions
CALL config%get('interactions.meshCollisions', meshFile, found)
pathMeshColl = path // meshFile
CALL meshColl%readMesh(pathMeshColl)
END IF END IF
!Gets the volume for a 0D mesh !Get the dimension of the geometry
!TODO: Try to constrain this to the inout for 0D CALL config%get(object // '.dimension', mesh%dimen, found)
IF (meshFormat == "0D") THEN IF (.NOT. found) THEN
CALL config%get('geometry.volume', volume, found) CALL criticalError('Required parameter geometry.dimension not found', 'readGeometry')
END IF
IF (doubleMesh) THEN
meshColl%dimen = mesh%dimen
END IF
SELECT CASE(mesh%dimen)
CASE (0)
CALL init0D(mesh)
!Read the 0D mesh
CALL mesh%readMesh(pathMeshParticle)
!Get the volumne
CALL config%get(object // '.volume', volume, found)
!Rescale the volumne
IF (found) THEN IF (found) THEN
mesh%vols(1)%obj%volume = mesh%vols(1)%obj%volume*volume / Vol_ref mesh%vols(1)%obj%volume = mesh%vols(1)%obj%volume*volume / Vol_ref
mesh%nodes(1)%obj%v = mesh%vols(1)%obj%volume mesh%nodes(1)%obj%v = mesh%vols(1)%obj%volume
END IF END IF
CASE (1:3)
!Select the type of geometry
CALL config%get(object // '.type', mesh%geometry, found)
IF (doubleMesh) THEN
meshColl%geometry = mesh%geometry
END IF END IF
!Creates the connectivity between elements !Check the consistency between geometry and dimension
SELECT CASE(mesh%geometry) SELECT CASE(mesh%dimen)
CASE("3DCart") CASE(3)
mesh%connectMesh => connectMesh3DCart IF (mesh%geometry /= 'Cart') THEN
CALL criticalError('No available geometry ' // mesh%geometry // ' in 3D', 'readGeometry')
CASE("2DCyl") END IF
mesh%connectMesh => connectMesh2DCyl
CASE("2DCart") CASE(2)
mesh%connectMesh => connectMesh2DCart IF (mesh%geometry /= 'Cart' .AND. &
mesh%geometry /= 'Cyl') THEN
CALL criticalError('No available geometry ' // mesh%geometry // ' in 2D', 'readGeometry')
CASE("1DRad") END IF
mesh%connectMesh => connectMesh1DRad
CASE("1DCart") CASE(1)
mesh%connectMesh => connectMesh1DCart IF (mesh%geometry /= 'Cart' .AND. &
mesh%geometry /= 'Rad') THEN
CALL criticalError('No available geometry ' // mesh%geometry // ' in 1D', 'readGeometry')
CASE("0D") END IF
mesh%connectMesh => NULL()
END SELECT END SELECT
IF (ASSOCIATED(mesh%connectMesh)) CALL mesh%connectMesh
!Get the type of mesh
CALL config%get(object // '.meshType', meshFormat, found)
SELECT CASE(meshFormat)
CASE ("gmsh2")
CALL initGmsh2(mesh)
IF (doubleMesh) THEN IF (doubleMesh) THEN
meshColl%connectMesh => mesh%connectMesh CALL initGmsh2(meshColl)
CALL meshColl%connectMesh
END IF END IF
END SELECT
!Reads the mesh file
CALL config%get(object // '.meshFile', meshFile, found)
pathMeshParticle = path // meshFile
CALL mesh%readMesh(pathMeshParticle)
DEALLOCATE(meshFile)
IF (doubleMesh) THEN
!Reads the mesh file for collisions
CALL config%get(object // '.meshCollisions', meshFile, found)
pathMeshColl = path // meshFile
CALL meshColl%readMesh(pathMeshColl)
END IF
CASE DEFAULT
CALL criticalError("Mesh dimension not recogniced", "readGeometry")
END SELECT
!Builds the K matrix for the Particles mesh !Builds the K matrix for the Particles mesh
CALL mesh%constructGlobalK() CALL mesh%constructGlobalK()
@ -898,16 +1001,6 @@ MODULE moduleInput
END IF END IF
!Gest EM solver
CALL config%get('case.EMSolver', EMType, found)
CALL solver%initEM(EMType)
SELECT CASE(EMType)
CASE("Electrostatic")
!Reads BC
CALL readEMBoundary(config)
END SELECT
END SUBROUTINE readGeometry END SUBROUTINE readGeometry
SUBROUTINE readProbes(config) SUBROUTINE readProbes(config)
@ -1010,7 +1103,6 @@ MODULE moduleInput
END DO END DO
!TODO: Improve this
IF (ALLOCATED(boundEM)) THEN IF (ALLOCATED(boundEM)) THEN
DO e = 1, mesh%numEdges DO e = 1, mesh%numEdges
IF (ANY(mesh%edges(e)%obj%physicalSurface == boundEM(:)%physicalSurface)) THEN IF (ANY(mesh%edges(e)%obj%physicalSurface == boundEM(:)%physicalSurface)) THEN
@ -1026,7 +1118,10 @@ MODULE moduleInput
!Compute the PLU factorization of K once boundary conditions have been read !Compute the PLU factorization of K once boundary conditions have been read
CALL dgetrf(mesh%numNodes, mesh%numNodes, mesh%K, mesh%numNodes, mesh%IPIV, info) CALL dgetrf(mesh%numNodes, mesh%numNodes, mesh%K, mesh%numNodes, mesh%IPIV, info)
IF (info /= 0) CALL criticalError('Factorization of K matrix failed', 'readEMBoundary') IF (info /= 0) THEN
CALL criticalError('Factorization of K matrix failed', 'readEMBoundary')
END IF
END SUBROUTINE readEMBoundary END SUBROUTINE readEMBoundary

View file

@ -71,6 +71,7 @@ MODULE moduleList
DO n=1, self%amount DO n=1, self%amount
!Point element in array to element in list !Point element in array to element in list
partArray(n)%part => tempNode%part partArray(n)%part => tempNode%part
!Go to next element !Go to next element
tempNode => tempNode%next tempNode => tempNode%next

View file

@ -49,4 +49,14 @@ MODULE moduleMath
END FUNCTION norm1 END FUNCTION norm1
PURE FUNCTION reducedMass(m_i, m_j) RESULT(rMass)
IMPLICIT NONE
REAL(8), INTENT(in):: m_i, m_j
REAL(8):: rMass
rMass = (m_i * m_j) / (m_i + m_j)
END FUNCTION
END MODULE moduleMath END MODULE moduleMath

View file

@ -11,6 +11,7 @@ MODULE moduleOutput
TYPE emNode TYPE emNode
CHARACTER(:), ALLOCATABLE:: type CHARACTER(:), ALLOCATABLE:: type
REAL(8):: phi REAL(8):: phi
REAL(8):: B(1:3)
END TYPE emNode END TYPE emNode

View file

@ -1,9 +1,9 @@
!Reference parameters !Reference parameters
MODULE moduleRefParam MODULE moduleRefParam
!Parameters that define the problem (inputs) !Parameters that define the problem (inputs)
REAL(8):: n_ref, m_ref, T_ref, r_ref, debye_ref, sigma_ref REAL(8):: n_ref, m_ref, T_ref, r_ref, debye_ref, sigmaVrel_ref
!Reference parameters for non-dimensional problem !Reference parameters for non-dimensional problem
REAL(8):: L_ref, v_ref, ti_ref, Vol_ref, EF_ref, Volt_ref REAL(8):: L_ref, v_ref, ti_ref, Vol_ref, EF_ref, Volt_ref, B_ref
END MODULE moduleRefParam END MODULE moduleRefParam

View file

@ -60,53 +60,63 @@ MODULE moduleSolver
!Init Pusher !Init Pusher
SUBROUTINE initPusher(self, pusherType, tau, tauSp) SUBROUTINE initPusher(self, pusherType, tau, tauSp)
USE moduleErrors USE moduleErrors
USE moduleMesh, ONLY: mesh
IMPLICIT NONE IMPLICIT NONE
CLASS(pusherGeneric), INTENT(out):: self CLASS(pusherGeneric), INTENT(out):: self
CHARACTER(:), ALLOCATABLE:: pusherType CHARACTER(:), ALLOCATABLE:: pusherType
REAL(8):: tau, tauSp REAL(8):: tau, tauSp
SELECT CASE(pusherType) !TODO: Reorganize if Cart pushers are combined
!3D Cartesian SELECT CASE(mesh%dimen)
CASE('3DCartNeutral') CASE(0)
self%pushParticle => push3DCartNeutral
CASE('3DCartCharged')
self%pushParticle => push3DCartCharged
!2D Cylindrical
CASE('2DCylNeutral')
self%pushParticle => push2DCylNeutral
CASE('2DCylCharged')
self%pushParticle => push2DCylCharged
!2D Cartesian
CASE('2DCartNeutral')
self%pushParticle => push2DCartNeutral
CASE('2DCartCharged')
self%pushParticle => push2DCartCharged
!1D Cartesian
CASE('1DCartNeutral')
self%pushParticle => push1DCartNeutral
CASE('1DCartCharged')
self%pushParticle => push1DCartCharged
!1D Radial
CASE('1DRadNeutral')
self%pushParticle => push1DRadNeutral
CASE('1DRadCharged')
self%pushParticle => push1DRadCharged
CASE('0D')
self%pushParticle => push0D self%pushParticle => push0D
CASE(1:3)
SELECT CASE(mesh%geometry)
CASE ('Cart')
SELECT CASE(pusherType)
CASE('Neutral')
self%pushParticle => pushCartNeutral
CASE('Electrostatic')
self%pushParticle => pushCartElectrostatic
CASE('Electromagnetic')
self%pushParticle => pushCartElectromagnetic
CASE DEFAULT CASE DEFAULT
CALL criticalError('Pusher ' // pusherType // ' not found','initPusher') CALL criticalError('Pusher ' // pusherType // ' not found for Cart','initPusher')
END SELECT
CASE('Cyl')
SELECT CASE(pusherType)
CASE('Neutral')
self%pushParticle => push2DCylNeutral
CASE('Electrostatic')
self%pushParticle => push2DCylElectrostatic
CASE DEFAULT
CALL criticalError('Pusher ' // pusherType // ' not found for Cyl','initPusher')
END SELECT
CASE('Rad')
SELECT CASE(pusherType)
CASE('Neutral')
self%pushParticle => push1DRadNeutral
CASE('Electrostatic')
self%pushParticle => push1DRadElectrostatic
CASE DEFAULT
CALL criticalError('Pusher ' // pusherType // ' not found for Rad','initPusher')
END SELECT
END SELECT
END SELECT END SELECT
@ -122,7 +132,7 @@ MODULE moduleSolver
CHARACTER(:), ALLOCATABLE:: EMType CHARACTER(:), ALLOCATABLE:: EMType
SELECT CASE(EMType) SELECT CASE(EMType)
CASE('Electrostatic') CASE('Electrostatic','ConstantB')
self%solveEM => solveElecField self%solveEM => solveElecField
END SELECT END SELECT
@ -155,7 +165,7 @@ MODULE moduleSolver
INTEGER:: sp INTEGER:: sp
!$OMP DO !$OMP DO
DO n=1, nPartOld DO n = 1, nPartOld
!Select species type !Select species type
sp = partOld(n)%species%n sp = partOld(n)%species%n
!Checks if the species sp is update this iteration !Checks if the species sp is update this iteration
@ -172,67 +182,76 @@ MODULE moduleSolver
END SUBROUTINE doPushes END SUBROUTINE doPushes
!Push neutral particles in 3D cartesian coordinates !Push neutral particles in cartesian coordinates
PURE SUBROUTINE push3DCartNeutral(part, tauIn) PURE SUBROUTINE pushCartNeutral(part, tauIn)
USE moduleSPecies USE moduleSPecies
IMPLICIT NONE IMPLICIT NONE
TYPE(particle), INTENT(inout):: part TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
part_temp = part part%r = part%r + part%v*tauIn
!x END SUBROUTINE pushCartNeutral
part_temp%v(1) = part%v(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!y PURE SUBROUTINE pushCartElectrostatic(part, tauIn)
part_temp%v(2) = part%v(2)
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
!z
part_temp%v(3) = part%v(3)
part_temp%r(3) = part%r(3) + part_temp%v(3)*tauIn
part_temp%n_in = .FALSE.
part = part_temp
END SUBROUTINE push3DCartNeutral
!Push charged particles in 3D cartesian coordinates
PURE SUBROUTINE push3DCartCharged(part, tauIn)
USE moduleSPecies USE moduleSPecies
USE moduleEM USE moduleEM
IMPLICIT NONE IMPLICIT NONE
TYPE(particle), INTENT(inout):: part TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
REAL(8):: qmEFt(1:3) REAL(8):: qmEFt(1:3)
part_temp = part
!Get the electric field at particle position !Get the electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn qmEFt = part%species%qm*gatherElecField(part)*tauIn
!x !Update velocity
part_temp%v(1) = part%v(1) + qmEFt(1) part%v = part%v + qmEFt
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!y !Update position
part_temp%v(2) = part%v(2) + qmEFt(2) part%r = part%r + part%v*tauIn
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
!z END SUBROUTINE pushCartElectrostatic
part_temp%v(3) = part%v(3) + qmEFt(3)
part_temp%r(3) = part%r(3) + part_temp%v(3)*tauIn
part_temp%n_in = .FALSE. PURE SUBROUTINE pushCartElectromagnetic(part, tauIn)
USE moduleSPecies
USE moduleEM
USE moduleMath
IMPLICIT NONE
part = part_temp TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
REAL(8):: tauInHalf
REAL(8):: qmEFt(1:3)
REAL(8):: B(1:3), BNorm
REAL(8):: fn
REAL(8):: v_minus(1:3), v_prime(1:3), v_plus(1:3)
END SUBROUTINE push3DCartCharged tauInHalf = tauIn *0.5D0
!Half of the force o f the electric field
qmEFt = part%species%qm*gatherElecField(part)*tauInHalf
!Half step for electrostatic
v_minus = part%v + qmEFt
!Full step rotation
B = gatherMagnField(part)
BNorm = NORM2(B)
IF (BNorm > 0.D0) THEN
fn = DTAN(part%species%qm * tauInHalf*BNorm) / BNorm
v_prime = v_minus + fn * crossProduct(v_minus, B)
v_plus = v_minus + 2.D0 * fn / (1.D0 + fn**2 * B**2)*crossProduct(v_prime, B)
END IF
!Half step for electrostatic
part%v = v_plus + qmEFt
!Update position
part%r = part%r + part%v*tauIn
END SUBROUTINE pushCartElectromagnetic
!Push one particle. Boris pusher for 2D Cyl Neutral particle !Push one particle. Boris pusher for 2D Cyl Neutral particle
PURE SUBROUTINE push2DCylNeutral(part, tauIn) PURE SUBROUTINE push2DCylNeutral(part, tauIn)
@ -265,14 +284,14 @@ MODULE moduleSolver
END IF END IF
part_temp%v(2) = cos_alpha*v_p_oh_star(2)+sin_alpha*v_p_oh_star(3) part_temp%v(2) = cos_alpha*v_p_oh_star(2)+sin_alpha*v_p_oh_star(3)
part_temp%v(3) = -sin_alpha*v_p_oh_star(2)+cos_alpha*v_p_oh_star(3) part_temp%v(3) = -sin_alpha*v_p_oh_star(2)+cos_alpha*v_p_oh_star(3)
part_temp%n_in = .FALSE. !Assume particle is outside until cell is found
!Copy temporal particle to particle !Copy temporal particle to particle
part=part_temp part=part_temp
END SUBROUTINE push2DCylNeutral END SUBROUTINE push2DCylNeutral
!Push one particle. Boris pusher for 2D Cyl Charged particle !Push one particle. Boris pusher for 2D Cyl Electrostatic particle
PURE SUBROUTINE push2DCylCharged(part, tauIn) PURE SUBROUTINE push2DCylElectrostatic(part, tauIn)
USE moduleSpecies USE moduleSpecies
USE moduleEM USE moduleEM
IMPLICIT NONE IMPLICIT NONE
@ -286,7 +305,7 @@ MODULE moduleSolver
part_temp = part part_temp = part
!Get electric field at particle position !Get electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn qmEFt = part_temp%species%qm*gatherElecField(part_temp)*tauIn
!z !z
part_temp%v(1) = part%v(1) + qmEFt(1) part_temp%v(1) = part%v(1) + qmEFt(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
@ -306,112 +325,11 @@ MODULE moduleSolver
END IF END IF
part_temp%v(2) = cos_alpha*v_p_oh_star(2)+sin_alpha*v_p_oh_star(3) part_temp%v(2) = cos_alpha*v_p_oh_star(2)+sin_alpha*v_p_oh_star(3)
part_temp%v(3) = -sin_alpha*v_p_oh_star(2)+cos_alpha*v_p_oh_star(3) part_temp%v(3) = -sin_alpha*v_p_oh_star(2)+cos_alpha*v_p_oh_star(3)
part_temp%n_in = .FALSE. !Assume particle is outside until cell is found
!Copy temporal particle to particle !Copy temporal particle to particle
part=part_temp part=part_temp
END SUBROUTINE push2DCylCharged END SUBROUTINE push2DCylElectrostatic
!Push neutral particles in 2D cartesian coordinates
PURE SUBROUTINE push2DCartNeutral(part, tauIn)
USE moduleSPecies
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
part_temp = part
!x
part_temp%v(1) = part%v(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!y
part_temp%v(2) = part%v(2)
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
part_temp%n_in = .FALSE.
part = part_temp
END SUBROUTINE push2DCartNeutral
!Push charged particles in 2D cartesian coordinates
PURE SUBROUTINE push2DCartCharged(part, tauIn)
USE moduleSPecies
USE moduleEM
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
REAL(8):: qmEFt(1:3)
part_temp = part
!Get the electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn
!x
part_temp%v(1) = part%v(1) + qmEFt(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!y
part_temp%v(2) = part%v(2) + qmEFt(2)
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
part_temp%n_in = .FALSE.
part = part_temp
END SUBROUTINE push2DCartCharged
!Push neutral particles in 1D cartesian coordinates
PURE SUBROUTINE push1DCartNeutral(part, tauIn)
USE moduleSPecies
USE moduleEM
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
part_temp = part
!x
part_temp%v(1) = part%v(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
part_temp%n_in = .FALSE.
part = part_temp
END SUBROUTINE push1DCartNeutral
!Push charged particles in 1D cartesian coordinates
PURE SUBROUTINE push1DCartCharged(part, tauIn)
USE moduleSPecies
USE moduleEM
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
REAL(8):: qmEFt(1:3)
part_temp = part
!Get the electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn
!x
part_temp%v(1) = part%v(1) + qmEFt(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
part_temp%n_in = .FALSE.
part = part_temp
END SUBROUTINE push1DCartCharged
!Push one particle. Boris pusher for 1D Radial Neutral particle !Push one particle. Boris pusher for 1D Radial Neutral particle
PURE SUBROUTINE push1DRadNeutral(part, tauIn) PURE SUBROUTINE push1DRadNeutral(part, tauIn)
@ -442,14 +360,14 @@ MODULE moduleSolver
END IF END IF
part_temp%v(1) = cos_alpha*v_p_oh_star(1)+sin_alpha*v_p_oh_star(2) part_temp%v(1) = cos_alpha*v_p_oh_star(1)+sin_alpha*v_p_oh_star(2)
part_temp%v(2) = -sin_alpha*v_p_oh_star(1)+cos_alpha*v_p_oh_star(2) part_temp%v(2) = -sin_alpha*v_p_oh_star(1)+cos_alpha*v_p_oh_star(2)
part_temp%n_in = .FALSE. !Assume particle is outside until cell is found
!Copy temporal particle to particle !Copy temporal particle to particle
part=part_temp part=part_temp
END SUBROUTINE push1DRadNeutral END SUBROUTINE push1DRadNeutral
!Push one particle. Boris pusher for 1D Radial Charged particle !Push one particle. Boris pusher for 1D Radial Electrostatic particle
PURE SUBROUTINE push1DRadCharged(part, tauIn) PURE SUBROUTINE push1DRadElectrostatic(part, tauIn)
USE moduleSpecies USE moduleSpecies
USE moduleEM USE moduleEM
IMPLICIT NONE IMPLICIT NONE
@ -463,7 +381,7 @@ MODULE moduleSolver
part_temp = part part_temp = part
!Get electric field at particle position !Get electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauMin qmEFt = part_temp%species%qm*gatherElecField(part_temp)*tauMin
!r,theta !r,theta
v_p_oh_star(1) = part%v(1) + qmEFt(1) v_p_oh_star(1) = part%v(1) + qmEFt(1)
x_new = part%r(1) + v_p_oh_star(1)*tauIn x_new = part%r(1) + v_p_oh_star(1)*tauIn
@ -480,11 +398,11 @@ MODULE moduleSolver
END IF END IF
part_temp%v(1) = cos_alpha*v_p_oh_star(1)+sin_alpha*v_p_oh_star(2) part_temp%v(1) = cos_alpha*v_p_oh_star(1)+sin_alpha*v_p_oh_star(2)
part_temp%v(2) = -sin_alpha*v_p_oh_star(1)+cos_alpha*v_p_oh_star(2) part_temp%v(2) = -sin_alpha*v_p_oh_star(1)+cos_alpha*v_p_oh_star(2)
part_temp%n_in = .FALSE. !Assume particle is outside until cell is found
!Copy temporal particle to particle !Copy temporal particle to particle
part=part_temp part=part_temp
END SUBROUTINE push1DRadCharged END SUBROUTINE push1DRadElectrostatic
!Dummy pusher for 0D geometry !Dummy pusher for 0D geometry
PURE SUBROUTINE push0D(part, tauIn) PURE SUBROUTINE push0D(part, tauIn)
@ -539,6 +457,7 @@ MODULE moduleSolver
INTEGER, SAVE:: nPartNew INTEGER, SAVE:: nPartNew
INTEGER, SAVE:: nInjIn, nOldIn, nWScheme, nCollisions, nSurfaces INTEGER, SAVE:: nInjIn, nOldIn, nWScheme, nCollisions, nSurfaces
TYPE(particle), ALLOCATABLE, SAVE:: partTemp(:) TYPE(particle), ALLOCATABLE, SAVE:: partTemp(:)
INTEGER:: s
!$OMP SECTIONS !$OMP SECTIONS
!$OMP SECTION !$OMP SECTION
@ -622,18 +541,30 @@ MODULE moduleSolver
END DO END DO
!$OMP SECTION !$OMP SECTION
!Erase the list of particles inside the cell !Erase the list of particles inside the cell if particles have been pushed
DO s = 1, nSpecies
DO e = 1, mesh%numVols DO e = 1, mesh%numVols
mesh%vols(e)%obj%totalWeight = 0.D0 IF (solver%pusher(s)%pushSpecies) THEN
CALL mesh%vols(e)%obj%listPart_in%erase() CALL mesh%vols(e)%obj%listPart_in(s)%erase()
mesh%vols(e)%obj%totalWeight(s) = 0.D0
END IF
END DO
END DO END DO
!$OMP SECTION !$OMP SECTION
!Erase the list of particles inside the cell in coll mesh !Erase the list of particles inside the cell in coll mesh
DO s = 1, nSpecies
DO e = 1, meshColl%numVols DO e = 1, meshColl%numVols
meshColl%vols(e)%obj%totalWeight = 0.D0 IF (solver%pusher(s)%pushSpecies) THEN
CALL meshColl%vols(e)%obj%listPart_in%erase() CALL meshColl%vols(e)%obj%listPart_in(s)%erase()
meshColl%vols(e)%obj%totalWeight(s) = 0.D0
END IF
END DO
END DO END DO
@ -655,7 +586,7 @@ MODULE moduleSolver
!Loops over the particles to scatter them !Loops over the particles to scatter them
!$OMP DO !$OMP DO
DO n=1, nPartOld DO n = 1, nPartOld
CALL mesh%vols(partOld(n)%vol)%obj%scatter(partOld(n)) CALL mesh%vols(partOld(n)%vol)%obj%scatter(partOld(n))
END DO END DO
@ -767,6 +698,7 @@ MODULE moduleSolver
REAL(8):: newWeight REAL(8):: newWeight
TYPE(particle), POINTER:: newPart TYPE(particle), POINTER:: newPart
INTEGER:: p INTEGER:: p
INTEGER:: sp
newWeight = part%weight / nSplit newWeight = part%weight / nSplit
@ -779,12 +711,14 @@ MODULE moduleSolver
ALLOCATE(newPart) ALLOCATE(newPart)
!Copy data from original particle !Copy data from original particle
newPart = part newPart = part
!Add particle to list of new particles from weighting scheme
CALL OMP_SET_LOCK(lockWScheme) CALL OMP_SET_LOCK(lockWScheme)
CALL partWScheme%add(newPart) CALL partWScheme%add(newPart)
CALL OMP_UNSET_LOCK(lockWScheme) CALL OMP_UNSET_LOCK(lockWScheme)
!Add particle to cell list !Add particle to cell list
CALL OMP_SET_lock(vol%lock) CALL OMP_SET_lock(vol%lock)
CALL vol%listPart_in%add(newPart) sp = part%species%n
CALL vol%listPart_in(sp)%add(newPart)
CALL OMP_UNSET_lock(vol%lock) CALL OMP_UNSET_lock(vol%lock)
END DO END DO
@ -800,6 +734,9 @@ MODULE moduleSolver
TYPE(particle), INTENT(inout):: part TYPE(particle), INTENT(inout):: part
CLASS(meshVol), POINTER:: volOld, volNew CLASS(meshVol), POINTER:: volOld, volNew
!Assume that particle is outside the domain
part%n_in = .FALSE.
volOld => mesh%vols(part%vol)%obj volOld => mesh%vols(part%vol)%obj
CALL volOld%findCell(part) CALL volOld%findCell(part)
CALL findCellColl(part) CALL findCellColl(part)

View file

@ -6,7 +6,7 @@ MODULE moduleSpecies
TYPE, ABSTRACT:: speciesGeneric TYPE, ABSTRACT:: speciesGeneric
CHARACTER(:), ALLOCATABLE:: name CHARACTER(:), ALLOCATABLE:: name
REAL(8):: m=0.D0, weight=0.D0 REAL(8):: m=0.D0, weight=0.D0, qm=0.D0
INTEGER:: n=0 INTEGER:: n=0
END TYPE speciesGeneric END TYPE speciesGeneric
@ -18,7 +18,7 @@ MODULE moduleSpecies
END TYPE speciesNeutral END TYPE speciesNeutral
TYPE, EXTENDS(speciesGeneric):: speciesCharged TYPE, EXTENDS(speciesGeneric):: speciesCharged
REAL(8):: q=0.D0, qm=0.D0 REAL(8):: q=0.D0
CLASS(speciesGeneric), POINTER:: ion => NULL(), neutral => NULL() CLASS(speciesGeneric), POINTER:: ion => NULL(), neutral => NULL()
CONTAINS CONTAINS
PROCEDURE, PASS:: ionize => ionizeCharged PROCEDURE, PASS:: ionize => ionizeCharged
@ -43,7 +43,6 @@ MODULE moduleSpecies
REAL(8):: xi(1:3) !Logical coordinates of particle in element e_p. REAL(8):: xi(1:3) !Logical coordinates of particle in element e_p.
LOGICAL:: n_in !Flag that indicates if a particle is in the domain LOGICAL:: n_in !Flag that indicates if a particle is in the domain
REAL(8):: weight=0.D0 !weight of particle REAL(8):: weight=0.D0 !weight of particle
REAL(8):: qm = 0.D0 !charge over mass
END TYPE particle END TYPE particle
@ -91,7 +90,7 @@ MODULE moduleSpecies
part%species => self%ion part%species => self%ion
ELSE ELSE
CALL criticalError('No ion defined for species' // self%name, 'ionizeNeutral') CALL criticalError('No ion defined for species :' // self%name, 'ionizeNeutral')
END IF END IF
@ -109,7 +108,7 @@ MODULE moduleSpecies
part%species => self%ion part%species => self%ion
ELSE ELSE
CALL criticalError('No ion defined for species' // self%name, 'ionizeCharged') CALL criticalError('No ion defined for species :' // self%name, 'ionizeCharged')
END IF END IF