Merge branch 'development' into 'master'

Development

See merge request JorgeGonz/fpakc!2
This commit is contained in:
Jorge Gonzalez 2021-01-20 15:09:58 +00:00
commit 3bb5ecd06e
51 changed files with 25131 additions and 1817 deletions

View file

@ -13,8 +13,36 @@ The codefpakc makes use of finite elements to generate meshes in complex geometr
# User Manual
You will find the user manual in the *doc* folder.
You will find the user manual in the *doc/user-manual/* folder. It contains information about the installation of fpkac, how to run the software, the example cases distributed with the code and how the code operates.
# Installation
To install the software ...
Once you have been added to the fpakc gitlab repository, and have added an ssh key to your account, you will be able to clone the repository using:
```
git clone git@gitlab.com:<YourGitLabUsername>/fpakc.git
```
in which you have to substitute `<YourGitLabUsername>` for your gitlab username.
Go into the new downloaded directory with
```
cd fpakc
```
Clone the json-fortran repository with:
```
git clone https://github.com/jacobwilliams/json-fortran.git
```
This will create the `json-fortran-8.2.0` directory. Go into this new folder and create a new `build-gfortran` directory, enter it and execute:
```
cmake ../
```
Once it finish, just compile the json-fortran library with
```
make
```
This creates the `include` and `lib` folders that contain the required files for fpakc compilation.
Go back to the fpakc root folder and execute
```
make
```
to compile the code. If everything is correct, an executable named `fpakc` will be generated.

View file

@ -1,302 +0,0 @@
# A. V. Phelps et. al, J. Phys. B, 33(2000) 2965-2981
# Relative energy (eV) cross section (m^2)
0.010 1.325E-17
0.020 1.004E-17
0.030 8.538E-18
0.040 7.610E-18
0.050 6.960E-18
0.060 6.471E-18
0.070 6.084E-18
0.080 5.767E-18
0.090 5.502E-18
0.100 5.275E-18
0.110 5.078E-18
0.120 4.904E-18
0.130 4.749E-18
0.140 4.611E-18
0.150 4.485E-18
0.160 4.371E-18
0.170 4.266E-18
0.180 4.170E-18
0.190 4.081E-18
0.200 3.998E-18
0.210 3.921E-18
0.220 3.848E-18
0.230 3.780E-18
0.240 3.717E-18
0.250 3.656E-18
0.260 3.600E-18
0.270 3.546E-18
0.280 3.494E-18
0.290 3.446E-18
0.300 3.399E-18
0.310 3.355E-18
0.320 3.313E-18
0.330 3.272E-18
0.340 3.233E-18
0.350 3.196E-18
0.360 3.160E-18
0.370 3.126E-18
0.380 3.093E-18
0.390 3.061E-18
0.400 3.030E-18
0.410 3.000E-18
0.420 2.971E-18
0.430 2.944E-18
0.440 2.917E-18
0.450 2.891E-18
0.460 2.865E-18
0.470 2.841E-18
0.480 2.817E-18
0.490 2.794E-18
0.500 2.771E-18
0.510 2.750E-18
0.520 2.728E-18
0.530 2.708E-18
0.540 2.688E-18
0.550 2.668E-18
0.560 2.649E-18
0.570 2.630E-18
0.580 2.612E-18
0.590 2.594E-18
0.600 2.577E-18
0.610 2.560E-18
0.620 2.543E-18
0.630 2.527E-18
0.640 2.511E-18
0.650 2.496E-18
0.660 2.480E-18
0.670 2.466E-18
0.680 2.451E-18
0.690 2.437E-18
0.700 2.423E-18
0.710 2.409E-18
0.720 2.396E-18
0.730 2.383E-18
0.740 2.370E-18
0.750 2.357E-18
0.760 2.345E-18
0.770 2.332E-18
0.780 2.320E-18
0.790 2.309E-18
0.800 2.297E-18
0.810 2.286E-18
0.820 2.275E-18
0.830 2.264E-18
0.840 2.253E-18
0.850 2.242E-18
0.860 2.232E-18
0.870 2.221E-18
0.880 2.211E-18
0.890 2.201E-18
0.900 2.192E-18
0.910 2.182E-18
0.920 2.173E-18
0.930 2.163E-18
0.940 2.154E-18
0.950 2.145E-18
0.960 2.136E-18
0.970 2.127E-18
0.980 2.118E-18
0.990 2.110E-18
1.000 2.101E-18
1.010 2.093E-18
1.020 2.085E-18
1.030 2.077E-18
1.040 2.069E-18
1.050 2.061E-18
1.060 2.053E-18
1.070 2.046E-18
1.080 2.038E-18
1.090 2.031E-18
1.100 2.023E-18
1.110 2.016E-18
1.120 2.009E-18
1.130 2.002E-18
1.140 1.995E-18
1.150 1.988E-18
1.160 1.981E-18
1.170 1.974E-18
1.180 1.967E-18
1.190 1.961E-18
1.200 1.954E-18
1.210 1.948E-18
1.220 1.941E-18
1.230 1.935E-18
1.240 1.929E-18
1.250 1.923E-18
1.260 1.917E-18
1.270 1.911E-18
1.280 1.905E-18
1.290 1.899E-18
1.300 1.893E-18
1.310 1.887E-18
1.320 1.882E-18
1.330 1.876E-18
1.340 1.870E-18
1.350 1.865E-18
1.360 1.859E-18
1.370 1.854E-18
1.380 1.849E-18
1.390 1.843E-18
1.400 1.838E-18
1.410 1.833E-18
1.420 1.828E-18
1.430 1.823E-18
1.440 1.818E-18
1.450 1.813E-18
1.460 1.808E-18
1.470 1.803E-18
1.480 1.798E-18
1.490 1.793E-18
1.500 1.788E-18
1.510 1.784E-18
1.520 1.779E-18
1.530 1.774E-18
1.540 1.770E-18
1.550 1.765E-18
1.560 1.761E-18
1.570 1.756E-18
1.580 1.752E-18
1.590 1.748E-18
1.600 1.743E-18
1.610 1.739E-18
1.620 1.735E-18
1.630 1.730E-18
1.640 1.726E-18
1.650 1.722E-18
1.660 1.718E-18
1.670 1.714E-18
1.680 1.710E-18
1.690 1.706E-18
1.700 1.702E-18
1.710 1.698E-18
1.720 1.694E-18
1.730 1.690E-18
1.740 1.686E-18
1.750 1.682E-18
1.760 1.679E-18
1.770 1.675E-18
1.780 1.671E-18
1.790 1.667E-18
1.800 1.664E-18
1.810 1.660E-18
1.820 1.657E-18
1.830 1.653E-18
1.840 1.649E-18
1.850 1.646E-18
1.860 1.642E-18
1.870 1.639E-18
1.880 1.635E-18
1.890 1.632E-18
1.900 1.629E-18
1.910 1.625E-18
1.920 1.622E-18
1.930 1.619E-18
1.940 1.615E-18
1.950 1.612E-18
1.960 1.609E-18
1.970 1.606E-18
1.980 1.602E-18
1.990 1.599E-18
2.000 1.596E-18
2.010 1.593E-18
2.020 1.590E-18
2.030 1.587E-18
2.040 1.584E-18
2.050 1.581E-18
2.060 1.578E-18
2.070 1.574E-18
2.080 1.572E-18
2.090 1.569E-18
2.100 1.566E-18
2.110 1.563E-18
2.120 1.560E-18
2.130 1.557E-18
2.140 1.554E-18
2.150 1.551E-18
2.160 1.548E-18
2.170 1.546E-18
2.180 1.543E-18
2.190 1.540E-18
2.200 1.537E-18
2.210 1.534E-18
2.220 1.532E-18
2.230 1.529E-18
2.240 1.526E-18
2.250 1.524E-18
2.260 1.521E-18
2.270 1.518E-18
2.280 1.516E-18
2.290 1.513E-18
2.300 1.511E-18
2.310 1.508E-18
2.320 1.505E-18
2.330 1.503E-18
2.340 1.500E-18
2.350 1.498E-18
2.360 1.495E-18
2.370 1.493E-18
2.380 1.490E-18
2.390 1.488E-18
2.400 1.486E-18
2.410 1.483E-18
2.420 1.481E-18
2.430 1.478E-18
2.440 1.476E-18
2.450 1.474E-18
2.460 1.471E-18
2.470 1.469E-18
2.480 1.467E-18
2.490 1.464E-18
2.500 1.462E-18
2.510 1.460E-18
2.520 1.457E-18
2.530 1.455E-18
2.540 1.453E-18
2.550 1.451E-18
2.560 1.448E-18
2.570 1.446E-18
2.580 1.444E-18
2.590 1.442E-18
2.600 1.440E-18
2.610 1.438E-18
2.620 1.435E-18
2.630 1.433E-18
2.640 1.431E-18
2.650 1.429E-18
2.660 1.427E-18
2.670 1.425E-18
2.680 1.423E-18
2.690 1.421E-18
2.700 1.419E-18
2.710 1.417E-18
2.720 1.415E-18
2.730 1.413E-18
2.740 1.411E-18
2.750 1.409E-18
2.760 1.407E-18
2.770 1.405E-18
2.780 1.403E-18
2.790 1.401E-18
2.800 1.399E-18
2.810 1.397E-18
2.820 1.395E-18
2.830 1.393E-18
2.840 1.391E-18
2.850 1.389E-18
2.860 1.387E-18
2.870 1.385E-18
2.880 1.383E-18
2.890 1.382E-18
2.900 1.380E-18
2.910 1.378E-18
2.920 1.376E-18
2.930 1.374E-18
2.940 1.372E-18
2.950 1.371E-18
2.960 1.369E-18
2.970 1.367E-18
2.980 1.365E-18
2.990 1.364E-18
3.000 1.362E-18

View file

@ -0,0 +1,302 @@
#M. Lampe, et. al, Phys. Plasmas, 19(11):113703, 2012
#Relative energy (eV) Cross Section (m^2)
0.010 6.913E-19
0.020 6.705E-19
0.030 6.583E-19
0.040 6.497E-19
0.050 6.430E-19
0.060 6.375E-19
0.070 6.329E-19
0.080 6.288E-19
0.090 6.253E-19
0.100 6.221E-19
0.110 6.193E-19
0.120 6.167E-19
0.130 6.143E-19
0.140 6.120E-19
0.150 6.100E-19
0.160 6.080E-19
0.170 6.062E-19
0.180 6.045E-19
0.190 6.029E-19
0.200 6.013E-19
0.210 5.999E-19
0.220 5.985E-19
0.230 5.971E-19
0.240 5.959E-19
0.250 5.946E-19
0.260 5.934E-19
0.270 5.923E-19
0.280 5.912E-19
0.290 5.902E-19
0.300 5.892E-19
0.310 5.882E-19
0.320 5.872E-19
0.330 5.863E-19
0.340 5.854E-19
0.350 5.845E-19
0.360 5.837E-19
0.370 5.829E-19
0.380 5.821E-19
0.390 5.813E-19
0.400 5.805E-19
0.410 5.798E-19
0.420 5.790E-19
0.430 5.783E-19
0.440 5.777E-19
0.450 5.770E-19
0.460 5.763E-19
0.470 5.757E-19
0.480 5.750E-19
0.490 5.744E-19
0.500 5.738E-19
0.510 5.732E-19
0.520 5.726E-19
0.530 5.721E-19
0.540 5.715E-19
0.550 5.710E-19
0.560 5.704E-19
0.570 5.699E-19
0.580 5.694E-19
0.590 5.688E-19
0.600 5.683E-19
0.610 5.678E-19
0.620 5.674E-19
0.630 5.669E-19
0.640 5.664E-19
0.650 5.659E-19
0.660 5.655E-19
0.670 5.650E-19
0.680 5.646E-19
0.690 5.641E-19
0.700 5.637E-19
0.710 5.633E-19
0.720 5.629E-19
0.730 5.625E-19
0.740 5.620E-19
0.750 5.616E-19
0.760 5.612E-19
0.770 5.608E-19
0.780 5.605E-19
0.790 5.601E-19
0.800 5.597E-19
0.810 5.593E-19
0.820 5.590E-19
0.830 5.586E-19
0.840 5.582E-19
0.850 5.579E-19
0.860 5.575E-19
0.870 5.572E-19
0.880 5.568E-19
0.890 5.565E-19
0.900 5.562E-19
0.910 5.558E-19
0.920 5.555E-19
0.930 5.552E-19
0.940 5.549E-19
0.950 5.545E-19
0.960 5.542E-19
0.970 5.539E-19
0.980 5.536E-19
0.990 5.533E-19
1.000 5.530E-19
1.010 5.527E-19
1.020 5.524E-19
1.030 5.521E-19
1.040 5.518E-19
1.050 5.515E-19
1.060 5.513E-19
1.070 5.510E-19
1.080 5.507E-19
1.090 5.504E-19
1.100 5.501E-19
1.110 5.499E-19
1.120 5.496E-19
1.130 5.493E-19
1.140 5.491E-19
1.150 5.488E-19
1.160 5.485E-19
1.170 5.483E-19
1.180 5.480E-19
1.190 5.478E-19
1.200 5.475E-19
1.210 5.473E-19
1.220 5.470E-19
1.230 5.468E-19
1.240 5.465E-19
1.250 5.463E-19
1.260 5.461E-19
1.270 5.458E-19
1.280 5.456E-19
1.290 5.454E-19
1.300 5.451E-19
1.310 5.449E-19
1.320 5.447E-19
1.330 5.444E-19
1.340 5.442E-19
1.350 5.440E-19
1.360 5.438E-19
1.370 5.435E-19
1.380 5.433E-19
1.390 5.431E-19
1.400 5.429E-19
1.410 5.427E-19
1.420 5.425E-19
1.430 5.423E-19
1.440 5.421E-19
1.450 5.418E-19
1.460 5.416E-19
1.470 5.414E-19
1.480 5.412E-19
1.490 5.410E-19
1.500 5.408E-19
1.510 5.406E-19
1.520 5.404E-19
1.530 5.402E-19
1.540 5.400E-19
1.550 5.398E-19
1.560 5.396E-19
1.570 5.395E-19
1.580 5.393E-19
1.590 5.391E-19
1.600 5.389E-19
1.610 5.387E-19
1.620 5.385E-19
1.630 5.383E-19
1.640 5.381E-19
1.650 5.380E-19
1.660 5.378E-19
1.670 5.376E-19
1.680 5.374E-19
1.690 5.372E-19
1.700 5.371E-19
1.710 5.369E-19
1.720 5.367E-19
1.730 5.365E-19
1.740 5.364E-19
1.750 5.362E-19
1.760 5.360E-19
1.770 5.359E-19
1.780 5.357E-19
1.790 5.355E-19
1.800 5.354E-19
1.810 5.352E-19
1.820 5.350E-19
1.830 5.349E-19
1.840 5.347E-19
1.850 5.345E-19
1.860 5.344E-19
1.870 5.342E-19
1.880 5.340E-19
1.890 5.339E-19
1.900 5.337E-19
1.910 5.336E-19
1.920 5.334E-19
1.930 5.333E-19
1.940 5.331E-19
1.950 5.329E-19
1.960 5.328E-19
1.970 5.326E-19
1.980 5.325E-19
1.990 5.323E-19
2.000 5.322E-19
2.010 5.320E-19
2.020 5.319E-19
2.030 5.317E-19
2.040 5.316E-19
2.050 5.314E-19
2.060 5.313E-19
2.070 5.312E-19
2.080 5.310E-19
2.090 5.309E-19
2.100 5.307E-19
2.110 5.306E-19
2.120 5.304E-19
2.130 5.303E-19
2.140 5.302E-19
2.150 5.300E-19
2.160 5.299E-19
2.170 5.297E-19
2.180 5.296E-19
2.190 5.295E-19
2.200 5.293E-19
2.210 5.292E-19
2.220 5.291E-19
2.230 5.289E-19
2.240 5.288E-19
2.250 5.286E-19
2.260 5.285E-19
2.270 5.284E-19
2.280 5.283E-19
2.290 5.281E-19
2.300 5.280E-19
2.310 5.279E-19
2.320 5.277E-19
2.330 5.276E-19
2.340 5.275E-19
2.350 5.273E-19
2.360 5.272E-19
2.370 5.271E-19
2.380 5.270E-19
2.390 5.268E-19
2.400 5.267E-19
2.410 5.266E-19
2.420 5.265E-19
2.430 5.263E-19
2.440 5.262E-19
2.450 5.261E-19
2.460 5.260E-19
2.470 5.258E-19
2.480 5.257E-19
2.490 5.256E-19
2.500 5.255E-19
2.510 5.254E-19
2.520 5.252E-19
2.530 5.251E-19
2.540 5.250E-19
2.550 5.249E-19
2.560 5.248E-19
2.570 5.247E-19
2.580 5.245E-19
2.590 5.244E-19
2.600 5.243E-19
2.610 5.242E-19
2.620 5.241E-19
2.630 5.240E-19
2.640 5.238E-19
2.650 5.237E-19
2.660 5.236E-19
2.670 5.235E-19
2.680 5.234E-19
2.690 5.233E-19
2.700 5.232E-19
2.710 5.231E-19
2.720 5.230E-19
2.730 5.228E-19
2.740 5.227E-19
2.750 5.226E-19
2.760 5.225E-19
2.770 5.224E-19
2.780 5.223E-19
2.790 5.222E-19
2.800 5.221E-19
2.810 5.220E-19
2.820 5.219E-19
2.830 5.218E-19
2.840 5.217E-19
2.850 5.216E-19
2.860 5.214E-19
2.870 5.213E-19
2.880 5.212E-19
2.890 5.211E-19
2.900 5.210E-19
2.910 5.209E-19
2.920 5.208E-19
2.930 5.207E-19
2.940 5.206E-19
2.950 5.205E-19
2.960 5.204E-19
2.970 5.203E-19
2.980 5.202E-19
2.990 5.201E-19
3.000 5.200E-19

View file

@ -0,0 +1,302 @@
# A. V. Phelps et. al, J. Phys. B, 33(2000) 2965-2981
# Relative energy (eV) cross section (m^2)
0.010 1.325E-17
0.020 1.004E-17
0.030 8.538E-18
0.040 7.610E-18
0.050 6.960E-18
0.060 6.471E-18
0.070 6.084E-18
0.080 5.767E-18
0.090 5.502E-18
0.100 5.275E-18
0.110 5.078E-18
0.120 4.904E-18
0.130 4.749E-18
0.140 4.611E-18
0.150 4.485E-18
0.160 4.371E-18
0.170 4.266E-18
0.180 4.170E-18
0.190 4.081E-18
0.200 3.998E-18
0.210 3.921E-18
0.220 3.848E-18
0.230 3.780E-18
0.240 3.717E-18
0.250 3.656E-18
0.260 3.600E-18
0.270 3.546E-18
0.280 3.494E-18
0.290 3.446E-18
0.300 3.399E-18
0.310 3.355E-18
0.320 3.313E-18
0.330 3.272E-18
0.340 3.233E-18
0.350 3.196E-18
0.360 3.160E-18
0.370 3.126E-18
0.380 3.093E-18
0.390 3.061E-18
0.400 3.030E-18
0.410 3.000E-18
0.420 2.971E-18
0.430 2.944E-18
0.440 2.917E-18
0.450 2.891E-18
0.460 2.865E-18
0.470 2.841E-18
0.480 2.817E-18
0.490 2.794E-18
0.500 2.771E-18
0.510 2.750E-18
0.520 2.728E-18
0.530 2.708E-18
0.540 2.688E-18
0.550 2.668E-18
0.560 2.649E-18
0.570 2.630E-18
0.580 2.612E-18
0.590 2.594E-18
0.600 2.577E-18
0.610 2.560E-18
0.620 2.543E-18
0.630 2.527E-18
0.640 2.511E-18
0.650 2.496E-18
0.660 2.480E-18
0.670 2.466E-18
0.680 2.451E-18
0.690 2.437E-18
0.700 2.423E-18
0.710 2.409E-18
0.720 2.396E-18
0.730 2.383E-18
0.740 2.370E-18
0.750 2.357E-18
0.760 2.345E-18
0.770 2.332E-18
0.780 2.320E-18
0.790 2.309E-18
0.800 2.297E-18
0.810 2.286E-18
0.820 2.275E-18
0.830 2.264E-18
0.840 2.253E-18
0.850 2.242E-18
0.860 2.232E-18
0.870 2.221E-18
0.880 2.211E-18
0.890 2.201E-18
0.900 2.192E-18
0.910 2.182E-18
0.920 2.173E-18
0.930 2.163E-18
0.940 2.154E-18
0.950 2.145E-18
0.960 2.136E-18
0.970 2.127E-18
0.980 2.118E-18
0.990 2.110E-18
1.000 2.101E-18
1.010 2.093E-18
1.020 2.085E-18
1.030 2.077E-18
1.040 2.069E-18
1.050 2.061E-18
1.060 2.053E-18
1.070 2.046E-18
1.080 2.038E-18
1.090 2.031E-18
1.100 2.023E-18
1.110 2.016E-18
1.120 2.009E-18
1.130 2.002E-18
1.140 1.995E-18
1.150 1.988E-18
1.160 1.981E-18
1.170 1.974E-18
1.180 1.967E-18
1.190 1.961E-18
1.200 1.954E-18
1.210 1.948E-18
1.220 1.941E-18
1.230 1.935E-18
1.240 1.929E-18
1.250 1.923E-18
1.260 1.917E-18
1.270 1.911E-18
1.280 1.905E-18
1.290 1.899E-18
1.300 1.893E-18
1.310 1.887E-18
1.320 1.882E-18
1.330 1.876E-18
1.340 1.870E-18
1.350 1.865E-18
1.360 1.859E-18
1.370 1.854E-18
1.380 1.849E-18
1.390 1.843E-18
1.400 1.838E-18
1.410 1.833E-18
1.420 1.828E-18
1.430 1.823E-18
1.440 1.818E-18
1.450 1.813E-18
1.460 1.808E-18
1.470 1.803E-18
1.480 1.798E-18
1.490 1.793E-18
1.500 1.788E-18
1.510 1.784E-18
1.520 1.779E-18
1.530 1.774E-18
1.540 1.770E-18
1.550 1.765E-18
1.560 1.761E-18
1.570 1.756E-18
1.580 1.752E-18
1.590 1.748E-18
1.600 1.743E-18
1.610 1.739E-18
1.620 1.735E-18
1.630 1.730E-18
1.640 1.726E-18
1.650 1.722E-18
1.660 1.718E-18
1.670 1.714E-18
1.680 1.710E-18
1.690 1.706E-18
1.700 1.702E-18
1.710 1.698E-18
1.720 1.694E-18
1.730 1.690E-18
1.740 1.686E-18
1.750 1.682E-18
1.760 1.679E-18
1.770 1.675E-18
1.780 1.671E-18
1.790 1.667E-18
1.800 1.664E-18
1.810 1.660E-18
1.820 1.657E-18
1.830 1.653E-18
1.840 1.649E-18
1.850 1.646E-18
1.860 1.642E-18
1.870 1.639E-18
1.880 1.635E-18
1.890 1.632E-18
1.900 1.629E-18
1.910 1.625E-18
1.920 1.622E-18
1.930 1.619E-18
1.940 1.615E-18
1.950 1.612E-18
1.960 1.609E-18
1.970 1.606E-18
1.980 1.602E-18
1.990 1.599E-18
2.000 1.596E-18
2.010 1.593E-18
2.020 1.590E-18
2.030 1.587E-18
2.040 1.584E-18
2.050 1.581E-18
2.060 1.578E-18
2.070 1.574E-18
2.080 1.572E-18
2.090 1.569E-18
2.100 1.566E-18
2.110 1.563E-18
2.120 1.560E-18
2.130 1.557E-18
2.140 1.554E-18
2.150 1.551E-18
2.160 1.548E-18
2.170 1.546E-18
2.180 1.543E-18
2.190 1.540E-18
2.200 1.537E-18
2.210 1.534E-18
2.220 1.532E-18
2.230 1.529E-18
2.240 1.526E-18
2.250 1.524E-18
2.260 1.521E-18
2.270 1.518E-18
2.280 1.516E-18
2.290 1.513E-18
2.300 1.511E-18
2.310 1.508E-18
2.320 1.505E-18
2.330 1.503E-18
2.340 1.500E-18
2.350 1.498E-18
2.360 1.495E-18
2.370 1.493E-18
2.380 1.490E-18
2.390 1.488E-18
2.400 1.486E-18
2.410 1.483E-18
2.420 1.481E-18
2.430 1.478E-18
2.440 1.476E-18
2.450 1.474E-18
2.460 1.471E-18
2.470 1.469E-18
2.480 1.467E-18
2.490 1.464E-18
2.500 1.462E-18
2.510 1.460E-18
2.520 1.457E-18
2.530 1.455E-18
2.540 1.453E-18
2.550 1.451E-18
2.560 1.448E-18
2.570 1.446E-18
2.580 1.444E-18
2.590 1.442E-18
2.600 1.440E-18
2.610 1.438E-18
2.620 1.435E-18
2.630 1.433E-18
2.640 1.431E-18
2.650 1.429E-18
2.660 1.427E-18
2.670 1.425E-18
2.680 1.423E-18
2.690 1.421E-18
2.700 1.419E-18
2.710 1.417E-18
2.720 1.415E-18
2.730 1.413E-18
2.740 1.411E-18
2.750 1.409E-18
2.760 1.407E-18
2.770 1.405E-18
2.780 1.403E-18
2.790 1.401E-18
2.800 1.399E-18
2.810 1.397E-18
2.820 1.395E-18
2.830 1.393E-18
2.840 1.391E-18
2.850 1.389E-18
2.860 1.387E-18
2.870 1.385E-18
2.880 1.383E-18
2.890 1.382E-18
2.900 1.380E-18
2.910 1.378E-18
2.920 1.376E-18
2.930 1.374E-18
2.940 1.372E-18
2.950 1.371E-18
2.960 1.369E-18
2.970 1.367E-18
2.980 1.365E-18
2.990 1.364E-18
3.000 1.362E-18

View file

@ -0,0 +1,34 @@
# H. C. Straub et. al, Physical Review A, 55,2(1995)
# Relative energy (eV) cross section (m^2)
17 1.700E-22
20 4.600E-21
25 1.240E-20
30 1.840E-20
35 2.260E-20
40 2.550E-20
45 2.660E-20
50 2.700E-20
55 2.690E-20
60 2.670E-20
65 2.670E-20
70 2.670E-20
75 2.660E-20
80 2.690E-20
85 2.700E-20
90 2.690E-20
95 2.670E-20
100 2.640E-20
110 2.610E-20
120 2.550E-20
140 2.450E-20
160 2.350E-20
180 2.270E-20
200 2.180E-20
225 2.100E-20
250 1.990E-20
275 1.870E-20
300 1.790E-20
350 1.630E-20
400 1.510E-20
450 1.390E-20
500 1.310E-20

View file

@ -0,0 +1,213 @@
#Safdar Ali, Electron-ion recombination datafor plasma applications
#Relative energy (eV) Cross Section (m^2)
0.1 7.69985669590087E-19
0.5 1.53997083398333E-19
1.0 7.69985101243873E-20
1.5 5.13323190330893E-20
2.0 3.84992234874532E-20
2.5 3.07993661600819E-20
3.0 2.5666127941843E-20
3.5 2.19995292145369E-20
4.0 1.92495801690638E-20
4.5 1.71107309114794E-20
5.0 1.5399651505417E-20
5.5 1.39996774459162E-20
6.0 1.28330323963364E-20
6.5 1.18458712005422E-20
7.0 1.09997330327222E-20
7.5 1.02664132872817E-20
8.0 9.6247585100245E-21
8.5 9.05859253009472E-21
9.0 8.55533388127113E-21
9.5 8.10504982706327E-21
10.0 7.69979417827879E-21
10.5 7.33313430557148E-21
11.0 6.9998071485672E-21
11.5 6.69546496173945E-21
12.0 6.41648462381617E-21
12.5 6.15982271292883E-21
13.0 5.92290402595789E-21
13.5 5.70353487135708E-21
14.0 5.49983494208675E-21
14.5 5.31018328380238E-21
15.0 5.13317506940535E-21
15.5 4.9675867398098E-21
16.0 4.81234768081559E-21
16.5 4.66651704964078E-21
17.0 4.52926469088954E-21
17.5 4.39985532406842E-21
18.0 4.27763536651659E-21
18.5 4.16202189315814E-21
19.0 4.0524933394515E-21
19.5 3.94858163465422E-21
20.0 3.8498655150981E-21
20.5 3.75596481600939E-21
21.0 3.66653557878329E-21
21.5 3.58126584096425E-21
22.0 3.49987200031999E-21
22.5 3.42209566370551E-21
23.0 3.34770090694496E-21
23.5 3.27647188451574E-21
24.0 3.20821073802216E-21
24.5 3.14273576077427E-21
25.0 3.07987978261733E-21
25.5 3.01948874478129E-21
26.0 2.9614204391707E-21
26.5 2.90554339037659E-21
27.0 2.85173586190914E-21
27.5 2.79988497084145E-21
28.0 2.74988589731282E-21
28.5 2.70164117724224E-21
29.0 2.65506006820947E-21
29.5 2.61005797982276E-21
30.0 2.5665559610498E-21
30.5 2.52448023797516E-21
31.0 2.48376179629086E-21
31.5 2.44433600354975E-21
32.0 2.4061422668326E-21
32.5 2.36912372201524E-21
33.0 2.33322695128404E-21
33.5 2.29840172594857E-21
34.0 2.26460077194726E-21
34.5 2.23177955574384E-21
35.0 2.19989608857554E-21
35.5 2.1689107472437E-21
36.0 2.13878610983846E-21
36.5 2.10948680496559E-21
37.0 2.08097937319808E-21
37.5 2.05323213961173E-21
38.0 2.0262150963836E-21
38.5 1.99989979453869E-21
39.0 1.9742592440238E-21
39.5 1.94926782137071E-21
40.0 1.92490118428458E-21
40.5 1.90113619255925E-21
41.0 1.87795083477907E-21
41.5 1.85532416031952E-21
42.0 1.83323621620486E-21
42.5 1.81166798842292E-21
43.0 1.79060134733418E-21
43.5 1.77001899684578E-21
44.0 1.74990442705089E-21
44.5 1.73024187006096E-21
45.0 1.71101625878249E-21
45.5 1.69221318841181E-21
46.0 1.67381888044106E-21
46.5 1.65582014898636E-21
47.0 1.63820436926529E-21
47.5 1.62095944806521E-21
48.0 1.60407379605734E-21
48.5 1.58753630182336E-21
49.0 1.57133630747223E-21
49.5 1.55546358573478E-21
50.0 1.5399083184326E-21
50.5 1.52466107622603E-21
51.0 1.50971279955342E-21
51.5 1.49505478068078E-21
52.0 1.48067864678697E-21
52.5 1.46657634401543E-21
53.0 1.45274012242875E-21
53.5 1.43916252180679E-21
54.0 1.42583635823387E-21
54.5 1.41275471142422E-21
55.0 1.39991091273886E-21
55.5 1.3872985338501E-21
56.0 1.37491137601338E-21
56.5 1.36274345990875E-21
57.0 1.35078901601694E-21
57.5 1.3390424754976E-21
58.0 1.32749846153939E-21
58.5 1.31615178115356E-21
59.0 1.30499741738487E-21
59.5 1.29403052191526E-21
60.0 1.28324640803723E-21
60.5 1.2726405439758E-21
61.0 1.26220854653875E-21
61.5 1.25194617507671E-21
62.0 1.24184932573544E-21
62.5 1.23191402598405E-21
63.0 1.22213642940372E-21
63.5 1.21251281072271E-21
64.0 1.20303956108399E-21
64.5 1.19371318353309E-21
65.0 1.18453028871415E-21
65.5 1.17548759076306E-21
66.0 1.16658190338739E-21
66.5 1.15781013612301E-21
67.0 1.14916929075849E-21
67.5 1.14065645791827E-21
68.0 1.13226881379667E-21
68.5 1.12400361703489E-21
69.0 1.1158582057338E-21
69.5 1.10782999459569E-21
70.0 1.09991647218849E-21
70.5 1.09211519832644E-21
71.0 1.08442380156141E-21
71.5 1.07683997677947E-21
72.0 1.06936148289763E-21
72.5 1.0619861406559E-21
73.0 1.05471183050003E-21
73.5 1.04753649055071E-21
74.0 1.04045811465512E-21
74.5 1.03347475051685E-21
75.0 1.02658449790078E-21
75.5 1.0197855069091E-21
76.0 1.01307597632555E-21
76.5 1.00645415202448E-21
77.0 9.99918325441935E-22
77.5 9.93466832105953E-22
78.0 9.87098050223329E-22
78.5 9.8081039932043E-22
79.0 9.74602338935618E-22
79.5 9.68472367361003E-22
80.0 9.62419020431394E-22
80.5 9.56440870358376E-22
81.0 9.50536524607566E-22
81.5 9.44704624817207E-22
82.0 9.38943845756314E-22
82.5 9.33252894320715E-22
83.0 9.27630508565376E-22
83.5 9.22075456771488E-22
84.0 9.16586536546883E-22
84.5 9.11162573958379E-22
85.0 9.0580242269475E-22
85.5 9.00504963259068E-22
86.0 8.95269102189219E-22
86.5 8.90093771305448E-22
87.0 8.84977926983857E-22
87.5 8.79920549454808E-22
88.0 8.74920642125247E-22
88.5 8.69977230923997E-22
89.0 8.65089363669119E-22
89.5 8.60256109456484E-22
90.0 8.55476558068722E-22
90.5 8.50749819403762E-22
91.0 8.46075022922218E-22
91.5 8.41451317112887E-22
92.0 8.36877868975678E-22
92.5 8.32353863521313E-22
93.0 8.27878503287165E-22
93.5 8.23451007868634E-22
94.0 8.19070613465468E-22
94.5 8.14736572442504E-22
95.0 8.10448152904265E-22
95.5 8.06204638282927E-22
96.0 8.02005326939165E-22
96.5 7.978495317754E-22
97.0 7.93736579861012E-22
97.5 7.89665812069088E-22
98.0 7.85636582724286E-22
98.5 7.81648259261419E-22
99.0 7.77700221894398E-22
99.5 7.73791863295145E-22
100.0 7.69922588282143E-22
100.5 7.66091813518285E-22
101.0 7.62298967217692E-22
101.5 7.58543488861201E-22
102.0 7.54824828920225E-22
102.5 7.51142448588681E-22
103.0 7.47495819522743E-22
103.5 7.43884423588128E-22
104.0 7.4030775261467E-22
104.5 7.36765308157954E-22
105.0 7.33256601267738E-22

Binary file not shown.

21
doc/user-manual/.gitignore vendored Normal file
View file

@ -0,0 +1,21 @@
*.dvi
*.log
*.pdf
*.synctex.gz
*.toc
*.aux
*.ps
bibliography.bib.bak
*.bbl
*.blg
*.out
fpakc_UserManual-blx.bib
*.acn
*.acr
*.alg
*.bcf
*.glg
*.glo
*.gls
*.ist
fpakc_UserManual.run.xml

View file

@ -0,0 +1,44 @@
% Encoding: UTF-8
@InProceedings{boris1970relativistic,
author = {Boris, Jay P},
booktitle = {Proc. Fourth Conf. Num. Sim. Plasmas},
title = {Relativistic plasma simulation-optimization of a hybrid code},
year = {1970},
pages = {3--67},
}
@Misc{gfortranURL,
author = {GNU Project},
title = {gfortran - the GNU Fortran compiler},
howpublished = {\url{https://gcc.gnu.org/wiki/GFortran}},
}
@Misc{ifortURL,
author = {Intel\textsuperscript{\textregistered}},
title = {Intel\textsuperscript{\textregistered} Fortran Compiler},
howpublished = {\url{https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/fortran-compiler.html}},
}
@Misc{openblasURL,
title = {OpenBLAS, an optimized BLAS library},
howpublished = {\url{https://www.openblas.net/}},
}
@Misc{jsonfortranURL,
title = {JSON-Fortran},
howpublished = {\url{https://github.com/jacobwilliams/json-fortran}},
}
@Misc{jsonURL,
title = {JSON, JavaScript Object Notation},
howpublished = {\url{https://www.json.org/json-en.html}},
}
@Misc{gmshURL,
author = {Christophe Geuzaine and Jean-François Remacle},
title = {Gmsh},
howpublished = {\url{https://gmsh.info/}},
}
@Comment{jabref-meta: databaseType:bibtex;}

View file

@ -0,0 +1,177 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.16.0 (https://cairographics.org)
%%CreationDate: Wed Oct 07 12:01:13 2020
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 6 7 205 57
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 6 7 205 57
%%EndPageSetup
q 6 7 199 50 rectclip
1 0 0 -1 0 71 cm q
0 g
49.766 27.305 m 49.766 29.898 49.078 31.813 47.703 33.039 c 46.328 34.27
44.297 34.883 41.609 34.883 c 36.625 34.883 l 36.625 47.945 l 32.438 47.945
l 32.438 14.352 l 41.516 14.352 l 44.234 14.352 46.285 14.953 47.672 16.148
c 49.066 17.348 49.766 19.242 49.766 21.836 c h
45.594 21.398 m 45.594 20.18 45.313 19.301 44.75 18.758 c 44.195 18.219
43.313 17.945 42.094 17.945 c 36.625 17.945 l 36.625 31.289 l 42.094 31.289
l 43.313 31.289 44.195 31.008 44.75 30.445 c 45.313 29.883 45.594 29 45.594
27.789 c h
45.594 21.398 m f
75.641 27.305 m 75.641 29.898 74.953 31.813 73.578 33.039 c 72.203 34.27
70.172 34.883 67.484 34.883 c 62.5 34.883 l 62.5 47.945 l 58.313 47.945
l 58.313 14.352 l 67.391 14.352 l 70.109 14.352 72.16 14.953 73.547 16.148
c 74.941 17.348 75.641 19.242 75.641 21.836 c h
71.469 21.398 m 71.469 20.18 71.188 19.301 70.625 18.758 c 70.07 18.219
69.188 17.945 67.969 17.945 c 62.5 17.945 l 62.5 31.289 l 67.969 31.289
l 69.188 31.289 70.07 31.008 70.625 30.445 c 71.188 29.883 71.469 29 71.469
27.789 c h
71.469 21.398 m f
99.891 47.945 m 99.473 47.945 99.016 47.82 98.516 47.57 c 98.023 47.313
97.602 46.957 97.25 46.508 c 96.508 47.469 95.535 47.945 94.328 47.945
c 90.047 47.945 l 87.617 47.945 85.852 47.461 84.75 46.492 c 83.645 45.516
83.094 43.836 83.094 41.461 c 83.094 40.508 l 83.094 35.551 85.426 33.07
90.094 33.07 c 96.047 33.07 l 96.047 30.664 l 96.047 29.676 95.742 28.91
95.141 28.367 c 94.535 27.816 93.641 27.539 92.453 27.539 c 85.016 27.539
l 85.016 23.945 l 91.969 23.945 l 94.75 23.945 96.801 24.555 98.125 25.773
c 99.457 26.984 100.125 28.938 100.125 31.633 c 100.125 43.148 l 100.125
43.629 100.305 43.988 100.672 44.227 c 101.047 44.469 101.664 44.586 102.531
44.586 c 102.531 47.945 l h
93.844 44.352 m 94.801 44.352 95.406 44.129 95.656 43.68 c 95.914 43.234
96.047 42.656 96.047 41.945 c 96.047 36.664 l 90.047 36.664 l 89.211 36.664
88.523 36.941 87.984 37.492 c 87.441 38.035 87.172 38.719 87.172 39.539
c 87.172 41.945 l 87.172 42.781 87.363 43.391 87.75 43.773 c 88.133 44.16
88.742 44.352 89.578 44.352 c h
93.844 44.352 m f
114.047 44.352 m 114.047 27.539 l 110.547 27.539 l 110.547 23.945 l 117.891
23.945 l 117.891 25.242 l 118.953 24.379 120.234 23.945 121.734 23.945
c 126.672 23.945 l 126.672 27.789 l 121.25 27.789 l 120.227 27.789 119.461
28.117 118.953 28.773 c 118.441 29.43 118.172 30.094 118.141 30.758 c 118.141
44.352 l 123.359 44.352 l 123.359 47.945 l 110.547 47.945 l 110.547 44.352
l h
114.047 44.352 m f
146.359 47.945 m 144.723 47.945 143.473 47.422 142.609 46.367 c 141.754
45.305 141.328 43.91 141.328 42.18 c 141.328 27.539 l 136.766 27.539 l
136.766 23.945 l 141.328 23.945 l 141.328 18.18 l 145.406 18.18 l 145.406
23.945 l 152.406 23.945 l 152.406 27.539 l 145.406 27.539 l 145.406 42.43
l 145.406 43.129 145.578 43.625 145.922 43.914 c 146.273 44.207 146.82
44.352 147.563 44.352 c 152.406 44.352 l 152.406 47.945 l h
146.359 47.945 m f
172.719 14.352 m 172.719 18.664 l 168.156 18.664 l 168.156 14.352 l h
161.344 27.539 m 161.344 23.945 l 172.469 23.945 l 172.469 44.352 l 179.578
44.352 l 179.578 47.945 l 168.391 47.945 l 168.391 27.539 l h
161.344 27.539 m f
197.25 47.945 m 194.469 47.945 192.332 47.27 190.844 45.914 c 189.352 44.551
188.609 42.508 188.609 39.789 c 188.609 22.508 l 188.609 19.789 189.352
17.754 190.844 16.398 c 192.332 15.035 194.469 14.352 197.25 14.352 c 204.063
14.352 l 204.063 17.992 l 196.766 17.992 l 195.578 17.992 194.613 18.348
193.875 19.055 c 193.145 19.754 192.781 20.598 192.781 21.586 c 192.781
40.695 l 192.781 41.688 193.145 42.535 193.875 43.242 c 194.613 43.953
195.578 44.305 196.766 44.305 c 204.063 44.305 l 204.063 47.945 l h
197.25 47.945 m f
0.831373 0 0 rg
17.277 53.707 m 17.277 56.629 14.91 58.996 11.988 58.996 c 9.066 58.996
6.695 56.629 6.695 53.707 c 6.695 50.785 9.066 48.414 11.988 48.414 c 14.91
48.414 17.277 50.785 17.277 53.707 c f
0 0 0.501961 rg
23.906 61.84 m 23.906 62.969 22.992 63.883 21.863 63.883 c 20.734 63.883
19.82 62.969 19.82 61.84 c 19.82 60.715 20.734 59.801 21.863 59.801 c 22.992
59.801 23.906 60.715 23.906 61.84 c f
0.596078 g
0.751181 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
16.941 50.758 m 29.465 47.813 l S Q
27.848 47.258 m 30.453 47.578 l 28.262 49.023 l 28.523 48.41 28.355 47.699
27.848 47.258 c h
27.848 47.258 m f*
0.137102 w
1 j
q -1 0.235294 -0.235294 -1 0 0 cm
-15.851 -50.987 m -18.248 -51.872 l -15.849 -52.753 l -16.234 -52.23 -16.233
-51.519 -15.851 -50.987 c h
-15.851 -50.987 m S Q
0.6 g
0.751178 w
0 j
q 1 0 0 1 0 0 cm
23.234 59.613 m 30.398 49.301 l S Q
28.824 49.969 m 30.973 48.461 l 30.313 51 l 30.098 50.375 29.496 49.957
28.824 49.969 c h
28.824 49.969 m f*
0.115667 w
1 j
q -0.694805 1 -1 -0.694805 0 0 cm
20.193 -42.855 m 18.17 -43.597 l 20.191 -44.342 l 19.87 -43.904 19.87 -43.302
20.193 -42.855 c h
20.193 -42.855 m S Q
Q Q
showpage
%%Trailer
end
%%EOF

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80mm"
height="25mm"
viewBox="0 0 80 25"
version="1.1"
id="svg8"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="PPartiC.svg">
<defs
id="defs2">
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Mend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path881"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.6) rotate(180) translate(0,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Send"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path887"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#989898;stroke-opacity:1;fill:#989898;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.3) rotate(180) translate(-2.3,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Mend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path863"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.4) rotate(180) translate(10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path857"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="Arrow2Send-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Send">
<path
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path887-3" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-108.81501"
inkscape:cy="51.644646"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1378"
inkscape:window-x="-9"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="9.921875"
y="16.914433"
id="text12"><tspan
sodipodi:role="line"
id="tspan10"
x="9.921875"
y="16.914433"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.9333px;font-family:'Share Tech Mono';-inkscape-font-specification:'Share Tech Mono Italic';stroke-width:0.264583">PPartiC</tspan></text>
<circle
style="fill:#d40000;stroke-width:0.264583"
id="path14"
cx="4.2286086"
cy="18.946056"
r="1.8662573" />
<circle
style="fill:#000080;stroke-width:0.576413"
id="path16"
cx="7.7130766"
cy="21.816313"
r="0.7205171" />
<path
style="fill:none;fill-opacity:1;stroke:#989898;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send)"
d="M 5.9767484,17.906622 10.394345,16.867188"
id="path18"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
id="path18-6"
d="m 8.195956,21.029626 2.527716,-3.638021"
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send-8)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View file

@ -0,0 +1,294 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.16.0 (https://cairographics.org)
%%CreationDate: Sat Nov 21 21:23:19 2020
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 8 15 191 78
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%BeginResource: font f-0-0
%!FontType1-1.1 f-0-0 1.0
11 dict begin
/FontName /f-0-0 def
/PaintType 0 def
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0] readonly def
/FontBBox {30 -240 640 735 } readonly def
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 97 /a put
dup 99 /c put
dup 102 /f put
dup 107 /k put
dup 112 /p put
readonly def
currentdict end
currentfile eexec
f983ef0097ece636fb4a96c74d26ab84185f6dfa4a16a7a1c27bbe3f1156aea698df336d20b467
b10e7f33846656653c5ac6962759d3056cbdb3190bac614b984bf5a132dc418192443014ba63de
800d392b6fea026574bb2535fd7bb5338f35bf15a88ea328fdaa49670c7852e3d060f3c5d6b07f
2ef6d0f22646c5d18e19a2ae3ee120390f6dd96f76dcf1e127de5e9299077a00c17c0d71e36e5b
9d5ec58fceda57739a6a4214d4b79d6c48d2784b60c320323c7acddddf34db833cac0cf109f799
69d114a330d372e5c978a66acc84e3fe5557f6240856a013ffaa0199444e5c5036f775eba4a5c5
8cde66cf604b9aca2178431127b8a1ff7ed633a65c04600af5f573483112251caad907dcd8c61e
23500065b1568be79a17d2379b63d656e8f7715cdfdf357f0e30d9ab91d113c88231d875d60897
1dee27eb5da34a09d2f1b1a2e7ab8be1036393cd6ae53eff0d77f452e9bf45eccc9e4836ae77c5
b74262fa43bfccfd9a147a18dcdae6e50cc518129a64f669a5fae69c8082dec571d7d01a4e9f05
6d3e52de0ea004acdbd1b3bf9b19aa17f839a75365a77b7275442a967093ffdf1694a72f9978a2
304ac331d401b48e3e62a3a92cd39516dd480f088980d1ad8993a1f6fefb07e0d86b6f0293bb41
68ac465726267cacb7516a0e910fe67c2dbfef06d8b64a9811506650d32fa182a0adcab8e2e21e
ca6d0dc81959c25ea2d3f7ccec13e0cb4a7ef88e97c36e74fa13010220d6835ebdcbabdb507d84
239e5483e8a8b7a52d6e1ea4ea1f5e6bef4534710c4055265aaa86fb445f3b2fc62cfdd9e283d8
8bd083d09f0971cde00f2031b58b304d5f647f02aabf7ba9062c33979cd391f692c72ee179b7a8
16f9c9e668d20021bd2b6a0f0114898729c6228be2895a696aaef0ebbcc842e64d5e72cc1d9b75
44314028987a238f8fc4c18a0db3546c9ea42194b6bbdc45587e36d605fe2b7608d9292ddc0c9b
be3e420b36fd52f9aef97f13533e101f34d4f882848f4845a7a824da815a710abe11a1ec8363c1
06daa18dffb5a451af7bf3b20d79a63c94e305050ea893b7a61cc8cfdb2e8a593a073c2021b298
40863c70742ab1734e1d6811cf1927832da10f562f6895575b50044179588ddd9ec4c413f68c3e
3063f9594dc94115af4d9d4d6259c2ebb5afa796131772de3d297a8cc04f7f10398acc9142b1aa
2da9741ad314918ff1553dafe4751b4c0efdc9d6a549acbf1b3d209f6ebe8f6561d627f37bbce1
7213b92bf332c27718ca9f868f1724cda0774ea4c3a5a2ba99509eb9128c456e5526f234dc3adc
37ac61ead9dafba1b5d58a9443ceb92474535cd3515e9ce357420b230fe927e81f06b2363c70aa
b6e00858a44972ad3f8759069235bba0b8ae2c65a59fe3ee5642f88a8550a765907eb4f9432ac4
9e896114d0bc969bc2c14acd9a50c31e2095133b6b4fc11a1136dbba4b515eaabf0cba23ffe795
3532a1fca89780a841f3a5fe2514d31fd6d41fbcb5b8caadd53c1fa7b06506963f37006269d0ae
fc1d5d6bd7f6788544e01a77bdf35aaacdd41dd4fc16237759516c60ee9b57e7b56606e0fb5a25
9e6cb3b2e22d3ac4db73c228fda1b327cace7cbe25594ea2a9445efeda7826604e3daf18ca977a
9a2788cddcea95b5460b648c12bebc3c39302a07481fe18ceed4c9e12ac7d51f8104bd589cf9f6
68371d3aa8510b5ff08c972b84fd4e48c356f9098b9d130085f59bc7e748ac59e9715060d29b38
d828e479d8a85e0aaaa7b4ab34b547643b9c3417305b29be240ba9514cd4656079f26f378a6af9
f7c694b1332a14baa203faa5c6745eea7c9cc0b3fc13f722ff941857d141db5665b32ada8b7831
06f5c01361bd4b161450546ad8812d364b394658c4d3e1e2cf1daba58315787fbe299a27a387f2
1545b5d4bc3022e6a6803e971698504ebc44c9f7c02256a5ae01c9fb3194baf05fb7c9cd862427
95ca9cfd57ba76d6697fc842ee19ff35ce8b9d3299a185a4d28537058b5ea471a818f521183ffa
4b171f078577707cfbb3b2c6de4659b6dbacb952a0213b0586bd5879096ec53540ad07463e5b25
1a38d715de6a0bb6f92d3e20e1b25be654fe7aad2e057428b68e2d6830f2ee0ca384fb862813ba
d48832ec89991fa5e6bf9d3135378f0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%%EndResource
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 8 15 191 78
%%EndPageSetup
q 8 15 183 63 rectclip
1 0 0 -1 0 86 cm q
0 g
BT
56.000126 0 0 -56.000126 52.419201 52.791732 Tm
/f-0-0 1 Tf
[(fpak)10(c)]TJ
ET
0.749999 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
8.996 27.238 m 20.621 9.359 l 34.656 9.363 l 34.621 14.746 l 25.941 18.195
l 17.332 33.629 l 17.41 55.852 l 9.316 55.785 l h
8.996 27.238 m S Q
q 1 0 0 1 0 0 cm
21.156 69.262 m 21.156 38.387 l 40.305 38.387 l 40.305 53.027 l 27.457
53.027 l 27.457 69.52 l h
21.156 69.262 m S Q
q 1 0 0 1 0 0 cm
27.898 43.988 m 27.898 47.73 l 33.426 47.73 l 33.426 43.898 l h
27.898 43.988 m S Q
0.283465 w
q 1 0 0 1 0 0 cm
9.094 50.535 m 17.414 50.297 l S Q
q 1 0 0 1 0 0 cm
9.34 43.07 m 17.094 44.93 l S Q
q 1 0 0 1 0 0 cm
9.43 34.727 m 17.348 41.363 l S Q
q 1 0 0 1 0 0 cm
17.332 33.629 m 8.996 27.238 l S Q
q 1 0 0 1 0 0 cm
13.297 31.055 m 11.32 36.062 l 12.719 43.309 l 14.023 50.113 l 12.02 55.516
l S Q
q 1 0 0 1 0 0 cm
17.332 33.629 m 12.203 21.801 l S Q
q 1 0 0 1 0 0 cm
21.246 26.223 m 12.203 21.801 l S Q
q 1 0 0 1 0 0 cm
15.379 16.828 m 21.246 26.223 l S Q
q 1 0 0 1 0 0 cm
23.562 22.152 m 15.379 16.828 l S Q
q 1 0 0 1 0 0 cm
25.941 18.195 m 15.379 16.828 l S Q
q 1 0 0 1 0 0 cm
13.297 31.055 m 14.234 26.23 l S Q
q 1 0 0 1 0 0 cm
14.234 26.23 m 21.246 26.223 l S Q
q 1 0 0 1 0 0 cm
25.941 18.195 m 17.918 13.906 l S Q
q 1 0 0 1 0 0 cm
20.621 9.359 m 25.941 18.195 l S Q
q 1 0 0 1 0 0 cm
34.656 9.363 m 25.941 18.195 l S Q
q 1 0 0 1 0 0 cm
25.941 18.195 m 26.527 9.582 l S Q
1 0 0 rg
23.523 67.027 m 23.523 67.027 23.523 67.031 23.523 67.031 c 23.52 67.031
23.52 67.027 23.52 67.027 c 23.52 67.027 23.52 67.027 23.523 67.027 c h
23.523 67.027 m f
0 g
0.749999 w
q 1 0 0 1 0 0 cm
23.523 67.027 m 23.523 67.027 23.523 67.031 23.523 67.031 c 23.52 67.031
23.52 67.027 23.52 67.027 c 23.52 67.027 23.52 67.027 23.523 67.027 c h
23.523 67.027 m S Q
1 0 0 rg
24.66 63.297 m 24.66 63.297 24.656 63.297 24.656 63.297 c 24.656 63.293
24.66 63.293 24.66 63.293 c 24.66 63.293 24.66 63.293 24.66 63.297 c h
24.66 63.297 m f
0 g
q 1 0 0 1 0 0 cm
24.66 63.297 m 24.66 63.297 24.656 63.297 24.656 63.297 c 24.656 63.293
24.66 63.293 24.66 63.293 c 24.66 63.293 24.66 63.293 24.66 63.297 c h
24.66 63.297 m S Q
0 0 1 rg
23.797 64.039 m 23.797 64.273 23.609 64.465 23.371 64.465 c 23.137 64.465
22.949 64.273 22.949 64.039 c 22.949 63.805 23.137 63.613 23.371 63.613
c 23.609 63.613 23.797 63.805 23.797 64.039 c h
23.797 64.039 m f
1 0 0 rg
37.844 42.566 m 37.844 42.945 37.535 43.254 37.156 43.254 c 36.773 43.254
36.465 42.945 36.465 42.566 c 36.465 42.184 36.773 41.875 37.156 41.875
c 37.535 41.875 37.844 42.184 37.844 42.566 c h
37.844 42.566 m f
0 g
0.141732 w
q 1 0 0 1 0 0 cm
35.977 42.188 m 31.02 39.777 l S Q
31.531 40.027 m 31.91 39.895 l 30.895 39.715 l 31.66 40.406 l h
31.531 40.027 m f*
0.0679747 w
q 1 0.486446 -0.486446 1 0 0 cm
41.243 19.965 m 41.497 19.708 l 40.605 19.963 l 41.496 20.22 l h
41.243 19.965 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
29.828 39.73 m 23.582 45.012 l S Q
24.016 44.645 m 24.047 44.246 l 23.473 45.102 l 24.414 44.68 l h
24.016 44.645 m f*
0.0577315 w
q 1 -0.845211 0.845211 1 0 0 cm
-8.002 37.881 m -7.787 37.664 l -8.544 37.88 l -7.787 38.098 l h
-8.002 37.881 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
23.82 46.355 m 25.027 51.145 l S Q
24.887 50.594 m 24.543 50.387 l 25.059 51.281 l 25.094 50.25 l h
24.887 50.594 m f*
0.0732958 w
q -0.252177 -1 1 -0.252177 0 0 cm
-53.469 11.403 m -53.193 11.129 l -54.156 11.402 l -53.195 11.679 l h
-53.469 11.403 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
23.453 63.156 m 26.16 58.465 l S Q
25.875 58.953 m 25.98 59.34 l 26.23 58.34 l 25.488 59.059 l h
25.875 58.953 m f*
0.0654792 w
q -0.576787 1 -1 -0.576787 0 0 cm
33.038 -44.931 m 33.282 -45.177 l 32.424 -44.932 l 33.284 -44.686 l h
33.038 -44.931 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
26.215 57.066 m 26.281 52.215 l S Q
26.273 52.785 m 26.555 53.07 l 26.285 52.074 l 25.984 53.062 l h
26.273 52.785 m f*
0.0755832 w
q -0.0137977 1 -1 -0.0137977 0 0 cm
52.413 -26.997 m 52.694 -27.282 l 51.702 -26.999 l 52.694 -26.711 l h
52.413 -26.997 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
26.5 50.707 m 34.664 48.957 l S Q
34.109 49.074 m 33.895 49.41 l 34.805 48.926 l 33.773 48.859 l h
34.109 49.074 m f*
0.0739077 w
q -1 0.214603 -0.214603 -1 0 0 cm
-22.54 -53.911 m -22.266 -54.188 l -23.235 -53.912 l -22.263 -53.637 l
h
-22.54 -53.911 m S Q
0.141732 w
q 1 0 0 1 0 0 cm
36.809 49.66 m 38.371 43.828 l S Q
38.223 44.379 m 38.426 44.727 l 38.406 43.691 l 37.879 44.578 l h
38.223 44.379 m f*
0.0730145 w
q -0.26796 1 -1 -0.26796 0 0 cm
31.85 -46.757 m 32.123 -47.034 l 31.163 -46.757 l 32.122 -46.486 l h
31.85 -46.757 m S Q
Q Q
showpage
%%Trailer
end
%%EOF

View file

@ -0,0 +1,331 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="70mm"
height="30mm"
viewBox="0 0 69.999997 30.000002"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="FPAKC.svg">
<defs
id="defs2">
<marker
style="overflow:visible;"
id="Arrow1Mend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path913" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path907" />
</marker>
<rect
x="3.7860464"
y="3.0999611"
width="63.507499"
height="24.351779"
id="rect12" />
<marker
style="overflow:visible"
id="Arrow1Mend-3"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-6" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-5"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-3" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-2" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-1"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-27" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-36" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-61" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path913-9" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.6886206"
inkscape:cx="106.77158"
inkscape:cy="89.616578"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="mm"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="36"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
id="text10"
style="font-style:normal;font-weight:normal;font-size:19.7556px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect12);fill:#000000;fill-opacity:1;stroke:none;"
transform="translate(14.707173,-2.4509896)"><tspan
x="3.7851562"
y="21.07474"><tspan
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:19.7556px;font-family:Manrope;-inkscape-font-specification:'Manrope Semi-Bold'">fpakc</tspan></tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.1729804,9.608885 4.1016578,-6.3077664 4.9514268,0.0018 -0.01253,1.8991752 -3.0624474,1.2171161 -3.037379,5.4436511 0.028466,7.839928 -2.8551595,-0.02263 z"
id="path33" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 7.4633697,24.433471 V 13.541949 H 14.21897 v 5.164493 H 9.6864873 v 5.819075 z"
id="path35" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 9.8420017,15.51818 v 1.320352 h 1.9500773 v -1.352325 z"
id="path37" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 3.2083261,17.827837 6.1427947,17.74321"
id="path39" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 3.2945559,15.194721 2.7350868,0.655961"
id="path41" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 3.3269734,12.250098 2.7926774,2.342293"
id="path43" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 6.1137085,11.862861 3.1729804,9.608885"
id="path45" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 4.6901935,10.955262 -0.6964846,1.767319 0.493241,2.555186 0.4599465,2.401203 -0.7060603,1.905676"
id="path47" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 6.1137085,11.862861 4.3050108,7.6915189"
id="path49" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 7.4945353,9.2508325 4.3050108,7.6915189"
id="path51" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.4251296,5.9372396 7.4945353,9.2508323"
id="path53" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 8.3119022,7.8150153 5.4251296,5.9372396"
id="path55" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9.1510875,6.4192099 5.4251296,5.9372396"
id="path57" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4.6901935,10.955262 5.0213868,9.254038"
id="path59" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.0213868,9.254038 7.4945353,9.250828"
id="path61" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9.1510875,6.4192099 6.3204965,4.9062245"
id="path63" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 7.2746382,3.3011186 9.1510873,6.4192099"
id="path65" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 12.226065,3.3029186 9.1510875,6.4192099"
id="path67" />
<path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9.1510873,6.4192099 9.3582383,3.3802534"
id="path69" />
<circle
id="path894"
style="fill:#ff0000;stroke:#000000;stroke-width:0.264583"
cx="8.2981777"
cy="23.645924"
r="0.00058999716" />
<circle
id="path896"
style="fill:#ff0000;stroke:#000000;stroke-width:0.264583"
cx="8.6992016"
cy="22.329088"
r="0.00058999716" />
<circle
style="fill:#0000ff;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none"
id="path898"
cx="8.2454529"
cy="22.591675"
r="0.14995678" />
<circle
style="fill:#ff0000;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none"
id="path900"
cx="13.107318"
cy="15.016319"
r="0.24327335" />
<path
style="fill:none;stroke:#000000;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="M 12.692125,14.883263 10.943653,14.032725"
id="path902" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-3)"
d="M 10.522219,14.016626 8.3187793,15.878998"
id="path902-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-5)"
d="m 8.4027158,16.353504 0.4258407,1.688655"
id="path902-5"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-6)"
d="M 8.2730851,22.280302 9.2281395,20.624483"
id="path902-9"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)"
d="m 9.2478901,20.131094 0.023598,-1.710291"
id="path902-0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)"
d="M 9.3488198,17.888831 12.229152,17.270702"
id="path902-06"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.0499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-7)"
d="m 12.985376,17.518889 0.551109,-2.056684"
id="path902-2"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,303 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.16.0 (https://cairographics.org)
%%CreationDate: Thu Oct 08 15:41:58 2020
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 13 30 125 153
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 13 30 125 153
%%EndPageSetup
q 13 30 112 123 rectclip
1 0 0 -1 0 171 cm q
0 0.784314 0 rg
20.836 84.285 52.273 43.371 re f
0 g
0.751178 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
20.836 84.285 52.273 43.371 re S Q
1 0.627451 0 rg
73.109 84.285 43.184 43.371 re f
0 g
q 1 0 0 1 0 0 cm
73.109 84.285 43.184 43.371 re S Q
0.0431373 0 1 rg
73.109 32.199 43.184 52.086 re f
0 g
q 1 0 0 1 0 0 cm
73.109 32.199 43.184 52.086 re S Q
1 0 0 rg
20.836 32.199 52.273 52.086 re f
0 g
q 1 0 0 1 0 0 cm
20.836 32.199 52.273 52.086 re S Q
q 1 0 0 1 0 0 cm
20.836 32.199 95.457 95.457 re S Q
0 0 1 rg
22.902 127.77 m 22.902 128.914 21.973 129.844 20.824 129.844 c 19.68 129.844
18.75 128.914 18.75 127.77 c 18.75 126.621 19.68 125.691 20.824 125.691
c 21.973 125.691 22.902 126.621 22.902 127.77 c h
22.902 127.77 m f
q 1 0 0 1 0 0 cm
22.902 127.77 m 22.902 128.914 21.973 129.844 20.824 129.844 c 19.68 129.844
18.75 128.914 18.75 127.77 c 18.75 126.621 19.68 125.691 20.824 125.691
c 21.973 125.691 22.902 126.621 22.902 127.77 c h
22.902 127.77 m S Q
1 0 0 rg
118.059 127.23 m 118.059 128.379 117.129 129.309 115.98 129.309 c 114.836
129.309 113.906 128.379 113.906 127.23 c 113.906 126.086 114.836 125.156
115.98 125.156 c 117.129 125.156 118.059 126.086 118.059 127.23 c f
q 1 0 0 1 0 0 cm
118.059 127.23 m 118.059 128.379 117.129 129.309 115.98 129.309 c 114.836
129.309 113.906 128.379 113.906 127.23 c 113.906 126.086 114.836 125.156
115.98 125.156 c 117.129 125.156 118.059 126.086 118.059 127.23 c S Q
0 0.784314 0 rg
117.789 32.41 m 117.789 33.559 116.859 34.488 115.715 34.488 c 114.566
34.488 113.637 33.559 113.637 32.41 c 113.637 31.266 114.566 30.336 115.715
30.336 c 116.859 30.336 117.789 31.266 117.789 32.41 c f
q 1 0 0 1 0 0 cm
117.789 32.41 m 117.789 33.559 116.859 34.488 115.715 34.488 c 114.566
34.488 113.637 33.559 113.637 32.41 c 113.637 31.266 114.566 30.336 115.715
30.336 c 116.859 30.336 117.789 31.266 117.789 32.41 c S Q
1 0.627451 0 rg
23.238 32.41 m 23.238 33.559 22.309 34.488 21.16 34.488 c 20.016 34.488
19.086 33.559 19.086 32.41 c 19.086 31.266 20.016 30.336 21.16 30.336 c
22.309 30.336 23.238 31.266 23.238 32.41 c f
q 1 0 0 1 0 0 cm
23.238 32.41 m 23.238 33.559 22.309 34.488 21.16 34.488 c 20.016 34.488
19.086 33.559 19.086 32.41 c 19.086 31.266 20.016 30.336 21.16 30.336 c
22.309 30.336 23.238 31.266 23.238 32.41 c S Q
0 g
76.465 84.191 m 76.465 86.262 74.785 87.941 72.715 87.941 c 70.645 87.941
68.965 86.262 68.965 84.191 c 68.965 82.121 70.645 80.441 72.715 80.441
c 74.785 80.441 76.465 82.121 76.465 84.191 c h
76.465 84.191 m f
q 1 0 0 1 0 0 cm
76.465 84.191 m 76.465 86.262 74.785 87.941 72.715 87.941 c 70.645 87.941
68.965 86.262 68.965 84.191 c 68.965 82.121 70.645 80.441 72.715 80.441
c 74.785 80.441 76.465 82.121 76.465 84.191 c h
76.465 84.191 m S Q
0.749999 w
q 1 0 0 1 0 0 cm
20.355 84.105 m 115.98 84.105 l S Q
q 1 0 0 1 0 0 cm
72.922 127.277 m 72.922 32.008 l S Q
14.742 139.539 m 16.68 139.539 l 16.68 132.867 l 14.57 133.289 l 14.57
132.211 l 16.664 131.789 l 17.852 131.789 l 17.852 139.539 l 19.789 139.539
l 19.789 140.539 l 14.742 140.539 l h
14.742 139.539 m f
120.676 136.695 m 124.816 136.695 l 124.816 137.695 l 119.254 137.695 l
119.254 136.695 l 119.699 136.238 120.309 135.617 121.082 134.836 c 121.863
134.047 122.352 133.535 122.551 133.305 c 122.934 132.891 123.199 132.535
123.348 132.242 c 123.504 131.941 123.582 131.648 123.582 131.367 c 123.582
130.898 123.414 130.52 123.082 130.227 c 122.758 129.938 122.336 129.789
121.816 129.789 c 121.441 129.789 121.043 129.852 120.629 129.977 c 120.223
130.102 119.785 130.301 119.316 130.57 c 119.316 129.367 l 119.793 129.18
120.238 129.039 120.645 128.945 c 121.059 128.844 121.441 128.789 121.785
128.789 c 122.691 128.789 123.414 129.02 123.957 129.477 c 124.496 129.926
124.77 130.531 124.77 131.289 c 124.77 131.645 124.699 131.984 124.566
132.305 c 124.43 132.629 124.184 133.008 123.832 133.445 c 123.727 133.563
123.414 133.891 122.895 134.43 c 122.371 134.973 121.633 135.727 120.676
136.695 c h
120.676 136.695 m f
122.875 24.07 m 123.438 24.195 123.875 24.453 124.188 24.836 c 124.508
25.211 124.672 25.68 124.672 26.242 c 124.672 27.109 124.375 27.781 123.781
28.258 c 123.188 28.727 122.344 28.961 121.25 28.961 c 120.883 28.961 120.504
28.922 120.109 28.852 c 119.723 28.781 119.328 28.672 118.922 28.523 c
118.922 27.383 l 119.242 27.57 119.598 27.719 119.984 27.82 c 120.379 27.914
120.789 27.961 121.219 27.961 c 121.957 27.961 122.52 27.816 122.906 27.523
c 123.301 27.234 123.5 26.805 123.5 26.242 c 123.5 25.734 123.316 25.332
122.953 25.039 c 122.586 24.75 122.086 24.602 121.453 24.602 c 120.422
24.602 l 120.422 23.633 l 121.5 23.633 l 122.07 23.633 122.516 23.52 122.828
23.289 c 123.141 23.051 123.297 22.711 123.297 22.273 c 123.297 21.828
123.133 21.484 122.813 21.242 c 122.5 21.004 122.047 20.883 121.453 20.883
c 121.117 20.883 120.766 20.922 120.391 20.992 c 120.023 21.055 119.617
21.16 119.172 21.305 c 119.172 20.258 l 119.629 20.133 120.051 20.039 120.438
19.977 c 120.832 19.914 121.203 19.883 121.547 19.883 c 122.453 19.883
123.164 20.086 123.688 20.492 c 124.207 20.898 124.469 21.453 124.469 22.148
c 124.469 22.641 124.328 23.051 124.047 23.383 c 123.773 23.719 123.383
23.945 122.875 24.07 c h
122.875 24.07 m f
17.223 19.746 m 14.238 24.418 l 17.223 24.418 l h
16.91 18.715 m 18.41 18.715 l 18.41 24.418 l 19.66 24.418 l 19.66 25.402
l 18.41 25.402 l 18.41 27.465 l 17.223 27.465 l 17.223 25.402 l 13.285
25.402 l 13.285 24.262 l h
16.91 18.715 m f
39.906 47.727 m 38.297 52.07 l 41.516 52.07 l h
39.234 46.555 m 40.578 46.555 l 43.906 55.305 l 42.672 55.305 l 41.875
53.055 l 37.938 53.055 l 37.141 55.305 l 35.891 55.305 l h
39.234 46.555 m f
45.5 57.066 m 48.188 57.066 l 48.188 57.707 l 44.578 57.707 l 44.578 57.066
l 44.867 56.766 45.266 56.359 45.766 55.848 c 46.266 55.34 46.582 55.012
46.719 54.863 c 46.957 54.582 47.125 54.348 47.219 54.16 c 47.32 53.965
47.375 53.777 47.375 53.598 c 47.375 53.297 47.266 53.051 47.047 52.863
c 46.836 52.668 46.566 52.566 46.234 52.566 c 45.992 52.566 45.738 52.609
45.469 52.691 c 45.195 52.777 44.91 52.902 44.609 53.066 c 44.609 52.301
l 44.922 52.176 45.207 52.082 45.469 52.02 c 45.738 51.957 45.988 51.926
46.219 51.926 c 46.801 51.926 47.27 52.074 47.625 52.363 c 47.977 52.656
48.156 53.047 48.156 53.535 c 48.156 53.777 48.109 54 48.016 54.207 c 47.93
54.418 47.773 54.66 47.547 54.941 c 47.484 55.016 47.281 55.23 46.938 55.582
c 46.594 55.938 46.113 56.434 45.5 57.066 c h
45.5 57.066 m f
93.52 47.684 m 91.91 52.027 l 95.129 52.027 l h
92.848 46.512 m 94.191 46.512 l 97.52 55.262 l 96.285 55.262 l 95.488 53.012
l 91.551 53.012 l 90.754 55.262 l 89.504 55.262 l h
92.848 46.512 m f
98.582 57.02 m 99.832 57.02 l 99.832 52.676 l 98.473 52.957 l 98.473 52.254
l 99.832 51.973 l 100.598 51.973 l 100.598 57.02 l 101.848 57.02 l 101.848
57.66 l 98.582 57.66 l h
98.582 57.02 m f
45.98 98.063 m 44.371 102.406 l 47.59 102.406 l h
45.309 96.891 m 46.652 96.891 l 49.98 105.641 l 48.746 105.641 l 47.949
103.391 l 44.012 103.391 l 43.215 105.641 l 41.965 105.641 l h
45.309 96.891 m f
53.23 104.98 m 53.605 105.055 53.895 105.215 54.105 105.465 c 54.313 105.715
54.418 106.023 54.418 106.387 c 54.418 106.949 54.219 107.387 53.824 107.699
c 53.438 108.004 52.891 108.152 52.184 108.152 c 51.941 108.152 51.699
108.125 51.449 108.074 c 51.199 108.035 50.938 107.965 50.668 107.871 c
50.668 107.137 l 50.875 107.254 51.105 107.348 51.355 107.418 c 51.613 107.48
51.887 107.512 52.168 107.512 c 52.645 107.512 53.012 107.418 53.262 107.23
c 53.52 107.035 53.652 106.754 53.652 106.387 c 53.652 106.055 53.531 105.793
53.293 105.605 c 53.051 105.418 52.723 105.324 52.309 105.324 c 51.652
105.324 l 51.652 104.684 l 52.34 104.684 l 52.723 104.684 53.016 104.613
53.215 104.465 c 53.41 104.309 53.512 104.09 53.512 103.809 c 53.512 103.52
53.406 103.293 53.199 103.137 c 52.988 102.98 52.691 102.902 52.309 102.902
c 52.098 102.902 51.875 102.93 51.637 102.98 c 51.395 103.023 51.129 103.09
50.84 103.184 c 50.84 102.496 l 51.129 102.414 51.402 102.355 51.652 102.324
c 51.91 102.285 52.156 102.262 52.387 102.262 c 52.969 102.262 53.426 102.398
53.762 102.668 c 54.105 102.93 54.277 103.285 54.277 103.73 c 54.277 104.043
54.184 104.309 53.996 104.527 c 53.816 104.746 53.563 104.898 53.23 104.98
c h
53.23 104.98 m f
93.707 97.875 m 92.098 102.219 l 95.316 102.219 l h
93.035 96.703 m 94.379 96.703 l 97.707 105.453 l 96.473 105.453 l 95.676
103.203 l 91.738 103.203 l 90.941 105.453 l 89.691 105.453 l h
93.035 96.703 m f
100.754 102.836 m 98.801 105.867 l 100.754 105.867 l h
100.551 102.164 m 101.52 102.164 l 101.52 105.867 l 102.316 105.867 l 102.316
106.508 l 101.52 106.508 l 101.52 107.852 l 100.754 107.852 l 100.754 106.508
l 98.176 106.508 l 98.176 105.773 l h
100.551 102.164 m f
27.949 77.395 m 27.949 80.301 l 27.043 80.301 l 27.043 72.754 l 27.949
72.754 l 27.949 73.582 l 28.137 73.262 28.371 73.02 28.652 72.863 c 28.941
72.707 29.293 72.629 29.699 72.629 c 30.363 72.629 30.902 72.895 31.309
73.426 c 31.723 73.949 31.934 74.637 31.934 75.488 c 31.934 76.355 31.723
77.051 31.309 77.582 c 30.902 78.105 30.363 78.363 29.699 78.363 c 29.293
78.363 28.941 78.285 28.652 78.129 c 28.371 77.973 28.137 77.73 27.949
77.395 c h
31.012 75.488 m 31.012 74.832 30.871 74.316 30.59 73.941 c 30.316 73.566
29.949 73.379 29.48 73.379 c 29 73.379 28.625 73.566 28.355 73.941 c 28.082
74.316 27.949 74.832 27.949 75.488 c 27.949 76.156 28.082 76.676 28.355
77.051 c 28.625 77.426 29 77.613 29.48 77.613 c 29.949 77.613 30.316 77.426
30.59 77.051 c 30.871 76.676 31.012 76.156 31.012 75.488 c h
31.012 75.488 m f
35.578 70.629 m 35.148 71.379 34.828 72.125 34.609 72.863 c 34.398 73.594
34.297 74.332 34.297 75.082 c 34.297 75.832 34.398 76.578 34.609 77.316
c 34.828 78.059 35.148 78.793 35.578 79.535 c 34.797 79.535 l 34.316 78.773
33.953 78.027 33.703 77.285 c 33.461 76.547 33.344 75.813 33.344 75.082
c 33.344 74.355 33.461 73.625 33.703 72.895 c 33.941 72.156 34.305 71.402
34.797 70.629 c h
35.578 70.629 m f
41.875 72.754 m 39.906 75.41 l 41.984 78.223 l 40.922 78.223 l 39.328 76.066
l 37.734 78.223 l 36.672 78.223 l 38.797 75.363 l 36.859 72.754 l 37.922
72.754 l 39.375 74.707 l 40.813 72.754 l h
41.875 72.754 m f
43.121 79.676 m 44.168 79.676 l 44.168 76.066 l 43.027 76.301 l 43.027
75.707 l 44.152 75.488 l 44.793 75.488 l 44.793 79.676 l 45.84 79.676 l
45.84 80.223 l 43.121 80.223 l h
43.121 79.676 m f
47.621 76.988 m 48.652 76.988 l 48.652 77.816 l 47.855 79.379 l 47.215
79.379 l 47.621 77.816 l h
47.621 76.988 m f
55.117 72.754 m 53.148 75.41 l 55.227 78.223 l 54.164 78.223 l 52.57 76.066
l 50.977 78.223 l 49.914 78.223 l 52.039 75.363 l 50.102 72.754 l 51.164
72.754 l 52.617 74.707 l 54.055 72.754 l h
55.117 72.754 m f
56.801 79.676 m 59.035 79.676 l 59.035 80.223 l 56.02 80.223 l 56.02 79.676
l 56.27 79.426 56.602 79.094 57.02 78.676 c 57.434 78.25 57.699 77.973
57.816 77.848 c 58.023 77.621 58.164 77.426 58.238 77.27 c 58.32 77.105
58.363 76.941 58.363 76.785 c 58.363 76.535 58.273 76.332 58.098 76.176
c 57.918 76.02 57.691 75.941 57.41 75.941 c 57.211 75.941 56.996 75.98 56.77
76.051 c 56.551 76.113 56.316 76.219 56.066 76.363 c 56.066 75.707 l 56.316
75.605 56.551 75.527 56.77 75.473 c 56.996 75.422 57.207 75.395 57.395
75.395 c 57.883 75.395 58.273 75.52 58.566 75.77 c 58.855 76.012 59.004
76.34 59.004 76.754 c 59.004 76.941 58.965 77.125 58.895 77.301 c 58.82
77.48 58.691 77.688 58.504 77.926 c 58.449 77.988 58.277 78.168 57.988 78.457
c 57.707 78.75 57.309 79.156 56.801 79.676 c h
56.801 79.676 m f
60.484 70.629 m 61.266 70.629 l 61.754 71.402 62.117 72.156 62.359 72.895
c 62.609 73.625 62.734 74.355 62.734 75.082 c 62.734 75.813 62.609 76.547
62.359 77.285 c 62.117 78.027 61.754 78.773 61.266 79.535 c 60.484 79.535
l 60.922 78.793 61.242 78.059 61.453 77.316 c 61.672 76.578 61.781 75.832
61.781 75.082 c 61.781 74.332 61.672 73.594 61.453 72.863 c 61.242 72.125
60.922 71.379 60.484 70.629 c h
60.484 70.629 m f
Q Q
showpage
%%Trailer
end
%%EOF

View file

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="scatteringQuad.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
id="svg8"
version="1.1"
viewBox="0 0 50 60"
height="60mm"
width="50mm">
<defs
id="defs2" />
<sodipodi:namedview
inkscape:window-maximized="0"
inkscape:window-y="190"
inkscape:window-x="180"
inkscape:window-height="1205"
inkscape:window-width="1465"
showgrid="false"
inkscape:document-rotation="0"
inkscape:current-layer="layer1"
inkscape:document-units="mm"
inkscape:cy="87.177663"
inkscape:cx="72.599645"
inkscape:zoom="3.959798"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<rect
y="29.733734"
x="7.3499122"
height="15.301182"
width="18.441597"
id="rect887"
style="fill:#00c800;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1" />
<rect
y="29.733734"
x="25.79151"
height="15.301182"
width="15.234362"
id="rect885"
style="fill:#ffa000;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1" />
<rect
y="11.358955"
x="25.79151"
height="18.374779"
width="15.234362"
id="rect883"
style="fill:#0b00ff;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1" />
<rect
y="11.358955"
x="7.3499122"
height="18.374779"
width="18.441597"
id="rect881"
style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1" />
<rect
y="11.358955"
x="7.3499122"
height="33.675961"
width="33.675961"
id="rect844"
style="fill:none;stroke:#000000;stroke-width:0.264999" />
<circle
r="0.73232883"
cy="45.073662"
cx="7.3469119"
id="path846"
style="fill:#0000ff;stroke:#0000ff;stroke-width:0.264999;fill-opacity:1;stroke-opacity:1" />
<circle
style="fill:#ff0000;stroke:#ff0000;stroke-width:0.264999;stroke-opacity:1;fill-opacity:1"
id="path846-5"
cx="40.915924"
cy="44.884674"
r="0.73232883" />
<circle
style="fill:#00c800;stroke:#00c800;stroke-width:0.264999;fill-opacity:1;stroke-opacity:1"
id="path846-4"
cx="40.821426"
cy="11.43378"
r="0.73232883" />
<circle
style="fill:#ffa000;stroke:#ffa000;stroke-width:0.264999;stroke-opacity:1;fill-opacity:1"
id="path846-3"
cx="7.4650297"
cy="11.43378"
r="0.73232883" />
<circle
r="1.3229166"
cy="29.700775"
cx="25.651775"
id="path875"
style="fill:#000000;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;fill-opacity:1" />
<path
id="path877"
d="M 7.1815475,29.671131 H 40.915923"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path879"
d="M 25.724692,44.901281 V 11.292137"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
id="text891"
y="49.578495"
x="4.677217"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
xml:space="preserve"><tspan
style="stroke-width:0.264583"
y="49.578495"
x="4.677217"
id="tspan889"
sodipodi:role="line">1</tspan></text>
<text
id="text895"
y="48.576237"
x="41.76086"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
xml:space="preserve"><tspan
style="stroke-width:0.264583"
y="48.576237"
x="41.76086"
id="tspan893"
sodipodi:role="line">2</tspan></text>
<text
id="text899"
y="10.156242"
x="41.627232"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
xml:space="preserve"><tspan
style="stroke-width:0.264583"
y="10.156242"
x="41.627232"
id="tspan897"
sodipodi:role="line">3</tspan></text>
<text
id="text903"
y="9.6885204"
x="4.4767642"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
xml:space="preserve"><tspan
style="stroke-width:0.264583"
y="9.6885204"
x="4.4767642"
id="tspan901"
sodipodi:role="line">4</tspan></text>
<text
id="text907"
y="19.510675"
x="12.628486"
style="font-size:4.23333px"
xml:space="preserve"><tspan
y="19.510675"
x="12.628486"
id="tspan905"
sodipodi:role="line">A<tspan
id="tspan911"
style="font-size:65%;baseline-shift:sub">2</tspan></tspan></text>
<text
xml:space="preserve"
x="31.541672"
y="19.494503"
id="text907-1"><tspan
style="font-size:4.23333px;baseline-shift:baseline;stroke-width:1"
sodipodi:role="line"
id="tspan905-5"
x="31.541672"
y="19.494503">A<tspan
id="tspan934"
style="font-size:65%;baseline-shift:sub">1</tspan></tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;stroke-width:1"
x="14.77051"
y="37.267929"
id="text907-0"><tspan
style="stroke-width:1"
sodipodi:role="line"
id="tspan905-7"
x="14.77051"
y="37.267929">A<tspan
id="tspan946"
style="font-size:65%;baseline-shift:sub">3</tspan><tspan
style="font-size:2.75167px;baseline-shift:sub;stroke-width:1"
id="tspan911-2" /></tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;stroke-width:1"
x="31.60849"
y="37.201111"
id="text907-9"><tspan
style="stroke-width:1"
sodipodi:role="line"
id="tspan905-3"
x="31.60849"
y="37.201111">A<tspan
id="tspan958"
style="font-size:65%;baseline-shift:sub">4</tspan><tspan
style="font-size:2.75167px;baseline-shift:sub;stroke-width:1"
id="tspan911-1" /></tspan></text>
<text
id="text962"
y="27.595581"
x="9.2208014"
style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
xml:space="preserve"><tspan
style="font-size:3.52778px"
y="27.595581"
x="9.2208014"
id="tspan960"
sodipodi:role="line">p(x<tspan
id="tspan968"
style="font-size:65%;baseline-shift:sub">1</tspan>,x<tspan
id="tspan970"
style="font-size:65%;baseline-shift:sub">2</tspan>)</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

View file

@ -0,0 +1,613 @@
\documentclass[10pt,a4paper,oneside]{book}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{wrapfig}
\usepackage{units}
\usepackage[block=ragged,backend=bibtex]{biblatex}
\usepackage[acronym,toc,automake]{glossaries}
\usepackage[hidelinks]{hyperref}
\hypersetup{
breaklinks = true, % Allows break links in lines
colorlinks = true, % Colours links instead of ugly boxes
urlcolor = blue, % Colour for external hyperlinks
linkcolor = blue, % Colour of internal links
citecolor = blue, % Colour of citations
pdfinfo = {
Title = {fpakc User Manual},
Author = {Jorge Gonzalez}
}
}
\makeglossaries
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newacronym{fpakc}{fpakc}{Finite Element PArticle Code}
\newacronym{mpi}{MPI}{Message Passing Interface}
\newacronym{gpu}{GPU}{Graphics Processing Unit}
\newacronym{cpu}{CPU}{Central Processing Unit}
\newacronym{json}{JSON}{JavaScript Object Notation}
\newacronym{io}{I/O}{input/output}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newglossaryentry{openmp}{name={OpenMP},description={Shared-memory parallelization}}
\newglossaryentry{gfortran}{name={GFortran},description={Open-source compiler for fortran source code}}
\newglossaryentry{ifort}{name={ifort},description={Intel\textsuperscript{\textregistered} Fortran compiler}}
\newglossaryentry{opensource}{name={Open Source},description={Source code that is made freely available for possible modification and redistribution}}
\newglossaryentry{openblas}{name={OpenBLAS},description={Open-source implementation of BLAS and LAPACK APIs}}
\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{gmsh}{name={Gmsh},description={A three-dimensional finite element mesh generator with built-in pre- and post-processing facilities.}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bibliography{bibliography}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\title{\includegraphics{figures/logos/fpakc}\\\vspace{2cm}fpakc User Manual}
\author{Jorge Gonzalez}
\date{\today\\v0.1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\maketitle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tableofcontents
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Introduction}
\section{About fpakc}
The \Gls{fpakc} is a simulation tool that models species in plasmas (ions, electrons and neutrals) following the trajectories of macro-particles as they move and interact between them and the boundaries of the domain.
The code is currently in very early steps of development and further improvements are expected very soon.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Main Guidelines}
The \acrshort{fpakc} environment aims to be a fully functional tool for the simulation of plasmas from a kinetic point of view.
The main guidelines in the creation of the code are:
\begin{enumerate}
\item The code is \Gls{opensource} and freely distributed. This means the code can be used and modified by anyone.
Nevertheless, the official version distributed in the official repository will be managed by the developed team, which members have to be given direct permission by the lead developer.
\acrshort{fpakc} is distributed with a GNU General Public License v3.0 that covers all files in the repository.
Moreover, there should always be an open-source free alternative for external tools required by the program (post-processing, mesh generation, input file generation \ldots).
\item \acrshort{fpakc} is coded in a \textit{understandable} way.
This means that the code is required to be written in a clear way that is easy to understand and maintain.
Variables and procedure names need to be self-understanding.
This ease the process of fixing bugs and improving the codes by a large team of developers.
For more information, please refer to the \acrshort{fpakc} Coding Style document.
\item \acrshort{fpakc} requires to be ease to use.
Input files are required to be in a \textit{human} format, meaning that the different options can be easily understander without constant reference to the user guide.
\acrshort{fpakc} is aimed to be used in a wide range of applications and by a variety of scientist: from very established ones to newcomers to the field and students.
\end{enumerate}
These are foundation stones of the code and code development and should always be followed, at least for the releases in the official repository.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{How to collaborate}
Right now, development of \acrshort{fpakc} is closed to third parties until a stable version with the basic functionality is released.
However, if you have a huge interest in the project please contact \href{mailto:jorge.gonzalez@upm.com}{jorge.gonzalez@upm.com}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Operation Scheme}
\section{The Particle Method}
\acrshort{fpakc} uses macro-particles to simulate the dynamics of different plasma species (mainly ions, electrons and neutrals).
These macro-particles represent a large amount of real particles.
For now own, macro-particles will be referred as just particles by abusing of language.
In the evolution of these particles, external forces (as the electromagnetic field), interaction between particles (as collisions) and interaction with the boundaries of the domain are included.
At each time step, particles are first pushed accounting for possible acceleration by external forces.
Then, the cell in which the particle ends up is located.
If a boundary is encountered, the interaction between the particle and the boundary is calculated.
Next, collisions for the particles in each cell are carried on.
This may include different collision processes for each particle.
Finally, the particles properties are scattered into the mesh nodes.
These properties are density, momentum and the stress tensor.
Non-dimensional units are used for this, but output files are converted into dimensional units.
If requested, the electromagnetic field is computed.
More in depth explanation of the different steps are given in the following sections.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Injection of new particles}
\acrshort{fpakc} has the capability of injecting particles at different velocities, temperatures, distributions and mass flows in boundary sections defined by the user.
Particles are distributed uniformly along the edge.
Their velocities are computed from the distribution function selected by the user.
The injection of particles is controlled in the \lstinline|moduleInject| module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Pushing}
Particles are pushed in the selected domain.
Velocity and position are updated according to the old particle values and the external forces.
All the push routines for the different geometries can be found in \lstinline|moduleSolver|.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{2D Cylindrical}
When a 2D cylindrical geometry is used ($z$, $r$), a Boris solver\cite{boris1970relativistic} is used to move particles accounting for the effect of the symmetry axis.
This pusher removes the issue with particles going to infinite velocity when $r \rightarrow 0$ by pushing the particles in Cartesian space and then converting it to $r-z$ geometry.
Velocity in the $\theta$ direction is updated for collision processes, although the dynamic in the angular direction is assumed as symmetric.
Cross-sections are read from files.
These files contains two columns: one for the relative energy (in $\unit{eV}$) and another one for the cross-section (in $\unit{m^{-2}}$).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{1D Cartesian pusher}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{1D Radial pusher}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Find new cell}
Once the position and velocity of the particle are updated, the new cell that contains the particle is searched.
This is done by a neighbor search, starting from the previous cell containing the particle.
In the process of finding the new cell, it is possible that a particle encounters a boundary.
When the particle interacts with the boundary, the particle may continue its life in the simulation (reflected) or might be eliminated from it (absorbed).
Once that the new cell is found or that the particle life has been terminated, the pushing is complete.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Variable Weighting Scheme\label{sec:weightingScheme}}
One of the issues in particle simulations, specially for axisymmetrical cases, is that due to the disparate volume of cells, specially close to the axis, the statistics in some cells is usually poor.
To try to fix that, the possibility to include a Variable Weighting Scheme in the simulations is available in \Gls{fpakc}.
This schemes detect when a particle change cells and modify its weight accordingly.
To avoid particles having a larger weight than the rest, particle can be split in multiple particles if weight become too large.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Reset of particle array}
Once that the pushing is complete, the array of particles that remain inside the domain is copied to a new array.
The new array containing only the particles inside the domain will be the one used in the next steps.
In this section, particles are assigned to the list of particles inside each individual cell.
Unfortunately, this is done right now without parallelisation and is very CPU consuming.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Interaction between species}\label{ssec:collisions}
For each cell, interaction among the particles in it are carried out.
The type of interaction between the different particles is defined by the user.
In general, the maximum number of interaction in a cell is computed.
For each collision, a pair of particles is selected.
A loop over all possible collisions for the pair of particles is performed.
If a random number generated is above the probability of collision for the type divided by the maximum one, the collision take place.
Collisions can change the velocity of the particles involved (elastic), create new particles (ionization-recombination) or change the type of particle (charge-exchange).
Below are described the type of collision process implemented between species.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Elastic collision}
In this type of collision, particles exchange energy due to hard-sphere model.
Total energy is conserved.
Resulting velocity directions are chosen from Maxwellian distribution functions.
This interaction is useful for short-range collisions as neutral-neutral and charged-neutral elastic collisions.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Charge Exchange}
When an ion interacts with a neutral particle, an electron is exchanged between the two particles with no exchange of energy.
This is called a resonant charge-exchange.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Electron Impact Ionization}
When the relative energy between a neutral and an electron is above the ionization threshold, there is a probability that the neutral particle will become ionized.
This ionization emits and additional electron
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Recombination}
When an electron and an ion interact, there is a possibility for them to be recombined into a neutral particle.
The photon emitted by this process is not modeled yet.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Scattering}
The properties of each particle are deposited in the nodes from the containing cell.
This process depend on the cell type, but in general, each node receive a proportional part of the particle properties as a function of the particle position inside the cell.
Figure \ref{fig:scatteringQuad} shows how a particle at a generic position $p(x_1, x_2)$ inside the cell is scattered to the four nodes.
\begin{wrapfigure}{l}{0.4\textwidth}
\centering
\includegraphics{figures/scatteringQuad}
\caption{\label{fig:scatteringQuad}Example of how a particle is weighted in a quadrilateral cell.}
\end{wrapfigure}
Each node receives a proportional part of the area formed by dividing the cell in for rectangles using as an additional vertex the particle position.
These properties are dimensionless, but they are converted to the correct units once the output is printed.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Electromagnetic field}
WIP.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Installation}
\section{Required Packages}
In order to properly compile \gls{fpakc}, the following packages are required.
\subsection{Gfortran}
The \Gls{opensource} free compiler \Gls{gfortran}\cite{gfortranURL} from GCC is the basic way to compile \acrshort{fpakc}.
It is distributed with all GNU/Linux distributions.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Ifort}
The \Gls{ifort}\cite{ifortURL} compiler is a proprietary Fortran compiler developed by Intel\textsuperscript{\textregistered}.
The makefile distributed with \Gls{fpakc} is prepared to be used with ifort with minor modifications.
However, \Gls{gfortran} is recommended for compiling fpakc.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{OpenBlas}
\Gls{openblas}\cite{openblasURL} is used by \acrshort{fpakc} to solve the electromagnetic field in the finite element mesh.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{JSON-Fortran}
To read \acrshort{json}\cite{jsonURL} input files in Fortran, the API JSON-Fortran\cite{jsonfortranURL} is used.
This needs to be compiled and placed in a folder accessible from the root directory of \Gls{fpakc}.
The same compiler as the one used to compile \Gls{fpakc} needs to be used to generate a compatible library.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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.
Right now, the only \acrshort{io} format available in \Gls{fpakc} is the v2.0 .msh format.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Installation steps}
Once you have been added to the \Gls{fpakc} \Gls{gitlab} repository, and have added an ssh key to your account, you will be able to clone the repository using:
\begin{lstlisting}
git clone git@gitlab.com:<YourGitLabUsername>/fpakc.git
\end{lstlisting}
in which you have to substitute \lstinline|<YourGitLabUsername>| for your \Gls{gitlab} username.
Go into the new downloaded directory with
\begin{lstlisting}
cd fpakc
\end{lstlisting}
Clone the json-fortran repository with:
\begin{lstlisting}
git clone https://github.com/jacobwilliams/json-fortran.git
\end{lstlisting}
This will create the \lstinline|json-fortran-8.2.0| directory.
Go into this new folder and create a new \lstinline|build-gfortran| directory, enter it and execute:
\begin{lstlisting}
cmake ../
\end{lstlisting}
Once it finish, just compile the json-fortran library with
\begin{lstlisting}
make
\end{lstlisting}
This creates the \lstinline|include| and \lstinline|lib| folders that contain the required files for \acrshort{fpakc} compilation.
Go back to the \acrshort{fpakc} root folder and execute
\begin{lstlisting}
make
\end{lstlisting}
to compile the code.
If everything is correct, an executable named \textit{fpakc} will be generated.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Running the code}
To run a case, simply execute:
\begin{lstlisting}
./fpakc path/to/input-file.json
\end{lstlisting}
in a command line from the root \acrshort{fpakc} folder.
Substitute \lstinline|path/to/input-file.json| with the path to the input file of the case you want to run.
The examples in the run directory are presented in Chapter \ref{ch:exampleRuns}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Input File}\label{ch:input_file}
The input files for \Gls{fpakc} is divided between to files: a mesh file and a case file.
The mesh file contains the descriptions for the different elements composing a mesh (nodes, edges and volumes).
The case file contains the required information to define a simulation case: reference parameters, initial state, injection of particles, boundary conditions, species, number of iterations\ldots
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Mesh file}
\Gls{fpakc} accepts right now the version 2.0 of \Gls{gmsh} mesh format .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.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Case file}
The required format for the case file is \Gls{json}.
\Gls{json} is a case-sensitive format, so input must be written with the correct capitalisation.
The basic structure and options available for the case file are explained below.
The order of the objects and variables is irrelevant, but the structure needs to be maintained.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{output}
The object \textbf{output} in the \Gls{json} case file determines the different options to define how and when the simulation produces files:
The available options are:
\begin{itemize}
\item \textbf{path}: Character.
Path for the output files. This path is also used to locate the mesh input file.
\item \textbf{triggerOutput}: Integer.
Determines the number of iterations between writing output files for macroscopic quantities.
\item \textbf{cpuTime}: Logical.
Determines if the \Gls{cpu} time per iteration is written into a file.
Each row in the file determine the iteration, number of particles in the simulation and the multiple times spend per action.
Each action in the iteration (pushing, collisions, weighting\ldots) has its own column.
\item \textbf{triggerCPUTime}: Integer.
Determines the number of iterations between writing \Gls{cpu} time for macroscopic quantities.
This option is irrelevant if \textbf{cpuTime} is set to \textit{false}.
\item \textbf{numColl}: Logical.
Determines if the number of collisions per cell are outputted in a separated file.
Trigger between writings is the same as in \textbf{triggerOutput}.
\item \textbf{EMField}: Logical.
Determines if the electromagnetic field is printed.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{geometry}
The object \textbf{geometry} contains information about the type of geometry, the mesh file format and the mesh filename.
The accepted parameters are:
\begin{itemize}
\item \textbf{type}: Character.
Type of geometry.
Current accepted vaules are
\begin{itemize}
\item \textbf{2DCyl}: Two-dimensional grid (z-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{1DCart}: One-dimensional grid (x) in Cartesian coordinates
For \Gls{gmsh} mesh format, the coordinates $x$ corresponds to $x$.
\item \textbf{1DRad}: One-dimensional grid (r) in radial coordinates
For \Gls{gmsh} mesh format, the coordinates $x$ corresponds to $r$.
\end{itemize}
\item \textbf{meshType}: Character.
Format of mesh file.
Currently, only the value \textbf{gmsh} is accepted, which makes reference to \Gls{gmsh} v2.0 output format.
\item \textbf{meshFile}: Character.
Mesh filename.
This file is searched in the path \textbf{output.path} and must contain the file extension.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{species}
The array object \textbf{species} contains the data relevant to identify the different species in the simulation.
Multiple species can be defined as elements in the array.
For each species, the following parameters need to be defined:
\begin{itemize}
\item \textbf{name}: Character.
Name of the species.
\item \textbf{type}: Character.
Defines the type of species.
Current values are:
\begin{itemize}
\item \textbf{neutral}: Neutral species.
\item \textbf{charged}: Charged species.
The parameter \textbf{charge} is required for this type of species.
\end{itemize}
\item \textbf{mass}: Real.
Particle mass in $\unit{kg}$.
\item \textbf{charge}: Real.
Particle charge in elementary charge units.
This parameter is only relevant if \textbf{type} is \textbf{charged}.
\item \textbf{ion}: Character.
Name of species resulting of ionizing the current one.
\item \textbf{neutral}: Character.
Name of species resulting of neutralizing the current one.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{boundary}
The array object \textbf{boundary} determines the interaction between surfaces and particles.
These boundaries need to be linked to a specific edge in the mesh.
The accepted variables are:
\begin{itemize}
\item \textbf{name}: Character.
Name of the boundary.
\item \textbf{type}: Character.
Type of boundary.
Accepted values are:
\begin{itemize}
\item \textbf{reflection}: Elastic reflection of particles.
\item \textbf{absorption}: Particle is eliminated from the domain.
The particle is first moved into the edge and its properties are scattered among the edge nodes.
\item \textbf{transparent}: Particle abandon the numerical domain.
\item \textbf{axis}: Identifies the symmetry axis for 2D cylindrical simulations.
It has no actual function.
\end{itemize}
\item \textbf{physicalSurface}: Integer.
Identification of the edge in the mesh file.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{boundaryEM}
The array object \textbf{boundaryEM} determines the boundary conditions for the electromagnetic field.
As with the \textbf{boundary} definition, these must be linked to an edge identified in the mesh file.
The variables for each array element are:
\begin{itemize}
\item \textbf{name}: Character.
Name of the boundary.
\item \textbf{type}: Character.
Type of boundary.
Accepted values are:
\begin{itemize}
\item \textbf{dirichlet}: Elastic reflection of particles.
\end{itemize}
\item \textbf{potential}: Real.
Fixed potential for Dirichlet boundary condition.
\item \textbf{physicalSurface}: Integer.
Identification of the edge in the mesh file.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{inject}
The array \textbf{inject} specifies the injection of particles from different surfaces.
The injection of particles need to be associated to a physicalSurface in the mesh file.
Multiple injections can be associated to the same surface.
\begin{itemize}
\item \textbf{name}: Character.
Name of the injection.
\item \textbf{species}: Character.
Name of the species that is being injected.
\item \textbf{flow}: Real.
Flow of particles going through the surface.
\item \textbf{units}: Character.
Units for the \textbf{flow} parameter.
Available values are:
\begin{itemize}
\item \textbf{A}: Ampere.
\item \textbf{sccm}: Standard cubic centimeter.
\end{itemize}
\item \textbf{v}: Real.
Module of velocity vector, in $\unitfrac{m}{s}$.
\item \textbf{n}: Real.
Array dimension $3$.
Direction of injection.
Norm of vector must be equal $1$.
\item \textbf{velDist}: Character.
Array dimension $3$.
Type of distribution function used to obtain injected particle velocity:
\begin{itemize}
\item \textbf{Maxwellian}: Maxwellian distribution of temperature \textbf{T} and mean \textbf{v} times the value of \textbf{n} in the specified direction.
\item \textbf{Delta}: Dirac's delta distribution function. All particles are injected with velocity \textbf{v} times the value of \textbf{n} in the specified direction.
\end{itemize}
\item \textbf{T}: Real.
Array dimension $3$.
Temperature in each direction.
\item \textbf{physicalSurface}: Integer.
Identification of the edge in the mesh file.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{reference}
This object indicates the reference values used by \Gls{fpakc} to scale the problem variables.
The required parameters are:
\begin{itemize}
\item \textbf{density}: Real.
Reference density in $\unit{m^-3}$.
\item \textbf{mass}: Real.
Reference particle mass in $\unit{kg}$.
\item \textbf{temperature}: Real.
Reference temperature in $\unit{K}$.
\item \textbf{radius}: Real.
Reference atomic radius in $\unit{m}$.
\item \textbf{crossSection}: Real.
Reference cross section in $\unit{m^2}$.
If this value is present, radius is ignored.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{case}
This object determines the simulation time, time step, pushers, weighting scheme and solver for the electromagnetic field.
Accepted variables are:
\begin{itemize}
\item \textbf{tau}: Real.
Array dimension 'number of species'.
Defines the different time steps for each species.
Even if all time steps are equal, they need to be defined as an array.
\item \textbf{time}: Real.
Total simulation time in $\unit{s}$.
\item \textbf{pusher}: Character.
Array dimension 'number of species'.
Indicates the type of pusher used for each species:
\begin{itemize}
\item \textbf{2DCylNeutral}: Pushes particles in a 2D z-r space without any external force.
\item \textbf{2DCylCharged}: Pushes particles in a 2D z-r space including the effect of the electrostatic field.
\item \textbf{1DCartCharged}: Pushes particles in a 1D Cartesian space accounting the the electrostatic field.
\item \textbf{1DRadCharged}: Pushes particles in a 1D cylindrical space (r) accounting the the electrostatic field.
\end{itemize}
\item \textbf{WeightingScheme}: Character.
Indicates the variable weighting scheme to be used in the simulation.
Check Section \ref{sec:weightingScheme} for more information.
If this variable is not present, no scheme is used.
The current available schemes are:
\begin{itemize}
\item \textbf{Volume}: Modifies particle weight as a function of cell volume.
\end{itemize}
\item \textbf{EMSolver}: Character.
Determines the solver for the electromagnetic field.
If no value is supplied, no field is solved.
\begin{itemize}
\item \textbf{Electrostatic}: Solves the Poison equation to obtain the self-consistent electrostatic potential.
\end{itemize}
\item \textbf{initial}: Object.
Array.
Determines initial values for the species.
Required values are:
\begin{itemize}
\item \textbf{speciesName}: Character.
Name of species.
\item \textbf{initialState}: Character.
Plain text file that contains the information about the species macroscopic properties in the grid.
Initial particles are assumed to be Maxwellian.
File must be located at \textbf{output.path}.
The file must contain the following columns in this specific order:
\begin{itemize}
\item \textit{Element}: Integer.
Identifier of the volume in the mesh.
It is not required to specify empty volumes.
\item \textit{Density}: Real.
Species density in $\unit{m^-3}$.
\item \textit{Velocity}: Real.
Three colums representing the initial velocity in each direction.
Units are $\unit{m s^-1}$.
\item \textit{Temperature}: Real.
One column that represents the initial temperature in $\unit{K}$.
\end{itemize}
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{interactions}\label{ssec:input_interactions}
This object determine the different interactions among species.
Acceptable values are:
\begin{itemize}
\item \textbf{folderCollisions}: Character.
Indicates the path to in which the cross section tables are allocated.
\item \textbf{collisions}: Object.
Array.
Contains the different binary collisions.
Multiple collision types can be defined for each pair of species.
Each object in the array is defined by:
\begin{itemize}
\item \textbf{species\_i}, \textbf{species\_j}: Character.
Define the two species involved in the collision processes.
Order is indiferent.
\item \textbf{cTypes}: Object.
Array.
Defines all the collisions between \textbf{species\_i} and \textbf{species\_j}.
Required values are:
\begin{itemize}
\item \textbf{type}: Character.
Collision type.
Accepted values are \textbf{elastic}, \textbf{chargeExchange}, \textbf{ionization} and \textbf{recombination}.
Please refer to Sec. \ref{ssec:collisions} for a description of the different collision types.
\item \textbf{crossSection}: Character.
File in \textbf{interactions.folderCollisions} that contains the cross section data as a 1D table of relative energy (in $\unit{eV}$) and cross section (in $\unit{m^-2}$).
\item \textbf{energyThreshold}: Real.
Energy threshold of the collisional process in $\unit{eV}$.
Only valid for \textbf{ionization} and \textbf{recombination} processes.
\item \textbf{electron}: Character.
Name of species designed as electrons.
Only valid for \textbf{ionization} and \textbf{recombination} processes.
\end{itemize}
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{parallel}
This object contains the information related to parallelization of \Gls{fpakc}.
Current values accepted are:
\begin{itemize}
\item \textbf{OpenMP}: Object.
Defines the parameters for the \Gls{openmp} shared memory parallelization.
\begin{itemize}
\item \textbf{nThreads}: Integer.
Number of threads to be used by \Gls{openmp}.
Try to match this to the number of threads of the \acrshort{cpu} used.
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Example runs\label{ch:exampleRuns}}
\section{1D Cathode}
Emission from a 1D cathond in both, cartesian and radial coordinates.
Both cases insert the same amount of electrons from the minimum coordinate and have the same boundary conditions for particles and the electrostatic field.
This case is useful to ilustrate hoy \acrshort{fpakc} can deal with different geometries by just modifiying some parameters in the input file.
The same mesh file (\lstinline|mesh.msh|) is used for both cases.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{ALPHIE Grid system}
Two-dimensional axialsymmetry case to study the counterflow of electrons and Argon ions going trhough the ALPHIE grid system.
A \lstinline|mesh.geo| file is provided to easily modify the parameters of the grid system and generate a new mesh with \Gls{gmsh}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Flow around cylinder}
Simple case of neutral Argon flow around a cylinder in a 2D axialsymmetry geometry.
Elastic collisions between argon particles are included as default.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\printglossaries
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\printbibliography
\end{document}

View file

@ -21,16 +21,20 @@
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
],
"boundary": [
{"name": "Cathode", "type": "absorption", "physicalSurface": 1},
{"name": "Infinite", "type": "absorption", "physicalSurface": 2}
{"name": "Cathode", "physicalSurface": 1, "bTypes": [
{"type": "absorption"}
]},
{"name": "Infinite", "physicalSurface": 2, "bTypes": [
{"type": "transparent"}
]}
],
"boundaryEM": [
{"name": "Cathode", "type": "dirichlet", "potential": -10.0, "physicalSurface": 1},
{"name": "Infinit", "type": "dirichlet", "potential": 0.0, "physicalSurface": 2}
{"name": "Infinite", "type": "dirichlet", "potential": 0.0, "physicalSurface": 2}
],
"inject": [
{"name": "Cathode Electron", "species": "Electron", "flow": 9.0e-5, "units": "A", "v": 27500.0, "T": [2500.0, 2500.0, 2500.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [ 1, 0, 0], "physicalSurface": 1}
],
"case": {
"tau": [1.0e-11],

View file

@ -21,8 +21,12 @@
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
],
"boundary": [
{"name": "Cathode", "type": "absorption", "physicalSurface": 1},
{"name": "Infinite", "type": "absorption", "physicalSurface": 2}
{"name": "Cathode", "physicalSurface": 1, "bTypes": [
{"type": "absorption"}
]},
{"name": "Infinite", "physicalSurface": 2, "bTypes": [
{"type": "transparent"}
]}
],
"boundaryEM": [
{"name": "Cathode", "type": "dirichlet", "potential": -10.0, "physicalSurface": 1},

File diff suppressed because it is too large Load diff

View file

@ -17,12 +17,30 @@
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
],
"boundary": [
{"name": "Ionization Chanber", "type": "absorption", "physicalSurface": 1},
{"name": "Vacuum Chamber", "type": "absorption", "physicalSurface": 2},
{"name": "Exterior", "type": "reflection", "physicalSurface": 3},
{"name": "Grid Extraction", "type": "absorption", "physicalSurface": 4},
{"name": "Grid Acceleration", "type": "absorption", "physicalSurface": 5},
{"name": "Axis", "type": "axis", "physicalSurface": 6}
{"name": "Ionization Chanber", "physicalSurface": 1, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Vacuum Chamber", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Exterior", "physicalSurface": 3, "bTypes": [
{"type": "reflection"},
{"type": "reflection"}
]},
{"name": "Grid Extraction", "physicalSurface": 4, "bTypes": [
{"type": "absorption"},
{"type": "absorption"}
]},
{"name": "Grid Acceleration", "physicalSurface": 5, "bTypes": [
{"type": "absorption"},
{"type": "absorption"}
]},
{"name": "Axis", "physicalSurface": 6, "bTypes": [
{"type": "axis"},
{"type": "axis"}
]}
],
"boundaryEM": [
{"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4},

View file

@ -17,12 +17,30 @@
{"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1}
],
"boundary": [
{"name": "Ionization Chanber", "type": "absorption", "physicalSurface": 1},
{"name": "Vacuum Chamber", "type": "absorption", "physicalSurface": 2},
{"name": "Exterior", "type": "reflection", "physicalSurface": 3},
{"name": "Grid Extraction", "type": "absorption", "physicalSurface": 4},
{"name": "Grid Acceleration", "type": "absorption", "physicalSurface": 5},
{"name": "Axis", "type": "axis", "physicalSurface": 6}
{"name": "Ionization Chanber", "physicalSurface": 1, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Vacuum Chamber", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Exterior", "physicalSurface": 3, "bTypes": [
{"type": "reflection"},
{"type": "reflection"}
]},
{"name": "Grid Extraction", "physicalSurface": 4, "bTypes": [
{"type": "absorption"},
{"type": "absorption"}
]},
{"name": "Grid Acceleration", "physicalSurface": 5, "bTypes": [
{"type": "absorption"},
{"type": "absorption"}
]},
{"name": "Axis", "physicalSurface": 6, "bTypes": [
{"type": "axis"},
{"type": "axis"}
]}
],
"boundaryEM": [
{"name": "Extraction Grid", "type": "dirichlet", "potential": -150.0, "physicalSurface": 4},

114
runs/ALPHIE_Grid/mesh.geo Normal file
View file

@ -0,0 +1,114 @@
Lz = 0.0100;
Lr = 0.0006;
zg1 = 0.0025;
tg1 = 0.0004;
rg1 = 0.0005;
dg = 0.0025;
zg2 = zg1+tg1+dg;
tg2 = tg1;
rg2 = rg1;
Lcell = 0.0001;
Point(1) = { 0, 0, 0, 1};
Point(2) = { zg1, 0, 0, 1};
Point(3) = {zg1+tg1, 0, 0, 1};
Point(4) = { zg2, 0, 0, 1};
Point(5) = {zg2+tg2, 0, 0, 1};
Point(6) = { Lz, 0, 0, 1};
Point(7) = { Lz, rg2, 0, 1};
Point(8) = { Lz, Lr, 0, 1};
Point(9) = {zg2+tg2, Lr, 0, 1};
Point(10) = {zg2+tg2, rg2, 0, 1};
Point(11) = { zg2, rg2, 0, 1};
Point(12) = { zg2, Lr, 0, 1};
Point(13) = {zg1+tg1, Lr, 0, 1};
Point(14) = {zg1+tg1, rg1, 0, 1};
Point(15) = { zg1, rg1, 0, 1};
Point(16) = { zg1, Lr, 0, 1};
Point(17) = { 0, Lr, 0, 1};
Point(18) = { 0, rg1, 0, 1};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 5};
Line(5) = {5, 6};
Line(6) = {6, 7};
Line(7) = {7, 8};
Line(8) = {8, 9};
Line(9) = {9, 10};
Line(10) = {10, 11};
Line(11) = {11, 12};
Line(12) = {12, 13};
Line(13) = {13, 14};
Line(14) = {14, 15};
Line(15) = {15, 16};
Line(16) = {16, 17};
Line(17) = {17, 18};
Line(18) = {18, 1};
Line(19) = {2, 15};
Line(20) = {3, 14};
Line(21) = {4, 11};
Line(22) = {5, 10};
Line(23) = {10, 7};
Line(24) = {14, 11};
Line(25) = {18, 15};
Line Loop(1) = {1, 19, -25, 18};
Plane Surface(1) = {1};
Line Loop(2) = {2, 20, 14,-19};
Plane Surface(2) = {2};
Line Loop(3) = {3, 21, -24,-20};
Plane Surface(3) = {3};
Line Loop(4) = {4, 22, 10,-21};
Plane Surface(4) = {4};
Line Loop(5) = {5, 6, -23,-22};
Plane Surface(5) = {5};
Line Loop(6) = {23, 7, 8, 9};
Plane Surface(6) = {6};
Line Loop(7) = {24, 11, 12, 13};
Plane Surface(7) = {7};
Line Loop(8) = {25, 15, 16, 17};
Plane Surface(8) = {8};
Physical Line(1) = {18, 17};
Physical Line(2) = {6, 7};
Physical Line(3) = {16, 12, 8};
Physical Line(4) = {15, 14, 13};
Physical Line(5) = {11, 10, 9};
Physical Line(6) = {1, 2, 3, 4, 5};
Physical Surface(1) = {1};
Physical Surface(2) = {2};
Physical Surface(3) = {3};
Physical Surface(4) = {4};
Physical Surface(5) = {5};
Physical Surface(6) = {6};
Physical Surface(7) = {7};
Physical Surface(8) = {8};
Transfinite Line {1, 25, 16} = zg1/Lcell + 1 Using Progression 1;
Transfinite Line {2, 14, 4, 10} = tg1/Lcell + 1 Using Progression 1;
Transfinite Line {3, 24, 12} = dg/Lcell + 1 Using Progression 1;
Transfinite Line {5, 23, 8} = (Lz-tg2-zg2)/Lcell + 1 Using Progression 1;
Transfinite Line {18, 19, 20, 21, 22, 6} = rg1/Lcell + 1 Using Progression 1;
Transfinite Line {17, 15, 13, 11, 9, 7} = (Lr-rg1)/Lcell + 1 Using Progression 1;
#Transfinite Surface{1};
#Recombine Surface {1};
#Transfinite Surface{2};
#Recombine Surface {2};
#Transfinite Surface{3};
#Recombine Surface {3};
#Transfinite Surface{4};
#Recombine Surface {4};
#Transfinite Surface{5};
#Recombine Surface {5};
#Transfinite Surface{6};
#Recombine Surface {6};
#Transfinite Surface{7};
#Recombine Surface {7};
#Transfinite Surface{8};
#Recombine Surface {8};

View file

@ -0,0 +1,68 @@
{
"output": {
"path": "./runs/Argon_Expansion/",
"triggerOutput": 10,
"cpuTime": false,
"numColl": true
},
"geometry": {
"type": "2DCyl",
"meshType": "gmsh",
"meshFile": "mesh.msh"
},
"species": [
{"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 1.0e8, "ion": "Argon+"},
{"name": "Argon+", "type": "charged", "mass": 6.633e-26, "weight": 1.0e8, "charge": 1.0, "neutral": "Argon"}
],
"boundary": [
{"name": "Injection", "physicalSurface": 1, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Exterior", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Axis", "physicalSurface": 3, "bTypes": [
{"type": "axis"},
{"type": "axis"}
]}
],
"inject": [
{"name": "Exhausts Ar", "species": "Argon", "flow": 0.7, "units": "sccm", "v": 300.0, "T": [300.0, 300.0, 300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [1, 0, 0], "physicalSurface": 1},
{"name": "Exhausts Ar+", "species": "Argon+", "flow": 0.3, "units": "sccm", "v": 40000.0, "T": [300.0, 300.0, 300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [1, 0, 0], "physicalSurface": 1}
],
"reference": {
"density": 1.0e19,
"mass": 6.633e-26,
"temperature": 300.0,
"radius": 1.88e-10
},
"case": {
"tau": [1.0e-6, 1.0e-6],
"time": 4.0e-3,
"pusher": ["2DCylNeutral", "2DCylNeutral"],
"WeightingScheme": "Volume"
},
"interactions": {
"folderCollisions": "./data/collisions/",
"collisions": [
{"species_i": "Argon", "species_j": "Argon",
"cTypes": [
{"type": "elastic", "crossSection": "EL_Ar-Ar.dat"}
]},
{"species_i": "Argon", "species_j": "Argon+",
"cTypes": [
{"type": "elastic", "crossSection": "EL_Ar-Ar.dat"},
{"type": "chargeExchange", "crossSection": "CX_Ar-Ar+.dat"}
]}
]
},
"parallel": {
"OpenMP":{
"nThreads": 24
}
}
}

View file

@ -0,0 +1,67 @@
{
"output": {
"path": "./runs/Argon_Expansion/",
"triggerOutput": 10,
"cpuTime": false,
"numColl": false
},
"geometry": {
"type": "2DCyl",
"meshType": "gmsh",
"meshFile": "mesh.msh"
},
"species": [
{"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 1.0e8, "ion": "Argon+"},
{"name": "Argon+", "type": "charged", "mass": 6.633e-26, "weight": 1.0e8, "charge": 1.0, "neutral": "Argon"}
],
"boundary": [
{"name": "Injection", "physicalSurface": 1, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Exterior", "physicalSurface": 2, "bTypes": [
{"type": "transparent"},
{"type": "transparent"}
]},
{"name": "Axis", "physicalSurface": 3, "bTypes": [
{"type": "axis"},
{"type": "axis"}
]}
],
"inject": [
{"name": "Exhausts Ar", "species": "Argon", "flow": 0.7, "units": "sccm", "v": 300.0, "T": [300.0, 300.0, 300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [1, 0, 0], "physicalSurface": 1},
{"name": "Exhausts Ar+", "species": "Argon+", "flow": 0.3, "units": "sccm", "v": 40000.0, "T": [300.0, 300.0, 300.0],
"velDist": ["Maxwellian", "Maxwellian", "Maxwellian"], "n": [1, 0, 0], "physicalSurface": 1}
],
"reference": {
"density": 1.0e19,
"mass": 6.633e-26,
"temperature": 300.0,
"radius": 1.88e-10
},
"case": {
"tau": [1.0e-6, 1.0e-6],
"time": 4.0e-3,
"pusher": ["2DCylNeutral", "2DCylNeutral"],
"WeightingScheme": "Volume"
},
"interactions": {
"folderCollisions": "./data/collisions/",
"collisions": [
{"species_i": "Argon", "species_j": "Argon",
"cTypes": [
{"type": "elastic", "crossSection": "EL_Ar-Ar.dat"}
]},
{"species_i": "Argon", "species_j": "Argon+",
"cTypes": [
{"type": "elastic", "crossSection": "EL_Ar-Ar.dat"}
]}
]
},
"parallel": {
"OpenMP":{
"nThreads": 8
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -14,11 +14,21 @@
{"name": "Argon", "type": "neutral", "mass": 6.633e-26, "weight": 5.0e8}
],
"boundary": [
{"name": "Injection", "type": "absorption", "physicalSurface": 1},
{"name": "Chamber Walls", "type": "reflection", "physicalSurface": 2},
{"name": "Exterior", "type": "absorption", "physicalSurface": 3},
{"name": "Cylinder Walls", "type": "reflection", "physicalSurface": 4},
{"name": "Axis", "type": "axis", "physicalSurface": 5}
{"name": "Injection", "physicalSurface": 1, "bTypes": [
{"type": "transparent"}
]},
{"name": "Chamber Walls", "physicalSurface": 2, "bTypes": [
{"type": "reflection"}
]},
{"name": "Exterior", "physicalSurface": 3, "bTypes": [
{"type": "transparent"}
]},
{"name": "Cylinder Walls", "physicalSurface": 4, "bTypes": [
{"type": "reflection"}
]},
{"name": "Axis", "physicalSurface": 5, "bTypes": [
{"type": "axis"}
]}
],
"inject": [
{"name": "Nozzle", "species": "Argon", "flow": 10.0, "units": "sccm", "v": 300.0, "T": [300.0, 300.0, 300.0],
@ -31,15 +41,18 @@
"radius": 1.88e-10
},
"case": {
"tau": [6.0e-7],
"time": 3.0e-3,
"tau": [5.0e-7],
"time": 1.0e-3,
"pusher": ["2DCylNeutral"],
"WeightingScheme": "Volume"
},
"interactions": {
"folderCollisions": "./data/collisions/",
"collisions": [
{"species_i": "Argon", "species_j": "Argon", "crossSections": ["Ar-Ar_Elastic.dat"]}
{"species_i": "Argon", "species_j": "Argon",
"cTypes": [
{"type": "elastic", "crossSection": "EL_Ar-Ar.dat"}
]}
]
},
"parallel": {

View file

@ -2,12 +2,11 @@
PROGRAM fpakc
USE moduleInput
USE moduleErrors
USE OMP_LIB
USE moduleInject
USE moduleSolver
USE moduleOutput
USE moduleCompTime
USE moduleMesh
USE moduleCaseParam
USE OMP_LIB
IMPLICIT NONE
! t = time step
@ -27,8 +26,17 @@ PROGRAM fpakc
!Reads the json configuration file
CALL readConfig(inputFile)
!$OMP PARALLEL DEFAULT(SHARED)
!$OMP SINGLE
CALL verboseError("Initial scatter of particles...")
!$OMP END SINGLE
CALL doScatter()
!$OMP SINGLE
CALL verboseError("Calculating initial EM field...")
!$OMP END SINGLE
CALL doEMField()
!$OMP END PARALLEL
tStep = omp_get_wtime() - tStep

View file

@ -3,7 +3,7 @@ OBJECTS = $(OBJDIR)/moduleMesh.o $(OBJDIR)/moduleCompTime.o $(OBJDIR)/moduleSolv
$(OBJDIR)/moduleErrors.o $(OBJDIR)/moduleList.o $(OBJDIR)/moduleOutput.o \
$(OBJDIR)/moduleBoundary.o $(OBJDIR)/moduleCaseParam.o $(OBJDIR)/moduleRefParam.o \
$(OBJDIR)/moduleCollisions.o $(OBJDIR)/moduleTable.o $(OBJDIR)/moduleParallel.o \
$(OBJDIR)/moduleEM.o \
$(OBJDIR)/moduleEM.o $(OBJDIR)/moduleRandom.o \
$(OBJDIR)/moduleMeshCyl.o $(OBJDIR)/moduleMeshCylRead.o $(OBJDIR)/moduleMeshCylBoundary.o \
$(OBJDIR)/moduleMesh1DCart.o $(OBJDIR)/moduleMesh1DCartRead.o $(OBJDIR)/moduleMesh1DCartBoundary.o \
$(OBJDIR)/moduleMesh1DRad.o $(OBJDIR)/moduleMesh1DRadRead.o $(OBJDIR)/moduleMesh1DRadBoundary.o

View file

@ -2,20 +2,20 @@
OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o \
moduleOutput.o moduleInput.o moduleSolver.o \
moduleCollisions.o moduleTable.o moduleParallel.o \
moduleEM.o
moduleEM.o moduleRandom.o
all: $(OBJS) mesh.o
mesh.o: moduleCollisions.o moduleBoundary.o
$(MAKE) -C mesh all
moduleCollisions.o: moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90
moduleCollisions.o: moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleInput.o: moduleParallel.o moduleRefParam.o moduleCaseParam.o moduleSolver.o moduleInject.o moduleBoundary.o moduleErrors.o moduleSpecies.o moduleInput.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleInject.o: moduleSpecies.o moduleSolver.o moduleInject.f90
moduleInject.o: moduleRandom.o moduleSpecies.o moduleSolver.o moduleInject.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90
@ -24,6 +24,9 @@ moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90
moduleOutput.o: moduleSpecies.o moduleRefParam.o moduleOutput.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleRandom.o: moduleConstParam.o moduleRandom.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleRefParam.o: moduleConstParam.o moduleRefParam.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@

View file

@ -15,7 +15,7 @@ MODULE moduleMesh1DCart
END TYPE meshNode1DCart
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshEdge):: meshEdge1DCart
TYPE, PUBLIC, EXTENDS(meshEdge):: meshEdge1DCart
!Element coordinates
REAL(8):: x = 0.D0
!Connectivity to nodes
@ -23,10 +23,50 @@ MODULE moduleMesh1DCart
CONTAINS
PROCEDURE, PASS:: init => initEdge1DCart
PROCEDURE, PASS:: getNodes => getNodes1DCart
PROCEDURE, PASS:: randPos => randPos1DCart
PROCEDURE, PASS:: randPos => randPosEdge
END TYPE meshEdge1DCart
!Boundary functions defined in the submodule Boundary
INTERFACE
MODULE SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE reflection
MODULE SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE absorption
MODULE SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE transparent
MODULE SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE wallTemperature
END INTERFACE
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol1DCart
CONTAINS
PROCEDURE, PASS:: detJac => detJ1DCart
@ -70,6 +110,7 @@ MODULE moduleMesh1DCart
REAL(8):: arNodes(1:2)
CONTAINS
PROCEDURE, PASS:: init => initVol1DCartSegm
PROCEDURE, PASS:: randPos => randPos1DCartSeg
PROCEDURE, PASS:: area => areaSegm
PROCEDURE, NOPASS:: fPsi => fPsiSegm
PROCEDURE, NOPASS:: dPsi => dPsiSegm
@ -83,7 +124,6 @@ MODULE moduleMesh1DCart
PROCEDURE, PASS:: getNodes => getNodesSegm
PROCEDURE, PASS:: phy2log => phy2logSegm
PROCEDURE, PASS:: nextElement => nextElementSegm
PROCEDURE, PASS:: resetOutput => resetOutputSegm
END TYPE meshVol1DCartSegm
@ -122,6 +162,9 @@ MODULE moduleMesh1DCart
!EDGE FUNCTIONS
!Inits edge element
SUBROUTINE initEdge1DCart(self, n, p, bt, physicalSurface)
USE moduleSpecies
USE moduleBoundary
USE moduleErrors
IMPLICIT NONE
CLASS(meshEdge1DCart), INTENT(out):: self
@ -130,6 +173,7 @@ MODULE moduleMesh1DCart
INTEGER, INTENT(in):: bt
INTEGER, INTENT(in):: physicalSurface
REAL(8), DIMENSION(1:3):: r1
INTEGER:: s
self%n = n
self%n1 => mesh%nodes(p(1))%obj
@ -141,7 +185,30 @@ MODULE moduleMesh1DCart
self%normal = (/ 1.D0, 0.D0, 0.D0 /)
!Boundary index
self%bt = bt
self%boundary => boundary(bt)
ALLOCATE(self%fboundary(1:nSpecies))
!Assign functions to boundary
DO s = 1, nSpecies
SELECT TYPE(obj => self%boundary%bTypes(s)%obj)
TYPE IS(boundaryAbsorption)
self%fBoundary(s)%apply => absorption
TYPE IS(boundaryReflection)
self%fBoundary(s)%apply => reflection
TYPE IS(boundaryTransparent)
self%fBoundary(s)%apply => transparent
TYPE IS(boundaryWallTemperature)
self%fBoundary(s)%apply => wallTemperature
CLASS DEFAULT
CALL criticalError("Boundary type not defined in this geometry", 'initEdge1DCart')
END SELECT
END DO
!Physical Surface
self%physicalSurface = physicalSurface
@ -160,13 +227,13 @@ MODULE moduleMesh1DCart
END FUNCTION getNodes1DCart
!Calculates a 'random' position in edge
FUNCTION randPos1DCart(self) RESULT(r)
FUNCTION randPosEdge(self) RESULT(r)
CLASS(meshEdge1DCart), INTENT(in):: self
REAL(8):: r(1:3)
r = (/ self%x, 0.D0, 0.D0 /)
END FUNCTION randPos1DCart
END FUNCTION randPosEdge
!VOLUME FUNCTIONS
!SEGMENT FUNCTIONS
@ -199,6 +266,24 @@ MODULE moduleMesh1DCart
END SUBROUTINE initVol1DCartSegm
!Calculates a random position in 1D volume
FUNCTION randPos1DCartSeg(self) RESULT(r)
USE moduleRandom
IMPLICIT NONE
CLASS(meshVol1DCartSegm), INTENT(in):: self
REAL(8):: r(1:3)
REAL(8):: xii(1:3)
REAL(8), ALLOCATABLE:: fPsi(:)
xii(1) = random(-1.D0, 1.D0)
xii(2:3) = 0.D0
fPsi = self%fPsi(xii)
r(1) = DOT_PRODUCT(fPsi, self%x)
END FUNCTION randPos1DCartSeg
!Computes element area
PURE SUBROUTINE areaSegm(self)
IMPLICIT NONE
@ -412,30 +497,8 @@ MODULE moduleMesh1DCart
END SUBROUTINE nextElementSegm
!Reset the output of nodes in element
PURE SUBROUTINE resetOutputSegm(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshVol1DCartSegm), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%n1%output(k)%den = 0.D0
self%n1%output(k)%mom = 0.D0
self%n1%output(k)%tensorS = 0.D0
self%n2%output(k)%den = 0.D0
self%n2%output(k)%mom = 0.D0
self%n2%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutputSegm
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Calculates a random position in 1D volume
!Computes the element Jacobian determinant
PURE FUNCTION detJ1DCart(self, xi, dPsi_in) RESULT(dJ)
IMPLICIT NONE

View file

@ -1,40 +1,91 @@
MODULE moduleMesh1DCartBoundary
SUBMODULE (moduleMesh1DCart) moduleMesh1DCartBoundary
USE moduleMesh1DCart
TYPE, PUBLIC, EXTENDS(meshEdge1DCart):: meshEdge1DCartRef
CONTAINS
PROCEDURE, PASS:: fBoundary => reflection
END TYPE meshEdge1DCartRef
TYPE, PUBLIC, EXTENDS(meshEdge1DCart):: meshEdge1DCartAbs
CONTAINS
PROCEDURE, PASS:: fBoundary => absorption
END TYPE meshEdge1DCartAbs
CONTAINS
SUBROUTINE reflection(self, part)
SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge1DCartRef), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
part%v(1) = -part%v(1)
part%r(1) = 2.D0*self%x - part%r(1)
SELECT TYPE(edge)
TYPE IS(meshEdge1DCart)
part%v(1) = -part%v(1)
part%r(1) = 2.D0*edge%x - part%r(1)
END SELECT
END SUBROUTINE reflection
SUBROUTINE absorption(self, part)
SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge1DCartAbs), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
REAL(8):: rEdge(1) !Position of particle in the edge
REAL(8):: d !Distance from particle to edge
SELECT TYPE(edge)
TYPE IS(meshEdge1DCart)
rEdge(1) = edge%x
d = DABS(part%r(1) - rEdge(1))
IF (d > 0.D0) THEN
part%weight = part%weight / d
part%r(1) = rEdge(1)
END IF
IF (ASSOCIATED(edge%e1)) THEN
CALL edge%e1%scatter(part)
ELSE
CALL edge%e2%scatter(part)
END IF
END SELECT
part%n_in = .FALSE.
END SUBROUTINE absorption
END MODULE moduleMesh1DCartBoundary
SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
part%n_in = .FALSE.
END SUBROUTINE transparent
SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
USE moduleBoundary
USE moduleRandom
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
!Modifies particle velocity according to wall temperature
SELECT TYPE(bound => edge%boundary%bTypes(part%sp)%obj)
TYPE IS(boundaryWallTemperature)
part%v(1) = part%v(1) + bound%vTh*randomMaxwellian()
END SELECT
SELECT TYPE(edge)
TYPE IS(meshEdge1DCart)
part%v(1) = -part%v(1)
part%r(1) = 2.D0*edge%x - part%r(1)
END SELECT
END SUBROUTINE wallTemperature
END SUBMODULE moduleMesh1DCartBoundary

View file

@ -1,7 +1,6 @@
MODULE moduleMesh1DCartRead
USE moduleMesh
USE moduleMesh1DCart
USE moduleMesh1DCartBoundary
!TODO: make this abstract to allow different mesh formats
TYPE, EXTENDS(meshGeneric):: mesh1DCartGeneric
@ -107,14 +106,8 @@ MODULE moduleMesh1DCartRead
READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1)
!Associate boundary condition
bt = getBoundaryId(boundaryType)
SELECT CASE(boundary(bt)%obj%boundaryType)
CASE ('reflection')
ALLOCATE(meshEdge1DCartRef:: self%edges(e)%obj)
CASE ('absorption')
ALLOCATE(meshEdge1DCartAbs:: self%edges(e)%obj)
END SELECT
ALLOCATE(meshEdge1DCart:: self%edges(e)%obj)
CALL self%edges(e)%obj%init(n, p(1:1), bt, boundaryType)

View file

@ -15,7 +15,7 @@ MODULE moduleMesh1DRad
END TYPE meshNode1DRad
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshEdge):: meshEdge1DRad
TYPE, PUBLIC, EXTENDS(meshEdge):: meshEdge1DRad
!Element coordinates
REAL(8):: r = 0.D0
!Connectivity to nodes
@ -27,6 +27,46 @@ MODULE moduleMesh1DRad
END TYPE meshEdge1DRad
!Boundary functions defined in the submodule Boundary
INTERFACE
MODULE SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE reflection
MODULE SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE absorption
MODULE SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE transparent
MODULE SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE wallTemperature
END INTERFACE
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol1DRad
CONTAINS
PROCEDURE, PASS:: detJac => detJ1DRad
@ -35,7 +75,7 @@ MODULE moduleMesh1DRad
PROCEDURE(dPsi_interface), DEFERRED, NOPASS:: dPsi
PROCEDURE(partialDer_interface), DEFERRED, PASS:: partialDer
END TYPE meshVol1Drad
END TYPE meshVol1DRad
ABSTRACT INTERFACE
PURE FUNCTION fPsi_interface(xi) RESULT(fPsi)
@ -71,6 +111,7 @@ MODULE moduleMesh1DRad
REAL(8):: arNodes(1:2)
CONTAINS
PROCEDURE, PASS:: init => initVol1DRadSegm
PROCEDURE, PASS:: randPos => randPos1DRadSeg
PROCEDURE, PASS:: area => areaRad
PROCEDURE, NOPASS:: fPsi => fPsiRad
PROCEDURE, NOPASS:: dPsi => dPsiRad
@ -84,7 +125,6 @@ MODULE moduleMesh1DRad
PROCEDURE, PASS:: getNodes => getNodesRad
PROCEDURE, PASS:: phy2log => phy2logRad
PROCEDURE, PASS:: nextElement => nextElementRad
PROCEDURE, PASS:: resetOutput => resetOutputRad
END TYPE meshVol1DRadSegm
@ -123,6 +163,9 @@ MODULE moduleMesh1DRad
!EDGE FUNCTIONS
!Inits edge element
SUBROUTINE initEdge1DRad(self, n, p, bt, physicalSurface)
USE moduleSpecies
USE moduleBoundary
USE moduleErrors
IMPLICIT NONE
CLASS(meshEdge1DRad), INTENT(out):: self
@ -131,6 +174,7 @@ MODULE moduleMesh1DRad
INTEGER, INTENT(in):: bt
INTEGER, INTENT(in):: physicalSurface
REAL(8), DIMENSION(1:3):: r1
INTEGER:: s
self%n = n
self%n1 => mesh%nodes(p(1))%obj
@ -142,7 +186,30 @@ MODULE moduleMesh1DRad
self%normal = (/ 1.D0, 0.D0, 0.D0 /)
!Boundary index
self%bt = bt
self%boundary => boundary(bt)
ALLOCATE(self%fboundary(1:nSpecies))
!Assign functions to boundary
DO s = 1, nSpecies
SELECT TYPE(obj => self%boundary%bTypes(s)%obj)
TYPE IS(boundaryAbsorption)
self%fBoundary(s)%apply => absorption
TYPE IS(boundaryReflection)
self%fBoundary(s)%apply => reflection
TYPE IS(boundaryTransparent)
self%fBoundary(s)%apply => transparent
TYPE IS(boundaryWallTemperature)
self%fBoundary(s)%apply => wallTemperature
CLASS DEFAULT
CALL criticalError("Boundary type not defined in this geometry", 'initEdge1DRad')
END SELECT
END DO
!Physical Surface
self%physicalSurface = physicalSurface
@ -200,6 +267,24 @@ MODULE moduleMesh1DRad
END SUBROUTINE initVol1DRadSegm
!Calculates a random position in 1D volume
FUNCTION randPos1DRadSeg(self) RESULT(r)
USE moduleRandom
IMPLICIT NONE
CLASS(meshVol1DRadSegm), INTENT(in):: self
REAL(8):: r(1:3)
REAL(8):: xii(1:3)
REAL(8), ALLOCATABLE:: fPsi(:)
xii(1) = random(-1.D0, 1.D0)
xii(2:3) = 0.D0
fPsi = self%fPsi(xii)
r(1) = DOT_PRODUCT(fPsi, self%r)
END FUNCTION randPos1DRadSeg
!Computes element area
PURE SUBROUTINE areaRad(self)
IMPLICIT NONE
@ -267,7 +352,7 @@ MODULE moduleMesh1DRad
!Computes local stiffness matrix
PURE FUNCTION elemKRad(self) RESULT(ke)
USE moduleConstParam, ONLY: PI
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVol1DRadSegm), INTENT(in):: self
@ -286,12 +371,12 @@ MODULE moduleMesh1DRad
ke(1,:) = (/ dPsi(1,1)*dPsi(1,1), dPsi(1,1)*dPsi(1,2) /)
ke(2,:) = (/ dPsi(1,2)*dPsi(1,1), dPsi(1,2)*dPsi(1,2) /)
ke = 2.D0*ke*invJ
ke = ke*r*2.D0*PI
ke = ke*r*PI2
END FUNCTION elemKRad
PURE FUNCTION elemFRad(self, source) RESULT(localF)
USE moduleConstParam, ONLY: PI
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVol1DRadSegm), INTENT(in):: self
@ -308,7 +393,7 @@ MODULE moduleMesh1DRad
r = DOT_PRODUCT(fPsi,self%r)
ALLOCATE(localF(1:2))
localF = 2.D0*DOT_PRODUCT(fPsi, source)*detJ
localF = localF*r*2.D0*PI
localF = localF*r*PI2
END FUNCTION elemFRad
@ -424,29 +509,6 @@ MODULE moduleMesh1DRad
END SUBROUTINE nextElementRad
!Reset the output of nodes in element
PURE SUBROUTINE resetOutputRad(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshVol1DRadSegm), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%n1%output(k)%den = 0.D0
self%n1%output(k)%mom = 0.D0
self%n1%output(k)%tensorS = 0.D0
self%n2%output(k)%den = 0.D0
self%n2%output(k)%mom = 0.D0
self%n2%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutputRad
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Computes the element Jacobian determinant
PURE FUNCTION detJ1DRad(self, xi, dPsi_in) RESULT(dJ)

View file

@ -1,40 +1,93 @@
MODULE moduleMesh1DRadBoundary
SUBMODULE (moduleMesh1DRad) moduleMesh1DRadBoundary
USE moduleMesh1DRad
TYPE, PUBLIC, EXTENDS(meshEdge1DRad):: meshEdge1DRadRef
CONTAINS
PROCEDURE, PASS:: fBoundary => reflection
END TYPE meshEdge1DRadRef
TYPE, PUBLIC, EXTENDS(meshEdge1DRad):: meshEdge1DRadAbs
CONTAINS
PROCEDURE, PASS:: fBoundary => absorption
END TYPE meshEdge1DRadAbs
CONTAINS
SUBROUTINE reflection(self, part)
SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge1DRadRef), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
part%v(1) = -part%v(1)
part%r(1) = 2.D0*self%r - part%r(1)
SELECT TYPE(edge)
TYPE IS(meshEdge1DRad)
part%v(1) = -part%v(1)
part%r(1) = 2.D0*edge%r - part%r(1)
END SELECT
part%n_in = .TRUE.
END SUBROUTINE reflection
SUBROUTINE absorption(self, part)
SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge1DRadAbs), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
REAL(8):: rEdge(1) !Position of particle in the edge
REAL(8):: d !Distance from particle to edge
SELECT TYPE(edge)
TYPE IS(meshEdge1DRad)
rEdge(1) = edge%r
d = DABS(part%r(1) - rEdge(1))
IF (d > 0.D0) THEN
part%weight = part%weight / d
part%r(1) = rEdge(1)
END IF
IF (ASSOCIATED(edge%e1)) THEN
CALL edge%e1%scatter(part)
ELSE
CALL edge%e2%scatter(part)
END IF
END SELECT
part%n_in = .FALSE.
END SUBROUTINE absorption
END MODULE moduleMesh1DRadBoundary
SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
part%n_in = .FALSE.
END SUBROUTINE transparent
SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
USE moduleBoundary
USE moduleRandom
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
!Modifies particle velocity according to wall temperature
SELECT TYPE(bound => edge%boundary%bTypes(part%sp)%obj)
TYPE IS(boundaryWallTemperature)
part%v(1) = part%v(1) + bound%vTh*randomMaxwellian()
END SELECT
SELECT TYPE(edge)
TYPE IS(meshEdge1DRad)
part%v(1) = -part%v(1)
part%r(1) = 2.D0*edge%r - part%r(1)
END SELECT
END SUBROUTINE wallTemperature
END SUBMODULE moduleMesh1DRadBoundary

View file

@ -1,7 +1,6 @@
MODULE moduleMesh1DRadRead
USE moduleMesh
USE moduleMesh1DRad
USE moduleMesh1DRadBoundary
!TODO: make this abstract to allow different mesh formats
TYPE, EXTENDS(meshGeneric):: mesh1DRadGeneric
@ -107,14 +106,8 @@ MODULE moduleMesh1DRadRead
READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1)
!Associate boundary condition
bt = getBoundaryId(boundaryType)
SELECT CASE(boundary(bt)%obj%boundaryType)
CASE ('reflection')
ALLOCATE(meshEdge1DRadRef:: self%edges(e)%obj)
CASE ('absorption')
ALLOCATE(meshEdge1DRadAbs:: self%edges(e)%obj)
END SELECT
ALLOCATE(meshEdge1DRad:: self%edges(e)%obj)
CALL self%edges(e)%obj%init(n, p(1:1), bt, boundaryType)

View file

@ -23,7 +23,7 @@ MODULE moduleMeshCyl
END TYPE meshNodeCyl
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshEdge):: meshEdgeCyl
TYPE, PUBLIC, EXTENDS(meshEdge):: meshEdgeCyl
!Element coordinates
REAL(8):: r(1:2) = 0.D0, z(1:2) = 0.D0
!Connectivity to nodes
@ -31,10 +31,59 @@ MODULE moduleMeshCyl
CONTAINS
PROCEDURE, PASS:: init => initEdgeCyl
PROCEDURE, PASS:: getNodes => getNodesCyl
PROCEDURE, PASS:: randPos => randPosCyl
PROCEDURE, PASS:: randPos => randPosEdge
END TYPE meshEdgeCyl
!Boundary functions defined in the submodule Boundary
INTERFACE
MODULE SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE reflection
MODULE SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE absorption
MODULE SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE wallTemperature
MODULE SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE transparent
MODULE SUBROUTINE symmetryAxis(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE symmetryAxis
END INTERFACE
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVolCyl
CONTAINS
PROCEDURE, PASS:: detJac => detJCyl
@ -68,6 +117,7 @@ MODULE moduleMeshCyl
END INTERFACE
!Quadrilateral volume element
TYPE, PUBLIC, EXTENDS(meshVolCyl):: meshVolCylQuad
!Element coordinates
REAL(8):: r(1:4) = 0.D0, z(1:4) = 0.D0
@ -79,6 +129,7 @@ MODULE moduleMeshCyl
CONTAINS
PROCEDURE, PASS:: init => initVolQuadCyl
PROCEDURE, PASS:: randPos => randPosVolQuad
PROCEDURE, PASS:: area => areaQuad
PROCEDURE, NOPASS:: fPsi => fPsiQuad
PROCEDURE, NOPASS:: dPsi => dPsiQuad
@ -94,10 +145,10 @@ MODULE moduleMeshCyl
PROCEDURE, PASS:: getNodes => getNodesQuad
PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: nextElement => nextElementQuad
PROCEDURE, PASS:: resetOutput => resetOutputQuad
END TYPE meshVolCylQuad
!Triangular volume element
TYPE, PUBLIC, EXTENDS(meshVolCyl):: meshVolCylTria
!Element coordinates
REAL(8):: r(1:3) = 0.D0, z(1:3) = 0.D0
@ -111,6 +162,7 @@ MODULE moduleMeshCyl
CONTAINS
PROCEDURE, PASS:: init => initVolTriaCyl
PROCEDURE, PASS:: randPos => randPosVolTria
PROCEDURE, PASS:: area => areaTria
PROCEDURE, NOPASS:: fPsi => fPsiTria
PROCEDURE, NOPASS:: dPsi => dPsiTria
@ -126,12 +178,10 @@ MODULE moduleMeshCyl
PROCEDURE, PASS:: getNodes => getNodesTria
PROCEDURE, PASS:: phy2log => phy2logTria
PROCEDURE, PASS:: nextElement => nextElementTria
PROCEDURE, PASS:: resetOutput => resetOutputTria
END TYPE meshVolCylTria
CONTAINS
!NODE FUNCTIONS
!Inits node element
SUBROUTINE initNodeCyl(self, n, r)
@ -154,6 +204,7 @@ MODULE moduleMeshCyl
END SUBROUTINE initNodeCyl
!Get coordinates from node
PURE FUNCTION getCoordCyl(self) RESULT(r)
IMPLICIT NONE
@ -167,6 +218,9 @@ MODULE moduleMeshCyl
!EDGE FUNCTIONS
!Inits edge element
SUBROUTINE initEdgeCyl(self, n, p, bt, physicalSurface)
USE moduleSpecies
USE moduleBoundary
USE moduleErrors
IMPLICIT NONE
CLASS(meshEdgeCyl), INTENT(out):: self
@ -175,6 +229,7 @@ MODULE moduleMeshCyl
INTEGER, INTENT(in):: bt
INTEGER, INTENT(in):: physicalSurface
REAL(8), DIMENSION(1:3):: r1, r2
INTEGER:: s
self%n = n
self%n1 => mesh%nodes(p(1))%obj
@ -189,12 +244,60 @@ MODULE moduleMeshCyl
self%z(2)-self%z(1), &
0.D0 /)
!Boundary index
self%bt = bt
!Phyiscal Surface
self%boundary => boundary(bt)
ALLOCATE(self%fboundary(1:nSpecies))
!Assign functions to boundary
DO s = 1, nSpecies
SELECT TYPE(obj => self%boundary%bTypes(s)%obj)
TYPE IS(boundaryAbsorption)
self%fBoundary(s)%apply => absorption
TYPE IS(boundaryReflection)
self%fBoundary(s)%apply => reflection
TYPE IS(boundaryTransparent)
self%fBoundary(s)%apply => transparent
TYPE IS(boundaryWallTemperature)
self%fBoundary(s)%apply => wallTemperature
TYPE IS(boundaryAxis)
self%fBoundary(s)%apply => symmetryAxis
CLASS DEFAULT
CALL criticalError("Boundary type not defined in this geometry", 'initEdgeCyl')
END SELECT
END DO
!Physical surface
self%physicalSurface = physicalSurface
END SUBROUTINE initEdgeCyl
!Random position in quadrilateral volume
FUNCTION randPosVolQuad(self) RESULT(r)
USE moduleRandom
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(in):: self
REAL(8):: r(1:3)
REAL(8):: xii(1:3)
REAL(8), ALLOCATABLE:: fPsi(:)
xii(1) = random(-1.D0, 1.D0)
xii(2) = random(-1.D0, 1.D0)
xii(3) = 0.D0
fPsi = self%fPsi(xii)
r(1) = DOT_PRODUCT(fPsi, self%z)
r(2) = DOT_PRODUCT(fPsi, self%r)
r(3) = 0.D0
END FUNCTION randposVolQuad
!Get nodes from edge
PURE FUNCTION getNodesCyl(self) RESULT(n)
IMPLICIT NONE
@ -208,20 +311,23 @@ MODULE moduleMeshCyl
END FUNCTION getNodesCyl
!Calculates a random position in edge
FUNCTION randPosCyl(self) RESULT(r)
FUNCTION randPosEdge(self) RESULT(r)
USE moduleRandom
IMPLICIT NONE
CLASS(meshEdgeCyl), INTENT(in):: self
REAL(8):: rnd
REAL(8):: r(1:3)
REAL(8):: p1(1:2), p2(1:2)
CALL RANDOM_NUMBER(rnd)
rnd = random()
p1 = (/self%z(1), self%r(1) /)
p2 = (/self%z(2), self%r(2) /)
r(1:2) = (1.D0 - rnd)*p1 + rnd*p2
r(3) = 0.D0
END FUNCTION randPosCyl
END FUNCTION randPosEdge
!VOLUME FUNCTIONS
!QUAD FUNCTIONS
@ -263,7 +369,7 @@ MODULE moduleMeshCyl
!Computes element area
PURE SUBROUTINE areaQuad(self)
USE moduleConstParam
USE moduleConstParam, ONLY: PI8
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(inout):: self
@ -275,7 +381,7 @@ MODULE moduleMeshCyl
self%arNodes = 0.D0
!2D 1 point Gauss Quad Integral
xi = 0.D0
detJ = self%detJac(xi)*8.D0*PI !4*2*pi
detJ = self%detJac(xi)*PI8 !4*2*pi
fPsi = self%fPsi(xi)
r = DOT_PRODUCT(fPsi,self%r)
self%volume = r*detJ
@ -360,7 +466,7 @@ MODULE moduleMeshCyl
!Computes element local stiffness matrix
PURE FUNCTION elemKQuad(self) RESULT(ke)
USE moduleConstParam, ONLY: PI
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(in):: self
@ -387,13 +493,13 @@ MODULE moduleMeshCyl
END DO
END DO
ke = ke*2.D0*PI
ke = ke*PI2
END FUNCTION elemKQuad
!Computes the local source vector for a force f
PURE FUNCTION elemFQuad(self, source) RESULT(localF)
USE moduleConstParam
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(in):: self
@ -419,7 +525,7 @@ MODULE moduleMeshCyl
END DO
END DO
localF = localF*2.D0*PI
localF = localF*PI2
END FUNCTION elemFQuad
@ -579,36 +685,6 @@ MODULE moduleMeshCyl
END SUBROUTINE nextElementQuad
!Reset the output of nodes in quad element
PURE SUBROUTINE resetOutputQuad(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%n1%output(k)%den = 0.D0
self%n1%output(k)%mom = 0.D0
self%n1%output(k)%tensorS = 0.D0
self%n2%output(k)%den = 0.D0
self%n2%output(k)%mom = 0.D0
self%n2%output(k)%tensorS = 0.D0
self%n3%output(k)%den = 0.D0
self%n3%output(k)%mom = 0.D0
self%n3%output(k)%tensorS = 0.D0
self%n4%output(k)%den = 0.D0
self%n4%output(k)%mom = 0.D0
self%n4%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutputQuad
!TRIA ELEMENT
!Init tria element
SUBROUTINE initVolTriaCyl(self, n, p)
@ -660,9 +736,31 @@ MODULE moduleMeshCyl
END SUBROUTINE initVolTriaCyl
!Random position in quadrilateral volume
FUNCTION randPosVolTria(self) RESULT(r)
USE moduleRandom
IMPLICIT NONE
CLASS(meshVolCylTria), INTENT(in):: self
REAL(8):: r(1:3)
REAL(8):: xii(1:3)
REAL(8), ALLOCATABLE:: fPsi(:)
xii(1) = random( 0.D0, 1.D0)
xii(2) = random( 0.D0, 1.D0)
xii(3) = 0.D0
fPsi = self%fPsi(xii)
r(1) = DOT_PRODUCT(fPsi, self%z)
r(2) = DOT_PRODUCT(fPsi, self%r)
r(3) = 0.D0
END FUNCTION randposVolTria
!Calculates area for triangular element
PURE SUBROUTINE areaTria(self)
USE moduleConstParam
USE moduleConstParam, ONLY: PI
IMPLICIT NONE
CLASS(meshVolCylTria), INTENT(inout):: self
@ -753,7 +851,7 @@ MODULE moduleMeshCyl
!Computes element local stiffness matrix
PURE FUNCTION elemKTria(self) RESULT(ke)
USE moduleConstParam
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVolCylTria), INTENT(in):: self
@ -777,13 +875,13 @@ MODULE moduleMeshCyl
ke = ke + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
END DO
ke = ke*2.D0*PI
ke = ke*PI2
END FUNCTION elemKTria
!Computes element local source vector
PURE FUNCTION elemFTria(self, source) RESULT(localF)
USE moduleConstParam
USE moduleConstParam, ONLY: PI2
IMPLICIT NONE
CLASS(meshVolCylTria), INTENT(in):: self
@ -808,7 +906,7 @@ MODULE moduleMeshCyl
localF = localF + r*f*fPsi*wTria(l)*detJ
END DO
localF = localF*2.D0*PI
localF = localF*PI2
END FUNCTION elemFTria
@ -942,33 +1040,6 @@ MODULE moduleMeshCyl
END SUBROUTINE nextElementTria
!Reset the output of nodes in tria element
PURE SUBROUTINE resetOutputTria(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshVolCylTria), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%n1%output(k)%den = 0.D0
self%n1%output(k)%mom = 0.D0
self%n1%output(k)%tensorS = 0.D0
self%n2%output(k)%den = 0.D0
self%n2%output(k)%mom = 0.D0
self%n2%output(k)%tensorS = 0.D0
self%n3%output(k)%den = 0.D0
self%n3%output(k)%mom = 0.D0
self%n3%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutputTria
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
!Computes element Jacobian determinant
PURE FUNCTION detJCyl(self, xi, dPsi_in) RESULT(dJ)

View file

@ -1,80 +1,164 @@
!moduleMeshCylBoundary: Edge elements for Cylindrical mesh.
MODULE moduleMeshCylBoundary
!moduleMeshCylBoundary: Boundary functions for cylindrical coordinates
SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
USE moduleMeshCyl
TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylRef
CONTAINS
PROCEDURE, PASS:: fBoundary => reflection
END TYPE meshEdgeCylRef
TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylAbs
CONTAINS
PROCEDURE, PASS:: fBoundary => absorption
END TYPE meshEdgeCylAbs
TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylAxis
CONTAINS
PROCEDURE, PASS:: fBoundary => symmetryAxis
END TYPE meshEdgeCylAxis
CONTAINS
SUBROUTINE reflection(self, part)
SUBROUTINE reflection(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdgeCylRef), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
REAL(8):: edgeNorm, cosT, sinT, rp(1:2), rpp(1:2), vpp(1:2)
edgeNorm = DSQRT((self%r(2)-self%r(1))**2 + (self%z(2)-self%z(1))**2)
cosT = (self%z(2)-self%z(1))/edgeNorm
sinT = DSQRT(1-cosT**2)
!TODO: Try to do this without select
SELECT TYPE(edge)
TYPE IS(meshEdgeCyl)
edgeNorm = DSQRT((edge%r(2)-edge%r(1))**2 + (edge%z(2)-edge%z(1))**2)
cosT = (edge%z(2)-edge%z(1))/edgeNorm
sinT = DSQRT(1-cosT**2)
rp(1) = part%r(1) - self%z(1);
rp(2) = part%r(2) - self%r(1);
rp(1) = part%r(1) - edge%z(1);
rp(2) = part%r(2) - edge%r(1);
rpp(1) = cosT*rp(1) - sinT*rp(2)
rpp(2) = sinT*rp(1) + cosT*rp(2)
rpp(2) = -rpp(2)
rpp(1) = cosT*rp(1) - sinT*rp(2)
rpp(2) = sinT*rp(1) + cosT*rp(2)
rpp(2) = -rpp(2)
vpp(1) = cosT*part%v(1) - sinT*part%v(2)
vpp(2) = sinT*part%v(1) + cosT*part%v(2)
vpp(2) = -vpp(2)
vpp(1) = cosT*part%v(1) - sinT*part%v(2)
vpp(2) = sinT*part%v(1) + cosT*part%v(2)
vpp(2) = -vpp(2)
part%r(1) = cosT*rpp(1) + sinT*rpp(2) + self%z(1);
part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + self%r(1);
part%v(1) = cosT*vpp(1) + sinT*vpp(2)
part%v(2) = -sinT*vpp(1) + cosT*vpp(2)
part%r(1) = cosT*rpp(1) + sinT*rpp(2) + edge%z(1);
part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + edge%r(1);
part%v(1) = cosT*vpp(1) + sinT*vpp(2)
part%v(2) = -sinT*vpp(1) + cosT*vpp(2)
END SELECT
part%n_in = .TRUE.
END SUBROUTINE reflection
!Absoption in a surface
SUBROUTINE absorption(self, part)
SUBROUTINE absorption(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdgeCylAbs), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
REAL(8):: rEdge(1:2) !Position of particle projected to the edge
REAL(8):: a, b, c
REAL(8):: a2b2
REAL(8):: d !Distance from particle to edge
SELECT TYPE(edge)
TYPE IS(meshEdgeCyl)
a = (edge%z(1) - edge%z(2))
b = (edge%r(1) - edge%r(2))
c = edge%z(1)*edge%r(2) - edge%z(2)*edge%r(1)
!TODO: Add scatter to mesh nodes
a2b2 = a**2 + b**2
rEdge(1) = (b*( b*part%r(1) - a*part%r(2)) - a*c)/a2b2
rEdge(2) = (a*(-b*part%r(1) + a*part%r(2)) - b*c)/a2b2
d = NORM2(rEdge - part%r(1:2))
!Reduce weight of particle by the distance to the edge and move it to the edge
IF (d > 0.D0) THEN
part%weight = part%weight / d
part%r(1:2) = rEdge
END IF
!Scatter particle in associated volume
IF (ASSOCIATED(edge%e1)) THEN
CALL edge%e1%scatter(part)
ELSE
CALL edge%e2%scatter(part)
END IF
END SELECT
!Remove particle from the domain
part%n_in = .FALSE.
END SUBROUTINE absorption
SUBROUTINE symmetryAxis(self, part)
!Transparent boundary condition
SUBROUTINE transparent(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdgeCylAxis), INTENT(inout):: self
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
!Removes particle from domain
part%n_in = .FALSE.
END SUBROUTINE transparent
!Wall with temperature
SUBROUTINE wallTemperature(edge, part)
USE moduleSpecies
USE moduleBoundary
USE moduleRandom
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
REAL(8):: edgeNorm, cosT, sinT, rp(1:2), rpp(1:2), vpp(1:2)
INTEGER:: i
!Modifies particle velocity according to wall temperature
SELECT TYPE(bound => edge%boundary%bTypes(part%sp)%obj)
TYPE IS(boundaryWallTemperature)
DO i = 1, 3
part%v(i) = part%v(i) + bound%vTh*randomMaxwellian()
END DO
END SELECT
!Reflects particle in the edge
SELECT TYPE(edge)
TYPE IS(meshEdgeCyl)
edgeNorm = DSQRT((edge%r(2)-edge%r(1))**2 + (edge%z(2)-edge%z(1))**2)
cosT = (edge%z(2)-edge%z(1))/edgeNorm
sinT = DSQRT(1-cosT**2)
rp(1) = part%r(1) - edge%z(1);
rp(2) = part%r(2) - edge%r(1);
rpp(1) = cosT*rp(1) - sinT*rp(2)
rpp(2) = sinT*rp(1) + cosT*rp(2)
rpp(2) = -rpp(2)
vpp(1) = cosT*part%v(1) - sinT*part%v(2)
vpp(2) = sinT*part%v(1) + cosT*part%v(2)
vpp(2) = -vpp(2)
part%r(1) = cosT*rpp(1) + sinT*rpp(2) + edge%z(1);
part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + edge%r(1);
part%v(1) = cosT*vpp(1) + sinT*vpp(2)
part%v(2) = -sinT*vpp(1) + cosT*vpp(2)
END SELECT
part%n_in = .TRUE.
END SUBROUTINE wallTemperature
!Symmetry axis. Dummy function
SUBROUTINE symmetryAxis(edge, part)
USE moduleSpecies
IMPLICIT NONE
CLASS(meshEdge), INTENT(inout):: edge
CLASS(particle), INTENT(inout):: part
END SUBROUTINE symmetryAxis
END MODULE moduleMeshCylBoundary
END SUBMODULE moduleMeshCylBoundary

View file

@ -1,9 +1,7 @@
MODULE moduleMeshCylRead
USE moduleMesh
USE moduleMeshCyl
USE moduleMeshCylBoundary
!TODO: make this abstract to allow different mesh formats
TYPE, EXTENDS(meshGeneric):: meshCylGeneric
CONTAINS
PROCEDURE, PASS:: init => initCylMesh
@ -104,17 +102,8 @@ MODULE moduleMeshCylRead
READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2)
!Associate boundary condition procedure.
bt = getBoundaryId(boundaryType)
SELECT CASE(boundary(bt)%obj%boundaryType)
CASE ('reflection')
ALLOCATE(meshEdgeCylRef:: self%edges(e)%obj)
CASE ('absorption')
ALLOCATE(meshEdgeCylAbs:: self%edges(e)%obj)
CASE ('axis')
ALLOCATE(meshEdgeCylAxis:: self%edges(e)%obj)
END SELECT
ALLOCATE(meshEdgeCyl:: self%edges(e)%obj)
CALL self%edges(e)%obj%init(n, p(1:2), bt, boundaryType)

View file

@ -2,6 +2,7 @@
MODULE moduleMesh
USE moduleList
USE moduleOutput
USE moduleBoundary
IMPLICIT NONE
!Parent of Node element
@ -14,8 +15,9 @@ MODULE moduleMesh
TYPE(outputNode), ALLOCATABLE:: output(:)
TYPE(emNode):: emData
CONTAINS
PROCEDURE(initNode_interface), DEFERRED, PASS:: init
PROCEDURE(getCoord_interface), DEFERRED, PASS:: getCoordinates
PROCEDURE(initNode_interface), DEFERRED, PASS:: init
PROCEDURE(getCoord_interface), DEFERRED, PASS:: getCoordinates
PROCEDURE, PASS:: resetOutput
END TYPE meshNode
@ -45,6 +47,12 @@ MODULE moduleMesh
END TYPE meshNodeCont
!Type for array of boundary functions (one per species)
TYPE, PUBLIC:: fBoundaryGeneric
PROCEDURE(boundary_interface), POINTER, NOPASS:: apply => NULL()
END TYPE
!Parent of Edge element
TYPE, PUBLIC, ABSTRACT:: meshEdge
!Element index
@ -53,15 +61,16 @@ MODULE moduleMesh
CLASS(meshVol), POINTER:: e1 => NULL(), e2 => NULL()
!Normal vector
REAL(8):: normal(1:3)
!Physical surface in mesh
!Pointer to boundary element
TYPE(boundaryCont), POINTER:: boundary
!Array of functions for boundary conditions
TYPE(fBoundaryGeneric), ALLOCATABLE:: fBoundary(:)
!Physical surface for the edge
INTEGER:: physicalSurface
!id for boundary condition
INTEGER:: bt = 0
CONTAINS
PROCEDURE(initEdge_interface), DEFERRED, PASS:: init
PROCEDURE(boundary_interface), DEFERRED, PASS:: fBoundary
PROCEDURE(getNodesEdge_interface), DEFERRED, PASS:: getNodes
PROCEDURE(randPos_interface), DEFERRED, PASS:: randPos
PROCEDURE(randPosEdge_interface), DEFERRED, PASS:: randPos
END TYPE meshEdge
@ -77,15 +86,6 @@ MODULE moduleMesh
END SUBROUTINE initEdge_interface
SUBROUTINE boundary_interface(self, part)
USE moduleSpecies
IMPORT:: meshEdge
CLASS (meshEdge), INTENT(inout):: self
CLASS (particle), INTENT(inout):: part
END SUBROUTINE
PURE FUNCTION getNodesEdge_interface(self) RESULT(n)
IMPORT:: meshEdge
CLASS(meshEdge), INTENT(in):: self
@ -93,12 +93,24 @@ MODULE moduleMesh
END FUNCTION
FUNCTION randPos_interface(self) RESULT(r)
FUNCTION randPosEdge_interface(self) RESULT(r)
IMPORT:: meshEdge
CLASS(meshEdge), INTENT(in):: self
REAL(8):: r(1:3)
END FUNCTION randPos_interface
END FUNCTION randPosEdge_interface
END INTERFACE
INTERFACE
SUBROUTINE boundary_interface(edge, part)
USE moduleSpecies
IMPORT:: meshEdge
CLASS (meshEdge), INTENT(inout):: edge
CLASS (particle), INTENT(inout):: part
END SUBROUTINE
END INTERFACE
@ -113,7 +125,7 @@ MODULE moduleMesh
!Volume index
INTEGER:: n = 0
!Maximum collision rate
REAL(8):: sigmaVrelMax = 1.D-15
REAL(8):: sigmaVrelMax = 0.D0
!Volume
REAL(8):: volume = 0.D0
!List of particles inside the volume
@ -122,20 +134,22 @@ MODULE moduleMesh
INTEGER(KIND=OMP_LOCK_KIND):: lock
!Number of collisions per volume
INTEGER:: nColl = 0
!Collisional fraction
REAL(8):: collFrac = 0.D0
!Total weight of particles inside cell
REAL(8):: totalWeight = 0.D0
CONTAINS
PROCEDURE(initVol_interface), DEFERRED, PASS:: init
PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes
PROCEDURE(randPosVol_interface), DEFERRED, PASS:: randPos
PROCEDURE(scatter_interface), DEFERRED, PASS:: scatter
PROCEDURE(gatherEF_interface), DEFERRED, PASS:: gatherEF
PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes
PROCEDURE(elemF_interface), DEFERRED, PASS:: elemF
PROCEDURE, PASS:: findCell
PROCEDURE(phy2log_interface), DEFERRED, PASS:: phy2log
PROCEDURE(inside_interface), DEFERRED, NOPASS:: inside
PROCEDURE(nextElement_interface), DEFERRED, PASS:: nextElement
PROCEDURE, PASS:: collision
PROCEDURE(resetOutput_interface), DEFERRED, PASS:: resetOutput
END TYPE meshVol
@ -204,17 +218,12 @@ MODULE moduleMesh
END FUNCTION inside_interface
SUBROUTINE collision_interface(self)
FUNCTION randPosVol_interface(self) RESULT(r)
IMPORT:: meshVol
CLASS(meshVol), INTENT(inout):: self
CLASS(meshVol), INTENT(in):: self
REAL(8):: r(1:3)
END SUBROUTINE collision_interface
PURE SUBROUTINE resetOutput_interface(self)
IMPORT:: meshVol
CLASS(meshVol), INTENT(inout):: self
END SUBROUTINE resetOutput_interface
END FUNCTION randPosVol_interface
END INTERFACE
@ -298,6 +307,24 @@ MODULE moduleMesh
CLASS(meshGeneric), ALLOCATABLE, TARGET:: mesh
CONTAINS
!Reset the output of node
PURE SUBROUTINE resetOutput(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshNode), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%output(k)%den = 0.D0
self%output(k)%mom = 0.D0
self%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutput
!Find next cell for particle
RECURSIVE SUBROUTINE findCell(self, part, oldCell)
USE moduleSpecies
@ -332,8 +359,8 @@ MODULE moduleMesh
CALL nextElement%findCell(part, self)
CLASS IS (meshEdge)
!Particle encountered an edge, execute boundary
CALL nextElement%fBoundary(part)
!Particle encountered an edge, apply boundary
CALL nextElement%fBoundary(part%sp)%apply(nextElement,part)
!If particle is still inside the domain, call findCell
IF (part%n_in) THEN
IF(PRESENT(oldCell)) THEN
@ -359,38 +386,45 @@ MODULE moduleMesh
USE moduleSpecies
USE moduleList
use moduleRefParam
USE moduleRandom
IMPLICIT NONE
CLASS(meshVol), INTENT(inout):: self
INTEGER:: modCollisions !Remain of current iteration and everyCollisions
INTEGER:: iterToCollisions !Number of iterations from current to next collision
INTEGER:: nPart !Number of particles inside the cell
REAL(8):: pMax !Maximum probability of collision
INTEGER:: nCollIter !Number of collisions to be computed in this iteration
INTEGER:: rnd !random index
REAL(8):: rndReal
TYPE(particle), POINTER:: part_i, part_j
INTEGER:: n !collision
INTEGER:: ij, k
REAL(8):: sigmaVrelMaxNew
TYPE(pointerArray), ALLOCATABLE:: partTemp(:)
self%nColl = 0
nPart = self%listPart_in%amount
!Computes iterations if there is more than one particle in the cell
IF (nPart > 1) THEN
!Probability of collision
pMax = self%totalWeight*self%sigmaVrelMax*tauMin/self%volume
self%nColl = INT(REAL(nPart)*pMax*0.5D0)
!Converts the list of particles to an array for easy access
!Increases the collisional fraction of the cell
self%collFrac = self%collFrac + REAL(nPart)*pMax*0.5D0
!Number of collisions in the cell
self%nColl = FLOOR(self%collFrac)
IF (self%nColl > 0) THEN
!Converts the list of particles to an array for easy access
partTemp = self%listPart_in%convert2Array()
END IF
DO n = 1, self%nColl
!Select random numbers
CALL RANDOM_NUMBER(rndReal)
rnd = 1 + FLOOR(nPart*rndReal)
rnd = random(1, nPart)
part_i => partTemp(rnd)%part
CALL RANDOM_NUMBER(rndReal)
rnd = 1 + FLOOR(nPart*rndReal)
rnd = random(1, nPart)
part_j => partTemp(rnd)%part
ij = interactionIndex(part_i%sp, part_j%sp)
sigmaVrelMaxNew = 0.D0
@ -404,19 +438,14 @@ MODULE moduleMesh
self%sigmaVrelMax = sigmaVrelMaxNew
END IF
!Removes one collision from the collisional fraction
self%collFrac = self%collFrac - 1.D0
END DO
END IF
self%totalWeight = 0.D0
!Reset output in nodes
CALL self%resetOutput()
!Erase the list of particles inside the cell
CALL self%listPart_in%erase()
END SUBROUTINE collision
SUBROUTINE printOutputGmsh(self, t)
@ -431,12 +460,12 @@ MODULE moduleMesh
TYPE(outputFormat):: output(1:self%numNodes)
REAL(8):: time
CHARACTER(:), ALLOCATABLE:: fileName
CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations
CHARACTER (LEN=iterationDigits):: tstring
time = DBLE(t)*tauMin*ti_ref
DO i = 1, nSpecies
WRITE(tstring, '(I6.6)') t
WRITE(tstring, iterationFormat) t
fileName='OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
OPEN (60, file = path // folder // '/' // fileName)
@ -445,7 +474,7 @@ MODULE moduleMesh
WRITE(60, "(A)") '$EndMeshFormat'
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"Density (m^-3)"'
WRITE(60, "(A)") '"Density' // species(i)%obj%name // ' (m^-3)"'
WRITE(60, *) 1
WRITE(60, *) time
WRITE(60, *) 3
@ -459,7 +488,7 @@ MODULE moduleMesh
WRITE(60, "(A)") '$EndNodeData'
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"Velocity (m/s)"'
WRITE(60, "(A)") '"Velocity ' // species(i)%obj%name // ' (m/s)"'
WRITE(60, *) 1
WRITE(60, *) time
WRITE(60, *) 3
@ -472,7 +501,7 @@ MODULE moduleMesh
WRITE(60, "(A)") '$EndNodeData'
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"Pressure (Pa)"'
WRITE(60, "(A)") '"Pressure ' // species(i)%obj%name // ' (Pa)"'
WRITE(60, *) 1
WRITE(60, *) time
WRITE(60, *) 3
@ -485,7 +514,7 @@ MODULE moduleMesh
WRITE(60, "(A)") '$EndNodeData'
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"Temperature (K)"'
WRITE(60, "(A)") '"Temperature ' // species(i)%obj%name // ' (K)"'
WRITE(60, *) 1
WRITE(60, *) time
WRITE(60, *) 3
@ -505,6 +534,7 @@ MODULE moduleMesh
SUBROUTINE printCollGmsh(self, t)
USE moduleRefParam
USE moduleCaseParam
USE moduleCollisions
USE moduleOutput
IMPLICIT NONE
@ -513,12 +543,12 @@ MODULE moduleMesh
INTEGER:: n
REAL(8):: time
CHARACTER(:), ALLOCATABLE:: fileName
CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations
CHARACTER (LEN=iterationDigits):: tstring
IF (collOutput) THEN
time = DBLE(t)*tauMin*ti_ref
WRITE(tstring, '(I6.6)') t
WRITE(tstring, iterationFormat) t
fileName='OUTPUT_' // tstring// '_Collisions.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
@ -557,14 +587,14 @@ MODULE moduleMesh
INTEGER:: n, e
REAL(8):: time
CHARACTER(:), ALLOCATABLE:: fileName
CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations
CHARACTER (LEN=iterationDigits):: tstring
REAL(8):: xi(1:3)
xi = (/ 0.D0, 0.D0, 0.D0 /)
IF (emOutput) THEN
time = DBLE(t)*tauMin*ti_ref
WRITE(tstring, '(I6.6)') t
WRITE(tstring, iterationFormat) t
fileName='OUTPUT_' // tstring// '_EMField.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName

View file

@ -1,21 +1,61 @@
MODULE moduleBoundary
!Generic type for boundaries
TYPE, PUBLIC:: boundaryGeneric
INTEGER:: id = 0
CHARACTER(:), ALLOCATABLE:: name
INTEGER:: physicalSurface = 0
CHARACTER(:), ALLOCATABLE:: boundaryType
CONTAINS
END TYPE boundaryGeneric
TYPE:: boundaryCont
!Reflecting boundary
TYPE, PUBLIC, EXTENDS(boundaryGeneric):: boundaryReflection
CONTAINS
END TYPE boundaryReflection
!Absorption boundary
TYPE, PUBLIC, EXTENDS(boundaryGeneric):: boundaryAbsorption
CONTAINS
END TYPE boundaryAbsorption
!Transparent boundary
TYPE, PUBLIC, EXTENDS(boundaryGeneric):: boundaryTransparent
CONTAINS
END TYPE boundaryTransparent
!Transparent boundary
TYPE, PUBLIC, EXTENDS(boundaryGeneric):: boundaryWallTemperature
!Thermal velocity of the wall: square root(Wall temperature X specific heat)
REAL(8):: vTh
CONTAINS
END TYPE boundaryWallTemperature
!Symmetry axis
TYPE, PUBLIC, EXTENDS(boundaryGeneric):: boundaryAxis
CONTAINS
END TYPE boundaryAxis
TYPE:: bTypesCont
CLASS(boundaryGeneric), ALLOCATABLE:: obj
END TYPE bTypesCont
TYPE:: boundaryCont
INTEGER:: id = 0
CHARACTER(:), ALLOCATABLE:: name
INTEGER:: physicalSurface = 0
CLASS(bTypesCont), ALLOCATABLE:: bTypes(:)
CONTAINS
END TYPE boundaryCont
!Number of boundaries
INTEGER:: nBoundary = 0
TYPE(boundaryCont), ALLOCATABLE:: boundary(:)
!Array for boundary information
TYPE(boundaryCont), ALLOCATABLE, TARGET:: boundary(:)
CONTAINS
FUNCTION getBoundaryId(physicalSurface) RESULT(id)
@ -27,10 +67,23 @@ MODULE moduleBoundary
id = 0
DO i = 1, nBoundary
IF (physicalSurface == boundary(i)%obj%physicalSurface) id = boundary(i)%obj%id
IF (physicalSurface == boundary(i)%physicalSurface) id = boundary(i)%id
END DO
END FUNCTION getBoundaryId
SUBROUTINE initWallTemperature(boundary, T, c)
USE moduleRefParam
IMPLICIT NONE
CLASS(boundaryGeneric), ALLOCATABLE, INTENT(out):: boundary
REAL(8), INTENT(in):: T, c !Wall temperature and specific heat
REAL(8):: vTh
vTh = DSQRT(c * T) / v_ref
boundary = boundaryWallTemperature(vTh = vTh)
END SUBROUTINE initWallTemperature
END MODULE moduleBoundary

View file

@ -1,24 +1,18 @@
MODULE moduleCollisions
USE moduleSpecies
USE moduleTable
!Abstract type for collision between two particles
TYPE, ABSTRACT:: collisionBinary
REAL(8):: rMass !reduced mass
REAL(8):: rMass !Reduced mass
REAL(8):: sMass !Summed mass
TYPE(table1D):: crossSec !cross section of collision
CONTAINS
PROCEDURE(initBinary_interface), PASS, DEFERRED:: init
PROCEDURE(collideBinary_interface), PASS, DEFERRED:: collide
END TYPE collisionBinary
ABSTRACT INTERFACE
SUBROUTINE initBinary_interface(self, crossSectionFilename, mass_i, mass_j)
IMPORT:: collisionBinary
CLASS(collisionBinary), INTENT(inout):: self
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: mass_i, mass_j
END SUBROUTINE
SUBROUTINE collideBinary_interface(self, sigmaVRelMax, sigmaVrelMaxNew, part_i, part_j)
USE moduleSpecies
IMPORT:: collisionBinary
@ -26,7 +20,7 @@ MODULE moduleCollisions
CLASS(collisionBinary), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout):: part_i, part_j
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
END SUBROUTINE
@ -38,16 +32,39 @@ MODULE moduleCollisions
END TYPE collisionCont
!Binary elastic interaction
TYPE, EXTENDS(collisionBinary):: collisionBinaryElastic
!Weight distribution for Maxwellian function
REAL(8):: w_i = (1.D0+DSQRT(3.D0))/2.D0
REAL(8):: w_j = (DSQRT(3.D0)-1.D0)/2.D0
CONTAINS
PROCEDURE, PASS:: init => initBinaryElastic
PROCEDURE, PASS:: collide => collideBinaryElastic
END TYPE collisionBinaryElastic
!Ionization binary interaction
TYPE, EXTENDS(collisionBinary):: collisionBinaryIonization
REAL(8):: eThreshold !Minimum energy (non-dimensional units) required for ionization
REAL(8):: deltaV !Change in velocity due to exchange of eThreshold
CLASS(speciesCharged), POINTER:: electron !Pointer to species considerer as electrons
CONTAINS
PROCEDURE, PASS:: collide => collideBinaryIonization
END TYPE collisionBinaryIonization
TYPE, EXTENDS(collisionBinary):: collisionBinaryRecombination
REAL(8):: eBinding !binding energy of free electron in recombining ion
REAL(8):: deltaV !Change in velocity due to energy exchange
CLASS(speciesCharged), POINTER:: electron !Pointer to species considerer as electrons
CONTAINS
PROCEDURE, PASS:: collide => collideBinaryRecombination
END TYPE collisionBinaryRecombination
!Resonant charge-exchange
TYPE, EXTENDS(collisionBinary):: collisionBinaryChargeExchange
CONTAINS
PROCEDURE, PASS:: collide => collideBinaryChargeExchange
END TYPE collisionBinaryChargeExchange
!Type for interaction matrix
TYPE:: interactionsBinary
INTEGER:: amount
@ -58,11 +75,41 @@ MODULE moduleCollisions
END TYPE interactionsBinary
!Collision 'Matrix'. A symmetric 2D matrix put into a 1D array to save memory
TYPE(interactionsBinary), ALLOCATABLE:: interactionMatrix(:)
TYPE(interactionsBinary), ALLOCATABLE, TARGET:: interactionMatrix(:)
!Folder for collision cross section tables
CHARACTER(:), ALLOCATABLE:: pathCollisions
CONTAINS
!Velocity of center of mass of two particles
PURE FUNCTION velocityCM(m_i, v_i, m_j, v_j) RESULT(vCM)
IMPLICIT NONE
REAL(8), INTENT(in):: m_i, m_j
REAL(8), INTENT(in), DIMENSION(1:3):: v_i, v_j
REAL(8):: vCM(1:3)
vCM = (m_i*v_i + m_j*v_j)/(m_i + m_j)
END FUNCTION velocityCM
!Random direction for hard sphere collisions
FUNCTION randomDirectionVHS() RESULT(n)
USE moduleConstParam
USE moduleRandom
IMPLICIT NONE
REAL(8):: n(1:3)
REAL(8):: cosXii, sinXii, eps
cosXii = random(-1.D0, 1.D0)
sinXii = DSQRT(1.D0 - cosXii**2)
eps = random(0.D0, PI2)
n = (/ cosXii, sinXii*DCOS(eps), sinXii*DSIN(eps) /)
END FUNCTION randomDirectionVHS
!Inits the interaction matrix
SUBROUTINE initInteractionMatrix(interactionMatrix)
USE moduleSpecies
IMPLICIT NONE
@ -75,6 +122,7 @@ MODULE moduleCollisions
END SUBROUTINE initInteractionMatrix
!Gets the interaction index from the collision matrix from index i,j
FUNCTION interactionIndex(i,j) RESULT(k)
INTEGER:: i, j
@ -87,89 +135,396 @@ MODULE moduleCollisions
END FUNCTION interactionIndex
!Inits the binary interaction
SUBROUTINE initInteractionBinary(self, amount)
IMPLICIT NONE
CLASS(interactionsBinary), INTENT(inout):: self
INTEGER, INTENT(in):: amount
INTEGER:: k
self%amount = amount
ALLOCATE(self%collisions(1:self%amount))
DO k= 1, self%amount
!TODO: make type dependent
ALLOCATE(collisionBinaryElastic:: self%collisions(k)%obj)
END DO
END SUBROUTINE initInteractionBinary
SUBROUTINE initBinaryElastic(self, crossSectionFilename, mass_i, mass_j)
!ELASTIC COLLISIONS
!Inits binary elastic collision
SUBROUTINE initBinaryElastic(collision, crossSectionFilename, mass_i, mass_j)
USE moduleTable
USE moduleRefParam
USE moduleConstParam
IMPLICIT NONE
CLASS(collisionBinaryElastic), INTENT(inout):: self
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: mass_i, mass_j
ALLOCATE(collisionBinaryElastic:: collision)
!Reads data from file
CALL self%crossSec%init(crossSectionFilename)
CALL collision%crossSec%init(crossSectionFilename)
!Convert to no-dimensional units
CALL self%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
self%rMass = (mass_i*mass_j)/(mass_i+mass_j)
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
END SUBROUTINE
END SUBROUTINE initBinaryElastic
!Binary elastic process
SUBROUTINE collideBinaryElastic(self, sigmaVrelMax, sigmaVrelMaxNew, &
part_i, part_j)
USE moduleConstParam
USE moduleSpecies
USE moduleTable
USE moduleConstParam
USE moduleRandom
IMPLICIT NONE
CLASS(collisionBinaryElastic), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout):: 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
REAL(8):: vp_i, vp_j, v_i, v_j !post and pre-collision velocities
REAL(8):: v_ij !sum of velocities modules
REAL(8):: alpha !random angle of scattering
REAL(8):: rnd
REAL(8):: m_i, m_j
REAL(8), DIMENSION(1:3):: vCM
REAL(8):: vp(1:3)
!eRel (in units of [m][L]^2[s]^-2
!eRel (in units of [m][L]^2[t]^-2
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
CALL RANDOM_NUMBER(rnd)
IF (sigmaVrelMaxNew/sigmaVrelMax > rnd) THEN
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
m_i = species(part_i%sp)%obj%m
m_j = species(part_j%sp)%obj%m
!Applies the collision
v_i = NORM2(part_i%v)
v_j = NORM2(part_j%v)
v_ij = v_i+v_j
vp_j = v_ij*self%w_i
vp_i = v_ij*self%w_j
CALL RANDOM_NUMBER(rnd)
alpha = PI*rnd
part_i%v(1) = v_i*DCOS(alpha)
part_i%v(2) = v_i*DSIN(alpha)
CALL RANDOM_NUMBER(rnd)
alpha = PI*rnd
part_j%v(1) = v_j*DCOS(alpha)
part_j%v(2) = v_j*DSIN(alpha)
vCM = velocityCM(m_i, part_i%v, m_j, part_j%v)
vp = vRel*randomDirectionVHS()
!Assign velocities to particles
part_i%v = vCM + m_j*vp/self%sMass
part_j%v = vCM - m_i*vp/self%sMass
END IF
END SUBROUTINE collideBinaryElastic
END SUBROUTINE
!ELECTRON IMPACT IONIZATION
!Inits electron impact ionization
SUBROUTINE initBinaryIonization(collision, crossSectionFilename, energyThreshold, mass_i, mass_j, electron)
USE moduleTable
USE moduleRefParam
USE moduleConstParam
USE moduleSpecies
USE moduleErrors
IMPLICIT NONE
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: energyThreshold
REAL(8), INTENT(in):: mass_i, mass_j
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
INTEGER:: electronIndex
ALLOCATE(collisionBinaryIonization:: collision)
!Reads data from file
CALL collision%crossSec%init(crossSectionFilename)
!Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
!Specific parameters for ionization collision
SELECT TYPE(collision)
TYPE IS(collisionBinaryIonization)
!Assign the energy threshold
!Input energy is in eV. Convert to J with ev2J and then to
!non-dimensional units.
collision%eThreshold = energyThreshold*eV2J/(m_ref*v_ref**2)
electronIndex = speciesName2Index(electron)
SELECT TYPE(sp => species(electronIndex)%obj)
TYPE IS(speciesCharged)
collision%electron => sp
CLASS DEFAULT
CALL criticalError("Species " // sp%name // " chosen for ionization is not a charged species", 'initBinaryIonization')
END SELECT
END SELECT
END SUBROUTINE initBinaryIonization
!Binary electron impact ionization process
SUBROUTINE collideBinaryIonization(self, sigmaVrelMax, sigmaVrelMaxNew, &
part_i, part_j)
USE moduleSpecies
USE moduleErrors
USE moduleList
USE moduleRandom
USE OMP_LIB
IMPLICIT NONE
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), POINTER:: electron, neutral
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
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
eRel = self%rMass*vRel**2
!Relative energy must be higher than threshold
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 (part_i%sp == self%electron%sp) THEN
electron => part_i
neutral => part_j
ELSEIF(part_j%sp == self%electron%sp) THEN
electron => part_j
neutral => part_i
ELSE
CALL criticalError("No matching between input particles and ionizing species", 'collideBinaryIonization')
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%sp = electron%sp
newElectron%v = vp_n
newElectron%r = neutral%r
newElectron%xi = neutral%xi
newElectron%n_in = .TRUE.
newElectron%vol = neutral%vol
newElectron%weight = neutral%weight
newElectron%qm = electron%qm
!Ionize neutral particle
SELECT TYPE(sp => species(neutral%sp)%obj)
TYPE IS(speciesNeutral)
CALL sp%ionize(neutral)
CLASS DEFAULT
CALL criticalError(sp%name // " is not a neutral", 'collideBinaryIonization')
END SELECT
!Adds new electron to list of new particles from collisions
CALL OMP_SET_LOCK(lockCollisions)
CALL partCollisions%add(newElectron)
CALL OMP_UNSET_LOCK(lockCollisions)
END IF
END IF
END SUBROUTINE collideBinaryIonization
!ELECTRON ION RESONANT RECOMBINATION
!Inits electron ion recombination
SUBROUTINE initBinaryRecombination(collision, crossSectionFilename, energyBinding, mass_i, mass_j, electron)
USE moduleTable
USE moduleRefParam
USE moduleConstParam
USE moduleSpecies
USE moduleErrors
IMPLICIT NONE
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: energyBinding
REAL(8), INTENT(in):: mass_i, mass_j
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
INTEGER:: electronIndex
ALLOCATE(collisionBinaryRecombination:: collision)
!Reads data from file
CALL collision%crossSec%init(crossSectionFilename)
!Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
!Specific parameters for ionization collision
SELECT TYPE(collision)
TYPE IS(collisionBinaryRecombination)
!Assign the energy threshold
!Input energy is in eV. Convert to J with ev2J and then to
!non-dimensional units.
collision%eBinding = energyBinding*eV2J/(m_ref*v_ref**2)
electronIndex = speciesName2Index(electron)
SELECT TYPE(sp => species(electronIndex)%obj)
TYPE IS(speciesCharged)
collision%electron => sp
CLASS DEFAULT
CALL criticalError("Species " // sp%name // " chosen for ionization is not a charged species", 'initBinaryIonization')
END SELECT
END SELECT
END SUBROUTINE initBinaryRecombination
!Binary electron impact ionization process
SUBROUTINE collideBinaryRecombination(self, sigmaVrelMax, sigmaVrelMaxNew, &
part_i, part_j)
USE moduleSpecies
USE moduleErrors
USE moduleList
USE moduleRandom
USE OMP_LIB
IMPLICIT NONE
CLASS(collisionBinaryRecombination), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout), TARGET:: part_i, part_j
TYPE(particle), POINTER:: electron, ion
REAL(8):: vRel, eRel
REAL(8):: sigmaVrel
REAL(8), DIMENSION(1:3):: vp_i
!eRel (in units of [m][L]^2[t]^-2
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
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 (part_i%sp == self%electron%sp) THEN
electron => part_i
ion => part_j
ELSEIF(part_j%sp == self%electron%sp) THEN
electron => part_j
ion => part_i
ELSE
CALL criticalError("No matching between input particles and ionizing species", 'collideBinaryIonization')
END IF
!Excess energy
!TODO: This energy should be transformed into photons
vp_i = ion%v* (1.D0 - (vRel + self%deltaV)/NORM2(ion%v))
!Remove electron from simulation
electron%n_in = .FALSE.
!Neutralize ion particle
SELECT TYPE(sp => species(ion%sp)%obj)
TYPE IS(speciesCharged)
CALL sp%neutralize(ion)
CLASS DEFAULT
CALL criticalError(sp%name // " is not a charge", 'collideBinaryRecombination')
END SELECT
END IF
END SUBROUTINE collideBinaryRecombination
!RESONANT CHARGE EXCHANGE
!Inits resonant charge exchange
SUBROUTINE initBinaryChargeExchange(collision, crossSectionFilename, mass_i, mass_j)
USE moduleTable
USE moduleRefParam
USE moduleConstParam
IMPLICIT NONE
CLASS(collisionBinary), INTENT(out), ALLOCATABLE:: collision
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
REAL(8), INTENT(in):: mass_i, mass_j
ALLOCATE(collisionBinaryChargeExchange:: collision)
!Reads data from file
CALL collision%crossSec%init(crossSectionFilename)
!Convert to no-dimensional units
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
END SUBROUTINE initBinaryChargeExchange
SUBROUTINE collideBinaryChargeExchange(self, sigmaVrelMax, sigmaVrelMaxNew, &
part_i, part_j)
USE moduleSpecies
USE moduleRandom
IMPLICIT NONE
CLASS(collisionBinaryChargeExchange), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(inout):: sigmaVrelMaxNew
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 = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > random()) THEN
SELECT TYPE(sp => species(part_i%sp)%obj)
TYPE IS (speciesNeutral)
!Species i is neutral, ionize particle i
CALL sp%ionize(part_i)
TYPE IS (speciesCharged)
!Species i is charged, neutralize particle i
CALL sp%neutralize(part_i)
END SELECT
SELECT TYPE(sp => species(part_j%sp)%obj)
TYPE IS (speciesNeutral)
!Species j is neutral, ionize particle j
CALL sp%ionize(part_j)
TYPE IS (speciesCharged)
!Species j is charged, neutralize particle j
CALL sp%neutralize(part_j)
END SELECT
END IF
END SUBROUTINE collideBinaryChargeExchange
END MODULE moduleCollisions

View file

@ -4,7 +4,9 @@ MODULE moduleConstParam
PUBLIC
REAL(8), PARAMETER:: PI = 4.D0*DATAN(1.D0) !number pi
REAL(8), PARAMETER:: PI = 4.D0*DATAN(1.D0) !number pi
REAL(8), PARAMETER:: PI2 = 2.D0*PI !2*pi
REAL(8), PARAMETER:: PI8 = 8.D0*PI !2*pi
REAL(8), PARAMETER:: sccm2atomPerS = 4.5D17 !sccm to atom s^-1
REAL(8), PARAMETER:: qe = 1.60217662D-19 !Elementary charge
REAL(8), PARAMETER:: kb = 1.38064852D-23 !Boltzmann constants SI

View file

@ -88,6 +88,7 @@ MODULE moduleInject
self%vMod = v/v_ref
self%n = n
self%T = T/T_ref
self%sp = sp
SELECT CASE(units)
CASE ("sccm")
!Standard cubic centimeter per minute
@ -101,13 +102,10 @@ MODULE moduleInject
CALL criticalError("No support for units: " // units, 'initInject')
END SELECT
!Scale particles for different species steps
IF (self%nParticles == 0) CALL criticalError("The number of particles for inject is 0.", 'initInject')
self%nParticles = self%nParticles * solver%pusher(sp)%every
self%sp = sp
!Gets the edge elements from which particles are injected
!TODO: Improve this A LOT
DO e = 1, mesh%numEdges
phSurface(e) = mesh%edges(e)%obj%physicalSurface
@ -115,7 +113,6 @@ MODULE moduleInject
self%nEdges = COUNT(phSurface == physicalSurface)
ALLOCATE(inject(i)%edges(1:self%nEdges))
! ALLOCATE(inject(i)%weight(1:self%nEdges))
et = 0
DO e=1, mesh%numEdges
IF (mesh%edges(e)%obj%physicalSurface == physicalSurface) THEN
@ -125,7 +122,8 @@ MODULE moduleInject
END IF
END DO
! self%sumWeight = SUM(self%weight)
nPartInj = nPartInj + self%nParticles
END SUBROUTINE initInject
@ -138,17 +136,12 @@ MODULE moduleInject
INTEGER:: i
!$OMP SINGLE
nPartInj = 0
DO i = 1, nInject
IF (solver%pusher(inject(i)%sp)%pushSpecies) nPartInj = nPartInj + inject(i)%nParticles
END DO
IF (ALLOCATED(partInj)) DEALLOCATE(partInj)
ALLOCATE(partInj(1:nPartInj))
!$OMP END SINGLE
DO i=1, nInject
IF (solver%pusher(inject(i)%sp)%pushSpecies) CALL inject(i)%addParticles()
CALL inject(i)%addParticles()
END DO
END SUBROUTINE doInjects
@ -175,21 +168,14 @@ MODULE moduleInject
!Random velocity from Maxwellian distribution
FUNCTION randomVelMaxwellian(self) RESULT (v)
USE moduleConstParam, ONLY: PI
USE moduleRandom
IMPLICIT NONE
CLASS(velDistMaxwellian), INTENT(in):: self
REAL(8):: v
REAL(8):: x, y
v = 0.D0
x = 0.D0
DO WHILE (x == 0.D0)
CALL RANDOM_NUMBER(x)
END DO
CALL RANDOM_NUMBER(y)
v = self%v + self%vTh*DSQRT(-2.D0*DLOG(x))*DCOS(2.D0*PI*y)
v = self%v + self%vTh*randomMaxwellian()
END FUNCTION randomVelMaxwellian
@ -209,24 +195,18 @@ MODULE moduleInject
USE moduleSpecies
USE moduleSolver
USE moduleMesh
USE moduleRandom
IMPLICIT NONE
CLASS(injectGeneric), INTENT(in):: self
INTEGER:: randomX
INTEGER:: i!, j
INTEGER, SAVE:: nMin, nMax !Min and Max index in partInj array
INTEGER:: n
REAL(8):: rnd
CLASS(meshEdge), POINTER:: randomEdge
!Insert particles
!$OMP SINGLE
nMin = 0
DO i = 1, self%id - 1
IF (solver%pusher(inject(i)%sp)%pushSpecies) nMin = nMin + inject(i)%nParticles
END DO
nMin = nMin + 1
nMin = SUM(inject(1:(self%id-1))%nParticles) + 1
nMax = nMin + self%nParticles - 1
!Assign particle type
partInj(nMin:nMax)%sp = self%sp
@ -244,8 +224,7 @@ MODULE moduleInject
!$OMP DO
DO n = nMin, nMax
CALL RANDOM_NUMBER(rnd)
randomX = INT(DBLE(self%nEdges-1)*rnd) + 1
randomX = random(1, self%nEdges)
randomEdge => mesh%edges(self%edges(randomX))%obj
!Random position in edge
@ -263,8 +242,8 @@ MODULE moduleInject
self%v(2)%obj%randomVel(), &
self%v(3)%obj%randomVel() /)
!Push new particle
CALL solver%pusher(self%sp)%pushParticle(partInj(n))
!Push new particle with the minimum time step
CALL solver%pusher(self%sp)%pushParticle(partInj(n), tauMin)
!Assign cell to new particle
CALL solver%updateParticleCell(partInj(n))

View file

@ -21,39 +21,67 @@ MODULE moduleInput
!Loads the config file
CALL verboseError('Loading input file...')
CALL config%load(filename = inputFile)
CALL checkStatus(config, "load")
!Reads reference parameters
CALL verboseError('Reading Reference parameters...')
CALL readReference(config)
CALL checkStatus(config, "readReference")
!Reads output parameters
CALL verboseError('Reading Output parameters...')
CALL readOutput(config)
CALL checkStatus(config, "readOutput")
!Read species
CALL verboseError('Reading species information...')
CALL readSpecies(config)
CALL checkStatus(config, "readSpecies")
!Read interactions between species
CALL verboseError('Reading interaction between species...')
CALL readInteractions(config)
CALL checkStatus(config, "readInteractions")
!Read boundaries
CALL verboseError('Reading boundary conditions...')
CALL readBoundary(config)
CALL checkStatus(config, "readBoundary")
!Read Geometry
CALL verboseError('Reading Geometry...')
CALL readGeometry(config)
CALL checkStatus(config, "readGeometry")
!Reads case parameters
CALL verboseError('Reading Case Parameters...')
CALL verboseError('Reading Case parameters...')
CALL readCase(config)
CALL checkStatus(config, "readCase")
!Read injection of particles
CALL verboseError('Reading Interactions between species...')
CALL readInject(config)
CALL checkStatus(config, "readInject")
!Read parallel parameters
CALL verboseError('Reading Parallel configuration...')
CALL readParallel(config)
CALL checkStatus(config, "readParallel")
END SUBROUTINE readConfig
!Checks the status of the JSON case file and, if failed, exits the execution.
SUBROUTINE checkStatus(config, step)
USE moduleErrors
USE json_module
IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config
CHARACTER(LEN=*), INTENT(in):: step
IF (config%failed()) CALL criticalError("Error reading the JSON input file", TRIM(step))
END SUBROUTINE checkStatus
!Reads the reference parameters
SUBROUTINE readReference(config)
@ -64,7 +92,7 @@ MODULE moduleInput
IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config
LOGICAL:: found, found_r
LOGICAL:: found
CHARACTER(:), ALLOCATABLE:: object
object = 'reference'
@ -78,25 +106,29 @@ MODULE moduleInput
CALL config%get(object // '.temperature', T_ref, found)
IF (.NOT. found) CALL criticalError('Reference temperature not found','readReference')
CALL config%get(object // '.radius', r_ref, found_r)
!Derived parameters
v_ref = DSQRT(kb*T_ref/m_ref) !reference velocity
!TODO: Make this solver dependent
IF (found_r) THEN
sigma_ref = PI*(r_ref+r_ref)**2 !reference cross section
L_ref = 1.D0/(sigma_ref*n_ref) !mean free path
!If a reference cross section is given, it is used
CALL config%get(object // '.crossSection', sigma_ref, found)
ELSE
L_ref = DSQRT(kb*T_ref*eps_0/n_ref)/qe !Debye length
!TODO: Obtain right sigma_ref for PIC case
sigma_ref = PI*(4.D-10)**2 !reference cross section
!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
ti_ref = L_ref/v_ref !reference time
Vol_ref = L_ref**3 !reference volume
EF_ref = qe*n_ref*L_ref/eps_0 !reference electric field
Volt_ref = EF_ref*L_ref !reference voltage
!Derived parameters
L_ref = DSQRT(kb*T_ref*eps_0/n_ref)/qe !reference length
v_ref = DSQRT(kb*T_ref/m_ref) !reference velocity
ti_ref = L_ref/v_ref !reference time
Vol_ref = L_ref**3 !reference volume
EF_ref = qe*n_ref*L_ref/eps_0 !reference electric field
Volt_ref = EF_ref*L_ref !reference voltage
END SUBROUTINE readReference
@ -107,6 +139,8 @@ MODULE moduleInput
USE moduleCaseParam
USE moduleSolver
USE moduleSpecies
USE moduleCollisions
USE moduleOutput
USE json_module
IMPLICIT NONE
@ -118,6 +152,7 @@ MODULE moduleInput
INTEGER:: nTau, nSolver
INTEGER:: i
CHARACTER(2):: iString
CHARACTER(1):: tString
object = 'case'
@ -172,12 +207,136 @@ MODULE moduleInput
CALL solver%initWS(WSType)
!Makes tau non-dimensional
!Makes tau(s) non-dimensional
tau = tau / ti_ref
tauMin = tauMin / ti_ref
!Sets the format of output files accordint to iteration number
iterationDigits = INT(LOG10(REAL(tmax))) + 1
WRITE(tString, '(I1)') iterationDigits
iterationFormat = "(I" // tString // "." // tString // ")"
!Read initial state for species
CALL verboseError('Reading Initial state...')
CALL readInitial(config)
CALL checkStatus(config, "readInitial")
END SUBROUTINE readCase
!Reads the initial information for the species
SUBROUTINE readInitial(config)
USE moduleSpecies
USE moduleMesh
USE moduleOutput
USE moduleRefParam
USE moduleRandom
USE json_module
IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config
LOGICAL:: found
CHARACTER(:), ALLOCATABLE:: object
INTEGER:: nInitial
INTEGER:: i, p, e
CHARACTER(LEN=2):: iString
CHARACTER(:), ALLOCATABLE:: spName
INTEGER:: sp
CHARACTER(:), ALLOCATABLE:: spFile
INTEGER:: stat
CHARACTER(100):: dummy
REAL(8):: density, velocity(1:3), temperature
INTEGER:: nNewPart = 0.D0
TYPE(particle), POINTER:: partNew
REAL(8):: vTh
TYPE(lNode), POINTER:: partCurr, partNext
CALL config%info('case.initial', found, n_children = nInitial)
IF (found) THEN
!Reads the information from initial species
DO i = 1, nInitial
WRITE(iString, '(I2)') i
object = 'case.initial(' // iString // ')'
CALL config%get(object // '.speciesName', spName, found)
sp = speciesName2Index(spName)
CALL config%get(object // '.initialState', spFile, found)
OPEN (10, FILE = path // spFile, ACTION = 'READ')
DO
READ(10, '(A)', IOSTAT = stat) dummy
!If EoF, exit reading
IF (stat /= 0) EXIT
!If comment, skip
IF (INDEX(dummy,'#') /= 0) CYCLE
!Go up one line
BACKSPACE(10)
!Read information
READ(10, *) e, density, velocity, temperature
!Scale variables
!Particles in cell volume
nNewPart = INT(density * (mesh%vols(e)%obj%volume*Vol_ref) / species(sp)%obj%weight)
!Non-dimensional velocity
velocity = velocity / v_ref
!Non-dimensional temperature
temperature = temperature / T_ref
!Non-dimensional thermal temperature
vTh = DSQRT(temperature/species(sp)%obj%m)
!Allocate new particles
DO p = 1, nNewPart
ALLOCATE(partNew)
partNew%sp = sp
partNew%v(1) = velocity(1) + vTh*randomMaxwellian()
partNew%v(2) = velocity(2) + vTh*randomMaxwellian()
partNew%v(3) = velocity(3) + vTh*randomMaxwellian()
partNew%vol = e
partNew%r = mesh%vols(e)%obj%randPos()
partNew%xi = mesh%vols(e)%obj%phy2log(partNew%r)
partNew%n_in = .TRUE.
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
CALL partInitial%add(partNew)
END DO
END DO
END DO
!Convert temporal list of particles into initial partOld array
!Deallocates the list of initial particles
nNewPart = partInitial%amount
IF (nNewPart > 0) THEN
ALLOCATE(partOld(1:nNewPart))
partCurr => partInitial%head
DO p = 1, nNewPart
partNext => partCurr%next
partOld(p) = partCurr%part
DEALLOCATE(partCurr)
partCurr => partNext
END DO
IF (ASSOCIATED(partInitial%head)) NULLIFY(partInitial%head)
IF (ASSOCIATED(partInitial%tail)) NULLIFY(partInitial%tail)
partInitial%amount = 0
END IF
nPartOld = SIZE(partOld)
END IF
END SUBROUTINE readInitial
!Reads configuration for the output files
SUBROUTINE readOutput(config)
USE moduleErrors
@ -225,6 +384,7 @@ MODULE moduleInput
USE moduleSpecies
USE moduleErrors
USE moduleRefParam
USE moduleList
USE json_module
IMPLICIT NONE
@ -235,6 +395,8 @@ MODULE moduleInput
REAL(8):: mass, charge
LOGICAL:: found
INTEGER:: i
CHARACTER(:), ALLOCATABLE:: linkName
INTEGER:: linkID
!Gets the number of species
CALL config%info('species', found, n_children = nSpecies)
@ -258,6 +420,7 @@ MODULE moduleInput
CASE ("charged")
CALL config%get(object // '.charge', charge, found)
IF (.NOT. found) CALL criticalError("Required parameter charge not found for species " // object, 'readSpecies')
ALLOCATE(species(i)%obj, source=speciesCharged(q = charge, &
qm = charge/mass))
@ -273,6 +436,41 @@ MODULE moduleInput
END DO
!Reads relations between species
DO i = 1, nSpecies
WRITE(iString, '(I2)') i
object = 'species(' // TRIM(iString) // ')'
SELECT TYPE(sp => species(i)%obj)
TYPE IS (speciesNeutral)
!Gets species linked ion
CALL config%get(object // '.ion', linkName, found)
IF (found) THEN
linkID = speciesName2Index(linkName)
sp%ion => species(linkID)%obj
END IF
TYPE IS (speciesCharged)
!Gets species linked neutral
CALL config%get(object // '.neutral', linkName, found)
IF (found) THEN
linkID = speciesName2Index(linkName)
sp%neutral => species(linkID)%obj
END IF
!Gets species linked ion
CALL config%get(object // '.ion', linkName, found)
IF (found) THEN
linkID = speciesName2Index(linkName)
sp%ion => species(linkID)%obj
END IF
END SELECT
END DO
!Set number of particles to 0 for init state
!TODO: In a future, this should include the particles from init states
nPartOld = 0
@ -285,7 +483,10 @@ MODULE moduleInput
!Reads information about interactions between species
SUBROUTINE readInteractions(config)
USE moduleSpecies
USE moduleList
USE moduleCollisions
USE moduleErrors
USE OMP_LIB
USE json_module
IMPLICIT NONE
@ -295,15 +496,22 @@ MODULE moduleInput
CHARACTER(:), ALLOCATABLE:: species_i, species_j
CHARACTER(:), ALLOCATABLE:: crossSecFile
CHARACTER(:), ALLOCATABLE:: crossSecFilePath
CHARACTER(:), ALLOCATABLE:: cType
LOGICAL:: found
INTEGER:: nInteractions, nCollisions
INTEGER:: i, k, ij
INTEGER:: pt_i, pt_j
REAL(8):: energyThreshold, energyBinding
CHARACTER(:), ALLOCATABLE:: electron
CALL initInteractionMatrix(interactionMatrix)
!Path for collision cross-section data files
CALL config%get('interactions.folderCollisions', pathCollisions, found)
!Inits lock for list of particles
CALL OMP_INIT_LOCK(lockCollisions)
CALL config%info('interactions.collisions', found, n_children = nInteractions)
DO i = 1, nInteractions
WRITE(iString, '(I2)') i
@ -312,15 +520,54 @@ MODULE moduleInput
pt_i = speciesName2Index(species_i)
CALL config%get(object // '.species_j', species_j, found)
pt_j = speciesName2Index(species_j)
CALL config%info(object // '.crossSections', found, n_children = nCollisions)
CALL config%info(object // '.cTypes', found, n_children = nCollisions)
ij = interactionIndex(pt_i,pt_j)
!Allocates the required number of collisions per each pair of species ij
CALL interactionMatrix(ij)%init(nCollisions)
DO k = 1, nCollisions
WRITE (kString, '(I2)') k
CALL config%get(object // '.crossSections(' // TRIM(kString)// ')', crossSecFile, found)
object = 'interactions.collisions(' // TRIM(iString) // ').cTypes(' // TRIM(kString) // ')'
!Reads the cross section file
CALL config%get(object // '.crossSection', crossSecFile, found)
crossSecFilePath = pathCollisions // crossSecFile
CALL interactionMatrix(ij)%collisions(k)%obj%init(crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
IF (.NOT. found) CALL criticalError('crossSection not found for ' // object, 'readInteractions')
!Reads the type of collision
CALL config%get(object // '.type', cType, found)
!Initialize collision type and reads required additional data
SELECT CASE(cType)
CASE ('elastic')
!Elastic collision
CALL initBinaryElastic(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
CASE ('chargeExchange')
!Resonant charge exchange
CALL initBinaryChargeExchange(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
CASE ('ionization')
!Electorn impact ionization
CALL config%get(object // '.energyThreshold', energyThreshold, found)
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
CALL config%get(object // '.electron', electron, found)
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, energyThreshold, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
CASE ('recombination')
!Electorn impact ionization
CALL config%get(object // '.energyBinding', energyBinding, found)
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
CALL config%get(object // '.electron', electron, found)
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
CALL initBinaryRecombination(interactionMatrix(ij)%collisions(k)%obj, &
crossSecFilePath, energyBinding, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
CASE DEFAULT
CALL criticalError('Collision type' // cType // 'not defined yet', 'readInteractions')
END SELECT
END DO
@ -332,26 +579,61 @@ MODULE moduleInput
SUBROUTINE readBoundary(config)
USE moduleBoundary
USE moduleErrors
USE moduleSpecies
USE json_module
IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config
CHARACTER(2):: istring
CHARACTER(:), ALLOCATABLE:: object
INTEGER:: i, s
CHARACTER(2):: istring, sString
CHARACTER(:), ALLOCATABLE:: object, bType
REAL(8):: Tw, cw !Wall temperature and specific heat
LOGICAL:: found
INTEGER:: i
INTEGER:: nTypes
CALL config%info('boundary', found, n_children = nBoundary)
ALLOCATE(boundary(1:nBoundary))
DO i = 1, nBoundary
WRITE(istring, '(i2)') i
object = 'boundary(' // trim(istring) // ')'
object = 'boundary(' // TRIM(istring) // ')'
ALLOCATE(boundaryGeneric:: boundary(i)%obj)
boundary(i)%id = i
CALL config%get(object // '.name', boundary(i)%name, found)
CALL config%get(object // '.physicalSurface', boundary(i)%physicalSurface, found)
CALL config%info(object // '.bTypes', found, n_children = nTypes)
IF (nTypes /= nSpecies) CALL criticalError('Not enough boundary types defined in ' // object, 'readBoundary')
ALLOCATE(boundary(i)%bTypes(1:nSpecies))
DO s = 1, nSpecies
WRITE(sString,'(i2)') s
object = 'boundary(' // TRIM(iString) // ').bTypes(' // TRIM(sString) // ')'
CALL config%get(object // '.type', bType, found)
SELECT CASE(bType)
CASE('reflection')
ALLOCATE(boundaryReflection:: boundary(i)%bTypes(s)%obj)
CALL config%get(object // '.type', boundary(i)%obj%boundaryType, found)
CALL config%get(object // '.physicalSurface', boundary(i)%obj%physicalSurface, found)
boundary(i)%obj%id = i
CASE('absorption')
ALLOCATE(boundaryAbsorption:: boundary(i)%bTypes(s)%obj)
CASE('transparent')
ALLOCATE(boundaryTransparent:: boundary(i)%bTypes(s)%obj)
CASE('wallTemperature')
CALL config%get(object // '.temperature', Tw, found)
IF (.NOT. found) CALL criticalError("temperature not found for wallTemperature boundary type", 'readBoundary')
CALL config%get(object // '.specificHeat', cw, found)
IF (.NOT. found) CALL criticalError("specificHeat not found for wallTemperature boundary type", 'readBoundary')
CALL initWallTemperature(boundary(i)%bTypes(s)%obj, Tw, cw)
CASE('axis')
ALLOCATE(boundaryAxis:: boundary(i)%bTypes(s)%obj)
CASE DEFAULT
CALL criticalError('Boundary type ' // bType // ' undefined', 'readBoundary')
END SELECT
END DO
END DO

View file

@ -21,6 +21,10 @@ MODULE moduleList
END TYPE listNode
TYPE(listNode):: partWScheme !Particles comming from the nonAnalogue scheme
INTEGER(KIND=OMP_LOCK_KIND):: lockWScheme !Lock for the NA list of particles
TYPE(listNode):: partCollisions !Particles created in collisional process
INTEGER(KIND=OMP_LOCK_KIND):: lockCollisions !Lock for the NA list of particles
TYPE(listNode):: partInitial !Initial distribution of particles
TYPE pointerArray
TYPE(particle), POINTER:: part

View file

@ -3,7 +3,7 @@ MODULE moduleOutput
IMPLICIT NONE
!Output for each node
TYPE outputNode
REAL(8):: den, mom(1:3), tensorS(1:3,1:3)
REAL(8):: den = 0.D0, mom(1:3) = 0.D0, tensorS(1:3,1:3) = 0.D0
END TYPE
@ -22,6 +22,8 @@ MODULE moduleOutput
CHARACTER(:), ALLOCATABLE:: path
CHARACTER(:), ALLOCATABLE:: folder
INTEGER:: iterationDigits
CHARACTER(:), ALLOCATABLE:: iterationFormat
INTEGER:: triggerOutput, counterOutput = 0
INTEGER:: triggerCPUTime, counterCPUTime = 0
LOGICAL:: timeOutput = .FALSE.
@ -72,9 +74,6 @@ MODULE moduleOutput
tempVol = 1.D0/(nodeVol*Vol_ref)
IF (rawValues%den > 0.D0) THEN
tempVel = rawValues%mom(:)/rawValues%den
IF ((tempVel(1) - 1.D0) .EQ. tempVel(1)) THEN
PRINT *, rawValues%mom
END IF
tensorTemp = (rawValues%tensorS(:,:) - rawValues%den*outerProduct(tempVel,tempVel))
formatValues%density = rawValues%den*tempVol
formatValues%velocity(:) = tempVel
@ -106,7 +105,7 @@ MODULE moduleOutput
IF (PRESENT(first)) THEN
IF (first) THEN
OPEN(20, file = path // folder // '/' // fileName, action = 'write')
WRITE(20, "(A1, 8X, A1, 9X, A1, 5(A20))") "#","t","n","total","push","reset","collision","weighting"
WRITE(20, "(A1, 8X, A1, 9X, A1, 6(A20))") "#","t","n","total","push","reset","collision","weighting","EMField"
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
ELSE
@ -119,7 +118,7 @@ MODULE moduleOutput
END IF
WRITE (20, "(I10, I10, 5(ES20.6E3))") t, nPartOld, tStep, tPush, tReset, tColl, tWeight
WRITE (20, "(I10, I10, 6(ES20.6E3))") t, nPartOld, tStep, tPush, tReset, tColl, tWeight, tEMField
CLOSE(20)

View file

@ -0,0 +1,69 @@
MODULE moduleRandom
!Interface for random number generator
INTERFACE random
MODULE PROCEDURE randomReal, randomRealAB, randomIntAB
END INTERFACE random
CONTAINS
!Returns a Real random number between 0 and 1
FUNCTION randomReal() RESULT(rnd)
IMPLICIT NONE
REAL(8):: rnd
rnd = 0.D0
CALL RANDOM_NUMBER(rnd)
END FUNCTION randomReal
!Returns a Real random number between a and b
FUNCTION randomRealAB(a, b) RESULT(rnd)
IMPLICIT NONE
REAL(8), INTENT(in):: a, b
REAL(8):: rnd
REAL(8):: rnd01 !random real between 0 and 1
rnd = 0.D0
CALL RANDOM_NUMBER(rnd01)
rnd = (b - a) * rnd01 + a
END FUNCTION randomRealAB
!Returns an Integer random numnber between a and b
FUNCTION randomIntAB(a, b) RESULT(rnd)
IMPLICIT NONE
INTEGER, INTENT(in):: a, b
INTEGER:: rnd
REAL(8):: rnd01
rnd = 0.D0
CALL RANDOM_NUMBER(rnd01)
rnd = INT(REAL(b - a) * rnd01) + 1
END FUNCTION randomIntAB
!Returns a random number in a Maxwellian distribution of mean 0 and width 1
FUNCTION randomMaxwellian() RESULT(rnd)
USE moduleConstParam, ONLY: PI
IMPLICIT NONE
REAL(8):: rnd
REAL(8):: x, y
rnd = 0.D0
x = 0.D0
DO WHILE (x == 0.D0)
CALL RANDOM_NUMBER(x)
END DO
CALL RANDOM_NUMBER(y)
rnd = DSQRT(-2.D0*DLOG(x))*DCOS(2.D0*PI*y)
END FUNCTION randomMaxwellian
END MODULE moduleRandom

View file

@ -27,10 +27,11 @@ MODULE moduleSolver
INTERFACE
!Push a particle
PURE SUBROUTINE push_interafece(part)
PURE SUBROUTINE push_interafece(part, tauIn)
USE moduleSpecies
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
END SUBROUTINE push_interafece
@ -134,7 +135,7 @@ MODULE moduleSolver
!Checks if the species sp is update this iteration
IF (solver%pusher(sp)%pushSpecies) THEN
!Push particle
CALL solver%pusher(sp)%pushParticle(partOld(n))
CALL solver%pusher(sp)%pushParticle(partOld(n), tau(sp))
!Find cell in wich particle reside
CALL solver%updateParticleCell(partOld(n))
@ -146,27 +147,25 @@ MODULE moduleSolver
END SUBROUTINE doPushes
!Push one particle. Boris pusher for 2D Cyl Neutral particle
PURE SUBROUTINE pushCylNeutral(part)
PURE SUBROUTINE pushCylNeutral(part, tauIn)
USE moduleSpecies
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
TYPE(particle):: part_temp
REAL(8):: tauSp
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
REAL(8):: v_p_oh_star(2:3)
part_temp = part
!Time step for the species
tauSp = tau(part_temp%sp)
!z
part_temp%v(1) = part%v(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauSp
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!r,theta
v_p_oh_star(2) = part%v(2)
x_new = part%r(2) + v_p_oh_star(2)*tauSp
x_new = part%r(2) + v_p_oh_star(2)*tauIn
v_p_oh_star(3) = part%v(3)
y_new = v_p_oh_star(3)*tauSp
y_new = v_p_oh_star(3)*tauIn
r = DSQRT(x_new**2+y_new**2)
part_temp%r(2) = r
IF (r > 0.D0) THEN
@ -185,31 +184,29 @@ MODULE moduleSolver
END SUBROUTINE pushCylNeutral
!Push one particle. Boris pusher for 2D Cyl Charged particle
PURE SUBROUTINE pushCylCharged(part)
PURE SUBROUTINE pushCylCharged(part, tauIn)
USE moduleSpecies
USE moduleEM
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
REAL(8):: v_p_oh_star(2:3)
TYPE(particle):: part_temp
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
REAL(8):: tauSp
REAL(8):: qmEFt(1:3)!charge*tauSp*EF/mass
REAL(8):: qmEFt(1:3)!charge*tauIn*EF/mass
part_temp = part
!Time step for the species
tauSp = tau(part_temp%sp)
!Get electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauSp
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn
!z
part_temp%v(1) = part%v(1) + qmEFt(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauSp
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
!r,theta
v_p_oh_star(2) = part%v(2) + qmEFt(2)
x_new = part%r(2) + v_p_oh_star(2)*tauSp
x_new = part%r(2) + v_p_oh_star(2)*tauIn
v_p_oh_star(3) = part%v(3) + qmEFt(3)
y_new = v_p_oh_star(3)*tauSp
y_new = v_p_oh_star(3)*tauIn
r = DSQRT(x_new**2+y_new**2)
part_temp%r(2) = r
IF (r > 0.D0) THEN
@ -228,25 +225,23 @@ MODULE moduleSolver
END SUBROUTINE pushCylCharged
!Push charged particles in 1D cartesian coordinates
PURE SUBROUTINE push1DCartCharged(part)
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):: tauSp
REAL(8):: qmEFt(1:3)
part_temp = part
!Time step for particle species
tauSp = tau(part_temp%sp)
!Get the electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauSp
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)*tauSp
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
part_temp%n_in = .FALSE.
@ -255,28 +250,27 @@ MODULE moduleSolver
END SUBROUTINE push1DCartCharged
!Push one particle. Boris pusher for 1D Radial Charged particle
PURE SUBROUTINE push1DRadCharged(part)
PURE SUBROUTINE push1DRadCharged(part, tauIn)
USE moduleSpecies
USE moduleEM
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8), INTENT(in):: tauIn
REAL(8):: v_p_oh_star(1:2)
TYPE(particle):: part_temp
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
REAL(8):: tauSp
REAL(8):: qmEFt(1:3)!charge*tauSp*EF/mass
REAL(8):: qmEFt(1:3)!charge*tauIn*EF/mass
part_temp = part
!Time step for the species
tauSp = tau(part_temp%sp)
!Get electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauSp
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauMin
!r,theta
v_p_oh_star(1) = part%v(1) + qmEFt(1)
x_new = part%r(1) + v_p_oh_star(1)*tauSp
x_new = part%r(1) + v_p_oh_star(1)*tauIn
v_p_oh_star(2) = part%v(2) + qmEFt(2)
y_new = v_p_oh_star(2)*tauSp
y_new = v_p_oh_star(2)*tauIn
r = DSQRT(x_new**2+y_new**2)
part_temp%r(1) = r
IF (r > 0.D0) THEN
@ -311,12 +305,13 @@ MODULE moduleSolver
SUBROUTINE doReset()
USE moduleSpecies
USE moduleMesh
USE moduleList
IMPLICIT NONE
INTEGER:: nn, n
INTEGER:: nn, n, e
INTEGER, SAVE:: nPartNew
INTEGER, SAVE:: nInjIn, nOldIn, nWScheme
INTEGER, SAVE:: nInjIn, nOldIn, nWScheme, nCollisions
TYPE(particle), ALLOCATABLE, SAVE:: partTemp(:)
TYPE(lNode), POINTER:: partCurr, partNext
@ -335,18 +330,21 @@ MODULE moduleSolver
END IF
!$OMP SECTION
nWScheme = partWScheme%amount
!$OMP SECTION
nCollisions = partCollisions%amount
!$OMP END SECTIONS
!$OMP BARRIER
!$OMP SINGLE
CALL MOVE_ALLOC(partOld, partTemp)
nPartNew = nInjIn + nOldIn + nWScheme
nPartNew = nInjIn + nOldIn + nWScheme + nCollisions
ALLOCATE(partOld(1:nPartNew))
!$OMP END SINGLE
!$OMP SECTIONS
!$OMP SECTION
!Reset particles from injection
nn = 0
DO n = 1, nPartInj
IF (partInj(n)%n_in) THEN
@ -358,6 +356,7 @@ MODULE moduleSolver
END DO
!$OMP SECTION
!Reset particles from previous iteration
nn = nInjIn
DO n = 1, nPartOld
IF (partTemp(n)%n_in) THEN
@ -368,6 +367,7 @@ MODULE moduleSolver
END DO
!$OMP SECTION
!Reset particles from weighting scheme
nn = nInjIn + nOldIn
partCurr => partWScheme%head
DO n = 1, nWScheme
@ -381,6 +381,36 @@ MODULE moduleSolver
IF (ASSOCIATED(partWScheme%tail)) NULLIFY(partWScheme%tail)
partWScheme%amount = 0
!$OMP SECTION
!Reset particles from collisional process
nn = nInjIn + nOldIn + nWScheme
partCurr => partCollisions%head
DO n = 1, nCollisions
partNext => partCurr%next
partOld(nn+n) = partCurr%part
DEALLOCATE(partCurr)
partCurr => partNext
END DO
IF (ASSOCIATED(partCollisions%head)) NULLIFY(partCollisions%head)
IF (ASSOCIATED(partCollisions%tail)) NULLIFY(partCollisions%tail)
partCollisions%amount = 0
!$OMP SECTION
!Reset output in nodes
DO e = 1, mesh%numNodes
CALL mesh%nodes(e)%obj%resetOutput()
END DO
!$OMP SECTION
!Erase the list of particles inside the cell
DO e = 1, mesh%numVols
mesh%vols(e)%obj%totalWeight = 0.D0
CALL mesh%vols(e)%obj%listPart_in%erase()
END DO
!$OMP END SECTIONS
!$OMP SINGLE
@ -622,6 +652,5 @@ MODULE moduleSolver
END SUBROUTINE doOutput
END MODULE moduleSolver

View file

@ -11,11 +11,18 @@ MODULE moduleSpecies
END TYPE speciesGeneric
TYPE, EXTENDS(speciesGeneric):: speciesNeutral
CLASS(speciesGeneric), POINTER:: ion => NULL()
CONTAINS
PROCEDURE, PASS:: ionize => ionizeNeutral
END TYPE speciesNeutral
TYPE, EXTENDS(speciesGeneric):: speciesCharged
REAL(8):: q=0.D0, qm=0.D0
CLASS(speciesGeneric), POINTER:: ion => NULL(), neutral => NULL()
CONTAINS
PROCEDURE, PASS:: ionize => ionizeCharged
PROCEDURE, PASS:: neutralize => neutralizeCharged
END TYPE speciesCharged
@ -25,7 +32,7 @@ MODULE moduleSpecies
END TYPE
INTEGER:: nSpecies
TYPE(speciesCont), ALLOCATABLE:: species(:)
TYPE(speciesCont), ALLOCATABLE, TARGET:: species(:)
TYPE particle
REAL(8):: r(1:3) !Position
@ -45,7 +52,6 @@ MODULE moduleSpecies
!Arrays that contain the particles
TYPE(particle), ALLOCATABLE, DIMENSION(:), TARGET:: partOld !array of particles from previous iteration
TYPE(particle), ALLOCATABLE, DIMENSION(:), TARGET:: partInj !array of inject particles
INTEGER(KIND=OMP_LOCK_KIND):: lockWScheme !Lock for the NA list of particles
CONTAINS
FUNCTION speciesName2Index(speciesName) RESULT(sp)
@ -68,4 +74,59 @@ MODULE moduleSpecies
END FUNCTION speciesName2Index
!Change particle type to corresponding ion (neutral species)
SUBROUTINE ionizeNeutral(self, part)
USE moduleErrors
IMPLICIT NONE
CLASS(speciesNeutral), INTENT(IN):: self
TYPE(particle), INTENT(inout):: part
IF (ASSOCIATED(self%ion)) THEN
part%sp = self%ion%sp
ELSE
CALL criticalError('No ion defined for species' // self%name, 'ionizeNeutral')
END IF
END SUBROUTINE ionizeNeutral
!Change particle type to corresponding ion (charged species)
SUBROUTINE ionizeCharged(self, part)
USE moduleErrors
IMPLICIT NONE
CLASS(speciesCharged), INTENT(IN):: self
TYPE(particle), INTENT(inout):: part
IF (ASSOCIATED(self%ion)) THEN
part%sp = self%ion%sp
ELSE
CALL criticalError('No ion defined for species' // self%name, 'ionizeCharged')
END IF
END SUBROUTINE ionizeCharged
!Change particle type to corresponding neutral
SUBROUTINE neutralizeCharged(self, part)
USE moduleErrors
IMPLICIT NONE
CLASS(speciesCharged), INTENT(in):: self
TYPE(particle), INTENT(inout):: part
IF (ASSOCIATED(self%neutral)) THEN
part%sp = self%neutral%sp
ELSE
CALL criticalError('No neutral defined for species' // self%name, 'neutralizeCharged')
END IF
END SUBROUTINE neutralizeCharged
END MODULE moduleSpecies

View file

@ -28,10 +28,10 @@ MODULE moduleTable
amount = 0
DO
READ(id, '(A)', iostat = stat) dummy
!Skip comment
IF (INDEX(dummy,'#') /= 0) CYCLE
!If EOF or error, exit file
IF (stat /= 0) EXIT
!Skip comment
IF (INDEX(dummy,'#') /= 0) CYCLE
!Add row
amount = amount + 1
@ -52,6 +52,7 @@ MODULE moduleTable
i = 0
DO
READ(id, '(A)', iostat = stat) dummy
!TODO: Make this a function
IF (INDEX(dummy,'#') /= 0) CYCLE
IF (stat /= 0) EXIT
!Add data
@ -62,7 +63,7 @@ MODULE moduleTable
END DO
CLOSE(10)
CLOSE(id)
self%xMin = self%x(1)
self%xMax = self%x(amount)
@ -113,7 +114,11 @@ MODULE moduleTable
REAL(8):: data_x, data_f
self%x = self%x * data_x
self%xMin = self%xMin * data_x
self%xMax = self%xMax * data_x
self%f = self%f * data_f
self%fMin = self%fMin * data_f
self%fMax = self%fMax * data_f
self%k = self%k * data_f / data_x
END SUBROUTINE convertUnits