From a2648e200f2de5ec3b77909f8cb1f9d984848ce7 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 15 Apr 2022 01:16:03 +0200 Subject: [PATCH 1/8] Definition of background gas regions through a cylinder for non-constant background gas distribution --- REGGIE.md | 83 +++---- .../userguide/features-and-models/BGG.md | 36 ++- ...ons_DSMCState_000.00000000002000000_ref.h5 | Bin 0 -> 43656 bytes .../BackgroundGas_RegionsDefinition/DSMC.ini | 27 +++ .../MCC_Database.h5 | Bin 0 -> 54184 bytes .../analyze.ini | 6 + .../command_line.ini | 2 + .../cube_mesh.h5 | Bin 0 -> 33458 bytes .../BackgroundGas_RegionsDefinition/hopr.ini | 39 +++ .../parameter.ini | 159 +++++++++++++ .../BackgroundGas_RegionsDefinition/readme.md | 7 + .../BackgroundGas_VHS_MCC/analyze.ini | 4 +- .../BackgroundGas_VHS_MCC/excludeBuild.ini | 2 + .../BackgroundGas_VHS_MCC/parameter.ini | 17 +- .../2D_HET_Liu2010/parameter.ini | 2 +- src/init/define_parameters_init.f90 | 2 + src/particles/dsmc/dsmc_bg_gas.f90 | 224 +++++++++++++++++- src/particles/dsmc/dsmc_init.f90 | 13 +- src/particles/dsmc/dsmc_main.f90 | 1 + src/particles/dsmc/dsmc_vars.f90 | 16 ++ .../emission/particle_emission_init.f90 | 55 +++-- src/particles/mcc/mcc.f90 | 6 + src/particles/particle_init.f90 | 6 +- src/particles/particle_vars.f90 | 2 + .../create_xsec_db_lxcat.py | 11 +- 25 files changed, 631 insertions(+), 89 deletions(-) create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/BGG_Regions_DSMCState_000.00000000002000000_ref.h5 create mode 100755 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/DSMC.ini create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/MCC_Database.h5 create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/analyze.ini create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/command_line.ini create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/cube_mesh.h5 create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/hopr.ini create mode 100755 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/parameter.ini create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/readme.md create mode 100644 regressioncheck/CHE_DSMC/BackgroundGas_VHS_MCC/excludeBuild.ini diff --git a/REGGIE.md b/REGGIE.md index 7c8e312d4..b8b998cdf 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -40,6 +40,7 @@ Small test cases to check features with DSMC timedisc: [Link to build](regressio | | 1D_Two_Hot_Plates | | 1D problem: heating of cold gas between 2 hot walls | nProcs=1 | Temperature | [Link](regressioncheck/CHE_DSMC/1D_Two_Hot_Plates/readme.md) | | | 2D_VTS_Insert_CellLocal | | 2D/Axisymmetric, linear time step scaling: Initial particle insertion by cell_local | nProcs=2 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/CHE_DSMC/2D_VTS_Insert_CellLocal/readme.md) | | | 2D_VTS_SurfFlux_Tria | | 2D/Axisymmetric, linear time step scaling: Particle emission through surface flux | nProcs=2 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/CHE_DSMC/2D_VTS_SurfFlux_Tria/readme.md) | +| | BackgroundGas_RegionsDefinition | | Reservoir simulation setting different background gas regions | nProcs=1,6 | DSMCState: NumDens, Temp, Velo | [Link](regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/readme.md) | | | BackgroundGas_VHS_MCC | | Reservoir simulation of an ionization using a background gas with DSMC and MCC-based collision probabilities, hard compiled N=1 | nProcs=1 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/CHE_DSMC/BackgroundGas_VHS_MCC/readme.md) | | | BC_DiffuseWall_EnergyAccommodation | | Reservoir relaxing towards wall temperature, hard compiled N=1 | nProcs=1,4 | Temperature | [Link](regressioncheck/CHE_DSMC/BC_DiffuseWall_EnergyAccommodation/readme.md) | | | BC_DiffuseWall_TempGrad | | Reservoir with a boundary temperature gradient along the x-axis, hard compiled N=1 | nProcs=1,4 | Temperature | [Link](regressioncheck/CHE_DSMC/BC_DiffuseWall_TempGrad/readme.md) | @@ -170,13 +171,13 @@ Convergence tests (temporally by varying the time step) for integrating the path Testing more complex DSMC routines: [Link CMAKE-CONFIG](regressioncheck/NIG_DSMC/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :-------------------: | :--------------: | :---------------------------------: | :-----------: | :------------------------------------------: | :-------------------------------------------------------------------: | -| 1 | 2D_VTS_Distribution | | | nProcs=1,2,4 | h5diff PartTimeStep | [Link](regressioncheck/NIG_DSMC/2D_VTS_Distribution/readme.md) | -| 2 | Ambipolar_Diffusion | | | nProcs=6 | PartAnalyze.csv | [Link](regressioncheck/NIG_DSMC/Ambipolar_Diffusion/readme.md) | -| 3 | Macroscopic_Restart | | | nProcs=6 | PartAnalyze.csv | [Link](regressioncheck/NIG_DSMC/Macroscopic_Restart/readme.md) | -| 4 | RotPeriodicBC | | | nProcs=1,2,7,15,25 | h5 bounds check PartData and PartAnalyze.csv | [Link](regressioncheck/nig_dsmc/RotPeriodicBC/readme.md) | -| 5 | VSS_VHS_SelfDiffusion | | Testing the VHS/VSS collision model | nProcs=6 | Number Density | [Link](regressioncheck/NIG_DSMC/VSS_VHS_SelfDiffusion/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :-------------------: | :--------------: | :---------------------------------: | :----------------: | :------------------------------------------: | :--------------------------------------------------------------: | +| 1 | 2D_VTS_Distribution | | | nProcs=1,2,4 | h5diff PartTimeStep | [Link](regressioncheck/NIG_DSMC/2D_VTS_Distribution/readme.md) | +| 2 | Ambipolar_Diffusion | | | nProcs=6 | PartAnalyze.csv | [Link](regressioncheck/NIG_DSMC/Ambipolar_Diffusion/readme.md) | +| 3 | Macroscopic_Restart | | | nProcs=6 | PartAnalyze.csv | [Link](regressioncheck/NIG_DSMC/Macroscopic_Restart/readme.md) | +| 4 | RotPeriodicBC | | | nProcs=1,2,7,15,25 | h5 bounds check PartData and PartAnalyze.csv | [Link](regressioncheck/nig_dsmc/RotPeriodicBC/readme.md) | +| 5 | VSS_VHS_SelfDiffusion | | Testing the VHS/VSS collision model | nProcs=6 | Number Density | [Link](regressioncheck/NIG_DSMC/VSS_VHS_SelfDiffusion/readme.md) | ### NIG_Dielectric @@ -253,45 +254,45 @@ Testing of different tracking routines with DSMC: [Link to build](regressionchec Testing of different SuperB examples (via piclas or standalone superB binary), which generate a 3D magnetic field distribution to be used in piclas: [Link to build](regressioncheck/NIG_SuperB/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-------: | :------------------------: | :------------------------------------------: | :--------------------------------------------------------------------------------------: | :-----------------------------------: | :--------------------------------------------------------------: | :----------------------------------------------------------------------------------: | -| 1 | LinearConductor | PICLAS_BUILD_POSTI=ON, POSTI_BUILD_SUPERB=ON | straight conducting line | piclas, superB binaries (single-core) | convergence test with number of segments of the linear conductor | [Link](regressioncheck/NIG_SuperB/LinearConductor/readme.md) | -| 2 | CircularCoil | - | circular shaped coil | - | reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CircularCoil/readme.md) | -| 3 | CircularCoilTimeDependent | - | circular shaped coil, time-dependent current (sin function) | nProcs=1,4 | - | [Link](~/piclas/regressioncheck/NIG_SuperB/CircularCoilTimeDependent/readme.md) | -| 4 | CircularCoilTimeDependentMuli | - | three circular shaped coils, time-dependent current (sin function) | nProcs=1,4 | - | [Link](~/piclas/regressioncheck/NIG_SuperB/CircularCoilTimeDependentMuli/readme.md) | -| 5 | RectangularCoil | - | rectangular shaped coil | - | reference solution h5diff | [Link](regressioncheck/NIG_SuperB/RectangularCoil/readme.md) | -| 6 | SphericalMagnet | - | spherically shaped hard magnet | - | convergence test with number of nodes of the spherical magnet | [Link](regressioncheck/NIG_SuperB/SphericalMagnet/readme.md) | -| 7 | CubicMagnet | - | cubic shaped hard magnet | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CubicMagnet/readme.md) | -| 8 | CylindricalMagnet | - | cylindrically shaped hard magnet | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CylindricalMagnet/readme.md) | -| 9 | HollowCylinderMagnet | - | hollow cylinder hard magnet, placed outside of simulation domain | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/HollowCylinderMagnet/readme.md) | -| 10 | HollowCylinderMagnetCurved | - | hollow cylinder hard magnet (analytic solution along z-axis available), curvilinear grid | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/HollowCylinderMagnetCurved/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :---------------------------: | :------------------------------------------: | :--------------------------------------------------------------------------------------: | :-----------------------------------: | :--------------------------------------------------------------: | :---------------------------------------------------------------------------------: | +| 1 | LinearConductor | PICLAS_BUILD_POSTI=ON, POSTI_BUILD_SUPERB=ON | straight conducting line | piclas, superB binaries (single-core) | convergence test with number of segments of the linear conductor | [Link](regressioncheck/NIG_SuperB/LinearConductor/readme.md) | +| 2 | CircularCoil | - | circular shaped coil | - | reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CircularCoil/readme.md) | +| 3 | CircularCoilTimeDependent | - | circular shaped coil, time-dependent current (sin function) | nProcs=1,4 | - | [Link](~/piclas/regressioncheck/NIG_SuperB/CircularCoilTimeDependent/readme.md) | +| 4 | CircularCoilTimeDependentMuli | - | three circular shaped coils, time-dependent current (sin function) | nProcs=1,4 | - | [Link](~/piclas/regressioncheck/NIG_SuperB/CircularCoilTimeDependentMuli/readme.md) | +| 5 | RectangularCoil | - | rectangular shaped coil | - | reference solution h5diff | [Link](regressioncheck/NIG_SuperB/RectangularCoil/readme.md) | +| 6 | SphericalMagnet | - | spherically shaped hard magnet | - | convergence test with number of nodes of the spherical magnet | [Link](regressioncheck/NIG_SuperB/SphericalMagnet/readme.md) | +| 7 | CubicMagnet | - | cubic shaped hard magnet | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CubicMagnet/readme.md) | +| 8 | CylindricalMagnet | - | cylindrically shaped hard magnet | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/CylindricalMagnet/readme.md) | +| 9 | HollowCylinderMagnet | - | hollow cylinder hard magnet, placed outside of simulation domain | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/HollowCylinderMagnet/readme.md) | +| 10 | HollowCylinderMagnetCurved | - | hollow cylinder hard magnet (analytic solution along z-axis available), curvilinear grid | - | magnetic field reference solution h5diff | [Link](regressioncheck/NIG_SuperB/HollowCylinderMagnetCurved/readme.md) | ### NIG_PIC_poisson_Leapfrog Testing PIC compiled with Leapfrog integration (poisson,Leapfrog), solving Poisson's equation: [Link to build](regressioncheck/NIG_PIC_poisson_Leapfrog/builds.ini). - | **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | + | **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | | :-----: | :--------------------------------------------: | :-----------------: | :--------------------------------------------------------------------------------------: | :---------------: | :------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: | - | 1 | 2D_innerBC_dielectric_surface_charge | PICLAS_MPI = OFF,ON | Poisson-PIC,Dielectric surface charging,Cartesian geometry | nProcs=1,2,5,7,12 | DG_Source,DG_SourceExt,ElemData | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/2D_innerBC_dielectric_surface_charge/readme.md) | - | 2 | parallel_plates | - | Poisson-PIC,CalcCoupledPower,Part-LorentzType=non-relativistic (0) | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates/readme.md) | - | 3 | parallel_plates_AC | - | Poisson-PIC,CalcCoupledPower | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | - | 4 | parallel_plates_SEE_Dunaevsky2003 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Dunaevsky) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding e- energy on quartz (SiO2) | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Dunaevsky2003/readme.md) | - | 5 | parallel_plates_SEE-I | - | Poisson-PIC (no deposition), CalcCoupledPower, secondary electron emission (SEE-I model) | nProcs=1,2,5,10 | 13 % and 1 % of bombarding ions create secondary electrons | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | - | 6 | parallel_plates_SEE_Morozov2004 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Morozov) | nProcs=1,2,5,8,10 | 1 and 2 SEE from bombarding electrons on dielectric surfaces | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Morozov2004/parameter.ini) | - | 7 | parallel_plates_SEE_Phelps1999 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Phelps) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding Ar+ energy on copper | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Phelps1999/parameter.ini) | - | 8 | Dielectric_sphere_surface_charging | - | Poisson-PIC,Dielectric surface charging | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging/readme.md) | - | 9 | Dielectric_sphere_surface_charging_mortar | - | Poisson-PIC,Dielectric surface charging,mortars | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_mortar/readme.md) | - | 10 | Dielectric_sphere_surface_charging_PStateBound | - | Poisson-PIC,Dielectric surface charging,PartStateBoundary | nProcs=1,2 | PartStateBoundary,DSMCSurfState,DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_PStateBound/readme.md) | + | 1 | 2D_innerBC_dielectric_surface_charge | PICLAS_MPI = OFF,ON | Poisson-PIC,Dielectric surface charging,Cartesian geometry | nProcs=1,2,5,7,12 | DG_Source,DG_SourceExt,ElemData | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/2D_innerBC_dielectric_surface_charge/readme.md) | + | 2 | parallel_plates | - | Poisson-PIC,CalcCoupledPower,Part-LorentzType=non-relativistic (0) | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates/readme.md) | + | 3 | parallel_plates_AC | - | Poisson-PIC,CalcCoupledPower | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | + | 4 | parallel_plates_SEE_Dunaevsky2003 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Dunaevsky) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding e- energy on quartz (SiO2) | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Dunaevsky2003/readme.md) | + | 5 | parallel_plates_SEE-I | - | Poisson-PIC (no deposition), CalcCoupledPower, secondary electron emission (SEE-I model) | nProcs=1,2,5,10 | 13 % and 1 % of bombarding ions create secondary electrons | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | + | 6 | parallel_plates_SEE_Morozov2004 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Morozov) | nProcs=1,2,5,8,10 | 1 and 2 SEE from bombarding electrons on dielectric surfaces | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Morozov2004/parameter.ini) | + | 7 | parallel_plates_SEE_Phelps1999 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Phelps) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding Ar+ energy on copper | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Phelps1999/parameter.ini) | + | 8 | Dielectric_sphere_surface_charging | - | Poisson-PIC,Dielectric surface charging | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging/readme.md) | + | 9 | Dielectric_sphere_surface_charging_mortar | - | Poisson-PIC,Dielectric surface charging,mortars | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_mortar/readme.md) | + | 10 | Dielectric_sphere_surface_charging_PStateBound | - | Poisson-PIC,Dielectric surface charging,PartStateBoundary | nProcs=1,2 | PartStateBoundary,DSMCSurfState,DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_PStateBound/readme.md) | ### NIG_PIC_poisson_Boris-Leapfrog Testing PIC compiled with Boris-Leapfrog integration (poisson,Boris-Leapfrog), solving Poisson's equation: [Link to build](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :---------: | :------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------: | :--------------------------------------------------------------------: | :--------------------------------------------------------------------------: | -| 1 | 2D_HET_Liu2010 | CMAKE_BUILD_TYPE = Release,Debug | 2D Poisson-PIC, BGGas distribution, null collision on/off, pre-defined external magnetic field, neutralization BC, SEE model with variable electron bulk temperature | nProcs=3,6,12 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_HET_Liu2010/readme.md) | -| 1 | 3D_HET_Liu2010 | CMAKE_BUILD_TYPE = Release,Debug | 3D Poisson-PIC, BGGas distribution, null collision on/off, pre-defined external magnetic field, neutralization BC, SEE model with variable electron bulk temperature, dielectric surface charging (hollow cylinder) | nProcs=6 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/readme.md) | -| 1 | 2D_Landmark | CMAKE_BUILD_TYPE = Release,Debug | 2D Poisson-PIC, emission models for Landmark (volumetric ionization and neutralizer) | nProcs=4 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :------------: | :------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------: | :--------------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| 1 | 2D_HET_Liu2010 | CMAKE_BUILD_TYPE = Release,Debug | 2D Poisson-PIC, BGGas distribution, null collision on/off, pre-defined external magnetic field, neutralization BC, SEE model with variable electron bulk temperature | nProcs=3,6,12 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_HET_Liu2010/readme.md) | +| 1 | 3D_HET_Liu2010 | CMAKE_BUILD_TYPE = Release,Debug | 3D Poisson-PIC, BGGas distribution, null collision on/off, pre-defined external magnetic field, neutralization BC, SEE model with variable electron bulk temperature, dielectric surface charging (hollow cylinder) | nProcs=6 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/readme.md) | +| 1 | 2D_Landmark | CMAKE_BUILD_TYPE = Release,Debug | 2D Poisson-PIC, emission models for Landmark (volumetric ionization and neutralizer) | nProcs=4 | integrate number of electrons impinging the anode (SurfaceAnalyze.csv) | [Link](regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/readme.md) | ### NIG_PIC_poisson_RK3 @@ -352,14 +353,14 @@ Pure Poisson solver without particles: [Link to build](regressioncheck/NIG_poiss Test all features of photoionization within the HDG solver (without interpolation and deposition): [Link to build](regressioncheck/NIG_Photoionization/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :--------------: | :--------------: | :----------------------------------------: | :------------: | :----------------------------------------------------------------------------: | :--------------------------------------------------------------------: | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :---------------------------: | :--------------: | :--------------------------------------------------------------------------------------------------------------------------: | :------------: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------: | | 1 | volume_emission | | photoionization in the volume (circle and honeycomb) | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionization/volume_emission/readme.md) | -| 2 | volume_emission_rectangle | | photoionization in the volume (rectangle) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/volume_emission_rectangle/readme.md) | -| 3 | surface_emission | | secondary electron emission from a surface (circle and honeycomb) | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionization/surface_emission/readme.md) | -| 4 | surface_emission_rectangle | | secondary electron emission from a surface (rectangle), PartBCIndex=1 (BoundaryParticleOutput), emission-specific MPF (vMPF) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md) | +| 2 | volume_emission_rectangle | | photoionization in the volume (rectangle) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/volume_emission_rectangle/readme.md) | +| 3 | surface_emission | | secondary electron emission from a surface (circle and honeycomb) | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionization/surface_emission/readme.md) | +| 4 | surface_emission_rectangle | | secondary electron emission from a surface (rectangle), PartBCIndex=1 (BoundaryParticleOutput), emission-specific MPF (vMPF) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md) | | 5 | volume_emission_polychromatic | | photoionization in the volume with polychromatic photon spectrum and energy-dependent cross-section data | nProcs=1,2,5,8 | the total number of real electrons in the system with a reference solution and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionization/volume_emission_polychromatic/readme.md) | -| 6 | volume_emission_vMPF | | photoionization in the volume with vMPF | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionization/volume_emission_vMPF/readme.md) | +| 6 | volume_emission_vMPF | | photoionization in the volume with vMPF | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionization/volume_emission_vMPF/readme.md) | ## Weekly diff --git a/docs/documentation/userguide/features-and-models/BGG.md b/docs/documentation/userguide/features-and-models/BGG.md index 1e43dd095..2e0d612ee 100644 --- a/docs/documentation/userguide/features-and-models/BGG.md +++ b/docs/documentation/userguide/features-and-models/BGG.md @@ -18,7 +18,8 @@ initialization regions are allowed if the species is already defined a backgroun Part-Species1-PartDensity = 1E+22 Other species parameters such as mass, charge, temperature and velocity distribution for the background are also defined by the -regular read-in parameters. Every time step particles are generated from the background gas (for a mixture, the species of the generated particle is chosen +regular read-in parameters. A mixture as a background gas can be simulated by simply defining multiple background species. Every +time step particles are generated from the background gas (for a mixture, the species of the generated particle is chosen based on the species composition) and paired with the particle species. Subsequently, the collision probabilities are calculated using the conventional DSMC routines and the VHS cross-section model. Afterwards, the collision process is performed (if the probability is greater than a random number) and it is tested whether additional energy exchange and chemical reactions occur. @@ -26,18 +27,45 @@ While the VHS model is sufficient to model collisions between neutral species, i neutral-electron interaction. For this purpose, the cross-section based collision probabilities should be utilized, which are discussed in the following section. -A spatially varying background gas distribution may be used by running a pure DSMC simulation beforehand and using a time-averaged +## Distribution from DSMC result + +A spatially varying background gas distribution may be used by running a stand-alone DSMC simulation beforehand and using a time-averaged DSMC state file (*PROJECT_DSMCState_\*.h5*) as input for the actual simulation by setting Particles-BGGas-UseDistribution = T Particles-MacroscopicRestart-Filename = DSMCResult.h5 - Part-SpeciesX-InitX-DistributionSpeciesIndex = 1 + Part-SpeciesX-InitX-BGG-Distribution-SpeciesIndex = 1 where the first parameter activates the background gas distribution and the second parameter supplies the relative path to the file from which the background gas density, velocity and temperature field is read (cell-constant values). The third parameter defines which species index within the DSMC file is to be used as it may contain multiple species. -A mixture as a background gas can be simulated by simply defining multiple background species. If the number densities of the background gas species differ greatly and a specific background species is of interest (or the interaction with it) that has a lower number density compared to the other background species, it can be defined as a so-called trace species as shown below. +## Regions + +Another possibility to define a non-constant background gas is available through the definition of regions. Multiple regions defined +by simple geometrical volumes (e.g. cylinder) can be mapped to different species. First, one or more regions are defined: + + Particles-BGGas-nRegions = 1 + Particles-BGGas-Region1-Type = cylinder + Particles-BGGas-Region1-RadiusIC = 5E-6 + Particles-BGGas-Region1-CylinderHeightIC = 5E-6 + Particles-BGGas-Region1-BasePointIC = (/0.,0.,0./) + Particles-BGGas-Region1-BaseVector1IC = (/1.,0.,0./) + Particles-BGGas-Region1-BaseVector2IC = (/0.,1.,0./) + +Here, a cylinder is defined by two base vectors (from which a normal is determined for the direction of the cylinder height), +basepoint, radius and cylinder height. The definition of the species is the same as described above, with the addition of an +additional parameter, defining in which region, these properties should be applied to: + + Part-Species1-Init1-BGG-Region = 1 + +While a species can be part of different regions through multiple inits and multiple species can be part of a single region, +overlapping regions are not allowed. Whether an element is within a region is determined through the midpoint of the element and +thus it does not have to be fully enveloped. + +## Trace species + +If the number densities of the background gas species differ greatly and a specific background species is of interest (or the interaction with it) that has a lower number density compared to the other background species, it can be defined as a so-called trace species as shown below. Part-vMPF = T Part-Species1-Init1-TraceSpecies = T diff --git a/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/BGG_Regions_DSMCState_000.00000000002000000_ref.h5 b/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/BGG_Regions_DSMCState_000.00000000002000000_ref.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d5f1bbd40bf97c65f5372210be6b782b551305d5 GIT binary patch literal 43656 zcmeI5&u<$=6vtg|RSyq%~v{`6PkX9mVsVIuo>O! z^!Hghq2#AuBl1hLC|;0ptNm{)iieVja=|O*w>(kGv07d@puv2<){mvyb)6Z6_Gtq%F~S?%%l?!n`S|2?{O^t@-aJ?hbL zPubdVR`w{#$|SqC@9#uGPY!x@?{zh%B#ISPdg@C0%~lwzkQ?6K-Br!U-ut?2CX>UAM%O-nKB3h$hsFN0MF7cXn(^Dt&oJY++q(NOJ$QOA

zHTb%Aw4dh5`kY*Y>N#n@(7fEWqwW_x zdZ60Fqv~_sxF!pAd`tzMugd=FP<`Hrw|9it)AhVg&5aLgo}8UlA;kEtyk^EcAOHd& z00JN|V*>s|U$4Ob@>u!rdyoGtyz+>?-Rb=wsh=KXoy>i!36~&n;RqmJ+%zfd0=u|L zz|B=5USJnD3Ani`#0%`=CIL5Bg?NEo+$4ZifdB}ccLMmnoOcUi{dp2VyyQuHc60fC z|EZG?zM*!j{Nsne52_FTF~6Jf)M06(8J9NT0t7Aq0mRD%Fd`)6MgZ}W8|pJn1iPFG z7dkU1fOv7!0bm!{#Z3Zkt_tx2ySPaJs{(=P3E(|8J*zx>!Y+Bzo_;RaWqMZA^c?^0 z>uy&0RpI)}FMY8j|Ib``41V@?>HkKhu2?5C&NK}^%k~@pM0KmoJl~9)RGM*~bO=+ysFP0mMrNhcgw}#Tip%76Q9ua5z(eU7RsRW+AXk1_vr200JNY0w4eaAOHd& e00JNY0w4eaAOHd&00JNY0w4eaAOHgAm%#ruwFRI6 literal 0 HcmV?d00001 diff --git a/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/DSMC.ini b/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/DSMC.ini new file mode 100755 index 000000000..88a99c065 --- /dev/null +++ b/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/DSMC.ini @@ -0,0 +1,27 @@ +! =============================================================================== ! +! Species1, N2 +! =============================================================================== ! +Part-Species1-SpeciesName = N2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.17E-10 +Part-Species1-omega = 0.24 +Part-Species1-CharaTempVib = 3393.3 +Part-Species1-Ediss_eV = 9.79 +! =============================================================================== ! +! Species1, He +! =============================================================================== ! +Part-Species2-SpeciesName = He +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 273 +Part-Species2-dref = 2.287E-10 +Part-Species2-omega = 0.147 +Part-Species2-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 273 +Part-Species3-dref = 1E-15 +Part-Species3-omega = 0.147 \ No newline at end of file diff --git a/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/MCC_Database.h5 b/regressioncheck/CHE_DSMC/BackgroundGas_RegionsDefinition/MCC_Database.h5 new file mode 100644 index 0000000000000000000000000000000000000000..6609c3c3ada041832144ca55a314e38e63939d17 GIT binary patch literal 54184 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 Define parameters for background gas +!================================================================================================================================== +SUBROUTINE DefineParametersBGG() +! MODULES +USE MOD_Globals +USE MOD_ReadInTools ,ONLY: prms +IMPLICIT NONE +!================================================================================================================================== +CALL prms%SetSection("Background gas") +CALL prms%CreateLogicalOption( 'Particles-BGGas-UseDistribution', & + 'Utilization of a cell-local background gas distribution as read-in from a previous '//& + 'DSMC/BGK result using Particles-MacroscopicRestart', '.FALSE.') +! Backgroun gas regions +CALL prms%CreateIntOption( 'Particles-BGGas-nRegions' ,'Number of background gas regions', '0') +CALL prms%CreateStringOption( 'Particles-BGGas-Region[$]-Type' ,'Keyword for particle space condition of species [$] in case of multiple inits' , 'cylinder', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Particles-BGGas-Region[$]-RadiusIC' ,'Outer radius' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Particles-BGGas-Region[$]-Radius2IC' ,'Inner radius (e.g. for a ring)' , '0.', numberedmulti=.TRUE.) +CALL prms%CreateRealArrayOption('Particles-BGGas-Region[$]-BasePointIC' ,'Base point', numberedmulti=.TRUE.) +CALL prms%CreateRealArrayOption('Particles-BGGas-Region[$]-BaseVector1IC' ,'First base vector', numberedmulti=.TRUE.) +CALL prms%CreateRealArrayOption('Particles-BGGas-Region[$]-BaseVector2IC' ,'Second base vector', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Particles-BGGas-Region[$]-CylinderHeightIC' ,'Third measure of cylinder', numberedmulti=.TRUE.) +END SUBROUTINE DefineParametersBGG + + SUBROUTINE BGGas_Initialize() !=================================================================================================================================== !> Initialization of the background gas: compatibility check, array allocation, background species to species mapping and @@ -66,8 +91,8 @@ SUBROUTINE BGGas_Initialize() DO iSpec = 1, nSpecies IF(BGGas%BackgroundSpecies(iSpec)) THEN - IF(Species(iSpec)%NumberOfInits.NE.1) CALL abort(__STAMP__, 'BGG species can be used ONLY for BGG!') - IF(.NOT.BGGas%UseDistribution)THEN + IF(Species(iSpec)%NumberOfInits.NE.1.AND..NOT.BGGas%UseRegions) CALL abort(__STAMP__, 'BGG species can be used ONLY for BGG!') + IF(.NOT.BGGas%UseDistribution.AND..NOT.BGGas%UseRegions)THEN IF(BGGas%NumberDensity(iSpec).EQ.0.) CALL abort(__STAMP__, 'NumberDensity is zero but must be defined for a background gas!') END IF ! .NOT.BGGas%UseDistribution END IF @@ -76,7 +101,7 @@ SUBROUTINE BGGas_Initialize() IF(DoMacroscopicRestart) CALL abort(__STAMP__, 'Constant background gas and macroscopic restart are not compatible!') ! 2.) Allocation -IF(BGGas%UseDistribution) THEN +IF(BGGas%UseDistribution.OR.BGGas%UseRegions) THEN ALLOCATE(BGGas%Distribution(1:BGGas%NumberOfSpecies,1:10,1:nElems)) BGGas%Distribution = 0. ALLOCATE(BGGas%SpeciesFractionElem(1:BGGas%NumberOfSpecies,1:nElems)) @@ -107,7 +132,7 @@ SUBROUTINE BGGas_Initialize() IF(BGGas%BackgroundSpecies(iSpec)) THEN bgSpec = bgSpec + 1 IF(bgSpec.GT.BGGas%NumberOfSpecies) CALL Abort(__STAMP__,'More background species detected than previously defined!') - IF(.NOT.BGGas%UseDistribution) BGGas%NumberDensity(bgSpec) = SpeciesDensTmp(iSpec) + IF(.NOT.BGGas%UseDistribution.AND..NOT.BGGas%UseRegions) BGGas%NumberDensity(bgSpec) = SpeciesDensTmp(iSpec) BGGas%MapSpecToBGSpec(iSpec) = bgSpec BGGas%MapBGSpecToSpec(bgSpec) = iSpec BGGas%MaxMPF = MAX(BGGas%MaxMPF,Species(iSpec)%MacroParticleFactor) @@ -117,7 +142,7 @@ SUBROUTINE BGGas_Initialize() ! 4.) Read-in a background gas distribution IF(BGGas%UseDistribution) CALL BGGas_ReadInDistribution() -! 5.) Determine species fraction +! 5.) Determine species fraction (not yet for background gas regions) DO bgSpec = 1, BGGas%NumberOfSpecies IF(BGGas%UseDistribution) THEN DO iElem = 1, nElems @@ -125,7 +150,7 @@ SUBROUTINE BGGas_Initialize() BGGas%SpeciesFractionElem(bgSpec,iElem) = BGGas%Distribution(bgSpec,7,iElem) / SUM(BGGas%Distribution(:,7,iElem)) END IF ! SUM(BGGas%Distribution(:,7,iElem)).GT.0. END DO ! iElem = 1, nElems - ELSE + ELSEIF(.NOT.BGGas%UseRegions) THEN IF(SUM(SpeciesDensTmp).GT.0.)THEN BGGas%SpeciesFraction(bgSpec) = BGGas%NumberDensity(bgSpec) / SUM(SpeciesDensTmp) END IF ! SUM(SpeciesDensTmp).GT.0. @@ -223,6 +248,10 @@ SUBROUTINE BGGas_InsertParticles() IF (PDM%ParticleInside(iPart)) THEN ! Skip background particles that have been created within this loop IF(BGGas%BackgroundSpecies(PartSpecies(iPart))) CYCLE + ! Skip particles outside of any regions + IF(BGGas%UseRegions) THEN + IF(BGGas%RegionElemType(PEM%LocalElemID(iPart)).EQ.0) CYCLE + END IF ! Get a free particle index iNewPart = iNewPart + 1 PositionNbr = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition) @@ -363,6 +392,12 @@ SUBROUTINE DSMC_pairing_bggas(iElem) INTEGER :: cSpec1, cSpec2, iCase, iSpec, bggSpec REAL :: iRan, MPF !=================================================================================================================================== + +! Skip elements outside of any background gas regions +IF(BGGas%UseRegions) THEN + IF(BGGas%RegionElemType(iElem).EQ.0) RETURN +END IF + nPart = PEM%pNumber(iElem) nPair = INT(nPart/2.) @@ -976,4 +1011,177 @@ SUBROUTINE BGGas_TraceSpeciesSplit(iElem, nPart, nPair) END SUBROUTINE BGGas_TraceSpeciesSplit + +!=================================================================================================================================== +!> Initialization of the background gas regions (e.g. geometrical volumes with different background gas properties) +!> 1. Read-in geometry information based on selected type (e.g. cylinder) +!> 2. Determine which elements are the defined regions by comparing the element midpoint +!> 3. Write the corresponding region properties into the BGGas%Distribution array +!> 4. Calculate the element locall species fraction in case of a multi-species background gas +!> 5. Activate BGGas%UseDistribution to utilize the same arrays and routines during computation (but do not use it for read-in) +!=================================================================================================================================== +SUBROUTINE BGGas_InitRegions() +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars +USE MOD_ReadInTools +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Vars ,ONLY: nElems, offSetElem +USE MOD_DSMC_Vars ,ONLY: BGGas +USE MOD_Particle_Vars ,ONLY: Species,nSpecies +USE MOD_Particle_Mesh_Vars ,ONLY: ElemMidPoint_Shared +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +CHARACTER(32) :: hilf2 +INTEGER :: iElem, iSpec, bgSpec, iInit, iReg, CNElemID +REAL :: lineVector(3), nodeVec(3), nodeRadius, nodeHeight +!=================================================================================================================================== +SWRITE(UNIT_stdOut,'(A)') ' INIT BACKGROUND GAS REGIONS ...' + +ALLOCATE(BGGas%Region(BGGas%nRegions)) +ALLOCATE(BGGas%RegionElemType(nElems)) +BGGas%RegionElemType = 0 + +! 1) Read-in of the background gas regions +DO iReg = 1, BGGas%nRegions + WRITE(UNIT=hilf2,FMT='(I0)') iReg + BGGas%Region(iReg)%Type = TRIM(GETSTR('Particles-BGGas-Region'//TRIM(hilf2)//'-Type')) + SELECT CASE(TRIM(BGGas%Region(iReg)%Type)) + CASE('cylinder') + BGGas%Region(iReg)%RadiusIC = GETREAL('Particles-BGGas-Region'//TRIM(hilf2)//'-RadiusIC') + BGGas%Region(iReg)%Radius2IC = GETREAL('Particles-BGGas-Region'//TRIM(hilf2)//'-Radius2IC') + BGGas%Region(iReg)%CylinderHeightIC = GETREAL('Particles-BGGas-Region'//TRIM(hilf2)//'-CylinderHeightIC') + IF(BGGas%Region(iReg)%Radius2IC.GE.BGGas%Region(iReg)%RadiusIC) CALL abort(__STAMP__,& + 'For this emission type RadiusIC must be greater than Radius2IC!') + !--- Get BasePointIC + BGGas%Region(iReg)%BasePointIC = GETREALARRAY('Particles-BGGas-Region'//TRIM(hilf2)//'-BasePointIC',3) + !--- Get BaseVector1IC + BGGas%Region(iReg)%BaseVector1IC = GETREALARRAY('Particles-BGGas-Region'//TRIM(hilf2)//'-BaseVector1IC',3) + !--- Get BaseVector2IC + BGGas%Region(iReg)%BaseVector2IC = GETREALARRAY('Particles-BGGas-Region'//TRIM(hilf2)//'-BaseVector2IC',3) + ! Determine the normal vector of the cylinder from base vectors + BGGas%Region(iReg)%NormalVector = CROSS(BGGas%Region(iReg)%BaseVector1IC,BGGas%Region(iReg)%BaseVector2IC) + IF (VECNORM(BGGas%Region(iReg)%NormalVector).EQ.0) THEN + CALL abort(__STAMP__,'BaseVectors are parallel!') + ELSE + BGGas%Region(iReg)%NormalVector = UNITVECTOR(BGGas%Region(iReg)%NormalVector) + END IF + CASE DEFAULT + CALL abort(__STAMP__,'ERROR Background gas regions: Selected region type is not implemented!') + END SELECT +END DO + +DO iElem = 1, nElems + ! 2) Map elements to regions + CNElemID = GetCNElemID(iElem+offSetElem) + DO iReg = 1, BGGas%nRegions + SELECT CASE(TRIM(BGGas%Region(iReg)%Type)) + CASE('cylinder') + lineVector = BGGas%Region(iReg)%NormalVector + ! Node vector relative to cylinder basepoint + nodeVec(1:3) = ElemMidPoint_Shared(1:3,CNElemID) - BGGas%Region(iReg)%BasePointIC + ! Node vector projected onto cylinder normal + nodeHeight = DOT_PRODUCT(nodeVec(1:3),lineVector) + ! Node radius as the remainder of the node vector length and the projected node height + nodeRadius = SQRT(DOTPRODUCT(nodeVec(1:3)) - nodeHeight**2) + ! Check if node is outside of the region + IF((nodeHeight.GE.0.).AND.(nodeHeight.LE.BGGas%Region(iReg)%CylinderHeightIC) & + .AND.(nodeRadius.GE.BGGas%Region(iReg)%Radius2IC).AND.(nodeRadius.LE.BGGas%Region(iReg)%RadiusIC)) THEN + ! Element mid point is inside (positive region number) + IF(BGGas%RegionElemType(iElem).NE.0) THEN + CALL abort(__STAMP__,'ERROR Background gas regions: Overlapping regions are not supported!') + END IF + BGGas%RegionElemType(iElem) = iReg + END IF + END SELECT + END DO ! iReg = 1, BGGas%nRegions + ! 3) Assign the region values to the distribution array + IF(BGGas%RegionElemType(iElem).NE.0) THEN + DO iSpec = 1, nSpecies + ! Skip non-background gas species + IF(.NOT.BGGas%BackgroundSpecies(iSpec)) CYCLE + ! Loop over all the inits for the species (different inits for different regions) + DO iInit = 1, Species(iSpec)%NumberOfInits + ASSOCIATE( SpecInit => Species(iSpec)%Init(iInit) ) + IF(BGGas%RegionElemType(iElem).EQ.Species(iSpec)%Init(iInit)%BGGRegion) THEN + ! Velocity + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),1:3,iElem) = SpecInit%VeloIC * SpecInit%VeloVecIC + ! Translational temperature + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),4:6,iElem) = SpecInit%MWTemperatureIC + ! Number density + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),7,iElem) = SpecInit%PartDensity + END IF ! BGGas%RegionElemType(iElem).EQ.Species(iSpec)%Init(iInit)%BGGRegion + END ASSOCIATE + END DO ! iInit = 1, Species(iSpec)%NumberOfInits + END DO ! iSpec = 1, nSpecies + END IF ! BGGas%RegionElemType(iElem).NE.0 + ! 4) Calculate species fraction per element + DO bgSpec = 1, BGGas%NumberOfSpecies + IF(SUM(BGGas%Distribution(:,7,iElem)).GT.0.)THEN + BGGas%SpeciesFractionElem(bgSpec,iElem) = BGGas%Distribution(bgSpec,7,iElem) / SUM(BGGas%Distribution(:,7,iElem)) + END If + END DO +END DO ! iElem = 1, nElems + +! 5) Utilizing the same routines after the initialization as the read-in distribution +BGGas%UseDistribution = .TRUE. + +SWRITE(UNIT_stdOut,'(A)') ' BACKGROUND GAS REGIONS DONE!' + +END SUBROUTINE BGGas_InitRegions + + +!=================================================================================================================================== +!> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during +!> BGGas_InitRegions). Loop over all elements, species and inits per species to set values for molecues and/or atoms. +!=================================================================================================================================== +SUBROUTINE BGGas_RegionsSetInternalTemp() +! MODULES +USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_DSMC_Vars ,ONLY: BGGas, DSMC, SpecDSMC +USE MOD_Particle_Vars ,ONLY: Species,nSpecies +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem, iSpec, iInit +!=================================================================================================================================== + +DO iElem = 1, nElems + ! Assign the region values to the distribution array + IF(BGGas%RegionElemType(iElem).NE.0) THEN + DO iSpec = 1, nSpecies + ! Skip non-background gas species + IF(.NOT.BGGas%BackgroundSpecies(iSpec)) CYCLE + ! Loop over all the inits for the species (different inits for different regions) + DO iInit = 1, Species(iSpec)%NumberOfInits + IF(BGGas%RegionElemType(iElem).EQ.Species(iSpec)%Init(iInit)%BGGRegion) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Vibrational temperature + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),8,iElem) = SpecDSMC(iSpec)%Init(iInit)%TVib + ! Rotational temperature + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),9,iElem) = SpecDSMC(iSpec)%Init(iInit)%TRot + END IF + IF (DSMC%ElectronicModel.GT.0) THEN + ! Electronic temperature + BGGas%Distribution(BGGas%MapSpecToBGSpec(iSpec),10,iElem) = SpecDSMC(iSpec)%Init(iInit)%Telec + END IF + END IF ! BGGas%RegionElemType(iElem).EQ.Species(iSpec)%Init(iInit)%BGGRegion + END DO ! iInit = 1, Species(iSpec)%NumberOfInits + END DO ! iSpec = 1, nSpecies + END IF ! BGGas%RegionElemType(iElem).NE.0 +END DO ! iElem = 1, nElems + +END SUBROUTINE BGGas_RegionsSetInternalTemp + END MODULE MOD_DSMC_BGGas diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 427a7b91f..2be61b658 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -75,9 +75,6 @@ SUBROUTINE DefineParametersDSMC() 'Enables the ambipolar diffusion modelling of electrons, which are attached to the '//& 'ions, however, retain their own velocity vector to participate in collision events.',& '.FALSE.') -CALL prms%CreateLogicalOption( 'Particles-BGGas-UseDistribution', & - 'Utilization of a cell-local background gas distribution as read-in from a previous '//& - 'DSMC/BGK result using Particles-MacroscopicRestart', '.FALSE.') !----------------------------------------------------------------------------------- CALL prms%CreateLogicalOption( 'Particles-DSMC-CalcQualityFactors', & 'Enables [TRUE] / disables [FALSE] the calculation and output of:\n'//& @@ -300,6 +297,7 @@ SUBROUTINE InitDSMC() USE MOD_DSMC_PolyAtomicModel ,ONLY: InitPolyAtomicMolecs, DSMC_SetInternalEnr_Poly USE MOD_DSMC_CollisVec ,ONLY: DiceDeflectedVelocityVector4Coll, DiceVelocityVector4Coll, PostCollVec USE MOD_part_emission_tools ,ONLY: DSMC_SetInternalEnr_LauxVFD +USE MOD_DSMC_BGGas ,ONLY: BGGas_RegionsSetInternalTemp ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -713,9 +711,9 @@ SUBROUTINE InitDSMC() SpecDSMC(iSpec)%ElecRelaxProb = GETREAL('Part-Species'//TRIM(hilf)//'-ElecRelaxProb') ! multi init stuff ALLOCATE(SpecDSMC(iSpec)%Init(0:Species(iSpec)%NumberOfInits)) - ! Skip the read-in of temperatures if a background gas distribution is used + ! Skip the read-in of temperatures if a background gas distribution is used but not if background gas regions are used IF(BGGas%NumberOfSpecies.GT.0) THEN - IF(BGGas%BackgroundSpecies(iSpec).AND.BGGas%UseDistribution) THEN + IF(BGGas%BackgroundSpecies(iSpec).AND.BGGas%UseDistribution.AND..NOT.BGGas%UseRegions) THEN SpecDSMC(iSpec)%Init(1)%TVib = 0. SpecDSMC(iSpec)%Init(1)%TRot = 0. SpecDSMC(iSpec)%Init(1)%Telec = 0. @@ -813,6 +811,9 @@ SUBROUTINE InitDSMC() END DO ! Array not required anymore after the initialization is completed DEALLOCATE(PDM%PartInit) + IF(BGGas%UseRegions) THEN + CALL BGGas_RegionsSetInternalTemp() + END IF END IF ! CollisMode .EQ. 2 or 3 !----------------------------------------------------------------------------------------------------------------------------------- ! Define chemical reactions (including ionization and backward reaction rate) @@ -1432,6 +1433,8 @@ SUBROUTINE FinalizeDSMC() SDEALLOCATE(BGGas%DistributionSpeciesIndex) SDEALLOCATE(BGGas%Distribution) SDEALLOCATE(BGGas%DistributionNumDens) +SDEALLOCATE(BGGas%Region) +SDEALLOCATE(BGGas%RegionElemType) SDEALLOCATE(RadialWeighting%ClonePartNum) SDEALLOCATE(ClonedParticles) diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index 771b3c8fd..279557a83 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -100,6 +100,7 @@ SUBROUTINE DSMC_main(DoElement) IF (CollisMode.NE.0) THEN CALL InitCalcVibRelaxProb IF(BGGas%NumberOfSpecies.GT.0) THEN + ! Decide between MCC and DSMC-based background gas IF(UseMCC) THEN CALL MCC(iElem) ELSE diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 166a676a2..e27d16d80 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -261,6 +261,18 @@ MODULE MOD_DSMC_Vars TYPE(tDSMC) :: DSMC +TYPE tRegion + CHARACTER(40) :: Type ! Geometric type of the region, e.g. cylinder + ! Region-Type: cylinder + REAL :: RadiusIC + REAL :: Radius2IC + REAL :: CylinderHeightIC + REAL :: BasePointIC(3) + REAL :: BaseVector1IC(3) + REAL :: BaseVector2IC(3) + REAL :: NormalVector(3) +END TYPE tRegion + TYPE tBGGas INTEGER :: NumberOfSpecies ! Number of background gas species LOGICAL, ALLOCATABLE :: BackgroundSpecies(:) ! Flag, if a species is a background gas species, [1:nSpecies] @@ -280,6 +292,10 @@ MODULE MOD_DSMC_Vars ! as a background distribution [1:nSpecies] LOGICAL, ALLOCATABLE :: TraceSpecies(:) ! Flag, if species is a trace element, Input: [1:nSpecies] REAL :: MaxMPF ! Maximum weighting factor of the background gas species + INTEGER :: nRegions ! Number of different background gas regions (read-in) + LOGICAL :: UseRegions ! Flag for the definition of different background gas regions (set after read-in) + INTEGER, ALLOCATABLE :: RegionElemType(:) ! 0: outside, positive integers: inside region number + TYPE(tRegion), ALLOCATABLE :: Region(:) ! Type for the geometry definition of the different regions [1:nRegions] END TYPE tBGGas TYPE(tBGGas) :: BGGas diff --git a/src/particles/emission/particle_emission_init.f90 b/src/particles/emission/particle_emission_init.f90 index 8890c31b4..59f430416 100644 --- a/src/particles/emission/particle_emission_init.f90 +++ b/src/particles/emission/particle_emission_init.f90 @@ -85,9 +85,6 @@ SUBROUTINE DefineParametersParticleEmission() CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-maxParticleNumber-z' & , 'TODO-DEFINE-PARAMETER\n'//& 'Maximum Number of all Particles in z direction', '0', numberedmulti=.TRUE.) -CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-DistributionSpeciesIndex' & - , 'Background gas with a distribution: Input the species index to use from the read-in '//& - 'distribution of the DSMCState file', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Species[$]-Init[$]-Alpha' & , 'TODO-DEFINE-PARAMETER\n'//& 'WaveNumber for sin-deviation initiation.', numberedmulti=.TRUE.) @@ -105,6 +102,11 @@ SUBROUTINE DefineParametersParticleEmission() CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-NumberOfExcludeRegions' & , 'TODO-DEFINE-PARAMETER\n'//& 'Number of different regions to be excluded', '0', numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-BGG-Distribution-SpeciesIndex' & + , 'Background gas with a distribution: Input the species index to use from the read-in '//& + 'distribution of the DSMCState file', numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-BGG-Region' & + , 'Number of the region in which the given conditions shall be applied to', numberedmulti=.TRUE.) CALL prms%SetSection("Particle Species Init RegionExculdes") ! some inits or exluded in some regions @@ -150,9 +152,9 @@ SUBROUTINE DefineParametersParticleEmission() ! ====================================== photoionization ================================================================= CALL prms%CreateLogicalOption('Part-Species[$]-Init[$]-FirstQuadrantOnly','Only insert particles in the first quadrant that is'//& ' spanned by the vectors x=BaseVector1IC and y=BaseVector2IC in the interval x,y in [0,R]', '.FALSE.', numberedmulti=.TRUE.) -CALL prms%CreateRealOption('Part-Species[$]-Init[$]-PulseDuration','Pulse duration tau for a Gaussian-tpye pulse with I~exp(-(t/tau)^2) [s]', numberedmulti=.TRUE.) -CALL prms%CreateRealOption('Part-Species[$]-Init[$]-WaistRadius','Beam waist radius (in focal spot) w_b for Gaussian-tpye pulse with I~exp(-(r/w_b)^2) [m]',numberedmulti=.TRUE.) -CALL prms%CreateRealOption('Part-Species[$]-Init[$]-IntensityAmplitude','Beam intensity maximum I0 Gaussian-tpye pulse with I=I0*exp(-(t/tau)^2)exp(-(r/w_b)^2) [W/m^2]','-1.0',numberedmulti=.TRUE.) +CALL prms%CreateRealOption('Part-Species[$]-Init[$]-PulseDuration','Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]', numberedmulti=.TRUE.) +CALL prms%CreateRealOption('Part-Species[$]-Init[$]-WaistRadius','Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]',numberedmulti=.TRUE.) +CALL prms%CreateRealOption('Part-Species[$]-Init[$]-IntensityAmplitude','Beam intensity maximum I0 Gaussian-type pulse with I=I0*exp(-(t/tau)^2)exp(-(r/w_b)^2) [W/m^2]','-1.0',numberedmulti=.TRUE.) CALL prms%CreateRealOption('Part-Species[$]-Init[$]-WaveLength','Beam wavelength [m]',numberedmulti=.TRUE.) CALL prms%CreateRealOption('Part-Species[$]-Init[$]-YieldSEE','Secondary photoelectron yield [-]. Number of emitted electrons per incident photon',numberedmulti=.TRUE.) CALL prms%CreateRealOption('Part-Species[$]-Init[$]-RepetitionRate','Pulse repetition rate (pulses per second) [Hz]',numberedmulti=.TRUE.) @@ -165,7 +167,7 @@ SUBROUTINE DefineParametersParticleEmission() CALL prms%CreateRealOption('Part-Species[$]-Init[$]-EffectiveIntensityFactor', 'Scaling factor that increases I0 [-]','1.', numberedmulti=.TRUE.) CALL prms%CreateLogicalOption('Part-Species[$]-Init[$]-TraceSpecies','Flag background species as trace element.'//& ' Different weighting factor can be used', '.FALSE.', numberedmulti=.TRUE.) -CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-PartBCIndex','Assocaited particle boundary ID','-1',numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Species[$]-Init[$]-PartBCIndex','Associated particle boundary ID','-1',numberedmulti=.TRUE.) CALL prms%CreateRealOption('Part-Species[$]-Init[$]-MacroParticleFactor', 'Emission-specific particle weighting factor: number of simulation particles per real particle',numberedmulti=.TRUE.) END SUBROUTINE DefineParametersParticleEmission @@ -206,9 +208,14 @@ SUBROUTINE InitializeVariablesSpeciesInits() BGGas%TraceSpecies = .FALSE. BGGas%UseDistribution = GETLOGICAL('Particles-BGGas-UseDistribution') -IF(BGGas%UseDistribution) THEN +BGGas%nRegions = GETINT('Particles-BGGas-nRegions') +IF(BGGas%UseDistribution.AND.(BGGas%nRegions.GT.0)) THEN + CALL abort(__STAMP__,'ERORR: Background gas can either be used with a distribution OR regions!') +ELSEIF (BGGas%UseDistribution) THEN IF(usevMPF) CALL abort(__STAMP__,'vMPF not implemented for Particles-BGGas-UseDistribution=T') ALLOCATE(BGGas%DistributionSpeciesIndex(nSpecies)) +ELSEIF (BGGas%nRegions.GT.0) THEN + BGGas%UseRegions = .TRUE. ELSE ALLOCATE(BGGas%NumberDensity(nSpecies)) BGGas%NumberDensity = 0. @@ -375,8 +382,7 @@ SUBROUTINE InitializeVariablesSpeciesInits() !--- integer check for ParticleEmissionType 2 IF((Species(iSpec)%Init(iInit)%ParticleEmissionType.EQ.2).AND. & (ABS(Species(iSpec)%Init(iInit)%ParticleNumber-INT(Species(iSpec)%Init(iInit)%ParticleNumber,8)).GT.0.0)) THEN - CALL abort(__STAMP__, & - ' If ParticleEmissionType = 2 (parts per iteration), ParticleNumber has to be an integer number') + CALL abort(__STAMP__,' If ParticleEmissionType = 2 (parts per iteration), ParticleNumber has to be an integer number') END IF !--- ExcludeRegions IF (Species(iSpec)%Init(iInit)%NumberOfExcludeRegions.GT.0) THEN @@ -384,18 +390,27 @@ SUBROUTINE InitializeVariablesSpeciesInits() END IF !--- Background gas IF(TRIM(Species(iSpec)%Init(iInit)%SpaceIC).EQ.'background') THEN - IF(.NOT.BGGas%BackgroundSpecies(iSpec)) THEN + IF(BGGas%BackgroundSpecies(iSpec)) THEN + ! Only regions allows multiple background inits (additionally, avoid counting the same species multiple times) + IF(.NOT.BGGas%UseRegions) CALL abort(__STAMP__, 'ERROR: Only one background definition per species is allowed!') + ELSE + ! Count each species only once BGGas%NumberOfSpecies = BGGas%NumberOfSpecies + 1 - BGGas%BackgroundSpecies(iSpec) = .TRUE. - IF(.NOT.BGGas%UseDistribution) BGGas%NumberDensity(iSpec) = Species(iSpec)%Init(iInit)%PartDensity - BGGas%TraceSpecies(iSpec) = GETLOGICAL('Part-Species'//TRIM(hilf2)//'-TraceSpecies') - Species(iSpec)%Init(iInit)%ParticleEmissionType = -1 - ! Read-in the species index for background gas distribution - IF(BGGas%UseDistribution) & - BGGas%DistributionSpeciesIndex(iSpec) = GETINT('Part-Species'//TRIM(hilf2)//'-DistributionSpeciesIndex') - ELSE - CALL abort(__STAMP__, 'Only one background definition per species is allowed!') + END IF + BGGas%BackgroundSpecies(iSpec) = .TRUE. + BGGas%TraceSpecies(iSpec) = GETLOGICAL('Part-Species'//TRIM(hilf2)//'-TraceSpecies') + Species(iSpec)%Init(iInit)%ParticleEmissionType = -1 + ! Read-in the species index for background gas distribution + IF(BGGas%UseDistribution) THEN + BGGas%DistributionSpeciesIndex(iSpec) = GETINT('Part-Species'//TRIM(hilf2)//'-BGG-Distribution-SpeciesIndex') + ELSE IF(BGGas%UseRegions) THEN + Species(iSpec)%Init(iInit)%BGGRegion = GETINT('Part-Species'//TRIM(hilf2)//'-BGG-Region') + IF(Species(iSpec)%Init(iInit)%BGGRegion.GT.BGGas%nRegions) THEN + CALL abort(__STAMP__, 'ERROR: Given background gas region number is greater than the defined number of regions!') END IF + ELSE + BGGas%NumberDensity(iSpec) = Species(iSpec)%Init(iInit)%PartDensity + END IF END IF !--- InflowRise IF(Species(iSpec)%Init(iInit)%InflowRiseTime.GT.0.)THEN diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index cf05f7c1e..f911a637c 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -94,9 +94,15 @@ SUBROUTINE MCC(iElem) REAL :: ProbNull !=================================================================================================================================== +! Skip elements outside of any background gas regions +IF(BGGas%UseRegions) THEN + IF(BGGas%RegionElemType(iElem).EQ.0) RETURN +END IF + GlobalElemID = iElem+offSetElem CNElemID = GetCNElemID(GlobalElemID) Volume = ElemVolume_Shared(CNElemID) + ! Create particle index list for pairing nPart = PEM%pNumber(iElem) ALLOCATE(iPartIndx_Node(nPart)) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index ac0603e65..a92d3d298 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -260,7 +260,7 @@ SUBROUTINE InitParticles() USE MOD_ReadInTools USE MOD_DSMC_Init ,ONLY: InitDSMC USE MOD_MCC_Init ,ONLY: InitMCC -USE MOD_DSMC_Vars ,ONLY: useDSMC,DSMC,DSMC_Solution +USE MOD_DSMC_Vars ,ONLY: useDSMC,DSMC,DSMC_Solution,BGGas USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut USE MOD_LoadBalance_Vars ,ONLY: nPartsPerElem USE MOD_Mesh_Vars ,ONLY: nElems @@ -278,6 +278,7 @@ SUBROUTINE InitParticles() USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_Particle_Sampling_Adapt ,ONLY: InitAdaptiveBCSampling USE MOD_Particle_Boundary_Init ,ONLY: InitParticleBoundaryRotPeriodic, InitAdaptiveWallTemp +USE MOD_DSMC_BGGas ,ONLY: BGGas_InitRegions #if USE_MPI USE MOD_Particle_MPI ,ONLY: InitParticleCommSize !USE MOD_Particle_MPI_Emission ,ONLY: InitEmissionParticlesToProcs @@ -349,6 +350,9 @@ SUBROUTINE InitParticles() ! Allocate sampling of near adaptive boundary element values IF(UseAdaptive.OR.(nPorousBC.GT.0)) CALL InitAdaptiveBCSampling() +! Initialize backrgound gas regions (requires completed InitParticleGeometry for ElemMidPoint_Shared) +IF(BGGas%UseRegions) CALL BGGas_InitRegions() + IF (useDSMC) THEN CALL InitDSMC() CALL InitMCC() diff --git a/src/particles/particle_vars.f90 b/src/particles/particle_vars.f90 index 5b91f871e..c56553be2 100644 --- a/src/particles/particle_vars.f90 +++ b/src/particles/particle_vars.f90 @@ -197,6 +197,8 @@ MODULE MOD_Particle_Vars INTEGER :: sumOfMatchedParticles ! Sum of matched particles on all procs INTEGER :: sumOfRequestedParticles ! Sum of requested particles on all procs INTEGER :: mySumOfMatchedParticles ! Sum of matched particles on current proc +!=== Background gas regions + INTEGER :: BGGRegion ! Region number to be used for the species init END TYPE tInit TYPE tSurfFluxSubSideData diff --git a/tools/crosssection_database/create_xsec_db_lxcat.py b/tools/crosssection_database/create_xsec_db_lxcat.py index 0ab1e4ee8..94090b255 100755 --- a/tools/crosssection_database/create_xsec_db_lxcat.py +++ b/tools/crosssection_database/create_xsec_db_lxcat.py @@ -3,13 +3,16 @@ import lxcat_data_parser as ldp # Input database -database_input = "Database_Phelps.txt" +# database_input = "Database_Phelps.txt" +database_input = "Database_BiagiV71.txt" # Output database -database_output = "LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5" +# database_output = "LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5" +database_output = "XSec_Database_Xe_Plasma.h5" # Species list to be included in the output database -species_list = ["CO2","N2","He"] +species_list = ["Xe"] # Reference of the utilized database -reference = "Phelps database, www.lxcat.net, retrieved on February 18, 2020. LXCat is an open-access website with databases contributed by members of the scientific community." +# reference = "Phelps database, www.lxcat.net, retrieved on February 18, 2020. LXCat is an open-access website with databases contributed by members of the scientific community." +reference = "Biagi-v7.1 database, www.lxcat.net, retrieved on April 04, 2022. LXCat is an open-access website with databases contributed by members of the scientific community." # Output of the HDF5 database hdf = h5py.File(database_output, 'w') From 7c61b0334bb2728eb46527d2d6fde4353d316c6e Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 15 Apr 2022 01:54:10 +0200 Subject: [PATCH 2/8] Typo in code comments --- src/particles/dsmc/dsmc_bg_gas.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index 5a62770c4..12a969cdd 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -1139,7 +1139,7 @@ END SUBROUTINE BGGas_InitRegions !=================================================================================================================================== !> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during -!> BGGas_InitRegions). Loop over all elements, species and inits per species to set values for molecues and/or atoms. +!> BGGas_InitRegions). Loop over all elements, species and inits per species to set values for molecules and/or atoms. !=================================================================================================================================== SUBROUTINE BGGas_RegionsSetInternalTemp() ! MODULES From 731b5b53e7a99ad3a7a94d9718447f4c8f3d178a Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sat, 16 Apr 2022 20:43:20 +0200 Subject: [PATCH 3/8] Added calculation of the energy for relativistic speeds in MCC --- .../CHEM_RATES_XSec_Chem_Ar-e_100keV/DSMC.ini | 37 +++++++ .../Electronic-State-Database-Ar-ArIon1.h5 | Bin 0 -> 19648 bytes .../Figure_Verification.png | Bin 0 -> 37616 bytes .../LXCat_Database_Phelps_Ar-e_100keV.h5 | Bin 0 -> 12704 bytes .../PartAnalyze_058455278_ref.csv | 3 + .../PartAnalyze_081503436_ref.csv | 3 + .../PartAnalyze_098444801_ref.csv | 3 + .../PartAnalyze_112140422_ref.csv | 3 + .../PartAnalyze_118150400_ref.csv | 3 + .../PartAnalyze_123720322_ref.csv | 3 + .../PartAnalyze_133774900_ref.csv | 3 + .../PartAnalyze_142661135_ref.csv | 3 + .../PartAnalyze_150615531_ref.csv | 3 + .../PartAnalyze_157804944_ref.csv | 3 + .../PartAnalyze_164352619_ref.csv | 3 + .../analyze.ini | 4 + .../command_line.ini | 2 + .../cube_mesh.h5 | Bin 0 -> 7016 bytes .../get_values.py | 16 +++ .../CHEM_RATES_XSec_Chem_Ar-e_100keV/hopr.ini | 28 +++++ .../parameter.ini | 103 ++++++++++++++++++ .../readme.md | 6 + .../dsmc/dsmc_chemical_reactions.f90 | 14 ++- src/particles/dsmc/dsmc_collis_mode.f90 | 55 ++++------ src/particles/mcc/mcc.f90 | 47 +++++--- src/particles/mcc/mcc_xsec.f90 | 22 +++- 26 files changed, 311 insertions(+), 56 deletions(-) create mode 100755 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/DSMC.ini create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/Electronic-State-Database-Ar-ArIon1.h5 create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/Figure_Verification.png create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/LXCat_Database_Phelps_Ar-e_100keV.h5 create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_058455278_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_081503436_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_098444801_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_112140422_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_118150400_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_123720322_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_133774900_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_142661135_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_150615531_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_157804944_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/PartAnalyze_164352619_ref.csv create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/command_line.ini create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/cube_mesh.h5 create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/get_values.py create mode 100755 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/hopr.ini create mode 100755 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini create mode 100644 regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/readme.md diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/DSMC.ini b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/DSMC.ini new file mode 100755 index 000000000..f585e8eed --- /dev/null +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/DSMC.ini @@ -0,0 +1,37 @@ +! =============================================================================== ! +! Species1, Electron +! =============================================================================== ! +Part-Species1-SpeciesName = electron +Part-Species1-InteractionID = 4 +Part-Species1-Tref = 273 +Part-Species1-dref = 2E-15 +Part-Species1-omega = 0.24 +! =============================================================================== ! +! Species2, Argon +! =============================================================================== ! +Part-Species2-SpeciesName = Ar +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 273 +Part-Species2-dref = 4.05E-10 +Part-Species2-omega = 0.24 +Part-Species2-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species3, Argon ion +! =============================================================================== ! +Part-Species3-SpeciesName = ArIon1 +Part-Species3-InteractionID = 10 +Part-Species3-Tref = 273 +Part-Species3-dref = 4.05E-10 +Part-Species3-omega = 0.24 +Part-Species3-PreviousState = 2 +! =============================================================================== ! +! Reactions +! =============================================================================== ! +DSMC-NumOfReactions=1 +! ---------------------------------------------------- +! Electron impact +! ---------------------------------------------------- +! Dissociation: Ar + e --> ArIon1 + e + e +DSMC-Reaction1-ReactionModel = XSec +DSMC-Reaction1-Reactants = (/2,1,0/) +DSMC-Reaction1-Products = (/3,1,1,0/) \ No newline at end of file diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/Electronic-State-Database-Ar-ArIon1.h5 b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/Electronic-State-Database-Ar-ArIon1.h5 new file mode 100644 index 0000000000000000000000000000000000000000..36f38b99cb12b102de16d224b7ddb27e4672f71f GIT binary patch literal 19648 zcmeI(2~$x zemrGKY#*16)p(Zb4Qqe)4%5HO|Lr5-+RtIg?_(Uk& z?-|wb1C7i7?m~svqM?n(hE#acf0|HHZP>8CaXWUSsnwJ-|925RM$Y5^QxkaBnmp@Y zY7ISUrri2FS5<9jkl%QwsHrp-=Vcl;lx+B|-?;gAoyF(8{k3?m%5(Pjacb}=W#$ny zJ}4q6EFh?{Qd1c&~v8_h+h)rldtZNtD&+iQDI`0v= zt6WqY>kHv#V%*W3MQ93E`DEtrPeAiQkbkd7@pd!?r8i2mR_sA5r9 zq~ZA`XbJ+-bEe*|K=VPebWvaNL$pG!^KiMMZyUA7{wU;a^K#auZASAU{H1%|gq>&# z+BF+H`(`Fu1OgX7mqEp7A(w>Pp9O+jK+g~OrOtP?u8hi`a`=0pEko@J5MXd&>r zS32c?Mf0JsD6mZjP4&k9QSi1Za>T$6tizvOu*;C5h0wY>VN19vS|OjsZots3mLBf>xpL9ay(5JuTOrjTS3IrOo?AnG+GFUH^?r$i9u7~nb6Ag@mw??_%jj{)8@0@+{?tY=R(%&Cz%{$ zma@)Hnmd0!F$K|?`9D*av3YS-hU&+7GzAInE$ga@B`{*Uzr-g2a}j86Ze7J%2;1F4 z2figa1-IT0ee|B=CCkpW`$;T>KP>^%_Hj(7<=DPi6AQs(XpiV|Bo{$$@Aajuh2VS6 zYVuT0-qg`sKfc>YatZutg?!MC^`myJ!u|6hWZpN;qU~rQB;9&)c;HSn1zB1xoNI~s zP~kd9uy8kVt}@A!<0whW zlNe$l{Amf?hswIuBsXhf<@L*;OW-z=i-2058OvG-b#6}uCpmdjSEaW}FC)1G{gmh&A1+5z@I@lC)2cx8;hJp4i8sU)+}$#9Nyl55E9BMdAGSPun{`<9 zOt*}CXg<82JayHl`)CS^ds?SR9-&1LY;&gHBw{}JYir$o_ZV{_HsM`}XAJ(cL zGIJuP;Pc44qc?F}wSITK(K9SB1pSrsOeN3J3i-P}IcJW)KvPg_<`R+l63qvw-`m&X z73;8bk!9f=FA0r*zU(dL6s)c=6($f%U`YF+1)0PmD3EV`#aalRtE!Bikeq__;rYQ& zi6u~1`zE%Y*sO_#@I<|nf#y5hzo?0Yu&#aiPbLOF&9C^!22C5exQYL;QlZ-ywbQ;SjM1 zx?l4$QE!R$B~2`Zh@~?un~_}kdHi8M=)TWOI7o6KjC_)@+Cu}|Q$DW=-(=1t=7aZ; zSKd{`6ddW`uU<{8kavET`nbCm)>p{q{_v?irj6#qvaqB_3w6*UP#gbZ-6&l&1v(qe z`|ThWLfUHebB+QwZ?CacL#&4u!t<6%)8dIKn6N)fP^phOAIvT}u5D+)dPwZB-F6($ zi7dEJQEa|Qr@!4+VhaAW2m)o^%MOuT(!>-5}HS4cFd})Z~6>_6b$4>P!Li1ta%I=d#5i6fxv~T}7N-Togx9f*b7GilJ zyh(91dPuCCFOGUcXS8GU?t+ukeh@34=dZ|A>x?ny!^Gig(Oeta(5fCn(9AZ5V;7$`H*$%E zFeb0voA<(IW}M-vGRTYKU&x%=R=&KTMD=SK4WpPduQAq1;KaYlVgY#@~exP zJS`dK3b}Y$t6upf$z-|{T7g12*Mo`er+eFpghsqu#Q*= zt}6z95SruhDDUTIbK(yX^Fg0ls#DIfN_~pYdycc7Wf+B7u=Sg|R@*^s8p(z5rzz;4 zZ?L4l6e#C+I3r*c+wSIkB5w(>A_kyv^Es}C(IBNjqoM%WXbZdjgzmEWDe zc@Zl=k6W)l#t`$t@zUVS8rE3;U;U)ky!SGaQ_$3g7o^`;kX#6VngWkrakF%LVEYt& zcqHjzORRkV3#qtsnwSsKSIhj%h$*nvo@=7n6YGoM)a=xsro=*+*ijrCL9CEh##A4R zCKiH;*V3#!Vm`d{oGa?s3)|y^#cVwdGh*fSyK=|oH5|)a)p{gzY&JpK_e^iLepTYj zY2G%hH6EPa9cIfqdz+Kad}0b-B)=GQ>p!@(&68%A?AZDTOEgbg^2{)_l0rt3_?NoULC``g({fu-@yupm-)R1x$w)33>n4d~nLsJF4fv z)~6TW)luoo`eezu39cN&S&Q9jua{zHHjmR)zdo1a7WxKHEL_-}*C%hvJdQUXaUVguvbo1` z|9U@;yXoBYe9m#ArL<7u#+HA1_im>x9P@9b94hDdc2^6BKK0e&%%(3hF zynqE92ej)kcss|@xjsiKIga27%szAMZC?3FGLUWGRL!K+j^iKEr`^LiKAv><&U}t* zc1^f_nqw-(G~gS@d}+K#mqBd%r4Dg>#&R6`M&cjG@vmO8FGo2ZeX{4JN{(+0))J@; zX50IizPQeqW0kb=XKXn(86ADyo8#6_t2;(<+^kD_)C!JY<(OkfkMIi(3G|aO4(2k(!*6mx za8TH!a2Ydd+HVK>1qMaPnEuLjzpy}NkejC$PJXq9XhlC%-5^f4|5eMmjwx!kp=D-pf?Rj2;{|IV3D-tU2Q_-7jRapa0|_8zwj^ zYD%Pyg~gQMnUNs@k>+6`kx}Lo!lzsKMFuL{_KOM$5A&PMxP?VVg+xt@3Sz>?GoDe( z-uOiXM*h<)ub_b7u<*&@6K2X77r&6G;Gl>||7j5uWXwP(bH-_~8@rRh@DTIxhzS-} zmgZKyth-rTcv+9=X6bCMJkqF$kf7;7flPQ9<1i&6WHMvbL&hkNu&en$&Y60`uG@$w5@ocWFWO+)B~`S-UiMT=p$eO>$sea*)98R*b6<64dZng+?+e*GhQqXnSi zonhMF1M!YCQ^Pt7UC3Tz1&@@;Y z*2P#pKnq}8Wv=?KA7~!z8n$DrzNS`Ve+4jT!^AJmJF>2LzTP(21oP zw+6=^LDP^hOC$a3GF>trpQ@gh*ls}6@P!KcRQ(t&fLqrVEwK27=D|6?($;ml0#g4` zy#9P+12h9QUAmb#GH4pS-5x#uB|`IH(dLUic6LGwAlX0VuAK>*2gWOlx~H15UbkZV z{kxsfVtDmyfa}F+jy9`J3piMIGqW4I&0NM=LFXS$=HObi06^mN?)C;W1Lp%I0eyF% zd5}5slAw^7hDG|e{nFCd+^^U2Hi`pi0d%U;skoAf=D`l@f#R|wXaPK58Cy`2gQh{Q zWApJDu>kCJbuVY-V$K7#&z~zEoo4L?<0Cf|paoF)W!HSuLe_7M?8^@qvA%iFcFmq1 z%ou-CCx)1Yo<1Yb_Ug*!OHQ?_apHKy0X|jN19KX>*l%3z+7m5?apQ-zOeSVvRLz62 z3XZq6uRLjNhvjK7zuoD*H?gvO^_%=Yj%9lIxoV=ji+nVGjQ6DzNW z&CU*tiNag}#^R|nug*gAAT+{l=*b0W0pu;$&WK%vropOkvh}y6Xa+W0*bj+Xj;5j9 z{i0{zm1qGRu`Pdkj^iZ<>e@VAg*gw_2cABdx(3a_qL-@2+}5H6&}#BW^L4~D+!LPZ z9g&E+7@ogrYr)%q=7HO*_=f{H&VCa*#$qex3~Widqgk^P&4Vi@*By9=Mn)pE!;-mI*z8nqjXhqk1W=ww_Guc&S%|s>XPo; zhy~!K{x!7hEap5A8~NT@Q;23DfO43Bkyrqc{-?iey?{9l5w53&O zm?|CR?)(%j0N?i;3T$4m-aN0?c>5bP4Xr-Ss;1temG|$?%=U;+XdYBA%F;`%M$^zX zDRi9e7c>t<-R6YX)T704dd9PYPCwBM6r57)5<#rIpY2vD(D=pXo@uMcP9qk;{j8UM zB|QDc&y$9_H&I7CRM1keD-|=>h{fRTnJ0fr%!4iAAyYQ0VR-?p-+#dTC9xDn9tmha zSRHdQXdP^GgEa#stu5VsIQd%Nb%R(7z;q7tW--Zmu%`X4TPn@4JsMWd-~Pdrm;riH z);cp{Dddcom>eON!N!VhwyXs(%6e;0r($G>ronaFtX9r_&|;XRrg?LP16lwFeL=sEBbtG0 zT`F5xI->=k|N4|+vMZVgg2al*as64}3)wZjcp&TKcT+z08-fuEaESSNHQZ z@?i6)6`N;lAm+hm)p&OcFU+Md_57n2Ery}R;PK5%n>7u|=j%@_9)URx`{Zvo93)mg zPb@d^IZ4bwTpNG2tE1TR<5vfjzZ#2XAmqkL>y|!f8f?4!ooq|2d|pkAJrqOCfLr}f zQ%yfCFNS8DuD8-Ars2h~$Y$?2UiCxn7~qfP1#n?$>m05(UaEh8ijzAmytwG$cq~uD z*1#(j`4MO_tctB#erYC}0o6Pwty*FlG`>2!jf-J(t;FEGy~G00Sg05hH4AeZGHVX| z6%tD!W&C{cLt-(Qq>T0bL@a>V4pW}%&B6LoNd0NOHIY~hrTh1ePU3j;%I=3!h#Bal zmr}!8`T5m=TI*PBkAYiOOZ-@i;r`q^LOYU6p(Lf8;X2MX;if&wWe~h#{v)of%AQq^ zA-NQ`uXwX&95Dl9n5Zw)iIvw^k6P6k#4^zF=<#YVu_e4ed#IkZ0JeVp`Z9;)G>AqS z?LWz}>xBLvONklSHsY6B8L@J{CZ98MT!+U`!{N4P%hwW%;fu=NIj4vj@ORzTg`bG! z8ECb%e~L>Inuec7lBH8PPP)5%)$wG^mFGjB^3ErSr7$z1ce}g9VmNvwehF&^7Cip- za=?15FNQls-D+7&L9P6i%Q%wDpdf6R4{I@`RuA8}kmL*`wk+MmS_)gPYFVBnxfmwf z*8^(?jvd~AC?*B>Ps1~>1Bsi78IT#g{QQ_$`Fwl%_y><2Se^l|;b~Q##8RM>kIgC| z7K8ZWxdg5=@?A~dkeq?O;?CM@cVl}3a9DHv(9OeW8a79-(Z5T~z>qr^Tem)mx$=CF z%wA}D9?ig&f|^xBh^0^(YAKYoz-(}T_(vH znABD8&|!{4vX@u>Af`dLC}%}Iu@p2HA6eJ>BHO+!Vtf^ADHKQp`p_hofuZjDfm~m) z8P`Kfaw%+`dC7)rSaO1 zUBSQ876;Z0c)pIao=S2t%+@t^V@<=fg**F2k(~J#?+MxER(F*hf3$cA{IMf|!BK4$FpD6VuRcM%IGC z_p!Y4{oLt%K<)#y@_Kb|-EP)W=x}kj=S`A}A-Iof5o-p#qu$i@A(n#2e(y-G%P%h+vW4U_VCL=RSPZW{TdWSK#`dLflA7M7Zw*=u zSH5(d?M5txb_bUq9sdP$8Av|GuAacL$H~3tr4`#mz;BVG2XnbFjK{smT$f>$$OW62Ke*$ae{mg1{Oa#fL|Kd+h$Hp!s zxeVMozYJw<32yzqBrGO*SMW+)x{I|G?(fTAkw9|g{Qbk0K=qOJOy=a1JNmk?R-O;( zhboKOV*h2ZAn@Ze)|OCEbm@D58F6^*m&A`r9=O5?GF{j~W x^XoZhh#AOtJbPh;1Lk7jyM3tQdiL`Q=LnKZ!BCMK!CE0talRrty4t|uzW^f00#cMFAYen9^xi?5(j^3xDj;2YF98Gv=}M8_At9jzq<0kw(o5*Q zm(T=43k2?qzwetl_sp3y=bv-u{=q;pZ`o__wVw5?XYEb6wx$Xh2?GfT1R{I+LQw|< zx~2*OUDdgD6ZnR}E{p4o1G@$|ceg*gy zL=$}X^5g4=|JOf;-B$JT)Ea8nXs{WXPiF{lZK$^_dp|qfu7BeuQ@}|`{tnUs-VB+) z<*V7Dr4qoB&D)$(AbgQI+$6@4kmoOWfUj7?aN@4E^N_<@9TaW=KPLYhhyWIvN@ zDeKWTm&9qIXVwhzn?Tfx;*A8Et6BS-l}|ax?aHr4R_oP#wM;mh;pt%z*Ktacc2srT z$9?ni&b$pgOU`}nwY;r^>F~DS>jO3iaMC_^Ld|HG1RJD$g=u&|lrwXmC3>ymwWvTK zvS&jDnVeQ$l4v0MCtE;V1{~`og6Q}Y=jz)EtTzaxNY+lGDsv#@GwD3scgM6nR5@=| zszu4L_a%M3D3mrX)3xL5>xAAqa)gxDCW(WcCMquYav>Tyfcu&u5LpQsctu6J#_U2{ zg$x}>^B_!vlY0^lJt_z$epK-M@)dWw%Y)-IuDb6`uo~A>``R06Ir%hWh2Vepb`zb< zZSnOU^@UP<#ExPG84Zrf&8EY{_AsaGtiYW=9{!%oc7NU4d2I9gUP-joiM=Bj({(uaV-$O>=^W97|2=%B`oO%xbRwswY4}R_wSUfsQ{psV%8`m3u zs$CA7vcTL~TNU+9mQd(5_;CiCF}u8;*whLs{lk|*?$}Yx>&b-qaaJvr6uEbhT0q>M zwpQUZqa*(~L!3=7(`t6D!BZCTbJS&d{?1`j5|1%5JNtoQCMEFT&$~uOM!I>*WDQbY zx5-tRI}PgVku7#34bQlRT>@OBz2^hQ1)I^BwjKlpYzMsWM6vN>JWMrtMt@xAH^!9Z z=-a}mE}GhGwo0$Wz^t14&3DBr`_X{t;Gne+(0eg4z)uu`E~a-ZY>V|KQGxSbHv)O! zrraMQ&XHMzBDsM|!J+g}bv#K6thyiTeqP!dCa)bqDJoRq6HqmIktwo$FMFy_`M@|$ zR5w26w|);V14kW{^g3|i+iPJYs@9_#n25((aO2wgt<;m#k@0w;j%41S)JhS;C2*;q zt5>J{ztLL=i&(yn{U&$9*n}FCF{_%~OMeL|2q3QOxsR0aAPjG9O+~nwmn)N9XvB6! z5B^=@rS~EN-tb_;r7*kFT9v3O!*kYrGCk8lxZS_xOQ?PTKfCcz+=mS6!$NcdHvM8) zo};lZrLlvWAkJFn8Tzk%0at)xdUE~)7K%6iKLd@+7kz%^d9(}pARkszUC-_qH?+rX zqULal({G6DSjH8z&W)m7q1KrUJ$s{5u!pk@CmC-_h##Zv4)+4x=Qcg0UDc4f>u!a* zA$r)Mb7Pv9^Jl;I(E~vtr|;@Xe*C-xz@gm7lLGXqMD^K@^ASp9fi&@~SmTLqoazA) zPM>?nTJ+lX`e3+&0iR{CM8YYUD9LFwSvB1BgkApvn}a0_vxl2BQBmVz9lmv)Y%Qum&WXn zgV&h|kIq>^WnBMeNjQD5rO2va(zd5Fuu@pAlX68eN6z8?Zld0lX6X^EuZ-m7ii%D| zgo3a`V;b#sJ?%#r3*#C@oZp0SNmet1ps8Vu$qiJNa zObD(E36+2ze3**2)IPV{+30#Wtt(T2QOmmWBkeME1ik)kyt|lY{^Co^S=Jis&c{Q$ zjyQ}?YA?Q4FP9H5#^u%Zp_8!rjazpID5*G0(OvX}BGzX9%M8A8cspk>Vk>wKQ(MRHC+WD%wA|uo+q}SK&aI@12 ze|R)r0lP>Ij#H5+P`C#Sx zn<3{hmee7U>8_njzLdC>yK%G8jJ|K{ZK0uqj1A?G#TJHq+pe08KLv)q$H(Ep)a-$a zh-=rf4qb{$U#Z<(_m4lf1H0Bs~^pP2KaUsgX(v|_3A7Icbo`X8`h%w6Q7@v2K|GL z&mW``s@y#wfm@$U-3sMHHu1jwD25ZYK!~p_q_9bopbdstFZUOUKc@DL)lN@A+1hXa zIf^tDI>4M=IJDrBd}>W^m6~*dx1{$ARtqI3M&RF7$?-$}+h_Ce>>%;e7yT#ChnLcH>ZxXknxTd@8ncaYtbS&B zS=CTk`818u1z8{SnLXzXZx4DOJ&(Zq#Ri#ur>r_(Rh1IF``;Ni9KukPKe{ew5%fI1 z@$1vG^QuyzHTVab?{)z_Pm$n9k#~uVFatfLxXFk-SI*<`mEP@qbFL(zn6xAOr_yRj7X0aXlkWx&Wd9vY;S$a z!*!gps?b-dNpj>BGmDpWW0^`t*oD@pMwKupRh2CHgX({=cq=~7goerJ*t!;9%6Jyy z+5+K<c@#)Enmd#=gJB%?__z1#v~0|au<%|wIjQTAc_1lkw>+Ktk)!M zU$VzSZ2d8C`HrUG&~8SAWJZgAR%jyimnTJ?jTjYDWzm7fj)qF?ehU70x;E9vy>g{A zv3XP0L>8A^6e&tbe4r$;%sC4t#e3>!{C>4B2r~ZXcm7K;p)G;wFgKbZ zp-sql{OHI{W*5} zPdX}?@0T$=VXcA zhWs4teK>ifIU3be>KeUxVNhjEC<;T0-Y?AvKr_x+ksGF@LLP^f!WZn8g-twtnJ}8zyM^*;Fn)&{HgiP%s{@}%V?6oEA3f_vs%`(%MLJTgDF{6L*K0K4@t3R3jDbjPc6)9_* zR-f*a)7bQU!(F8XDy%)ZC_K>EVvU%uxb|X4q=WUMm~7~xs1EPkJLwzEex^gr=%4+x zV+Fg4z<39R~uaEFhFV$J_j7Gg=GWe)0_;B+d;lr_cW;3V{st+A|MsW zM$Hz(%yO*6BtbspWZ1jrvVh~9nj?*7nt3iBJljWvJwwi82?rOI{_QWPNmTRQPdE{8 zP(QI?w)p3Pi~&X=B=25jQ7?M@#i(J2{l4q5)aHWvo^c*+k1~i>eie`@diZxLi($n2 zOTe2dEjUW%i{JO#ou*q*sCa%_C)|IlX1RK|?=1;evw`HHb;&(rrK%}Y8`7!#^$JaP z!>(_tvQrZ5CmYAVPzNVJ)(xt5ax=YQ`X8_?c0ayoK}IIU1ZWDQA2$z1Om-a1;OO-p zcFg5d(}dYgc#Cr1D$Z7f%|<`JUZ8;I^ddhvI@6>Rb^q%1_t1hNS+)r8D>WOSJWH*C z>I18feDD%Qyje}b*Q`<0x6~$PGPn3-%;tp~`cE5TOsm=tAR`PrMc`FUI|ys!-7$R8 zE&|>$8CukA+b$s@6eSa@Z~K$wXlXdNgyD&gS%bB7mE#xn3iw57%h`eErY}Dyc_eku5=SLs8>Yp9MYNF-O_X2Y-W{9QF)H2efbb2XH zHv*-n+^v4Tg`T(i*(E$fk^5)#O)ammuoUTLT&%xL+-5kmrvd+|&pwca7RVo{uK#Xq z!WYQfT>Cl|HSiwBg1sfYuCHmVQZjUFhiF1_->qu<;+q|MJikdHGNn_j*a-?+|h9sjgb!Z|;{#9gZ@)%$F;(zD(w zs|y)B(_0V{!oB0^aDK`;ZBxB4g3ZY>Cgtde?!nJ*I3nu_$nzNy-L{48;W$=!fl$VQ zONpYHR9%H@&HchDr?W?ygl<%~?kcLF6B^hLA6L6cls$SXo$5W(zXr7)KIyY%AWR=& zA<$y{@rZ7kR(+vGmulzR48pGkL&$;Y@amY!7LexypB2C-Z~-fxYt!lAR4tJ%q?kmzQp!Mq0gs>1~d8yJHP-LUCZCF<~M>hy9wM z#r=OP;8jo$yzUJ)__6yOFfJ4U`13M;T zJ)=B5)Br13dvD}n^!9Fi@4KB6<47Wo*$OZ1I)7~T-#N+CeHDFmT*$qk zh@PYepL6e# z_s^LIjBY*UKESE-1eTk6?!+_6Fje21H!{=?WY&s%nPwq%?z=N*tVZ?uYA`69Y3I_z)HwJHGrMtH_pctv z#+C!MVcXrbyVZudZKl+Nfr(>(>)mSf(#)?75t0xSVufE+rL`304TZLn6kK`m(KCVj zLK~F-!F-bbCi|q!<`f~R{{>Uu%q)(XDLwo3@CqEKn$?RVpvk8Bp!?0oaJ_B8ryq+- zHm}6u)_gc$JsmF0d}B&sS~9G!;UuKcjDmI+MIdSXcLk4^IKgOrgC^t2ST%@XKDhqL zV5sR$JJq%vU%0njo8S$SqhRhKUflZXxtmo~r}btj6D^}YLN$&h#EI40seD_bgb+dG z%Tr`f`K&acDPSbMi2LBfZYnePXw)pKXpOEXu?P2b`qw9jfyax^!HSiNFSrDicvFv} zjtWMv?XEw*+r(6yoyzZ7i(&Q4C7D|qfw4c+6aLgx%P^W6W)N)+2Zuiv_C5|ndOoaU z)<9jXRGpr5XqCFUk*08FOiigf&1qE0exG9Y##%Rly|Q^m&)%e=bs>Xvj1Ioj>$n*r z$WX)9GYx{QgcYtrBhxmKpe3`5e z!a<^IYi5Qwec#;MQ}+>{_6Ky2+p2pnZmaumT!g4pF7+9|g;a4`o4M@Py`b+!{tcNP1&A{q5vmYq7)84v9>K( z)!+#`jF8grMr9&7Z9s6Lje6*i_+7NdiyrlEh`t(UcY=xaW$UR()8uj0N>FV+aqVO~ zw~r#Yx(c)y_Y9bo!Wz>g63Dkz6PH;`#N`@jT;7L;J$EuY)0!u{8xRJ1 z>$%mkTB8Wft*QXL`3dA6qDH}Qy-(`9%*$Uk9D6hwJv3!m4(n+^ymNwP zzvde^=KF`gZ_|$~PM;7DM2CI-2+h3FBhLbJ zu~f4p1Ua=-A%VTMa5pr6B%R58d_%qaVf|HUFjt~Axv;H zt@NI0AM8De9_t|cPOW_fv+<_h4W3zuCZz)5?N1M-b$-=z9xwDJl!tsPW-3ZAGUU+8 zxMDW~M^;mC<;+1+-v>-PA`j(B3o--@1XqmpnU3fUTxF{!st~ju3T$~-E@$gUQGQ`A zr%%Cw8_afDbXix}dkpi~;kY_4z%5XVAd&d$d)aoNLmlnKBFeQbE3iAzAdukEjjLrr z+T2{9AKAqU>=k3r#a>rQWzBMYjnL)H{T=dDmMN32?e4G>!Z)13?p3U5^?Q1e;cQD*7Y_io8VUB^oC*tlWkiAJnfjZXwSyh!DHK(W#SlIe06B-1Fr| zlUsBj>T4T|uwEAmtE7;4r^3ABIQDRU$e}oxFV01Md0hIaxZf0AXOq&pn>({~{~8UL?q!`Qg!F!85OMluRg3zPwPS4u=FFw5 zi=MemCLmM-BqJ1B*iprX-Eu9(V=?ueDND`dJoF`37Ckxl%Xn1xzBjbYah{aSwy(EYtQEyYRwzbvGScBDZcPMO>fBp#NQ6Mi%R{RCBZ!hvHs?*wfl=P|H?60+Gjm64-xNwNYBU5H==AnP zy@{Zn(?TU;3r@`e9+Q~sjUIMKk)>AdW6XRUDJAi6ln!VA+cX zVt7MtuM%X3>G1iE&DT#Kkph4Uh2k!H#VuKg&dh=cu5UDNr`us*A8#IDi)LJy5w9;s z?(lguSo~{4eGIWaV5xLbvV!uzjksBpfi#4P7RkEutp9{GuSn`!dw1Kagx zyuFqZLCP~dzyt?}oe?Uw(YreJ#W#k1aj!j2vXKJKOW}LCV+~BH=U}$Ha6&^`r2pQC zE_}xdah6?a=hkC-KJN`d5&Uq^a$p**yVp@={|ohABsgv$+x!9zX1ZeP~#bRG1g z3|pI>a)V2R?Q+)d&I~?&Z6hn1U&UKtKNpqLSca8%L1 zH!>L(Ovti4OSj{9Ok6h~_OSh8Ks0-6!wYZZ9T58!emLYulFHEB9KP3t;^$IN;`961 z+)_t}H@J{FpRn7oZ*)YB7_5)thY9BFm#FnWDKG#1Q8AUT_svzxtxLHcfHo3&;>+Lv z6x08Id{jiT?bUc)j!Fa&Q@kzCwa(m6dTlcrJQVe}GY2d&ZN~vCEArC;-WqDwhx(dX zcR7=*<46jMkk=iVC<*pSG>)up@pZQ~tE^l{5VpJ1IZH5yA?CpQ}gXwt~JKi9rWx%u*KQ0Z*TTXNaH*xS-% zN-FLLGvYUH+-Tl)yM9x8Al%-sC#kNX8NA?a(g~;#Bq_n*W}#)8zTwALO#lo2Df;F8 z(3VLFdlK1IjilAqrPAbI18>0W0-*y+tQIyic#HjRI=WS{&bY=PaiL{Rh;mBfo}w)` zV1D17grIxam5{D_@6~*s6dpRKEN}d@d!7Gk0>^FXn1oeaRMvCEUCTJH+^9Xx^j9*l zjZ;r%o$uYH6CRFLF-GHNGIlhyd0T&%9abWRe&fXG6J#}%XkHk;5^sv^8g7%;!2<2{ zGG*2-cwPk3bJi($<;@wMxFubL&K zQrNn}vvZ)o)mQ})b@Ds8A=TeZ%2>6($+;z9>?l=>8(gh_N8-^%q0VnQWwgNQ*ZHV3 z9$85ON5OQ%1ywpXfEGF*AovnFZ_GoO>MND#9JBh{B(-A6jRijCGz5q~UOri3n_XWzfUZ2&Xy`2+*|qmG@g*NxWQ(ml z`sKTCxpMeWbuk5Ug3;6cAVjmA_Px+&j2T!|#rcdIlw|Y@{V^uf1sT>CgEC+~F&~Fn zHS0t_Cgrjh-yS6D$VdvjyB;g_@_ULC+tG{1Y;3EypfdL8MeDsz`(~le*|z)mL(?%E zlIM(-i`}YjV*d0NBhriC-|bv?19dHf2dRH>riFk9ugiQjkOW$8C%07Pgx=nNDGuGw z_IW)qv%lf~caV1fPJ*cA$A^z`$$j(!#yYIM)c(?SD%ckk3e|iux-@;SC;e@~u3utI z#u3J=BQ`bbu6X=;(oH3c7g={Wqa*o;z47nr)IT7CPo|z)xZbi*bp;&85SUX*KG+`_ z4?+;R=?t<}zd9{8zp;a_esz_MewCy^*jPtOGK^g#u6V`G?|$^1_fh*_qtr0ZrMoxy zm}+a^NJjCwuV_sN`m=SPGJL=e0rT5+CT-DeHgNBG^3#`|`>!gZI`-I0*6Vi#0p@*+ zRG#?rRdm8+d+GMbPqmA+xn=H^Jl5E=ok`q1<++Zv#P&1Ttbeceg1Q!pt#|E<*&o{Q zg{P!46Yp-TNxdUUM%QUH^p%QGwD{5IUF@6r@~YkwMGUfbn2~F&$Kio>?~#h40Jc_S zUst@^5)`%)P7-4@V1Pa%nP>V;&8%#SC1`$w-QGK7Iif!;gjip z5suDgSF-jq-RxVXCugTsL@O^Al=qjF(A29bam&J4C`%cqF2M$I^}706C3F|im>!@8 z3<9Ck-1Y}@)eO6n;zy5~-J7z@o`h%V)PWO4!g3oCot!RGs27DIR{Xs`kqJ$8C*~gq zuEAzQ_#-p<3CGI~aEE|KLyA(H)e!iqq_p+*A)(CiZk5bIUj~(I*JQSwzs^TdKlFjw z%cTmw`}gLyR6UH ztT3DadT4Sz?pQ|BT({eu1F7gjuWIdt7S}|JtDp;XVZJ{nS)`in$<>veCH6Ph;_tw= zPp1QxEi#*3f#zy~;1Qz->js|cGcwhEe>~**_@3oq z=g~828t`F)QsNKpSJe99qcpSJW`7fwcm+atq$xDelroE_b%rX>rHKGp*MI!{CEnuV z-SSIgWr$m&b>`;~k8}{oS?W6LgZlu|<>YV~hDwMB-T4w>U087QM3$dL{(1MF|FOxr z5KVB+w68a$h@x-EGz_+Z4pDo!ZBe|8+d1)AiA+*qfb2r`X}${!Yq^nwK=-f76MKJB zNUE{@ZR+s+*)99)`FH8rJ*O1MJ6-k69HBQdd%roCX}PMUW}AZ zOTynwhS_bGe&x(8k3r(Abw{XgY-tMv*n9(cWOxr7-A0&4R_N<%9k1=-D$5rs@XyMd zmgzgX&lEKF+g|sN+*03&?IHExX1idE?QuY}#_KZ!L(?h{7>(SGym1XQR|w4GJ-z$M zNW_Id{Q~<3e&Qdi5Lido^uCwHYc{|<-r&1$EoVQG;a#Akln)U` zBTwxN?UH?RUOkXZS2=+=YRcH+y>GWuHW) z4Ut2DbaFZOKg)|6gw9YRD{YFVxI@S{<`JK@y%FtG zlR7_T!5WHzDdSnhJ6Qb+2U?tt928WjqJ1^9&V4nZ`J|%i>?-r?_b4F7Q)#v>;YiB( zdn%9B-W6Lk8`VP9xhT$at5mEvzFrV0q0w#8qs)XJfBvU|e21+-gmg-4N=fRHgXA_9 zw6Cg1RXN|}2~_c7Hm(>mc>?vQ;t>C%33>QbEm17efMy3(L*j{l>IqssVyweI&S>%(Gxx*iiw~FVQ3H@Ti4gcLf>%D^!6%ztw>U8FU?9 zyz>naZ#6f}t?d|Un7HkO)-r=5gDz_8YZ2-zp(|Y-8-6_>Y^Te89*(?|aJ6jkz zgx86Pu#?5xbNV+j$}Kgj%|SHdb-waRL!m*hUb-m}=m+Bi_J&W3JPmazUZ705=0N6K3x>s1tK{A2R0RVzgp18ad z$U{PBeMbj#yT*}Q2m7A7ZSQx+5S%|eKMg`&ZR-|PdGC00pB)jM$nI9yh=yXJb@|Pz z*0zPTN~ft|iB~~Ee;)%QxpfOS>Qy8=2;>{?YDRn3CgZ|}4CGaltn%aci&wK!=yEd- zwPd#>Y9?}}|KO_5$E3ETPLmi`FB0axL7=gq?2oS(SGfrubAz(9lTrIJ65mcuG&Oqx zbG+SV!Ufj$k(kOY90?}i9P)YI8*N~Qc5XaqUtK3G+-|=HdLVU6^)pS3>13WP1;MV8AwgN-3P_Eh_?o>&Zq z(b2c=j@(ZvDS@B&8{TLrQjMYgHymofUAzOCQgf(A&#T7tc%A$#0kQ^<2>O%s$V_5C z?1~?6@#uv}AcC|e_D$t%puft+DIBH8l2UM_c00kT^N}Z#8Wgk^p8fIOR&SntYSTVr zqyq;POcbSb?e|R|oy38^Hv?1YiZYtqYMD=FYiwkpi$Qo^hkSE-`xNVTHGnq$GsqVR zC*`zqhq4pJL%J%?nOP|u`DgB^wgmenI}37!ifRhszK=(bEW~DH*^+EV$A^*etB;5K zMqj$58*k|XoPPkoG5(R9uF1;nHKRxewC>!ELA~!_r64G4^iB!6r3%7-A1~*8 z;QMD8tlEl22~o74I;__Ct_Akx5`JwhGBoDak-$odM_6xm{!0osKtBS2HU4@o#@FV* z-4@BPypy}cY`dv@hq6hEB}QM$!l7qM=E-kosgQE*Eg;+>Y<=y>q?$Y<gsh6$tZug#eK~O0f97rN#9VE2MCxtB98)uY ze6`8+%zjx7JR|ezDu}WT7=a6nfYG90o~;@?l<)ZI&p_U&2!tJjfs;>i>n_iC-}$#BQ~ z#YTZ7T-wF^)?h8Qrssa}P8(gJ=@0x!Ewqe=-%q*v!9Aw>v4By`wM?8990Ih@zT)Zvp_I(%$ewtZ^EsEZS3KxvPQv z{_T4K`+Fc_lDU9tjlswXaV{ZbT;WAN3KXxjTS+^aB7HIXKp<8G!di!KaR4a4qD+`8i*k#L`owRVFd-P}qiO+q#iq7*l|k3K{2R-0R>1Ub zblXXAC=epHv!9|@%HDl^3IOpHVBB5FfC}$|wM23{%N%`YCzSY;+ug6={h}r8{{}Qz0tYr%enf3yRvo3aL#NwaoZg(q@Oo zao-vnQ%Sw+bK;8^?cd)pa5*8rr&c18sn$fCw#FKRouerCd`O`o@WM3 z+Fk~GvB-SDE%jg+oq*3OhIcM$;wlrmajBs&OTkTrGXW?zuEvz z;tzvSs0HQ$1aJ}oNV(7MB+O}Fa_23*$S%FUljbAh1|>oi8@ z#uaaFbZ~!0XDnp>8Cg%f#8hqIKrZ1=A`{+U-eb6H(&S*@L+8G={-xV}?zyGvd=DUS z@5{d|?|T@6#9&u#Ik7wkBFQ{yY4cIouAUcoWb?hKikeY19qh zP>H&a0#zLMMBj{5aex|QVT6-f6ZqI|{~ZqiI<&!ebDNr0M>lZM*MQXD#&PAhdNW6) z&5I^kA-{HKZdpF15As^UlfdMos{{KkN@A9kEBb{%4+a4uwM8)V1>+v^#tLz!Hiu>) zuTate*KtQe5exM8w!cChB?32+l^R?sI{-)cKBkXcnEa&)xe78D0NyIR*qAT9I%@D< zkT%)F#cK41dB}SX5?h-ln!a9R1}B+ZTsnV8*OEq)2d+~SpvYtQO94*F-Z-gPS-pKM z6)CD*%Cn6G(gqMK50LbN)56?C3T*;I{jnPjpYBC8Y>yf3S8H);e(}n^eaLYaM7aoz zxP$=3iAGMM6XyP*76a(;U2%a>S+Dtiy;@gE=n{iGV)PdSzP9@oI2&mTC%FRRCzdB3 z7y)XD=jln>JZe;zt0Tb|!vo}V)0FsCOn$WVGTmRk+O3=m>1YE&Ida+Glsn?k@-q); zE?R7<<5y-Hf|lvuVF=h=fk?~X0~C!ilW;(FR7^*KFx6G)#vnmw&MM>H8w-3Bcu zh#I}JTkcg=mKbGIYEdh+nISr@*GGNcdAI)LV=hDj> z_E&$bL33aP%!$#4|D-FLC}}A04ONqISp#;(!Kt0|3Ml3eaBf6PT4P4U=)mpwXnD@7 z-H#tQ`|a{WeIbwox>br7y3bi%Ushl4 ze!4^V1z&3|yj8!G{tx2-cXJbf4*wZeUXNcMToc~%*q9%l6L~BKFs|QH;|h~Ht<R91>q0;T zTd#!V@qx89)5(7}Y`BrQP_T)LVkl0&GE0** z0Q=9AIN90RyAN5_zI}wQ-m@7$u%)d5H>?b&CT?u%l0ACEnx2e1L`@_o?-_2=7LwZDRAWu=zh@fgeVxLPB(WtIpO{n&O}0^mfkr&RwP? zjg}*BW7g-sb>q!P`N_JSps{HaeAyp>vJU*l_u25E+46Z>`a?&fHen@hS=q;%uR{y| zYhOg9HNpD=0V&c;c0jY#OjOy20fR)}<8iYNUpD)(vMgh1;7mk2d1$7{RyF+BlQi0h zkkdOYWj^4FoA<4I;+x+~gXVg9Rt8gnM*Q~~olJSzn?$S>mfXh1!=}O;#^1iBinY`- zH#)a$(wE?`XN)$ABo3Xeo+4!&o2;t);K#hxr^kO(%UBGyBfWowgoOoRxci8=+o z1pT{dXHfUjHV2D)8l}3dTe@T*l_X9VE3(2SZ7NY*|4Mu$_XN4|46Kh%7XzpioLHgkBU;UK76Ttfre7XX!I^h+XlH~8~t z$7HWm2%!7l3?Af~GU$KVgEoR>&`aXLAwoG9R1EN7hGDhb^%kxEbTi?hp^fpw|Do4y zlvid$RCO@KQh#wA(^f6;=CvfT-0wm_4bt(m!W0U#Y>b3({hZ9wdKhrr=~=}qsY*O` zcf4E`;CJ)d^6Q)RwgxUs>y@PXHO7L0vl4!BPgCHTYNh5H8yvCi`!k}Imgv{fWNvFd zSC^e|&8nx3OT>hl!obm#`qa{964}?K9r4AI`P$)D9*JB5{=)#8b#iZKi&!#l$hA*& zQo9?Gsst7-mqLV3iY9zZh!4$EO5hh|wHeZuclOKZfxOuaYvEGZ;2u4)pIDzO;HGtu z>^(y?M{Zy-5mX5xFFh}V`7_UbPWG*oL3s!Gbj_Fu+}f~*-;^tVKGF2HDqYpPw``xF zczsom-iwHAcW7F52H#VgWR!`+YS>^-a&wX6b=D3JH9u|xIxSP&y__r=)8aJEj)bP} z_SExJIpMyyt&vd$KwlJq@99xyR(;8!VWb0jaj|o z4{*B(+;MYMy2X%oa?jaSIOxR!Ao1+bZWZ01X*+1G=b>#4AY5g(>7LDS2gDBFmfs*r zJz`K98*oVLa~;sgdFL{jywxlD^#B(FqAUm6h`I6}Nj6JJ3XheQhmqBgFzdCYgQiY+ z&6Y0HzoSQ=X%9^+Z>y>glRiM+W9htISOK_uKxuS4-Rnv~=Rom@W$E_r)4%B>1DVqY z-`(s@cER>9m(WhSo|Jjs4Juq@W^0y6WXwwk#@EsVrJ-D7nL1?uTY3{^QyMXzhOjK> z?STR`ghig%)9Y-4SsK@3T^^l%{ReXt$8XHj-QhyvE%(Lqwz)0zM+&rdV{1|k5<0$< z*ufRcRCFD5d8BN!*LN&~|2F!vlm|H4q@~)c7p+)sQLVMVfOJjkuBp$LKo2yYRrkHB~ z0zmrRSQL2Nt;PuK&Atg3+37oGocd&ZiJrF(urjD0&@7AI%$sl~RDVa8Y~*rz^}ViS zTov%RXo{QR<=6h_e~F-=&p`QQ{7Fg{k&wZ8B}l(3^ZVz}Vbh#-L!wmcpMC>`b}ymB z9j!`2w<=WI^|REJ^cEP937%6XycG?&Lg9Xfb&PaK&$|AgK5`YCQ(X|s3G|*W%e8Hp zdb5G^z7AFiPmiRDMEaj$vY@#iz!as0BvrqDhP6o-b9i=m3lx+6Iy7}p2knA&?IZjYQc6Q+-ADG z?h@<(DT>0;uldDRPM6_O&ZZ45;s%IFK|6SQv!!-m!P7Cc5ag_V$-JC8&GBZ&bYQ*- zy8+Mh5&nM{{x-EA`{XjXkJ$KTALkr!7o_s-k(mMX&Aur2xTJi`*4c=;&F;RE9fi@< zdz1VTHkYT8dL*D*6u`KCc~|^hP(4Dk6_4xCRs#wA?@E*#_r{6?>dcla)%u5|+hVp- z1Aj;BDk-x31vf|xba@m0EdN;tX|i?P)u7}D#&=E0kQK)Tkwe=uHOefBC*PFpt~^M6 z#Qu|~xKGP`j43F2<>XP74>)n)_`ukMaDF555Ks@Sz8Zi&qXAvW6@Yn6U7E_XYM|Hu zTNmigjQ|>*ExKBs*Eql0p(CgJj2JXq%Yyy@4Ws!A zCA%)0LD&rMn|#kFEcdU-2?3H-LWPVh2cUqsx`o>Vb=3nbb(eORRJ8Y4Cq(c)B?D?EJ^=*K}f2k zP4YKZ%?F}s%!lRMv!yS!pWi}vbSG`6e;)(7@05&$nime%O!bXDxm!~udDx2D(#s$M zx)k)jYTL~I899_`S`@2F zVSPF8S9!@)Wy!?hv0hW!E$K%GeMcojwW{DcN4)WlD~<&<|8ucn&C z{mNg6dd?ASae{rPA_V$b9#9zR%?**iQ?>x*MiJD%H*K0KsD95j^h+e_MQ zAY^fXHhI~*1|l~od8@j? zFp7;e67=9dZX9@m6!UMYre=cOiHzfNSQ-txx0E}4hc!!)eoL1aBo=ciYNX-0a2T}7 zgr{$v(&SdyC~nKtLHDWJW1!vgg(3^|;A)e3efjUs3q8r@nlV~aafYLTYe~D-B-)4HNhIJvk}}}!viLUFj8mRN|%DyPc_4#=I$5E zI1aPRskJJ%HCZ8&3>;En3bh&Nt*GA@V^3g?7Gkq0Wl+&}`TV9hB+kn`hW$zqcZ79u z2>=W>XZX^IzyVj|dO#Aj{lVf?WPWI6_og@tXe(5J6G4=MW0VP+Hn=dR$|aX;RoIjA zLDq1(&aZjJdMa5#7e@7NoeLrgJD?w)fJinBM?bq1a%7!O3;@&yIJ%p>E&%&pSA}p-!uRG?C5yI zK~?^M4%8S6 zfXKte(ZjX<8^go-Kdgbag2g@&1QeuSvHsd0E6|g;IBC_Hl$#glPtV$Btf6GfyTX^T*jx=3j6$Tn;F?Zve|w*00q2|+bQLi*lE&45Gc)y-IWE+#XXN}uRN^4HB{vTj{fb{r-K6~tt2}Qm zwxs=i(tLReOT8iw`LhkSikZtF-Z33)H&Y8~~`*sj)nl>EvT?Xm*0)%eVq?DDLBvF`nP%6~#Hgt(~{z z9Ms6bzy=6mGpOjaw{u4>baH(eTeFnltD9n%>3SdZwj(rK*NDY4AiuA9JXgY$7Hkgx z!$rd1RYIiSo%Oc)kL0VHr@+7XC|7SDS{5q)sj4xK`y`TO^nSn-po5paI2n|L#(Mlp zCHNDFQhJ;+;n2SQq|#Rk6*Z{Qh599qVSo9#V= zfdCP1_wy{K1m#jN2J3i4%XI&qEz3B#!|K$lbrsaWA1cF$`Fy#n0%*bX(PP53#-~&+ zcVYRp;mc?42EE>)k+)5H8qg^3)4Y>^cUwdXIcpWY-l(4uaP~JkLZSO@)7Ud`$h9CS zy}~YDH>-eU1j?|`Sg=e4TSJFLVzm$b>e|Dt0Xgl*Igl`8?3X_lxSo!nvzG#2tFaY7 zVgDJ`W_9HOo`1v$pZ`m&;IKOv$Wj$HlYq=UT^smP8may&x3>7ptp}bY?fnhX46{hY zw@JPiT36UKj#N)4l>Q&~-a4wvu5TAzCZZytfFi9(gCHp>DV+zWkHcUaxE>TDh-PxITW5b${MC7Ag;23;!Q z@U`Q1gzWfXp{%41!{mnQ*T)O!+Iuc%i=kJoDvh>F=LNc+Wdo>F zLa*}Kuz0mTC#X$X$yGdgP0%ia$>af6UU55dl&sb) zVGSSoZykZNY0>DN1Vzw2kMr5QCMey;qas4L@l5i5^^K3KQ1=y`v#jY}pHb_Os6kRQ z&9yQVbNFYy))t^C9&h})=DP<1CS@qxs4&l)y$1800q8pU^3HH}R5CLPfDRZYF8E)I zk8W%IHi~>f_ep~i$_+z9zJGaZQ0t8ct+W11Z;5hR?swUEMk9S1^(yl6@2w_5+i%!X z!rfgPWd!!5KA2$geNb{W353rer}*@Xg0dT~{VEy)g)E7OPNq|{S`3CPe4vGnW-7?t zhF@fMYoBbsqkxG#i2ppWK#x&!KC544b^htPSDwaTj@_W*d@umYo$dIXPV;?KQK+BgL)mAKK|nGbjDKCQxtNwl>+cp{q|1&`qRS(d z5V1J@yOKe(HB8O0XbTP5#kpm?(L?Nf0EWH>EHh}%Lq?CNY@bi7!kyQtTIbh|AWc+C z9Km`@mGk6ekr2%H9mmb|TB1?MGCcO=?@Q(Z^yYe;+&-(}Z?m5ja&d8NWH%_ikYuLL z{N{=U`^EA@I!0S(RQo$_F8^=f6uruy3g;VHkfnAx_GQ`oePXzAja;no5A!%};%g;Q zzE+Pcg!MBdc{8yz)&m$zh);EQF>%u*T2^Es06w~9rT&b^n{wwRc$=9!u zdjUVFNN=Ab?sE9sF7o>qt3v+N=0Hc_AR%Ccer5kMrb}RHq;|>5l)8IqNhm*(6%Mu3 zvxQ(zw%}E~(1q~<>WAmTrQ*Z#lEFC(_<5PPjaq>V;0DQA&^@<|515Lk0~twBYiP;= z-FgkBrm4!8BMbNbQMvh!3Rc7abiTKK!ipwxo+&3+`kqbh+q(Pv{wsRJnO~}UwsPii z)hUTXSth5!#%CzA7Quw+CEXpLiHa7db1z3f<8yN3bUM8%tD5NB7wmrC&&+<`cK6yG z3cMJT@d{8Ip;B-#h^Q|}rw=mf!XpYkMcK)*?rUMXUhw2U@ut)^#1zI`8w7 zB!EpJt2qbN_=AY~e1Fe;x;jQ^Ta5uPp{$jLtr}7ziIesYyEds)wzNcCZY~wZWoLL0q@ZroszNTaISFZh>k)2{LsLQo9JTn zwCa4f{=^2T2PyT=wQyc<5Zwl`|3QnZE36tXJafwblbvyUSEqxuh zjSN=0nA~0rRV#I29{JJ7Mf;FqR34hhj}0*dHRjp6ouEeX!V)d?Pb8~536)oYX#rUW zg-yuAJ}7L=-=N{nRLQ5HS5DiZBAM}QKJ?}iEJ(^;isy+BYcmKU=Eb*ZKT*`+oX}p;(5yluO4o-*BfmiYEmA^Bc3e9$Ys|cKDFBeE) zb8z5Bq3YPGXZ$ImCsc=VqIdRn2EWvL4#>Bm!kzown>ZV_lr-j}6)O6ux!R(2?LXg6 z&}Gp_%&EajJXuyZ3GTG%yNmce*@3}QSiI-mm0cSib%RO}^5-W}$#G+w$O?o%yO|KXOUK98(a`G;?qyq#YtN z?8%Uw`9j!|Z=yL6==S)WUAR`de+7E(Jrtq&Z=^$H1Q1623T?JU$!G5CM>5Nt;0W)5 zp8w!#DM`u36hi4e5rVV~0~Sh4{Klk|pLt3+*G`GrPIQuvaOC-h>#dUwwBPyb=pV&l zB9gIIj|eR_l9QW3r2f%7FvST9)`#L8ssL0GTEV^;S|o5042BQL6~8{CS%MeyZ$+3L z?4YgN7@dC{MwREhzV<`6?Iu#Z$Khunt zW%y~#WAC2q!kCu=_51;D2J##%T3lXX(fh-e`c)tL&lwNktK|wg@m%}&KI{K{ASt~F zgE?t|Vx(MWh!VifvYF^JAEcJ_f#|SKXHff;$!zG9>NZWVt*@N*wYi`%t6)WLl#T|| zKHZzZUwXx$C}()TMJoPzwOGDIW|yO!MhPH?3sWO6bD<`NLE|B490*E(nDi?Cv{G8p zC%%4J__@qebz!_!pGc)BcqIC9cJl3^Zy~nLgqUsb-Krdq`>_JdXA;tG!hB(%bKgJb z(sj51^2@6<7|=F`T@@JJHC?{=|3Df-i^>Mf2l>`hO${uu8RZj-j_!woJhA1}O8s6c&qo!PnGOBRGN(Ed@bnP7g(@EDdizN`8n+9S#4-Edp-K-jTTO(CBj-JyCOsw0>F{CD=m zpl#N^xLu^x9ml-j7u-CR?GUg5z-{%OQxB>JX_`my87LfFF9jqROp8||dm3ez)SzZ0 zszrB}1@g;@B1Kp*aCvsxD}9*?4MMa+<}$GY^)-EogWQ9tGh9U?;viHZ&$H*;+$;nS zVK{rN&P)A;pgORCwwSO%WQ$Jvfs?b+hyXpea=NIL3}C3{R?Y56nnb+lp*5ef0t}al zoE{wv)x42dHhh^{91RFuVm;ZE2nUeO(6$(SBQeAs4e*aXhc+?wO z1x;YA$Zhz@{G%BSbU|>NSTM!+bPDVf$fE*cgl-akNQx88OjlUmMzOb#5b>uLd&ol> zoAC+mp^lVSV9tzb%8TRn29XCvF(};hFV^7`*?2HPv+!~Hb z6W3wLNk3W=%NC6D2V3o9T9LWrV`?%uS%q?2eMM^1>4S|%bI%ru1j)L}VtP?tN<}jx z_h3aKM`(=e&jI9$6nd)yuDG2iVI~K3_yH5=b=nv#;0B)0&p7f*Y&vWFL*<0tu zR%Hap*|dddyzKttH2BDQ#L-#2$jSbT;4gT8XtvR6GRwby^S}fjx$-|^HuV=;PH|G* zNxWwP{<#DA7*MtZpn&FWlGj8W%WkFLyEj~B^GfFRU%>)Dz9k3h(*66a<^pE{arkj5 z>$&BoB2PlvvmfvC~KGc%aBfP|KmeFnCxT-VA zC>tJ_xUJsf(uNC0RtqgOg_=c>_T(E*GR+59FMJquj{b4RMdg<~0DPRU1sIs4{c%A# zYi8L4iN1=;j;)3pe7-SNbMK)pQ{PTh3kRqu!BPW2@8?kFJd&uop!g_3!?fRFcOWWL zc(2nP>6YC!o+$|H55{^!8}RePIMTU(d(^1bR&AQ)Ep-&*=pP1XYd?K*?-bysi^i7! zY?~zO0jkT_y=&Tibc1Z3eUE#lQHd?}8c?6{cO>I5ji(Vin^r<%1@pje?94vq zi5T*gO@|xz`M4l$KFVUu42P#H9d2P4v$-@rh$KZ7yFEjyi0HQpyd1%6kuiiU$(?wB zK;yo1;zIZeyQLa6CutSW^1AVkyf|{36}v@hE~*_&K_O>+uV(j{ZgAAhnV`83mg?wi z5+m0n5TK;)%s`(b7i2AvDwo~t6ig9*LR&{%|X=Xm~`M|@|ulYm*k@)Koy_($OTm#5oU>NVa{Z#>QKV2@W zi}%q^-R#y}8Q`I@*$n$2)c@KJ_YC$1!><=&fQrU92X`&u(z<|L3U+jyg}^{EAJKa8 zt)!e;E+kX8X}(L6vz?Xvo55t_W{!~+8mg;c>IREp^;2adzdEg9F%b1(&R7r|fO>PG ztoCGXNLS!D*90erJUl_=pA^eCoeQ3#4#5_1}=h*|OO zY4RPar6+f&cw*Vz!g+=4j_6*+sOkeS}{2H}ME4 zsJ1c#V2&ucd1>?!lB3FHM|1ZGP?Kb)eharDw-q+8c{19Gzha5 zyQs435YvRD>LB1No6AwB#p*d{S*|XYZ*0^3e+c2$PCGXP+aTB-4yZ>^NS!uPGI$XX z|4&wYP#(NqEcr0v3Qc|!N6id<=eflvCUyI|px)%#G?6t$`joE0Elf$bR2|OK91Deu zx6LY!=RyS_C=ir>@Ah{TPzug}+JB59i_z8B zArP0P6&nh9QD|vGwLRsx5@TKHC*@C=(5gCwLBIUxthV{;%!}eGKiLB!E{g)FF-Nw( ziWe)mkS{0GzBh9LLSe{>+V7VQ@_glw2F3w;6t1=a%`N`lL0zhLE7mtvZuorQ3;q0Q z4XCODu789m+mCHl_v-Z!44!Cwh7Dy_gd_SE-W4erb;Oz4#zxcaDU=A3SiU7Dcl)wK0RHes(PjFJYNmWx+t@3Kd zxq@1^{ThHxLp9!0n=}YX&@;i(?bf?(OK3qh8ZEV+3rd_3)bJ;unmK1*>mk3Nm5ys_ zLwD_AO*3HakIMURm?R4UWS?FiVWvzpn-55pzhi{#+%BI!s7|M#SI;s@AzkK&5&t&> z63E}FI+s_sp{%0xUku1JUl^Tei2>hX@Ig2XRwM%jpINHPbPh#()j_ z+Vns{@fqS|6Qk1jzlN=z$R&#cI^X z;lmtM6Sw^<@5vL!(ZwgK%FfLWJ(uko*o0Ly2Ibu7(MJ*cqUx2t!Ffit`Uoo!ngHUk zuonIK4;@E0{iJItko-MU7!a`uD8@v9A?@n_*bYxn3edZ__(!uUDeyeYJ zu;o-~OMg)5{@SQYR^DGL&u50p>bOJ>boNDVv~D5+Fk6wRFAr^^F9(Pv_bjSU=6<4? zP4!5_^@C;m8p_y?yN*Moz+}+QC2eV_wwB&v!eI+V*WTNV;HIW>Kw@ z(anH{G*Ifg^11wJgUQrvqW$WCO0ACG$9b-5Xqt6FFXR7YL*CYfD$}GggK8$Jb@&*F z&|s<2_d9G%-*1T$6;5BBH#!@%$;a)1Y}4VK*0V1!SCd2sIrr@9B^Yv z;ZQ1nJz;vv##2QqlFVLihtaq|8G1AlM?8W{9255Oed{8Y&PYreZM>^#Pv|&-IiRg7 zBEPZ^rA!?!#~#2$$T(!MNy`NZ^Iy-3t@O<(q}pXi{$5%;x=F>~kBoPRmuIPd81gml zey0h1lR2PgcohROoInAS1r#%Peq$^57)O_0r2v8B`ab95l2`}ssjav84f-9(;|kqL z(nI@36j+4@w(`*hO67C*5jIQuBD`01WlD{3wHp@-6{lnm?G>W3XM-IPup363kEwJW)=pd*lv$%WGLiL z#(MQT1e9$VspRy{zebnL-#mzuhNV8Z`Yu#4u}kzfKhPH~R2%p^0}5)vhC9R-q``zA z&@S8aTMyBC3g)1NDG%6}rTUSAn~l(H9Onhou&{FhrI9wSzH$Hs>5NMK)`~n;J|>&R zv^emb&xBg5ztTO208$%}i%Rv=1vmehNAZXlB4XG_P9-iaIHOMrX!dL!_y07ReEf#i)pkaCu7otID0YGz~I|M5zeEY(P&2Xtc8_> zAuET6RK7p-aL?Z%(;~jv0*~Yi0Y^CcoHz#_1p@Q-5E#;3-IGtWuWc7T^3w{)ChaMW z6-kmWgA;B(>W$Tb+Vi(m=9vtb)QVtp)DL=6t9?L}H^9NJaB_zUuV2;o`_<;A)C6!A z_PmR`K{}VQWl89!)Sj5Rlr}F!Mj@LRz;J+lD%h?6pTeN?YQAi?QrF5h>2wf?@?jv# zXEa=7u?hxOBJ^2Ou8%Wc`qF8pF}m#2vZzUN^}%YKcb-|w?UUEp3KvW^HuK7N=43#` z#Y!XWeM7x$@k^C^m_*d&DNt@`>9Qjird48YCIDnTTEJmx;TQoy9Qi(1Y#m||k#^W& zV{$n0pz10R$4yw?M$1woca%<9XK6pV>Vf7l7e5F?wM&h|Ri9NwDpc~B50{udNS9qN z5FhPBT*k%5vDrr7eUSK_H&m5A^$BpdSdef$rH<^*JUZjzuF|{pAArtt(^Agrml}0+ z{)nnlXO8kRy2|CKY-ES$c=ntKuKF|Y$)-HZoRe7`C6)N`3Hn^c)c*0b4oT)&`E?VTRs`9Zf8%3DPF zj-^udF{g=xsdJ}!>wKCzw@Az78a{q5GG~%l8OmY*@D*`b`=jYJWOaTER_T%vWw~u8 zNjgd!CMjZPaKF}7;X0?>!8af_fWsb$P5YGauQX_evdJBO|0T}6MfT{?Bhkof!OUlG zIxb@_5{k6^5Nzs$`ruL(^G0=Gj| z9}zbRdvKvz=gnp}Qdk+NyCeIomR-%UOqAE#sl@#zcs))Y4BPI;rGT5Zqr~|87AjO@zJCL!^zGu2#3wp4$uCH99Z-__%UqwXZ zc=m1)e%)u`vYCzs>WRRrZR8dy>UoYEx984ghubnd+dL=!RzhYTTk=7aYr@}99r8KB z#wQVHb}qvlx0D(3yGM!zlHX-yXYS{UwkX^9?e60ws$tjKQh{%NuUcz)X=?4-5k{4x zRb6(1KG6_oN67H3E$asGLjaAvT-TxWMr_IG2=1UyD~-4j76{Q5R>Vtm@ar>M^`-!| z7wL)N0)wZ*Os4CcrlmhM_$x&fQ+z#y?$_GtdIK4TRQd(C9}qZleVMrw-Og}@(q0Py zfg&KD0JwT92o(Ff=syo^Id2Wy9ZD>%^9pb6duvLU%#E6&+CIl2cAec(bk-uzBrC-v z!IRJOLujsM4JYwQ)1m+f&)jMQ5c?U-fZ0f1(eu~Q9gt}4=F!@vv@CC}wH}TYDPFac zEmq6@4i3LJI;wN!)G2-)X=%|IuGjcZF888g_z~ zxyCmMd{?^w0)`%dOJG)yLC)O&t15uqb`l4WWm;0V0DlrdwwQ$XaB@NITWb`xQ6L%1 z+Cfi76I))ciPTi^ebR)h57tTF1-L-s02ZPj0GQOd8L1l1>6s#aar}8Q3A^Q$Vaq9q zB0!Y>8zlNrZ<#hb>;-D{ldag9#NI&CifmGZXQ!Uz6YElnIQ>8dL;erRArt@k^lT8GUP?7&6-GR@%Tfjs-lZr1j zy4HODgHFIL^mgQX#O~O05Pw4XHn|uL$gcovk{!E+$9>_W=w#Vom;E}L9~9jHoCp-H z$@jnNH;mt;+gqBQfPaX%?e9;U*+pO6loE~3QV7buyl!27Mw}^Becf|=Gbt-1 z-l0FQiJSdw(ZRm!{diq<2=eaz*Tn1YpVR+!r^^2`Z>N17Hc4+9Ad%OnV6y~T)-b*M zfcXmOMyc{X^IElzvggt4DgYVt#NX#JJ@K24xr{(|7i0f5yu-f*1=_W=^;~|Dl+JpU zJmMCg2)rze539;VQ&j{`mnw3f&dWrN(neuG)i0N


e=It0}=6PRWL|M8HQk;PHPrT1Or14VGbJ?+A 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%0DJa*yi-S5 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 literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/get_values.py b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/get_values.py new file mode 100644 index 000000000..6344c36ee --- /dev/null +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/get_values.py @@ -0,0 +1,16 @@ +import pandas as pd +import os +import re + +def get_numbers_from_filename(filename): + return re.search(r'\d+', filename).group(0) + +directory = os.getcwd() + +varName_01 = '002-Reaction001' + +for filename in sorted(os.listdir(directory)): + if filename.startswith("PartAnalyze"): + temp = get_numbers_from_filename(filename) + df = pd.read_csv(filename) + print(temp, *df[varName_01].tail(1).values, sep=",") \ No newline at end of file diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/hopr.ini b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/hopr.ini new file mode 100755 index 000000000..e69b320c8 --- /dev/null +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/hopr.ini @@ -0,0 +1,28 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName =cube ! name of the project (used for filenames) +Debugvisu =F ! Write debug mesh to tecplot file +Logging =F ! Write log files +!=============================================================================== ! +! MESH +!=============================================================================== ! +Mode =1 ! 1 Cartesian 2 gambit file 3 CGNS +nZones =1 ! number of zones +Corner =(/0.,0.,0.,,4.64E-6,0.,0.,,4.64E-6,4.64E-6,0.,,0.,4.64E-6,0. ,,0.,0.,4.64E-6,,4.64E-6,0.,4.64E-6,,4.64E-6,4.64E-6,4.64E-6,,0.,4.64E-6,4.64E-6/) +nElems =(/1,1,1/) ! Anzahl der Elemente in jede Richtung +BCIndex =(/1,1,1,1,1,1/) ! Indices of UserDefinedBoundaries +elemtype =108 ! Elementform (108: Hexaeder) +useCurveds =F ! T if curved boundaries defined +SpaceQuandt =1. ! characteristic length of the mesh +ConformConnect=T +jacobianTolerance = 1E-27 +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +BoundaryName = BC_adiabat +BoundaryType = (/4,0,0,0/) +!=============================================================================== ! +! BASIS +!=============================================================================== ! +NVisu = 7 diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini new file mode 100755 index 000000000..85dd55073 --- /dev/null +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini @@ -0,0 +1,103 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +NVisu = 1 +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 1 +NAnalyze = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +ProjectName = H2_Plasma_Chemistry_Test +MeshFile = cube_mesh.h5 +Logging = F +useCurveds = F +TrackingMethod = triatracking +! =============================================================================== ! +! PART ANALYZE +! =============================================================================== ! +Part-AnalyzeStep = 100 +CalcReacRates = T +CalcRelaxProb = T +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +IterDisplayStep = 10 +ManualTimeStep = 2.0E-11 +tend = 2.0E-09 +Analyze_dt = 2.0E-6 ! Timestep of analyze outputs +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 3 +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 3 +Particles-RandomSeed2 = 4 +Particles-HaloEpsVelo = 3E5 +Particles-DSMC-CalcQualityFactors = F + +Particles-CollXSec-Database = LXCat_Database_Phelps_Ar-e_100keV.h5 +Particles-CollXSec-NullCollision = T + +Particles-DSMCElectronicDatabase = Electronic-State-Database-Ar-ArIon1.h5 + +Particles-DSMCReservoirSim = T +Particles-DSMCReservoirSimRate = T +Particles-DSMCReservoirStatistic = T + +Particles-DSMC-VibRelaxProb = 0. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber = 500000 +Part-nBounds = 1 +Part-Boundary1-SourceName = BC_adiabat +Part-Boundary1-Condition = reflective +Part-FIBGMdeltas = (/0.01,0.01,0.01/) +! =============================================================================== ! +! SPECIES +! =============================================================================== ! +Part-nSpecies=3 +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 1 +! =============================================================================== ! +! Species1 | e +! =============================================================================== ! +Part-Species1-MassIC = 9.11E-31 +Part-Species1-ChargeIC = -1.60217653E-19 + +Part-Species1-nInits = 1 +Part-Species1-Init1-velocityDistribution = constant +Part-Species1-Init1-SpaceIC = cell_local +Part-Species1-Init1-VeloIC = 58455278, 81503436, 98444801, 112140422, 118150400, 123720322, 133774900, 142661135, 150615531, 157804944, 164352619 +; Part-Species1-Init1-VeloIC = 118150400 +Part-Species1-Init1-PartDensity = 1E20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +! =============================================================================== ! +! Species2 - Argon +! =============================================================================== ! +Part-Species2-MassIC = 6.63400E-26 +Part-Species2-ChargeIC = 0 + +Part-Species2-nInits = 1 +Part-Species2-Init1-SpaceIC = background +Part-Species2-Init1-velocityDistribution = maxwell_lpn +Part-Species2-Init1-MWTemperatureIC = 300 +Part-Species2-Init1-PartDensity = 1.0E+22 +Part-Species2-Init1-VeloIC = 0 +Part-Species2-Init1-VeloVecIC = (/0.,0.,1./) +! =============================================================================== ! +! Species3 - ArgonIon +! =============================================================================== ! +Part-Species3-MassIC = 6.633908906174E-26 +Part-Species3-ChargeIC = 1.60217653E-19 \ No newline at end of file diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/readme.md b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/readme.md new file mode 100644 index 000000000..3f576c2db --- /dev/null +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/readme.md @@ -0,0 +1,6 @@ +# XSec Chemistry: Ar + e at relativistic electron velocities +* Ionization of Argon at high electron energies between 10 keV and 100 keV (-> ArIon1 + e + e) +* Test the reaction rates using cross-section based chemistry +* Actual number of reaction is counted (reactions are not performed) +* The collision energy is varied through the velocity (constant distribution) +* Figure_Verification.png shows the comparison with the theoretical rate \ No newline at end of file diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 9206c7ff1..4cd2cb0c8 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -352,6 +352,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) !=================================================================================================================================== ! MODULES USE MOD_Globals ,ONLY: abort,DOTPRODUCT,StringBeginsWith +USE MOD_Globals_Vars USE MOD_DSMC_Vars ,ONLY: Coll_pData, DSMC, CollInf, SpecDSMC, DSMCSumOfFormedParticles, ElectronicDistriPart USE MOD_DSMC_Vars ,ONLY: ChemReac, PartStateIntEn, PolyatomMolDSMC, VibQuantsPar, RadialWeighting, BGGas, ElecRelaxPart USE MOD_DSMC_Vars ,ONLY: newAmbiParts, iPartIndx_NodeNewAmbi, newElecRelaxParts, iPartIndx_NodeNewElecRelax @@ -389,7 +390,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) REAL :: Xi_elec(1:4), EZeroTempToExec(1:4) REAL, ALLOCATABLE :: XiVibPart(:,:) REAL :: Weight(1:4), SumWeightProd -REAL :: cRelaNew(3) ! relative velocity +REAL :: cRelaNew(3), GammaFac #ifdef CODE_ANALYZE REAL,PARAMETER :: RelMomTol=5e-9 ! Relative tolerance applied to conservation of momentum before/after reaction REAL,PARAMETER :: RelEneTol=2e-12 ! Relative tolerance applied to conservation of energy before/after reaction @@ -595,7 +596,16 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) #endif /* CODE_ANALYZE */ ! Add heat of formation to collision energy -Coll_pData(iPair)%Ec = 0.5 * MassRed *Coll_pData(iPair)%CRela2 + ChemReac%EForm(iReac)*SumWeightProd/REAL(NumProd) +IF(Coll_pData(iPair)%CRela2 .LT. RelativisticLimit) THEN + Coll_pData(iPair)%Ec = 0.5 * MassRed * Coll_pData(iPair)%CRela2 +ELSE + ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible + GammaFac = Coll_pData(iPair)%CRela2*c2_inv + GammaFac = 1./SQRT(1.-GammaFac) + Coll_pData(iPair)%Ec = (GammaFac-1.) * MassRed * c2 +END IF + +Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + ChemReac%EForm(iReac)*SumWeightProd/REAL(NumProd) IF(RadialWeighting%DoRadialWeighting.OR.usevMPF) THEN ! Weighting factor already included in the weights diff --git a/src/particles/dsmc/dsmc_collis_mode.f90 b/src/particles/dsmc/dsmc_collis_mode.f90 index 6467babba..2a111602d 100644 --- a/src/particles/dsmc/dsmc_collis_mode.f90 +++ b/src/particles/dsmc/dsmc_collis_mode.f90 @@ -1128,9 +1128,7 @@ SUBROUTINE DSMC_perform_collision(iPair, iElem, NodeVolume, NodePartNum) CASE(2) CALL DSMC_Relax_Col_Gimelshein(iPair) CASE DEFAULT - CALL Abort(& - __STAMP__& - ,'ERROR in DSMC_perform_collision: Wrong Selection Procedure:',SelectionProc) + CALL Abort(__STAMP__,'ERROR in DSMC_perform_collision: Wrong Selection Procedure:',SelectionProc) END SELECT CASE(3) ! chemical reactions RelaxToDo = .TRUE. @@ -1146,15 +1144,11 @@ SUBROUTINE DSMC_perform_collision(iPair, iElem, NodeVolume, NodePartNum) CASE(2) CALL DSMC_Relax_Col_Gimelshein(iPair) CASE DEFAULT - CALL Abort(& - __STAMP__& - ,'ERROR in DSMC_perform_collision: Wrong Selection Procedure:',SelectionProc) + CALL Abort(__STAMP__,'ERROR in DSMC_perform_collision: Wrong Selection Procedure:',SelectionProc) END SELECT END IF CASE DEFAULT - CALL Abort(& - __STAMP__& - ,'ERROR in DSMC_perform_collision: Wrong Collision Mode:',CollisMode) + CALL Abort(__STAMP__,'ERROR in DSMC_perform_collision: Wrong Collision Mode:',CollisMode) END SELECT END SUBROUTINE DSMC_perform_collision @@ -1226,6 +1220,7 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) NumDens = nPartNode / Volume * Species(1)%MacroParticleFactor END IF ! 1.) Calculate the reaction probabilities/test whether any QK reactions are possible +ReactionProbSum = 0. ALLOCATE(ReactionProbArray(ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths)) ReactionProbArray = 0. ! Reset the complete array (only populated for the specific collision case) @@ -1236,38 +1231,33 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) CALL QK_TestReaction(iPair,ReacTest,PerformReaction(iPath)) ELSE IF(TRIM(ChemReac%ReactModel(ReacTest)).EQ.'TCE') THEN CALL CalcReactionProb(iPair,ReacTest,ReactionProbArray(iPath),nPair,NumDens) + ReactionProbSum = ReactionProbSum + ReactionProbArray(iPath) END IF END DO -! TCE: Determine the sum of the reaction probabilities -ReactionProbSum = 0. -DO iPath = 1, ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths - ReacTest = ChemReac%CollCaseInfo(iCase)%ReactionIndex(iPath) - ! Skip QK-based and XSec-based reactions - IF(TRIM(ChemReac%ReactModel(ReacTest)).EQ.'TCE') ReactionProbSum = ReactionProbSum + ReactionProbArray(iPath) -END DO - ! 2.) Determine which TCE reaction is most likely to occur -ReactionProb = 0. -CALL RANDOM_NUMBER(iRan) -! Check if the reaction probability is greater than a random number -IF (ReactionProbSum.GT.iRan) THEN - ! Decide which reaction should occur +IF(ReactionProbSum.GT.0.) THEN + ReactionProb = 0. CALL RANDOM_NUMBER(iRan) - DO iPath = 1, ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths - ReacTest = ChemReac%CollCaseInfo(iCase)%ReactionIndex(iPath) - IF(TRIM(ChemReac%ReactModel(ReacTest)).EQ.'TCE') THEN - ReactionProb = ReactionProb + ReactionProbArray(iPath) - IF((ReactionProb/ReactionProbSum).GT.iRan) THEN - PerformReaction(iPath) = .TRUE. - EXIT + ! Check if the reaction probability is greater than a random number + IF (ReactionProbSum.GT.iRan) THEN + ! Decide which reaction should occur + CALL RANDOM_NUMBER(iRan) + DO iPath = 1, ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths + ReacTest = ChemReac%CollCaseInfo(iCase)%ReactionIndex(iPath) + IF(TRIM(ChemReac%ReactModel(ReacTest)).EQ.'TCE') THEN + ReactionProb = ReactionProb + ReactionProbArray(iPath) + IF((ReactionProb/ReactionProbSum).GT.iRan) THEN + PerformReaction(iPath) = .TRUE. + EXIT + END IF END IF - END IF - END DO + END DO + END IF END IF -ReactionProb = 0.; ReacCounter = 0 ! 3.) Decide which reaction to perform: TCE- and QK-based chemistry +ReactionProb = 0.; ReacCounter = 0 ReacCounter = COUNT(PerformReaction(:)) IF(ReacCounter.GT.0) THEN IF(ReacCounter.GT.1) CALL RANDOM_NUMBER(iRan) @@ -1294,7 +1284,6 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) END IF ! 4.) Cross-section based chemistry (XSec) - IF(ChemReac%CollCaseInfo(iCase)%HasXSecReaction) THEN IF(SpecXSec(iCase)%UseCollXSec) THEN ! Interpolate the reaction cross-section at the current collision energy diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index c96808115..270606864 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -47,6 +47,7 @@ MODULE MOD_MCC SUBROUTINE MCC(iElem) ! MODULES USE MOD_Globals +USE MOD_Globals_Vars ! VARIABLES USE MOD_DSMC_Vars ,ONLY: Coll_pData, CollInf, BGGas, CollisMode, ChemReac, PartStateIntEn, DSMC USE MOD_DSMC_Vars ,ONLY: SpecDSMC, DSMCSumOfFormedParticles, PolyatomMolDSMC, VibQuantsPar @@ -87,7 +88,7 @@ SUBROUTINE MCC(iElem) INTEGER, ALLOCATABLE, TARGET :: iPartIndx_Node(:), iPartIndx_NodeTotalAmbi(:) INTEGER, POINTER :: iPartIndx_NodeTotal(:) LOGICAL :: SplitInProgress, GetInternalEnergy -REAL :: CollCaseNum, CollProb, VeloBGGPart(1:3), CRela2, CollEnergy, SumVibCrossSection +REAL :: CollCaseNum, CollProb, VeloBGGPart(1:3), CRela2, CollEnergy, GammaFac, SumVibCrossSection REAL :: PartStateSplit(1:6), PartPosRefSplit(1:3), PartStateIntSplit(1:3), PartTimeStepSplit, PartMPFSplit INTEGER, ALLOCATABLE :: VibQuantsParSplit(:), PartIndexCase(:) REAL :: ProbNull @@ -366,14 +367,23 @@ SUBROUTINE MCC(iElem) IF(XSec_NullCollision) ProbNull = SpecXSec(iCase)%ProbNull END IF + ! Relative kinetic energy of the particle pair (real energy value per particle pair, no weighting/scaling factors) + IF(CRela2 .LT. RelativisticLimit) THEN + CollEnergy = 0.5 * CollInf%MassRed(iCase) * CRela2 + ELSE + ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible + GammaFac = CRela2*c2_inv + GammaFac = 1./SQRT(1.-GammaFac) + CollEnergy = (GammaFac-1.) * CollInf%MassRed(iCase) * c2 + END IF + IF(SpecXSec(iCase)%UseCollXSec) THEN ! ========================================================================================== ! XSec ! ========================================================================================== - ! Using the relative kinetic energy of the particle pair (real energy value per particle pair, no weighting/scaling factors) - CollEnergy = 0.5 * CollInf%MassRed(iCase) * CRela2 - ! Calculate the collision probability + ! Interpolate cross-section at the collision energy SpecXSec(iCase)%CrossSection = InterpolateCrossSection(iCase,CollEnergy) + ! Calculate the collision probability CollProb = (1. - EXP(-SQRT(CRela2) * SpecXSec(iCase)%CrossSection * BGGasNumDens * dt)) ! Correct the collision probability in the case of the second species being a background species as the number of pairs ! is either determined based on the null collision probability or on the species fraction @@ -399,7 +409,7 @@ SUBROUTINE MCC(iElem) END IF END IF ! If standard collision modelling is used, the reaction probability is added to the collision probability - CALL MCC_CalcReactionProb(iCase,bgSpec,CRela2,PartIndex,bggPartIndex,iElem) + CALL MCC_CalcReactionProb(iCase,bgSpec,CRela2,CollEnergy,PartIndex,bggPartIndex,iElem) CollProb = CollProb + SUM(ChemReac%CollCaseInfo(iCase)%ReactionProb(:)) ! If a collision occurs, re-use the energy values set in MCC_CalcReactionProb GetInternalEnergy = .FALSE. @@ -408,7 +418,6 @@ SUBROUTINE MCC(iElem) ! Vibrational excitation IF(SpecXSec(iCase)%UseVibXSec) THEN - CollEnergy = 0.5 * CollInf%MassRed(iCase) * CRela2 ! Calculate the total vibrational cross-section nVib = SIZE(SpecXSec(iCase)%VibMode) SumVibCrossSection = 0. @@ -425,7 +434,6 @@ SUBROUTINE MCC(iElem) ! Electronic excitation IF(SpecXSec(iCase)%UseElecXSec) THEN - CollEnergy = 0.5 * CollInf%MassRed(iCase) * CRela2 DO iLevel = 1, SpecXSec(iCase)%NumElecLevel IF(CollEnergy.GT.SpecXSec(iCase)%ElecLevel(iLevel)%Threshold) THEN ! Interpolate the electronic cross-section @@ -584,9 +592,9 @@ END SUBROUTINE MCC !=================================================================================================================================== -!> Calculate the collision probability if collision cross-section data is used (only with a background gas) +!> Calculate the reaction probability if collision cross-section data is used (only with a background gas from the MCC routine) !=================================================================================================================================== -SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,PartIndex,bggPartIndex,iElem) +SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,CollEnergy_in,PartIndex,bggPartIndex,iElem) ! MODULES USE MOD_DSMC_Vars ,ONLY: SpecDSMC, CollInf, BGGas, ChemReac, DSMC, PartStateIntEn USE MOD_MCC_Vars ,ONLY: SpecXSec @@ -597,7 +605,7 @@ SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,PartIndex,bggPartIndex,iElem ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- INTEGER,INTENT(IN) :: iCase,bgSpec,PartIndex,bggPartIndex,iElem -REAL,INTENT(IN) :: CRela2 +REAL,INTENT(IN) :: CRela2, CollEnergy_in !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: jSpec, iPath, ReacTest, EductReac(1:3), ProductReac(1:4), iProd @@ -636,18 +644,27 @@ SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,PartIndex,bggPartIndex,iElem EZeroPoint_Prod = EZeroPoint_Prod + SpecDSMC(ProductReac(iProd))%EZeroPoint END IF END DO - ! Relative translational energy and internal energy of the particle species - CollEnergy = 0.5 * CollInf%MassRed(iCase) * CRela2 + PartStateIntEn(1,PartIndex) + PartStateIntEn(2,PartIndex) + ! Adding the internal energy of particle species + CollEnergy = CollEnergy_in + PartStateIntEn(1,PartIndex) + PartStateIntEn(2,PartIndex) ! Internal energy of background species IF((SpecDSMC(jSpec)%InterID.EQ.2).OR.(SpecDSMC(jSpec)%InterID.EQ.20)) THEN - Temp_Vib = SpecDSMC(jSpec)%Init(1)%TVib - Temp_Rot = SpecDSMC(jSpec)%Init(1)%TRot + IF(BGGas%UseDistribution) THEN + Temp_Vib = BGGas%Distribution(bgSpec,8,iElem) + Temp_Rot = BGGas%Distribution(bgSpec,9,iElem) + ELSE + Temp_Vib = SpecDSMC(jSpec)%Init(1)%TVib + Temp_Rot = SpecDSMC(jSpec)%Init(1)%TRot + END IF PartStateIntEn(1,bggPartIndex) = CalcEVib_particle(jSpec,Temp_Vib,bggPartIndex) PartStateIntEn(2,bggPartIndex) = CalcERot_particle(jSpec,Temp_Rot) CollEnergy = CollEnergy + PartStateIntEn(1,bggPartIndex) + PartStateIntEn(2,bggPartIndex) END IF IF ((DSMC%ElectronicModel.GT.0).AND.(.NOT.SpecDSMC(jSpec)%FullyIonized)) THEN - Temp_Elec = SpecDSMC(jSpec)%Init(1)%TElec + IF(BGGas%UseDistribution) THEN + Temp_Elec = BGGas%Distribution(bgSpec,10,iElem) + ELSE + Temp_Elec = SpecDSMC(jSpec)%Init(1)%TElec + END IF PartStateIntEn(3,bggPartIndex) = CalcEElec_particle(jSpec,Temp_Elec,bggPartIndex) CollEnergy = CollEnergy + PartStateIntEn(3,PartIndex) + PartStateIntEn(3,bggPartIndex) END IF diff --git a/src/particles/mcc/mcc_xsec.f90 b/src/particles/mcc/mcc_xsec.f90 index 7d024a6ae..2747299a8 100644 --- a/src/particles/mcc/mcc_xsec.f90 +++ b/src/particles/mcc/mcc_xsec.f90 @@ -1354,10 +1354,11 @@ END SUBROUTINE ReadReacPhotonSpectrum SUBROUTINE XSec_CalcReactionProb(iPair,iCase,iElem,SpecNum1,SpecNum2,MacroParticleFactor,Volume) !=================================================================================================================================== -!> Calculate the collision probability if collision cross-section data is used. Can be utilized in combination with the regular -!> DSMC collision calculation probability. +!> Calculate the reaction probability if cross-section data is used. Utilized in combination with the regular DSMC collision +!> calculation probability (non-MCC routines). !=================================================================================================================================== ! MODULES +USE MOD_Globals_Vars USE MOD_DSMC_Vars ,ONLY: SpecDSMC, Coll_pData, CollInf, BGGas, ChemReac, RadialWeighting, DSMC, PartStateIntEn USE MOD_MCC_Vars ,ONLY: SpecXSec USE MOD_Particle_Vars ,ONLY: PartSpecies, Species, VarTimeStep, usevMPF @@ -1372,7 +1373,7 @@ SUBROUTINE XSec_CalcReactionProb(iPair,iCase,iElem,SpecNum1,SpecNum2,MacroPartic ! LOCAL VARIABLES INTEGER :: iPath, ReacTest, EductReac(1:3), ProductReac(1:4), ReactInx(1:2), nPair, iProd INTEGER :: NumWeightProd, targetSpec, bgSpec -REAL :: EZeroPoint_Prod, dtCell, Weight(1:4), ReducedMass, ReducedMassUnweighted, CollEnergy +REAL :: EZeroPoint_Prod, dtCell, Weight(1:4), ReducedMass, ReducedMassUnweighted, CollEnergy, GammaFac REAL :: EZeroPoint_Educt, SpecNumTarget, SpecNumSource, CrossSection !=================================================================================================================================== Weight = 0.; ReactInx = 0 @@ -1432,9 +1433,18 @@ SUBROUTINE XSec_CalcReactionProb(iPair,iCase,iElem,SpecNum1,SpecNum2,MacroPartic ELSE dtCell = dt END IF - Coll_pData(iPair)%Ec = 0.5 * ReducedMass * Coll_pData(iPair)%CRela2 & - + (PartStateIntEn(1,ReactInx(1)) + PartStateIntEn(2,ReactInx(1))) * Weight(1) & - + (PartStateIntEn(1,ReactInx(2)) + PartStateIntEn(2,ReactInx(2))) * Weight(2) + + IF(Coll_pData(iPair)%cRela2 .LT. RelativisticLimit) THEN + Coll_pData(iPair)%Ec = 0.5 * ReducedMass * Coll_pData(iPair)%cRela2 + ELSE + ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible + GammaFac = Coll_pData(iPair)%cRela2*c2_inv + GammaFac = 1./SQRT(1.-GammaFac) + Coll_pData(iPair)%Ec = (GammaFac-1.) * ReducedMass * c2 + END IF + + Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + (PartStateIntEn(1,ReactInx(1)) + PartStateIntEn(2,ReactInx(1))) * Weight(1) & + + (PartStateIntEn(1,ReactInx(2)) + PartStateIntEn(2,ReactInx(2))) * Weight(2) IF (DSMC%ElectronicModel.GT.0) THEN Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(3,ReactInx(1))*Weight(1) & + PartStateIntEn(3,ReactInx(2))*Weight(2) From 7c79c412830c9963880abd92bdf9aa507a801af3 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 21 Apr 2022 00:07:14 +0200 Subject: [PATCH 4/8] Removed relativistic energy calculation in chemical reactions for now --- .../dsmc/dsmc_chemical_reactions.f90 | 34 +++++++++++-------- src/particles/mcc/mcc.f90 | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 4cd2cb0c8..8896d7624 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -163,7 +163,7 @@ SUBROUTINE CalcReactionProb(iPair,iReac,ReactionProb,nPair,NumDens) !--------------------------------------------------------------------------------------------------------------------------------- ! Calculation of the collision energy !--------------------------------------------------------------------------------------------------------------------------------- -Coll_pData(iPair)%Ec = 0.5 * ReducedMass*Coll_pData(iPair)%CRela2 +Coll_pData(iPair)%Ec = 0.5 * ReducedMass*Coll_pData(iPair)%cRela2 DO iPart = 1, NINT(NumWeightEduct) Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(1,ReactInx(iPart))*Weight(iPart) & + PartStateIntEn(2,ReactInx(iPart))*Weight(iPart) @@ -391,6 +391,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) REAL, ALLOCATABLE :: XiVibPart(:,:) REAL :: Weight(1:4), SumWeightProd REAL :: cRelaNew(3), GammaFac +LOGICAL :: RelativisticTreatment #ifdef CODE_ANALYZE REAL,PARAMETER :: RelMomTol=5e-9 ! Relative tolerance applied to conservation of momentum before/after reaction REAL,PARAMETER :: RelEneTol=2e-12 ! Relative tolerance applied to conservation of energy before/after reaction @@ -596,14 +597,16 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) #endif /* CODE_ANALYZE */ ! Add heat of formation to collision energy -IF(Coll_pData(iPair)%CRela2 .LT. RelativisticLimit) THEN +! IF(Coll_pData(iPair)%CRela2 .LT. RelativisticLimit) THEN Coll_pData(iPair)%Ec = 0.5 * MassRed * Coll_pData(iPair)%CRela2 -ELSE - ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible - GammaFac = Coll_pData(iPair)%CRela2*c2_inv - GammaFac = 1./SQRT(1.-GammaFac) - Coll_pData(iPair)%Ec = (GammaFac-1.) * MassRed * c2 -END IF + ! RelativisticTreatment = .FALSE. +! ELSE +! ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible +! GammaFac = Coll_pData(iPair)%CRela2*c2_inv +! GammaFac = 1./SQRT(1.-GammaFac) +! Coll_pData(iPair)%Ec = (GammaFac-1.) * MassRed * c2 +! RelativisticTreatment = .TRUE. +! END IF Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + ChemReac%EForm(iReac)*SumWeightProd/REAL(NumProd) @@ -849,8 +852,10 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) ! FracMassCent's and reduced mass are calculated for the pseudo-molecule (1-3) and the pseudo-molecule (2-4) CALL CalcPseudoScatterVars_4Prod(ProductReac(1),ProductReac(3),ProductReac(2),ProductReac(4),FracMassCent1,FracMassCent2, & MassRed, Weight) + ! Distribute the remaining collision energy Coll_pData(iPair)%CRela2 = 2. * Coll_pData(iPair)%Ec / MassRed + cRelaNew(1:3) = PostCollVec(iPair) ! Calculate the energy value (only the relative part) to be distributed onto the products 1 and 3 ERel_React1_React3 = 0.5 * (Species(ProductReac(1))%MassIC* Weight(1) + Species(ProductReac(3))%MassIC * Weight(3)) * DOTPRODUCT(FracMassCent2*cRelaNew(1:3)) @@ -869,7 +874,9 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) FracMassCent2 = CollInf%FracMassCent(ProductReac(4),CollInf%Coll_Case(ProductReac(2),ProductReac(4))) MassRed = CollInf%MassRed(CollInf%Coll_Case(ProductReac(2),ProductReac(4))) END IF + Coll_pData(iPair)%CRela2 = 2. * ERel_React2_React4 / MassRed + ! Set the energy for the 2-4 pair cRelaNew(1:3) = PostCollVec(iPair) ! deltaV particle 2 @@ -906,7 +913,9 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) ! this is the non-reacting collision partner CALL CalcPseudoScatterVars(ProductReac(1),ProductReac(3),ProductReac(2),FracMassCent1,FracMassCent2,MassRed & , (/Weight(1),Weight(3),Weight(2)/)) - Coll_pData(iPair)%CRela2 = 2 * ERel_React1_React2 / MassRed + + Coll_pData(iPair)%cRela2 = 2 * ERel_React1_React2 / MassRed + cRelaNew(1:3) = PostCollVec(iPair) PartState(4:6,ReactInx(2)) = VeloCOM(1:3) - FracMassCent1*cRelaNew(1:3) #ifdef CODE_ANALYZE @@ -935,11 +944,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) MassRed = CollInf%MassRed(CollInf%Coll_Case(ProductReac(1),ProductReac(3))) END IF - ! IF(ProductReac(4).NE.0) THEN - ! Coll_pData(iPair)%cRela2 = DOTPRODUCT(VeloPseuMolec(1:3)) - ! ELSE - Coll_pData(iPair)%cRela2 = 2 * ERel_React1_React3 / MassRed - ! END IF + Coll_pData(iPair)%cRela2 = 2 * ERel_React1_React3 / MassRed cRelaNew(1:3) = PostCollVec(iPair) @@ -1007,6 +1012,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) END IF Coll_pData(iPair)%cRela2 = 2 * ERel_React1_React3 / MassRed + cRelaNew(1:3) = PostCollVec(iPair) !deltaV particle 1 diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index 270606864..3b007f8bd 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -596,7 +596,7 @@ END SUBROUTINE MCC !=================================================================================================================================== SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,CollEnergy_in,PartIndex,bggPartIndex,iElem) ! MODULES -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, CollInf, BGGas, ChemReac, DSMC, PartStateIntEn +USE MOD_DSMC_Vars ,ONLY: SpecDSMC, BGGas, ChemReac, DSMC, PartStateIntEn USE MOD_MCC_Vars ,ONLY: SpecXSec USE MOD_TimeDisc_Vars ,ONLY: dt USE MOD_part_tools ,ONLY: CalcERot_particle, CalcEVib_particle, CalcEElec_particle From 66844207e7ef90865d8bf83b06cf065d4f516584 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 21 Apr 2022 00:40:07 +0200 Subject: [PATCH 5/8] Added entry to the regression test table for NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV --- REGGIE.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/REGGIE.md b/REGGIE.md index 0ee261c48..0eb57c94c 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -215,6 +215,7 @@ Testing more complex DSMC routines with reservoir (heat bath) simulations: [Link | 13 | CHEM_RATES_QK_ionization-recomb_H | | QK rates for ionization and recombination: H + e <-> HIon + e + e | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_QK_ionization-recomb_H/readme.md) | | 14 | CHEM_RATES_QK_recomb_N2 | | QK rates for a recombination: N + N + M -> N2 + M | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | | 15 | CHEM_RATES_XSec_Chem_H2_Plasma | | Testing total collision rates through cross-section data (H2+e/H/HIon1/H2Ion1/H3Ion1) | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_H2_Plasma/readme.md) | +| 16 | CHEM_RATES_XSec_Chem_Ar-e_100keV | | Testing reaction rates through cross-section data (Ar+e: 1 reaction path, relativistic velocity) | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/readme.md) | | 16 | CHEM_RATES_XSec_Chem_H2-e | | Testing reaction rates through cross-section data (H2+e: 3 reaction paths, vib. relax.) | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_H2-e/readme.md) | | 17 | CHEM_RATES_XSec_Chem_H2-H2Ion1 | | Testing reaction rates through cross-section data (H2+H2Ion: 3 reaction paths) | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_H2-H2Ion1/readme.md) | | 18 | CHEM_RATES_XSec_Chem_H2-H3Ion1 | | Testing reaction rates through cross-section data (H2+H3Ion: 4 reaction paths) | nProcs=1 | | [Link](regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_H2-H3Ion1/readme.md) | @@ -273,16 +274,16 @@ Testing PIC compiled with Leapfrog integration (poisson,Leapfrog), solving Poiss | **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | | :-----: | :--------------------------------------------: | :-----------------: | :--------------------------------------------------------------------------------------: | :---------------: | :------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: | - | 1 | 2D_innerBC_dielectric_surface_charge | PICLAS_MPI = OFF,ON | Poisson-PIC,Dielectric surface charging,Cartesian geometry | nProcs=1,2,5,7,12 | DG_Source,DG_SourceExt,ElemData | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/2D_innerBC_dielectric_surface_charge/readme.md) | - | 2 | parallel_plates | - | Poisson-PIC,CalcCoupledPower,Part-LorentzType=non-relativistic (0), linear potential BC | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates/readme.md) | - | 3 | parallel_plates_AC | - | Poisson-PIC,CalcCoupledPower | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | - | 4 | parallel_plates_SEE_Dunaevsky2003 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Dunaevsky) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding e- energy on quartz (SiO2) | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Dunaevsky2003/readme.md) | - | 5 | parallel_plates_SEE-I | - | Poisson-PIC (no deposition), CalcCoupledPower, secondary electron emission (SEE-I model) | nProcs=1,2,5,10 | 13 % and 1 % of bombarding ions create secondary electrons | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | - | 6 | parallel_plates_SEE_Morozov2004 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Morozov) | nProcs=1,2,5,8,10 | 1 and 2 SEE from bombarding electrons on dielectric surfaces | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Morozov2004/parameter.ini) | - | 7 | parallel_plates_SEE_Phelps1999 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Phelps) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding Ar+ energy on copper | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Phelps1999/parameter.ini) | - | 8 | Dielectric_sphere_surface_charging | - | Poisson-PIC,Dielectric surface charging | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging/readme.md) | - | 9 | Dielectric_sphere_surface_charging_mortar | - | Poisson-PIC,Dielectric surface charging,mortars | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_mortar/readme.md) | - | 10 | Dielectric_sphere_surface_charging_PStateBound | - | Poisson-PIC,Dielectric surface charging,PartStateBoundary | nProcs=1,2 | PartStateBoundary,DSMCSurfState,DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_PStateBound/readme.md) | + | 1 | 2D_innerBC_dielectric_surface_charge | PICLAS_MPI = OFF,ON | Poisson-PIC,Dielectric surface charging,Cartesian geometry | nProcs=1,2,5,7,12 | DG_Source,DG_SourceExt,ElemData | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/2D_innerBC_dielectric_surface_charge/readme.md) | + | 2 | parallel_plates | - | Poisson-PIC,CalcCoupledPower,Part-LorentzType=non-relativistic (0), linear potential BC | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates/readme.md) | + | 3 | parallel_plates_AC | - | Poisson-PIC,CalcCoupledPower | nProcs=1 | PartAnalyzeLeapfrog_ref.csv | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | + | 4 | parallel_plates_SEE_Dunaevsky2003 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Dunaevsky) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding e- energy on quartz (SiO2) | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Dunaevsky2003/readme.md) | + | 5 | parallel_plates_SEE-I | - | Poisson-PIC (no deposition), CalcCoupledPower, secondary electron emission (SEE-I model) | nProcs=1,2,5,10 | 13 % and 1 % of bombarding ions create secondary electrons | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_AC/readme.md) | + | 6 | parallel_plates_SEE_Morozov2004 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Morozov) | nProcs=1,2,5,8,10 | 1 and 2 SEE from bombarding electrons on dielectric surfaces | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Morozov2004/parameter.ini) | + | 7 | parallel_plates_SEE_Phelps1999 | - | Poisson-PIC (no deposition), secondary electron emission (SEE-E model by Phelps) | nProcs=1,2,5,8,10 | different SEE yields depending on bombarding Ar+ energy on copper | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/parallel_plates_SEE_Phelps1999/parameter.ini) | + | 8 | Dielectric_sphere_surface_charging | - | Poisson-PIC,Dielectric surface charging | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging/readme.md) | + | 9 | Dielectric_sphere_surface_charging_mortar | - | Poisson-PIC,Dielectric surface charging,mortars | nProcs=1,2,3,7,12 | DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_mortar/readme.md) | + | 10 | Dielectric_sphere_surface_charging_PStateBound | - | Poisson-PIC,Dielectric surface charging,PartStateBoundary | nProcs=1,2 | PartStateBoundary,DSMCSurfState,DG_Source,DG_SourceExt,ElemData,DielectricGlobal | [Link](regressioncheck/NIG_PIC_poisson_Leapfrog/Dielectric_sphere_surface_charging_PStateBound/readme.md) | ### NIG_PIC_poisson_Boris-Leapfrog From 997d9d09ad2e64d66a1e2b06df8fb206665499d8 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 21 Apr 2022 00:44:21 +0200 Subject: [PATCH 6/8] Added info about remapping of BCs during init and reduced the output to a single line --- src/mesh/mesh_readin.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mesh/mesh_readin.f90 b/src/mesh/mesh_readin.f90 index 3c8491aaf..c5ae43307 100644 --- a/src/mesh/mesh_readin.f90 +++ b/src/mesh/mesh_readin.f90 @@ -136,6 +136,7 @@ SUBROUTINE ReadBCs() ChangedPeriodicBC=.FALSE. ! set true if BCs are changed from periodic to non-periodic #endif /*USE_HDG*/ IF(nUserBCs .GT. 0)THEN + SWRITE(Unit_StdOut,'(A)')' REMAPPING BOUNDARY CONDITIONS...' DO iBC=1,nBCs IF(BCMapping(iBC) .NE. 0)THEN ! non-periodic to periodic @@ -154,9 +155,8 @@ SUBROUTINE ReadBCs() END IF #endif /*USE_HDG*/ ! Output - SWRITE(Unit_StdOut,'(A,A)') ' | Boundary in HDF file found | ',TRIM(BCNames(iBC)) - SWRITE(Unit_StdOut,'(A,I8,I8)')' | was | ',BCType(1,iBC),BCType(3,iBC) - SWRITE(Unit_StdOut,'(A,I8,I8)')' | is set to | ',BoundaryType(BCMapping(iBC),1:2) + SWRITE(Unit_StdOut,'(A,A50,A,I4,I4,A,I4,I4)') ' | Boundary in HDF file found | ',TRIM(BCNames(iBC)), & + ' was ', BCType(1,iBC),BCType(3,iBC), ' is set to ',BoundaryType(BCMapping(iBC),1:2) BCType(1,iBC) = BoundaryType(BCMapping(iBC),BC_TYPE) BCType(3,iBC) = BoundaryType(BCMapping(iBC),BC_STATE) END IF From de5d84ceca93d3887678763abfe51163ad5ef0b7 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 21 Apr 2022 01:58:12 +0200 Subject: [PATCH 7/8] Test reaction cross-sections with VHS and MCC collision probability --- .../NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini | 2 +- .../CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini index 14afaef08..2ae807fc8 100644 --- a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/analyze.ini @@ -1,4 +1,4 @@ compare_data_file_name = PartAnalyze.csv -compare_data_file_reference = PartAnalyze_058455278_ref.csv,PartAnalyze_081503436_ref.csv,PartAnalyze_098444801_ref.csv,PartAnalyze_112140422_ref.csv,PartAnalyze_118150400_ref.csv,PartAnalyze_123720322_ref.csv,PartAnalyze_133774900_ref.csv,PartAnalyze_142661135_ref.csv,PartAnalyze_150615531_ref.csv,PartAnalyze_157804944_ref.csv,PartAnalyze_164352619_ref.csv +compare_data_file_reference = PartAnalyze_058455278_ref.csv,PartAnalyze_081503436_ref.csv,PartAnalyze_098444801_ref.csv,PartAnalyze_112140422_ref.csv,PartAnalyze_118150400_ref.csv,PartAnalyze_123720322_ref.csv,PartAnalyze_133774900_ref.csv,PartAnalyze_142661135_ref.csv,PartAnalyze_150615531_ref.csv,PartAnalyze_157804944_ref.csv,PartAnalyze_164352619_ref.csv,PartAnalyze_058455278_ref.csv,PartAnalyze_081503436_ref.csv,PartAnalyze_098444801_ref.csv,PartAnalyze_112140422_ref.csv,PartAnalyze_118150400_ref.csv,PartAnalyze_123720322_ref.csv,PartAnalyze_133774900_ref.csv,PartAnalyze_142661135_ref.csv,PartAnalyze_150615531_ref.csv,PartAnalyze_157804944_ref.csv,PartAnalyze_164352619_ref.csv compare_data_file_tolerance = 0.15 compare_data_file_tolerance_type = relative diff --git a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini index 85dd55073..318af407e 100755 --- a/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini +++ b/regressioncheck/NIG_Reservoir/CHEM_RATES_XSec_Chem_Ar-e_100keV/parameter.ini @@ -45,6 +45,7 @@ Particles-DSMC-CalcQualityFactors = F Particles-CollXSec-Database = LXCat_Database_Phelps_Ar-e_100keV.h5 Particles-CollXSec-NullCollision = T +Part-Species1-UseCollXSec = F,T Particles-DSMCElectronicDatabase = Electronic-State-Database-Ar-ArIon1.h5 From 5744da4da9aa7e70c547b21d550a667a5e040f3f Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 4 May 2022 01:40:47 +0200 Subject: [PATCH 8/8] Update of parameter for background gas distribution, increase of tolerance in weekly reservoir reggies --- .../3D_HET_Liu2010/parameter.ini | 2 +- .../BGG_MultiSpec_XSec_Elec/analyze.ini | 2 +- .../CHEM_EQUI_Titan_Chemistry/analyze.ini | 2 +- src/particles/dsmc/dsmc_chemical_reactions.f90 | 17 ++--------------- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/parameter.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/parameter.ini index 564e5868b..064cc1d36 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/parameter.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/3D_HET_Liu2010/parameter.ini @@ -210,7 +210,7 @@ Part-Species1-nInits = 1 Part-Species1-Init1-SpaceIC = background Part-Species1-Init1-velocityDistribution = maxwell_lpn -Part-Species1-Init1-DistributionSpeciesIndex = 1 !index of species in the DSMCState file +Part-Species1-Init1-BGG-Distribution-SpeciesIndex = 1 !index of species in the DSMCState file Particles-BGGas-UseDistribution = T Particles-MacroscopicRestart-Filename = neutral-DSMC/3D_HET_Liu2010_DSMCState_000.00100000000000000.h5 diff --git a/regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/analyze.ini b/regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/analyze.ini index 408584e6f..9b3a245eb 100644 --- a/regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/analyze.ini +++ b/regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/analyze.ini @@ -1,4 +1,4 @@ compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv compare_data_file_reference = Database_Velec_2651843_ref.csv,Database_Velec_2982275_ref.csv,Database_Velec_3232654_ref.csv,Database_Velec_4032796_ref.csv,Database_Velec_5926739_ref.csv,Database_Velec_8381675_ref.csv,Database_Velec_11853478_ref.csv -compare_data_file_tolerance = 0.20 +compare_data_file_tolerance = 0.30 compare_data_file_tolerance_type = relative diff --git a/regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/analyze.ini b/regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/analyze.ini index 3d4f8714e..cc247f507 100644 --- a/regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/analyze.ini +++ b/regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/analyze.ini @@ -3,4 +3,4 @@ compare_data_file_name = PartAnalyze.csv compare_data_file_reference = PartAnalyze_ref.csv, PartAnalyze_refElecMod4.csv compare_data_file_tolerance = 0.30 compare_data_file_tolerance_type = relative -compare_data_file_max_differences = 3 +compare_data_file_max_differences = 5 diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 8896d7624..c924ecded 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -390,8 +390,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) REAL :: Xi_elec(1:4), EZeroTempToExec(1:4) REAL, ALLOCATABLE :: XiVibPart(:,:) REAL :: Weight(1:4), SumWeightProd -REAL :: cRelaNew(3), GammaFac -LOGICAL :: RelativisticTreatment +REAL :: cRelaNew(3) #ifdef CODE_ANALYZE REAL,PARAMETER :: RelMomTol=5e-9 ! Relative tolerance applied to conservation of momentum before/after reaction REAL,PARAMETER :: RelEneTol=2e-12 ! Relative tolerance applied to conservation of energy before/after reaction @@ -596,19 +595,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) * PartState(4:6,ReactInx(3)) * Weight(3) #endif /* CODE_ANALYZE */ -! Add heat of formation to collision energy -! IF(Coll_pData(iPair)%CRela2 .LT. RelativisticLimit) THEN - Coll_pData(iPair)%Ec = 0.5 * MassRed * Coll_pData(iPair)%CRela2 - ! RelativisticTreatment = .FALSE. -! ELSE -! ! Relativistic treatment under the assumption that the velocity of the background species is zero or negligible -! GammaFac = Coll_pData(iPair)%CRela2*c2_inv -! GammaFac = 1./SQRT(1.-GammaFac) -! Coll_pData(iPair)%Ec = (GammaFac-1.) * MassRed * c2 -! RelativisticTreatment = .TRUE. -! END IF - -Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + ChemReac%EForm(iReac)*SumWeightProd/REAL(NumProd) +Coll_pData(iPair)%Ec = 0.5 * MassRed * Coll_pData(iPair)%CRela2 + ChemReac%EForm(iReac)*SumWeightProd/REAL(NumProd) IF(RadialWeighting%DoRadialWeighting.OR.usevMPF) THEN ! Weighting factor already included in the weights