From af40c82001ca947810f5a872f9290dab0b9f7316 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 15 Apr 2020 20:25:03 +0200 Subject: [PATCH 01/74] Remove Pmean, Pmax from collision cross-section references --- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv | 6 +++--- .../CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv | 6 +++--- .../NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini | 5 +++-- 25 files changed, 75 insertions(+), 74 deletions(-) diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv index db478de32..a4df6050d 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.07608701933152E-002, 1.99631471321523E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.98250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.40000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.00000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.06650000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.98250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.40000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.00000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.06650000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv index 8b30491e8..1a0654595 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.08518303280481E-002, 1.99303997321671E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.97200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.60000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.60000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.10400000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.97200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.60000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.60000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.10400000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv index 15e2ed9ac..9b4784da7 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.10789766161027E-002, 1.99727772401674E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.95550000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.30000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.24000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.17250000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.95550000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.30000000000000E+013, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.24000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.17250000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv index e9cf2b652..b7e76895a 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.11696753764342E-002, 1.95779431356645E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.92500000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.69500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.80000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.27450000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.92500000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.69500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.80000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.27450000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv index 7ec4fddff..fef641309 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.07469122164958E-002, 1.79423617191051E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.87350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.69500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.38450000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.87350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.69500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.38450000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv index 6a826b4b1..749c257b1 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.03857566042082E-002, 1.64705890066648E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.64650000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.79500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.07500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.33350000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.64650000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.79500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.07500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.33350000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv index 169be9e6d..8310c5ba1 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 9.72597520304951E-003, 1.41013274737256E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.40600000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.82500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.65000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.25350000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.40600000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.82500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.65000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.25350000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv index 3702a8aee..c773050f5 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 8.44338068208893E-003, 1.04681512778420E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.02050000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.56500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.51000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.12800000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.02050000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.56500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.51000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.12800000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv index 3ea7ed7a2..ea88a6e2d 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 8.05126073352481E-003, 8.36773689650627E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.44500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.75500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.26150000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.44500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.75500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.26150000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv index ac58ddcff..d421fd755 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 8.43686373375132E-003, 1.17899474147141E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.07500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.17950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.96000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.58300000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.07500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.17950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.96000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.58300000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv index eaf294d8c..305b3d5ca 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 9.75639774402566E-003, 1.47547497129306E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.83500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.48350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.10850000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.83500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.48350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.41500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.10850000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv index 7dd2d1f3d..eccdd16da 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 1.26898121333410E-002, 2.10906293144478E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.25500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.09700000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.06200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.88450000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.25500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.09700000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.06200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.88450000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv index 9f507d882..4f94f8e0a 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.25541958352412E-002, 4.51845368000097E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.05500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.49350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.22250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.62150000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.05500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.49350000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.22250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.62150000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv index 056395ff6..2bb315b7f 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.79591035634708E-002, 5.47109955961135E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.18600000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.55750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.31750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.06100000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.18600000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.55750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.31750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.06100000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv index 388b17fc0..9b9d7ef7b 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.73560602248208E-002, 4.32463965854714E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.82500000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.39150000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.39150000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.60800000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.82500000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.39150000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.39150000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.60800000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv index 7a2472e4b..794ac1dfb 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 3.01379960380483E-002, 3.23319435982538E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.06550000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.15700000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.48100000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.70350000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.06550000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.15700000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.48100000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.70350000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv index 08ebbdec5..7f9ce746b 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 3.13800207809455E-002, 3.64739302580490E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.70000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.80900000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.63850000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.14750000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.70000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.80900000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.63850000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.14750000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv index e7753c775..9690e33ea 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.80141694578226E-002, 2.97420587405981E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.87650000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.97750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.72950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.58350000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.87650000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.97750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.72950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.58350000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv index b5cb98401..6b1342173 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 3.29788397628482E-002, 3.56871034434555E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.51250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.34850000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.78200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.64300000000000E+015 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.51250000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 3.34850000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.78200000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.64300000000000E+015 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv index 414f45348..5a8089fe8 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 4.56249308372915E-002, 5.21899860731899E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.19300000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.36000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.71750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.12705000000000E+016 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.19300000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.36000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.71750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.12705000000000E+016 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv index 2278d726e..610f77d8e 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 5.81505555120750E-002, 7.09415457944889E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.15750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.10400000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.50400000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.37655000000000E+016 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 7.15750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.10400000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.50400000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.37655000000000E+016 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv index da9bb8cc0..c859d75df 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 6.97223443695220E-002, 9.06469793263111E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.01950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.41000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.20900000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.56385000000000E+016 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.01950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 5.41000000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.20900000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.56385000000000E+016 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv index 35ed88989..5fade6ebe 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 8.00589130803846E-002, 1.00314806954781E-001, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.96800000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.95300000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.13500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.78345000000000E+016 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.96800000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.95300000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.13500000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.78345000000000E+016 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv index 35225220c..9b58553e8 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv @@ -1,3 +1,3 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-CollRate001+001 ,006-CollRate001+002 ,007-CollRate001+003 ,008-CollRate001+004 ,009-CollRate001+005 ,010-CollRate001+006 ,011-CollRate001+007 ,012-CollRate002+002 ,013-CollRate002+003 ,014-CollRate002+004 ,015-CollRate002+005 ,016-CollRate002+006 ,017-CollRate002+007 ,018-CollRate003+003 ,019-CollRate003+004 ,020-CollRate003+005 ,021-CollRate003+006 ,022-CollRate003+007 ,023-CollRate004+004 ,024-CollRate004+005 ,025-CollRate004+006 ,026-CollRate004+007 ,027-CollRate005+005 ,028-CollRate005+006 ,029-CollRate005+007 ,030-CollRate006+006 ,031-CollRate006+007 ,032-CollRate007+007 ,033-TotalCollRate - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 7.36942815077172E-002, 9.05391002983365E-002, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.08950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.64750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.82000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.66190000000000E+016 +001-TIME,002-CollRate001+001 ,003-CollRate001+002 ,004-CollRate001+003 ,005-CollRate001+004 ,006-CollRate001+005 ,007-CollRate001+006 ,008-CollRate001+007 ,009-CollRate002+002 ,010-CollRate002+003 ,011-CollRate002+004 ,012-CollRate002+005 ,013-CollRate002+006 ,014-CollRate002+007 ,015-CollRate003+003 ,016-CollRate003+004 ,017-CollRate003+005 ,018-CollRate003+006 ,019-CollRate003+007 ,020-CollRate004+004 ,021-CollRate004+005 ,022-CollRate004+006 ,023-CollRate004+007 ,024-CollRate005+005 ,025-CollRate005+006 ,026-CollRate005+007 ,027-CollRate006+006 ,028-CollRate006+007 ,029-CollRate007+007 ,030-TotalCollRate + 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 + 1.00000000000000E-012, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 9.08950000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 6.64750000000000E+015, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 8.82000000000000E+014, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 1.66190000000000E+016 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini index 4d807e34e..79d305b38 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini @@ -48,9 +48,10 @@ Particles-RandomSeed1=1 Particles-RandomSeed2=2 Particles-ModelForVibrationEnergy=0 !(0:SHO, 1:TSHO) Particles-HaloEpsVelo=5000 -Particles-DSMC-CalcQualityFactors=T +Particles-DSMC-CalcQualityFactors = F -Particles-CollXSec-Database = LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 +Particles-CollXSec-Database = LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 +Particles-CollXSec-NullCollision = F Particles-DSMC-ElectronicModel = F Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_full_Data.h5 From 9802d3b168814af1e28c32d77e8d35439666f397 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 15 Apr 2020 23:15:38 +0200 Subject: [PATCH 02/74] Added flag for switching on null collision method for MCC --- .../CHEM_MCC_XSec_MultiSpec/analyze.ini | 6 +- .../CHEM_MCC_XSec_MultiSpec/get_values.py | 2 +- .../CHEM_MCC_XSec_MultiSpec/parameter.ini | 2 +- src/particles/dsmc/dsmc_bg_gas.f90 | 6 +- src/particles/dsmc/dsmc_collision_prob.f90 | 54 +++++++---- src/particles/dsmc/dsmc_init.f90 | 4 + src/particles/dsmc/dsmc_species_xsec.f90 | 95 +++++-------------- src/particles/dsmc/dsmc_vars.f90 | 6 +- 8 files changed, 72 insertions(+), 103 deletions(-) diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini index 8b44907e8..70864db80 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini @@ -1,4 +1,4 @@ -compare_data_file_name = PartAnalyze.csv -compare_data_file_reference = Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv -compare_data_file_tolerance = 0.10 +compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv +compare_data_file_reference = Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv,Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv +compare_data_file_tolerance = 0.15 compare_data_file_tolerance_type = relative \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py index ce0f9312b..d1f3bb390 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py @@ -11,4 +11,4 @@ def get_numbers_from_filename(filename): if filename.startswith("Database"): temp = get_numbers_from_filename(filename) df = pd.read_csv(filename) - print(temp, *df['002-Pmean '].tail(1).values, *df['008-CollRate001+004 '].tail(1).values,*df['014-CollRate002+004 '].tail(1).values,*df['019-CollRate003+004 '].tail(1).values, sep=",") \ No newline at end of file + print(temp,*df['005-CollRate001+004 '].tail(1).values,*df['011-CollRate002+004 '].tail(1).values,*df['016-CollRate003+004 '].tail(1).values, sep=",") \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini index 79d305b38..02a63e285 100644 --- a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini +++ b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini @@ -51,7 +51,7 @@ Particles-HaloEpsVelo=5000 Particles-DSMC-CalcQualityFactors = F Particles-CollXSec-Database = LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 -Particles-CollXSec-NullCollision = F +Particles-CollXSec-NullCollision = F,T Particles-DSMC-ElectronicModel = F Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_full_Data.h5 diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index ff979711c..ccf6a5b85 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -367,7 +367,7 @@ SUBROUTINE MCC_pairing_bggas(iElem) USE MOD_Globals USE MOD_DSMC_Analyze ,ONLY: CalcGammaVib USE MOD_DSMC_Vars ,ONLY: Coll_pData, CollInf, BGGas, CollisMode, ChemReac, PartStateIntEn, DSMC, SpecXSec -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, MCC_TotalPairNum, DSMCSumOfFormedParticles +USE MOD_DSMC_Vars ,ONLY: SpecDSMC, MCC_TotalPairNum, DSMCSumOfFormedParticles, XSec_NullCollision USE MOD_Particle_Vars ,ONLY: PEM, PDM, PartSpecies, nSpecies, PartState, Species, usevMPF, PartMPF, Species, PartPosRef USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_DSMC_Init ,ONLY: DSMC_SetInternalEnr_LauxVFD @@ -426,7 +426,7 @@ SUBROUTINE MCC_pairing_bggas(iElem) DO jSpec = 1, nSpecies IF(BGGas%BackgroundSpecies(jSpec)) THEN ! Loop over all background species bgSpec = BGGas%MapSpecToBGSpec(jSpec) - IF(SpecDSMC(iSpec)%UseCollXSec) THEN + IF(SpecDSMC(iSpec)%UseCollXSec.AND.XSec_NullCollision) THEN ! Collision cross-section: The maximum number of pairs to check is collision pair specific and depends on the null collision probability SpecPairNumReal = CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iSpec,jSpec)%ProbNull SpecPairNumTemp = INT(CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iSpec,jSpec)%ProbNull) @@ -468,7 +468,7 @@ SUBROUTINE MCC_pairing_bggas(iElem) IF(BGGas%BackgroundSpecies(jSpec)) THEN DO iLoop = 1, SpecPairNum(iSpec,jSpec) ! Loop over all the number of pairs required for this species pairing ! Getting the index of the simulation particle - IF(SpecDSMC(iSpec)%UseCollXSec) THEN + IF(SpecDSMC(iSpec)%UseCollXSec.AND.XSec_NullCollision) THEN ! MCC: Choosing random particles from the available number of particles IF(SpecPartNum(iSpec).GT.0) THEN CALL RANDOM_NUMBER(iRan) diff --git a/src/particles/dsmc/dsmc_collision_prob.f90 b/src/particles/dsmc/dsmc_collision_prob.f90 index c5ebe7cbe..6cd82529a 100644 --- a/src/particles/dsmc/dsmc_collision_prob.f90 +++ b/src/particles/dsmc/dsmc_collision_prob.f90 @@ -41,7 +41,8 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) !=================================================================================================================================== ! MODULES USE MOD_Globals - USE MOD_DSMC_Vars, ONLY : SpecDSMC, Coll_pData, CollInf, DSMC, BGGas, ChemReac, RadialWeighting, SpecXSec + USE MOD_DSMC_Vars, ONLY : SpecDSMC, Coll_pData, CollInf, DSMC, BGGas, ChemReac, RadialWeighting + USE MOD_DSMC_Vars, ONLY : SpecXSec, XSec_NullCollision USE MOD_DSMC_Vars, ONLY : ConsiderVolumePortions USE MOD_Particle_Vars, ONLY : PartSpecies, Species, PartState, VarTimeStep USE MOD_Particle_Mesh_Vars, ONLY : GEO @@ -129,19 +130,26 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) ! Using the kinetic energy of the particle (as is described in Vahedi1995 and Birdsall1991) VeloSquare = DOT_PRODUCT(PartState(4:6,iPart_p1),PartState(4:6,iPart_p1)) CollEnergy = 0.5 * Species(iSpec_p1)%MassIC * VeloSquare - ! Determining whether a real collision or a "null" collisions happens by comparing the current cross-section with the - ! maximal collision cross section - Coll_pData(iPair)%Prob = 1. - EXP(-SQRT(VeloSquare)*InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & - * SpecNum2*MacroParticleFactor/Volume*dt) - ! Correct the collision probability in the case of the second species being a background species as the number of pairs was - ! determined based on ProbNull - IF(BGGas%BackgroundSpecies(iSpec_p2)) Coll_pData(iPair)%Prob = Coll_pData(iPair)%Prob / SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + ! Calculate the collision probability + IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN + ! 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 in the case of mixture on the species fraction + IF(XSec_NullCollision) THEN + Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & + * SpecNum2 * MacroParticleFactor / Volume * dt)) / SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + ELSE + Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & + * SpecNum2 * MacroParticleFactor / Volume * dt)) / BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) + END IF + ELSE + Coll_pData(iPair)%Prob = 1. - EXP(-SQRT(VeloSquare)*InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & + * SpecNum2 * MacroParticleFactor/Volume*dt) + END IF ELSE Coll_pData(iPair)%Prob = SpecNum1*SpecNum2/(1 + CollInf%KronDelta(Coll_pData(iPair)%PairType)) & * CollInf%Cab(Coll_pData(iPair)%PairType) & ! Cab species comb fac * MacroParticleFactor / CollCaseNum & * Coll_pData(iPair)%CRela2 ** (0.5-SpecDSMC(iSpec_p1)%omegaVHS) & - ! relative velo to the power of (1 -2omega) !! only one omega is used!! * dtCell / Volume END IF CASE(8) !Electron - Electron @@ -211,13 +219,18 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) ,'Collision probability is NaN! CRela:',RealInfoOpt=SQRT(Coll_pData(iPair)%CRela2)) END IF IF(DSMC%CalcQualityFactors) THEN + CollProb = Coll_pData(iPair)%Prob + DSMC%CollProbMax = MAX(CollProb, DSMC%CollProbMax) + ! Remove the correction factor for the mean collision probability IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN - ! Calculate the collision probability for cross section case - IF(BGGas%BackgroundSpecies(iSpec_p2)) CollProb = Coll_pData(iPair)%Prob * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull - ELSE - CollProb = Coll_pData(iPair)%Prob + IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN + IF(XSec_NullCollision) THEN + CollProb = CollProb * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + ELSE + CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) + END IF + END IF END IF - DSMC%CollProbMax = MAX(CollProb, DSMC%CollProbMax) DSMC%CollProbMean = DSMC%CollProbMean + CollProb DSMC%CollProbMeanCount = DSMC%CollProbMeanCount + 1 END IF @@ -227,11 +240,16 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) DO iSpec=1, nSpecies iReac=ChemReac%ReactNum(PartSpecies(Coll_pData(iPair)%iPart_p1),PartSpecies(Coll_pData(iPair)%iPart_p2),iSpec) IF (iReac.NE.0) THEN + CollProb = Coll_pData(iPair)%Prob IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN - ! Calculate the collision probability for the cross section case with background gas - IF(BGGas%BackgroundSpecies(iSpec_p2)) CollProb = Coll_pData(iPair)%Prob * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull - ELSE - CollProb = Coll_pData(iPair)%Prob + ! Calculate the collision probability for the null collision probability case + IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN + IF(XSec_NullCollision) THEN + CollProb = CollProb * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + ELSE + CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) + END IF + END IF END IF ChemReac%ReacCollMean(iReac) = ChemReac%ReacCollMean(iReac) + CollProb ChemReac%ReacCollMeanCount(iReac) = ChemReac%ReacCollMeanCount(iReac) + 1 diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 03217cf18..dcf391426 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -362,6 +362,10 @@ SUBROUTINE DefineParametersDSMC() 'should be named with species pair (e.g. "Ar-electron"). The '//& 'first column shall contain the energy in eV and the second '//& 'column the cross-section in m^2', 'none') +CALL prms%CreateLogicalOption( 'Particles-CollXSec-NullCollision' & + ,'Utilize the null collision method for the determination of the number of pairs '//& + 'based on the maximum collision frequency and time step' & + ,'.FALSE.') END SUBROUTINE DefineParametersDSMC diff --git a/src/particles/dsmc/dsmc_species_xsec.f90 b/src/particles/dsmc/dsmc_species_xsec.f90 index 02ea32dea..54ebb977e 100644 --- a/src/particles/dsmc/dsmc_species_xsec.f90 +++ b/src/particles/dsmc/dsmc_species_xsec.f90 @@ -24,12 +24,7 @@ MODULE MOD_DSMC_SpecXSec MODULE PROCEDURE InterpolateCrossSection END INTERFACE -INTERFACE XSec_Argon_DravinLotz - MODULE PROCEDURE XSec_Argon_DravinLotz -END INTERFACE - PUBLIC :: InterpolateCrossSection -PUBLIC :: XSec_Argon_DravinLotz !=================================================================================================================================== CONTAINS @@ -44,7 +39,7 @@ SUBROUTINE MCC_Init() USE MOD_ReadInTools USE MOD_Globals_Vars ,ONLY: ElementaryCharge USE MOD_PARTICLE_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC, XSec_Database, SpecXSec +USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC, XSec_Database, SpecXSec, XSec_NullCollision IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! !----------------------------------------------------------------------------------------------------------------------------------- @@ -54,7 +49,7 @@ SUBROUTINE MCC_Init() !=================================================================================================================================== XSec_Database = TRIM(GETSTR('Particles-CollXSec-Database')) -! XSec_Verification = +XSec_NullCollision = GETLOGICAL('Particles-CollXSec-NullCollision') IF(TRIM(XSec_Database).EQ.'none') THEN CALL abort(& @@ -69,32 +64,31 @@ SUBROUTINE MCC_Init() END IF ALLOCATE(SpecXSec(nSpecies,nSpecies)) -TotalProb = 0. DO iSpec = 1,nSpecies - IF(.NOT.BGGas%BackgroundSpecies(iSpec)) THEN - IF(SpecDSMC(iSpec)%UseCollXSec) THEN - DO jSpec = 1, nSpecies - IF(BGGas%BackgroundSpecies(jSpec)) THEN - ! Read-in cross-section data for collisions of particles from the background gas and the current species - CALL ReadCollXSec(iSpec, jSpec) - ! Store the energy value in J (read-in was in eV) - SpecXSec(iSpec,jSpec)%CollXSecData(1,:) = SpecXSec(iSpec,jSpec)%CollXSecData(1,:) * ElementaryCharge - ! ! Determine the maximum collision frequency for the null collision method - CALL DetermineNullCollProb(iSpec,jSpec) - TotalProb = TotalProb + SpecXSec(iSpec,jSpec)%ProbNull - END IF - END DO + IF(BGGas%BackgroundSpecies(iSpec)) CYCLE + IF(.NOT.SpecDSMC(iSpec)%UseCollXSec) CYCLE + TotalProb = 0. + DO jSpec = 1, nSpecies + IF(.NOT.BGGas%BackgroundSpecies(jSpec)) CYCLE + ! Read-in cross-section data for collisions of particles from the background gas and the current species + CALL ReadCollXSec(iSpec, jSpec) + ! Store the energy value in J (read-in was in eV) + SpecXSec(iSpec,jSpec)%CollXSecData(1,:) = SpecXSec(iSpec,jSpec)%CollXSecData(1,:) * ElementaryCharge + IF(XSec_NullCollision) THEN + ! Determine the maximum collision frequency for the null collision method + CALL DetermineNullCollProb(iSpec,jSpec) + TotalProb = TotalProb + SpecXSec(iSpec,jSpec)%ProbNull + IF(TotalProb.GT.1.0) THEN + CALL abort(& + __STAMP__& + ,'ERROR: Total null collision probability is above unity. Please reduce the time step! Probability is: '& + ,RealInfoOpt=TotalProb) + END IF END IF - END IF + END DO END DO -IF(TotalProb.GT.1.0) THEN - CALL abort(& - __STAMP__& - ,'ERROR: Total null collision probability is above unity. Please reduce the time step! Probability is: ',RealInfoOpt=TotalProb) -END IF - END SUBROUTINE MCC_Init @@ -253,47 +247,4 @@ PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) END FUNCTION InterpolateCrossSection - -SUBROUTINE XSec_Argon_DravinLotz(SpecToExec, iPair) -!=================================================================================================================================== -! Subroutine computing the collision probability o the Argion ionization -!=================================================================================================================================== -! MODULES - USE MOD_DSMC_Vars, ONLY : Coll_pData, SpecDSMC - USE MOD_Equation_Vars, ONLY : eps0 - USE MOD_Globals_Vars, ONLY : Pi, ElementaryCharge -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: SpecToExec, iPair -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -REAL :: BohrRad, Rydberg -!=================================================================================================================================== - -! local constants -BohrRad = 0.5291772109E-10 -Rydberg = 13.60569253*ElementaryCharge - -!.... Elastic scattering cross section - Coll_pData(iPair)%Sigma(1) = SQRT(0.5*Pi*SpecDSMC(SpecToExec)%RelPolarizability & - * BohrRad**3*ElementaryCharge**2 & ! AIAA07 Paper - / (eps0*Coll_pData(iPair)%Ec)) ! units checked - -!.... Ionization cross section (Lotz) -IF ((Coll_pData(iPair)%Ec/ElementaryCharge).GE.SpecDSMC(SpecToExec)%Eion_eV) THEN - Coll_pData(iPair)%Sigma(2) = 2.78*SpecDSMC(SpecToExec)%NumEquivElecOutShell*Pi & - * BohrRad**2*Rydberg**2 & ! units checked - / (Coll_pData(iPair)%Ec*SpecDSMC(SpecToExec)%Eion_eV*ElementaryCharge) & - * LOG(Coll_pData(iPair)%Ec/(ElementaryCharge*SpecDSMC(SpecToExec)%Eion_eV)) -ELSE - Coll_pData(iPair)%Sigma(2) = 0.0 -ENDIF -Coll_pData(iPair)%Sigma(0)=Coll_pData(iPair)%Sigma(1)+Coll_pData(iPair)%Sigma(2) ! Calc of Sigma total - -END SUBROUTINE XSec_Argon_DravinLotz - -END MODULE MOD_DSMC_SpecXSec +END MODULE MOD_DSMC_SpecXSec \ No newline at end of file diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 7a9f42548..c623d59ba 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -296,6 +296,7 @@ MODULE MOD_DSMC_Vars LOGICAL :: UseMCC CHARACTER(LEN=256) :: XSec_Database +LOGICAL :: XSec_NullCollision INTEGER :: MCC_TotalPairNum TYPE tPairData @@ -304,11 +305,6 @@ MODULE MOD_DSMC_Vars INTEGER :: iPart_p1 ! first particle of the pair INTEGER :: iPart_p2 ! second particle of the pair INTEGER :: PairType ! type of pair (=iCase, CollInf%Coll_Case) - REAL, ALLOCATABLE :: Sigma(:) ! cross sections sigma of the pair - ! 0: sigma total - ! 1: sigma elast - ! 2: sigma ionization - ! 3: sigma exciation REAL :: Ec ! Collision Energy LOGICAL :: NeedForRec ! Flag if pair is need for Recombination END TYPE tPairData From 1a9c49ee6fb3fb3f11493740a72538eb1127d03c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 16 Apr 2020 00:53:51 +0200 Subject: [PATCH 03/74] Added null collision method test to DSMC checkin reggie --- .../checks/CHE_DSMC/BackgroundGas_VHS_MCC/analyze.ini | 6 +++--- .../checks/CHE_DSMC/BackgroundGas_VHS_MCC/parameter.ini | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/analyze.ini b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/analyze.ini index 9b98769c4..b1281d3ce 100644 --- a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/analyze.ini +++ b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/analyze.ini @@ -1,5 +1,5 @@ ! compare the PartAnalyze.csv with a reference file -compare_data_file_name = PartAnalyze.csv, PartAnalyze.csv -compare_data_file_reference = PartAnalyze_ref_VHS.csv, PartAnalyze_ref_MCC.csv -compare_data_file_tolerance = 5e-2 +compare_data_file_name = PartAnalyze.csv, PartAnalyze.csv, PartAnalyze.csv +compare_data_file_reference = PartAnalyze_ref_VHS.csv, PartAnalyze_ref_MCC.csv, PartAnalyze_ref_MCC.csv +compare_data_file_tolerance = 6e-2 compare_data_file_tolerance_type = relative \ No newline at end of file diff --git a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/parameter.ini b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/parameter.ini index 738ec5c31..7d06ad120 100644 --- a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/parameter.ini +++ b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/parameter.ini @@ -68,8 +68,10 @@ Particles-DSMC-CalcQualityFactors = F Part-maxParticleNumber = 500000 Part-nSpecies = 3 ! Collision cross-section -Particles-CollXSec-Database = MCC_Database.h5 -Part-Species2-UseCollXSec = F,T +Particles-CollXSec-Database = MCC_Database.h5 +Particles-CollXSec-NullCollision = F,F,T +Part-Species2-UseCollXSec = F,T,T +nocrosscombination:Particles-CollXSec-NullCollision,Part-Species2-UseCollXSec ! =============================================================================== ! ! Species1 | He Atom ! =============================================================================== ! From 6e163c9f7d7a74310f32f27f25c1768379aa2be1 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sun, 26 Apr 2020 19:36:48 +0200 Subject: [PATCH 04/74] Use vibrational cross-section to calculate relaxation probability --- .../BackgroundGas_VHS_MCC/MCC_Database.h5 | Bin 8256 -> 54872 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 24928 -> 54872 bytes src/particles/dsmc/dsmc_collis_mode.f90 | 44 ++-- src/particles/dsmc/dsmc_init.f90 | 3 + src/particles/dsmc/dsmc_species_xsec.f90 | 224 +++++++++++++++++- src/particles/dsmc/dsmc_vars.f90 | 8 + .../create_xsec_db_lxcat.py | 99 +++++++- 7 files changed, 345 insertions(+), 33 deletions(-) mode change 100755 => 100644 regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/MCC_Database.h5 diff --git a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/MCC_Database.h5 b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/MCC_Database.h5 old mode 100755 new mode 100644 index 5a7ef3ceed020c60260535e3cff73c9e1621c2e3..06961d74c0f6716eb3091d2c0617f12a96ba96d4 GIT binary patch literal 54872 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 ZMY%EGTa}MKdl&alV)JChqU6$w{|9geS8D(O literal 8256 zcmeHLdr(x@8NZ9D1Tdn54^m@~si|O>#RY`WO*{t>dDLYIU;`?VyKuLxS@tq_FDlmO zq>e-dpE05~n#9Ip6Pm=l2J%#7&j637w{8WDWU=T!C6s*`Y;X?y+ApqYl4WbJxU_CWCCWetbmHf&KX6Ar9{ZjHM>#q67!9ZM0WRhHI8kFk~^C{>v zfJ~$i$l16oQQ+;)r8urXR{C^`67Yz51oZ2`zV>E_)Y)>!4rY8A4<_Dj;pJ3*(gyMi zlK<#l9`Z7LGt9fvcP3qeweRm}4dY4u;NTjDR<3cQ3sKJO45QF65D$`Gp6odSVd<3e zAWWzi6WRywZ?Lo~+uht~LJxSUgEX0NFa$5p8O)4?EON~CTSqbm@{n4P$H|_L;^8sL zN8v#}yP^xdgXL(3$)S_<3uFOKNiL=h_}>$%k#0)v6(avgV_^S2OPAID9f*H;|E?HEQ&;!vkpD*i z$`9m+@+nHZD16e^|9(D!uK$}UHrh1PdG)d&N(0)!se>|(=502s!^+!HmcTn4feuN# zWt7c|teJIi$ifTA7#$rbgKU&1@MhL*wOPdil*QVz@@=fseW6v%K}qq^Gg*fY&9Dj% z5oPhV{9HS-I*^#d$q4r0?40nM0%WzLIoz)^v`E^Kw`UJ@?{^s4H}}Qh4C%az&dT~F z56)tdPrSe>dJm9?V;9TXfqMT8EOu{+UqfFKrT; zie{Q#Krx9i$+7A5fEMZ4D2^>)9XVDlinlvNtC%lxh_|358|%nroyWCiIiwrP;{_2V z@;Vfsl#~z{X$;gyXq{K3cczYukBy_b<6~0brYQf_-gI{Tx)^XV;9|hVfQtba11<(! z47eC@G2mk0f1Lr%_?ib7p1N!JrnIx(XimcYaVDM_>R+{^r^oR1via|en{)7M39A=p zp6E9G)^}g*my1R0(fVr1P)(Pi;O5Wu9%W1L=)JvlxVhc1^AmJH$XSW~hF$$>+POR6 z|2rJjC!S57blXrde%0;gD~e&i7O-!@ADj=n6cuzG?62dp`lF_rm#=_*4}N&`TG@vo zO@{3y@+idcm2no;+7Z3_@Ic_A-)DL^;-Yj330Q5-eVm;kx;}how5<) z8}QTVTcdWj>@--M;{q-Z_-t*relNsd#8>>b`P`hmAL5(wu3h!(R*k9v{}%l5p>u24 z#81H9f&EL$;%XD>Ab&T0WfFhdv!ucBmoxI{!3%$%SG#k`dGPPWO}_{+UOwFf{ttlP zFChOzl|LHKkd~8Y3ZGlu4Cm93>Svz}m^1!M$mdQb`^>_ z@#Dz78>5C7&-w;1BKOku8=so4fqzF%B(z_L0QQITDp*HGkMT`uJnIg2J?ZXBi1M5@ z2yiG_RJ5mJpMe1!K~gqeyb%7?1K4jGS>9E3 zRDI}K8C0EbX;byV?d{mS+RbgMK8!du4^24Mrs@N&r(M;D(wFL(@-6MEKKL!zvMv9~ z4pkpM-*dR>Z|NP--=+A~hQ_h8w|1!daL{jX!Qf8CUWw1nn|krUuR2wISXVsD?`MUb zsy@*B=~VS0t-0v2+nt@NK8zl|FFr%p1$@=vIi^eO;+0*hKKL#B`i<5Py5PNBzQuX1l=YlsKp41KT%{bX}jyc-V4gM{7{M^mSURM-*2R6KU{NT~>9#tRWKmEe& z&Go4IK=ly%lj+4PuCmj~sO{eDjuIuFAquAYs!=h0pYBA- zNA+$9>A#-`*N+`k)%H#zT`d2t(Av%Dg2Hl zJIZrw79COE+c@&p-PTk4k9Ponh$#I*&pVM&{l5)%e|TRv0PD!r`+c{(OTPlFC)YAt zBA(uM4R9#Dr>lS?K>wNmPXj(00mqY~QH@1o?$=N(=|jKw$)v;ikAd9`@A-X*x00WH pJ960k;tH?}@cs``Ea?N)!!nBVR)e1G1^aq3fBrg;^v8D_{sH-#Y@h%D diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 b/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 index 63874c2de3f5306f7644ea0b86afa3bd0b09d7bd..06961d74c0f6716eb3091d2c0617f12a96ba96d4 100644 GIT binary patch literal 54872 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 ZMY%EGTa}MKdl&alV)JChqU6$w{|9geS8D(O literal 24928 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 Read-in of collision cross-sections from a given database. Dataset name is composed of SpeciesName-SpeciesName (e.g. Ar-electron) +!=================================================================================================================================== +! use module +USE MOD_io_hdf5 +USE MOD_Globals +USE MOD_DSMC_Vars ,ONLY: XSec_Database, SpecXSec, SpecDSMC +USE MOD_HDF5_Input ,ONLY: DatasetExists +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER,INTENT(IN) :: iSpec, jSpec +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +CHARACTER(LEN=64) :: dsetname, groupname, spec_pair +INTEGER :: err +INTEGER(HSIZE_T), DIMENSION(2) :: dims,sizeMax +INTEGER(HID_T) :: file_id_dsmc ! File identifier +INTEGER(HID_T) :: group_id ! Group identifier +INTEGER(HID_T) :: dset_id_dsmc ! Dataset identifier +INTEGER(HID_T) :: filespace ! filespace identifier +INTEGER(SIZE_T) :: size ! Size of name +INTEGER(HSIZE_T) :: iVib ! Index +INTEGER :: storage, nVib, max_corder +!=================================================================================================================================== +spec_pair = TRIM(SpecDSMC(jSpec)%Name)//'-'//TRIM(SpecDSMC(iSpec)%Name) +SWRITE(UNIT_StdOut,'(A)') 'Read vibrational excitation cross section for '//TRIM(spec_pair)//' from '//TRIM(XSec_Database) + +! Initialize FORTRAN interface. +CALL H5OPEN_F(err) +! Open the file. +CALL H5FOPEN_F (TRIM(XSec_Database), H5F_ACC_RDONLY_F, file_id_dsmc, err) + +groupname = TRIM('/'//TRIM(spec_pair)//'/VIBRATION/') + +CALL H5GOPEN_F(file_id_dsmc,TRIM(groupname), group_id, err) +call H5Gget_info_f(group_id, storage, nVib,max_corder, err) + +SWRITE(UNIT_StdOut,'(A,I3,A)') 'Found ', nVib,' vibrational excitation cross section(s) in database.' + +ALLOCATE(SpecXSec(iSpec,jSpec)%VibMode(1:nVib)) + +DO iVib = 0, nVib-1 + ! Get name and size of name + CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, iVib, dsetname, err, size) + dsetname = TRIM(groupname)//TRIM(dsetname) + ! Open the dataset. + CALL H5DOPEN_F(file_id_dsmc, dsetname, dset_id_dsmc, err) + ! Get the file space of the dataset. + CALL H5DGET_SPACE_F(dset_id_dsmc, FileSpace, err) + ! get size + CALL H5SGET_SIMPLE_EXTENT_DIMS_F(FileSpace, dims, SizeMax, err) + ALLOCATE(SpecXSec(iSpec,jSpec)%VibMode(iVib+1)%XSecData(dims(1),dims(2))) + ! read data + CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iSpec,jSpec)%VibMode(iVib+1)%XSecData, dims, err) +END DO + +! Close the group +CALL H5GCLOSE_F(group_id,err) +! Close the file. +CALL H5FCLOSE_F(file_id_dsmc, err) +! Close FORTRAN interface. +CALL H5CLOSE_F(err) + +END SUBROUTINE ReadVibXSec + + SUBROUTINE DetermineNullCollProb(iSpec,jSpec) !=================================================================================================================================== !> Routine for the MCC method: calculates the maximal collision frequency for a given species and the collision probability @@ -247,4 +349,106 @@ PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) END FUNCTION InterpolateCrossSection + +PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) +!=================================================================================================================================== +!> +!> Note: Requires the data to be sorted by ascending energy values +!> Assumption: First species given is the particle species, second species input is the backgroung gas species +!=================================================================================================================================== +! MODULES +USE MOD_DSMC_Vars ,ONLY: SpecXSec +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas +INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +INTEGER,INTENT(IN) :: iVib !< +REAL,INTENT(IN) :: CollisionEnergy !< Collision energy in [J] +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iDOF, MaxDOF +!=================================================================================================================================== + +InterpolateCrossSection_Vib = 0. +MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData,2) + +IF(CollisionEnergy.GT.SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,MaxDOF)) THEN + ! If the collision energy is greater than the maximal value, get the cross-section of the last level and leave routine + InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,MaxDOF) + ! Leave routine + RETURN +ELSE IF(CollisionEnergy.LE.SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,1)) THEN + ! If collision energy is below the minimal value, get the cross-section of the first level and leave routine + InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,1) + ! Leave routine + RETURN +END IF + +DO iDOF = 1, MaxDOF + ! Check if the stored energy value is above the collision energy + IF(SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF).GT.CollisionEnergy) THEN + ! Interpolate the cross-section from the data set using the current and the energy level below + InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF-1) & + + (CollisionEnergy - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF-1)) & + / (SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF) - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF-1)) & + * (SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF) - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF-1)) + ! Leave routine and do not finish DO loop + RETURN + END IF +END DO + +END FUNCTION InterpolateCrossSection_Vib + + +PURE REAL FUNCTION InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) +!=================================================================================================================================== +!> +!> Note: Requires the data to be sorted by ascending energy values +!> Assumption: First species given is the particle species, second species input is the backgroung gas species +!=================================================================================================================================== +! MODULES +USE MOD_DSMC_Vars ,ONLY: SpecXSec +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas +INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +REAL,INTENT(IN) :: CollisionEnergy !< Collision energy in [J] +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iDOF, MaxDOF +!=================================================================================================================================== + +InterpolateVibRelaxProb = 0. +MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%CollXSecData,2) + +IF(CollisionEnergy.GT.SpecXSec(iSpec,jSpec)%CollXSecData(1,MaxDOF)) THEN + ! If the collision energy is greater than the maximal value, get the cross-section of the last level and leave routine + InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,MaxDOF) + ! Leave routine + RETURN +ELSE IF(CollisionEnergy.LE.SpecXSec(iSpec,jSpec)%CollXSecData(1,1)) THEN + ! If collision energy is below the minimal value, get the cross-section of the first level and leave routine + InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,1) + ! Leave routine + RETURN +END IF + +DO iDOF = 1, MaxDOF + ! Check if the stored energy value is above the collision energy + IF(SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF).GT.CollisionEnergy) THEN + ! Interpolate the cross-section from the data set using the current and the energy level below + InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF-1) & + + (CollisionEnergy - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & + / (SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & + * (SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF-1)) + ! Leave routine and do not finish DO loop + RETURN + END IF +END DO + +END FUNCTION InterpolateVibRelaxProb + + END MODULE MOD_DSMC_SpecXSec \ No newline at end of file diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index c623d59ba..ac55321d9 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -180,6 +180,12 @@ MODULE MOD_DSMC_Vars TYPE(tSpeciesDSMC), ALLOCATABLE :: SpecDSMC(:) ! Species DSMC params (nSpec) +TYPE tXSecVibMode + REAL,ALLOCATABLE :: XSecData(:,:) ! Vibrational cross-section as read-in from the database + ! 1: Energy (at read-in in [eV], during simulation in [J]) + ! 2: Cross-section at the respective energy level [m^2] +END TYPE tXSecVibMode + TYPE tSpeciesXSec REAL,ALLOCATABLE :: CollXSecData(:,:) ! Collision cross-section as read-in from the database ! 1: Energy (at read-in in [eV], during simulation in [J]) @@ -187,6 +193,7 @@ MODULE MOD_DSMC_Vars REAL :: ProbNull ! Collision probability at the maximal collision frequency for the ! null collision method of MCC REAL :: MaxCollFreq ! Maximal collision frequency at certain energy level and cross-section + TYPE(tXSecVibMode),ALLOCATABLE :: VibMode(:) ! END TYPE tSpeciesXSec TYPE(tSpeciesXSec), ALLOCATABLE :: SpecXSec(:,:) ! Species cross-section related data (nSpec,nSpec). First column is used @@ -297,6 +304,7 @@ MODULE MOD_DSMC_Vars LOGICAL :: UseMCC CHARACTER(LEN=256) :: XSec_Database LOGICAL :: XSec_NullCollision +LOGICAL :: XSec_Relaxation INTEGER :: MCC_TotalPairNum TYPE tPairData diff --git a/tools/crosssection_database/create_xsec_db_lxcat.py b/tools/crosssection_database/create_xsec_db_lxcat.py index ce3a87f55..4cb0e2659 100755 --- a/tools/crosssection_database/create_xsec_db_lxcat.py +++ b/tools/crosssection_database/create_xsec_db_lxcat.py @@ -7,7 +7,7 @@ # Output database database_output = "LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5" # Species list to be included in the output database -species_list = ["Ar","CO","CO2","H2","H2O","He","Mg","N2","NO","Na","Ne","O2","SF6"] +species_list = ["CO2","N2","He"] # 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." @@ -16,23 +16,114 @@ hdf.attrs['Info'] = 'Effective electron-neutrals collision cross-section database for read-in with PICLas. First column is the collision energy in [eV], second column is the cross-section in [m^2]' hdf.attrs['Reference'] = reference +def sort_by_threshold(elem): + return elem.threshold + # Read-in of data and output of the species containers for current_species in species_list: print(current_species) + grp_spec = hdf.create_group(current_species + "-electron") data_spec = ldp.CrossSectionSet(database_input,imposed_species=current_species) + result_rot = 0 + result_vib = 0 + result_elec = 0 + total = 0 + for cross_section in data_spec.cross_sections: + if cross_section.type == ldp.CrossSectionTypes.EXCITATION: + # Electronic levels: Look for a star in the process description or scan the info for electronic + if cross_section.info.get('PROCESS').find('*') != -1: + result_elec += 1 + elif str(cross_section.info).casefold().find('electronic') != -1: + result_elec += 1 + # Rotational excitation: Look for a j or rot in the process description or scan the info for rotation + if cross_section.info.get('PROCESS').casefold().find('j') != -1: + result_rot += 1 + elif cross_section.info.get('PROCESS').casefold().find('rot') != -1: + result_rot += 1 + elif str(cross_section.info).casefold().find('rotation') != -1: + result_rot += 1 + # Vibrational excitation: Look for v (but check that its not the v from eV) or scan the info for vibration + if cross_section.info.get('PROCESS').casefold().find('v') != -1: + if cross_section.info.get('PROCESS').casefold().find('v')-1 != cross_section.info.get('PROCESS').casefold().find('ev'): + result_vib += 1 + elif str(cross_section.info).casefold().find('vibration') != -1: + result_vib += 1 + elif str(cross_section.info).casefold().find('vibration') != -1: + result_vib += 1 + total += 1 + if sum([result_rot,result_vib,result_elec]) != total: + print('WARNING: '+ str(total-sum([result_rot,result_vib,result_elec])) +' excitation cross-section(s) could not be assigned!') + print('WARNING: Cross-sections will be written in the UNDEFINED group.') + grp_undef = grp_spec.create_group("UNDEFINED") + else: + print('Found:') + print(str(result_rot)+' rotational cross-section(s).') + print(str(result_vib)+' vibrational cross-section(s).') + print(str(result_elec)+' electronic cross-section(s).') + if result_rot > 0: + grp_rot = grp_spec.create_group("ROTATION") + if result_vib > 0: + grp_vib = grp_spec.create_group("VIBRATION") + if result_elec > 0: + grp_elec = grp_spec.create_group("ELECTRONIC") for cross_section in data_spec.cross_sections: # For now, only considering effective cross-sections in PICLas if cross_section.type == ldp.CrossSectionTypes.EFFECTIVE: ## Get the string of the cross section type (ELASTIC = 0, EFFECTIVE = 1, EXCITATION = 2, ATTACHMENT = 3, IONIZATION = 4) type_spec = ldp.CrossSectionTypes(cross_section.type).name ## Print name of the current species in console - print(ldp.CrossSectionTypes(cross_section.type).name) + print('Found effective cross-section.') ## Write cross-section dataset of the current species in the HDF5 database - dataset = hdf.create_dataset(current_species + "-electron", data=cross_section.data) + dataset = grp_spec.create_dataset(type_spec, data=cross_section.data) ## Save the type of cross-section dataset.attrs['Type'] = type_spec ## Save the additional information dataset.attrs['Info'] = str(cross_section.info) + for cross_section in sorted([cross_section for cross_section in data_spec.cross_sections if cross_section.type == ldp.CrossSectionTypes.EXCITATION],key=sort_by_threshold): + ## Write cross-section dataset of the current species in the HDF5 database + test = 0 + # Electronic levels: Look for a star in the process description or scan the info for electronic + if cross_section.info.get('PROCESS').find('*') != -1: + dataset = grp_elec.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + elif str(cross_section.info).casefold().find('electronic') != -1: + dataset = grp_elec.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + # Rotational excitation: Look for a j or rot in the process description or scan the info for rotation + if cross_section.info.get('PROCESS').casefold().find('j') != -1: + dataset = grp_rot.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + elif cross_section.info.get('PROCESS').casefold().find('rot') != -1: + dataset = grp_rot.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + elif str(cross_section.info).casefold().find('rotation') != -1: + dataset = grp_rot.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + # Vibrational excitation: Look for v (but check that its not the v from eV) or scan the info for vibration + if cross_section.info.get('PROCESS').casefold().find('v') != -1: + if cross_section.info.get('PROCESS').casefold().find('v')-1 != cross_section.info.get('PROCESS').casefold().find('ev'): + dataset = grp_vib.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + elif str(cross_section.info).casefold().find('vibration') != -1: + dataset = grp_vib.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + elif str(cross_section.info).casefold().find('vibration') != -1: + dataset = grp_vib.create_dataset(str(cross_section.threshold), data=cross_section.data) + test += 1 + if test == 0: + dataset = grp_undef.create_dataset(str(cross_section.threshold), data=cross_section.data) + elif test > 1: + print('WARNING: Cross-section data was added to multiple excitation types: '+str(cross_section.info)) + ## Get the string of the cross section type (ELASTIC = 0, EFFECTIVE = 1, EXCITATION = 2, ATTACHMENT = 3, IONIZATION = 4) + type_spec = ldp.CrossSectionTypes(cross_section.type).name + ## Save the type of cross-section + dataset.attrs['Type'] = type_spec + ## Save the additional information + dataset.attrs['Info'] = str(cross_section.info) + dataset.attrs['Threshold [eV]'] = cross_section.threshold + +hdf.close() + ## FUTURE DEVELOPMENTS ## Access a specific key of the info array # print(cross_section.info.get('SPECIES')) @@ -42,4 +133,4 @@ # if cross_section.type == ldp.CrossSectionTypes.IONIZATION or cross_section.type == ldp.CrossSectionTypes.EXCITATION: # dataset.attrs['Threshold [eV]'] = cross_section.threshold -hdf.close() \ No newline at end of file + From 21e67a650a1d50a89e340af9f304cfab1f6b5615 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 28 Apr 2020 10:48:40 +0200 Subject: [PATCH 05/74] Minor comment --- src/particles/dsmc/dsmc_species_xsec.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/particles/dsmc/dsmc_species_xsec.f90 b/src/particles/dsmc/dsmc_species_xsec.f90 index e47cef0bb..a2741fc6c 100644 --- a/src/particles/dsmc/dsmc_species_xsec.f90 +++ b/src/particles/dsmc/dsmc_species_xsec.f90 @@ -74,6 +74,7 @@ SUBROUTINE MCC_Init() DO jSpec = 1, nSpecies IF(.NOT.BGGas%BackgroundSpecies(jSpec)) CYCLE ! Read-in cross-section data for collisions of particles from the background gas and the current species + ! Allocating CollXSecData within the following routine CALL ReadCollXSec(iSpec, jSpec) ! Store the energy value in J (read-in was in eV) SpecXSec(iSpec,jSpec)%CollXSecData(1,:) = SpecXSec(iSpec,jSpec)%CollXSecData(1,:) * ElementaryCharge From 49cb1bb47c5f8323c7324633885434d016726413 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 29 Apr 2020 20:09:30 +0200 Subject: [PATCH 06/74] Regression test, output of pair specific vibrational relaxation probability --- doc/userguide/030_features_models.md | 9 ++ doc/userguide/050_tools.md | 12 +- .../BackgroundGas_VHS_MCC/MCC_Database.h5 | Bin 54872 -> 54184 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 54872 -> 54184 bytes .../VarRelaxProb_XSecData/DSMC.ini | 84 ++++++++++ .../DSMCSpecies_electronic_state_full_Data.h5 | Bin 0 -> 107464 bytes .../Database_Tvib_00059300_ref.csv | 3 + .../Database_Tvib_00083900_ref.csv | 3 + .../Database_Tvib_00119000_ref.csv | 3 + .../Database_Tvib_00157000_ref.csv | 3 + .../Database_Tvib_00205000_ref.csv | 3 + .../Database_Tvib_00245000_ref.csv | 3 + .../Database_Tvib_00297000_ref.csv | 3 + .../Database_Tvib_00351000_ref.csv | 3 + .../Database_Tvib_00419000_ref.csv | 3 + .../Database_Tvib_00593000_ref.csv | 3 + .../Database_Tvib_00676000_ref.csv | 3 + .../Database_Tvib_00773000_ref.csv | 3 + .../Database_Tvib_00859000_ref.csv | 3 + .../Database_Tvib_00938000_ref.csv | 3 + .../Database_Tvib_01030000_ref.csv | 3 + .../Database_Tvib_01130000_ref.csv | 3 + .../Database_Tvib_01260000_ref.csv | 3 + .../Database_Tvib_01450000_ref.csv | 3 + .../Database_Tvib_01680000_ref.csv | 3 + .../Database_Tvib_02050000_ref.csv | 3 + .../Database_Tvib_02450000_ref.csv | 3 + .../Database_Tvib_02970000_ref.csv | 3 + .../Database_Tvib_04190000_ref.csv | 3 + .../Database_Tvib_05930000_ref.csv | 3 + .../Figure_Verification.png | Bin 0 -> 53400 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 0 -> 54184 bytes .../VarRelaxProb_XSecData/analyze.ini | 4 + .../VarRelaxProb_XSecData/command_line.ini | 2 + .../VarRelaxProb_XSecData/cube_mesh.h5 | Bin 0 -> 6872 bytes .../VarRelaxProb_XSecData/get_values.py | 14 ++ .../VarRelaxProb_XSecData/hopr.ini | 43 +++++ .../VarRelaxProb_XSecData/parameter.ini | 151 ++++++++++++++++++ .../VarRelaxProb_XSecData/readme.md | 6 + src/particles/analyze/particle_analyze.f90 | 80 +++++++++- src/particles/dsmc/dsmc_collis_mode.f90 | 22 +-- src/particles/dsmc/dsmc_init.f90 | 26 ++- src/particles/dsmc/dsmc_main.f90 | 14 +- src/particles/dsmc/dsmc_species_xsec.f90 | 71 ++++++-- src/particles/dsmc/dsmc_vars.f90 | 3 + 45 files changed, 574 insertions(+), 39 deletions(-) create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMC.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMCSpecies_electronic_state_full_Data.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00059300_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00083900_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00119000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00157000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00205000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00245000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00297000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00351000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00419000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00593000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00676000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00773000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00859000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00938000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01030000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01130000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01260000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01450000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01680000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02050000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02450000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02970000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_04190000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_05930000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Figure_Verification.png create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/analyze.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/command_line.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/cube_mesh.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/get_values.py create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/hopr.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/parameter.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/readme.md diff --git a/doc/userguide/030_features_models.md b/doc/userguide/030_features_models.md index 761aa4192..ea6a243a3 100644 --- a/doc/userguide/030_features_models.md +++ b/doc/userguide/030_features_models.md @@ -1102,6 +1102,7 @@ Every time step particles are generated from the background gas (for a mixture, For modelling of particle collisions with the Particle-in-Cell method, often the Monte Carlo Collision (MCC) algorithm is utilized. Here, experimentally measured or ab-initio calculated cross-sections are typically utilized to determine the collision probability. In PICLas, the null collision method after [@Birdsall1991],[@Vahedi1995] is implemented, where the number of collision pairs is determined based a maximum collision frequency. Thus, the computational effort is reduced as not every particle has to be checked for a collision, such as in the previously described DSMC-based background gas. To activate the MCC procedure, the collision cross-sections have to be supplied via read-in from a database Particles-CollXSec-Database = MCC_Database.h5 + Particles-CollXSec-NullCollision = TRUE Cross-section data can be retrieved from the [LXCat database](https://fr.lxcat.net/home/) and converted with a Python script provided in the tools folder: `piclas/tools/crosssection_database`. Details on how to create an own database with custom cross-section data is given in Section \ref{sec:tools_mcc}. Finally, the input which species should be treated with the MCC model is required @@ -1110,6 +1111,14 @@ Cross-section data can be retrieved from the [LXCat database](https://fr.lxcat.n The read-in of the cross-section data is based on the provided species name and the species name of the background gas (e.g. if the background species name is Ar, the code will look for a container named `Ar-electron` in the MCC database). Finally, the cross-section based collision modelling (e.g. for neutral-charged collisions) and the VHS model (e.g. for neutral-neutral collisions) can be utilized within a simulation for different species. +### Cross-section based vibrational relaxation probability + +In the following, the utilization of cross-section data is extended to the determination of the vibrational relaxation probability. When data is available, it will be read-in by the Python script described above. If different vibrational levels are available, they will be summarized to a single relaxation probability. Afterwards the regular DSMC-based relaxation procedure will be performed. To enable the utilization of these levels, the following flag shall be supplied + + Part-Species2-UseVibXSec = T + +It should be noted that even if Species2 corresponds to an electron, the vibrational cross-section data will be read-in for any molecule-electron pair. + ## Modelling of Continuum Gas Flows \label{sec:continuum} Two methods are currently implemented to allow the simulation of gas flows in the continuum and transitional regime, where the DSMC method is computationally too expensive. The Fokker–Planck- and Bhatnagar-Gross-Krook-based approximation of the collision integral are compared in detail in paper to be published in Physics of Fluids. It is recommended to utilize a previous DSMC parameter file to ensure a complete simulation setup. diff --git a/doc/userguide/050_tools.md b/doc/userguide/050_tools.md index d0d7d1bc6..8f460b6f9 100644 --- a/doc/userguide/050_tools.md +++ b/doc/userguide/050_tools.md @@ -15,7 +15,17 @@ A database (containing multiple species and cross-section types) downloaded dire database_input = "Database.txt" database_output = "Database.h5" -Currently, PICLas only utilizes effective cross-sections between neutral species and electrons and as such only these cross-section types are stored in the output file. By defining a species list, only certain species can be included in the output database +Currently, PICLas only utilizes effective and vibrational cross-sections, however, all excitation cross-section types are grouped and stored in the output file. An example is given below + + CO2-election (group) + EFFECTIVE (dataset) + ROTATION (group) + 0.02 (dataset) + VIBRATION (group) + 0.29 + 0.59 + +Datasets, which cannot be identified as rotational, vibrational or electronic excitation will grouped within an `UNDEFINED` group. By defining a species list, only certain species can be included in the output database species_list = ["Ar","CO"] diff --git a/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/MCC_Database.h5 b/regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/MCC_Database.h5 index 06961d74c0f6716eb3091d2c0617f12a96ba96d4..6609c3c3ada041832144ca55a314e38e63939d17 100644 GIT binary patch delta 1921 zcmZWpeM}o=7{7ZV$Mxv+FmZN-^~z#g*%UevMiv>hqZ>FrI%f>wkMZFO8xn-MjjBir z1lA40c03D$5mOVVMG5q{1sFkS#Xm46a)LzEgcwtm7&H5a8iR&-cWTNe(^Q0cx=Lj95WLr7m>V=f@>P)&xUUwz}S>O3yq;c9d$ z;2MvM_N*lo15Z|xQLyn;9B}5ufxj$qp!exG@aQvf;7(o~$U9n-8gp%nT?!laAE3U$ zCK|gXo|0u;9rM0zZ*psx&~=X%C0GOoyu zsgD=V4H*pJuVlefW}S9WEI*j8^L&B{CP7F+j25%C9@fsEOgoaBZBe$hCt-nHI|vSE zhbqOY^B%OC4d89Sm}@L$Sb|mkSsUQ_Z?e($%Yu+kLf}vVcpF(*nXrQQ8U=%GGZ8WE zFmOqaO4?xFl`Ya2c2l4;iy^lmt(61Q2#vyRykLZII*r_~DVAl5M(h<{Se(9Gti82e z9Jo>v1(4A`2~CHMu-#tG5Rvq)B$RQugt$gKsfYdTry!%N0lFKE;O(kL*4N>`E)x!_ zn@`iyAlzy;L@h7mh}*866qxUp$XfWfD^uZ$Q$4Sc$o(c{^r~mYqFx1eXuibNJ{f!8 z()OXoa|Rhaa@5dQDJa9%Q@z{kAg4|=Gd*FZ$S^J|5Sp?7zPr|XQ zF2+BAneIf5GGNbe5t2rsVze2W%tr7Wu4XKQnCp$_7VecIt&8McO}g;gP@VO-o+7lG zVtbVg95-kb@W>WZgOLrl%E;qpqj%n4<2rsmNd+J#wq^);CNV*x9 zP2qkmgygsoq;Y&$(IAJ3%@f#3F_M44k+a8O{aw5MrHl2K>Mmb=wWY4v1ctF@5<%u3 zPL~w9c^8DSBB*2c!p>NJ0$H@Yx1uAH;eEycrDqR7uCF-NUS>b>;tQ1(r6)|#?(3T# z_aZXD3$x&!P(xpwkV6;ZLyxLQ#fLtjsz*mF!8Na_q*MaEpjdJxppj1%OQ{6&l46A= z8o54JEV*?^7X&9cxpj2pluDC3XT+~q5fK-sLX5W)CuvD|Peo!%IH^9q5Mrz%CM6U| zp|U$Xt&+B;LrmZ{;~jx!uE5{4C)wF|q{3H}2YK#qHukh#_Y1vj2g|&UM?U zeey(-i4}_>QDK!OxRiqF;WnFdNBOXUK{l@Cbk4ajAI!S9S>aj z&@~&CjIZ4NtXsDkz(fM-s2rGEwjxJR+*$rm9!+0q(|xGigyz215CkL^Rjo!IDcvVv z2ijbXX}}AAgT-lrZDTd^eh$SP?&wvgn%OUFs@~b_A278m*ae#qY_ygP@~+m2#JW0* QeUdth{Tpf>-rs2YAFRiXuK)l5 delta 1917 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 QeUdth{Tpf>-rs2YAFRiXuK)l5 delta 1917 zcmZWqYfKzf6rQ=@FgwL&F-lj0%vKv+sxC{BS1q`1SV{$XXpDpy3P@Xm{8%UyQY(%~ zw_r=R%V~i^V>YQ&6a>bpmGps2sEW10jff#N5o%Y`_>1^ViB|8OJHu}6{<-Hn_uO;7 z`<*j)hu)7^7>PJ$L8afzo6m7^rKcG6$I^w7u2Q3BT3O|4O%Xkx4}zy5Q}Kz_1`T8@ z&cx492s}~5u7UX{!@#bjFz|;h3>@4N1|E1S3=F1*fzq4m=p`tMF{DHN|aunLA z6Q9Y`ZlEnM73Mf|cN98v;H$jt-VQT2(@S}Aq8hdoSix9eft&dj@E6&={*3Ml zGnk*};XZe)?Ei@cd%g+Ti=ZsOyxU}g@ggH$gir=tl-;X(qx5b}eF|8n#yD#^{7inwtS{)oD%KOmMv_!O%Vv z@YM%2pOcM*tljxBM#iX~$g8IZE4=b{g|E3C1-GjOR)QFpDEm!pw`7Nvb`EBDpVJe- z)jiROX@s&wD;laN0@_?W8fqlgN*vE-z;(9>686nBd*w;+Z_ZGp`e=2S6i-7Johq^M zH|QU4VHeZ0g2f89eGMR7Y(b{|5Z`Q8!=GvP!q5df z*rk4y@w)C-{*_*1QRxAwYg5A%PaDB+tnG{K7`L?Q`!IH}1kJpIt33)9cNxlHpf3Lf zI66!;NIoROlATA!x3w`rzIOG#&+^FT#+INDlK&7v#aa(shcW8z<&otCaaU;Wya9}e z98lcx3zCk&woZDLot-5H={SuVf+=x>66k!`fL6NJB0LRFcm+nG){+3ey=ADv1Ap(O zhw;|>czjlu&Ug}cX4AR|MxTfUsGJqSHo~Kc9zuY0YvQC=UM5ty8~CVn3alsUp!V?= zVd)s9;bWmd)SrnggQPtt2>yBOX>M6N(-%ZicNoX4hxE9}FhbG@O-XK+B!nI!SdB_x zZ$R>kTj7y@Cp7lgMc_bK>`!Eui5I<`0$ult;2PMZ_y%SS>@79+^k5GBI_M@9Vj-qP zRQk?Hh`s5R7a{P$HiYl8{zJ^`Y&fr2ofj9*Ym5jL9mQBEKgM#2$U_=FF{xU^Jj(N{ zl8x}J1u93dj4ooy*utZZCS*`FE?uO>sKmZmik7C8E3$)EB{?4y z#wVzI{4PeV%?|EC{E!ev7lNqby#BS|zX+94_FE3_cYGQLSTA95FaMwNY@37onFdTw z1_kB|TB`W2QswOq?iLL!^tTy0rfDDpm0S|=Q+C8$R-T(W!y|tHqTTW2dBsm4s`*Yw zV4O7~{#&gpaiwQz0{s~b-Q6qy38mlcN5x-4j;PC*2|h8B2$B}aB};4IJ;C@jO<}x) f?ApkX&q&vKd>*b|2qw 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%0DQL_DI5I?!0^VBVUYft#t?4xZF@ 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 GLK6V%-ZBjU literal 0 HcmV?d00001 diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 b/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 new file mode 100644 index 0000000000000000000000000000000000000000..6609c3c3ada041832144ca55a314e38e63939d17 GIT binary patch literal 54184 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
MUBiA}LMuFQ z?6C)9(8qLO`+Av-q4zDq0DzEgN2!@3}{>?J}xTigDZHZ5A z56j+Sp^Vy@X;h`sxx$LNz(}R%cUD~h^p`5E?Ywj=8|vyt%g@}>a*%m0ZInLV!Oa}RJ*Jmeow@DTa*>)lVr#k>Hp zaVZL99icWJ=6Waj3q5`Qzc~M>k(ZsnxlbCMJ0RG2nDZsZG044uUv7WC)EJiqBRd=501 && PP_TimeDiscMethod<=509)) USE MOD_DSMC_Analyze ,ONLY: CalcMeanFreePath USE MOD_Particle_Mesh_Vars ,ONLY: GEO -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, BGGas +USE MOD_DSMC_Vars ,ONLY: SpecDSMC, BGGas, XSec_Relaxation #endif USE MOD_Particle_Vars ,ONLY: Species USE MOD_PIC_Analyze ,ONLY: CalcDepositedCharge @@ -681,7 +681,7 @@ SUBROUTINE AnalyzeParticles(Time) REAL :: ETotal, MacroParticleFactor #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) REAL :: MaxCollProb, MeanCollProb, MeanFreePath -REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2) +REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2),VibRelaxProbSpec(nSpecies,nSpecies) #endif #if USE_MPI #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300||(PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) @@ -963,6 +963,18 @@ SUBROUTINE AnalyzeParticles(Time) WRITE(unit_index,'(A1)',ADVANCE='NO') ',' WRITE(unit_index,'(I3.3,A,A5)',ADVANCE='NO') OutputCounter,'-VibRelaxPmax',' ' OutputCounter = OutputCounter + 1 + IF(XSec_Relaxation) THEN + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + ! Skip entry if both species are NOT molecules + IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & + ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-VibRelaxPmean', iSpec, '+', jSpec + OutputCounter = OutputCounter + 1 + END DO + END DO + END IF END IF END IF #endif @@ -1104,7 +1116,8 @@ SUBROUTINE AnalyzeParticles(Time) GEO%MeshVolume, SpecDSMC(1)%omegaVHS, TempTotal(nSpecAnalyze)) END IF END IF - IF(CalcRelaxProb) CALL CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) + VibRelaxProbSpec = 0. + IF(CalcRelaxProb) CALL CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) END IF #endif !----------------------------------------------------------------------------------------------------------------------------------- @@ -1454,6 +1467,17 @@ SUBROUTINE AnalyzeParticles(Time) WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') VibRelaxProb(2) WRITE(unit_index,'(A1)',ADVANCE='NO') ',' WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') VibRelaxProb(1) + IF(XSec_Relaxation) THEN + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + ! Skip entry if both species are NOT molecules + IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & + ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') VibRelaxProbSpec(iSpec,jSpec) + END DO + END DO + END IF END IF END IF #endif @@ -2148,7 +2172,7 @@ END SUBROUTINE CalcTemperature #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) -SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) +SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) !=================================================================================================================================== ! Calculates global rotational and vibrational relaxation probability for PartAnalyse.csv !=================================================================================================================================== @@ -2156,7 +2180,7 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) USE MOD_Globals USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode +USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode, SpecXSec, XSec_Relaxation USE MOD_Mesh_Vars ,ONLY: nElems, nGlobalElems #if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI @@ -2166,9 +2190,10 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT) :: RotRelaxProb(2),VibRelaxProb(2) !< output value is already the GLOBAL RelaxProbs +REAL,INTENT(OUT) :: VibRelaxProbSpec(nSpecies,nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem, iSpec +INTEGER :: iElem, iSpec, jSpec REAL :: PartNum !=================================================================================================================================== IF(CollisMode.LT.2) RETURN @@ -2225,7 +2250,46 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) END IF #endif /*USE_MPI*/ ELSE - VibRelaxProb = DSMC%VibRelaxProb + VibRelaxProb = 0. +#if USE_MPI + IF(PartMPI%MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(XSec_Relaxation) THEN + DO iSpec=1,nSpecies + DO jSpec=1,nSpecies + CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(iSpec,jSpec)%VibProb(1:2),2,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + END DO + END DO + END IF + ELSE + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,1),DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,2),DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,3),DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(XSec_Relaxation) THEN + DO iSpec=1,nSpecies + DO jSpec=1,nSpecies + CALL MPI_REDUCE(SpecXSec(iSpec,jSpec)%VibProb(1:2),SpecXSec(iSpec,jSpec)%VibProb(1:2),2,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + END DO + END DO + END IF + END IF +#endif /*USE_MPI*/ + IF(PartMPI%MPIRoot)THEN + VibRelaxProb(1) = MAXVAL(DSMC%CalcVibProb(1:nSpecies,2)) + IF(SUM(DSMC%CalcVibProb(1:nSpecies,3)).GT.0) THEN + VibRelaxProb(2) = SUM(DSMC%CalcVibProb(1:nSpecies,1))/SUM(DSMC%CalcVibProb(1:nSpecies,3)) + END IF + IF(XSec_Relaxation) THEN + DO iSpec=1,nSpecies + DO jSpec=1,nSpecies + IF(SpecXSec(iSpec,jSpec)%VibProb(2).GT.0) & + VibRelaxProbSpec(iSpec,jSpec)=SpecXSec(iSpec,jSpec)%VibProb(1)/SpecXSec(iSpec,jSpec)%VibProb(2) + END DO + END DO + END IF + END IF END IF END SUBROUTINE CalcRelaxProbRotVib #endif diff --git a/src/particles/dsmc/dsmc_collis_mode.f90 b/src/particles/dsmc/dsmc_collis_mode.f90 index b5f6f9d17..e4af4f006 100644 --- a/src/particles/dsmc/dsmc_collis_mode.f90 +++ b/src/particles/dsmc/dsmc_collis_mode.f90 @@ -384,10 +384,6 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) CALL RANDOM_NUMBER(iRan) CALL DSMC_calc_P_vib(iPair, iSpec1, iSpec2, Xi_rel, iElem, ProbVib1) IF(ProbVib1.GT.iRan) DoVib1 = .TRUE. - IF(DSMC%CalcQualityFactors.AND.(DSMC%VibRelaxProb.EQ.2)) THEN - DSMC%CalcVibProb(iSpec1,1) = DSMC%CalcVibProb(iSpec1,1) + ProbVib1 - DSMC%CalcVibProb(iSpec1,3) = DSMC%CalcVibProb(iSpec1,3) + 1 - END IF END IF IF ( DSMC%ElectronicModel ) THEN IF((SpecDSMC(iSpec1)%InterID.NE.4).AND.(.NOT.SpecDSMC(iSpec1)%FullyIonized)) THEN @@ -414,10 +410,7 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) CALL RANDOM_NUMBER(iRan) CALL DSMC_calc_P_vib(iPair, iSpec2, iSpec1, Xi_rel, iElem, ProbVib2) IF(ProbVib2.GT.iRan) DoVib2 = .TRUE. - IF(DSMC%CalcQualityFactors.AND.(DSMC%VibRelaxProb.EQ.2)) THEN - DSMC%CalcVibProb(iSpec2,1) = DSMC%CalcVibProb(iSpec2,1) + ProbVib2 - DSMC%CalcVibProb(iSpec2,3) = DSMC%CalcVibProb(iSpec2,3) + 1 - END IF + END IF IF ( DSMC%ElectronicModel ) THEN IF((SpecDSMC(iSpec2)%InterID.NE.4).AND.(.NOT.SpecDSMC(iSpec2)%FullyIonized)) THEN @@ -2837,7 +2830,7 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) ! MODULES USE MOD_Globals ,ONLY: Abort USE MOD_DSMC_Vars ,ONLY: SpecDSMC, DSMC, VarVibRelaxProb, useRelaxProbCorrFactor, XSec_Relaxation, CollInf, Coll_pData -USE MOD_DSMC_Vars ,ONLY: PolyatomMolDSMC +USE MOD_DSMC_Vars ,ONLY: PolyatomMolDSMC, SpecXSec USE MOD_DSMC_SpecXSec ,ONLY: InterpolateVibRelaxProb ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -2868,7 +2861,7 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) END IF IF((DSMC%VibRelaxProb.GE.0.0).AND.(DSMC%VibRelaxProb.LE.1.0)) THEN - IF(XSec_Relaxation.AND.(SpecDSMC(iSpec)%UseCollXSec.OR.SpecDSMC(jSpec)%UseCollXSec)) THEN + IF(SpecDSMC(iSpec)%UseVibXSec.OR.SpecDSMC(jSpec)%UseVibXSec) THEN CollisionEnergy = 0.5 * CollInf%MassRed(Coll_pData(iPair)%PairType) * Coll_pData(iPair)%CRela2 ProbVib = InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) ELSE @@ -2895,6 +2888,15 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) ,'Error! Model for vibrational relaxation undefined:',RealInfoOpt=DSMC%VibRelaxProb) END IF +IF(DSMC%CalcQualityFactors) THEN + DSMC%CalcVibProb(iSpec,1) = DSMC%CalcVibProb(iSpec,1) + ProbVib + DSMC%CalcVibProb(iSpec,3) = DSMC%CalcVibProb(iSpec,3) + 1 + IF(XSec_Relaxation) THEN + SpecXSec(iSpec,jSpec)%VibProb(1) = SpecXSec(iSpec,jSpec)%VibProb(1) + ProbVib + SpecXSec(iSpec,jSpec)%VibProb(2) = SpecXSec(iSpec,jSpec)%VibProb(2) + 1.0 + END IF +END IF + END SUBROUTINE DSMC_calc_P_vib diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index f5ebba79d..9cd30cad3 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -357,6 +357,9 @@ SUBROUTINE DefineParametersDSMC() CALL prms%CreateLogicalOption( 'Part-Species[$]-UseCollXSec' & ,'Utilize collision cross sections for the determination of collision probabilities' & ,'.FALSE.', numberedmulti=.TRUE.) +CALL prms%CreateLogicalOption( 'Part-Species[$]-UseVibXSec' & + ,'Utilize vibrational cross sections for the determination of relaxation probabilities' & + ,'.FALSE.', numberedmulti=.TRUE.) CALL prms%CreateStringOption( 'Particles-CollXSec-Database', 'File name for the collision cross section database. Container '//& 'should be named with species pair (e.g. "Ar-electron"). The '//& 'first column shall contain the energy in eV and the second '//& @@ -365,9 +368,6 @@ SUBROUTINE DefineParametersDSMC() ,'Utilize the null collision method for the determination of the number of pairs '//& 'based on the maximum collision frequency and time step' & ,'.TRUE.') -CALL prms%CreateLogicalOption( 'Particles-CollXSec-Relaxation' & - ,'Utilize cross sections for vibrational relaxation probabilities' & - ,'.FALSE.') END SUBROUTINE DefineParametersDSMC @@ -655,11 +655,17 @@ SUBROUTINE InitDSMC() DO iSpec = 1, nSpecies WRITE(UNIT=hilf,FMT='(I0)') iSpec SpecDSMC(iSpec)%UseCollXSec=GETLOGICAL('Part-Species'//TRIM(hilf)//'-UseCollXSec') + SpecDSMC(iSpec)%UseVibXSec=GETLOGICAL('Part-Species'//TRIM(hilf)//'-UseVibXSec') IF(SpecDSMC(iSpec)%UseCollXSec.AND.BGGas%BackgroundSpecies(iSpec)) THEN CALL Abort(& __STAMP__& ,'ERROR: Please supply the collision cross-section data for the particle species and NOT the background species!') END IF + IF(SpecDSMC(iSpec)%UseVibXSec.AND.(.NOT.SpecDSMC(iSpec)%UseCollXSec)) THEN + CALL Abort(& + __STAMP__& + ,'ERROR: Use of vibrational cross-section data requires to collisional cross-sections, -UseCollXSec = T!') + END IF END DO IF(ANY(SpecDSMC(:)%UseCollXSec)) THEN UseMCC = .TRUE. @@ -1277,10 +1283,8 @@ SUBROUTINE InitDSMC() ALLOCATE(DSMC%QualityFacSampVib(1:nElems,1,1:2)) ALLOCATE(DSMC%QualityFacSampVibSamp(1:nElems,1,2)) END IF - ALLOCATE(DSMC%CalcVibProb(1:nSpecies,1:3)) DSMC%QualityFacSampVib = 0. DSMC%QualityFacSampVibSamp = 0 - DSMC%CalcVibProb = 0. END IF CALL SetVarVibProb2Elems() ! CHeck if DSMC%InstantTransTemp is still needed @@ -1303,7 +1307,17 @@ SUBROUTINE InitDSMC() DSMC%QualityFacSampRotSamp = 0 DSMC%CalcRotProb = 0. END IF - + IF(DSMC%CalcQualityFactors) THEN + ALLOCATE(DSMC%CalcVibProb(1:nSpecies,1:3)) + DSMC%CalcVibProb = 0. + IF(XSec_Relaxation) THEN + DO iSpec=1,nSpecies + DO jSpec=1,nSpecies + SpecXSec(iSpec,jSpec)%VibProb = 0. + END DO + END DO + END IF + END IF END IF !CollisMode.GT.0 ! If field ionization is used without chemical reactions due to collisions (DSMC chemistry) diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index ddc62177f..e3ac8d5cf 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -44,10 +44,10 @@ SUBROUTINE DSMC_main(DoElement) USE MOD_DSMC_BGGas ,ONLY: BGGas_InsertParticles, DSMC_pairing_bggas, MCC_pairing_bggas, BGGas_DeleteParticles USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_DSMC_Vars ,ONLY: DSMC_RHS, DSMC, CollInf, DSMCSumOfFormedParticles, BGGas, CollisMode -USE MOD_DSMC_Vars ,ONLY: ChemReac, UseMCC +USE MOD_DSMC_Vars ,ONLY: ChemReac, UseMCC, XSec_Relaxation, SpecXSec USE MOD_DSMC_Analyze ,ONLY: CalcMeanFreePath, SummarizeQualityFactors, DSMCMacroSampling USE MOD_DSMC_Collis ,ONLY: FinalizeCalcVibRelaxProb, InitCalcVibRelaxProb -USE MOD_Particle_Vars ,ONLY: PEM, PDM, WriteMacroVolumeValues, Symmetry2D +USE MOD_Particle_Vars ,ONLY: PEM, PDM, WriteMacroVolumeValues, Symmetry2D, nSpecies USE MOD_DSMC_Analyze ,ONLY: DSMCHO_data_sampling,CalcSurfaceValues, WriteDSMCHOToHDF5, CalcGammaVib USE MOD_DSMC_ParticlePairing ,ONLY: DSMC_pairing_standard, DSMC_pairing_octree, DSMC_pairing_quadtree USE MOD_DSMC_CollisionProb ,ONLY: DSMC_prob_calc @@ -69,6 +69,7 @@ SUBROUTINE DSMC_main(DoElement) #if USE_LOADBALANCE REAL :: tLBStart #endif /*USE_LOADBALANCE*/ +INTEGER :: iSpec, jSpec !=================================================================================================================================== ! Reset the right-hand side (DoElement: coupled BGK/FP-DSMC simulations, which might utilize the RHS) @@ -95,7 +96,14 @@ SUBROUTINE DSMC_main(DoElement) DSMC%CollProbMax = 0.0; DSMC%CollProbMean = 0.0; DSMC%CollProbMeanCount = 0; DSMC%CollSepDist = 0.0; DSMC%CollSepCount = 0 DSMC%MeanFreePath = 0.0; DSMC%MCSoverMFP = 0.0 IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. - IF(DSMC%VibRelaxProb.EQ.2) DSMC%CalcVibProb = 0. + DSMC%CalcVibProb = 0. + IF(XSec_Relaxation) THEN + DO iSpec=1,nSpecies + DO jSpec=1,nSpecies + SpecXSec(iSpec,jSpec)%VibProb = 0. + END DO + END DO + END IF END IF IF (CollisMode.NE.0) THEN ChemReac%nPairForRec = 0 diff --git a/src/particles/dsmc/dsmc_species_xsec.f90 b/src/particles/dsmc/dsmc_species_xsec.f90 index a2741fc6c..6033b4c92 100644 --- a/src/particles/dsmc/dsmc_species_xsec.f90 +++ b/src/particles/dsmc/dsmc_species_xsec.f90 @@ -31,8 +31,7 @@ MODULE MOD_DSMC_SpecXSec SUBROUTINE MCC_Init() !=================================================================================================================================== -!> Initialization of the MCC algorithm: Read-in of the collision cross-section database and calculation of the maximal collision -!> frequency for the null collision method. +!> Read-in of the collision and vibrational cross-section database and initialization of the null collision method. !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -51,7 +50,7 @@ SUBROUTINE MCC_Init() XSec_Database = TRIM(GETSTR('Particles-CollXSec-Database')) XSec_NullCollision = GETLOGICAL('Particles-CollXSec-NullCollision') -XSec_Relaxation = GETLOGICAL('Particles-CollXSec-Relaxation') +XSec_Relaxation = .FALSE. IF(TRIM(XSec_Database).EQ.'none') THEN CALL abort(& @@ -65,6 +64,31 @@ SUBROUTINE MCC_Init() ,'ERROR: Usage of read-in collision cross-sections only possible with a background gas!') END IF +! ALLOCATE(SpecXSec(CollInf%NumCase)) + +! DO iSpec = 1, nSpecies +! DO jSpec = iSpec, nSpecies +! iCase = CollInf%Coll_Case(iSpec,jSpec) +! ! Skip species, which shall not be treated with collision cross-sections +! IF(.NOT.SpecDSMC(iSpec)%UseCollXSec.AND..NOT.SpecDSMC(jSpec)%UseCollXSec) CYCLE +! ! Read-in cross-section data for collisions of particles, allocating CollXSecData within the following routine +! CALL ReadCollXSec(iCase, iSpec, jSpec) +! ! Store the energy value in J (read-in was in eV) +! SpecXSec(iCase)%CollXSecData(1,:) = SpecXSec(iCase)%CollXSecData(1,:) * ElementaryCharge +! IF(XSec_NullCollision) THEN +! ! Determine the maximum collision frequency for the null collision method +! CALL DetermineNullCollProb(iSpec,jSpec) +! TotalProb = TotalProb + SpecXSec(iCase)%ProbNull +! IF(TotalProb.GT.1.0) THEN +! CALL abort(& +! __STAMP__& +! ,'ERROR: Total null collision probability is above unity. Please reduce the time step! Probability is: '& +! ,RealInfoOpt=TotalProb) +! END IF +! END IF +! END DO +! END DO + ALLOCATE(SpecXSec(nSpecies,nSpecies)) DO iSpec = 1,nSpecies @@ -89,8 +113,11 @@ SUBROUTINE MCC_Init() ,RealInfoOpt=TotalProb) END IF END IF - IF((SpecDSMC(jSpec)%InterID.EQ.2).OR.(SpecDSMC(jSpec)%InterID.EQ.20)) THEN - IF(XSec_Relaxation) THEN + IF(SpecDSMC(iSpec)%UseVibXSec) THEN + XSec_Relaxation = .TRUE. + ! Perform read-in if the current species is molecular or the collision partner + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20).OR.(SpecDSMC(jSpec)%InterID.EQ.2) & + .OR.(SpecDSMC(jSpec)%InterID.EQ.20)) THEN ! Read-in the vibrational levels CALL ReadVibXSec(iSpec, jSpec) nVib = SIZE(SpecXSec(iSpec,jSpec)%VibMode) @@ -118,11 +145,12 @@ END SUBROUTINE MCC_Init SUBROUTINE ReadCollXSec(iSpec,jSpec) !=================================================================================================================================== !> Read-in of collision cross-sections from a given database. Dataset name is composed of SpeciesName-SpeciesName (e.g. Ar-electron) +!> Trying to swap the species indices if dataset not found. !=================================================================================================================================== ! use module USE MOD_io_hdf5 USE MOD_Globals -USE MOD_DSMC_Vars ,ONLY: XSec_Database, SpecXSec, SpecDSMC, XSec_Relaxation +USE MOD_DSMC_Vars ,ONLY: XSec_Database, SpecXSec, SpecDSMC USE MOD_HDF5_Input ,ONLY: DatasetExists ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -172,7 +200,7 @@ SUBROUTINE ReadCollXSec(iSpec,jSpec) ! get size CALL H5SGET_SIMPLE_EXTENT_DIMS_F(FileSpace, dims, SizeMax, err) -IF(XSec_Relaxation) THEN +IF(SpecDSMC(iSpec)%UseVibXSec) THEN nVar = 3 ELSE nVar = 2 @@ -193,7 +221,8 @@ END SUBROUTINE ReadCollXSec SUBROUTINE ReadVibXSec(iSpec,jSpec) !=================================================================================================================================== -!> Read-in of collision cross-sections from a given database. Dataset name is composed of SpeciesName-SpeciesName (e.g. Ar-electron) +!> Read-in of vibrational cross-sections from a given database. Using the effective cross-section database to check whether the +!> group exists. Trying to swap the species indices if dataset not found. !=================================================================================================================================== ! use module USE MOD_io_hdf5 @@ -209,7 +238,7 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -CHARACTER(LEN=64) :: dsetname, groupname, spec_pair +CHARACTER(LEN=64) :: dsetname, groupname, spec_pair, dsetname2 INTEGER :: err INTEGER(HSIZE_T), DIMENSION(2) :: dims,sizeMax INTEGER(HID_T) :: file_id_dsmc ! File identifier @@ -219,6 +248,7 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) INTEGER(SIZE_T) :: size ! Size of name INTEGER(HSIZE_T) :: iVib ! Index INTEGER :: storage, nVib, max_corder +LOGICAL :: DataSetFound !=================================================================================================================================== spec_pair = TRIM(SpecDSMC(jSpec)%Name)//'-'//TRIM(SpecDSMC(iSpec)%Name) SWRITE(UNIT_StdOut,'(A)') 'Read vibrational excitation cross section for '//TRIM(spec_pair)//' from '//TRIM(XSec_Database) @@ -228,6 +258,25 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) ! Open the file. CALL H5FOPEN_F (TRIM(XSec_Database), H5F_ACC_RDONLY_F, file_id_dsmc, err) +! Check if the species container is available +dsetname = TRIM('/'//TRIM(spec_pair)//'/EFFECTIVE') +CALL DatasetExists(File_ID_DSMC,TRIM(dsetname),DataSetFound) + +! Check if the dataset exist +IF(.NOT.DataSetFound) THEN + ! Try to swap the species names + dsetname = TRIM(SpecDSMC(iSpec)%Name)//'-'//TRIM(SpecDSMC(jSpec)%Name)//'/EFFECTIVE' + CALL DatasetExists(File_ID_DSMC,TRIM(dsetname),DataSetFound) + IF(DataSetFound) THEN + spec_pair = TRIM(SpecDSMC(iSpec)%Name)//'-'//TRIM(SpecDSMC(jSpec)%Name) + ELSE + dsetname2 = TRIM(spec_pair)//'/EFFECTIVE' + CALL abort(& + __STAMP__& + ,'Dataset not found: ['//TRIM(dsetname2)//'] or ['//TRIM(dsetname)//'] not found in ['//TRIM(XSec_Database)//']') + END IF +END IF + groupname = TRIM('/'//TRIM(spec_pair)//'/VIBRATION/') CALL H5GOPEN_F(file_id_dsmc,TRIM(groupname), group_id, err) @@ -353,7 +402,7 @@ END FUNCTION InterpolateCrossSection PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) !=================================================================================================================================== -!> +!> Interpolate the vibrational cross-section data for specific vibrational level at the given collision energy !> Note: Requires the data to be sorted by ascending energy values !> Assumption: First species given is the particle species, second species input is the backgroung gas species !=================================================================================================================================== @@ -404,7 +453,7 @@ END FUNCTION InterpolateCrossSection_Vib PURE REAL FUNCTION InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) !=================================================================================================================================== -!> +!> Interpolate the vibrational relaxation probability at the same intervals as the effective collision cross-section !> Note: Requires the data to be sorted by ascending energy values !> Assumption: First species given is the particle species, second species input is the backgroung gas species !=================================================================================================================================== diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 423a93108..95bff301d 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -176,6 +176,8 @@ MODULE MOD_DSMC_Vars ! Collision cross-sections for MCC LOGICAL :: UseCollXSec ! Flag if the collisions of the species with a background gas should be ! treated with read-in collision cross-section (currently only with BGG) + LOGICAL :: UseVibXSec ! Flag if the vibrational relaxation probability should be treated, + ! using read-in cross-sectional data (currently only with BGG) END TYPE tSpeciesDSMC TYPE(tSpeciesDSMC), ALLOCATABLE :: SpecDSMC(:) ! Species DSMC params (nSpec) @@ -194,6 +196,7 @@ MODULE MOD_DSMC_Vars ! null collision method of MCC REAL :: MaxCollFreq ! Maximal collision frequency at certain energy level and cross-section TYPE(tXSecVibMode),ALLOCATABLE :: VibMode(:) ! + REAL :: VibProb(2) END TYPE tSpeciesXSec TYPE(tSpeciesXSec), ALLOCATABLE :: SpecXSec(:,:) ! Species cross-section related data (nSpec,nSpec). First column is used From 3bfa82ffbe83e726235da3760efda01fa2780b5c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 30 Apr 2020 01:03:20 +0200 Subject: [PATCH 07/74] Bugfix missing varibale and init --- REGGIE.md | 25 +++++++++--------- .../DSMC.ini | 0 .../DSMCSpecies_electronic_state_full_Data.h5 | Bin .../Database_Tvib_00059300_ref.csv | 0 .../Database_Tvib_00083900_ref.csv | 0 .../Database_Tvib_00119000_ref.csv | 0 .../Database_Tvib_00157000_ref.csv | 0 .../Database_Tvib_00205000_ref.csv | 0 .../Database_Tvib_00245000_ref.csv | 0 .../Database_Tvib_00297000_ref.csv | 0 .../Database_Tvib_00351000_ref.csv | 0 .../Database_Tvib_00419000_ref.csv | 0 .../Database_Tvib_00593000_ref.csv | 0 .../Database_Tvib_00676000_ref.csv | 0 .../Database_Tvib_00773000_ref.csv | 0 .../Database_Tvib_00859000_ref.csv | 0 .../Database_Tvib_00938000_ref.csv | 0 .../Database_Tvib_01030000_ref.csv | 0 .../Database_Tvib_01130000_ref.csv | 0 .../Database_Tvib_01260000_ref.csv | 0 .../Database_Tvib_01450000_ref.csv | 0 .../Database_Tvib_01680000_ref.csv | 0 .../Database_Tvib_02050000_ref.csv | 0 .../Database_Tvib_02450000_ref.csv | 0 .../Database_Tvib_02970000_ref.csv | 0 .../Database_Tvib_04190000_ref.csv | 0 .../Database_Tvib_05930000_ref.csv | 0 .../Figure_Verification.png | Bin ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin .../PartAnalyze_ref.csv | 0 .../analyze.ini | 0 .../command_line.ini | 0 .../cube_mesh.h5 | Bin .../get_values.py | 0 .../hopr.ini | 0 .../parameter.ini | 0 .../readme.md | 0 src/particles/analyze/particle_analyze.f90 | 9 ++++--- src/particles/dsmc/dsmc_species_xsec.f90 | 10 ++++--- 39 files changed, 25 insertions(+), 19 deletions(-) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/DSMC.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/DSMCSpecies_electronic_state_full_Data.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00059300_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00083900_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00119000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00157000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00205000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00245000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00297000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00351000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00419000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00593000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00676000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00773000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00859000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_00938000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_01030000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_01130000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_01260000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_01450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_01680000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_02050000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_02450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_02970000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_04190000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Database_Tvib_05930000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/Figure_Verification.png (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/PartAnalyze_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/analyze.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/command_line.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/cube_mesh.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/get_values.py (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/hopr.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/parameter.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{CHEM_MCC_XSec_MultiSpec => MCC_BGG_MultiSpec_XSecData}/readme.md (100%) diff --git a/REGGIE.md b/REGGIE.md index 020dff5ac..9f4051f3b 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -173,18 +173,18 @@ Testing more complex DSMC routines with reservoir (heat bath) simulations: [Link | 1 | CHEM_BGG_MultiSpec_TCE_Air_5Spec | | Multi-species background gas: TCE rates for N2/O2 + N/O dissociation and N2 + O exchange | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_BGG_MultiSpec_TCE_Air_5Spec/readme.md) | | 2 | CHEM_DeleteProduct | | Reaction products are deleted after the chemical reaction | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_DeleteProduct/readme.md) | | 3 | CHEM_EQUI_TCE_Air_5Spec | | Reservoir of high-temperature air (N2, O2) dissociating | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_EQUI_TCE_Air_5Spec/readme.md) | -| 4 | CHEM_MCC_XSec_MultiSpec | | Multi-species background gas: MCC cross-sections for neutral-electrons in CO2-N2-He | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/readme.md) | -| 5 | CHEM_QK_multi-ionization_C_to_C6+ | | QK impact ionization, from neutral to fully ionized | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_QK_multi-ionization_C_to_C6+/readme.md) | -| 6 | CHEM_RATES_BGG_diss_CO2 | | Background gas: TCE rates for a dissociation: CO2 + CO/O <-> CO + O + CO/O | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_diss_CO2/readme.md) | -| 7 | CHEM_RATES_BGG_TCE_diss_QK_ion_CO2 | | Background gas: TCE rates for a CO2 + e dissociation/ionization | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_TCE_diss_QK_ion_CO2/readme.md) | -| 8 | CHEM_RATES_diss_recomb_CH4 | | TCE rates for a (non-linear) polyatomic dissociation + recombination: CH4 + M <-> CH3 + H + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CH4/readme.md) | -| 9 | CHEM_RATES_diss_recomb_CO2 | | TCE rates for a (linear) polyatomic dissociation + recombination: CO2 + M <-> CO + O + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CO2/readme.md) | -| 10 | CHEM_RATES_diss_recomb_N2 | | TCE rates for a diatomic dissociation + recombination: N2 + M <-> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_N2/readme.md) | -| 11 | CHEM_RATES_exchange_CH4_H | | TCE rates for an exchange: CH4 + H <-> CH3 + H2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_exchange_CH3/readme.md) | -| 12 | CHEM_RATES_QK_diss_ion_N2 | | QK rates for a dissociation and ionization : N2 + M -> N + N + M and N2 + M -> N2+ e- + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_ion_N2/readme.md) | -| 13 | CHEM_RATES_QK_diss_N2 | | QK rates for a dissociation : N2 + M -> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_N2/readme.md) | -| 14 | CHEM_RATES_QK_ionization-recomb_H | | QK rates for ionization and recombination: H + e <-> HIon + e + e | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_ionization-recomb_H/readme.md) | -| 15 | CHEM_RATES_QK_recomb_N2 | | QK rates for a recombination: N + N + M -> N2 + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | +| 4 | CHEM_QK_multi-ionization_C_to_C6+ | | QK impact ionization, from neutral to fully ionized | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_QK_multi-ionization_C_to_C6+/readme.md) | +| 5 | CHEM_RATES_BGG_diss_CO2 | | Background gas: TCE rates for a dissociation: CO2 + CO/O <-> CO + O + CO/O | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_diss_CO2/readme.md) | +| 6 | CHEM_RATES_BGG_TCE_diss_QK_ion_CO2 | | Background gas: TCE rates for a CO2 + e dissociation/ionization | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_TCE_diss_QK_ion_CO2/readme.md) | +| 7 | CHEM_RATES_diss_recomb_CH4 | | TCE rates for a (non-linear) polyatomic dissociation + recombination: CH4 + M <-> CH3 + H + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CH4/readme.md) | +| 8 | CHEM_RATES_diss_recomb_CO2 | | TCE rates for a (linear) polyatomic dissociation + recombination: CO2 + M <-> CO + O + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CO2/readme.md) | +| 9 | CHEM_RATES_diss_recomb_N2 | | TCE rates for a diatomic dissociation + recombination: N2 + M <-> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_N2/readme.md) | +| 10 | CHEM_RATES_exchange_CH4_H | | TCE rates for an exchange: CH4 + H <-> CH3 + H2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_exchange_CH3/readme.md) | +| 11 | CHEM_RATES_QK_diss_ion_N2 | | QK rates for a dissociation and ionization : N2 + M -> N + N + M and N2 + M -> N2+ e- + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_ion_N2/readme.md) | +| 12 | CHEM_RATES_QK_diss_N2 | | QK rates for a dissociation : N2 + M -> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_N2/readme.md) | +| 13 | CHEM_RATES_QK_ionization-recomb_H | | QK rates for ionization and recombination: H + e <-> HIon + e + e | nProcs=1 | | [Link](regressioncheck/checks/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/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | +| 15 | MCC_BGG_MultiSpec_XSecData | | Multi-species background gas: MCC cross-sections for neutral-electrons in CO2-N2-He | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md) | | 16 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | | 17 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | | 18 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | @@ -193,6 +193,7 @@ Testing more complex DSMC routines with reservoir (heat bath) simulations: [Link | 21 | VarRelaxProb_cold | | Relaxation of a cold reservoir of N2 with variable relaxation probabilities | nProcs=1,2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_cold/readme.md) | | 22 | VarRelaxProb_hot | | Relaxation of a hot reservoir of N2 and O2 with variable relaxation probabilities | nProcs=2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_hot/readme.md) | | 23 | VarRelaxProb_Restart | | Initial Autorestart with variable relaxation probabilities | nProcs=1,2 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_Restart/readme.md) | +| 24 | VarRelaxProb_XSecData | | Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/readme.md) | #### NIG_MacroBody diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMC.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/DSMC.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMC.ini diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMCSpecies_electronic_state_full_Data.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/DSMCSpecies_electronic_state_full_Data.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMCSpecies_electronic_state_full_Data.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00059300_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00059300_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00059300_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00083900_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00083900_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00083900_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00119000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00119000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00119000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00157000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00157000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00157000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00205000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00205000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00205000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00245000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00245000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00245000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00297000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00297000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00297000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00351000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00351000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00351000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00419000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00419000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00419000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00593000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00593000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00593000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00676000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00676000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00676000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00773000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00773000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00773000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00859000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00859000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00859000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00938000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_00938000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00938000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01030000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01030000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01030000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01130000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01130000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01130000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01260000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01260000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01260000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01680000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_01680000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01680000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02050000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02050000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02050000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02970000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_02970000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02970000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_04190000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_04190000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_04190000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_05930000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Database_Tvib_05930000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_05930000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Figure_Verification.png b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Figure_Verification.png similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/Figure_Verification.png rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Figure_Verification.png diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/PartAnalyze_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/PartAnalyze_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/PartAnalyze_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/PartAnalyze_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/analyze.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/analyze.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/analyze.ini diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/command_line.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/command_line.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/command_line.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/command_line.ini diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/cube_mesh.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/cube_mesh.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/cube_mesh.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/cube_mesh.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/get_values.py similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/get_values.py rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/get_values.py diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/hopr.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/hopr.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/hopr.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/hopr.ini diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/parameter.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/parameter.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/parameter.ini diff --git a/regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/readme.md b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/CHEM_MCC_XSec_MultiSpec/readme.md rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index 7f39a4b64..d17b18c91 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -682,6 +682,7 @@ SUBROUTINE AnalyzeParticles(Time) #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) REAL :: MaxCollProb, MeanCollProb, MeanFreePath REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2),VibRelaxProbSpec(nSpecies,nSpecies) +INTEGER :: jSpec #endif #if USE_MPI #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300||(PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) @@ -692,7 +693,7 @@ SUBROUTINE AnalyzeParticles(Time) #endif /*USE_MPI*/ REAL, ALLOCATABLE :: CRate(:), RRate(:) #if (PP_TimeDiscMethod ==42) -INTEGER :: iCase,jSpec +INTEGER :: iCase #ifdef CODE_ANALYZE CHARACTER(LEN=64) :: DebugElectronicStateFilename INTEGER :: ii, iunit @@ -2281,11 +2282,13 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) IF(SUM(DSMC%CalcVibProb(1:nSpecies,3)).GT.0) THEN VibRelaxProb(2) = SUM(DSMC%CalcVibProb(1:nSpecies,1))/SUM(DSMC%CalcVibProb(1:nSpecies,3)) END IF + VibRelaxProbSpec = 0. IF(XSec_Relaxation) THEN DO iSpec=1,nSpecies DO jSpec=1,nSpecies - IF(SpecXSec(iSpec,jSpec)%VibProb(2).GT.0) & - VibRelaxProbSpec(iSpec,jSpec)=SpecXSec(iSpec,jSpec)%VibProb(1)/SpecXSec(iSpec,jSpec)%VibProb(2) + IF(SpecXSec(iSpec,jSpec)%VibProb(2).GT.0.0) THEN + VibRelaxProbSpec(iSpec,jSpec)=SpecXSec(iSpec,jSpec)%VibProb(1)/SpecXSec(iSpec,jSpec)%VibProb(2) + END IF END DO END DO END IF diff --git a/src/particles/dsmc/dsmc_species_xsec.f90 b/src/particles/dsmc/dsmc_species_xsec.f90 index 6033b4c92..1c8cf7e07 100644 --- a/src/particles/dsmc/dsmc_species_xsec.f90 +++ b/src/particles/dsmc/dsmc_species_xsec.f90 @@ -128,9 +128,11 @@ SUBROUTINE MCC_Init() ! Interpolate the vibrational cross section at the energy levels of the effective collision cross section and sum-up the ! vibrational probability (vibrational cross-section divided by the effective) DO iStep = 1, nStep - SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) = SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) + & - InterpolateCrossSection_Vib(iSpec,jSpec,iVib,SpecXSec(iSpec,jSpec)%CollXSecData(1,iStep)) & - / SpecXSec(iSpec,jSpec)%CollXSecData(2,iStep) + IF(SpecXSec(iSpec,jSpec)%CollXSecData(2,iStep).GT.0.0) THEN + SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) = SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) + & + InterpolateCrossSection_Vib(iSpec,jSpec,iVib,SpecXSec(iSpec,jSpec)%CollXSecData(1,iStep)) & + / SpecXSec(iSpec,jSpec)%CollXSecData(2,iStep) + END IF END DO END DO END IF @@ -207,7 +209,7 @@ SUBROUTINE ReadCollXSec(iSpec,jSpec) END IF ALLOCATE(SpecXSec(iSpec,jSpec)%CollXSecData(nVar,dims(2))) -SpecXSec(iSpec,jSpec)%CollXSecData(nVar,dims(2)) = 0. +SpecXSec(iSpec,jSpec)%CollXSecData = 0. ! read data CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iSpec,jSpec)%CollXSecData(1:2,1:dims(2)), dims, err) From c284dfbf161215d957d162d9dc9091d5bbb80bd2 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 30 Apr 2020 13:25:31 +0200 Subject: [PATCH 08/74] Bugfix MPI=OFF in particle analyze --- src/particles/analyze/particle_analyze.f90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index d17b18c91..9d32f1893 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -2183,9 +2183,7 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode, SpecXSec, XSec_Relaxation USE MOD_Mesh_Vars ,ONLY: nElems, nGlobalElems -#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- From 4db5afebd4de960dd256593de7308555f0717834 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 1 May 2020 16:46:12 +0200 Subject: [PATCH 09/74] Bugfix in MCC pairing: always get random background gas particle --- src/particles/dsmc/dsmc_bg_gas.f90 | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index a87a90cd7..c2d1215d4 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -501,19 +501,13 @@ SUBROUTINE MCC_pairing_bggas(iElem) DO jSpec = 1, nSpecies ! Loop over all background species IF(BGGas%BackgroundSpecies(jSpec)) THEN DO iLoop = 1, SpecPairNum(iSpec,jSpec) ! Loop over all the number of pairs required for this species pairing - ! Getting the index of the simulation particle - IF(SpecDSMC(iSpec)%UseCollXSec.AND.XSec_NullCollision) THEN - ! MCC: Choosing random particles from the available number of particles - IF(SpecPartNum(iSpec).GT.0) THEN - CALL RANDOM_NUMBER(iRan) - RandomPart = INT(SpecPartNum(iSpec)*iRan) + 1 - PartIndex = iPartIndexSpec(RandomPart,iSpec) - iPartIndexSpec(RandomPart, iSpec) = iPartIndexSpec(SpecPartNum(iSpec),iSpec) - SpecPartNum(iSpec) = SpecPartNum(iSpec) - 1 - END IF - ELSE - ! Regular: Pairing every particle with a background gas particle - PartIndex = iPartIndexSpec(iLoop,iSpec) + ! Choosing random particles from the available number of particles, getting the index of the simulation particle + IF(SpecPartNum(iSpec).GT.0) THEN + CALL RANDOM_NUMBER(iRan) + RandomPart = INT(SpecPartNum(iSpec)*iRan) + 1 + PartIndex = iPartIndexSpec(RandomPart,iSpec) + iPartIndexSpec(RandomPart, iSpec) = iPartIndexSpec(SpecPartNum(iSpec),iSpec) + SpecPartNum(iSpec) = SpecPartNum(iSpec) - 1 END IF ! Creating a new background gas particle DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 From a980d67a2f9492cf62c396b4b857598fcb0ebf92 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 1 May 2020 16:52:00 +0200 Subject: [PATCH 10/74] Renamed MCC XSec reggies --- REGGIE.md | 52 +++++++++--------- .../DSMC.ini | 0 .../DSMCSpecies_electronic_state_full_Data.h5 | Bin .../Database_Tvib_00059300_ref.csv | 0 .../Database_Tvib_00083900_ref.csv | 0 .../Database_Tvib_00119000_ref.csv | 0 .../Database_Tvib_00157000_ref.csv | 0 .../Database_Tvib_00205000_ref.csv | 0 .../Database_Tvib_00245000_ref.csv | 0 .../Database_Tvib_00297000_ref.csv | 0 .../Database_Tvib_00351000_ref.csv | 0 .../Database_Tvib_00419000_ref.csv | 0 .../Database_Tvib_00593000_ref.csv | 0 .../Database_Tvib_00676000_ref.csv | 0 .../Database_Tvib_00773000_ref.csv | 0 .../Database_Tvib_00859000_ref.csv | 0 .../Database_Tvib_00938000_ref.csv | 0 .../Database_Tvib_01030000_ref.csv | 0 .../Database_Tvib_01130000_ref.csv | 0 .../Database_Tvib_01260000_ref.csv | 0 .../Database_Tvib_01450000_ref.csv | 0 .../Database_Tvib_01680000_ref.csv | 0 .../Database_Tvib_02050000_ref.csv | 0 .../Database_Tvib_02450000_ref.csv | 0 .../Database_Tvib_02970000_ref.csv | 0 .../Database_Tvib_04190000_ref.csv | 0 .../Database_Tvib_05930000_ref.csv | 0 .../Figure_Verification.png | Bin ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin .../PartAnalyze_ref.csv | 0 .../analyze.ini | 0 .../command_line.ini | 0 .../cube_mesh.h5 | Bin .../get_values.py | 0 .../hopr.ini | 0 .../parameter.ini | 0 .../readme.md | 0 .../DSMC.ini | 0 .../DSMCSpecies_electronic_state_full_Data.h5 | Bin .../Database_Tvib_00059300_ref.csv | 0 .../Database_Tvib_00083900_ref.csv | 0 .../Database_Tvib_00119000_ref.csv | 0 .../Database_Tvib_00157000_ref.csv | 0 .../Database_Tvib_00205000_ref.csv | 0 .../Database_Tvib_00245000_ref.csv | 0 .../Database_Tvib_00297000_ref.csv | 0 .../Database_Tvib_00351000_ref.csv | 0 .../Database_Tvib_00419000_ref.csv | 0 .../Database_Tvib_00593000_ref.csv | 0 .../Database_Tvib_00676000_ref.csv | 0 .../Database_Tvib_00773000_ref.csv | 0 .../Database_Tvib_00859000_ref.csv | 0 .../Database_Tvib_00938000_ref.csv | 0 .../Database_Tvib_01030000_ref.csv | 0 .../Database_Tvib_01130000_ref.csv | 0 .../Database_Tvib_01260000_ref.csv | 0 .../Database_Tvib_01450000_ref.csv | 0 .../Database_Tvib_01680000_ref.csv | 0 .../Database_Tvib_02050000_ref.csv | 0 .../Database_Tvib_02450000_ref.csv | 0 .../Database_Tvib_02970000_ref.csv | 0 .../Database_Tvib_04190000_ref.csv | 0 .../Database_Tvib_05930000_ref.csv | 0 .../Figure_Verification.png | Bin ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin .../analyze.ini | 0 .../command_line.ini | 0 .../cube_mesh.h5 | Bin .../get_values.py | 0 .../hopr.ini | 0 .../parameter.ini | 0 .../readme.md | 0 72 files changed, 26 insertions(+), 26 deletions(-) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/DSMC.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/DSMCSpecies_electronic_state_full_Data.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00059300_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00083900_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00119000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00157000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00205000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00245000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00297000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00351000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00419000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00593000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00676000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00773000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00859000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_00938000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_01030000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_01130000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_01260000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_01450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_01680000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_02050000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_02450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_02970000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_04190000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Database_Tvib_05930000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/Figure_Verification.png (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/PartAnalyze_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/analyze.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/command_line.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/cube_mesh.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/get_values.py (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/hopr.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/parameter.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{MCC_BGG_MultiSpec_XSecData => MCC_BGG_MultiSpec_XSec}/readme.md (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/DSMC.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/DSMCSpecies_electronic_state_full_Data.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00059300_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00083900_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00119000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00157000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00205000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00245000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00297000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00351000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00419000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00593000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00676000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00773000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00859000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_00938000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_01030000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_01130000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_01260000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_01450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_01680000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_02050000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_02450000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_02970000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_04190000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Database_Tvib_05930000_ref.csv (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/Figure_Verification.png (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/analyze.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/command_line.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/cube_mesh.h5 (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/get_values.py (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/hopr.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/parameter.ini (100%) rename regressioncheck/checks/NIG_Reservoir/{VarRelaxProb_XSecData => MCC_BGG_MultiSpec_XSec_Vib}/readme.md (100%) diff --git a/REGGIE.md b/REGGIE.md index 9f4051f3b..1a6b434fd 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -168,32 +168,32 @@ Different dielectric regions in combination with the HDG solver (Poisson's equat Testing more complex DSMC routines with reservoir (heat bath) simulations: [Link CMAKE-CONFIG](regressioncheck/checks/NIG_Reservoir/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :--------------------------------: | :--------------: | :-------------------------------------------------------------------------------------------: | :-----------: | :-----------: | :---------------------------------------------------------------------------------------: | -| 1 | CHEM_BGG_MultiSpec_TCE_Air_5Spec | | Multi-species background gas: TCE rates for N2/O2 + N/O dissociation and N2 + O exchange | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_BGG_MultiSpec_TCE_Air_5Spec/readme.md) | -| 2 | CHEM_DeleteProduct | | Reaction products are deleted after the chemical reaction | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_DeleteProduct/readme.md) | -| 3 | CHEM_EQUI_TCE_Air_5Spec | | Reservoir of high-temperature air (N2, O2) dissociating | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_EQUI_TCE_Air_5Spec/readme.md) | -| 4 | CHEM_QK_multi-ionization_C_to_C6+ | | QK impact ionization, from neutral to fully ionized | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_QK_multi-ionization_C_to_C6+/readme.md) | -| 5 | CHEM_RATES_BGG_diss_CO2 | | Background gas: TCE rates for a dissociation: CO2 + CO/O <-> CO + O + CO/O | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_diss_CO2/readme.md) | -| 6 | CHEM_RATES_BGG_TCE_diss_QK_ion_CO2 | | Background gas: TCE rates for a CO2 + e dissociation/ionization | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_TCE_diss_QK_ion_CO2/readme.md) | -| 7 | CHEM_RATES_diss_recomb_CH4 | | TCE rates for a (non-linear) polyatomic dissociation + recombination: CH4 + M <-> CH3 + H + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CH4/readme.md) | -| 8 | CHEM_RATES_diss_recomb_CO2 | | TCE rates for a (linear) polyatomic dissociation + recombination: CO2 + M <-> CO + O + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CO2/readme.md) | -| 9 | CHEM_RATES_diss_recomb_N2 | | TCE rates for a diatomic dissociation + recombination: N2 + M <-> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_N2/readme.md) | -| 10 | CHEM_RATES_exchange_CH4_H | | TCE rates for an exchange: CH4 + H <-> CH3 + H2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_exchange_CH3/readme.md) | -| 11 | CHEM_RATES_QK_diss_ion_N2 | | QK rates for a dissociation and ionization : N2 + M -> N + N + M and N2 + M -> N2+ e- + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_ion_N2/readme.md) | -| 12 | CHEM_RATES_QK_diss_N2 | | QK rates for a dissociation : N2 + M -> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_N2/readme.md) | -| 13 | CHEM_RATES_QK_ionization-recomb_H | | QK rates for ionization and recombination: H + e <-> HIon + e + e | nProcs=1 | | [Link](regressioncheck/checks/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/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | -| 15 | MCC_BGG_MultiSpec_XSecData | | Multi-species background gas: MCC cross-sections for neutral-electrons in CO2-N2-He | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md) | -| 16 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | -| 17 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | -| 18 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | -| 19 | RELAX_N2 | | Rotational, vibrational, electronic relaxation of N2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2/readme.md) | -| 20 | RELAX_N2Ion | | Rotational, vibrational, electronic relaxation of N2Ion | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2Ion/readme.md) | -| 21 | VarRelaxProb_cold | | Relaxation of a cold reservoir of N2 with variable relaxation probabilities | nProcs=1,2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_cold/readme.md) | -| 22 | VarRelaxProb_hot | | Relaxation of a hot reservoir of N2 and O2 with variable relaxation probabilities | nProcs=2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_hot/readme.md) | -| 23 | VarRelaxProb_Restart | | Initial Autorestart with variable relaxation probabilities | nProcs=1,2 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_Restart/readme.md) | -| 24 | VarRelaxProb_XSecData | | Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :--------------------------------: | :--------------: | :--------------------------------------------------------------------------------------------: | :-----------: | :-----------: | :---------------------------------------------------------------------------------------: | +| 1 | CHEM_BGG_MultiSpec_TCE_Air_5Spec | | Multi-species background gas: TCE rates for N2/O2 + N/O dissociation and N2 + O exchange | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_BGG_MultiSpec_TCE_Air_5Spec/readme.md) | +| 2 | CHEM_DeleteProduct | | Reaction products are deleted after the chemical reaction | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_DeleteProduct/readme.md) | +| 3 | CHEM_EQUI_TCE_Air_5Spec | | Reservoir of high-temperature air (N2, O2) dissociating | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_EQUI_TCE_Air_5Spec/readme.md) | +| 4 | CHEM_QK_multi-ionization_C_to_C6+ | | QK impact ionization, from neutral to fully ionized | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_QK_multi-ionization_C_to_C6+/readme.md) | +| 5 | CHEM_RATES_BGG_diss_CO2 | | Background gas: TCE rates for a dissociation: CO2 + CO/O <-> CO + O + CO/O | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_diss_CO2/readme.md) | +| 6 | CHEM_RATES_BGG_TCE_diss_QK_ion_CO2 | | Background gas: TCE rates for a CO2 + e dissociation/ionization | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_BGG_TCE_diss_QK_ion_CO2/readme.md) | +| 7 | CHEM_RATES_diss_recomb_CH4 | | TCE rates for a (non-linear) polyatomic dissociation + recombination: CH4 + M <-> CH3 + H + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CH4/readme.md) | +| 8 | CHEM_RATES_diss_recomb_CO2 | | TCE rates for a (linear) polyatomic dissociation + recombination: CO2 + M <-> CO + O + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_CO2/readme.md) | +| 9 | CHEM_RATES_diss_recomb_N2 | | TCE rates for a diatomic dissociation + recombination: N2 + M <-> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_diss_recomb_N2/readme.md) | +| 10 | CHEM_RATES_exchange_CH4_H | | TCE rates for an exchange: CH4 + H <-> CH3 + H2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_exchange_CH3/readme.md) | +| 11 | CHEM_RATES_QK_diss_ion_N2 | | QK rates for a dissociation and ionization : N2 + M -> N + N + M and N2 + M -> N2+ e- + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_ion_N2/readme.md) | +| 12 | CHEM_RATES_QK_diss_N2 | | QK rates for a dissociation : N2 + M -> N + N + M | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/CHEM_RATES_QK_diss_N2/readme.md) | +| 13 | CHEM_RATES_QK_ionization-recomb_H | | QK rates for ionization and recombination: H + e <-> HIon + e + e | nProcs=1 | | [Link](regressioncheck/checks/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/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | +| 15 | MCC_BGG_MultiSpec_XSec | | Multi-species background gas: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/readme.md) | +| 24 | MCC_BGG_MultiSpec_XSec_Vib | | Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md) | +| 16 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | +| 17 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | +| 18 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | +| 19 | RELAX_N2 | | Rotational, vibrational, electronic relaxation of N2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2/readme.md) | +| 20 | RELAX_N2Ion | | Rotational, vibrational, electronic relaxation of N2Ion | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2Ion/readme.md) | +| 21 | VarRelaxProb_cold | | Relaxation of a cold reservoir of N2 with variable relaxation probabilities | nProcs=1,2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_cold/readme.md) | +| 22 | VarRelaxProb_hot | | Relaxation of a hot reservoir of N2 and O2 with variable relaxation probabilities | nProcs=2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_hot/readme.md) | +| 23 | VarRelaxProb_Restart | | Initial Autorestart with variable relaxation probabilities | nProcs=1,2 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_Restart/readme.md) | #### NIG_MacroBody diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/DSMC.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMC.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/DSMC.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/DSMCSpecies_electronic_state_full_Data.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/DSMCSpecies_electronic_state_full_Data.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/DSMCSpecies_electronic_state_full_Data.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00059300_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00059300_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00059300_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00059300_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00083900_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00083900_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00083900_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00083900_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00119000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00119000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00119000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00119000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00157000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00157000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00157000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00157000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00205000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00205000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00205000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00205000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00245000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00245000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00245000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00245000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00297000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00297000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00297000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00297000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00351000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00351000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00351000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00351000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00419000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00419000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00419000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00419000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00593000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00593000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00593000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00593000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00676000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00676000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00676000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00676000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00773000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00773000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00773000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00773000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00859000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00859000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00859000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00859000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00938000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00938000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_00938000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_00938000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01030000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01030000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01030000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01030000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01130000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01130000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01130000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01130000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01260000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01260000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01260000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01260000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01680000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01680000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_01680000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_01680000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02050000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02050000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02050000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02050000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02970000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02970000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_02970000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_02970000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_04190000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_04190000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_04190000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_04190000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_05930000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_05930000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Database_Tvib_05930000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Database_Tvib_05930000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Figure_Verification.png b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Figure_Verification.png similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/Figure_Verification.png rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/Figure_Verification.png diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/PartAnalyze_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/PartAnalyze_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/PartAnalyze_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/PartAnalyze_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/analyze.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/command_line.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/command_line.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/command_line.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/command_line.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/cube_mesh.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/cube_mesh.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/cube_mesh.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/cube_mesh.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/get_values.py b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/get_values.py similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/get_values.py rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/get_values.py diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/hopr.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/hopr.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/hopr.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/hopr.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/parameter.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/readme.md similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSecData/readme.md rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/readme.md diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/DSMC.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMC.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/DSMC.ini diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/DSMCSpecies_electronic_state_full_Data.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/DSMCSpecies_electronic_state_full_Data.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/DSMCSpecies_electronic_state_full_Data.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00059300_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00059300_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00083900_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00083900_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00119000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00119000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00157000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00157000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00157000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00157000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00205000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00205000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00205000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00205000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00245000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00245000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00245000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00245000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00297000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00297000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00297000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00297000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00351000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00351000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00351000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00351000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00419000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00419000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00419000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00419000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00593000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00593000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00593000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00593000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00676000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00676000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00676000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00676000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00773000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00773000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00773000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00773000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00859000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00859000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00859000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00859000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00938000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00938000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_00938000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00938000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01030000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01030000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01030000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01030000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01130000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01130000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01130000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01130000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01260000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01260000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01260000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01260000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01680000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01680000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_01680000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_01680000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02050000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02050000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02050000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02050000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02450000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02450000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02450000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02450000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02970000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02970000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_02970000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_02970000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_04190000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_04190000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_04190000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_04190000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_05930000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_05930000_ref.csv similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Database_Tvib_05930000_ref.csv rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_05930000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Figure_Verification.png b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Figure_Verification.png similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/Figure_Verification.png rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Figure_Verification.png diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/analyze.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/command_line.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/command_line.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/cube_mesh.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/cube_mesh.h5 similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/cube_mesh.h5 rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/cube_mesh.h5 diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/get_values.py b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/get_values.py similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/get_values.py rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/get_values.py diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/hopr.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/hopr.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/parameter.ini rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini diff --git a/regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/readme.md b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md similarity index 100% rename from regressioncheck/checks/NIG_Reservoir/VarRelaxProb_XSecData/readme.md rename to regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md From 044f515d5872ae182a86a2fdbfab2e5f45c76a80 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 1 May 2020 19:44:46 +0200 Subject: [PATCH 11/74] Regression test for chemistry with cross-sections --- REGGIE.md | 3 +- .../MCC_BGG_MultiSpec_XSec_Chem/DSMC.ini | 214 ++++++++++++++++++ .../DSMCSpecies_electronic_state_full_Data.h5 | Bin 0 -> 107464 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 0 -> 54184 bytes .../PartAnalyze_ref.csv | 22 ++ .../MCC_BGG_MultiSpec_XSec_Chem/analyze.ini | 5 + .../command_line.ini | 2 + .../MCC_BGG_MultiSpec_XSec_Chem/cube_mesh.h5 | Bin 0 -> 6872 bytes .../MCC_BGG_MultiSpec_XSec_Chem/hopr.ini | 43 ++++ .../MCC_BGG_MultiSpec_XSec_Chem/parameter.ini | 187 +++++++++++++++ .../MCC_BGG_MultiSpec_XSec_Chem/readme.md | 6 + 11 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMC.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/PartAnalyze_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/analyze.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/command_line.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/cube_mesh.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/hopr.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/parameter.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/readme.md diff --git a/REGGIE.md b/REGGIE.md index 1a6b434fd..b460e81c4 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -185,7 +185,8 @@ 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/checks/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/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | | 15 | MCC_BGG_MultiSpec_XSec | | Multi-species background gas: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/readme.md) | -| 24 | MCC_BGG_MultiSpec_XSec_Vib | | Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md) | +| 24 | MCC_BGG_MultiSpec_XSec_Vib | | Multi-species background gas: Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md) | +| 24 | MCC_BGG_MultiSpec_XSec_Chem | | Multi-species background gas: QK ionization and TCE dissociation | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/readme.md) | | 16 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | | 17 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | | 18 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMC.ini new file mode 100644 index 000000000..e1167faf9 --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMC.ini @@ -0,0 +1,214 @@ +! =============================================================================== ! +! Species1, CO2 +! =============================================================================== ! +Part-Species1-SpeciesName = CO2 +Part-Species1-PolyatomicMol = true +Part-Species1-InteractionID = 2 +Part-Species1-VHSReferenceTemp = 273 +Part-Species1-VHSReferenceDiam = 5.10E-10 +Part-Species1-omegaVHS = 0.24 +Part-Species1-NumOfAtoms = 3 +Part-Species1-LinearMolec = true +Part-Species1-CharaTempVib1 = 959.66 +Part-Species1-CharaTempVib2 = 959.66 +Part-Species1-CharaTempVib3 = 1918.6 +Part-Species1-CharaTempVib4 = 3382 +Part-Species1-Ediss_eV = 5.45 +Part-Species1-HeatOfFormation_K = -47324.1 +! =============================================================================== ! +! Species2, N2 +! =============================================================================== ! +Part-Species2-SpeciesName = N2 +Part-Species2-InteractionID = 2 +Part-Species2-VHSReferenceTemp = 273 +Part-Species2-VHSReferenceDiam = 4.17E-10 +Part-Species2-omegaVHS = 0.24 +Part-Species2-CharaTempVib = 3393.3 +Part-Species2-Ediss_eV = 9.759 +Part-Species2-CharaTempRot = 2.87 +Part-Species2-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species3, He +! =============================================================================== ! +Part-Species3-SpeciesName = He +Part-Species3-InteractionID = 1 +Part-Species3-VHSReferenceTemp = 273 ! changed randomly from 300 +Part-Species3-VHSReferenceDiam = 3.0E-10 +Part-Species3-omegaVHS = 0.24 ! changed randomly from 0.2 +Part-Species3-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species4, e +! =============================================================================== ! +Part-Species4-SpeciesName = electron +Part-Species4-InteractionID = 4 +Part-Species4-VHSReferenceTemp = 273 +Part-Species4-VHSReferenceDiam = 2.817920E-15 +Part-Species4-omegaVHS = 0.24 +! =============================================================================== ! +! Species5, CO2^+ +! =============================================================================== ! +Part-Species5-SpeciesName = CO2Ion1 +Part-Species5-PolyatomicMol = true +Part-Species5-InteractionID = 20 +Part-Species5-VHSReferenceTemp = 273 ! copied from CO2 +Part-Species5-VHSReferenceDiam = 5.10E-10 ! copied from CO2 +Part-Species5-omegaVHS = 0.24 ! copied from CO2 +Part-Species5-NumOfAtoms = 3 +Part-Species5-LinearMolec = true +Part-Species5-CharaTempVib1 = 959.66 ! copied from CO2 +Part-Species5-CharaTempVib2 = 959.66 ! copied from CO2 +Part-Species5-CharaTempVib3 = 1918.6 ! copied from CO2 +Part-Species5-CharaTempVib4 = 3382 ! copied from CO2 +Part-Species5-Ediss_eV = 5.45 ! copied from CO2 +Part-Species5-PreviousState = 1 +! =============================================================================== ! +! Species6, N_2^+ +! =============================================================================== ! +Part-Species6-SpeciesName = N2Ion1 +Part-Species6-InteractionID = 20 +Part-Species6-VHSReferenceTemp = 273 +Part-Species6-VHSReferenceDiam = 4.17E-10 +Part-Species6-omegaVHS = 0.24 +Part-Species6-CharaTempVib = 3174.7 +Part-Species6-Ediss_eV = 8.712 ! Herzberg +Part-Species6-CharaTempRot = 2.8 +Part-Species6-PreviousState = 2 +! =============================================================================== ! +! Species7, He+ +! =============================================================================== ! +Part-Species7-SpeciesName = HeIon1 +Part-Species7-InteractionID = 10 +Part-Species7-VHSReferenceTemp = 273 +Part-Species7-VHSReferenceDiam = 3.0E-10 +Part-Species7-omegaVHS = 0.24 +Part-Species7-PreviousState = 3 +! =============================================================================== ! +! Species8, CO +! =============================================================================== ! +Part-Species8-SpeciesName = CO +Part-Species8-InteractionID = 2 +Part-Species8-VHSReferenceTemp = 273 +Part-Species8-VHSReferenceDiam = 4.17E-10 +Part-Species8-omegaVHS = 0.24 +Part-Species8-CharaTempVib = 3120.7 +Part-Species8-Ediss_eV = 11.06 +Part-Species8-HeatOfFormation_K = -13292.85 +Part-Species8-CharaTempRot = 2.8 +! =============================================================================== ! +! Species9, O +! =============================================================================== ! +Part-Species9-SpeciesName = O +Part-Species9-InteractionID = 1 +Part-Species9-VHSReferenceTemp = 273 +Part-Species9-VHSReferenceDiam = 3.49E-10 +Part-Species9-omegaVHS = 0.24 +Part-Species9-HeatOfFormation_K = 29975.34 +! =============================================================================== ! +! Species10, N +! =============================================================================== ! +Part-Species10-SpeciesName = N +Part-Species10-InteractionID = 1 +Part-Species10-VHSReferenceTemp = 273 +Part-Species10-VHSReferenceDiam = 3.00E-010 +Part-Species10-omegaVHS = 0.24 +Part-Species10-HeatOfFormation_K = 56821.44 + +! =============================================================================== ! +! Data for chemical reactions +! =============================================================================== ! +DSMC-NumOfReactions=9 +! =============================================================================== ! +! Ionization +! =============================================================================== ! +! Reaction 1 | CO2 + M --> CO2Ion1 + M + e +DSMC-Reaction1-ReactionType = iQK +DSMC-Reaction1-QKProcedure = true +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/5,0,4/) +DSMC-Reaction1-NumberOfNonReactives = 4 +DSMC-Reaction1-NonReactiveSpecies = (/4,5,6,7/) + +! Reaction 2 | N2 + M --> N2Ion1 + M + e +DSMC-Reaction2-ReactionType = iQK +DSMC-Reaction2-QKProcedure = true +DSMC-Reaction2-Reactants = (/2,0,0/) +DSMC-Reaction2-Products = (/6,0,4/) +DSMC-Reaction2-NumberOfNonReactives = 4 +DSMC-Reaction2-NonReactiveSpecies = (/4,5,6,7/) + +! Reaction 3 | He + M --> HeIon1 + M + e +DSMC-Reaction3-ReactionType = iQK +DSMC-Reaction3-QKProcedure = true +DSMC-Reaction3-Reactants = (/3,0,0/) +DSMC-Reaction3-Products = (/7,0,4/) +DSMC-Reaction3-NumberOfNonReactives = 4 +DSMC-Reaction3-NonReactiveSpecies = (/4,5,6,7/) + +! =============================================================================== ! +! Dissociation CO2 +! =============================================================================== ! + +! Reaction 4 | CO2 + e --> CO + O + e +! Arrhenius fit based on data extracted from Pietanza2015, Fig 2. and 4. +DSMC-Reaction4-ReactionType = D +DSMC-Reaction4-Reactants = (/1,4,0/) +DSMC-Reaction4-Products = (/8,4,9/) +DSMC-Reaction4-Arrhenius-Prefactor = 1E-26 +DSMC-Reaction4-Arrhenius-Powerfactor= 2.5 +DSMC-Reaction4-Activation-Energy_K = 15000 + +! Reaction 5 | CO2 + molecules --> CO + O + molecules +! Arrhenius coefficients from Johnston2014 +DSMC-Reaction5-ReactionType = D +DSMC-Reaction5-Reactants = (/1,0,0/) +DSMC-Reaction5-Products = (/8,0,9/) +DSMC-Reaction5-Arrhenius-Prefactor = 1.15E-08 +DSMC-Reaction5-Arrhenius-Powerfactor= -1.5 +DSMC-Reaction5-Activation-Energy_K = 63280 +DSMC-Reaction5-NumberOfNonReactives = 2 +DSMC-Reaction5-NonReactiveSpecies = (/5,6/) + +! Reaction 6 | CO2 + atoms --> CO + O + atoms +! Arrhenius coefficients from Johnston2014 +DSMC-Reaction6-ReactionType = D +DSMC-Reaction6-Reactants = (/1,0,0/) +DSMC-Reaction6-Products = (/8,0,9/) +DSMC-Reaction6-Arrhenius-Prefactor = 2.29E-08 +DSMC-Reaction6-Arrhenius-Powerfactor= -1.5 +DSMC-Reaction6-Activation-Energy_K = 63280 +DSMC-Reaction6-NumberOfNonReactives = 1 +DSMC-Reaction6-NonReactiveSpecies = (/7/) + +! =============================================================================== ! +! Dissociation N2 +! =============================================================================== ! +! Arrhenius coefficients from Park1993 + +!Reaction 7 (N2 + molecule -> N + N + molecule) +DSMC-Reaction7-ReactionType = D +DSMC-Reaction7-Reactants = (/2,0,0/) +DSMC-Reaction7-Products = (/10,0,10/) +DSMC-Reaction7-Arrhenius-Prefactor = 1.16E-08 +DSMC-Reaction7-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction7-Activation-Energy_K = 113200.0 +DSMC-Reaction7-NumberOfNonReactives = 2 +DSMC-Reaction7-NonReactiveSpecies = (/5,6/) + +!Reaction 8 (N2 + atom -> N + N + atom) +DSMC-Reaction8-ReactionType = D +DSMC-Reaction8-Reactants = (/2,0,0/) +DSMC-Reaction8-Products = (/10,0,10/) +DSMC-Reaction8-Arrhenius-Prefactor = 4.98E-08 +DSMC-Reaction8-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction8-Activation-Energy_K = 113200.0 +DSMC-Reaction8-NumberOfNonReactives = 1 +DSMC-Reaction8-NonReactiveSpecies = (/7/) + +!Reaction 9 (N2 + e -> N + N + e) +DSMC-Reaction9-ReactionType = D +DSMC-Reaction9-Reactants = (/2,4,0/) +DSMC-Reaction9-Products = (/10,4,10/) +DSMC-Reaction9-Arrhenius-Prefactor = 1.99E-005 +DSMC-Reaction9-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction9-Activation-Energy_K = 113200.0 + diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5d3d0ad1fcb1edaa96261071da98dcd3e2765ef3 GIT binary patch literal 107464 zcmeF)30w{D-#`A*q9HQXl#z+!ND`$~cFw!9WGj^@YnD*7B0Jf)kR@a-$w$hP>|2qw zqO2iX*2r=!Df@ruystUuxIZ6{hx_~efA8OYpFAE;&-1$GnmO<4bT!L03*0(%s$SKs zD)r-orYRkY`S~gS_g(REF0sg{@Y zb?it{x)k=0kBY@8JDrNpMk=1LE3NqChQjk*E4IK*;i$b8pGXw;pIPyVox+-j|Fh#9sK^-J{|OcaMrE6r>cSJepPH9?dFp>hs*spFqP31P&4b9$GJQr zdEK7-o@^(kfa|g(%fb08$)D88deycAnuAr(d4mWyGzEI5181Fe{zlr@y6pMTxeJ48_#A`nXbQro=^r|F3eCXfP7OLQJB{XG!|FDr-Oi#J(6ZU*Tl1Uf zQ-#ZhWPC?+;4!(=Xj|<{Wcv;r7;E#QF`9w8g?%>9wLx=W+rPyf{TXNmf+sEsHzcOu z>{go#)g81H{V~v}E_b|!6Pkk_gElkLmT2MYb9cm!1zph$c&+Sz=4%hpaar}t_6$N( zkifjm2^oxLz^Adb!9!vWbO!Nnjt;?G0%yMX>bed?TR{63o~2`lqdB-6y52r=r0ALp z)_tfOh-ScaqxHz0L1+ool78y`*C;dv17A1&d`HP#?INyA80HL|dU#3iGBF2jtIQuY zC>(PMq%7?obCy{6{%0p$_m9M!0|QI-uD`*b7 z)vJ57>vc2(_C4<;yuFL2V2I?(wSkY(4D8HpW7g;?nu4$4i8uOo(I($7l1Y2xe7m7J zSmQL~)pU0>1?QUYY&F6gEv(NZqV4$JqTAlAwmP~mnu9hM6Y_lfp&8h;?#t3NVhZ}m zQ|vDH$6NvrxDBJ86La7-|MjetftYj9IJxr;w?SwNIOf=(e+V%Hz2xaB?*5o_pxvO< za@t_D1hiZ?veStvIJ|PlrTN4XXuYn588-yma}bhr@ll&J++^z^T5oI^HLiz`$5}*CHjS`#HCHNzA~Eq}jE!qN{j~dPCOL7VPRT%HqpO^v5o4Qk41&YhZ z?tMPGTaf50_f8gMhNC4g`eO8!cf=G#&rb81J_BSDaije z(X5itrsnN9#qbXQ=HNvUE zX*2^*ZXW7d?<|^wJ2$tD>z9qDVB?Lw{54_*{8nAARhWyp@ck2Z^6|q9Xbu7b{q%~7 zC9pDL#mrTCm^0A2z%Aw|F$Fb0bkB=j^JAW*}%vzca1%(Hu0*J_zfTylP|8v^Lc+XTU1q;UV|xXbBuB za~$VS%&A!d&GqaLE>g;`g!Q;yNKC_`v>$DwO1KV?Iwtyw2pBg5RTmp+#%s`KOd4>B(&Ovt-Tfnw%w`Zj?*gpl8#&?}_ zn^*$L$9;W+4aGd*MduxNh#45fJuH1f%z=+-o#P*fCE(+DHl>W10q4<6Yt}Nt{y4Z8 z{$)e~u?5`eKcH)UW6Z78%)m$cAm>&j=YFxQ=tHGYl1o6<7BH&m^Fx!B@*p+8i660` zNgZ521!D`GYZTa^h4&ZVh1z$UioTQMP$9KL66o;&8s_z?K|AP$eR%}P=i|L9zo2(*NnZ|F~kfcd*^nj z?TE`;z=ZcR2O2j=OTa-Ikv@x9`1@wq=BgKnCGcJEL6uv?418;_s7y2m-&`FZ7b@j9 z&Bt?QEwFzMcGUM-IhdG&Ubmj^%I}0Z1JhkQFR*h%Q)=eGILrLp1Cldpra=0o*q&=zpFV7;BKJDP)I zi7)A4#KP}m6$^jgsaP1l&p4bileDKGre0W^UBtrcPjWWNAr^kVRV;x?mu?TZs+9M1 z4tA>Pf!iaDkCTq}dDKUAVnAro1Ya}*>P~OgEL6KM<`NjGGdL@Xm{BvQX6hIB@4vd& z3Z>;$&4Cu*^=`v{;`&t0!P1!bvlb7)oB_6V!WG|vXbv`A>vyj9Aha-EP%)!s4wl<2 z_p>GK83;WtD;_XRTwdKD{XX561Yj<_zo=Mve^D_7=G8a8SU6m4uWAWYdY07Z5Xm_; zQ*cl2rvHZIjGBeNH&t@UFZo4N*S&s0;`-I?);w=!%Tbtf&_%@*sOA(5itd_Rb2PRW ze*P=<-_a!)&HUn9{!VXKkemWlb7~g;-p?s6=o>2br)uHrKdXGl0g_A9%s}rp^lUZ^ zm*><>sac|C1}0ovys6O`ad}lU(C3bw_h6C>fA6W7Q!@h_=G*UDF&6uyesM~PbCEO> za|Tq+!JHG@Qg=@jb5&Dnxv>Am@q5Qzlg0L`mdid&UiW>+DjnzF9bbr7>|ny<3+n#! z;|o#s6x`%~aQeSAT&8JY)81vC}VR6tV!O$GiBR6s6MeUUVD8tPx{WmP=R$i9BkytLfy&^mI0Wk~bqqCCVdR0;E-;v7-#-H(T z*08F=G{nA7d9lF?&BDD!a?cD~G!6PCU2HQQMAx0VV$PZN`egb0j`q3s&#Dm@ly%WE zmsMAoh1jh*p*Nh-JS_WO5ZAa9nua*9A}5osqNgQt&G#gu<+Aym<3Gtt(KIaAZ&3gG z2Q&-WwG20n`zV?&?6mN~8Uw}p<+Ao0>qSrXs6n=;#=Hyj-}*BO^DyRKSU z@f&A849!By+sN*pgV8iBo?HA^);Kf^hxfk7=n;wL;n|G`gT4^6FgniX(#}}SY4G&6 zdVXUSS}uFN-)zjJ)o30(m%Gm&9gn6#?{vl)qdjQ3?2zOA8N*!+728jPd2{pYF|KG9 zhHi}rhE8Z28uzO|xT?QsrsZ4xPnn{vJC(n*zkp_8{HP%!bfbI3EWAC{YFqeCG0(V|K5gGUGz%ZsXzd$I8CKH6r^k!=osxZd1yN`k!nWDWESiCq%l5qLJw1FT znup^-?aUj@N3-A{JFwb`n1?CZVb_ijOCe#%wyevgoWpuwr?AQmcrS{vNJP?dB}P@-G2`;3)F~(z88pTm`9)W zAGsWtXW{I*TW6*c%Vk?{)0=y)!JLKy?-_T#60`8Yy}@wfwV2Cgo4yThyCV-x19iYU zcyB(M1-AbZ?0pmcoe9^}4-*x%v1ekkTrSVr?}J1V(2!*s`dVoR7c zYFC>D#5{y<=wbAQSPDK**4O_^Ohb#5u@`N_uzwcL^m1z;Ben!zJO6v*h^;}^ud;R| zF%K{M1w6k(%)$#5%VmXECVZZ<6#J(^)hxt^+?_CExtP!2);%VBmFT9|V}0kXM$2VA zU*6o5o`|Ml7BU;}#BTTr4iXIHcAFA7UEXH{$HC6SL6b zLLa+_#580$&r1apR`K)6!UBUCF`Oxy2c5mr58*XMe|@p!RcRBnP`{bCmwzH=q0!0q zy}sCr`PG!uALrVkEg{f<+>_?^Xesz=$#-}Y)8IFF{evDIF_+7HRm_5_~Ht~NT`Yr-2bEQ|Hl3wC$+ABQhEQ6+kfEvQpGlD9yAruR6tV!O$9U+_`gsAPH)GfhwaCwho=%S~uh-+7>Gq|?}?(Y$fpJpAr|GM@Yl3Tu8 zaP^DlTVf-fhR@n>6Mf96q+RnCr6ljP-}A1Hhv?jan-&Bd6n!gZtizZ0qKihpieo;A zzH>S7p?{g^g>OB!FW^6r{>>`ak@fWy{q{h9)V3ti`+L>i?mDZCwC|8#GV$3C(OLbD z7Cks2`o4Dp49XXs_{e+IWhKw-ILEyzUrzd~>N14dKSQ+d($ntdYeX+^b7^1K1kpLy zW;TR#qURi1x+M6L=m+)AKJ}nKlKvYQM;5#^5?ymi?;R`5&~n+fg$)*TmVJWX9skp( zDn4-hr|$p8_)oFVakpX(6%U&6pGrA2&{RNE0Zj!o70^`R-&lcPkNp<*Lwm}r>mxF!R~S2RS2CF|&4!10eH1&cyavU zq)SCaUq;iQZMC5!dmmo^C6_hYcqDCQD?I)um+fV2O?4toe!IV_L{TLiuc-Ua$18Sj z6n|4NMCo#XNAV!Ym~9e=~h$x9cP??B1qs)Ul@|_rBhtW7IQoJfc;$TxaLUPl}v|VQZG$ z*%OS{-?LB@)7QU3aE?yv9QkO!eD1&9wINT4Rj%>un_Tc07OA#`a>^?Ikoyhdn^ zXusEJ8jel4H97tZS~#Dn=iq?5dU!p!6!w+vou*@m7S4Zo{j5y1P``I0l5|N< z^UB0>*}8!{ri$iaQHEE^8zbzGg)Mu0_Pr&hAyRsw?K@&i&^Fy^nrMRUrE2EY%&J)! zAFC|SLWuqGCR<2;9i(~BWMCHFNKLMW=!ij6D_=6i{LELECj8Z zD)l5e4c{7;go&2RERVifC7K7GS)b)U3;SciT*b6nE`{3%;(~6>#`czKX4Nd5@1oM4 zRSm-xlKene~)V}I>Y!9QQkm@yb-q8#+4+bf2TSc?r{3!pLXc~eh6nqvfmz`+b z#_$+fo`%Y&<4z4G^Fgp`7G94^ZVA&LHCO>BaQ&>Bc{NMbOv5zw<;Q%g;!OGzmRGT` zyqZVfUsvB>slBR&^B4ayw^YleYF5v!)p8bM+A{%VWc~^o3|$AU>`;XDkiuWLYP#-u zgysRt3j2y?A;IIsMA0;4w(qn`v|Lubht+1$EF73(?qyEq$DrY$ig`8Dko@w<#uUm zTfU%$^MAsZZ4k{0=P&u}6HP`<^vBGgTigmz`OD&_Jg;ng&%1=Yy%_yqcwIW}(?e>j&;i{W++Z|0OSbz5T%I zn&SEkALpfHacCA)&8t~Bzf7gQR4wO0IzD|`Iq8p9GYj?9@~BCjCU217`gwR&W6!yz z_0X)EX?UrU(=fW(9{;`#u{{s(h93S{&k9YenN>3l9sPE!SkeUBvv7ZjY<+VZG_7V{ z%{1)eHhes9hwX*)(JJrO_O(Z|Y8K8HGw?pJl;pzCle@c9V@I)lM7F-&Tw)r+Rm_8W z{&f(F@*E`v1bUtY>yx%Oz z8pXE9<%Rbf6$|xMbK>EFd(BCE8lKIfzx9;i@-#g8oVvFcF|TG8o~qjhw~hRV{qIRPtZl^K$9+_e#rqsF()Toc+abj=3f;cfs}3Apb}6 z@LDD3VZCR+=jN`sJga8UK2?OhTXSNJA zMpH0=ds4}wCYpnjO&w>~Z;02AGH`rZnNbum1o0}*O7wy~Hg!UC5V8GG zR@1I%3UoZF_Cv_^oeaoc*?$jSE9Nbdog6Zn;`NXeXul4yzgR5V#dWClw1#-Sn=rp6 z)qnpnD>Mgr`ubV9)}p7c?vPg81kHeLuFcL@#1e4f^4`SRU{1kNPx#^ud9?tvEOcdb*EE$xYxfWgz!?)$vZ77!6!Qe4Rg%|X5R zZ==ft(G=7=5;1IG5SoGQmmc2>8YTLT<@kaP#1y<-OJC%JF{gyQ6ZOWS8ThdKmGj~0XbQBpW~O(Y ziDqDPQqz;Mv1krPM6@-@T!p5hI_iTt2ZtO+I283pOQ6Z+k;C5jqAlRQ+gIQS=#9BE*(dOMN44fkXgGL6LY{OubdY@PRz%Cvv*D>7UrL#n>s&<#GHes?(#&mFn_#`PI#BU&=maj?3kHn8k&LOdQ^y^c_t>mso>=;dD*%emJRqjT;@RimvvhgZ{9tXb#lfc#w9-`W~1wkUHION)7GPkSP>uHyb5#rTQ{@1h2LLWHmpzf#r}o*8*;m5`Joy3T%!AMF0mD4 zEOuPhwlC%uU|acB)xN|Gc!W$pQ%cOi;YK=LYW2hR!hGD1PsUFm7Uok{u@!^{o-aI3 za*3LoK;mXk{S1-|^CuVHY%SUX+LT{Te@1c%#H?%Psn=gzzn+)&T~lHS%(Zffsj1`= zx4JJvh%G?fd%xdn6iIR`P&EffQ*-9O8;R=^=HG5vTc<%FT9{uu(oXuGm;>H;@P5xA z%!TpJ6R#fYN1=uB15kx zOhF634}7|v3z;gqa1nG#nS~bSL;e!)aE(})&%4{jO!L{8Q(%3b8*IM}&A^?ZQCECd zpoQ^g+ESTaELs9*iz!*y8nlp`o?Sg*En4{f*0fWV+ZWIlFgJ2{2hkE}QRbD}G+)fs z-M;RE)ssjr%+J1JTJB_G4jy-PY#L200nT{YHPH-2w|Vp}_$u}<%*U=`E3ou2&Rs?F zCXh*`_FYXZfkkZ{R%a0l^IzBN<#UQy0&_AP2bL3CK+C+(vX4s6U(@dBCt@q$ABHD> zA!gue>4W_?@5JrXncL{$%=c&sEb%HbUr~{Gj7w^h>ZTfmN=E8U=vtYlRm;!2BQt*;#uJ9Ro>4q6myNi{-@X%lnRxilORjNk@%(Tapk(Q=;X{fQISuvl8wZ^# z57 zvoK-|S}vPgW0p&c!yL3QU(``;y@$j!?Al+gR?G@9FJAmY8ogDtN2aAoLJvHjorbPjO=f&qkCw}v z!kzQVxk|qse^sL@K5+b{?mr)Y-Jf33bEaYq6%U&6mr6M_&{RNE0Zj!o70^`R-&p}r z?VN!H?Ps^kYmDP73MO`S;Rme3^Bov?e*TdCiM!%_QbSVvlno2Q@f9W9kMh>`kvDLD z0ty~b(Myf0iSsuZJP3;a6oKO}3ZATP({6hLj!%U9$GVB0 z{x`X7$+YLkOY0l{2gfh*id&Lrs+3N7{L=kDxc|squ~qJWc%OUsW)&T{EAD&m>QV88 ztD;|5?AO)f=QFN~6)H%%Dwg;7(Qew%(6EUW3*yc;M$u2j{o-{fD~0Vq@yXvjv{XFr zAM!U16idjE4fO{%GYrUIG@Xe#hOu>!x&k5sL>S!)c9d||hzJ9r?*aF8R!u5!U7W{SgqUbg?iZ)+rgZqc%vZKvzmwsy| z&PTAa-N1|K9dZ03Tn|3Xx$*j|I6nXl!%G_G`;zOo<+5s%woK}2RQb2#7hOfUasP|D z|9t<8|FVj%dn(pY@$f%o{Gzf^8fYq@seq;enhIzt@V~PHp!TxBef@`L{rt}3^Dtu3 zuD=$S7ZE>-3wmR=3-_nUWm@MtZW?f)9Da8_tNQU9b^rNzVs~7{Ysjp4Q2ehvp6Kx( z+#jN{Q5t9}ps9eS0-6eFD)7Iu0_yuii2E<(ve+>$ zQ_Rvt8;v$PZ};jeX+LP!vVphEasP(Uza(OdRejvQA(!=jx!ED(qv(#;<6zxbJbojW zb-wr}$TwAVcx3jfuSZ48h8Jn`vwuGy2ctNEfcrz#{paJCu+55Z1w+N-&j;o4i@Rq0 zqFfry=b8#=Dxj%=rUIG@{EI7~K7OI0#G~Y4^y(H+u_EFA-Mb?%UvB9^+@q%cpvWz` z3d?1c12dOx54ub8Azmr2w&{32i(HlrwZ8}0i}%OapttmKT?aG^T7H4^PBllx-Le(2T(+Xs_b1(nh3(z(I9%4{ zGpV=U)?L|?LeVsQ37QkNAPmjI&SynV{lKnu$sHSV)*CR#ZDW_^84;%qbzdpt)uZ;wUO@FG+fa{ofJ zVC8Xb((^(z4c>2yzs281%VoPe-pbd#gBI?$l53|I)m=Qld%e+;eDFsL_cK1%akqRh znuq1>7Z}Nhp=pSSi|*z;6)l%tNq_R~%u=*)zvclASDP(Evv93frql7|qTAc>f%GA? z@bfZ0!e`(kGz%Fn)ze4x636d-X4kvo7=#w)cinh3?hY{xch}^ZdXB=Jhp#W$Qhqd= zg{)gU#$|_~rSRUY$rNlhAbXu5nYYHyUgZ#|wMSY^sQaI%N z?qz>s9#Uo|A2~e}a~8&(IPG$t*b=;+8a}Et3v($viC=%ADzPx%dHd406J}#hL*AX& z&2A72um9VS+*?XM9Xqq`t%YLy4hv7V(~U;UWp+t+y(SaWkZ;m+M8k`i3*Rpn;|}e< zhGs$UMqotM0yGc4>oTny-a^Y|4-Y10op_F>A#6@crRguwEL;!RZhq;d=*1V_R~h#m zEtl=kpU)jK#_I`K_-yjl(4>>-(@%!yef2~O_pAP8mb|v5Lzj;8oFSh5wF`==OgCClPrgi!~e$W@q z!`k}ZlFI``PjA*qck3Xu6l%7-)jye-hjRg&w_o+gT$m3yW5bvNVqw1YD_`nt9E`c} z{t@#$%w-6g1-|m>$sLrOI_^=!Z^SgLv}$i`F$~+wWuKvdRNd=81l6Lz6>Q-dwZV!NX$dn@oR0r5VKHw>5?~huj2AN zm~6~@)b<*hh7nifC;DAS^Dv(Ct^B+|^vbY>JNDm1v#>1n_WXmyLjCiHzNK!7x#5g! z^IItS{Ko3tb`jH{?y=DlpLT_~yj=F+;ks2biD}qiaoyqkE6izl6Vhr!^cyq_vtMSq zJ|pHK^O-F*wG?x?On>x@+gr=fG)yXNJZ9M^v@qXtVaAbKpG7YVInjGJCGNlZa5${o zT@TH|u&8>^c~jBM{=uK#*Fp>XcZ^2YZDNMz;hyg7)K0|0`_tXZ{8lAP?$q_1SsU96 z_g@G)@vw{+-Rq6hkbJT~NeVTz%|1P^Bj$l=J~rFxqIrlq^Z4v_V&QtPr}lkUO2ph_ z_J`(^$o)Kc*f2VydKYs44k=tJisQNwvvBYIu*nOEc^LX3WN0ce4Sq)6wT=<9Fd{d+ zn|pm+9}T^uW2w=^!p~p+!lg;XGz=*klil7{Y=6IUrDntI(8AC2w#?*oV&Q%ZP4Wgs zI*R!_lkqlpT8RGUe^5KP4O%XvbD?~j49$Xkev1M_H_=CDxAYp)6)l&w=VR_JAm(A? zjYnfv64Ovck}NG!vZ-U1`M7SlJPV8TI!*KIjuw93ycpiLFR>I7oO)HB<$*a1bBt1| z==DVN(7Cj7Oif}M8qV$2Ac2?%r-6J&2TyD-g~-JwGtUsS;1YAs<{U8%&#!MBsqKaB zX}H>rcAG*hmmSZLF5N^-L!0sS9BTPudtrX|YX^IC1JNw#ZuIfpIRq`-&u(S!Q?mll zEUYpad-i*v=tFRHaquWK4{`a27bXzX@L<(={i{lrJs)|e8NqL(4|==gD!Bdy@!UUKqb+8`d1BpiF~?&MF$?YAyez7_7IWeKe|GpSsgmus zgj`)nEZmQz>BGTyiFvqG!(VcWTu(qlO3ufCN}I7i8oGd&@#??OJhWqM`t2YV?oYzy z8$2c!=G%7axI;S?+Y95r*g9`}D7ntuq|;~9Fz12k9aa4CANQ;7V-G*X|ymO`>{=Q88Hv@hdFL+ehzct=lNa8%Z}M-VZQLXRhxSd z3twNejiLQ>Fc-$}epmPDUHm)KP`0~jXEUXIc?K`mBl_^C%iXo^iFVq2c-S2!FCYBnWbu8><+AdDOEx`u z^8L5xZ{TGLc>F`%|Bd4xN2s44{&KWJ{8|8f}uQxsqe6;0Z-R7?pW?A zNcBkj?M7AiGWA8rpE4Pm^M)q5`SFw&4P&Y(%)$M5y)iA7d?GMzuWoQv(q6m0TMQ6W zu;_Wr^0^!I6*&dlM^~H7EviP^yS?=F3m~R|ufn-lc#HF^8@^ce*r6AigYer87Psn+ zW}wA1rbdH#Xb!%6O=@jJOu^jYBXS3C#+-q?NjW90644wqIG>QdYzJDRW(r~o;@9a# z7?AB>@@bz#+w*7!EI-x#5JOBst9z31Osg8?_3_=;EqJcv5oNn`$N6E-L3W$LDN~dj z$@-hxhF~rMRa-zRfB9qh7%^8h1s8AV)F``#IRzn8H~Wu#h8E`Y9{2S?_2*~~th9RW zu_-}I;6uUzhx`|43Jyj`MAj)sGqAev;OXCqDR9Z5O>P3n3a1YV$_C2$!4?;8Wpuf+xQN$c{t`afe1u+E^`m8r@#^6DDJB@rxse1)oeKxfQ5dn7`I5`PjszxI8Bu zA9NbjHU=$$vXnO7$G4*`)Xcz}?z5uP?C|~q9Jt!mD*j3=ft=S{2Zh;VZUF~eFIP5f zhNhrs^jpJR7c>LKxvNS`h&dQmX`eUmin#>->a_G=Z(?D-$?1!0gmnDzyXy8nFqz+9^6dbeT?6%U&6gGxCx&{RNE z0Zj!o70^`R-&p}r>l|!~5>M^?CSI@aJh_0aZ1zCWjsdL`hu3?a!SMtI#ZrgyeJ$T% zKkznj?L;OU=OdzEXSUyD{knL*IR%GO2BiC?h)y>i*?s$2(LHWEcUbfq&p(&TJUZ{M z)&Aq}ucyO{-Eh33?mr)|WZtZ(5niEJA?5Lkr)GagMNu^WYbv0rfTjYP3TP_uZ>hkq z*V7$txzJ%DFV2rR>ZQZX8yj&vLPK0(C#zPIaeP6;!|;)g)mMn)i>+r471zBd`rYA; z-HVm1r#DNOKN{yxq`@FR;ep9G@%obSdoo_!_7FvqqqjH(<{I))I*NASmFvQN_*6+td28#OQ zcu3uUJ|4<{P|@{$m9Ma7Jfu<%4Kx+dR6tV!O$9U+_%~MI*YS{X&$5uZd<;~ql!ig_ z%6GfeJgKl;)-u=_=9-8zFcruQVj*l3{dML#Q2l>W%{ui!2P(05-Nb?Q`BW{YmbtvM1K?rUi1y#0zVGuC~ zx1!3Xan*Fm`Dg2TXSNJAMpH0=ds4}wCYpnjO&w>~Z;0o=F>riYnNbum1L~fb5n1_u#c?3R)yPIb<}&^M5GNejQ+c zu~@W=>rm@y4UNe5_oDjmKW2sIAWvUEE7w}|^wk~GikqMru+6pE`HENqE?nN5I2+6< zIO-|ie6bsvf!3#nx!mZE=3wkmyOGb_(Zc%DJuBvRUNo8lllOh@){I3nP&qlW zlIA?0Z zVhW7X46K8@V9vnNVJ7;Ml^odBHQO+kJ?b`)S7=Yd#Du-0ywNoykT4Xbw*4Te^N7j%J`A zlNEJ!1e$`6t;;8L8;KU~UtgM9Jdc=yLXY6^vLMWb`*$0iUO8$MS^|r6qWjhkMN?qT zzIRH9Kyz@qfL~pIELs8+hs@g5n3w}LdF8zLabiC9o4s>7F#{=dQ|Bjlrr^xnIr~Lh zL1ILg(Q7ARZUI^5Hqpn388F&7rpebSm~*ga#tLndsb~o>F6FI@h&gEM=l$w6u?3v2 zKjDS-G_ie=VMCK%#1z9=9z|OV7T7Y zJL&t-9Bgd3W0}rrGy?~EYqiiLrl85G9NoxAm{YJf@8qNT&(I7ke_wNS>~k~+Bcq0X zje3EWz)jibN6TNMDHu|?@1~C&%>dNd>pt`inuBq+Po~U%hh`w7Rmr|7A4R9-%z4%F zGn#|j!*4b;`i`ccORT}baJnXWKb%y*#*GeDMOXXML4R0RGzaQ#JV?7^eGkkTNS$|K z!UtmE{BUz7JIV`l;r)1s`MQ(dXbFr-Ufm#v*a8ep6RPn(VyPoRuFtd7tDGNNrX9Y7w#U`)kXF^~t{2zfgZeZr3b7v~WIniSEO> z#8!~8*l}6gzL;BpZRJ;0`w}zY5i}nynx-@OSvIggKLF1TZ^`UHszPopOIVwG3%On>h%}buji$G*OXWSbFExrYAU(J zt?r8uVhd3B-tYGsMUvbKRL#NB)SUV6M&kM;FuG-Jod$tu2IfWDN#7H5z#9+V?-_)- zFy49M)nolAv@m{ru`1zhFk1NeG_0MH8IGnP{7AFTsbkR$6rQ-W#%v;5xSyU*wr$1~ zwD9}Dr`x%ZsiF%PL6?+SXb!f0iFde0EP)~2E@qm~#$34m=R7yqei@p9J42(c_^v<; zd zV86{far<=UHhMVoJz4@wyo$_Ml%qMg=hdjk-jAY#PwDH8l5phjfqS?7!hGtX8K@fD zBdwnWnuDS|ox*rx23E{?NPTg@To|uyX}ZUz6xZ6tM+l>-Dp-lVN)+$XV5Ni)ae6 zsppfnxnR!x;$1nfO<#}3To?~!7VMW3Q$TG?3SM#!bK&}u3=7w$_t6yPuK3IQKYjm2 zS2xF>TjJ{G@bj^fV!QCV_W$(uZByGG++N(ygNpqBm4}M?3iK%4ZeIz$lK=V@WGbGf z8~t;;C`G%>ONvka=D}C-{O)Cc(?IbwtyrB^;y3%gw{n!#iiHxFuwgt*jpK|=JXs9bZ`y3Fq+&AC{vs@%f7JM3?)-KgJUe zyFMVMgbzt?abB4p%WrhT>$a(%?TYoq{Tn~WCsv|=?C%&{=aZs8xh%Y0)q)!JzWsK5 zqJI2D-G4qlDX;sx<0)R6@yU-byXHev0Zj!o70^^bQ-Oa|1%5sM!nWb67rK4lLd6Q@ zve*HKPtLZ*>z3uR)g^jE zGx_OWhZW-ZVrKK6r_2wEuDzhQ(X_RAUv{}{y=9{Hox7qb-4(;PofEC+y3)!xU-X`& zzh;!&5nZ-@XxU-T5O49{0p_n(hfXvK^oVJfv#K3+4}M>8LX zN^vyMR6tV!O$9U+&{W`GS^@RzU*xhEjqmwB*?I{oRwI{-JR~6;kk*2Ryr_TyeF}FAWq=$Q6&}^D18T-?b}O1jWn# zxgDj5=dbHs9w{6+6DY0BuO{?*|X2cYDfbn403wVC2Fz@zgiFrq2;XW6BrqN<9 zm&Kbkz0-l@4CtH<;KlYF_R4HN*2=8F+E0uE#WD3QEU(Oj6G0ncj34 za}I)hT^5U$%UbO{7b#kphj~axrCgXtd;N%1F{eP%iLP;YuekmhFG@p1Q?PzvFHSTA z9h%1|<-&bgVD1tzm&?|K7|jyRK_!!2O1T6qAI;h*<`T$BOH{H2R5x$4P0T6i_pGn~ zOd78@qM(&~W`Jl0v}d1QEt&)WuN}54+c(!m$r89o^*|OB8+O?tT4n+eGVISWRn?Dtgk{My(xpi9T)@ zXMHM7w9~-DU0$b)9yr64vzt;OjypmTW&-DDJakhLfmG;>=Sm*5rn`yFNwNKp@8=*T z3*}y(sN{fJ4}4#o`SjcCA(Iq;?%>~}>i+Y;M`^!`u6vp(|1MPido*a}AkBQ#%Ei%q zuBm{g0-6eFDxj&rzqA7C$Lm@6+`HQA)BW&xJq@Nt5ep5*qvf*92-|~=)}d+Gu&T*( z#}lHLdiC8I>89mev6*t&_C|4s>@T2s*e>ark~jy=!j7ITYOIPz(~$7E=duF{Xcmqc zY#K3f8=3}YWHqfF`DhmG*RkWz7NBXU)2P!iqaw7hy$$!(cjUz5|J!`#d2C#driJ^2 zgNt=i&3A{sAF3(JXB6wtcj{ z1kJ;mw=JWOl%rX=tb4Z6%9m&ws$4LB9a@TJ!NB!qN;fI4kB624`}%}fqgi-t7w{^z z5t@bpeGU(J<${*W&OAHbwnY;(4MVk_b?9j?+Ie=afzed7@b^Q>rb;PEXdVilQLE1_ zK(kP1^~QtV(P$cm|5d$JqZMct+D%JczJ4W|hAqa)XE*1dS>Zmb$+{yiqG|YYxmSzN z7tnH9@k3eI#QUPB_@0aR%}3MlX#MarYp}lhMIa?ZVw~(@s$FbV(!=H zDds#JNgnNb^EH}3mBc*c$SzcwSO;?{ ztoeFsqG%STJ-Kb=Y>PP!+0)aj9tAWDd0khZGi-|H!RpD_KITqn8q5wI`_jb~Eti3( zWAi>fq6gpZdSYP*G!1JWH&{5PGn$8CgYMXGCT8J=-`lB|-7u$N-`Lc{C%d6p*xsb- zx&htMJZ#GCFl*TWv=nZf(fux(hr`j-r}ZRfVaB-WrSZga*~Du7bDs>w1*1n0M^^`%bgbEL=O*G`V0Rng`doR*gPS zMzhfR`_=3>QD_=2zWl5E{+Xivjs>UL%|{FGubYRSOpiee#}8jc&ss)u79v91*4V#5 z%pcUVu&We}W?}V_-B!B9QaIX0r+OH%C9DtY>=#PRL*?;Z=6xY%Vet<4+TV$JSa)W+ zufbxme^pz8Lpz57P9(QhGY{{c?>!Jgaw!xyHDf}R>~(2V>I`BYRBZ`bV+Pr6C%IJ3 z!u!XT{ylCc;Pwgoe<~054oN}taQgYo%7YToEZl!$o>+AYng+W-?HMbR&@7boZMWsV zk|hU*6+GCEIStm)R@2WP7cFaNbJc1WS}yC^xVi(ChGyZ+xLuoX>_+ooJ#mG;>Q%g2eOYUaT`xNqzUrCilCG`}$XWX)^1ez~mk7vtL3ZlQTF@e5mU z`Z`*8KR1l7BPl@BU=jO1@jJ2b{$af$vW0LyBaXKwPwEnV@-CW&`@>xxRKAa9;bBT) zwKfmXG-%b%**5z*S_&ggat=%& zESIsvWizvjad{T1d3bEJdx93e9*x`!T0cb#-%s0{!0Bgb8l2NEnRX!CN5j@jx{o)! z#GD1=1}Dtoi7la^!Ktj%#8RkgZS-6;4}Krc*C{7C3%l+gAN7&g60*iy%`$q0{adS9 z`2IAi&PhlvRWlF$;!3MYmGZ#)na4!i!jj|dSWA*ytCBHGiVt?)H`mbw1ESDLDERP@X8FS(Ne5Z%JLh`-#^c0d?!qsmlSI;D7q4trn`!^8_Kd;(H zvo{h;!M)O(Imd{3=*EpqRQCPE9G_!VaQ#wvxO?9@(Ld_bcJpbH^AIzzK$`XcwRi7P zHKqR_z)z@l<ZUzLWT+BF85oE2GK+#m&zrXR4x&@jLU=y zA!3GHCYKVTA;nQHiR!z*#(q9e{nmWvw`Tp;`mOa{{Ua~$&-3hko_#v&InRF1LCilt zyJf63*2ebD&B4X$;!P%0-rNkFm@vIQpX4fKR#x!rK^=ttIN0qGr8z}MFbi(i5A;}1 z%z(|H*>_aLEDQ^=j?!)~)T@-sZ@){r(orx2T_=xQo773L1m1gt?<`%x99))FMTP1K zX5p=;UegJZ^Y32*3uA*=%r*Qr75CN`%)vKa$=<2NEcCkMRQu9E$QjViO2(5;$MOt++^XSqrmJ=B`}zkmOtoOJJ)_=+`w=-rW5Bc!HBogQ0MKD&?v* znvK)D3TEI;(ZbCGx(H@rPwC|uyNDS`@$3AdiPWoHMRPb^xhoAX%@+$yvlK3@_~Oe}$L<`;gLFeX-D=1m5PYI1*(ln1eI2@4tIb z%t8;h{Oq`Hm?t?jJ~8Mnm<6a8MPh#ptobn~!H@LM0Hdlt9cG60E&Zm=&}|Dy&Ovjt zFg9gm@A2kBdj@6(Wq$817tBIw^rO6|Bkon{HLvUJ%pcVY=tym`MJ%|T=LcBY;rXTfm7l=)~0%ziVb#E;}0R0R%k%qCVq zQ)RpRvBa|fVJ8EdpW;X^f#zo6NO0GPB$6|5bQI;Uo9YJAop=uSduC%BK12C@oV{>-7N!~I zKZzmcpWkjTs@FRRxdaYv+qI^Qn1jr$>aQ&wg`5SQ_s{xOlAK>Z`L=I>xfA9IlilWr zlX?z%=;qCeCvI8)@Aap_7j{tXTRQUgy6D{`=b*V+*jVAR@`_I zRZPr4tZ$J{B{2&clSbS$cNN+*kf5a~aqA^m0)4(~x8H;09Q5zn#U_@R|9nxc)5HzL z9DLnLI{h{=1NGqs=RHV&{CeY%Gokw^&#xHuHjDC|ozA*B;HysYeskT>X(zQ~ ze&~aqZW2+mm6%_DT{gx`^&i~i>|Ot;FSZ}ikaWVgAKJ~yJ=0l<9(b|BH;|a0Uu@1? zw&gF)zur%(?zkGTy?jLE?6L0X{-2^>Z6szv%VhZB+ka_({U|B1RN;Z`7q7JSGWJBT za7#`dOW8G%)r+M(Aawfpos`+(Q}^!ekL_oe=1$c2Lf>>qKF3i$HuQOk)&R^q*>9RV z`#*T8EG?*?H`WJ8&E2^<@^_q2EL-qU5zUX@xyx8kbWyyQ+^(9Qfj;xk@WT_B-YDr4ch5DG#U&&gnZC`^zpX?;l3FcT!=uWXe>A3y@5`!eKLq<@P1KJAWi{)`2_cm0i)QJ^P`+RkoxY9o9`wkNrPx z*emg-+;~c7@j}YS9u+yKQ(kNK`s%NgMdiPy)=)kXl2U0Lfc-N^Hx|26cKxbs`!LFr zW<(sGM|r+OQQJ7mQFZc=J(M>T-(8+Zd1+;zu-lZqyL{+UN!f8s$Gr`d8`l(u=?}&8 z+tdBUQVC`MqdME{Dc23O`o)8Cetzx8Aj&>-!fVD+z8<`F+f3en_jyXKKNl#-=Nnr3 zpYJCbu|(~2-|N2|;m;rRev-z-*8L>S2B#IRBhWemts~Gn0<9zPe>(!uqB~Fv^U|v8 zE_{Ac1WA9)iCf6w|6dw%cQN`hY4{p?>E6?im$^DS#=fl7<*2{B>L3@&)OOjl=*Ya^h#9E59^q{n zDzs-{-vjFi{o{gF%JiFYe=I*Qn1%5!d7@K=f*BYZB{?zk zV}_WwuYX*;xfIQ>FP27pnn&t6XnQ)^a}}`!YzsRLMDzO_daoOT=J!X9 zFbzTT>xJ9=y2p_AGPo2MW{&0{YKx&IS^{?;CiXxxU6~IA)U&W~(=Q|ejlY0Jsn#0H)`-vrBGwpa9n!jIoVbN|h2hP*J&qPZgC@gbC7HKbor)xAvp*dLS z-E%Zr0(NC7W6&}f<9s#`tpI;*zq4rmdM!V64lRSwKBw~049vEUjCezi&p#h#SXlTu z2;-qrh9+NVEN~Lc!jJ=|84sKV^ZQ4ZMD9bYl#&HM7oa(ax9U0LhKo?of~kHCW&V0j z+B%ocC!PuGaGTU~uv2W@`984(%5ozO(JT~alo+8o_&H=ShnB#1Gk>)$A?;=GAkD`f z&F^pcHQfO%0f!}P9nmtl+p*s~v;wU3oadt@@bgz)7NBLIZ;?k?0fs%oS7UAs*Ey3l zXc^f5lucOyZGLo##hd}xXYIB#uEO{+@W<}#ojX9VO1b`W;7czL!TjruZtm+wVg_Uz zgKE(#<(j5T8cihU;J}ka<1|lf@8x`xGJn6i#HAaZj||bONGJ9D^E21y%^qS2wC!*G z7R~RE6rX>G=D=W={RgxJ>QN-O<4xlJg1gpu7I#9 zx=+v&XmHv?Sq5)%x;({P0g-FPHE3%XYM4k_2KT(0C@bJVT2L)r|82J`@6mSf#Mi72 zt$;??S(L3|al&EB{QU-(#R(V5<7Z%pS&UDbk8nLyO6`v;{R?~rv+yapcKkp;!TkO? zgH99BDy8}O%sFTdo~p-}pCtACdcI#SWd_tO#T9gJ7gn!0P3k$&j5pKBBbLAiMGj?t z|Bc-}P0ac0budK>Edj}ZsyMU^>YILAhvp!z#C<(l0`nRUQkFqXQSCv@72vjF@*%VY zT&CTiECZ8yW`{9XK#g?uNwhUgYq&?5-(R!A;uPizm{$}=*&4*+-MN_CLF2B+lojCD z**Fh#YnbxMn=-#&G~mkSTV(tgcxBpdq9{PPe*FH39f9B6BIfVMe0wCd?9H|_0-MNs}U zlCve&1-UFj2XiCnklZJacINTtxo9y=I9F)oK-!C-?QU*@-7-9$LJ1M}#3DEuHGT=5 zpUJws2y-K_xp?yy?ZihJl*RBS_COm4(w`W-{WepU!i`-H-7puy)Zq4&OHbqZ9LT-9 zI+9ofe!(^G=)BY|fy#}bp|Cg?>y1E1lt)<%o)g3FVlIXgvw|o~;ihWvbIhf1vC50G z9F&z+wV3nouj}GA-+hSZTV7@R2`z#jIvh+v>%xim?Wo)cLJQWJ-Xrae;25`zvKSIa zds$;HhP9pgQkKH_ra`WlOCjf_H)T0Iack&@xg4AeK2Wv-!^!78G3Uqs{=TF+b@+I8 z%)!#BxNy#Z|J)ob1@X{>_u4$y<+S!$|6|Bq;O~RaiyqiZ-wuO;%w39Knh2MVEqHGUKoI|%`E`m3|gd&0yccaiE|u|*D@dPBD4rn9?r@}>%yGdZd7gr^5lniF*kyV>q{t$ z;kVb;4=@+Q{_9qh`R~WrbN(UbQt%DVr!0q|WlJApE{8Mq-%+-L=+4>Ym|MZFnZHoB zh195BPcXNI5_Q`4@a@#mPcgTLXieIVz{IMk+!1`-Xgfo3)#M6n&wrnU%lbQB=E8XL z-|w-c=RLG5EPZU+fEGbwlfCC~Io9WEFY1r(4MlTgVQ3M2^56c;*H%~`5}%rl?gRZ( zUS30s;Q2YW&o&#Z*Pr-|azD6HDel z`^lM<-670za4?;FEgTv;#2M?`s;*G>0I}xc33Prlb=!kd7p%`LXj_K%gkMDBXJ`?u z4Gycb?}hc9wq{fA57$1%i5y6-Qp&A*1;%)pyZ_yMFY(JnOZa|+mj37Sy)7|npZg9F zZgGDWJ>MHj=6fwaf2mTg7+f%CtcQd5m(y$g(K-UHBhWemts~Gn0<9zPUo--LH$M^P zC4cqvpU+QXHvTz35jPu6dVbQaf79?k!`Aspvq5S_>j<=tKeczcGWELme=e*v-3Q=oQ1=IMgDKSud5$+pPkufX1>oe zvop^=^PH#SV!Phq)51q!hqt%jCHTpg_~$P;3J>r*NMrh7xbT4UbT}7!@(T~4w!qSw z!F@mAFV^BWcEbJCWSdQ(Igvk}Az3J_!>^DJ-oJhR-#{SF7M;Xe+7Fs*h4W6(Ga!YS zM01cM(=jwZH#>{nOK>KIIEPcRteY&K$o`abGy;9q>b0*xXkTF(TU%%%cnkKd;o0o* z<{lpM6Ra2UKH<%7E9I&P1FVEO3bj^Ar66Y%3uIQL(c z%nlFvpV|+xU4E<)^e{sIa@P-wTJZc(BqwhF{hvX=RXk7kGc*b6PzP00xCG@C(dW zyo=Ktiuf7dCr9pg&Nsa)rwilw`M>pVx0u9u853(Ck6$7bY@ z5R>dN@#%R6v1>+dUOs!iU{scvktgPlaFpWa$a3U9GG3$)4RG`s6ev=@*;&K1*`11H zc}G2D9wgxFKpq!q{gXyGGIR2jDg}yT$Bs2*jvJbuZ^&}w2h!^0=Vmy@IEIO|;$0m> zatqRP$BQOwplCLljRrBkUrc&Ft73YVn4ROu3Q8Y3)RC7bj&%&l%gA@|W?_RFBw3W- zkb->5aL9OZlw;HoM{b^&JzQ>L-p~w3R({6tjG;8+s8I!38TsQ4T(dx(g?gZ9+WrB< zw6Gb{C-|o%*<$Rr6#sD1-ywDs>5I=lQ1nkqPK>do$aigG2X6P*lVz=Z#K| z?rC5QMs@5db{35WBRx!JOCYOWPNsvlFVB(Bvi44jjZU@2vb<)a$rNM^rT-~R;ijQV2W3A|t~zW_&{cH%@ah6#$vP}YrrQRa63j|=pz$qzp9qZFWpz&z`n~RMu=|K#Ptq#Y_wm zqf^porqpD6jF>{-o~bc$^k$dd@rfy7`luW+Db5z3lwuHV3AW^JX(GLyB6fy)8OlOy zWYC&}MUy4mWC{VQ@Twyqm|@%`PTn)sSRJ5>T-noBpnZlRQ`;1b@kC4W~vO1VWt|ykyXJhj7D8B z3U|1{u>queR#P8?gTpF;BhBR&$BZGl^0=FxS!&$WjED5qBNylfHB-1ze#uqwUBe)0 z=ms}jHPPjpeCU1OSj?5_$26B)+;9TT-Z#q2QG=V&AeZL`w%~9}u%154fM~?w5OADR ztHKi+Lwa@fEyNg734NovZV7Hw-{b<_0A~reSabq+ryJawK>D9>)~9b~gL~9y9=Dj4 z+ebx>vWaqO6+>pRh8uOgXzy}^S5rveSLOa$@!T)iVATnaLF}EAnVmk2&h$-YF>z=< zT``!#45FAif-VNGBfEiq@9@lNUp;%ieBFhSb-EQ;%*Xx(7({I`bbTSy-4mWP6tTwPS(&e1G zywG$SIy){0tx~gmOQ&$Nj?uZf8=N3nKsyN1+OsRWU;qFe2lhU07xZ*#pC8wba~7e1 zRfJ#smzz(ZwYN`b7hDBUBq1b(U%1jU(azIJkBajNJ$bsA$j|r}?SiQ1JMY7k^3OPa zc(>%~@H!EUKqtZTxIV@YSC~)RFUl|FpLf@le6+Z@`##_e_FVf-=dY7epdUA%|Ffi2e5Jb+p2u-*$*%-L6XMQeR{*d;2Ve0rC`4gYJ z?|ZWS2|5!i0KcE(i+uzyoc?w0ajyEatM3|993O0Y_U!?YHgBkz^`WHr$O%o}?e^Vc`BL~JOPhHdw?&RW)z;*_ zVxqJnX8*oHxm_Y(+9s~b9Wh0!ef{jD{<{d||F?8RTJuBgfl}m#`=euSoZQ`BeQiKbRo>b$GsG{*b;A>eCwdZI;H*e0{^a5n^Ppd~B5#k>qYa>}VOe^-{pV*`I8eY{LiK z`)JeV@cb^R;nxc3^t^9Q66GujwJ=J-Somya)@{&nE_qtb_m zLci+Lu@*dkLRztZed4Ys|BT@If0E)Y0Us>7crk*DvqT#FVc$7kYkrU5^}8Tl{^hQQ zvwEM2_~LVRT$Jw3-=3AT`B%t)MOqd1@+;rv{tEf8D>UbSQ*t~I^=-=~_`E<`-0|)G z{r3JA!SVATSROCmizF>-;Ir=g^H9G!B)i|a-Hxn3pgeEF+j|YteaO@I*V{7xiV(@` z=S#l5`qydSZDCl%wPF?lKqcGNPP#a{`kyh z(7$gYQj`4`KfP*;ls5LroG+Gs8}V|ZH$K{O_YNt*czN$TH@=4FKa*zNb#Uh0SC4`| z?UO!PyLU!abI)yS`Y*H70$eoyk_r=L&n zJgo@Qy~u@Yt9neiv>oc>O?dnE0>64>Zsza1qL=N5{!}0I`5-*+3;J{j_%|T^`;te` zwK@d+{0PS%^ZSvs6Eo}mdTt-&Z%mGM2=00Ovzk#C> zLy;#RUmGg@iI10l3V)7UW5V@m8$5p}IoNs6(|bp*0exsfxW2B0`ZXh5zn23og8Y^N z-G*>|T?(`+A6}l9A}>y3d*6-V?^|EszY*H!M@Ei();p~M%BL~Z|CNZ&vOt@VgK6?oDE1aJ_0NHVVrls}I&x(MR5n0P6 z-KzPSY!?R{*f(vQpB1&|4Jw3oY3FBr-Rh;x+C~H@8Oy!E?-L_Bl$)&FL@8VeRBn}f zA;R71;D1nVrhmXqz4|Nr6@c8BuYt;^q3nm3IwIGRHzGT8nCye%dR@Tg_v}#L!zd|! zAOCt#&kmM%GCZJNpMaT7@n6x>`t`r$L0*T&SXG&<3H@h22P%$L^NWel!unqFAu@WMUYeD{e$^Hs5n+l9;N#S^OaEf=#xj-x}9S-zq((yJU}&+ z@k&eUmq$(*m&as&g1;3F4*Q3e z)-R6|kVjID%Y*r7s5n+l9$DIFf@?btCDvni?hwNtp{e$_QsC@LvgR-CpTc_%K zpQFDYj#pY*|9Eu*Ac>@mFIaaPAL3&eZH3p+HTHxK7K#gUrtG;f-!r4@c9Dl871)ir$Aqk zxV>!)&}d)U474{X{Gr#gA3lKgG_>!mgY;%(_mzYh3kR+RTGZIv+K?81HojxztU^c+ z1AEL1Ku3W+X&%sN#2NN0bR6RcZ{J^1y}Tw3Zj7D*`O)5m_B(H-K4||z`zYG0wDzB~ zOP_Dpx7*8#{RhkA=d$)CZjYL;*q69{^$o?o#O-<5p2ox-zm#1~$E+FqvceDTV_08I z=X~7rOMmc=daZ>eiv5-A+cKqom|i|VwYF+M;rBTHjmUwCd0js{V+8ygD>Scf6M`H# z-9n)`zm||+g!+hNk@sDN8NofEz9NZ?cqgOdP&?4ANUt@G$=aX*$p3)CkC&67p<8Nb zk?`+9A3}XwY3R0^{10mA021)Rin!g~i=g~=64Shs&nPCEh5dn(^&cztS-jyJcC`sS;nfQJ{z<2dm1A~}1P24%j2-$!bb2A>(a zw-pZnzd9g~VyJ&zGU1s+vz8y<4g9>xpgre5zuapl@bd=y@m8o`J&inllp%B;G#;MDX&@L;k_g{tF=QArbQHW$Fc~U`NBK*~5ncUVmuD z%PWw79`L^k-!oo<{MVHBAs*OXe)a?X{Dqb-(5b|^{?(`C9Z8gp(LlG;$Y;78grCDq z@|im5%V+9wE}y9bH9b?GVER`Om>(@WqY-5=BWmE_cJtck{vb3nR$K@s7qUiFaDWj= zum)FE7>&{`1F-%O~U^;sjg$HwjR37a05`;H!PKpzV#3n1DiMb z@k`BLci&@VzbpC->c5uOum2}t44>mvqnglv<|D4+ST%W^Vzo=+Rb*qj%BMQ=VDr%O z<>Ah+bOZPYGu^m-{O=*4^(&172zKHH(8-CVcaaN%vTYmED;tLbwbY$nUKz$2a4oOpbN2N8~5~g?msdm1vjl)w50RI5aW$;NTFAPtD5``zhO!p&WOeI#yr1FFC zgoTuiM&sP#TM&eYwgK1muJ-q%9|44aEUOQ0+Z&LZo$o#XkK1?%0j99fPVLIsOKX;Q z9*2m=(C}ayG)Ko?S|-XmAWv5~p#Rr?$X9i_2aGYfg~9ALoJLn$7tv}i3xhE%i2gT) zi6#m|aCk_F&JKX@e^)r*I=DVe40Pc@T`MaAh1(D= zsD*A^&nd_k)9D8IvDq~KR8BgLL*fu=XtGR4UReO?_I0B<$Q&Y?Lf8)W5S=^N5jQ+* z<7F@(Fm{~gCq4aXjM*)CA#U}kEOzF0qJo_pcvx&Io%)5}`CZ|I@olPuPq15jtX6mL zowE1@R~{d#L3#ssVf-Ff_+T8H>fmE>gOABzavS@gEIyXX;}fbgNC@pSxW00Q55}vh z4n84n@v-Q@C#3TDbP5mFJAOBYam5ur7?-9x_=LK}r&DOv`&Ve?@v(-Rbp@HB*kIfp zSNJfW9(Gg*pH6P@F&k*?L^t6E%l5BMmB%McKR!))^IgV!LciL)w164` zsU@`Al^#K|Faj@X=ypR+^X-h^7=VRW+~TQ{jOTI@3XS~3HWfE6uy}_Z|z@q{vP<=LOiv! zemrv^rotQ)@h!zu9zOvGCNT8(Aj3HVg$fX8+2A+$_Y1_Dj$9R1>7&1`IY*WTYGo8vORqhYm$x{2$y8fboBLyo)2? z|NCzV{be!!&$MoJOMYtcjp84i;(4jx=lf4Ypnourr||=%zb+k{*Zif68-D_S&*jpV zt&3hxoP8<+37+32 z@%S(h&qXMP_&`_Td5r&q@o>I`_&nF)`J)hj2jjz>kfepPo(Q+9@qe7--IOTtfzaQX z$LF~T{lKJc+{yd6L1csW92((=a>C0_4f{hN?3IdhVJz6C&c0|!foSwcG_NPERm3|)(9v|p!NZ+c7Poj<% z+WkU2e$-XPznbrlxCZ|9%b|Z~{TR|0u% zICc-X2k4FX= zw?Tb?+NfCbOMsmIaRQ9%B)iPAc-^D|GgrgNso5U_@Y0?JMvWG)!=@KpAvff zX}WR*@b-fESl=n~;qh}eD)Pa2NxT_#2p``tzE2(Kzk3w<;C>^X-y8O$Y**y7bY`cd zc?Fvl`SAE$s}=e1{V}UF@>v1(^(BL5CAO(^-|LEe5MTLR0sc<;{ssj45h?Rvm^Zts z8qTgtV1D5$AFf6w=ef$k?~9P^S5R@jzk8}Wf34a&PX3+@^I-OkS>>Z|9<1)?K}k6y z=g#k0JMY!f`scx7Ca+1&&x4sRt2kCo9`bi>kOy08rKI<-xwe zt2pYHhjaWCee&RO9nQF2w<9WAJ0O1VM0sdw{qi8=WpM~%jmyJ1evE#3Fy8=N{|l3O z?FaKyrT?n(;E(Y6?@eWX2#jEV;trVq2;|*QPDdW=azvT`@%XIYD)aN+Znm_7B0x| z``TN|{BI38wB`JSx0U(dfXj2G(-G5@`JWSj70mCrz2bZsyzqHGzZRfAOBKA9ADlXV z&q;N@d}{lj4_O0_D|qq!?YKVjB0XX+e(`k3CS|_N=ex6kUu|W5#LKM%`;#%=Dz0a6 z{ZUu5|I}NFXUXg94eQ5u6udBgC&%B1VEg2A1^Dp&yq6Vx5D$DF;}P@q#8yRrFx~^M zAKt(Ga=SKuxL)%jh!5xI1?#_63LZRtH0T@dw_XMO>uA;|b(QrQuNSWGaK4ZGujeax z;QAKv=y>1Wk_*qyud@E|{&z#c2k}6BIDbzv>P+nQyT`xCYY`xEaE7{AmT^ku!Wp4#!<;XfWe`HF%E)|a2th!b6besFuD zpybE);`1nf-u|J=_~9In)k~2djvqL_a6Waw9`K1Ge~hPq?RAbP;jQ3}{ekbteobj_ z^Pd_V9vQn-89#V@iY z4)hmX@77WJJGLL!zr23l#uPw13iJd!bAMT%T59zp{Kad1;y!!q6?zlhSK!X1W8hIrZ zatL)EsBiwJzVGzSr?vAnEvYu+c-$j*= zK6$9`SAFupr*J;4rS;2W@&r)78lO)y9a3@BFAwG`sq)b$5A}VHNCFB97!}6_*7gT2 zT@86m z(|MtV{6zmU>si^uXfTJdyXK+M;b-8UP8Wq%;%w#aDw z{hv;7pPuD>oeVNN0YTstd!lj&+Oq>7`{FSbKWBvG!ILY_hxI6#QgJ>4$&;U~IN#qr zRqbc``|I7bkt!d3{Z*asV$X9%&YfQes{=c*ziMgy<7e^HoO2DvjZWevG@~c%uf=ou zJy-pe{Tfq~cbgHO3;(uM;?42-{rwQHj=+4h6Vs7)0I9zN0EOGUFP`tU@xGfNluII*VA9=33MzuKFZeN z(!6d!+X;_%7RzZmALsD_MNZTCI3ml>YJ5J9@4bMx71lrZLwyr~e=ALUTf^^jvuwI-3=~l8OxaslO^%H>(hxOq&pfUbsF3{1$XGXKw>mOtT9SiNt z0NU;>Z;E%fEo8v-Y0*5r4BjgGe7$+EMjj&Bm=+h*y#EB?-&;_0p#=7mt;SC@kMw(5aORM1=>Ik z&L2B*SLmBS8%e+2Q{O&XzYu5>8DswVvALh2y~<4biKaEjAH@6?@?HnBrNxfLkUtdk z7v*Dx^5#Q&IB9pR$F8?d&IURX^y?X*qsa6}8t2{k9Q#kSroFKm`+?orKA>IiQ-6-9 z=C0iLVN8Fx-hZb>zb1PKKk@uoj2;!f9?A~ zOY7JF;@KSYntMMWj-~f26))$dy3&7F@t}%#@#i)a@w2OVPSx0F+r?cx4Q9i0x1YUF z#t<5QB_lg4JyWE6x4Q%<*|mF;%kHx+9h1du4mawE>V)H?{2rhXY2&dlU1kT(BGel^YsV$#>&lLA z_{lvU{$=zh-5HLuV-ee4*(g*|<;_^y4wsJs#G|#LX(* zoyMBV9h=>O6dG>P86c{%@u8Z->|MwEEXH}*DXTZ~Uj8a7PE0v3d@-o2Js}~ehdrf- zEm=&BOSYxNCC10nFl5p3wpg)CnwS)4i%&`^2TiAOJVbxEJG%bhhpT?bd@|T^k)QPR zLt7>Av{oieNomEil|Oiw0~PC?78)Z_G+M$fA>n3yk=xMkz!gr+SArcs@{@a<${WAk z4&ZXsh$?Dc`sjk}e7D1vHQcDHN233~D_oe*0z16)_s5jpJ>ATeOu_CjDWy7eM5i3Z z#I9nBJ)v8?EmcgRA=7OsVo-m3QrDoKG4av8yT!%Z6Ih@iYx$#na1brhXblghk;?Q1 z+-%BWp}&gF4{e-PT+cn=3b#0iJTN6E#@JF){KG~0{TJuJ`BR*uGI3T-!J%ctti~kv z>}g9#Wjse^k8)(?7mN~9lcN(-y3$c9NbH)N*i($5f09xY6GRGMbi5dyD#j=F6>SN& zCO2ByT85Iwbv62@h|vkr@o6dc6sDLxZT94#c$>XTf<3iAO^Fo~Q{!yO zDe5c1<($kS$L}=hj^D}A5riVV_=lZUyG+&WJ8V6Nc8OaNk3;P7AApe7Y8>@Lu zYTmxX)`)1|EMCD&b!Fe-_Dyf)cdf>4a>h$b8R3TahuRcp+6v^tkDTvoDFQbFKGvo< z)3}Zs_m=a0Ern7a_l`Ejna1(Td!_SzEhWN@g{!nF&a__rXX|v-|68#Sm;dgmNSFqc zcevY!i}NY8UukLm_RYnUczujDZr^9RqE{Zw4uJAta|D%-K6|sek3gS1P)|`FT3Ww6 z$XYIsn*08RII=l`ieuH@56ljMd~U@)TzOwg^H#)l|ET!;7tXs;9$H$zJc`zFd5{|K zAI#>VydO65QeC|tT-pCicJt?qTliTWcR0=ewkG7~+!X^msQw)M_ftoMzeHQ|>ZJ)! zJnpNPbU%>sF1~TEhNmG^ohI;4yoLTys$M(e?^K=;Ncy$v_{xF9=pSYv1y5x@ z_p%xNk&L9kv}M+d&CuV>L{2|EJuT@T^nWsI{LzBRh1ct*O>2kwEo67kYjYNjLH{%> z*?;HeFIK#Q{%PSLAM}5VB01X@dym+Uzh4~-@l6&ec+EO!zG}D=e$SNR<>_^0<*`rE zzc3B_nLvKjKZg64;eMzLXMZP>?JSR?T*yC+mq-22ocv8`{3GsvlMLyzmETh?jWWBA zWA3k?vT>#K(Hi_&J3@QfkkLmAhmYTY{y=TX;&or0e*QZ869te>+pa#|#uxpO+JnF7 zOn5$!>`xv#W0{DwLF2zL{7MM=Pips%#ejdM9aGqfkjIbM}uAUrRB>4AY z`=iLx&^e=*T*m&=h2Z{Au7$Ch@zW0J;IBselas$0_5b7g4*q(yKXE=~|H|%{ANeck zhnMEiTmH)U&HYT;Ir}dQCTIU!bJnYBe12D*xE}2L4a%b-t*|Ored`}}oYyB0wEv?#w6uPC zta_izL#%Omu$HShR&D)rkv@y^VBdsPKKkULj@$a=pB4@djY}WEK@yG>!3CVu4`2L-_B#`TYIJ_gC8aGFdv6l-8hns_ zBVpIbKMoWA6K7ekOBdW;GhZ{nd@mE`Uq+Ze;`+m+iLX&M9tL0UtLvF<;^S-k55xT! zp=7?H+ttp8aX*_?6E7oNvwqjEce+4&I@B*#W6!XYMc#K6W&{u5>2yBL_wS`b{xs+P zcXU4Kw4X!B(CjzMRrc@6sL}Z*-wz4vN4g&EwWcvy8x+9#)A$>OvkG7Mr0)Yz9@E>> zM<7|b{O+&6d;#}w8A#fRne~1>hwF2rW<6qp^~hS_XNLWI8-TVzywoi~hr;?{2hd?8 zeAA^p_cZ?;=qPghUp=3$Gkzb?u@G;QrY|qzzQ{t14Yjakb``d32FFar3{C`*ClV6(B zv8Z79?-3ZEyw)4ta(2)EU5QWbxAS4K)t28OUid7D$JaWm#3$$Rqt7bw$yH9k3yhkOq9 zk8YK&?R@;y>I3H@Fg`igpL4)}m(;Z3yY@kb^B|96X+Yvv>5ol056>Tvnoqj6aWx>@#3UOx^{^|C4mz!1>AbzsB?uDdM%Q zYu0zV2>dTd_U*@p_&P2^e4vX`tKHwe^bFAvzQnmbewz5* zjfpcJO~|ICra74dBb{qG#KuO)f?k25=0ZY=>?g!tlTfo?-4JacH)^5ee(9pD`Q zo7y+Nz53T_-{n6*x=D#o&D(2%_)OnIdKkI6{^W|y!AF3OQsRB_{C2RH?BeM(K6z9l zzxrK2-3Iy7oW~E^pWnMXG*OuMA*5$Gk2kdc?!J;RW8uKHJe~Gm9{&mKD>>81s&@OH zxnP3*m9+oz-w#*}`VdTby#zsyPgC1M#$CMot(n&*Mac8u&K83E`Q-1$c_FZ0_z8GE zMA_fW(?b%BdBDnoK4EW8Bkk_HpBEX&n_L-v2u%Gd{2-#k8cQl!^ zVs38mvFEuyw(X|SyxwUfkB{rCrnvBs*%{ZKpwv?ui2TX9i1 zjue7d4X$^z-z6*N^52*0?)S?gp~+}3(9-(t1&gqI`>*Aq3abgk8Ecm86`CdUrMQ%mc|bMQ{i*$-7)CT|s<%qIhJUvh&*Nzz!z0Y>?y1O6QZGsjG$6!f?P?QkQ;do%veyyj-NnjVZl#u z#?}WjHg=Y_bQTuz?AhIfbB{M6j0BLJ;_mC*y}RGp^SI}2X6F7-|5!g@i$);=G0n=O z#_jtUX+#!#jv0q(mFc?>F%Ap>+HSEv#{LswQjBxIg-7W$KnTRYP<{;-dx?v(V(&IF z;#c~0>Hmp9CVg)XGdtk)q|Ww7&o*DF*Zn^FPL4k}2pP>e5QR}y-A~-L^`cjXcw$Ov zuua3n08G@l&K-wlh|CkAx+@$_4XXaw9O!{T=!_!s8Fimj-$CLHi@BoHb;SAO?p$xD$(mVn^xmB0B>&^QuvN?C7dB1Ho@0##fFUk02dMwk0 zP{et^ta3E6uQuittrz8FO3hBYep;;;XPsn8eZXJqh&irlqQ@AJM;#vrP*vCQ5^CsZ zP1LG-zvDwF{$#$1KYGJ{j@Ev^xwG|c(zcMsZx>l;tM~l}Qi}|JeM&c^A<7J`H0D|%3q@SV<)V5n720k$@GSzcQ@t;|K#dL$|7p79) zTPzFd@(1Bgft&+dc_Uqx`8s(8N(y{a2HSFglw88_& z9-Gjxsu1Ky)Sjkb|oD6}kQT{z`YZ{GTY1+2eXX_W&owL;mpu50Ov5-u+-)%nJY; zmx4gn5o+UMu6L5Z(9`Gti}Q~fdD;1!`=rsi1A>i*IbQ}i2DumT%k9sX8soBPWM|`Y sKJ$g{%_1OGS-EM1X$f~(vpZ~=3 Date: Mon, 4 May 2020 00:18:18 +0200 Subject: [PATCH 12/74] Bugfix background gas with CollisMode = 1 --- src/particles/dsmc/dsmc_bg_gas.f90 | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index c2d1215d4..5f9027fc5 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -196,7 +196,7 @@ SUBROUTINE BGGas_InsertParticles() ! MODULES USE MOD_Globals ,ONLY: Abort USE MOD_DSMC_Init ,ONLY: DSMC_SetInternalEnr_LauxVFD -USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC +USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC, CollisMode USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly USE MOD_PARTICLE_Vars ,ONLY: PDM, PartSpecies, PartState, PEM, PartPosRef USE MOD_part_emission_tools ,ONLY: SetParticleChargeAndMass,SetParticleMPF,CalcVelocity_maxwell_lpn @@ -230,10 +230,12 @@ SUBROUTINE BGGas_InsertParticles() END IF iSpec = BGGas_GetSpecies() PartSpecies(PositionNbr) = iSpec - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - CALL DSMC_SetInternalEnr_Poly(iSpec,0,PositionNbr,1) - ELSE - CALL DSMC_SetInternalEnr_LauxVFD(iSpec,0,PositionNbr,1) + IF(CollisMode.GT.1) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + CALL DSMC_SetInternalEnr_Poly(iSpec,0,PositionNbr,1) + ELSE + CALL DSMC_SetInternalEnr_LauxVFD(iSpec,0,PositionNbr,1) + END IF END IF PEM%Element(PositionNbr) = PEM%Element(iPart) PDM%ParticleInside(PositionNbr) = .true. @@ -524,10 +526,12 @@ SUBROUTINE MCC_pairing_bggas(iElem) END IF ! Set the species of the background gas particle PartSpecies(bggPartIndex) = jSpec - IF(SpecDSMC(jSpec)%PolyatomicMol) THEN - CALL DSMC_SetInternalEnr_Poly(jSpec,0,bggPartIndex,1) - ELSE - CALL DSMC_SetInternalEnr_LauxVFD(jSpec,0,bggPartIndex,1) + IF(CollisMode.GT.1) THEN + IF(SpecDSMC(jSpec)%PolyatomicMol) THEN + CALL DSMC_SetInternalEnr_Poly(jSpec,0,bggPartIndex,1) + ELSE + CALL DSMC_SetInternalEnr_LauxVFD(jSpec,0,bggPartIndex,1) + END IF END IF PEM%Element(bggPartIndex) = iElem PDM%ParticleInside(bggPartIndex) = .TRUE. From 3d2b10ef20cb1b33d00588a50a4b3b0b134b2523 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 6 May 2020 12:20:19 +0200 Subject: [PATCH 13/74] Reduced size of SpecXSec array to the number of cases --- .../MCC_BGG_MultiSpec_XSec/analyze.ini | 4 +- .../MCC_BGG_MultiSpec_XSec/parameter.ini | 2 +- .../MCC_BGG_MultiSpec_XSec_Vib/analyze.ini | 6 +- .../command_line.ini | 2 +- .../MCC_BGG_MultiSpec_XSec_Vib/cube_mesh.h5 | Bin 6872 -> 6872 bytes .../MCC_BGG_MultiSpec_XSec_Vib/hopr.ini | 2 +- .../MCC_BGG_MultiSpec_XSec_Vib/parameter.ini | 2 +- src/particles/analyze/particle_analyze.f90 | 46 ++- src/particles/dsmc/dsmc_bg_gas.f90 | 20 +- src/particles/dsmc/dsmc_collis_mode.f90 | 12 +- src/particles/dsmc/dsmc_collision_prob.f90 | 21 +- src/particles/dsmc/dsmc_init.f90 | 14 +- src/particles/dsmc/dsmc_main.f90 | 10 +- src/particles/dsmc/dsmc_species_xsec.f90 | 297 ++++++++++-------- src/particles/dsmc/dsmc_vars.f90 | 6 +- 15 files changed, 228 insertions(+), 216 deletions(-) diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini index 70864db80..d1ae715d1 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/analyze.ini @@ -1,4 +1,4 @@ -compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv -compare_data_file_reference = Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv,Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv +compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv +compare_data_file_reference = Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv compare_data_file_tolerance = 0.15 compare_data_file_tolerance_type = relative \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini index 02a63e285..61d74b332 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/parameter.ini @@ -57,7 +57,7 @@ Particles-DSMC-ElectronicModel = F Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_full_Data.h5 EpsMergeElectronicState = 1E-2 -crosscombinations=59300,83900,119000,157000,205000,245000,297000,351000,419000,593000,676000,773000,859000,938000,1030000,1130000,1260000,1450000,1680000,2050000,2450000,2970000,4190000,5930000 +crosscombinations=157000,205000,245000,297000,351000,419000,593000,676000,773000,859000,938000,1030000,1130000,1260000,1450000,1680000,2050000,2450000,2970000,4190000,5930000 ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini index 8566c8995..18af6983e 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini @@ -1,4 +1,4 @@ -compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv -compare_data_file_reference = Database_Tvib_00059300_ref.csv,Database_Tvib_00083900_ref.csv,Database_Tvib_00119000_ref.csv,Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv -compare_data_file_tolerance = 0.15 +compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv +compare_data_file_reference = Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv +compare_data_file_tolerance = 0.10 compare_data_file_tolerance_type = relative \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini index 2df6de114..9706a4acb 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/command_line.ini @@ -1,2 +1,2 @@ -MPI=1 +MPI=2 cmd_suffix=DSMC.ini diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/cube_mesh.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/cube_mesh.h5 index 8917cee7cb1ae428dd7ea267bd4712a57c7dd17d..ac156e866fbefcdbe6bc7138cc8734b20b7ac253 100755 GIT binary patch delta 666 zcmZWnF-yZh6walI&1+J7v4zG#tdlxOt0E{uYh6ST)J+`3A0UWJp&(ch=QcbLTtr8= zYJNfKEI0}Z;;x`LIEcpg&ZG!_@V(33`|iuTcXu~)H`A7e(9t!PghSE8J)2{v zL$;eHYItQ;@Z2&)lJmk+5mZc3%)9J2%t`|L*!W~k=-sm4@o*a~EJ45MVg-s6cU5dc zp7OW`9!iiT>f`Acj3sm7=l*!Di$xg0S+%c8U+3h~hQbin1jGa}MdVZ1#3a!PZom^$ zK{>MMjc4EW`SRpVZyx7q58<_fAE}izJJ-~LrrieXb|Zn?vfy%y80PPwIq1tOw76@8 z*SNR%Xx5dUTgl)88FWkTa;m{K6B+^^q{o+mnE@YSvBX1j4%9(Nw7{lG(rnQNzjKVO z?54h8<8!v4t}&Af1XQBJ3gq16%cE6ymYH@@Xs^Mze6)x-T3pT KgWzOvQTzbAX`Ji; delta 431 zcmX|7JxIeq7`#i2Op=AeU8r`ADm(uN0uql0@i zyXfYmaVsc9cM-usw|c##IXE8geeb*Xeb=w|>w&4`QLA7^uVI&SlywXHdW~{i>1#^) z(^n*GvMKDjTq)b!#3@^#WxSdd?b_Q3V|JNCkIzyKFWf=I8|VrTEyG42@l4{o#5;+m z;o-}e3m3;-iYLKwP_S`cSe~GSkVAQgCkj6b9qlIaDYne2l}}W{Qq03Qo1)DV+8&L8 zm>ns9S|D2Lm&;hI;yab^Gk?+c#mLKX%;rTPl9uYwGbUGS5z_S^PSA5UbCJNOQ&kHW zCqtThHt<$bTqUo&(_)lJRbp%;uVo(vnTWu#aceciZ(8NqJcH7Y7^Lb(rpBxjUR0Lo EKZE&iNdN!< diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini index 7158fe526..25e60272b 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/hopr.ini @@ -17,7 +17,7 @@ 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/) ! [0,1]x[0,1]x[0,0.05] - nElems =(/1,1,1/) ! Anzahl der Elemente in jede Richtung (nfine 4:16 5:32 6:64 7:128) + nElems =(/2,1,1/) ! Anzahl der Elemente in jede Richtung (nfine 4:16 5:32 6:64 7:128) BCIndex =(/1,1,1,1,1,1/) ! Indices of UserDefinedBoundaries elemtype =108 ! Elementform (108: Hexaeder) useCurveds =F ! T if curved boundaries defined diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini index 57e52e55a..260f6aea9 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/parameter.ini @@ -52,7 +52,7 @@ Particles-CollXSec-NullCollision = T Part-Species4-UseCollXSec = T Part-Species4-UseVibXSec = T -crosscombinations=59300,83900,119000,157000,205000,245000,297000,351000,419000,593000,676000,773000,859000,938000,1030000,1130000,1260000,1450000,1680000,2050000,2450000,2970000,4190000,5930000 +crosscombinations=157000,205000,245000,297000,351000,419000,593000,676000,773000,859000,938000,1030000,1130000,1260000,1450000,1680000,2050000,2450000,2970000,4190000,5930000 ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index 9d32f1893..b9b853a52 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -681,8 +681,8 @@ SUBROUTINE AnalyzeParticles(Time) REAL :: ETotal, MacroParticleFactor #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) REAL :: MaxCollProb, MeanCollProb, MeanFreePath -REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2),VibRelaxProbSpec(nSpecies,nSpecies) -INTEGER :: jSpec +REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2),VibRelaxProbCase(CollInf%NumCase) +INTEGER :: jSpec, iCase #endif #if USE_MPI #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300||(PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) @@ -693,7 +693,6 @@ SUBROUTINE AnalyzeParticles(Time) #endif /*USE_MPI*/ REAL, ALLOCATABLE :: CRate(:), RRate(:) #if (PP_TimeDiscMethod ==42) -INTEGER :: iCase #ifdef CODE_ANALYZE CHARACTER(LEN=64) :: DebugElectronicStateFilename INTEGER :: ii, iunit @@ -1117,8 +1116,8 @@ SUBROUTINE AnalyzeParticles(Time) GEO%MeshVolume, SpecDSMC(1)%omegaVHS, TempTotal(nSpecAnalyze)) END IF END IF - VibRelaxProbSpec = 0. - IF(CalcRelaxProb) CALL CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) + VibRelaxProbCase = 0. + IF(CalcRelaxProb) CALL CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbCase) END IF #endif !----------------------------------------------------------------------------------------------------------------------------------- @@ -1471,11 +1470,12 @@ SUBROUTINE AnalyzeParticles(Time) IF(XSec_Relaxation) THEN DO iSpec = 1, nSpecies DO jSpec = iSpec, nSpecies + iCase = CollInf%Coll_Case(iSpec,jSpec) ! Skip entry if both species are NOT molecules IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') VibRelaxProbSpec(iSpec,jSpec) + WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') VibRelaxProbCase(iCase) END DO END DO END IF @@ -2173,7 +2173,7 @@ END SUBROUTINE CalcTemperature #if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==43 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) -SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) +SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbCase) !=================================================================================================================================== ! Calculates global rotational and vibrational relaxation probability for PartAnalyse.csv !=================================================================================================================================== @@ -2181,7 +2181,7 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) USE MOD_Globals USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode, SpecXSec, XSec_Relaxation +USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode, SpecXSec, XSec_Relaxation, CollInf USE MOD_Mesh_Vars ,ONLY: nElems, nGlobalElems USE MOD_Particle_MPI_Vars ,ONLY: PartMPI ! IMPLICIT VARIABLE HANDLING @@ -2189,10 +2189,10 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT) :: RotRelaxProb(2),VibRelaxProb(2) !< output value is already the GLOBAL RelaxProbs -REAL,INTENT(OUT) :: VibRelaxProbSpec(nSpecies,nSpecies) +REAL,INTENT(OUT) :: VibRelaxProbCase(CollInf%NumCase) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem, iSpec, jSpec +INTEGER :: iElem, iSpec, iCase REAL :: PartNum !=================================================================================================================================== IF(CollisMode.LT.2) RETURN @@ -2256,22 +2256,16 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) IF(XSec_Relaxation) THEN - DO iSpec=1,nSpecies - DO jSpec=1,nSpecies - CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(iSpec,jSpec)%VibProb(1:2),2,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) - END DO - END DO + CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(:)%VibProb(1),CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(:)%VibProb(2),CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) END IF ELSE CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,1),DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,2),DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,3),DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) IF(XSec_Relaxation) THEN - DO iSpec=1,nSpecies - DO jSpec=1,nSpecies - CALL MPI_REDUCE(SpecXSec(iSpec,jSpec)%VibProb(1:2),SpecXSec(iSpec,jSpec)%VibProb(1:2),2,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) - END DO - END DO + CALL MPI_REDUCE(SpecXSec(:)%VibProb(1),SpecXSec(:)%VibProb(1),CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(SpecXSec(:)%VibProb(2),SpecXSec(:)%VibProb(2),CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) END IF END IF #endif /*USE_MPI*/ @@ -2280,14 +2274,12 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb,VibRelaxProbSpec) IF(SUM(DSMC%CalcVibProb(1:nSpecies,3)).GT.0) THEN VibRelaxProb(2) = SUM(DSMC%CalcVibProb(1:nSpecies,1))/SUM(DSMC%CalcVibProb(1:nSpecies,3)) END IF - VibRelaxProbSpec = 0. + VibRelaxProbCase = 0. IF(XSec_Relaxation) THEN - DO iSpec=1,nSpecies - DO jSpec=1,nSpecies - IF(SpecXSec(iSpec,jSpec)%VibProb(2).GT.0.0) THEN - VibRelaxProbSpec(iSpec,jSpec)=SpecXSec(iSpec,jSpec)%VibProb(1)/SpecXSec(iSpec,jSpec)%VibProb(2) - END IF - END DO + DO iCase=1,CollInf%NumCase + IF(SpecXSec(iCase)%VibProb(2).GT.0.0) THEN + VibRelaxProbCase(iCase)=SpecXSec(iCase)%VibProb(1)/SpecXSec(iCase)%VibProb(2) + END IF END DO END IF END IF diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index 5f9027fc5..2d1918e6b 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -422,7 +422,7 @@ SUBROUTINE MCC_pairing_bggas(iElem) ! LOCAL VARIABLES INTEGER :: iPair, iPart, iLoop, nPart, iSpec, jSpec, bgSpec, PartIndex, bggPartIndex, PairCount, RandomPart INTEGER :: cSpec1, cSpec2, iCase, SpecPairNumTemp -INTEGER,ALLOCATABLE :: iPartIndex(:), PairingPartner(:), iPartIndexSpec(:,:), SpecPartNum(:), SpecPairNum(:,:) +INTEGER,ALLOCATABLE :: iPartIndex(:), PairingPartner(:), iPartIndexSpec(:,:), SpecPartNum(:), SpecPairNum(:) REAL :: iRan, ProbRest, SpecPairNumReal !=================================================================================================================================== nPart = PEM%pNumber(iElem) @@ -435,7 +435,7 @@ SUBROUTINE MCC_pairing_bggas(iElem) ALLOCATE(iPartIndexSpec(nPart,nSpecies)) iPartIndexSpec = 0 -ALLOCATE(SpecPartNum(nSpecies),SpecPairNum(nSpecies,nSpecies)) +ALLOCATE(SpecPartNum(nSpecies),SpecPairNum(CollInf%NumCase)) SpecPairNum = 0; SpecPairNumTemp = 0; SpecPairNumReal = 0.; SpecPartNum = 0 CALL InitCalcVibRelaxProb() @@ -461,27 +461,28 @@ SUBROUTINE MCC_pairing_bggas(iElem) IF(.NOT.BGGas%BackgroundSpecies(iSpec)) THEN ! Loop over all non-background species DO jSpec = 1, nSpecies IF(BGGas%BackgroundSpecies(jSpec)) THEN ! Loop over all background species + iCase = CollInf%Coll_Case(iSpec,jSpec) bgSpec = BGGas%MapSpecToBGSpec(jSpec) IF(SpecDSMC(iSpec)%UseCollXSec.AND.XSec_NullCollision) THEN ! Collision cross-section: The maximum number of pairs to check is collision pair specific and depends on the null collision probability - SpecPairNumReal = CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iSpec,jSpec)%ProbNull - SpecPairNumTemp = INT(CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iSpec,jSpec)%ProbNull) + SpecPairNumReal = CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iCase)%ProbNull + SpecPairNumTemp = INT(CollInf%Coll_SpecPartNum(iSpec)*SpecXSec(iCase)%ProbNull) ELSE ! Regular: The maximum number of pairs corresponds to the particle number SpecPairNumReal = BGGas%SpeciesFraction(bgSpec)*CollInf%Coll_SpecPartNum(iSpec) SpecPairNumTemp = INT(BGGas%SpeciesFraction(bgSpec)*CollInf%Coll_SpecPartNum(iSpec)) END IF ! Avoid creating more pairs than currently particles in the simulation - IF(SpecPairNum(iSpec,jSpec) + SpecPairNumTemp.LT.SpecPartNum(iSpec)) THEN + IF(SpecPairNum(iCase) + SpecPairNumTemp.LT.SpecPartNum(iSpec)) THEN ! Randomly deciding whether an additional pair is added based on the difference between the real and integer value ProbRest = SpecPairNumReal - REAL(SpecPairNumTemp) CALL RANDOM_NUMBER(iRan) IF (ProbRest.GT.iRan) SpecPairNumTemp = SpecPairNumTemp + 1 ! Adding the number of pairs to the species-specific number and the cell total - SpecPairNum(iSpec,jSpec) = SpecPairNum(iSpec,jSpec) + SpecPairNumTemp + SpecPairNum(iCase) = SpecPairNum(iCase) + SpecPairNumTemp MCC_TotalPairNum = MCC_TotalPairNum + SpecPairNumTemp - ELSE IF(SpecPairNum(iSpec,jSpec) + SpecPairNumTemp.EQ.SpecPartNum(iSpec)) THEN - SpecPairNum(iSpec,jSpec) = SpecPairNum(iSpec,jSpec) + SpecPairNumTemp + ELSE IF(SpecPairNum(iCase) + SpecPairNumTemp.EQ.SpecPartNum(iSpec)) THEN + SpecPairNum(iCase) = SpecPairNum(iCase) + SpecPairNumTemp MCC_TotalPairNum = MCC_TotalPairNum + SpecPairNumTemp END IF END IF @@ -502,7 +503,8 @@ SUBROUTINE MCC_pairing_bggas(iElem) IF(.NOT.BGGas%BackgroundSpecies(iSpec)) THEN DO jSpec = 1, nSpecies ! Loop over all background species IF(BGGas%BackgroundSpecies(jSpec)) THEN - DO iLoop = 1, SpecPairNum(iSpec,jSpec) ! Loop over all the number of pairs required for this species pairing + iCase = CollInf%Coll_Case(iSpec,jSpec) + DO iLoop = 1, SpecPairNum(iCase) ! Loop over all the number of pairs required for this species pairing ! Choosing random particles from the available number of particles, getting the index of the simulation particle IF(SpecPartNum(iSpec).GT.0) THEN CALL RANDOM_NUMBER(iRan) diff --git a/src/particles/dsmc/dsmc_collis_mode.f90 b/src/particles/dsmc/dsmc_collis_mode.f90 index e4af4f006..69163032e 100644 --- a/src/particles/dsmc/dsmc_collis_mode.f90 +++ b/src/particles/dsmc/dsmc_collis_mode.f90 @@ -2845,7 +2845,7 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) ! LOCAL VARIABLES REAL :: CorrFact ! CorrFact: To correct sample Bias ! (fewer DSMC particles than natural ones) -INTEGER :: iPolyatMole, iDOF +INTEGER :: iPolyatMole, iDOF, iCase REAL :: CollisionEnergy !=================================================================================================================================== @@ -2861,9 +2861,10 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) END IF IF((DSMC%VibRelaxProb.GE.0.0).AND.(DSMC%VibRelaxProb.LE.1.0)) THEN - IF(SpecDSMC(iSpec)%UseVibXSec.OR.SpecDSMC(jSpec)%UseVibXSec) THEN + iCase = CollInf%Coll_Case(iSpec,jSpec) + IF(SpecXSec(iCase)%UseVibXSec) THEN CollisionEnergy = 0.5 * CollInf%MassRed(Coll_pData(iPair)%PairType) * Coll_pData(iPair)%CRela2 - ProbVib = InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) + ProbVib = InterpolateVibRelaxProb(iCase,CollisionEnergy) ELSE IF (SpecDSMC(iSpec)%PolyatomicMol.AND.(DSMC%PolySingleMode)) THEN iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray @@ -2892,8 +2893,9 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) DSMC%CalcVibProb(iSpec,1) = DSMC%CalcVibProb(iSpec,1) + ProbVib DSMC%CalcVibProb(iSpec,3) = DSMC%CalcVibProb(iSpec,3) + 1 IF(XSec_Relaxation) THEN - SpecXSec(iSpec,jSpec)%VibProb(1) = SpecXSec(iSpec,jSpec)%VibProb(1) + ProbVib - SpecXSec(iSpec,jSpec)%VibProb(2) = SpecXSec(iSpec,jSpec)%VibProb(2) + 1.0 + iCase = CollInf%Coll_Case(iSpec,jSpec) + SpecXSec(iCase)%VibProb(1) = SpecXSec(iCase)%VibProb(1) + ProbVib + SpecXSec(iCase)%VibProb(2) = SpecXSec(iCase)%VibProb(2) + 1.0 END IF END IF diff --git a/src/particles/dsmc/dsmc_collision_prob.f90 b/src/particles/dsmc/dsmc_collision_prob.f90 index 6cd82529a..b5845f547 100644 --- a/src/particles/dsmc/dsmc_collision_prob.f90 +++ b/src/particles/dsmc/dsmc_collision_prob.f90 @@ -62,7 +62,7 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: iPType, NbrOfReaction, iPart_p1, iPart_p2, iSpec_p1, iSpec_p2 + INTEGER :: iPType, NbrOfReaction, iPart_p1, iPart_p2, iSpec_p1, iSpec_p2, iCase REAL :: SpecNum1, SpecNum2, Weight1, Weight2, Volume REAL :: aCEX, bCEX, aMEX, bMEX, aEL, bEL, sigma_tot, MacroParticleFactor, dtCell, CollCaseNum REAL :: CollEnergy, CollProb, VeloSquare @@ -73,6 +73,7 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) iPart_p1 = Coll_pData(iPair)%iPart_p1; iPart_p2 = Coll_pData(iPair)%iPart_p2 iSpec_p1 = PartSpecies(iPart_p1); iSpec_p2 = PartSpecies(iPart_p2) + iCase = CollInf%Coll_Case(iSpec_p1,iSpec_p2) iPType = SpecDSMC(iSpec_p1)%InterID + SpecDSMC(iSpec_p2)%InterID !definition of collision case @@ -135,14 +136,14 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) ! 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 in the case of mixture on the species fraction IF(XSec_NullCollision) THEN - Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & - * SpecNum2 * MacroParticleFactor / Volume * dt)) / SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iCase,CollEnergy) & + * SpecNum2 * MacroParticleFactor / Volume * dt)) / SpecXSec(iCase)%ProbNull ELSE - Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & + Coll_pData(iPair)%Prob = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iCase,CollEnergy) & * SpecNum2 * MacroParticleFactor / Volume * dt)) / BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) END IF ELSE - Coll_pData(iPair)%Prob = 1. - EXP(-SQRT(VeloSquare)*InterpolateCrossSection(iSpec_p1,iSpec_p2,CollEnergy) & + Coll_pData(iPair)%Prob = 1. - EXP(-SQRT(VeloSquare)*InterpolateCrossSection(iCase,CollEnergy) & * SpecNum2 * MacroParticleFactor/Volume*dt) END IF ELSE @@ -208,10 +209,6 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) __STAMP__& ,'ERROR in DSMC_collis: Wrong iPType case! = ',iPType) END SELECT - IF ( SQRT(DOT_PRODUCT(PartState(4:6,Coll_pData(iPair)%iPart_p1),PartState(4:6,Coll_pData(iPair)%iPart_p1)))& - .LT.DSMC%veloMinColl(PartSpecies(Coll_pData(iPair)%iPart_p1)) .OR. & - SQRT(DOT_PRODUCT(PartState(4:6,Coll_pData(iPair)%iPart_p2),PartState(4:6,Coll_pData(iPair)%iPart_p2)))& - .LT.DSMC%veloMinColl(PartSpecies(Coll_pData(iPair)%iPart_p2))) Coll_pData(iPair)%Prob = 0. IF (ISNAN(Coll_pData(iPair)%Prob)) THEN IPWRITE(UNIT_errOut,*)iPair,'in',iElem,'is NaN!' CALL Abort(& @@ -225,7 +222,7 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN IF(XSec_NullCollision) THEN - CollProb = CollProb * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + CollProb = CollProb * SpecXSec(iCase)%ProbNull ELSE CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) END IF @@ -238,14 +235,14 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) ! Sum of collision probabilities for the collision pair and the corresponding reaction, required for the correct reaction rate IF(ChemReac%NumOfReact.GT.0) THEN DO iSpec=1, nSpecies - iReac=ChemReac%ReactNum(PartSpecies(Coll_pData(iPair)%iPart_p1),PartSpecies(Coll_pData(iPair)%iPart_p2),iSpec) + iReac=ChemReac%ReactNum(iSpec_p1,iSpec_p2,iSpec) IF (iReac.NE.0) THEN CollProb = Coll_pData(iPair)%Prob IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN ! Calculate the collision probability for the null collision probability case IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN IF(XSec_NullCollision) THEN - CollProb = CollProb * SpecXSec(iSpec_p1,iSpec_p2)%ProbNull + CollProb = CollProb * SpecXSec(iCase)%ProbNull ELSE CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) END IF diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 9cd30cad3..76aed8987 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -94,8 +94,6 @@ SUBROUTINE DefineParametersDSMC() CALL prms%CreateRealOption( 'Particles-DSMC-PartitionInterval'& , 'Define temperature interval for pre-stored partition functions that are used for '//& 'calculation of backwards rates', '10.0') -CALL prms%CreateRealOption( 'Particles-DSMC-veloMinColl-Spec[$]' , 'min velo magn. for spec allowed to perform collision' , '0.' & - , numberedmulti=.TRUE.) !----------------------------------------------------------------------------------- CALL prms%CreateLogicalOption( 'Particles-DSMC-CalcQualityFactors'& , 'Enables [TRUE] / disables [FALSE] the calculation and output of flow-field variable.\n'//& @@ -449,11 +447,6 @@ SUBROUTINE InitDSMC() END IF DSMC%ElecRelaxProb = GETREAL('Particles-DSMC-ElecRelaxProb','0.01') DSMC%GammaQuant = GETREAL('Particles-DSMC-GammaQuant', '0.5') -ALLOCATE(DSMC%veloMinColl(nSpecies)) -DO iSpec = 1, nSpecies - WRITE(UNIT=hilf,FMT='(I0)') iSpec - DSMC%veloMinColl(iSpec) = GETREAL('Particles-DSMC-veloMinColl-Spec'//TRIM(hilf),'0.') -END DO !----------------------------------------------------------------------------------- ! Flag for the automatic calculation of the backward reaction rate with the partition functions and equilibrium constant. DSMC%BackwardReacRate = GETLOGICAL('Particles-DSMC-BackwardReacRate','.FALSE.') @@ -1311,10 +1304,8 @@ SUBROUTINE InitDSMC() ALLOCATE(DSMC%CalcVibProb(1:nSpecies,1:3)) DSMC%CalcVibProb = 0. IF(XSec_Relaxation) THEN - DO iSpec=1,nSpecies - DO jSpec=1,nSpecies - SpecXSec(iSpec,jSpec)%VibProb = 0. - END DO + DO iCase=1,CollInf%NumCase + SpecXSec(iCase)%VibProb(1:2) = 0. END DO END IF END IF @@ -1802,7 +1793,6 @@ SUBROUTINE FinalizeDSMC() END DO SDEALLOCATE(PolyatomMolDSMC) END IF -SDEALLOCATE(DSMC%veloMinColl) SDEALLOCATE(DSMC%NumColl) SDEALLOCATE(DSMC%InstantTransTemp) IF(DSMC%CalcQualityFactors) THEN diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index e3ac8d5cf..285ed06a9 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -47,7 +47,7 @@ SUBROUTINE DSMC_main(DoElement) USE MOD_DSMC_Vars ,ONLY: ChemReac, UseMCC, XSec_Relaxation, SpecXSec USE MOD_DSMC_Analyze ,ONLY: CalcMeanFreePath, SummarizeQualityFactors, DSMCMacroSampling USE MOD_DSMC_Collis ,ONLY: FinalizeCalcVibRelaxProb, InitCalcVibRelaxProb -USE MOD_Particle_Vars ,ONLY: PEM, PDM, WriteMacroVolumeValues, Symmetry2D, nSpecies +USE MOD_Particle_Vars ,ONLY: PEM, PDM, WriteMacroVolumeValues, Symmetry2D USE MOD_DSMC_Analyze ,ONLY: DSMCHO_data_sampling,CalcSurfaceValues, WriteDSMCHOToHDF5, CalcGammaVib USE MOD_DSMC_ParticlePairing ,ONLY: DSMC_pairing_standard, DSMC_pairing_octree, DSMC_pairing_quadtree USE MOD_DSMC_CollisionProb ,ONLY: DSMC_prob_calc @@ -69,7 +69,7 @@ SUBROUTINE DSMC_main(DoElement) #if USE_LOADBALANCE REAL :: tLBStart #endif /*USE_LOADBALANCE*/ -INTEGER :: iSpec, jSpec +INTEGER :: iCase !=================================================================================================================================== ! Reset the right-hand side (DoElement: coupled BGK/FP-DSMC simulations, which might utilize the RHS) @@ -98,10 +98,8 @@ SUBROUTINE DSMC_main(DoElement) IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. DSMC%CalcVibProb = 0. IF(XSec_Relaxation) THEN - DO iSpec=1,nSpecies - DO jSpec=1,nSpecies - SpecXSec(iSpec,jSpec)%VibProb = 0. - END DO + DO iCase=1,CollInf%NumCase + SpecXSec(iCase)%VibProb(1:2) = 0. END DO END IF END IF diff --git a/src/particles/dsmc/dsmc_species_xsec.f90 b/src/particles/dsmc/dsmc_species_xsec.f90 index 1c8cf7e07..3b04d063e 100644 --- a/src/particles/dsmc/dsmc_species_xsec.f90 +++ b/src/particles/dsmc/dsmc_species_xsec.f90 @@ -38,12 +38,12 @@ SUBROUTINE MCC_Init() USE MOD_ReadInTools USE MOD_Globals_Vars ,ONLY: ElementaryCharge USE MOD_PARTICLE_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC, XSec_Database, SpecXSec, XSec_NullCollision, XSec_Relaxation +USE MOD_DSMC_Vars ,ONLY: BGGas, SpecDSMC, XSec_Database, SpecXSec, XSec_NullCollision, XSec_Relaxation, CollInf IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iSpec, jSpec +INTEGER :: iSpec, jSpec, iCase REAL :: TotalProb INTEGER :: iVib, nVib, iStep, nStep !=================================================================================================================================== @@ -64,48 +64,29 @@ SUBROUTINE MCC_Init() ,'ERROR: Usage of read-in collision cross-sections only possible with a background gas!') END IF -! ALLOCATE(SpecXSec(CollInf%NumCase)) - -! DO iSpec = 1, nSpecies -! DO jSpec = iSpec, nSpecies -! iCase = CollInf%Coll_Case(iSpec,jSpec) -! ! Skip species, which shall not be treated with collision cross-sections -! IF(.NOT.SpecDSMC(iSpec)%UseCollXSec.AND..NOT.SpecDSMC(jSpec)%UseCollXSec) CYCLE -! ! Read-in cross-section data for collisions of particles, allocating CollXSecData within the following routine -! CALL ReadCollXSec(iCase, iSpec, jSpec) -! ! Store the energy value in J (read-in was in eV) -! SpecXSec(iCase)%CollXSecData(1,:) = SpecXSec(iCase)%CollXSecData(1,:) * ElementaryCharge -! IF(XSec_NullCollision) THEN -! ! Determine the maximum collision frequency for the null collision method -! CALL DetermineNullCollProb(iSpec,jSpec) -! TotalProb = TotalProb + SpecXSec(iCase)%ProbNull -! IF(TotalProb.GT.1.0) THEN -! CALL abort(& -! __STAMP__& -! ,'ERROR: Total null collision probability is above unity. Please reduce the time step! Probability is: '& -! ,RealInfoOpt=TotalProb) -! END IF -! END IF -! END DO -! END DO - -ALLOCATE(SpecXSec(nSpecies,nSpecies)) - -DO iSpec = 1,nSpecies - IF(BGGas%BackgroundSpecies(iSpec)) CYCLE - IF(.NOT.SpecDSMC(iSpec)%UseCollXSec) CYCLE +ALLOCATE(SpecXSec(CollInf%NumCase)) +SpecXSec(:)%UseCollXSec = .FALSE. +SpecXSec(:)%UseVibXSec = .FALSE. + +DO iSpec = 1, nSpecies TotalProb = 0. - DO jSpec = 1, nSpecies - IF(.NOT.BGGas%BackgroundSpecies(jSpec)) CYCLE - ! Read-in cross-section data for collisions of particles from the background gas and the current species - ! Allocating CollXSecData within the following routine - CALL ReadCollXSec(iSpec, jSpec) + DO jSpec = iSpec, nSpecies + iCase = CollInf%Coll_Case(iSpec,jSpec) + ! Skip species, which shall not be treated with collision cross-sections + IF(.NOT.SpecDSMC(iSpec)%UseCollXSec.AND..NOT.SpecDSMC(jSpec)%UseCollXSec) CYCLE + ! Skip pairing with itself and pairing with other particle species, if background gas is active + IF(BGGas%NumberOfSpecies.GT.0) THEN + IF(iSpec.EQ.jSpec) CYCLE + IF(.NOT.BGGas%BackgroundSpecies(iSpec).AND..NOT.BGGas%BackgroundSpecies(jSpec)) CYCLE + END IF + ! Read-in cross-section data for collisions of particles, allocating CollXSecData within the following routine + CALL ReadCollXSec(iCase, iSpec, jSpec) ! Store the energy value in J (read-in was in eV) - SpecXSec(iSpec,jSpec)%CollXSecData(1,:) = SpecXSec(iSpec,jSpec)%CollXSecData(1,:) * ElementaryCharge + SpecXSec(iCase)%CollXSecData(1,:) = SpecXSec(iCase)%CollXSecData(1,:) * ElementaryCharge IF(XSec_NullCollision) THEN ! Determine the maximum collision frequency for the null collision method - CALL DetermineNullCollProb(iSpec,jSpec) - TotalProb = TotalProb + SpecXSec(iSpec,jSpec)%ProbNull + CALL DetermineNullCollProb(iCase,iSpec,jSpec) + TotalProb = TotalProb + SpecXSec(iCase)%ProbNull IF(TotalProb.GT.1.0) THEN CALL abort(& __STAMP__& @@ -113,38 +94,32 @@ SUBROUTINE MCC_Init() ,RealInfoOpt=TotalProb) END IF END IF - IF(SpecDSMC(iSpec)%UseVibXSec) THEN + ! Vibrational relaxation probabilities: Interpolate and store the probability at the effective cross-section levels + IF(SpecXSec(iCase)%UseVibXSec) THEN XSec_Relaxation = .TRUE. - ! Perform read-in if the current species is molecular or the collision partner - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20).OR.(SpecDSMC(jSpec)%InterID.EQ.2) & - .OR.(SpecDSMC(jSpec)%InterID.EQ.20)) THEN - ! Read-in the vibrational levels - CALL ReadVibXSec(iSpec, jSpec) - nVib = SIZE(SpecXSec(iSpec,jSpec)%VibMode) - nStep = SIZE(SpecXSec(iSpec,jSpec)%CollXSecData,2) - DO iVib = 1, nVib - ! Store the energy value in J (read-in was in eV) - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,:) = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,:) * ElementaryCharge - ! Interpolate the vibrational cross section at the energy levels of the effective collision cross section and sum-up the - ! vibrational probability (vibrational cross-section divided by the effective) - DO iStep = 1, nStep - IF(SpecXSec(iSpec,jSpec)%CollXSecData(2,iStep).GT.0.0) THEN - SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) = SpecXSec(iSpec,jSpec)%CollXSecData(3,iStep) + & - InterpolateCrossSection_Vib(iSpec,jSpec,iVib,SpecXSec(iSpec,jSpec)%CollXSecData(1,iStep)) & - / SpecXSec(iSpec,jSpec)%CollXSecData(2,iStep) - END IF - END DO + nVib = SIZE(SpecXSec(iCase)%VibMode) + nStep = SIZE(SpecXSec(iCase)%CollXSecData,2) + DO iVib = 1, nVib + ! Store the energy value in J (read-in was in eV) + SpecXSec(iCase)%VibMode(iVib)%XSecData(1,:) = SpecXSec(iCase)%VibMode(iVib)%XSecData(1,:) * ElementaryCharge + ! Interpolate the vibrational cross section at the energy levels of the effective collision cross section and sum-up the + ! vibrational probability (vibrational cross-section divided by the effective) + DO iStep = 1, nStep + IF(SpecXSec(iCase)%CollXSecData(2,iStep).GT.0.0) THEN + SpecXSec(iCase)%CollXSecData(3,iStep) = SpecXSec(iCase)%CollXSecData(3,iStep) + & + InterpolateCrossSection_Vib(iCase,iVib,SpecXSec(iCase)%CollXSecData(1,iStep)) & + / SpecXSec(iCase)%CollXSecData(2,iStep) + END IF END DO - END IF - END IF - SpecXSec(jSpec,iSpec)%CollXSecData = SpecXSec(iSpec,jSpec)%CollXSecData - END DO -END DO + END DO + END IF ! SpecXSec(iCase)%UseVibXSec + END DO ! jSpec = iSpec, nSpecies +END DO ! iSpec = 1, nSpecies END SUBROUTINE MCC_Init -SUBROUTINE ReadCollXSec(iSpec,jSpec) +SUBROUTINE ReadCollXSec(iCase,iSpec,jSpec) !=================================================================================================================================== !> Read-in of collision cross-sections from a given database. Dataset name is composed of SpeciesName-SpeciesName (e.g. Ar-electron) !> Trying to swap the species indices if dataset not found. @@ -158,36 +133,45 @@ SUBROUTINE ReadCollXSec(iSpec,jSpec) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: iSpec, jSpec +INTEGER,INTENT(IN) :: iCase, iSpec, jSpec !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -CHARACTER(LEN=64) :: dsetname, dsetname2, spec_pair +CHARACTER(LEN=64) :: dsetname, dsetname2, spec_pair, groupname INTEGER :: err, nVar INTEGER(HSIZE_T), DIMENSION(2) :: dims,sizeMax INTEGER(HID_T) :: file_id_dsmc ! File identifier +INTEGER(HID_T) :: group_id ! Group identifier INTEGER(HID_T) :: dset_id_dsmc ! Dataset identifier INTEGER(HID_T) :: filespace ! filespace identifier -LOGICAL :: DataSetFound +INTEGER(SIZE_T) :: size ! Size of name +INTEGER(HSIZE_T) :: iVib ! Index +LOGICAL :: DatasetFound, GroupFound +INTEGER :: storage, nVib, max_corder !=================================================================================================================================== spec_pair = TRIM(SpecDSMC(jSpec)%Name)//'-'//TRIM(SpecDSMC(iSpec)%Name) SWRITE(UNIT_StdOut,'(A)') 'Read collision cross section for '//TRIM(spec_pair)//' from '//TRIM(XSec_Database) +SpecXSec(iCase)%UseVibXSec = .FALSE. +nVar = 2 + ! Initialize FORTRAN interface. CALL H5OPEN_F(err) ! Open the file. CALL H5FOPEN_F (TRIM(XSec_Database), H5F_ACC_RDONLY_F, file_id_dsmc, err) dsetname = TRIM('/'//TRIM(spec_pair)//'/EFFECTIVE') -CALL DatasetExists(File_ID_DSMC,TRIM(dsetname),DataSetFound) +CALL DatasetExists(File_ID_DSMC,TRIM(dsetname),DatasetFound) ! Check if the dataset exist -IF(.NOT.DataSetFound) THEN +IF(.NOT.DatasetFound) THEN ! Try to swap the species names dsetname = TRIM(SpecDSMC(iSpec)%Name)//'-'//TRIM(SpecDSMC(jSpec)%Name)//'/EFFECTIVE' CALL DatasetExists(File_ID_DSMC,TRIM(dsetname),DataSetFound) - IF(.NOT.DataSetFound) THEN + IF(DatasetFound) THEN + spec_pair = TRIM(SpecDSMC(iSpec)%Name)//'-'//TRIM(SpecDSMC(jSpec)%Name) + ELSE dsetname2 = TRIM(spec_pair)//'/EFFECTIVE' CALL abort(& __STAMP__& @@ -202,16 +186,49 @@ SUBROUTINE ReadCollXSec(iSpec,jSpec) ! get size CALL H5SGET_SIMPLE_EXTENT_DIMS_F(FileSpace, dims, SizeMax, err) -IF(SpecDSMC(iSpec)%UseVibXSec) THEN - nVar = 3 -ELSE - nVar = 2 +! Check if cross-section data should be used for vibrational relaxation probabilities +IF(SpecDSMC(iSpec)%UseVibXSec.OR.SpecDSMC(jSpec)%UseVibXSec) THEN + groupname = TRIM('/'//TRIM(spec_pair)//'/VIBRATION/') + CALL H5LEXISTS_F(file_id_dsmc, groupname, GroupFound, err) + IF(GroupFound) THEN + CALL H5GOPEN_F(file_id_dsmc,TRIM(groupname), group_id, err) + call H5Gget_info_f(group_id, storage, nVib,max_corder, err) + ! If cross-section data is found, set the corresponding flag + IF(nVib.GT.0) THEN + SWRITE(UNIT_StdOut,'(A,I3,A)') 'Found ', nVib,' vibrational excitation cross section(s) in database.' + SpecXSec(iCase)%UseVibXSec = .TRUE. + nVar = 3 + ELSE + SWRITE(UNIT_StdOut,'(A)') 'No vibrational excitation cross sections found in database, using constant read-in values.' + END IF + END IF END IF -ALLOCATE(SpecXSec(iSpec,jSpec)%CollXSecData(nVar,dims(2))) -SpecXSec(iSpec,jSpec)%CollXSecData = 0. +! Read-in the effective cross-sections +ALLOCATE(SpecXSec(iCase)%CollXSecData(nVar,dims(2))) +SpecXSec(iCase)%CollXSecData = 0. ! read data -CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iSpec,jSpec)%CollXSecData(1:2,1:dims(2)), dims, err) +CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iCase)%CollXSecData(1:2,1:dims(2)), dims, err) + +IF(SpecXSec(iCase)%UseVibXSec) THEN + ALLOCATE(SpecXSec(iCase)%VibMode(1:nVib)) + DO iVib = 0, nVib-1 + ! Get name and size of name + CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, iVib, dsetname, err, size) + dsetname = TRIM(groupname)//TRIM(dsetname) + ! Open the dataset. + CALL H5DOPEN_F(file_id_dsmc, dsetname, dset_id_dsmc, err) + ! Get the file space of the dataset. + CALL H5DGET_SPACE_F(dset_id_dsmc, FileSpace, err) + ! get size + CALL H5SGET_SIMPLE_EXTENT_DIMS_F(FileSpace, dims, SizeMax, err) + ALLOCATE(SpecXSec(iCase)%VibMode(iVib+1)%XSecData(dims(1),dims(2))) + ! read data + CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iCase)%VibMode(iVib+1)%XSecData, dims, err) + END DO + ! Close the group + CALL H5GCLOSE_F(group_id,err) +END IF ! Close the file. CALL H5FCLOSE_F(file_id_dsmc, err) @@ -221,7 +238,7 @@ SUBROUTINE ReadCollXSec(iSpec,jSpec) END SUBROUTINE ReadCollXSec -SUBROUTINE ReadVibXSec(iSpec,jSpec) +SUBROUTINE ReadVibXSec(iCase,iSpec,jSpec) !=================================================================================================================================== !> Read-in of vibrational cross-sections from a given database. Using the effective cross-section database to check whether the !> group exists. Trying to swap the species indices if dataset not found. @@ -235,7 +252,7 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: iSpec, jSpec +INTEGER,INTENT(IN) :: iCase, iSpec, jSpec !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -284,9 +301,16 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) CALL H5GOPEN_F(file_id_dsmc,TRIM(groupname), group_id, err) call H5Gget_info_f(group_id, storage, nVib,max_corder, err) -SWRITE(UNIT_StdOut,'(A,I3,A)') 'Found ', nVib,' vibrational excitation cross section(s) in database.' +IF(nVib.GT.0) THEN + SWRITE(UNIT_StdOut,'(A,I3,A)') 'Found ', nVib,' vibrational excitation cross section(s) in database.' + SpecXSec(iCase)%UseVibXSec = .TRUE. +ELSE + SWRITE(UNIT_StdOut,'(A)') 'No vibrational excitation cross sections found in database, using constant read-in values.' + SpecXSec(iCase)%UseVibXSec = .FALSE. + RETURN +END IF -ALLOCATE(SpecXSec(iSpec,jSpec)%VibMode(1:nVib)) +ALLOCATE(SpecXSec(iCase)%VibMode(1:nVib)) DO iVib = 0, nVib-1 ! Get name and size of name @@ -298,9 +322,9 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) CALL H5DGET_SPACE_F(dset_id_dsmc, FileSpace, err) ! get size CALL H5SGET_SIMPLE_EXTENT_DIMS_F(FileSpace, dims, SizeMax, err) - ALLOCATE(SpecXSec(iSpec,jSpec)%VibMode(iVib+1)%XSecData(dims(1),dims(2))) + ALLOCATE(SpecXSec(iCase)%VibMode(iVib+1)%XSecData(dims(1),dims(2))) ! read data - CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iSpec,jSpec)%VibMode(iVib+1)%XSecData, dims, err) + CALL H5DREAD_F(dset_id_dsmc, H5T_NATIVE_DOUBLE, SpecXSec(iCase)%VibMode(iVib+1)%XSecData, dims, err) END DO ! Close the group @@ -313,7 +337,7 @@ SUBROUTINE ReadVibXSec(iSpec,jSpec) END SUBROUTINE ReadVibXSec -SUBROUTINE DetermineNullCollProb(iSpec,jSpec) +SUBROUTINE DetermineNullCollProb(iCase,iSpec,jSpec) !=================================================================================================================================== !> Routine for the MCC method: calculates the maximal collision frequency for a given species and the collision probability !=================================================================================================================================== @@ -325,33 +349,43 @@ SUBROUTINE DetermineNullCollProb(iSpec,jSpec) IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas -INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +INTEGER,INTENT(IN) :: iCase !< Case index +INTEGER,INTENT(IN) :: iSpec +INTEGER,INTENT(IN) :: jSpec !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: MaxDOF +INTEGER :: MaxDOF, bggSpec +REAL :: MaxCollFreq, Mass REAL,ALLOCATABLE :: Velocity(:) !=================================================================================================================================== -MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%CollXSecData,2) +! Select the background species as the target cloud and use the mass of particle species +IF(BGGas%BackgroundSpecies(iSpec)) THEN + bggSpec = BGGas%MapSpecToBGSpec(iSpec) + Mass = Species(jSpec)%MassIC +ELSE + bggSpec = BGGas%MapSpecToBGSpec(jSpec) + Mass = Species(iSpec)%MassIC +END IF + +MaxDOF = SIZE(SpecXSec(iCase)%CollXSecData,2) ALLOCATE(Velocity(MaxDOF)) ! Determine the mean relative velocity at the given energy level -Velocity(1:MaxDOF) = SQRT(2.) * SQRT(8.*SpecXSec(iSpec,jSpec)%CollXSecData(1,1:MaxDOF)/(Pi*Species(iSpec)%MassIC)) +Velocity(1:MaxDOF) = SQRT(2.) * SQRT(8.*SpecXSec(iCase)%CollXSecData(1,1:MaxDOF)/(Pi*Mass)) ! Calculate the maximal collision frequency -SpecXSec(iSpec,jSpec)%MaxCollFreq = MAXVAL(Velocity(1:MaxDOF) * SpecXSec(iSpec,jSpec)%CollXSecData(2,1:MaxDOF) & - * BGGas%NumberDensity(BGGas%MapSpecToBGSpec(jSpec))) +MaxCollFreq = MAXVAL(Velocity(1:MaxDOF) * SpecXSec(iCase)%CollXSecData(2,1:MaxDOF) * BGGas%NumberDensity(bggSpec)) ! Determine the collision probability -SpecXSec(iSpec,jSpec)%ProbNull = 1. - EXP(-SpecXSec(iSpec,jSpec)%MaxCollFreq*ManualTimeStep) +SpecXSec(iCase)%ProbNull = 1. - EXP(-MaxCollFreq*ManualTimeStep) DEALLOCATE(Velocity) END SUBROUTINE DetermineNullCollProb -PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) +PURE REAL FUNCTION InterpolateCrossSection(iCase,CollisionEnergy) !=================================================================================================================================== !> Interpolate the collision cross-section [m^2] from the available data at the given collision energy [J] !> Collision energies below and above the given data will be set at the first and last level of the data set @@ -363,8 +397,7 @@ PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas -INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +INTEGER,INTENT(IN) :: iCase !< Case index REAL,INTENT(IN) :: CollisionEnergy !< Collision energy in [J] !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -372,28 +405,28 @@ PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) !=================================================================================================================================== InterpolateCrossSection = 0. -MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%CollXSecData,2) +MaxDOF = SIZE(SpecXSec(iCase)%CollXSecData,2) -IF(CollisionEnergy.GT.SpecXSec(iSpec,jSpec)%CollXSecData(1,MaxDOF)) THEN +IF(CollisionEnergy.GT.SpecXSec(iCase)%CollXSecData(1,MaxDOF)) THEN ! If the collision energy is greater than the maximal value, get the cross-section of the last level and leave routine - InterpolateCrossSection = SpecXSec(iSpec,jSpec)%CollXSecData(2,MaxDOF) + InterpolateCrossSection = SpecXSec(iCase)%CollXSecData(2,MaxDOF) ! Leave routine RETURN -ELSE IF(CollisionEnergy.LE.SpecXSec(iSpec,jSpec)%CollXSecData(1,1)) THEN +ELSE IF(CollisionEnergy.LE.SpecXSec(iCase)%CollXSecData(1,1)) THEN ! If collision energy is below the minimal value, get the cross-section of the first level and leave routine - InterpolateCrossSection = SpecXSec(iSpec,jSpec)%CollXSecData(2,1) + InterpolateCrossSection = SpecXSec(iCase)%CollXSecData(2,1) ! Leave routine RETURN END IF DO iDOF = 1, MaxDOF ! Check if the stored energy value is above the collision energy - IF(SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF).GT.CollisionEnergy) THEN + IF(SpecXSec(iCase)%CollXSecData(1,iDOF).GT.CollisionEnergy) THEN ! Interpolate the cross-section from the data set using the current and the energy level below - InterpolateCrossSection = SpecXSec(iSpec,jSpec)%CollXSecData(2,iDOF-1) & - + (CollisionEnergy - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & - / (SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & - * (SpecXSec(iSpec,jSpec)%CollXSecData(2,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(2,iDOF-1)) + InterpolateCrossSection = SpecXSec(iCase)%CollXSecData(2,iDOF-1) & + + (CollisionEnergy - SpecXSec(iCase)%CollXSecData(1,iDOF-1)) & + / (SpecXSec(iCase)%CollXSecData(1,iDOF) - SpecXSec(iCase)%CollXSecData(1,iDOF-1)) & + * (SpecXSec(iCase)%CollXSecData(2,iDOF) - SpecXSec(iCase)%CollXSecData(2,iDOF-1)) ! Leave routine and do not finish DO loop RETURN END IF @@ -402,7 +435,7 @@ PURE REAL FUNCTION InterpolateCrossSection(iSpec,jSpec,CollisionEnergy) END FUNCTION InterpolateCrossSection -PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) +PURE REAL FUNCTION InterpolateCrossSection_Vib(iCase,iVib,CollisionEnergy) !=================================================================================================================================== !> Interpolate the vibrational cross-section data for specific vibrational level at the given collision energy !> Note: Requires the data to be sorted by ascending energy values @@ -413,8 +446,7 @@ PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas -INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +INTEGER,INTENT(IN) :: iCase !< Case index INTEGER,INTENT(IN) :: iVib !< REAL,INTENT(IN) :: CollisionEnergy !< Collision energy in [J] !----------------------------------------------------------------------------------------------------------------------------------- @@ -423,28 +455,28 @@ PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) !=================================================================================================================================== InterpolateCrossSection_Vib = 0. -MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData,2) +MaxDOF = SIZE(SpecXSec(iCase)%VibMode(iVib)%XSecData,2) -IF(CollisionEnergy.GT.SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,MaxDOF)) THEN +IF(CollisionEnergy.GT.SpecXSec(iCase)%VibMode(iVib)%XSecData(1,MaxDOF)) THEN ! If the collision energy is greater than the maximal value, get the cross-section of the last level and leave routine - InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,MaxDOF) + InterpolateCrossSection_Vib = SpecXSec(iCase)%VibMode(iVib)%XSecData(2,MaxDOF) ! Leave routine RETURN -ELSE IF(CollisionEnergy.LE.SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,1)) THEN +ELSE IF(CollisionEnergy.LE.SpecXSec(iCase)%VibMode(iVib)%XSecData(1,1)) THEN ! If collision energy is below the minimal value, get the cross-section of the first level and leave routine - InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,1) + InterpolateCrossSection_Vib = SpecXSec(iCase)%VibMode(iVib)%XSecData(2,1) ! Leave routine RETURN END IF DO iDOF = 1, MaxDOF ! Check if the stored energy value is above the collision energy - IF(SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF).GT.CollisionEnergy) THEN + IF(SpecXSec(iCase)%VibMode(iVib)%XSecData(1,iDOF).GT.CollisionEnergy) THEN ! Interpolate the cross-section from the data set using the current and the energy level below - InterpolateCrossSection_Vib = SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF-1) & - + (CollisionEnergy - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF-1)) & - / (SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF) - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(1,iDOF-1)) & - * (SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF) - SpecXSec(iSpec,jSpec)%VibMode(iVib)%XSecData(2,iDOF-1)) + InterpolateCrossSection_Vib = SpecXSec(iCase)%VibMode(iVib)%XSecData(2,iDOF-1) & + + (CollisionEnergy - SpecXSec(iCase)%VibMode(iVib)%XSecData(1,iDOF-1)) & + / (SpecXSec(iCase)%VibMode(iVib)%XSecData(1,iDOF) - SpecXSec(iCase)%VibMode(iVib)%XSecData(1,iDOF-1)) & + * (SpecXSec(iCase)%VibMode(iVib)%XSecData(2,iDOF) - SpecXSec(iCase)%VibMode(iVib)%XSecData(2,iDOF-1)) ! Leave routine and do not finish DO loop RETURN END IF @@ -453,7 +485,7 @@ PURE REAL FUNCTION InterpolateCrossSection_Vib(iSpec,jSpec,iVib,CollisionEnergy) END FUNCTION InterpolateCrossSection_Vib -PURE REAL FUNCTION InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) +PURE REAL FUNCTION InterpolateVibRelaxProb(iCase,CollisionEnergy) !=================================================================================================================================== !> Interpolate the vibrational relaxation probability at the same intervals as the effective collision cross-section !> Note: Requires the data to be sorted by ascending energy values @@ -464,8 +496,7 @@ PURE REAL FUNCTION InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER,INTENT(IN) :: iSpec !< Species index colliding with the background gas -INTEGER,INTENT(IN) :: jSpec !< Species index of the background gas +INTEGER,INTENT(IN) :: iCase !< Case index REAL,INTENT(IN) :: CollisionEnergy !< Collision energy in [J] !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -473,28 +504,28 @@ PURE REAL FUNCTION InterpolateVibRelaxProb(iSpec,jSpec,CollisionEnergy) !=================================================================================================================================== InterpolateVibRelaxProb = 0. -MaxDOF = SIZE(SpecXSec(iSpec,jSpec)%CollXSecData,2) +MaxDOF = SIZE(SpecXSec(iCase)%CollXSecData,2) -IF(CollisionEnergy.GT.SpecXSec(iSpec,jSpec)%CollXSecData(1,MaxDOF)) THEN +IF(CollisionEnergy.GT.SpecXSec(iCase)%CollXSecData(1,MaxDOF)) THEN ! If the collision energy is greater than the maximal value, get the cross-section of the last level and leave routine - InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,MaxDOF) + InterpolateVibRelaxProb = SpecXSec(iCase)%CollXSecData(3,MaxDOF) ! Leave routine RETURN -ELSE IF(CollisionEnergy.LE.SpecXSec(iSpec,jSpec)%CollXSecData(1,1)) THEN +ELSE IF(CollisionEnergy.LE.SpecXSec(iCase)%CollXSecData(1,1)) THEN ! If collision energy is below the minimal value, get the cross-section of the first level and leave routine - InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,1) + InterpolateVibRelaxProb = SpecXSec(iCase)%CollXSecData(3,1) ! Leave routine RETURN END IF DO iDOF = 1, MaxDOF ! Check if the stored energy value is above the collision energy - IF(SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF).GT.CollisionEnergy) THEN + IF(SpecXSec(iCase)%CollXSecData(1,iDOF).GT.CollisionEnergy) THEN ! Interpolate the cross-section from the data set using the current and the energy level below - InterpolateVibRelaxProb = SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF-1) & - + (CollisionEnergy - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & - / (SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(1,iDOF-1)) & - * (SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF) - SpecXSec(iSpec,jSpec)%CollXSecData(3,iDOF-1)) + InterpolateVibRelaxProb = SpecXSec(iCase)%CollXSecData(3,iDOF-1) & + + (CollisionEnergy - SpecXSec(iCase)%CollXSecData(1,iDOF-1)) & + / (SpecXSec(iCase)%CollXSecData(1,iDOF) - SpecXSec(iCase)%CollXSecData(1,iDOF-1)) & + * (SpecXSec(iCase)%CollXSecData(3,iDOF) - SpecXSec(iCase)%CollXSecData(3,iDOF-1)) ! Leave routine and do not finish DO loop RETURN END IF diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 95bff301d..af1a2c90e 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -189,17 +189,18 @@ MODULE MOD_DSMC_Vars END TYPE tXSecVibMode TYPE tSpeciesXSec + LOGICAL :: UseCollXSec REAL,ALLOCATABLE :: CollXSecData(:,:) ! Collision cross-section as read-in from the database ! 1: Energy (at read-in in [eV], during simulation in [J]) ! 2: Cross-section at the respective energy level [m^2] REAL :: ProbNull ! Collision probability at the maximal collision frequency for the ! null collision method of MCC - REAL :: MaxCollFreq ! Maximal collision frequency at certain energy level and cross-section + LOGICAL :: UseVibXSec TYPE(tXSecVibMode),ALLOCATABLE :: VibMode(:) ! REAL :: VibProb(2) END TYPE tSpeciesXSec -TYPE(tSpeciesXSec), ALLOCATABLE :: SpecXSec(:,:) ! Species cross-section related data (nSpec,nSpec). First column is used +TYPE(tSpeciesXSec), ALLOCATABLE :: SpecXSec(:) ! Species cross-section related data (CollCase). First column is used ! for the particle species, second column for the background species TYPE tDSMC @@ -282,7 +283,6 @@ MODULE MOD_DSMC_Vars ! coefficient with the equilibrium constant by partition functions REAL :: PartitionMaxTemp ! Temperature limit for pre-stored partition function (DEF: 20 000K) REAL :: PartitionInterval ! Temperature interval for pre-stored partition function (DEF: 10K) - REAL, ALLOCATABLE :: veloMinColl(:) ! min velo-magn. for spec allowed to perform collision (def.: 0.) #if (PP_TimeDiscMethod==42) LOGICAL :: CompareLandauTeller ! Keeps the translational temperature at the fixed value of the init #endif From 5f4ff8b6028438835bf220e31cc22767edf6ea81 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 6 May 2020 13:06:08 +0200 Subject: [PATCH 14/74] Bugfix missing variable initialization --- src/particles/dsmc/dsmc_collis_mode.f90 | 29 +++++++++++++------------ src/particles/dsmc/dsmc_init.f90 | 2 ++ src/particles/dsmc/dsmc_vars.f90 | 9 ++++---- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/particles/dsmc/dsmc_collis_mode.f90 b/src/particles/dsmc/dsmc_collis_mode.f90 index 69163032e..5b7ff2e8d 100644 --- a/src/particles/dsmc/dsmc_collis_mode.f90 +++ b/src/particles/dsmc/dsmc_collis_mode.f90 @@ -2861,21 +2861,22 @@ SUBROUTINE DSMC_calc_P_vib(iPair, iSpec, jSpec, Xi_rel, iElem, ProbVib) END IF IF((DSMC%VibRelaxProb.GE.0.0).AND.(DSMC%VibRelaxProb.LE.1.0)) THEN - iCase = CollInf%Coll_Case(iSpec,jSpec) - IF(SpecXSec(iCase)%UseVibXSec) THEN - CollisionEnergy = 0.5 * CollInf%MassRed(Coll_pData(iPair)%PairType) * Coll_pData(iPair)%CRela2 - ProbVib = InterpolateVibRelaxProb(iCase,CollisionEnergy) + IF (SpecDSMC(iSpec)%PolyatomicMol.AND.(DSMC%PolySingleMode)) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(1) = DSMC%VibRelaxProb & + * (1. + PolyatomMolDSMC(iPolyatMole)%GammaVib(1)/Xi_rel) + DO iDOF = 2, PolyatomMolDSMC(iPolyatMole)%VibDOF + PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(iDOF) = PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(iDOF - 1) & + + DSMC%VibRelaxProb * (1. + PolyatomMolDSMC(iPolyatMole)%GammaVib(1)/Xi_rel) + END DO ELSE - IF (SpecDSMC(iSpec)%PolyatomicMol.AND.(DSMC%PolySingleMode)) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(1) = DSMC%VibRelaxProb & - * (1. + PolyatomMolDSMC(iPolyatMole)%GammaVib(1)/Xi_rel) - DO iDOF = 2, PolyatomMolDSMC(iPolyatMole)%VibDOF - PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(iDOF) = PolyatomMolDSMC(iPolyatMole)%VibRelaxProb(iDOF - 1) & - + DSMC%VibRelaxProb * (1. + PolyatomMolDSMC(iPolyatMole)%GammaVib(1)/Xi_rel) - END DO - ELSE - ProbVib = DSMC%VibRelaxProb * CorrFact + ProbVib = DSMC%VibRelaxProb * CorrFact + END IF + IF(XSec_Relaxation) THEN + iCase = CollInf%Coll_Case(iSpec,jSpec) + IF(SpecXSec(iCase)%UseVibXSec) THEN + CollisionEnergy = 0.5 * CollInf%MassRed(Coll_pData(iPair)%PairType) * Coll_pData(iPair)%CRela2 + ProbVib = InterpolateVibRelaxProb(iCase,CollisionEnergy) END IF END IF ELSE IF(DSMC%VibRelaxProb.EQ.2.0) THEN diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 76aed8987..b9e0a0dd6 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -665,6 +665,8 @@ SUBROUTINE InitDSMC() CALL MCC_Init() ELSE UseMCC = .FALSE. + XSec_NullCollision =.FALSE. + XSec_Relaxation = .FALSE. END IF !----------------------------------------------------------------------------------------------------------------------------------- ! reading/writing molecular stuff diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index af1a2c90e..71831f09a 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -189,15 +189,16 @@ MODULE MOD_DSMC_Vars END TYPE tXSecVibMode TYPE tSpeciesXSec - LOGICAL :: UseCollXSec + LOGICAL :: UseCollXSec ! Flag if the collisions of the species pair should be treated with + ! read-in collision cross-section (currently only with BGG) REAL,ALLOCATABLE :: CollXSecData(:,:) ! Collision cross-section as read-in from the database ! 1: Energy (at read-in in [eV], during simulation in [J]) ! 2: Cross-section at the respective energy level [m^2] REAL :: ProbNull ! Collision probability at the maximal collision frequency for the ! null collision method of MCC - LOGICAL :: UseVibXSec - TYPE(tXSecVibMode),ALLOCATABLE :: VibMode(:) ! - REAL :: VibProb(2) + LOGICAL :: UseVibXSec ! Flag if cross-section data will be used for the relaxation probability + TYPE(tXSecVibMode),ALLOCATABLE :: VibMode(:) ! Vibrational cross-sections (nVib: Number of levels found in database) + REAL :: VibProb(2) ! 1: Sum of vibrational relaxation probability, 2: Event counter END TYPE tSpeciesXSec TYPE(tSpeciesXSec), ALLOCATABLE :: SpecXSec(:) ! Species cross-section related data (CollCase). First column is used From 1a8be30cb69646f91566b9a9af0d10108b697f5f Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 6 May 2020 23:52:05 +0200 Subject: [PATCH 15/74] Use collisional cross-sections without background gas --- .../NIG_Reservoir/MCC_MultiSpec_XSec/DSMC.ini | 46 +++++++ .../DSMCSpecies_electronic_state_full_Data.h5 | Bin 0 -> 107464 bytes .../Database_Tvib_00157000_ref.csv | 3 + .../Database_Tvib_00205000_ref.csv | 3 + .../Database_Tvib_00245000_ref.csv | 3 + .../Database_Tvib_00297000_ref.csv | 3 + .../Database_Tvib_00351000_ref.csv | 3 + .../Database_Tvib_00419000_ref.csv | 3 + .../Database_Tvib_00593000_ref.csv | 3 + .../Database_Tvib_00676000_ref.csv | 3 + .../Database_Tvib_00773000_ref.csv | 3 + .../Database_Tvib_00859000_ref.csv | 3 + .../Database_Tvib_00938000_ref.csv | 3 + .../Database_Tvib_01030000_ref.csv | 3 + .../Database_Tvib_01130000_ref.csv | 3 + .../Database_Tvib_01260000_ref.csv | 3 + .../Database_Tvib_01450000_ref.csv | 3 + .../Database_Tvib_01680000_ref.csv | 3 + .../Database_Tvib_02050000_ref.csv | 3 + .../Database_Tvib_02450000_ref.csv | 3 + .../Database_Tvib_02970000_ref.csv | 3 + .../Database_Tvib_04190000_ref.csv | 3 + .../Database_Tvib_05930000_ref.csv | 3 + .../Figure_Verification.png | Bin 0 -> 47070 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 0 -> 54184 bytes .../MCC_MultiSpec_XSec/analyze.ini | 4 + .../MCC_MultiSpec_XSec/command_line.ini | 2 + .../MCC_MultiSpec_XSec/cube_mesh.h5 | Bin 0 -> 6872 bytes .../MCC_MultiSpec_XSec/get_values.py | 14 ++ .../NIG_Reservoir/MCC_MultiSpec_XSec/hopr.ini | 43 +++++++ .../MCC_MultiSpec_XSec/parameter.ini | 121 ++++++++++++++++++ .../MCC_MultiSpec_XSec/readme.md | 6 + src/particles/dsmc/dsmc_collision_prob.f90 | 30 +---- src/particles/dsmc/dsmc_init.f90 | 6 +- src/particles/dsmc/dsmc_main.f90 | 10 +- src/particles/dsmc/dsmc_species_xsec.f90 | 110 ++++++++++++---- 36 files changed, 400 insertions(+), 55 deletions(-) create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMC.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMCSpecies_electronic_state_full_Data.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00157000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00205000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00245000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00297000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00351000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00419000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00593000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00676000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00773000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00859000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_00938000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_01030000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_01130000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_01260000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_01450000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_01680000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_02050000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_02450000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_02970000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_04190000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Database_Tvib_05930000_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/Figure_Verification.png create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/analyze.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/command_line.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/cube_mesh.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/get_values.py create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/hopr.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/parameter.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMC.ini new file mode 100644 index 000000000..f43e6b45f --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMC.ini @@ -0,0 +1,46 @@ +! =============================================================================== ! +! Species1, CO2 +! =============================================================================== ! +Part-Species1-SpeciesName = CO2 +Part-Species1-PolyatomicMol = true +Part-Species1-InteractionID = 2 +Part-Species1-VHSReferenceTemp = 273 +Part-Species1-VHSReferenceDiam = 5.10E-10 +Part-Species1-omegaVHS = 0.24 +Part-Species1-NumOfAtoms = 3 +Part-Species1-LinearMolec = true +Part-Species1-CharaTempVib1 = 959.66 +Part-Species1-CharaTempVib2 = 959.66 +Part-Species1-CharaTempVib3 = 1918.6 +Part-Species1-CharaTempVib4 = 3382 +Part-Species1-Ediss_eV = 5.45 +Part-Species1-HeatOfFormation_K = -47324.1 +! =============================================================================== ! +! Species2, N2 +! =============================================================================== ! +Part-Species2-SpeciesName = N2 +Part-Species2-InteractionID = 2 +Part-Species2-VHSReferenceTemp = 273 +Part-Species2-VHSReferenceDiam = 4.17E-10 +Part-Species2-omegaVHS = 0.24 +Part-Species2-CharaTempVib = 3393.3 +Part-Species2-Ediss_eV = 9.759 +Part-Species2-CharaTempRot = 2.87 +Part-Species2-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species3, He +! =============================================================================== ! +Part-Species3-SpeciesName = He +Part-Species3-InteractionID = 1 +Part-Species3-VHSReferenceTemp = 273 ! changed randomly from 300 +Part-Species3-VHSReferenceDiam = 3.0E-10 +Part-Species3-omegaVHS = 0.24 ! changed randomly from 0.2 +Part-Species3-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species4, e +! =============================================================================== ! +Part-Species4-SpeciesName = electron +Part-Species4-InteractionID = 4 +Part-Species4-VHSReferenceTemp = 273 +Part-Species4-VHSReferenceDiam = 2.817920E-15 +Part-Species4-omegaVHS = 0.24 \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/DSMCSpecies_electronic_state_full_Data.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5d3d0ad1fcb1edaa96261071da98dcd3e2765ef3 GIT binary patch literal 107464 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
MUBiA}LMuFQ z?6C)9(8qLO`+Av-q4zDq0DzEgN2!@3}{>?J}xTigDZHZ5A z56j+Sp^Vy@X;h`sxx$LNz(}R%cUD~h^p`5E?Ywj=8|vyt%g@}>a*%m0ZInLV!Oa}RJ*Jmeow@DTa*>)lVr#k>Hp zaVZL99icWJ=6Waj3q5`Qzc~M>k(ZsnxlbCMJ0RG2nDZsZG044uUv7WC)EJiqBRd Calculate the collision probability if collision cross-section data is used. Can be utilized in combination with the regular +!> DSMC collision calculation probability. +!=================================================================================================================================== +! MODULES +USE MOD_DSMC_Vars ,ONLY: SpecXSec, SpecDSMC, Coll_pData, CollInf, BGGas, XSec_NullCollision +USE MOD_Particle_Vars ,ONLY: PartSpecies, Species, PartState +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +INTEGER,INTENT(IN) :: iPair +REAL,INTENT(IN) :: SpecNum1, SpecNum2, CollCaseNum, MacroParticleFactor, Volume, dtCell +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: CollEnergy, VeloSquare, SpecNumTarget, SpecNumSource +INTEGER :: XSecSpec, XSecPart, targetSpec, iPart_p1, iPart_p2, iSpec_p1, iSpec_p2, iCase +!=================================================================================================================================== + +iPart_p1 = Coll_pData(iPair)%iPart_p1; iPart_p2 = Coll_pData(iPair)%iPart_p2 +iSpec_p1 = PartSpecies(iPart_p1); iSpec_p2 = PartSpecies(iPart_p2) +iCase = CollInf%Coll_Case(iSpec_p1,iSpec_p2) + +IF(SpecXSec(iCase)%UseCollXSec) THEN + IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN + XSecSpec = iSpec_p1; targetSpec = iSpec_p2; XSecPart = iPart_p1; SpecNumTarget = SpecNum2; SpecNumSource = SpecNum1 + ELSE + XSecSpec = iSpec_p2; targetSpec = iSpec_p1; XSecPart = iPart_p2; SpecNumTarget = SpecNum1; SpecNumSource = SpecNum2 + END IF + ! Using the kinetic energy of the particle (as is described in Vahedi1995 and Birdsall1991) + VeloSquare = DOT_PRODUCT(PartState(4:6,XSecPart),PartState(4:6,XSecPart)) + CollEnergy = 0.5 * Species(XSecSpec)%MassIC * VeloSquare + ! Calculate the collision probability + IF(BGGas%BackgroundSpecies(targetSpec)) THEN + ! 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 in the case of mixture on the species fraction + IF(XSec_NullCollision) THEN + XSec_CalcCollisionProb = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iCase,CollEnergy) & + * SpecNumTarget * MacroParticleFactor / Volume * dtCell)) / SpecXSec(iCase)%ProbNull + ELSE + XSec_CalcCollisionProb = (1. - EXP(-SQRT(VeloSquare) * InterpolateCrossSection(iCase,CollEnergy) & + * SpecNumTarget * MacroParticleFactor / Volume * dtCell)) / BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(targetSpec)) + END IF + ELSE + XSec_CalcCollisionProb = (1. - EXP(-SQRT(VeloSquare)*InterpolateCrossSection(iCase,CollEnergy) & + * SpecNumTarget * MacroParticleFactor/Volume*dtCell)) * SpecNumSource / CollInf%Coll_CaseNum(iCase) + END IF +ELSE + XSec_CalcCollisionProb = SpecNum1*SpecNum2/(1 + CollInf%KronDelta(Coll_pData(iPair)%PairType)) & + * CollInf%Cab(Coll_pData(iPair)%PairType) & ! Cab species comb fac + * MacroParticleFactor / CollCaseNum & + * Coll_pData(iPair)%CRela2 ** (0.5-SpecDSMC(iSpec_p1)%omegaVHS) & + * dtCell / Volume +END IF + +END FUNCTION + END MODULE MOD_DSMC_SpecXSec \ No newline at end of file From 7ffeec8722f4ba3ffd6cacb1e1da40a2174d372c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 7 May 2020 13:33:56 +0200 Subject: [PATCH 16/74] Increasing tolerance for the mean collision probability --- .../MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv | 3 --- .../MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv | 3 --- .../MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv | 3 --- .../NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini | 2 +- 4 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv delete mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv delete mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv deleted file mode 100644 index fdd9eb79d..000000000 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00059300_ref.csv +++ /dev/null @@ -1,3 +0,0 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-RotRelaxPmean ,006-RotRelaxPmax ,007-VibRelaxPmean ,008-VibRelaxPmax ,009-VibRelaxPmean001+001,010-VibRelaxPmean001+002,011-VibRelaxPmean001+003,012-VibRelaxPmean001+004,013-VibRelaxPmean001+005,014-VibRelaxPmean001+006,015-VibRelaxPmean001+007,016-VibRelaxPmean002+002,017-VibRelaxPmean002+003,018-VibRelaxPmean002+004,019-VibRelaxPmean002+005,020-VibRelaxPmean002+006,021-VibRelaxPmean002+007,022-VibRelaxPmean003+005,023-VibRelaxPmean003+006,024-VibRelaxPmean004+005,025-VibRelaxPmean004+006,026-VibRelaxPmean005+005,027-VibRelaxPmean005+006,028-VibRelaxPmean005+007,029-VibRelaxPmean006+006,030-VibRelaxPmean006+007 - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.00000000000000E-001, 2.00000000000000E-001, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.74925067800825E-003, 1.28633648183688E-001, 1.94896345372517E-006, 2.00000000000000E-001, 2.00000000000000E-001, 1.18179652132476E-004, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv deleted file mode 100644 index 8d2e741e0..000000000 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00083900_ref.csv +++ /dev/null @@ -1,3 +0,0 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-RotRelaxPmean ,006-RotRelaxPmax ,007-VibRelaxPmean ,008-VibRelaxPmax ,009-VibRelaxPmean001+001,010-VibRelaxPmean001+002,011-VibRelaxPmean001+003,012-VibRelaxPmean001+004,013-VibRelaxPmean001+005,014-VibRelaxPmean001+006,015-VibRelaxPmean001+007,016-VibRelaxPmean002+002,017-VibRelaxPmean002+003,018-VibRelaxPmean002+004,019-VibRelaxPmean002+005,020-VibRelaxPmean002+006,021-VibRelaxPmean002+007,022-VibRelaxPmean003+005,023-VibRelaxPmean003+006,024-VibRelaxPmean004+005,025-VibRelaxPmean004+006,026-VibRelaxPmean005+005,027-VibRelaxPmean005+006,028-VibRelaxPmean005+007,029-VibRelaxPmean006+006,030-VibRelaxPmean006+007 - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.00000000000000E-001, 2.00000000000000E-001, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.76994844977540E-003, 1.28422638491642E-001, 1.95039447644747E-006, 2.00000000000000E-001, 2.00000000000000E-001, 1.07516650808754E-004, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv deleted file mode 100644 index 84746d301..000000000 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/Database_Tvib_00119000_ref.csv +++ /dev/null @@ -1,3 +0,0 @@ -001-TIME,002-Pmean ,003-Pmax ,004-MeanFreePath ,005-RotRelaxPmean ,006-RotRelaxPmax ,007-VibRelaxPmean ,008-VibRelaxPmax ,009-VibRelaxPmean001+001,010-VibRelaxPmean001+002,011-VibRelaxPmean001+003,012-VibRelaxPmean001+004,013-VibRelaxPmean001+005,014-VibRelaxPmean001+006,015-VibRelaxPmean001+007,016-VibRelaxPmean002+002,017-VibRelaxPmean002+003,018-VibRelaxPmean002+004,019-VibRelaxPmean002+005,020-VibRelaxPmean002+006,021-VibRelaxPmean002+007,022-VibRelaxPmean003+005,023-VibRelaxPmean003+006,024-VibRelaxPmean004+005,025-VibRelaxPmean004+006,026-VibRelaxPmean005+005,027-VibRelaxPmean005+006,028-VibRelaxPmean005+007,029-VibRelaxPmean006+006,030-VibRelaxPmean006+007 - 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 2.00000000000000E-001, 2.00000000000000E-001, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 - 1.00000000000000E-012, 2.82134785880267E-003, 1.28695700319966E-001, 1.95346891979003E-006, 2.00000000000000E-001, 2.00000000000000E-001, 1.13588359540014E-004, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 4.00000000000000E-003, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000, 0.00000000000000E+000 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini index 18af6983e..efa484b04 100644 --- a/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini +++ b/regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/analyze.ini @@ -1,4 +1,4 @@ compare_data_file_name = PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv,PartAnalyze.csv compare_data_file_reference = Database_Tvib_00157000_ref.csv,Database_Tvib_00205000_ref.csv,Database_Tvib_00245000_ref.csv,Database_Tvib_00297000_ref.csv,Database_Tvib_00351000_ref.csv,Database_Tvib_00419000_ref.csv,Database_Tvib_00593000_ref.csv,Database_Tvib_00676000_ref.csv,Database_Tvib_00773000_ref.csv,Database_Tvib_00859000_ref.csv,Database_Tvib_00938000_ref.csv,Database_Tvib_01030000_ref.csv,Database_Tvib_01130000_ref.csv,Database_Tvib_01260000_ref.csv,Database_Tvib_01450000_ref.csv,Database_Tvib_01680000_ref.csv,Database_Tvib_02050000_ref.csv,Database_Tvib_02450000_ref.csv,Database_Tvib_02970000_ref.csv,Database_Tvib_04190000_ref.csv,Database_Tvib_05930000_ref.csv -compare_data_file_tolerance = 0.10 +compare_data_file_tolerance = 0.15 compare_data_file_tolerance_type = relative \ No newline at end of file From 006e877d53ca84a49689f611911a911e82ab7594 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 8 May 2020 13:33:16 +0200 Subject: [PATCH 17/74] Regression test for chemistry with cross-sections without a background gas, user guide for particle pairing --- REGGIE.md | 22 +- doc/references.bib | 33 ++- doc/userguide/030_features_models.md | 30 ++- .../MCC_MultiSpec_XSec/readme.md | 6 +- .../MCC_MultiSpec_XSec_Chem/DSMC.ini | 214 ++++++++++++++++++ .../DSMCSpecies_electronic_state_full_Data.h5 | Bin 0 -> 107464 bytes ...se_Phelps_Electron_Scattering_EFFECTIVE.h5 | Bin 0 -> 54184 bytes .../PartAnalyze_ref.csv | 12 + .../MCC_MultiSpec_XSec_Chem/analyze.ini | 5 + .../MCC_MultiSpec_XSec_Chem/command_line.ini | 2 + .../MCC_MultiSpec_XSec_Chem/cube_mesh.h5 | Bin 0 -> 6872 bytes .../MCC_MultiSpec_XSec_Chem/hopr.ini | 43 ++++ .../MCC_MultiSpec_XSec_Chem/parameter.ini | 179 +++++++++++++++ .../MCC_MultiSpec_XSec_Chem/readme.md | 5 + src/particles/dsmc/dsmc_collision_prob.f90 | 6 +- 15 files changed, 529 insertions(+), 28 deletions(-) create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMC.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/PartAnalyze_ref.csv create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/analyze.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/command_line.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/cube_mesh.h5 create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/hopr.ini create mode 100644 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/parameter.ini create mode 100755 regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md diff --git a/REGGIE.md b/REGGIE.md index b460e81c4..ddf4599aa 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -185,16 +185,18 @@ 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/checks/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/checks/NIG_Reservoir/CHEM_RATES_QK_recomb_N2/readme.md) | | 15 | MCC_BGG_MultiSpec_XSec | | Multi-species background gas: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec/readme.md) | -| 24 | MCC_BGG_MultiSpec_XSec_Vib | | Multi-species background gas: Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md) | -| 24 | MCC_BGG_MultiSpec_XSec_Chem | | Multi-species background gas: QK ionization and TCE dissociation | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/readme.md) | -| 16 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | -| 17 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | -| 18 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | -| 19 | RELAX_N2 | | Rotational, vibrational, electronic relaxation of N2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2/readme.md) | -| 20 | RELAX_N2Ion | | Rotational, vibrational, electronic relaxation of N2Ion | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2Ion/readme.md) | -| 21 | VarRelaxProb_cold | | Relaxation of a cold reservoir of N2 with variable relaxation probabilities | nProcs=1,2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_cold/readme.md) | -| 22 | VarRelaxProb_hot | | Relaxation of a hot reservoir of N2 and O2 with variable relaxation probabilities | nProcs=2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_hot/readme.md) | -| 23 | VarRelaxProb_Restart | | Initial Autorestart with variable relaxation probabilities | nProcs=1,2 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_Restart/readme.md) | +| 16 | MCC_BGG_MultiSpec_XSec_Vib | | Multi-species background gas: Vibrational relaxation probabilites through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Vib/readme.md) | +| 17 | MCC_BGG_MultiSpec_XSec_Chem | | Multi-species background gas: QK ionization and TCE dissociation | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_BGG_MultiSpec_XSec_Chem/readme.md) | +| 18 | MCC_MultiSpec_XSec | | Multi-species reservoir: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md) | +| 19 | MCC_MultiSpec_XSec_Chem | | Multi-species reservoir: QK ionization and TCE dissociation | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md) | +| 20 | RELAX_CH4 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4/readme.md) | +| 21 | RELAX_CH4_PDR | | Relaxation towards equilibrium with prohibiting double relaxation (single/multi mode for CH4) | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CH4_PDR/readme.md) | +| 22 | RELAX_CO2 | | Rotational, vibrational relaxation towards equilibrium temperature | nProcs=2 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_CO2/readme.md) | +| 23 | RELAX_N2 | | Rotational, vibrational, electronic relaxation of N2 | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2/readme.md) | +| 24 | RELAX_N2Ion | | Rotational, vibrational, electronic relaxation of N2Ion | nProcs=1 | | [Link](regressioncheck/checks/NIG_Reservoir/RELAX_N2Ion/readme.md) | +| 25 | VarRelaxProb_cold | | Relaxation of a cold reservoir of N2 with variable relaxation probabilities | nProcs=1,2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_cold/readme.md) | +| 26 | VarRelaxProb_hot | | Relaxation of a hot reservoir of N2 and O2 with variable relaxation probabilities | nProcs=2,3 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_hot/readme.md) | +| 27 | VarRelaxProb_Restart | | Initial Autorestart with variable relaxation probabilities | nProcs=1,2 | | [Link](regressioncheck/checks/NIG_Reservoir/VarRelaxProb_Restart/readme.md) | #### NIG_MacroBody diff --git a/doc/references.bib b/doc/references.bib index 5e6fba182..bb432f47f 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -644,4 +644,35 @@ @article{Pflug2014 pages={411--416}, year={2014}, publisher={Elsevier} -} \ No newline at end of file +} + + +@article{Pfeiffer2013, +author = {Pfeiffer, Marcel and Mirza, Asim and Fasoulas, Stefanos}, +doi = {10.1016/j.jcp.2013.03.018}, +file = {:home/nizenkov/.local/share/data/Mendeley Ltd./Mendeley Desktop/Downloaded/Pfeiffer, Mirza, Fasoulas - 2013 - A grid-independent particle pairing strategy for DSMC.pdf:pdf}, +issn = {00219991}, +journal = {Journal of Computational Physics}, +mendeley-groups = {DSMC,InstitutePaper}, +pages = {28--36}, +title = {{A grid-independent particle pairing strategy for DSMC}}, +url = {http://linkinghub.elsevier.com/retrieve/pii/S0021999113001964}, +volume = {246}, +year = {2013} +} + +@article{Pitchford2017, +abstract = {LXCat is an open-access platform (www.lxcat.net) for curating data needed for modeling the electron and ion components of technological plasmas. The data types presently supported on LXCat are scattering cross sections and swarm/transport parameters, ion-neutral interaction potentials, and optical oscillator strengths. Twenty-four databases contributed by different groups around the world can be accessed on LXCat. New contributors are welcome; the database contributors retain ownership and are responsible for the contents and maintenance of the individual databases. This article summarizes the present status of the project.}, +author = {Pitchford, Leanne C. and Alves, Luis L. and Bartschat, Klaus and Biagi, Stephen F. and Bordage, Marie Claude and Bray, Igor and Brion, Chris E. and Brunger, Michael J. and Campbell, Laurence and Chachereau, Alise and Chaudhury, Bhaskar and Christophorou, Loucas G. and Carbone, Emile and Dyatko, Nikolay A. and Franck, Christian M. and Fursa, Dmitry V. and Gangwar, Reetesh K. and Guerra, Vasco and Haefliger, Pascal and Hagelaar, Gerjan J.M. and Hoesl, Andreas and Itikawa, Yukikazu and Kochetov, Igor V. and McEachran, Robert P. and Morgan, W. Lowell and Napartovich, Anatoly P. and Puech, Vincent and Rabie, Mohamed and Sharma, Lalita and Srivastava, Rajesh and Stauffer, Allan D. and Tennyson, Jonathan and de Urquijo, Jaime and van Dijk, Jan and Viehland, Larry A. and Zammit, Mark C. and Zatsarinny, Oleg and Pancheshnyi, Sergey}, +doi = {10.1002/ppap.201600098}, +file = {:media/nizenkov/storage/Literature/References/Pitchford2017.pdf:pdf}, +issn = {16128869}, +journal = {Plasma Processes and Polymers}, +keywords = {cold plasma,modeling,on-line databases,scattering cross sections,transport coefficients}, +mendeley-groups = {Plasma}, +number = {1-2}, +pages = {1--17}, +title = {{LXCat: an Open-Access, Web-Based Platform for Data Needed for Modeling Low Temperature Plasmas}}, +volume = {14}, +year = {2017} +} diff --git a/doc/userguide/030_features_models.md b/doc/userguide/030_features_models.md index ea6a243a3..51fd4c65e 100644 --- a/doc/userguide/030_features_models.md +++ b/doc/userguide/030_features_models.md @@ -286,7 +286,7 @@ Modelling of reactive surfaces is enabled by setting `Part-BoundaryX-Condition=r appropriate particle boundary surface model `Part-BoundaryX-SurfaceModel`. The available conditions (`Part-BoundaryX-SurfaceModel=`) are described in the table below. -| SurfaceModel | Description | +| Model | Description | | :----------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 0 (default) | Standard extended Maxwellian scattering | | 2 | Simple recombination on surface collision, where an impinging particle as given by Ref. [@Reschke2019]. | @@ -884,15 +884,25 @@ These parameters allow the simulation of non-reactive gases. Additional paramete ### Pairing & Collision Modelling \label{sec:dsmc_collision} -By default, a conventional statistical pairing algorithm randomly pairs particles within a cell. Here, the mesh should resolve the mean free path to avoid numerical diffusion. +By default, a conventional statistical pairing algorithm randomly pairs particles within a cell. Here, the mesh should resolve the mean free path to avoid numerical diffusion. To circumvent this requirement, an octree-based sorting and cell refinement [@Pfeiffer2013] can be enabled by -The octree-based sorting and cell refinement in combination with the nearest neighbour pairing can be enabled by + Particles-DSMC-UseOctree = T + Particles-OctreePartNumNode = 80 ! (3D default, 2D default: 40) + Particles-OctreePartNumNodeMin = 50 ! (3D default, 2D default: 28) - Particles-DSMC-UseOctree = T +The algorithm refines a cell recursively as long as the mean free path is smaller than a characteristic length (approximated by the cubic root of the cell volume) and the number of particles is greater than `Particles-OctreePartNumNode`. The latter condition serves the purpose to accelerate the simulation by avoiding looking for the nearest neighbour in a cell with a large number of particles. To avoid cells with a low particle number, the cell refinement is stopped when the particle number is below `Particles-OctreePartNumNodeMin`. These two parameters have different default values for 2D/axisymmetric and 3D simulations. -WIP: octree, nearest neighbor, VHS +To further reduce numerical diffusion, the nearest neighbour search for the particle pairing can be enabled -Particles-DSMC-ProhibitDoubleCollision [@Shevyrin2005,@Akhlaghi2018] + Particles-DSMC-UseNearestNeighbour = T + +An additional attempt to increase the quality of simulations results is to prohibit repeated collisions between particles [@Shevyrin2005;@Akhlaghi2018]. This options is enabled by default in 2D/axisymmetric simulations, but disabled by default in 3D simulations. + + Particles-DSMC-ProhibitDoubleCollision = T + +#### Cross-section based collision probabilities + +Cross-section data to model collisional and relaxation probabilities (e.g. in case of electron-neutral collisions), analogous to Monte Carlo Collisions, can be utilized and is described in Section \ref{sec:xsec_collision} and \ref{sec:xsec_relax}. ### Inelastic Collisions \& Relaxation \label{sec:dsmc_relaxation} @@ -1082,7 +1092,7 @@ $$w < \frac{1}{\left(\sqrt{2}\pi d_{\mathrm{ref}}^2 n^{2/3}\right)^3},$$ where $d_{\mathrm{ref}}$ is the reference diameter and $n$ the number density. Here, the largest number density within the simulation domain should be used as the worst-case. For supersonic/hypersonic flows, the conditions behind a normal shock can be utilized as a first guess. For a thruster/nozzle expansion simulation, the chamber or throat conditions are the limiting factor. -## Background Gas +## Background Gas \label{sec:background_gas} A constant background gas (single species or mixture) can be utilized to enable efficient particle collisions between the background gas and other particle species (represented by actual simulation particles). The assumption is that the density of the background gas $n_{\mathrm{gas}}$ is much greater than the density of the particle species, e.g. the charged species in a plasma, $n_{\mathrm{charged}}$ @@ -1097,21 +1107,21 @@ Other species parameters such as mass, charge, temperature and velocity distribu 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. Consequently, the collision probabilities are calculated using the conventional DSMC routines and the VHS cross-section model. Aftwards, the collilsion process is performed (if the probability is greater than a random number) and it is tested whether additional energy exchange and chemical reactions occur. While the VHS model is sufficient to model collisions between neutral species, it cannot reproduce the phenomena of a neutral-electron interaction. For this purpose, the cross-section based collision probabilities should be utilized, which are discussed in the following. -### Cross-section based collision probability +### Cross-section based collision probability \label{sec:xsec_collision} For modelling of particle collisions with the Particle-in-Cell method, often the Monte Carlo Collision (MCC) algorithm is utilized. Here, experimentally measured or ab-initio calculated cross-sections are typically utilized to determine the collision probability. In PICLas, the null collision method after [@Birdsall1991],[@Vahedi1995] is implemented, where the number of collision pairs is determined based a maximum collision frequency. Thus, the computational effort is reduced as not every particle has to be checked for a collision, such as in the previously described DSMC-based background gas. To activate the MCC procedure, the collision cross-sections have to be supplied via read-in from a database Particles-CollXSec-Database = MCC_Database.h5 Particles-CollXSec-NullCollision = TRUE -Cross-section data can be retrieved from the [LXCat database](https://fr.lxcat.net/home/) and converted with a Python script provided in the tools folder: `piclas/tools/crosssection_database`. Details on how to create an own database with custom cross-section data is given in Section \ref{sec:tools_mcc}. Finally, the input which species should be treated with the MCC model is required +Cross-section data can be retrieved from the [LXCat database](https://fr.lxcat.net/home/) [@Pitchford2017] and converted with a Python script provided in the tools folder: `piclas/tools/crosssection_database`. Details on how to create an own database with custom cross-section data is given in Section \ref{sec:tools_mcc}. Finally, the input which species should be treated with the MCC model is required Part-Species2-SpeciesName = electron Part-Species2-UseCollXSec = T The read-in of the cross-section data is based on the provided species name and the species name of the background gas (e.g. if the background species name is Ar, the code will look for a container named `Ar-electron` in the MCC database). Finally, the cross-section based collision modelling (e.g. for neutral-charged collisions) and the VHS model (e.g. for neutral-neutral collisions) can be utilized within a simulation for different species. -### Cross-section based vibrational relaxation probability +### Cross-section based vibrational relaxation probability \label{sec:xsec_relax} In the following, the utilization of cross-section data is extended to the determination of the vibrational relaxation probability. When data is available, it will be read-in by the Python script described above. If different vibrational levels are available, they will be summarized to a single relaxation probability. Afterwards the regular DSMC-based relaxation procedure will be performed. To enable the utilization of these levels, the following flag shall be supplied diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md index 93f127ac6..91d697825 100755 --- a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec/readme.md @@ -1,6 +1,6 @@ -# Multi-species background gas with MCC -* Testing the multi-species background gas with a CO2-N2-He reservoir using effective cross-section data (Phelps database, www.lxcat.net, retrieved on February 18, 2020) -* Background gas: 6E23 1/m3 (1/3 each), Electrons: n_e = 1E21 1/m3 +# Multi-species reservoir with MCC +* Testing a CO2-N2-He reservoir using effective cross-section data (Phelps database, www.lxcat.net, retrieved on February 18, 2020) +* Mixture: 2E22 1/m3 (1/3 each), Electrons: n_e = 2E22 1/m3 * Adapting the constant velocity of the electrons from 0.01 eV to 100 eV * Collisional rates compared with the theoretical results (see Figure) * "get_values.py" script can be utilized to collect the collision rates from the reference databases \ No newline at end of file diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMC.ini b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMC.ini new file mode 100644 index 000000000..e1167faf9 --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMC.ini @@ -0,0 +1,214 @@ +! =============================================================================== ! +! Species1, CO2 +! =============================================================================== ! +Part-Species1-SpeciesName = CO2 +Part-Species1-PolyatomicMol = true +Part-Species1-InteractionID = 2 +Part-Species1-VHSReferenceTemp = 273 +Part-Species1-VHSReferenceDiam = 5.10E-10 +Part-Species1-omegaVHS = 0.24 +Part-Species1-NumOfAtoms = 3 +Part-Species1-LinearMolec = true +Part-Species1-CharaTempVib1 = 959.66 +Part-Species1-CharaTempVib2 = 959.66 +Part-Species1-CharaTempVib3 = 1918.6 +Part-Species1-CharaTempVib4 = 3382 +Part-Species1-Ediss_eV = 5.45 +Part-Species1-HeatOfFormation_K = -47324.1 +! =============================================================================== ! +! Species2, N2 +! =============================================================================== ! +Part-Species2-SpeciesName = N2 +Part-Species2-InteractionID = 2 +Part-Species2-VHSReferenceTemp = 273 +Part-Species2-VHSReferenceDiam = 4.17E-10 +Part-Species2-omegaVHS = 0.24 +Part-Species2-CharaTempVib = 3393.3 +Part-Species2-Ediss_eV = 9.759 +Part-Species2-CharaTempRot = 2.87 +Part-Species2-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species3, He +! =============================================================================== ! +Part-Species3-SpeciesName = He +Part-Species3-InteractionID = 1 +Part-Species3-VHSReferenceTemp = 273 ! changed randomly from 300 +Part-Species3-VHSReferenceDiam = 3.0E-10 +Part-Species3-omegaVHS = 0.24 ! changed randomly from 0.2 +Part-Species3-HeatOfFormation_K = 0.0 +! =============================================================================== ! +! Species4, e +! =============================================================================== ! +Part-Species4-SpeciesName = electron +Part-Species4-InteractionID = 4 +Part-Species4-VHSReferenceTemp = 273 +Part-Species4-VHSReferenceDiam = 2.817920E-15 +Part-Species4-omegaVHS = 0.24 +! =============================================================================== ! +! Species5, CO2^+ +! =============================================================================== ! +Part-Species5-SpeciesName = CO2Ion1 +Part-Species5-PolyatomicMol = true +Part-Species5-InteractionID = 20 +Part-Species5-VHSReferenceTemp = 273 ! copied from CO2 +Part-Species5-VHSReferenceDiam = 5.10E-10 ! copied from CO2 +Part-Species5-omegaVHS = 0.24 ! copied from CO2 +Part-Species5-NumOfAtoms = 3 +Part-Species5-LinearMolec = true +Part-Species5-CharaTempVib1 = 959.66 ! copied from CO2 +Part-Species5-CharaTempVib2 = 959.66 ! copied from CO2 +Part-Species5-CharaTempVib3 = 1918.6 ! copied from CO2 +Part-Species5-CharaTempVib4 = 3382 ! copied from CO2 +Part-Species5-Ediss_eV = 5.45 ! copied from CO2 +Part-Species5-PreviousState = 1 +! =============================================================================== ! +! Species6, N_2^+ +! =============================================================================== ! +Part-Species6-SpeciesName = N2Ion1 +Part-Species6-InteractionID = 20 +Part-Species6-VHSReferenceTemp = 273 +Part-Species6-VHSReferenceDiam = 4.17E-10 +Part-Species6-omegaVHS = 0.24 +Part-Species6-CharaTempVib = 3174.7 +Part-Species6-Ediss_eV = 8.712 ! Herzberg +Part-Species6-CharaTempRot = 2.8 +Part-Species6-PreviousState = 2 +! =============================================================================== ! +! Species7, He+ +! =============================================================================== ! +Part-Species7-SpeciesName = HeIon1 +Part-Species7-InteractionID = 10 +Part-Species7-VHSReferenceTemp = 273 +Part-Species7-VHSReferenceDiam = 3.0E-10 +Part-Species7-omegaVHS = 0.24 +Part-Species7-PreviousState = 3 +! =============================================================================== ! +! Species8, CO +! =============================================================================== ! +Part-Species8-SpeciesName = CO +Part-Species8-InteractionID = 2 +Part-Species8-VHSReferenceTemp = 273 +Part-Species8-VHSReferenceDiam = 4.17E-10 +Part-Species8-omegaVHS = 0.24 +Part-Species8-CharaTempVib = 3120.7 +Part-Species8-Ediss_eV = 11.06 +Part-Species8-HeatOfFormation_K = -13292.85 +Part-Species8-CharaTempRot = 2.8 +! =============================================================================== ! +! Species9, O +! =============================================================================== ! +Part-Species9-SpeciesName = O +Part-Species9-InteractionID = 1 +Part-Species9-VHSReferenceTemp = 273 +Part-Species9-VHSReferenceDiam = 3.49E-10 +Part-Species9-omegaVHS = 0.24 +Part-Species9-HeatOfFormation_K = 29975.34 +! =============================================================================== ! +! Species10, N +! =============================================================================== ! +Part-Species10-SpeciesName = N +Part-Species10-InteractionID = 1 +Part-Species10-VHSReferenceTemp = 273 +Part-Species10-VHSReferenceDiam = 3.00E-010 +Part-Species10-omegaVHS = 0.24 +Part-Species10-HeatOfFormation_K = 56821.44 + +! =============================================================================== ! +! Data for chemical reactions +! =============================================================================== ! +DSMC-NumOfReactions=9 +! =============================================================================== ! +! Ionization +! =============================================================================== ! +! Reaction 1 | CO2 + M --> CO2Ion1 + M + e +DSMC-Reaction1-ReactionType = iQK +DSMC-Reaction1-QKProcedure = true +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/5,0,4/) +DSMC-Reaction1-NumberOfNonReactives = 4 +DSMC-Reaction1-NonReactiveSpecies = (/4,5,6,7/) + +! Reaction 2 | N2 + M --> N2Ion1 + M + e +DSMC-Reaction2-ReactionType = iQK +DSMC-Reaction2-QKProcedure = true +DSMC-Reaction2-Reactants = (/2,0,0/) +DSMC-Reaction2-Products = (/6,0,4/) +DSMC-Reaction2-NumberOfNonReactives = 4 +DSMC-Reaction2-NonReactiveSpecies = (/4,5,6,7/) + +! Reaction 3 | He + M --> HeIon1 + M + e +DSMC-Reaction3-ReactionType = iQK +DSMC-Reaction3-QKProcedure = true +DSMC-Reaction3-Reactants = (/3,0,0/) +DSMC-Reaction3-Products = (/7,0,4/) +DSMC-Reaction3-NumberOfNonReactives = 4 +DSMC-Reaction3-NonReactiveSpecies = (/4,5,6,7/) + +! =============================================================================== ! +! Dissociation CO2 +! =============================================================================== ! + +! Reaction 4 | CO2 + e --> CO + O + e +! Arrhenius fit based on data extracted from Pietanza2015, Fig 2. and 4. +DSMC-Reaction4-ReactionType = D +DSMC-Reaction4-Reactants = (/1,4,0/) +DSMC-Reaction4-Products = (/8,4,9/) +DSMC-Reaction4-Arrhenius-Prefactor = 1E-26 +DSMC-Reaction4-Arrhenius-Powerfactor= 2.5 +DSMC-Reaction4-Activation-Energy_K = 15000 + +! Reaction 5 | CO2 + molecules --> CO + O + molecules +! Arrhenius coefficients from Johnston2014 +DSMC-Reaction5-ReactionType = D +DSMC-Reaction5-Reactants = (/1,0,0/) +DSMC-Reaction5-Products = (/8,0,9/) +DSMC-Reaction5-Arrhenius-Prefactor = 1.15E-08 +DSMC-Reaction5-Arrhenius-Powerfactor= -1.5 +DSMC-Reaction5-Activation-Energy_K = 63280 +DSMC-Reaction5-NumberOfNonReactives = 2 +DSMC-Reaction5-NonReactiveSpecies = (/5,6/) + +! Reaction 6 | CO2 + atoms --> CO + O + atoms +! Arrhenius coefficients from Johnston2014 +DSMC-Reaction6-ReactionType = D +DSMC-Reaction6-Reactants = (/1,0,0/) +DSMC-Reaction6-Products = (/8,0,9/) +DSMC-Reaction6-Arrhenius-Prefactor = 2.29E-08 +DSMC-Reaction6-Arrhenius-Powerfactor= -1.5 +DSMC-Reaction6-Activation-Energy_K = 63280 +DSMC-Reaction6-NumberOfNonReactives = 1 +DSMC-Reaction6-NonReactiveSpecies = (/7/) + +! =============================================================================== ! +! Dissociation N2 +! =============================================================================== ! +! Arrhenius coefficients from Park1993 + +!Reaction 7 (N2 + molecule -> N + N + molecule) +DSMC-Reaction7-ReactionType = D +DSMC-Reaction7-Reactants = (/2,0,0/) +DSMC-Reaction7-Products = (/10,0,10/) +DSMC-Reaction7-Arrhenius-Prefactor = 1.16E-08 +DSMC-Reaction7-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction7-Activation-Energy_K = 113200.0 +DSMC-Reaction7-NumberOfNonReactives = 2 +DSMC-Reaction7-NonReactiveSpecies = (/5,6/) + +!Reaction 8 (N2 + atom -> N + N + atom) +DSMC-Reaction8-ReactionType = D +DSMC-Reaction8-Reactants = (/2,0,0/) +DSMC-Reaction8-Products = (/10,0,10/) +DSMC-Reaction8-Arrhenius-Prefactor = 4.98E-08 +DSMC-Reaction8-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction8-Activation-Energy_K = 113200.0 +DSMC-Reaction8-NumberOfNonReactives = 1 +DSMC-Reaction8-NonReactiveSpecies = (/7/) + +!Reaction 9 (N2 + e -> N + N + e) +DSMC-Reaction9-ReactionType = D +DSMC-Reaction9-Reactants = (/2,4,0/) +DSMC-Reaction9-Products = (/10,4,10/) +DSMC-Reaction9-Arrhenius-Prefactor = 1.99E-005 +DSMC-Reaction9-Arrhenius-Powerfactor = -1.60 +DSMC-Reaction9-Activation-Energy_K = 113200.0 + diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/DSMCSpecies_electronic_state_full_Data.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5d3d0ad1fcb1edaa96261071da98dcd3e2765ef3 GIT binary patch literal 107464 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 Koh0OTJK+zn&R==} literal 0 HcmV?d00001 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/hopr.ini b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/hopr.ini new file mode 100644 index 000000000..25e60272b --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/hopr.ini @@ -0,0 +1,43 @@ +!=============================================================================== ! +! MAKEFILE PARAMETER (put a "#" in front, NO blanks!) +!=============================================================================== ! +! This is only a dummy parameter needed for the regression check +#MPI= + +!=============================================================================== ! +! 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/) ! [0,1]x[0,1]x[0,0.05] + nElems =(/2,1,1/) ! Anzahl der Elemente in jede Richtung (nfine 4:16 5:32 6:64 7:128) + 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 +!=============================================================================== ! + nUserDefinedBoundaries=1 + BoundaryName=BC_adiabat ! Outflow: open (absorbing) [for MAXWELL] + BoundaryType=(/4,0,0,0/) ! Outflow: open (absorbing) [for MAXWELL] + +!=============================================================================== ! +! BASIS +!=============================================================================== ! + NVisu = 7 + +!=============================================================================== ! +! SEARCH +!=============================================================================== ! +! nElemsNodeSearch=50 +! RefineSideSearch=50 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/parameter.ini b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/parameter.ini new file mode 100644 index 000000000..4a798a17a --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/parameter.ini @@ -0,0 +1,179 @@ +CFLscale = 0.2 +c0 = 299792458. +eps = 8.8541878176E-12 +mu = 12.566370614e-7 +IniExactFunc = 0 +N = 1 +NAnalyze = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +Logging = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = Reservoir +IterDisplayStep = 10 +Part-AnalyzeStep = 5 +CalcNumDens = T +CalcTemp = T +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +Particles-ManualTimeStep = 1.0E-11 +tend = 5.0E-10 +Analyze_dt = 1E-7 ! Timestep of analyze outputs +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=1000000 +Part-nSpecies=10 +Part-nBounds=1 +Part-Boundary1-SourceName=BC_adiabat +Part-Boundary1-Condition=reflective +Part-FIBGMdeltas=(/4.64E-6,4.64E-6,4.64E-6/) +Particles-HaloEpsVelo=5000 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 3 +Particles-DSMCReservoirSim = T +Particles-DSMC-CalcQualityFactors = F + +Particles-CollXSec-Database = LXCat_Database_Phelps_Electron_Scattering_EFFECTIVE.h5 + +Part-Species4-UseCollXSec = T +Part-Species4-UseVibXSec = T + +Particles-DSMC-RotRelaxProb = 0.2 +Particles-DSMC-VibRelaxProb = 0.04 +Particles-DSMC-ElecRelaxProb = 1 + +Particles-DSMC-ElectronicModel = T +Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_full_Data.h5 +EpsMergeElectronicState = 1E-2 +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species1-MacroParticleFactor = 10 +Part-Species2-MacroParticleFactor = 10 +Part-Species3-MacroParticleFactor = 10 +Part-Species4-MacroParticleFactor = 10 +Part-Species5-MacroParticleFactor = 10 +Part-Species6-MacroParticleFactor = 10 +Part-Species7-MacroParticleFactor = 10 +Part-Species8-MacroParticleFactor = 10 ! Species8 | CO +Part-Species9-MacroParticleFactor = 10 ! Species9 | O +Part-Species10-MacroParticleFactor = 10 ! Species10 | N +! =============================================================================== ! +! Species1 | CO2 +! =============================================================================== ! +Part-Species1-MassIC = 7.306E-26 +Part-Species1-ChargeIC = 0 + +Part-Species1-nInits = 1 +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-PartDensity = 2E22 +Part-Species1-Init1-SpaceIC = cell_local +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 1000. +Part-Species1-Init1-TempVib = 1000. +Part-Species1-Init1-TempRot = 1000. +Part-Species1-Init1-TempElec = 1000. +! =============================================================================== ! +! Species2 | N2 +! =============================================================================== ! +Part-Species2-MassIC = 4.65200E-26 ! N2 Molecular Mass +Part-Species2-ChargeIC = 0 + +Part-Species2-nInits = 1 +Part-Species2-Init1-velocityDistribution = maxwell_lpn +Part-Species2-Init1-PartDensity = 2E22 +Part-Species2-Init1-SpaceIC = cell_local +Part-Species2-Init1-VeloIC = 0 +Part-Species2-Init1-VeloVecIC = (/0.,0.,1./) +Part-Species2-Init1-MWTemperatureIC = 1000. +Part-Species2-Init1-TempVib = 1000. +Part-Species2-Init1-TempRot = 1000. +Part-Species2-Init1-TempElec = 1000. +! =============================================================================== ! +! Species3 | He +! =============================================================================== ! +Part-Species3-MassIC = 6.64647640919434E-027 +Part-Species3-ChargeIC = 0 + +Part-Species3-nInits = 1 +Part-Species3-Init1-velocityDistribution = maxwell_lpn +Part-Species3-Init1-PartDensity = 2E22 +Part-Species3-Init1-SpaceIC = cell_local +Part-Species3-Init1-VeloIC = 0 +Part-Species3-Init1-VeloVecIC = (/0.,0.,1./) +Part-Species3-Init1-MWTemperatureIC = 1000. +Part-Species3-Init1-Tempelec = 1000. +! =============================================================================== ! +! Species4 | e +! =============================================================================== ! +Part-Species4-MassIC = 9.1093826E-31 +Part-Species4-ChargeIC = -1.60217653E-19 + +Part-Species4-nInits = 1 +Part-Species4-Init1-velocityDistribution = maxwell_lpn +Part-Species4-Init1-PartDensity = 2E22 +Part-Species4-Init1-SpaceIC = cell_local +Part-Species4-Init1-VeloIC = 0 +Part-Species4-Init1-VeloVecIC = (/0.,0.,1./) +Part-Species4-Init1-MWTemperatureIC = 150000.0 +! =============================================================================== ! +! Species5 | CO2Ion +! =============================================================================== ! +Part-Species5-MassIC = 7.305908906174E-26 ! CO2 mass minus electron mass +Part-Species5-ChargeIC = 1.60217653E-19 +Part-Species5-MWTemperatureIC = 1000. +Part-Species5-TempVib = 1000. +Part-Species5-TempRot = 1000. +Part-Species5-TempElec = 1000. +! =============================================================================== ! +! Species6 | N2Ion +! =============================================================================== ! +Part-Species6-MassIC = 4.651908906174E-26 ! N2 mass minus electron mass +Part-Species6-ChargeIC = 1.60217653E-19 +Part-Species6-MWTemperatureIC = 1000. +Part-Species6-TempVib = 1000. +Part-Species6-TempRot = 1000. +Part-Species6-TempElec = 1000. +! =============================================================================== ! +! Species7 | HeIon +! =============================================================================== ! +Part-Species7-MassIC = 6.645565470903E-027 +Part-Species7-ChargeIC = 1.60217653E-19 +Part-Species7-MWTemperatureIC = 1000. +Part-Species7-Tempelec = 1000. +! =============================================================================== ! +! Species8 | CO +! =============================================================================== ! +Part-Species8-MassIC = 4.65100E-26 +Part-Species8-ChargeIC = 0 +Part-Species8-MWTemperatureIC = 394.2 +Part-Species8-TempRot = 394.2 +Part-Species8-TempVib = 394.2 +Part-Species8-TempElec = 394.2 +! =============================================================================== ! +! Species9 | O +! =============================================================================== ! +Part-Species9-MassIC = 2.65700E-26 +Part-Species9-ChargeIC = 0 +Part-Species9-MWTemperatureIC = 394.2 +Part-Species9-TempElec = 394.2 +! =============================================================================== ! +! Species10 - N +! =============================================================================== ! +Part-Species10-MassIC = 2.32600E-26 ! N Molecular Mass +Part-Species10-ChargeIC = 0 +Part-Species10-MWTemperatureIC = 394.2 +Part-Species10-TempElec = 394.2 diff --git a/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md new file mode 100755 index 000000000..55e9cc99c --- /dev/null +++ b/regressioncheck/checks/NIG_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md @@ -0,0 +1,5 @@ +# Multi-species reservoir with collision cross-sections and TCE/QK chemistry +* Multi-species reservoir with a CO2-N2-He reservoir using cross-section data (Phelps database, www.lxcat.net, retrieved on February 18, 2020) +* Testing QK ionization and TCE dissociation +* Mixture at n = 6E22 1/m3 (equal parts CO2, N2, He), T=1000K +* Electrons at n = 2E22 1/m3, T=150000K \ No newline at end of file diff --git a/src/particles/dsmc/dsmc_collision_prob.f90 b/src/particles/dsmc/dsmc_collision_prob.f90 index 2fc4eaccf..03819f18c 100644 --- a/src/particles/dsmc/dsmc_collision_prob.f90 +++ b/src/particles/dsmc/dsmc_collision_prob.f90 @@ -44,7 +44,7 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) USE MOD_DSMC_Vars, ONLY : SpecDSMC, Coll_pData, CollInf, DSMC, BGGas, ChemReac, RadialWeighting USE MOD_DSMC_Vars, ONLY : UseMCC, SpecXSec, XSec_NullCollision USE MOD_DSMC_Vars, ONLY : ConsiderVolumePortions - USE MOD_Particle_Vars, ONLY : PartSpecies, Species, PartState, VarTimeStep + USE MOD_Particle_Vars, ONLY : PartSpecies, Species, VarTimeStep USE MOD_Particle_Mesh_Vars, ONLY : GEO USE MOD_TimeDisc_Vars, ONLY : dt USE MOD_DSMC_SpecXSec, ONLY: InterpolateCrossSection, XSec_CalcCollisionProb @@ -63,10 +63,8 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPType, NbrOfReaction, iPart_p1, iPart_p2, iSpec_p1, iSpec_p2, iCase - REAL :: SpecNum1, SpecNum2, Weight1, Weight2, Volume + REAL :: SpecNum1, SpecNum2, Weight1, Weight2, Volume, CollProb REAL :: aCEX, bCEX, aMEX, bMEX, aEL, bEL, sigma_tot, MacroParticleFactor, dtCell, CollCaseNum - REAL :: CollEnergy, CollProb, VeloSquare, SpecNumTarget, SpecNumSource - INTEGER :: XSecSpec, XSecPart, targetSpec #if (PP_TimeDiscMethod==42) INTEGER :: iReac, iSpec #endif From 98ce98f3edac58243309a90778e9ed9a80f6fe46 Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Tue, 17 Mar 2020 13:22:35 +0100 Subject: [PATCH 18/74] GCC 9.3.0 became more rigorous checking INTENT for RECURSIVE calls Fortunately, NodeDepth as well as StartElem only require INTENT(IN) instead of INTENT(INOUT) --- src/particles/dsmc/dsmc_particle_pairing.f90 | 33 ++++++++++--------- src/particles/particle_mesh/particle_mesh.f90 | 3 +- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/particles/dsmc/dsmc_particle_pairing.f90 b/src/particles/dsmc/dsmc_particle_pairing.f90 index ea203fd6f..0ad6eeeb4 100644 --- a/src/particles/dsmc/dsmc_particle_pairing.f90 +++ b/src/particles/dsmc/dsmc_particle_pairing.f90 @@ -920,7 +920,7 @@ SUBROUTINE DSMC_CalcSubNodeVolumes2D(iElem, NodeDepth, Node) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: iElem -INTEGER, INTENT(INOUT) :: NodeDepth +INTEGER, INTENT(IN) :: NodeDepth TYPE (tNodeVolume), INTENT(OUT), POINTER :: Node !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -972,7 +972,7 @@ SUBROUTINE DSMC_CalcSubNodeVolumes(iElem, NodeDepth, Node) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: iElem - INTEGER, INTENT(INOUT) :: NodeDepth + INTEGER, INTENT(IN) :: NodeDepth TYPE (tNodeVolume), INTENT(OUT), POINTER :: Node !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -1013,7 +1013,8 @@ RECURSIVE SUBROUTINE InitVanderOct(LocalVdm, NodeDepth, LocalDepth, OctreeVdmLoc IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES - INTEGER, INTENT(INOUT) :: NodeDepth, LocalDepth + INTEGER, INTENT(IN) :: NodeDepth + INTEGER, INTENT(INOUT) :: LocalDepth REAL, INTENT(OUT) :: LocalVdm(0:2**NodeDepth-1,0:PP_N) TYPE (tOctreeVdm), POINTER, INTENT(INOUT) :: OctreeVdmLoc !----------------------------------------------------------------------------------------------------------------------------------- @@ -1051,7 +1052,7 @@ RECURSIVE SUBROUTINE AddNodeVolumes(NodeDepth, Node, DetJac, VdmLocal, SubNodesI IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES - INTEGER, INTENT(INOUT) :: NodeDepth + INTEGER, INTENT(IN) :: NodeDepth INTEGER, INTENT(IN), OPTIONAL :: SubNodesIn(:) TYPE (tNodeVolume), INTENT(OUT), POINTER :: Node REAL, INTENT(INOUT) :: DetJac(1,0:2**NodeDepth-1,0:2**NodeDepth-1,0:2**NodeDepth-1) @@ -1160,7 +1161,7 @@ SUBROUTINE CalcSubNodeMPVolumePortions(iElem, NodeDepth, Node) !> a. allocate and initialize container for treenode of current node level !> b. insert (nPointsMCVolumeEstimate*(8**(NodeDepth))) number of points into element and match which are inside of macrobody !> c. find volume portions of each node by matching the inserted points to each subnode -!> 3.2 If macroscopic body occupies the total element or element has no macroscopic body then set all subnodes to 1 or 0 +!> 3.2 If macroscopic body occupies the total element or element has no macroscopic body then set all subnodes to 1 or 0 !> (MPVolumePortion of total element) !=================================================================================================================================== ! MODULES @@ -1243,17 +1244,17 @@ END SUBROUTINE CalcSubNodeMPVolumePortions RECURSIVE SUBROUTINE AddNodeMPVolumePortions(iElem, NodeDepth, Node, TreeNode, LocalNodeDepth) !=================================================================================================================================== !> 1. TreeNode Mode: -!> Select whether deepest octree level is reached -!> 1-A. not deepest level: +!> Select whether deepest octree level is reached +!> 1-A. not deepest level: !> 1-A.1. find the correct childnode ID for each point in the current treenode and assign to childnode arrays !> 1-A.2. move to deeper level -!> 1-B. deepest level: +!> 1-B. deepest level: !> assign correct volumeportion to octree subnode -!> 2. LocalNodeDepth: -!> Select whether deepest octree level is reached -!> 2-A. not deepest level: +!> 2. LocalNodeDepth: +!> Select whether deepest octree level is reached +!> 2-A. not deepest level: !> move to deeper level -!> 2-B. deepest level: +!> 2-B. deepest level: !> assign correct volumeportion to octree subnode !=================================================================================================================================== ! MODULES @@ -1433,7 +1434,7 @@ RECURSIVE SUBROUTINE AddNodeVolumes2D(NodeDepth, Node, DetJac, VdmLocal, iElem, IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(INOUT) :: NodeDepth +INTEGER, INTENT(IN) :: NodeDepth INTEGER, INTENT(IN) :: iElem INTEGER, INTENT(IN), OPTIONAL :: SubNodesIn(:) TYPE (tNodeVolume), INTENT(OUT), POINTER :: Node @@ -1592,7 +1593,7 @@ PURE INTEGER FUNCTION OCTANTCUBEID(centerPoint,coord) ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE -! INPUT VARIABLES +! INPUT VARIABLES REAL,INTENT(IN) :: centerPoint(1:3) REAL,INTENT(IN) :: coord(1:3) !----------------------------------------------------------------------------------------------------------------------------------! @@ -1628,7 +1629,7 @@ PURE FUNCTION OCTANTCUBEMIDPOINT(CubeID,octantDepth,octantCenter) ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE -! INPUT VARIABLES +! INPUT VARIABLES INTEGER,INTENT(IN) :: CubeID INTEGER,INTENT(IN) :: octantDepth REAL,INTENT(IN) :: octantCenter(1:3) @@ -1713,7 +1714,7 @@ LOGICAL RECURSIVE FUNCTION GETMPVOLDONE(maxDepth,currentDepth,Node) RESULT(doneF USE MOD_DSMC_Vars ,ONLY: tNodeVolume !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE -! INPUT VARIABLES +! INPUT VARIABLES INTEGER,INTENT(IN) :: maxDepth INTEGER,INTENT(IN) :: currentDepth TYPE (tNodeVolume), INTENT(IN), POINTER :: Node diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index ebae0e037..67cd97600 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -5474,7 +5474,8 @@ RECURSIVE SUBROUTINE RecurseCheckNeighElems(StartElem,HaloElem,TempHaloNumElems, IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(INOUT) :: StartElem,HaloElem,TempHaloElems(1:500), TempHaloNumElems +INTEGER,INTENT(IN) :: StartElem +INTEGER,INTENT(INOUT) :: HaloElem,TempHaloElems(1:500), TempHaloNumElems !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- From 69f110bba7d303390cce73f914b86f350aa69a23 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 12 May 2020 16:00:34 +0200 Subject: [PATCH 19/74] Fixed typos and added new tool "h5_dataset_copy": Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. --- tools/TOOLS.md | 3 +- .../calcElectricCurrentPartStateBoundary.py | 2 +- .../cleanUp_stdOut_files.py | 4 +- tools/flip_PartState/flip_PartState.py | 2 +- tools/h5_dataset_copy/h5_dataset_copy.py | 139 ++++++++++++++++++ .../merge_DSMCSurfState.py | 2 +- tools/merge_PartState/merge_PartState.py | 2 +- tools/visuBox_PartState/visuBox_PartState.py | 4 +- 8 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 tools/h5_dataset_copy/h5_dataset_copy.py diff --git a/tools/TOOLS.md b/tools/TOOLS.md index 2c77fce52..fde8fc12c 100644 --- a/tools/TOOLS.md +++ b/tools/TOOLS.md @@ -19,6 +19,7 @@ This is a loose collection of tools with respect to pre- and post-processing of | 2013-10-21 | extractParticleData.f90 | Fortran | | | | 2019-10-31 | find_switched_indices | Shell | Search in all .f90 file recursively for occurrences of e.g. 'PartState(XXXX', where XXXX is a character string, because of the switched particle dimensions to consider how Fortran stores data column-based | | | 2019-12-18 | flip_PartState | Python | Flips the dimensions of a 'PartState' container in one or more .h5 files to consider the cahnged dimensions of particle data to consider how Fortran stores data column-based | | +| 2020-05-12 | h5_dataset_copy | Python | Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. | | | 2013-10-21 | laengsteZeile | Shell | | | | 2016-04-20 | loadbalance | Python | | | | 2013-10-21 | make_convertEfieldMesh.sh | Shell | | | @@ -33,7 +34,7 @@ This is a loose collection of tools with respect to pre- and post-processing of | 2013-10-21 | MergeDSMCVTKFiles.f90 | Fortran | | | | 2020-04-27 | merge_DSMCSurfState | Python | merges the dataset 'SurfaceData' of all given .h5 DSMCSurfState.h5 files into a single one by summing all elements | | | 2019-10-15 | merge_PartState | Python | | | -| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | +| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | | 2014-01-22 | PML | Matlab | | | | 2017-11-09 | profiling | Shell and Python | | | | 2019-07-08 | RemoveTrailWhiteSpaces.sh | Shell | | | diff --git a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py index 2858e750f..81b666076 100644 --- a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py +++ b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py @@ -238,7 +238,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for anaylze functions.')) + print(red('Could not import h5py module. This is required for analyse functions.')) exit(0) # Start the timer diff --git a/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py b/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py index 16d5a81e6..e5c14164d 100644 --- a/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py +++ b/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py @@ -328,7 +328,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for anaylze functions.')) + print(red('Could not import h5py module. This is required for handling .h5 files.')) exit(0) # Start the timer @@ -337,7 +337,7 @@ def yellow(text) : """get command line arguments""" parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') -parser.add_argument('-d', '--debug', action='store_true', help='Print additional imformation regarding the files onto screen.') +parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') # Get command line arguments args = parser.parse_args() diff --git a/tools/flip_PartState/flip_PartState.py b/tools/flip_PartState/flip_PartState.py index c3e5473d6..f30fb0024 100644 --- a/tools/flip_PartState/flip_PartState.py +++ b/tools/flip_PartState/flip_PartState.py @@ -135,7 +135,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for anaylze functions.')) + print(red('Could not import h5py module. This is required for analyse functions.')) exit(0) # Start the timer diff --git a/tools/h5_dataset_copy/h5_dataset_copy.py b/tools/h5_dataset_copy/h5_dataset_copy.py new file mode 100644 index 000000000..d0c1d5e5b --- /dev/null +++ b/tools/h5_dataset_copy/h5_dataset_copy.py @@ -0,0 +1,139 @@ +import numpy as np +from timeit import default_timer as timer +import argparse +import re +import shutil +import os + +class bcolors : + """color and font style definitions for changing output appearance""" + # Reset (user after applying a color to return to normal coloring) + ENDC ='\033[0m' + + # Regular Colors + BLACK ='\033[0;30m' + RED ='\033[0;31m' + GREEN ='\033[0;32m' + YELLOW ='\033[0;33m' + BLUE ='\033[0;34m' + PURPLE ='\033[0;35m' + CYAN ='\033[0;36m' + WHITE ='\033[0;37m' + + # Text Style + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +def red(text) : + return bcolors.RED+text+bcolors.ENDC + +def green(text) : + return bcolors.GREEN+text+bcolors.ENDC + +def blue(text) : + return bcolors.BLUE+text+bcolors.ENDC + +def yellow(text) : + return bcolors.YELLOW+text+bcolors.ENDC + +# import h5 I/O routines +try : + import h5py + h5py_module_loaded = True +except ImportError : + print(red('Could not import h5py module. This is required for handling .h5 files.')) + exit(0) + +# Start the timer +start = timer() + +"""get command line arguments""" +parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for copying a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name.', formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-s', '--source', type=str, help='Source .h5 file containing the dataset that is to be copied.') +parser.add_argument('-t', '--target', type=str, help='Target .h5 file into which the dataset is to be copied.') +parser.add_argument('-d', '--dataset', type=str, help='Name of the h5 dataset in the source .h5 file.') + +# Get command line arguments +args = parser.parse_args() + +# Display all command line arguments +print('='*132) +print("Running with the following command line options") +for arg in list(args.__dict__) : + print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") +print('='*132) +print() + +# Check arguments +if not (args.source and os.path.exists(args.source)): + parser.error('No source file given or file does not exist, add -s or --source followed by the path to the source file') +if not (args.target and os.path.exists(args.target)): + parser.error('No target file given or file does not exist, add -t or --target followed by the path to the source file') +if not (args.dataset): + parser.error('No dataset given, add -d or --dataset followed by the name of the dataset in the source file') + + + +# Open h5 file and read container info +# -------------------------------------------- +# r : Readonly, file must exist +# r+ : Read/write, file must exist +# w : Create file, truncate if exists +# w- or x : Create file, fail if exists +# a : Read/write if exists, create otherwise (default +# -------------------------------------------- +# 1. Open .h5 source file +try: + f1 = h5py.File(args.source,'r') +except Exception as e: + print(e) + print("Could not open the source file [%s]" % (args.source)) + exit(0) + +# Usage: +# ------------------- +# available keys : print("Keys: %s" % f1.keys()) # yields, e.g., +# first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' +# available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' +# get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 +# ------------------- + +# 2. Read the dataset from the hdf5 file +try : + dset1 = f1[args.dataset][:] + dtype1 = f1[args.dataset].dtype +except : + print(e) + print("Could not read dataset [%] from the source file [%s]" % (args.dataset,args.source)) + exit(0) + +print('Source file'.ljust(len(args.source))," | dataset(shape) data type") +print(132*'-') +#print("".ljust(-len(args.source)),args.source," | %s%s %s" % (args.dataset, str(dset1.shape),dtype1)) +print(args.source.ljust(len(args.source))," | %s%s %s" % (args.dataset, str(dset1.shape),dtype1)) + + + + +# 3. Open .h5 target file +try: + f2 = h5py.File(args.target,'r+') +except Exception as e: + print(e) + print("Could not open the target file [%s]" % (args.target)) + exit(0) + +# 0. remove dataset container in target file (if it exists) +try: + del f2[args.dataset] +except Exception as e: + #print(e) + #print("Dataset does not exist in target file (%s). Copying." % e) + pass + + +f2.create_dataset(args.dataset, data=dset1) + +f1.close() +f2.close() +print("Done.") diff --git a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py b/tools/merge_DSMCSurfState/merge_DSMCSurfState.py index 822942682..0433f4c66 100644 --- a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py +++ b/tools/merge_DSMCSurfState/merge_DSMCSurfState.py @@ -40,7 +40,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for anaylze functions.')) + print(red('Could not import h5py module. This is required for analyse functions.')) exit(0) # Start the timer diff --git a/tools/merge_PartState/merge_PartState.py b/tools/merge_PartState/merge_PartState.py index 61a971bdd..525ed04ae 100644 --- a/tools/merge_PartState/merge_PartState.py +++ b/tools/merge_PartState/merge_PartState.py @@ -40,7 +40,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for anaylze functions.')) + print(red('Could not import h5py module. This is required for analyse functions.')) exit(0) # Start the timer diff --git a/tools/visuBox_PartState/visuBox_PartState.py b/tools/visuBox_PartState/visuBox_PartState.py index 453eaff6f..c7a170e45 100644 --- a/tools/visuBox_PartState/visuBox_PartState.py +++ b/tools/visuBox_PartState/visuBox_PartState.py @@ -9,8 +9,8 @@ import h5py h5py_module_loaded = True except ImportError : - #raise ImportError('Could not import h5py module. This is required for anaylze functions.') - print(tools.red('Could not import h5py module. This is required for anaylze functions.')) + #raise ImportError('Could not import h5py module. This is required for analyse functions.') + print(tools.red('Could not import h5py module. This is required for analyse functions.')) exit(0) From ac76b7753b51c4026367366605825873983302d7 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 15 May 2020 16:21:31 +0200 Subject: [PATCH 20/74] Fixed compilation with fixed polynomial degree --- src/h5piclas2vtk.f90 | 6 +- src/interfaces/interfaces.f90 | 2 +- src/interpolation/eval_xyz.f90 | 2 +- src/interpolation/interpolation.f90 | 5 +- src/io_hdf5/hdf5_output.f90 | 100 +++++++++--------- src/io_hdf5/hdf5_output_tools.f90 | 54 +++++----- src/mesh/mesh.f90 | 2 +- src/particles/analyze/particle_analyze.f90 | 26 ++--- src/particles/bgk/bgk_init.f90 | 2 +- src/particles/dsmc/dsmc_analyze.f90 | 11 +- src/particles/dsmc/dsmc_init.f90 | 2 +- src/particles/dsmc/dsmc_particle_pairing.f90 | 9 +- src/particles/dsmc/dsmc_symmetry2d.f90 | 4 +- src/particles/fp_flow/fpflow_init.f90 | 2 +- src/particles/particle_mesh/particle_mesh.f90 | 12 +-- src/particles/pic/deposition/pic_depo.f90 | 2 +- .../pic/deposition/pic_depo_method.f90 | 22 ++-- .../pic_depo_shapefunction_tools.f90 | 4 +- .../pic/deposition/pic_depo_tools.f90 | 5 +- .../pic/interpolation/init_BGField.f90 | 2 +- .../pic/interpolation/pic_interpolation.f90 | 6 +- src/particles/ttm/ttm_init.f90 | 6 +- src/posti/superB/superB_main.f90 | 2 +- src/posti/superB/superB_permMag.f90 | 18 ++-- src/posti/visu/readstate.f90 | 4 +- src/posti/visu/visu.f90 | 4 +- src/qds/equation/QDS_equation.f90 | 2 +- 27 files changed, 156 insertions(+), 160 deletions(-) diff --git a/src/h5piclas2vtk.f90 b/src/h5piclas2vtk.f90 index 25852cc10..7636ac627 100644 --- a/src/h5piclas2vtk.f90 +++ b/src/h5piclas2vtk.f90 @@ -55,7 +55,7 @@ PROGRAM H5PICLAS2VTK USE MOD_Analyze ,ONLY: CalcErrorStateFiles, CalcErrorStateFileSigma USE MOD_Interpolation_Vars ,ONLY: NAnalyze USE MOD_Mesh_Vars ,ONLY: sJ,NGeoRef -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Metrics ,ONLY: CalcMetricsErrorDiff IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- @@ -428,7 +428,7 @@ PROGRAM H5PICLAS2VTK U_first = U N_State_first = N_State - PP_N=N_State + !PP_N=N_State NGeoRef=3*NGeo ! build jacobian at higher degree ALLOCATE(sJ ( 0:N_State,0:N_State,0:N_State,nElems)) CALL CalcMetricsErrorDiff() @@ -746,7 +746,7 @@ SUBROUTINE InitMesh_Connected() ! MODULES USE MOD_Globals USE MOD_Mesh_Vars -USE MOD_PreProc +USE MOD_Preproc USE MOD_Prepare_Mesh ,ONLY: setLocalSideIDs,fillMeshInfo #if USE_MPI USE MOD_Prepare_Mesh ,ONLY: exchangeFlip diff --git a/src/interfaces/interfaces.f90 b/src/interfaces/interfaces.f90 index 0ee78218a..a83ed9c64 100644 --- a/src/interfaces/interfaces.f90 +++ b/src/interfaces/interfaces.f90 @@ -633,7 +633,7 @@ SUBROUTINE Flux_Mortar_SideInfo(isFace_Master,isFace_Slave,doMPISides) !> array) !=================================================================================================================================== ! MODULES -USE MOD_Preproc, ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars, ONLY: MortarType,MortarInfo,nSides USE MOD_Mesh_Vars, ONLY: firstMortarInnerSide,lastMortarInnerSide USE MOD_Mesh_Vars, ONLY: firstMortarMPISide,lastMortarMPISide diff --git a/src/interpolation/eval_xyz.f90 b/src/interpolation/eval_xyz.f90 index fde4ecf91..ba4b4261c 100644 --- a/src/interpolation/eval_xyz.f90 +++ b/src/interpolation/eval_xyz.f90 @@ -793,7 +793,7 @@ SUBROUTINE GetRefNewtonStartValue(X_in,Xi,ElemID) !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc, ONLY:PP_N,PP_nElems +USE MOD_Preproc USE MOD_Particle_Mesh_Vars, ONLY:RefMappingGuess,RefMappingEps USE MOD_Particle_Mesh_Vars, ONLY:XiEtaZetaBasis,slenXiEtaZetaBasis USE MOD_Mesh_Vars, ONLY:Elem_xGP,XCL_NGeo diff --git a/src/interpolation/interpolation.f90 b/src/interpolation/interpolation.f90 index 2c2f59a3a..eb50ba773 100644 --- a/src/interpolation/interpolation.f90 +++ b/src/interpolation/interpolation.f90 @@ -115,7 +115,7 @@ SUBROUTINE InitInterpolation(NIn) USE MOD_Globals USE MOD_PreProc USE MOD_Interpolation_Vars -USE MOD_ReadInTools ,ONLY: GETINT +USE MOD_ReadInTools ,ONLY: GETINT,CountOption ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------- @@ -126,6 +126,7 @@ SUBROUTINE InitInterpolation(NIn) !---------------------------------------------------------------------------------------------------------------------------- !local variables CHARACTER(LEN=40) :: DefStr +INTEGER :: Ntmp !============================================================================================================================ IF (InterpolationInitIsDone) THEN CALL CollectiveStop(__STAMP__,& @@ -150,7 +151,7 @@ SUBROUTINE InitInterpolation(NIn) END IF IF(PP_N.NE.Ntmp) THEN CALL CollectiveStop(__STAMP__,& - 'N in ini-file is different from hard-compiled N in Flexi. Ini/Compiled:',Ntmp,REAL(PP_N)) + 'N in ini-file is different from hard-compiled N in PICLas. Ini/Compiled:',Ntmp,REAL(PP_N)) END IF #endif diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index 1b624557a..883f2db8e 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -199,7 +199,7 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) ! Associate construct for integer KIND=8 possibility PP_nVarTmp = INT(PP_nVar,IK) ASSOCIATE (& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) ) @@ -208,7 +208,7 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) !nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) ! Store the Solution of the Maxwell-Poisson System #ifdef PP_POIS - ALLOCATE(Utemp(1:PP_nVar,0:PP_N,0:PP_N,0:PP_N,PP_nElems)) + ALLOCATE(Utemp(1:PP_nVar,0:N,0:N,0:N,PP_nElems)) #if (PP_nVar==8) Utemp(8,:,:,:,:)=Phi(1,:,:,:,:) Utemp(1:3,:,:,:,:)=E(1:3,:,:,:,:) @@ -216,25 +216,25 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=Utemp) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_SolutionE', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=U) - !CALL WriteArrayToHDF5('DG_SolutionPhi',nVal,5,(/4_IK,PP_N+1,PP_N+1,PP_N+1,PP_nElems/) & + !CALL WriteArrayToHDF5('DG_SolutionPhi',nVal,5,(/4_IK,N+1,N+1,N+1,PP_nElems/) & !,offsetElem,5,existing=.FALSE.,RealArray=Phi) ! missing addiontal attributes and data preparation CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_SolutionPhi', rank=5,& - nValGlobal=(/4_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/4_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/4_IK , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/4_IK , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=Phi) #endif /*(PP_nVar==8)*/ @@ -245,22 +245,22 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=Utemp) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_SolutionE', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=U) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_SolutionPhi', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=Phi) #endif /*(PP_nVar==4)*/ @@ -274,8 +274,8 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) collective=.TRUE., RealArray=lambda(:,:,1:nUniqueSides)) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_SolutionU', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE., RealArray=U) #if (PP_nVar==1) @@ -283,19 +283,19 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) Utemp(2:4,:,:,:,:)=E(1:3,:,:,:,:) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/4_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/4_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/4_IK , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/4_IK , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE., RealArray=Utemp) #elif (PP_nVar==3) Utemp(1:3,:,:,:,:)=B(1:3,:,:,:,:) - !CALL WriteArrayToHDF5('DG_Solution',nVal,5,(/PP_nVar,PP_N+1,PP_N+1,PP_N+1,PP_nElems/) & + !CALL WriteArrayToHDF5('DG_Solution',nVal,5,(/PP_nVar,N+1,N+1,N+1,PP_nElems/) & !,offsetElem,5,existing=.TRUE.,RealArray=Utemp) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/3_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/3_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/3_IK , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/3_IK , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE., RealArray=Utemp) #else /*(PP_nVar==4)*/ @@ -305,16 +305,16 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/7_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/7_IK , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/7_IK , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/7_IK , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE., RealArray=Utemp) #endif /*(PP_nVar==1)*/ #else CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& - nValGlobal=(/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/PP_nVarTmp , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/PP_nVarTmp , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=U) #endif /*PP_POIS*/ @@ -341,8 +341,8 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) END IF CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName='DG_Source', rank=5, & - nValGlobal=(/nVar , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal= (/nVar , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal=(/nVar , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal= (/nVar , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.TRUE.,RealArray=PartSource) @@ -747,21 +747,21 @@ SUBROUTINE WritePMLDataToHDF5(FileName) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& nGlobalElems => INT(nGlobalElems,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& PMLnVar => INT(PMLnVar,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName,create=.FALSE.,& DataSetName = 'PML_Solution', rank = 5,& - nValGlobal = (/PMLnVar , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal = (/PMLnVar , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & + nValGlobal = (/PMLnVar , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal = (/PMLnVar , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & offset = (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective = .TRUE.,RealArray = Upml) END ASSOCIATE ! CALL WriteArrayToHDF5(DataSetName='PML_Solution', rank=5,& -! nValGlobal=(/5,PP_N+1,PP_N+1,PP_N+1,nGlobalElems/),& -! nVal= (/5,PP_N+1,PP_N+1,PP_N+1,PP_nElems/),& +! nValGlobal=(/5,N+1,N+1,N+1,nGlobalElems/),& +! nVal= (/5,N+1,N+1,N+1,PP_nElems/),& ! offset= (/0, 0, 0, 0, offsetElem/),& ! collective=.TRUE., existing=.FALSE., RealArray=UPML) ! @@ -2567,13 +2567,13 @@ SUBROUTINE WriteTimeAverage(MeshFileName,OutputTime,PreviousTime,VarNamesAvg,Var nGlobalElems => INT(nGlobalElems,IK) ,& nElems => INT(nElems,IK) ,& nVar_Avg => INT(nVar_Avg,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName , create = .FALSE. , & - DataSetName = 'DG_Solution' , rank = 5 , & - nValGlobal = (/nVar_Avg , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal = (/nVar_Avg , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nElems/) , & - offset = (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & + DataSetName = 'DG_Solution' , rank = 5 , & + nValGlobal = (/nVar_Avg , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal = (/nVar_Avg , N+1_IK , N+1_IK , N+1_IK , nElems/) , & + offset = (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective = .TRUE. , RealArray = UAvg) END ASSOCIATE END IF @@ -2597,13 +2597,13 @@ SUBROUTINE WriteTimeAverage(MeshFileName,OutputTime,PreviousTime,VarNamesAvg,Var nGlobalElems => INT(nGlobalElems,IK) ,& nElems => INT(nElems,IK) ,& nVar_Fluc => INT(nVar_Fluc,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName , create = .FALSE. , & - DataSetName = 'DG_Solution' , rank = 5 , & - nValGlobal = (/nVar_Fluc , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal = (/nVar_Fluc , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nElems/) , & - offset = (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & + DataSetName = 'DG_Solution' , rank = 5 , & + nValGlobal = (/nVar_Fluc , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal = (/nVar_Fluc , N+1_IK , N+1_IK , N+1_IK , nElems/) , & + offset = (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective = .TRUE. , RealArray = UFluc) END ASSOCIATE END IF @@ -2668,7 +2668,7 @@ SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputT CALL H5SCLOSE_F(FileSpace, iError) ! Write dataset properties "Time","MeshFile","NextFile","NodeType","VarNames" -CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=N) +CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=PP_N) CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=OutputTime) CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFileName)/)) IF(PRESENT(FutureTime))THEN @@ -3340,7 +3340,7 @@ SUBROUTINE WriteNodeSourceExtToHDF5(OutputTime) NodeSourceExt = NodeSourceExt + NodeSourceExtTmp NodeSourceExtTmp = 0. -! Loop over all elements and store charge density values in equidistantly distributed nodes of N=1 +! Loop over all elements and store charge density values in equidistantly distributed nodes of PP_N=1 DO iElem=1,PP_nElems ASSOCIATE( NodeID => GEO%ElemToNodeID(:,iElem) ) ! Copy values to equidistant distribution @@ -3390,13 +3390,13 @@ SUBROUTINE WriteNodeSourceExtToHDF5(OutputTime) nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& N_variables => INT(N_variables,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName,create=.FALSE.,& - DataSetName=TRIM(DataSetName) , rank=5 , & - nValGlobal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems /) , & - offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & + DataSetName=TRIM(DataSetName) , rank=5 , & + nValGlobal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , PP_nElems /) , & + offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & collective =.TRUE. , RealArray=NodeSourceExtGlobal) END ASSOCIATE END DO ! i = 1, 2 diff --git a/src/io_hdf5/hdf5_output_tools.f90 b/src/io_hdf5/hdf5_output_tools.f90 index c2190faac..2d4781bb6 100644 --- a/src/io_hdf5/hdf5_output_tools.f90 +++ b/src/io_hdf5/hdf5_output_tools.f90 @@ -111,13 +111,13 @@ SUBROUTINE WriteDielectricGlobalToHDF5() nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& N_variables => INT(N_variables,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName,create=.FALSE.,& - DataSetName='DG_Solution' , rank=5 , & - nValGlobal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems /) , & - offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & + DataSetName='DG_Solution' , rank=5 , & + nValGlobal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , PP_nElems /) , & + offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & collective =.TRUE. , RealArray=DielectricGlobal) END ASSOCIATE #if USE_MPI @@ -203,13 +203,13 @@ SUBROUTINE WritePMLzetaGlobalToHDF5() nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& N_variables => INT(N_variables,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName,create=.FALSE.,& - DataSetName='DG_Solution' , rank=5 , & - nValGlobal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal =(/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems /) , & - offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & + DataSetName='DG_Solution' , rank=5 , & + nValGlobal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal =(/N_variables , N+1_IK , N+1_IK , N+1_IK , PP_nElems /) , & + offset =(/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & collective =.TRUE. , RealArray=PMLzetaGlobal) END ASSOCIATE #if USE_MPI @@ -313,13 +313,13 @@ SUBROUTINE WriteQDSToHDF5(OutputTime,PreviousTime) nGlobalElems => INT(nGlobalElems,IK) ,& nQDSElems => INT(nQDSElems,IK) ,& N_variables => INT(N_variables,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& offsetElem => INT(offsetElem,IK) ) CALL GatheredWriteArray(FileName,create=.FALSE.,& - DataSetName = 'DG_Solution' , rank = 5 , & - nValGlobal = (/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal = (/N_variables , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nQDSElems /) , & - offset = (/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & + DataSetName = 'DG_Solution' , rank = 5 , & + nValGlobal = (/N_variables , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal = (/N_variables , N+1_IK , N+1_IK , N+1_IK , nQDSElems /) , & + offset = (/ 0_IK , 0_IK , 0_IK , 0_IK , offsetElem /) , & collective = .TRUE. , RealArray = Utemp) END ASSOCIATE #if USE_MPI @@ -491,15 +491,15 @@ SUBROUTINE WriteBGFieldToHDF5() ! Associate construct for integer KIND=8 possibility ASSOCIATE (& BGDataSize => INT(BGDataSize,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) ,& nGlobalElems => INT(nGlobalElems,IK) ) -CALL WriteArrayToHDF5(DataSetName='BGField', rank=5,& - nValGlobal=(/BGDataSize,PP_N+1_IK,PP_N+1_IK,PP_N+1_IK,nGlobalElems/),& - nVal =(/BGDataSize,PP_N+1_IK,PP_N+1_IK,PP_N+1_IK,PP_nElems/),& - offset =(/0_IK, 0_IK, 0_IK, 0_IK,offsetElem/),& - collective=.false., RealArray=BGField(1:BGDataSize,0:PP_N,0:PP_N,0:PP_N,1:nElems)) +CALL WriteArrayToHDF5(DataSetName='BGField' , rank=5 , & + nValGlobal=(/BGDataSize , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal =(/BGDataSize , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & + offset =(/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & + collective=.false., RealArray=BGField(1:BGDataSize,0:N,0:N,0:N,1:nElems)) END ASSOCIATE CALL CloseDataFile() @@ -569,7 +569,7 @@ SUBROUTINE WriteBGFieldAnalyticToHDF5() ! Write file header CALL WriteHDF5Header('BField',File_ID) ! File_Type='BField' ! Write dataset properties "Time","MeshFile","NextFile","NodeType","VarNames" - CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=N) + CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=PP_N) CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeType/)) CALL WriteAttributeToHDF5(File_ID,'VarNames',BGDataSize,StrArray=StrVarNames) @@ -587,14 +587,14 @@ SUBROUTINE WriteBGFieldAnalyticToHDF5() ! Associate construct for integer KIND=8 possibility ASSOCIATE (& BGDataSize => INT(BGDataSize,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) ,& nGlobalElems => INT(nGlobalElems,IK) ) -CALL WriteArrayToHDF5(DataSetName='BField', rank=5,& - nValGlobal=(/BGDataSize , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , nGlobalElems/) , & - nVal =(/BGDataSize , PP_N+1_IK , PP_N+1_IK , PP_N+1_IK , PP_nElems/) , & - offset =(/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & +CALL WriteArrayToHDF5(DataSetName='BField' , rank=5 , & + nValGlobal=(/BGDataSize , N+1_IK , N+1_IK , N+1_IK , nGlobalElems/) , & + nVal =(/BGDataSize , N+1_IK , N+1_IK , N+1_IK , PP_nElems/) , & + offset =(/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & collective=.false., RealArray=outputArray) END ASSOCIATE diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 181d4936f..d37847c04 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -550,7 +550,7 @@ SUBROUTINE SwapMesh() ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY:ProjectName -USE MOD_PreProc, ONLY:PP_N +USE MOD_Preproc USE MOD_Mesh_Vars, ONLY:SwapMeshExePath,SwapMeshLevel,MeshFile USE MOD_Restart_Vars, ONLY:RestartFile ! IMPLICIT VARIABLE HANDLING diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index b9b853a52..ec9c8aaf1 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -1571,7 +1571,7 @@ SUBROUTINE CalcShapeEfficiencyR() USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_PICDepo_Vars USE MOD_Particle_Vars -USE MOD_PreProc +USE MOD_Preproc #if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif @@ -3338,7 +3338,7 @@ SUBROUTINE CalculateElectronIonDensityCell() USE MOD_Particle_Mesh_Vars ,ONLY:GEO,NbrOfRegions USE MOD_Particle_Analyze_Vars ,ONLY:ElectronDensityCell,IonDensityCell,NeutralDensityCell,ChargeNumberCell USE MOD_Particle_Vars ,ONLY:Species,PartSpecies,PDM,PEM,usevMPF -USE MOD_Preproc ,ONLY:PP_nElems +USE MOD_Preproc USE MOD_PIC_Analyze ,ONLY:CalculateBRElectronsPerCell USE MOD_DSMC_Vars ,ONLY: RadialWeighting USE MOD_part_tools ,ONLY: GetParticleWeight @@ -3418,7 +3418,7 @@ SUBROUTINE CalculateElectronTemperatureCell() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals_Vars ,ONLY: BoltzmannConst,ElectronMass,ElementaryCharge USE MOD_Particle_Mesh_Vars ,ONLY: GEO,NbrOfRegions -USE MOD_Preproc ,ONLY: PP_nElems +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY: ElectronTemperatureCell USE MOD_Particle_Vars ,ONLY: PDM,PEM,usevMPF,Species,PartSpecies,PartState,RegionElectronRef USE MOD_DSMC_Vars ,ONLY: RadialWeighting @@ -3519,7 +3519,7 @@ SUBROUTINE CalculatePlasmaFrequencyCell() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY:PP_nElems +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY:ElectronDensityCell,PlasmaFrequencyCell USE MOD_Globals_Vars ,ONLY:ElementaryCharge,ElectronMass USE MOD_Equation_Vars ,ONLY:Eps0 @@ -3550,7 +3550,7 @@ SUBROUTINE CalculatePICTimeStepCell() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY:PP_nElems +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY:PlasmaFrequencyCell,PICTimeStepCell !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING @@ -3582,7 +3582,7 @@ SUBROUTINE CalculateDebyeLengthCell() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY:PP_nElems +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY:ElectronDensityCell,ElectronTemperatureCell,DebyeLengthCell,QuasiNeutralityCell USE MOD_Globals_Vars ,ONLY:ElementaryCharge, BoltzmannConst USE MOD_Equation_Vars ,ONLY:Eps0 @@ -3620,7 +3620,7 @@ SUBROUTINE CalculatePPDCell() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY: PP_nElems,PP_N +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY: DebyeLengthCell,PPDCell,PPDCellX,PPDCellY,PPDCellZ USE MOD_Particle_Mesh_Vars ,ONLY: GEO !----------------------------------------------------------------------------------------------------------------------------------! @@ -3655,7 +3655,7 @@ SUBROUTINE CalculatePICCFL() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY: PP_nElems,PP_N +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY: ElectronTemperatureCell,PICCFLCell,PICCFLCellX,PICCFLCellY,PICCFLCellZ USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_TimeDisc_Vars ,ONLY: dt @@ -3693,7 +3693,7 @@ SUBROUTINE CalculateMaxPartDisplacement() !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY: PP_nElems,PP_N +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY: MaxPartDisplacementCell USE MOD_Particle_Analyze_Vars ,ONLY: MaxPartDisplacementCellX,MaxPartDisplacementCellY,MaxPartDisplacementCellZ USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -3759,7 +3759,7 @@ SUBROUTINE CalculateIonizationCell() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Particle_Analyze_Vars ,ONLY:IonizationCell,QuasiNeutralityCell,NeutralDensityCell,ElectronDensityCell,IonDensityCell USE MOD_Particle_Analyze_Vars ,ONLY:ChargeNumberCell -USE MOD_Preproc ,ONLY:PP_nElems +USE MOD_Preproc USE MOD_Particle_Mesh_Vars ,ONLY:GEO !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING @@ -3823,7 +3823,7 @@ SUBROUTINE CalculatePlasmaParameter() ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals_Vars ,ONLY: PI -USE MOD_Preproc ,ONLY: PP_nElems +USE MOD_Preproc USE MOD_Particle_Analyze_Vars ,ONLY: DebyeLengthCell,ElectronDensityCell,PlasmaParameterCell !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING @@ -3908,7 +3908,7 @@ SUBROUTINE CalcAnalyticalParticleState(t,PartStateAnalytic,alpha_out,theta_out) ! MODULES USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI -USE MOD_PreProc +USE MOD_Preproc USE MOD_PICInterpolation_Vars ,ONLY: AnalyticInterpolationType,AnalyticInterpolationSubType,AnalyticInterpolationP USE MOD_PICInterpolation_Vars ,ONLY: AnalyticInterpolationPhase USE MOD_TimeDisc_Vars ,ONLY: TEnd @@ -4133,7 +4133,7 @@ END SUBROUTINE CalcErrorParticle SUBROUTINE AnalyticParticleMovement(time,iter) ! MODULES USE MOD_Globals -USE MOD_PreProc +USE MOD_Preproc USE MOD_Analyze_Vars ,ONLY: OutputErrorNorms USE MOD_Particle_Analyze_Vars ,ONLY: TrackParticlePosition USE MOD_PICInterpolation_Vars ,ONLY: L_2_Error_Part diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 3fa162047..97ca89d0f 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -96,7 +96,7 @@ SUBROUTINE InitBGK() USE MOD_Globals USE MOD_ReadInTools USE MOD_BGK_Vars -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nElems, NGeo USE MOD_Particle_Vars ,ONLY: nSpecies, Species, VarTimeStep USE MOD_DSMC_Vars ,ONLY: SpecDSMC, DSMC, RadialWeighting diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index a4364b7d3..81cc6674c 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -84,7 +84,7 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_PreProc +USE MOD_Preproc USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header USE MOD_PARTICLE_Vars ,ONLY: nSpecies @@ -897,7 +897,7 @@ SUBROUTINE InitHODSMC() USE MOD_Globals USE MOD_ReadInTools USE MOD_Particle_Mesh_Vars ,ONLY: GEO -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_ChangeBasis ,ONLY: ChangeBasis3D USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights, LegGaussLobNodesAndWeights USE MOD_Basis ,ONLY: BarycentricWeights,InitializeVandermonde @@ -1548,7 +1548,7 @@ SUBROUTINE DSMCHO_output_calc(nVar,nVar_quality,nVarloc,DSMC_MacroVal) !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars ,ONLY: HODSMC, DSMC_HOSolution, DSMC_VolumeSample, CollisMode, SpecDSMC, DSMC, useDSMC, RadialWeighting -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Globals_Vars ,ONLY: BoltzmannConst @@ -2049,7 +2049,7 @@ SUBROUTINE WriteDSMCHOToHDF5(MeshFileName,OutputTime, FutureTime) !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars ,ONLY: HODSMC, DSMC, RadialWeighting, CollisMode -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, nElems @@ -2267,10 +2267,9 @@ SUBROUTINE GenerateDSMCHOFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,O !> Subroutine that generates the output file on a single processor and writes all the necessary attributes (better MPI performance) !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Globals_Vars ,ONLY: ProjectName -!USE MOD_PreProcFlags USE MOD_io_HDF5 USE MOD_DSMC_Vars ,ONLY: HODSMC USE MOD_HDF5_Output ,ONLY: WriteAttributeToHDF5, WriteHDF5Header diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index db15120a1..1d2b841b5 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -375,7 +375,7 @@ SUBROUTINE InitDSMC() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nElems, NGEo, SideToElem USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst, ElementaryCharge USE MOD_ReadInTools diff --git a/src/particles/dsmc/dsmc_particle_pairing.f90 b/src/particles/dsmc/dsmc_particle_pairing.f90 index 0ad6eeeb4..c7371ddab 100644 --- a/src/particles/dsmc/dsmc_particle_pairing.f90 +++ b/src/particles/dsmc/dsmc_particle_pairing.f90 @@ -912,9 +912,8 @@ SUBROUTINE DSMC_CalcSubNodeVolumes2D(iElem, NodeDepth, Node) ! MODULES USE MOD_DSMC_Vars, ONLY : OctreeVdm, tNodeVolume, SymmetrySide USE MOD_Mesh_Vars, ONLY : SurfElem, Face_xGP -USE MOD_PreProc, ONLY : PP_N +USE MOD_Preproc USE MOD_ChangeBasis, ONLY : ChangeBasis2D -USE MOD_PreProc, ONLY : PP_N ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -964,9 +963,8 @@ SUBROUTINE DSMC_CalcSubNodeVolumes(iElem, NodeDepth, Node) ! MODULES USE MOD_DSMC_Vars, ONLY : OctreeVdm, tNodeVolume USE MOD_Mesh_Vars, ONLY : sJ - USE MOD_PreProc, ONLY : PP_N + USE MOD_Preproc USE MOD_ChangeBasis, ONLY : ChangeBasis3D - USE MOD_PreProc, ONLY : PP_N ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1005,10 +1003,9 @@ RECURSIVE SUBROUTINE InitVanderOct(LocalVdm, NodeDepth, LocalDepth, OctreeVdmLoc !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars, ONLY : tOctreeVdm - USE MOD_PreProc, ONLY : PP_N + USE MOD_Preproc USE MOD_Interpolation_Vars, ONLY : xGP, wBary USE MOD_Basis, ONLY : InitializeVandermonde - USE MOD_PreProc, ONLY : PP_N ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/particles/dsmc/dsmc_symmetry2d.f90 b/src/particles/dsmc/dsmc_symmetry2d.f90 index c9ad193df..75e8151a5 100644 --- a/src/particles/dsmc/dsmc_symmetry2d.f90 +++ b/src/particles/dsmc/dsmc_symmetry2d.f90 @@ -74,7 +74,7 @@ SUBROUTINE DSMC_2D_InitVolumes() ! MODULES USE MOD_Globals USE MOD_Globals_Vars ,ONLY: Pi -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nElems, nBCSides, BC, SideToElem, SurfElem USE MOD_Interpolation_Vars ,ONLY: wGP USE MOD_Particle_Vars ,ONLY: Symmetry2DAxisymmetric @@ -706,4 +706,4 @@ SUBROUTINE DSMC_2D_TreatIdenticalParticles(iPair, nPair, nPart, iElem, iPartIndx END SUBROUTINE DSMC_2D_TreatIdenticalParticles -END MODULE MOD_DSMC_Symmetry2D \ No newline at end of file +END MODULE MOD_DSMC_Symmetry2D diff --git a/src/particles/fp_flow/fpflow_init.f90 b/src/particles/fp_flow/fpflow_init.f90 index 6a43fc391..05099d1b0 100644 --- a/src/particles/fp_flow/fpflow_init.f90 +++ b/src/particles/fp_flow/fpflow_init.f90 @@ -75,7 +75,7 @@ SUBROUTINE InitFPFlow() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: NGeo, nElems USE MOD_Globals_Vars ,ONLY: PI, BoltzmannConst USE MOD_ReadInTools diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 67cd97600..77d99a6ad 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -433,7 +433,7 @@ SUBROUTINE InitParticleGeometry() ! Subroutine for particle geometry initialization (GEO container) !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_ReadInTools USE MOD_Globals USE MOD_Mesh_Vars ,ONLY: nElems, nNodes @@ -1613,7 +1613,7 @@ SUBROUTINE GetFIBGM(ElemToBGM) ! mode 2: rebuild BGM including HALO region !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Partilce_Periodic_BC ,ONLY: InitPeriodicBC USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -2353,7 +2353,7 @@ SUBROUTINE AddHALOCellsToFIBGM(ElemToBGM,HaloElemToBGM) ! remap all elements including halo-elements into FIBGM !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals ! , ONLY : UNIT_StdOut USE MOD_ChangeBasis ,ONLY: ChangeBasis2D USE MOD_Particle_Mesh_Vars ,ONLY: GEO,nTotalElems @@ -2649,7 +2649,7 @@ SUBROUTINE WeirdElementCheck() ! tl;dr: Hard/maybe impossible to fix, hence only a warning is given so the user can decide !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Mesh_Vars ,ONLY: GEO, WeirdElems @@ -6487,7 +6487,7 @@ SUBROUTINE MarkAuxBCElems() ! -- plane: use plane equation f=a1*x+a2*y+a3*z+a4=0 and insert corresponding intervals of box -> fmin and fmax !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Particle_Mesh_Vars ,ONLY: ElemHasAuxBCs,GEO USE MOD_Particle_Boundary_Vars ,ONLY: nAuxBCs,AuxBCType,AuxBCMap,AuxBC_plane,AuxBC_cylinder,AuxBC_cone @@ -6751,7 +6751,7 @@ END SUBROUTINE CheckBoundsWithCartRadius SUBROUTINE SetHaloInfo() ! MODULES ! USE MOD_GLobals -USE MOD_Preproc ,ONLY: PP_nElems +USE MOD_Preproc USE MOD_Particle_Mesh_Vars ,ONLY: ElemHaloInfoProc USE MOD_Particle_MPI_Vars ,ONLY: PartHaloElemToProc,PartMPI USE MOD_Particle_Mesh_Vars ,ONLY: nTotalElems diff --git a/src/particles/pic/deposition/pic_depo.f90 b/src/particles/pic/deposition/pic_depo.f90 index ba7cb3468..ea2df74f9 100644 --- a/src/particles/pic/deposition/pic_depo.f90 +++ b/src/particles/pic/deposition/pic_depo.f90 @@ -53,7 +53,7 @@ SUBROUTINE InitializeDeposition USE MOD_Basis ,ONLY: BarycentricWeights,InitializeVandermonde USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights,LegGaussLobNodesAndWeights USE MOD_ChangeBasis ,ONLY: ChangeBasis3D -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_ReadInTools ,ONLY: GETREAL,GETINT,GETLOGICAL,GETSTR,GETREALARRAY,GETINTARRAY USE MOD_PICInterpolation_Vars ,ONLY: InterpolationType USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem diff --git a/src/particles/pic/deposition/pic_depo_method.f90 b/src/particles/pic/deposition/pic_depo_method.f90 index 99f9159dc..885cfe497 100644 --- a/src/particles/pic/deposition/pic_depo_method.f90 +++ b/src/particles/pic/deposition/pic_depo_method.f90 @@ -227,7 +227,7 @@ SUBROUTINE DepositionMethod_NGP(FirstPart,LastPart,DoInnerParts,doPartInExists,d ! Deposits the complete particle charge at the nearest Gauss point (interpolation point of the field solver) !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,PEM,usevMPF,PartPosRef,PartMPF USE MOD_PICDepo_Vars ,ONLY: PartSource,gaussborder !#if (PP_nVar==8) @@ -369,7 +369,7 @@ SUBROUTINE DepositionMethod_NBC(FirstPart,LastPart,DoInnerParts,doPartInExists,d ! Deposits the complete particle charge at the center of the cell -> cell-constant deposition !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_nElems +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species,PartSpecies,PDM,PEM,usevMPF,PartMPF !#if (PP_nVar==8) USE MOD_Particle_Vars ,ONLY: PartState @@ -488,7 +488,7 @@ SUBROUTINE DepositionMethod_CVW(FirstPart,LastPart,DoInnerParts,doPartInExists,d ! Linear charge density distribution within a cell (discontinuous across cell interfaces) !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,PEM,PartPosRef,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_PICDepo_Vars ,ONLY: PartSource,CellVolWeight_Volumes @@ -641,7 +641,7 @@ SUBROUTINE DepositionMethod_CVWM(FirstPart,LastPart,DoInnerParts,doPartInExists, ! Linear charge density distribution within a cell (continuous across cell interfaces) !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,PEM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -826,7 +826,7 @@ SUBROUTINE DepositionMethod_SF(FirstPart,LastPart,DoInnerParts,doPartInExists,do ! Smooth polynomial deposition via "shape functions" of various order in 3D !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_globals ,ONLY: abort USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,PartMPF,usevMPF USE MOD_Particle_Vars ,ONLY: PartState @@ -1096,7 +1096,7 @@ SUBROUTINE DepositionMethod_SF1D(FirstPart,LastPart,DoInnerParts,doPartInExists, ! distributed must be supplied) !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -1372,7 +1372,7 @@ SUBROUTINE DepositionMethod_SF2D(FirstPart,LastPart,DoInnerParts,doPartInExists, ! i.e., in which it is constant, must be supplied) !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -1717,7 +1717,7 @@ SUBROUTINE DepositionMethod_SFCS(FirstPart,LastPart,DoInnerParts,doPartInExists, ! spherical coordinates. !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N,PP_nElems +USE MOD_Preproc USE MOD_Globals_Vars ,ONLY: PI USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState @@ -1986,7 +1986,7 @@ SUBROUTINE DepositionMethod_DD(FirstPart,LastPart,DoInnerParts,doPartInExists,do ! 2. Bernstein polynomial function basis, which does not allow a change in sign of the charge density !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_nElems,PP_N +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,PEM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState,PartPosRef USE MOD_PICDepo_Vars ,ONLY: PartSource,DeltaType,XiNDepo,wBaryNDepo,Vdm_NDepo_GaussN,NKnots,Knots,NDepoChooseK,NDepo @@ -2117,7 +2117,7 @@ SUBROUTINE DepositionMethod_MVW(FirstPart,LastPart,DoInnerParts,doPartInExists,d ! Deposition via a Cartesian background mesh, which is then interpolated to the polynomial of each cell. !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_PICDepo_Vars ,ONLY: PartSource,bgmdeltas,BGMSource,GaussBGMFactor,GaussBGMIndex,BGMVolume @@ -2266,7 +2266,7 @@ SUBROUTINE DepositionMethod_MS(FirstPart,LastPart,DoInnerParts,doPartInExists,do ! Deposition via a Cartesian background mesh using B-splines, which is then interpolated to the polynomial of each cell. !=================================================================================================================================== ! MODULES -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: Species, PartSpecies,PDM,usevMPF,PartMPF USE MOD_Particle_Vars ,ONLY: PartState USE MOD_PICDepo_Vars ,ONLY: PartSource,BGMdeltas,GaussBGMIndex,PartSource,GPWeight,BGMSource,BGMVolume diff --git a/src/particles/pic/deposition/pic_depo_shapefunction_tools.f90 b/src/particles/pic/deposition/pic_depo_shapefunction_tools.f90 index 4133be109..722c3e283 100644 --- a/src/particles/pic/deposition/pic_depo_shapefunction_tools.f90 +++ b/src/particles/pic/deposition/pic_depo_shapefunction_tools.f90 @@ -231,7 +231,7 @@ SUBROUTINE depoChargeOnDOFs_sf(Position,SourceSize,Fac,const) USE MOD_PICDepo_Vars, ONLY:PartSource, r_sf, r2_sf, r2_sf_inv, alpha_sf, ElemDepo_xGP, PartSourceConst USE MOD_Mesh_Vars, ONLY:nElems USE MOD_Particle_Mesh_Vars, ONLY:GEO -USE MOD_PreProc, ONLY:PP_N +USE MOD_Preproc #if USE_LOADBALANCE USE MOD_LoadBalance_Vars, ONLY:nDeposPerElem #endif /*USE_LOADBALANCE*/ @@ -342,7 +342,7 @@ SUBROUTINE depoChargeOnDOFs_sf_simple(Position,SourceSize,Fac,const) USE MOD_Mesh_Vars, ONLY:ElemBaryNGeo USE MOD_PICDepo_Vars, ONLY:PartSource, r_sf, r2_sf, r2_sf_inv, alpha_sf, ElemDepo_xGP, ElemRadius2_sf, PartSourceConst USE MOD_Particle_Mesh_Vars, ONLY:ElemRadiusNGeo -USE MOD_PreProc, ONLY:PP_N, PP_nElems +USE MOD_PreProc #if USE_LOADBALANCE USE MOD_LoadBalance_Vars, ONLY:nDeposPerElem #endif /*USE_LOADBALANCE*/ diff --git a/src/particles/pic/deposition/pic_depo_tools.f90 b/src/particles/pic/deposition/pic_depo_tools.f90 index c88042542..043f25109 100644 --- a/src/particles/pic/deposition/pic_depo_tools.f90 +++ b/src/particles/pic/deposition/pic_depo_tools.f90 @@ -120,7 +120,7 @@ SUBROUTINE CalcCellLocNodeVolumes() USE MOD_Mesh_Vars ,ONLY: sJ, nElems USE MOD_Interpolation_Vars ,ONLY: wGP, xGP, wBary USE MOD_ChangeBasis ,ONLY: ChangeBasis3D -USE MOD_PreProc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Basis ,ONLY: InitializeVandermonde USE MOD_PICDepo_Vars ,ONLY: CellLocNodes_Volumes USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -267,10 +267,9 @@ SUBROUTINE ReadTimeAverage(FileName) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& nVars => INT(nVars,IK) ,& - PP_N => INT(PP_N,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& OffsetElem => INT(OffsetElem,IK) ) - CALL ReadArray('DG_Solution',5,(/nVars,PP_N+1_IK,PP_N+1_IK,PP_N+1_IK,PP_nElems/),OffsetElem,5,RealArray=U) + CALL ReadArray('DG_Solution',5,(/nVars,INT(PP_N,IK)+1_IK,INT(PP_N,IK)+1_IK,INT(PP_N,IK)+1_IK,PP_nElems/),OffsetElem,5,RealArray=U) END ASSOCIATE ELSE CALL abort(__STAMP__, & diff --git a/src/particles/pic/interpolation/init_BGField.f90 b/src/particles/pic/interpolation/init_BGField.f90 index a40b4d7c9..c54234df8 100644 --- a/src/particles/pic/interpolation/init_BGField.f90 +++ b/src/particles/pic/interpolation/init_BGField.f90 @@ -66,7 +66,7 @@ SUBROUTINE InitializeBackgroundField USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights,LegGaussLobNodesAndWeights USE MOD_Basis ,ONLY: BarycentricWeights,InitializeVandermonde USE MOD_Mesh_Vars ,ONLY: OffsetElem,nGlobalElems -USE MOD_Preproc ,ONLY: PP_nElems,PP_N +USE MOD_Preproc USE MOD_ReadInTools ,ONLY: GETSTR,GETINT,GETREAL USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,ReadAttribute,File_ID,ReadArray,GetDataProps,DatasetExists USE MOD_PICInterpolation_Vars ,ONLY: InterpolationType,CalcBField diff --git a/src/particles/pic/interpolation/pic_interpolation.f90 b/src/particles/pic/interpolation/pic_interpolation.f90 index 68b60e7ac..7e5097f03 100644 --- a/src/particles/pic/interpolation/pic_interpolation.f90 +++ b/src/particles/pic/interpolation/pic_interpolation.f90 @@ -52,7 +52,7 @@ SUBROUTINE InitializeParticleInterpolation !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_PreProc, ONLY:PP_nElems +USE MOD_Preproc USE MOD_ReadInTools USE MOD_Particle_Vars, ONLY : PDM USE MOD_PICInterpolation_Vars @@ -161,7 +161,7 @@ SUBROUTINE InterpolateFieldToParticle(DoInnerParts) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_PreProc +USE MOD_Preproc USE MOD_Particle_Vars ,ONLY: PartPosRef,PDM,PartState,PEM,PartPosGauss,DoFieldIonization USE MOD_Particle_Tracking_Vars ,ONLY: DoRefMapping USE MOD_Part_Tools ,ONLY: isInterpolateParticle @@ -679,7 +679,7 @@ SUBROUTINE InterpolateFieldToSingleParticle(PartID,FieldAtParticle) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_PreProc +USE MOD_Preproc USE MOD_Particle_Vars, ONLY:PartPosRef,PDM,PartState,PEM,PartPosGauss USE MOD_Particle_Tracking_Vars, ONLY:DoRefMapping #if !(USE_HDG) diff --git a/src/particles/ttm/ttm_init.f90 b/src/particles/ttm/ttm_init.f90 index 5818d6b6f..acb746b36 100644 --- a/src/particles/ttm/ttm_init.f90 +++ b/src/particles/ttm/ttm_init.f90 @@ -108,7 +108,7 @@ SUBROUTINE InitTTM() ! = sqrt(eps0*kB*TeTTM_in_K./( neTTM*e^2)) -> TTM_Cell_18 !=================================================================================================================================== ! MODULES -USE MOD_PreProc +USE MOD_Preproc USE MOD_Globals USE MOD_Globals_Vars USE MOD_ReadInTools @@ -768,7 +768,7 @@ SUBROUTINE InitIMD_TTM_Coupling() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals USE MOD_Globals_Vars ,ONLY: BoltzmannConst, ElementaryCharge -USE MOD_PreProc +USE MOD_Preproc USE MOD_TTM_Vars USE MOD_Particle_Vars ,ONLY: PDM,PEM,PartState,nSpecies,Species,PartSpecies,IMDSpeciesCharge,IMDSpeciesID USE MOD_Mesh_Vars ,ONLY: NGeo,XCL_NGeo,XiCL_NGeo,wBaryCL_NGeo @@ -918,7 +918,7 @@ SUBROUTINE WriteTTMdataToCSV() !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Preproc ,ONLY: PP_nElems +USE MOD_Preproc USE MOD_Globals ,ONLY: MPIRoot,FILEEXISTS,unit_stdout USE MOD_Globals ,ONLY: abort USE MOD_Mesh_Vars ,ONLY: ElemBaryNGeo diff --git a/src/posti/superB/superB_main.f90 b/src/posti/superB/superB_main.f90 index 36c963580..202a57d0c 100644 --- a/src/posti/superB/superB_main.f90 +++ b/src/posti/superB/superB_main.f90 @@ -37,7 +37,7 @@ SUBROUTINE SuperB() USE MOD_SuperB_PermMag USE MOD_SuperB_Coil USE MOD_SuperB_Vars -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_TimeDisc_Vars ,ONLY: TEnd USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Interpolation_Vars ,ONLY: BGType, BGField, BGFieldAnalytic, BGFieldVTKOutput, BGDataSize, PsiMag diff --git a/src/posti/superB/superB_permMag.f90 b/src/posti/superB/superB_permMag.f90 index 0e139347d..2e1b8b14a 100644 --- a/src/posti/superB/superB_permMag.f90 +++ b/src/posti/superB/superB_permMag.f90 @@ -58,7 +58,7 @@ SUBROUTINE CalculateCuboidMagneticPotential(iMagnet) !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars ,ONLY: PI -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nElems, Elem_xGP USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights USE MOD_Interpolation_Vars ,ONLY: BGFieldVTKOutput, PsiMag @@ -144,7 +144,7 @@ SUBROUTINE CalculateCuboidMagneticPotential(iMagnet) psiMagTemp = psiMagTemp + wGP(ii) * wGP(jj) / (4 * PI) / dist *& DOT_PRODUCT(normalUnitVector12, PermanentMagnetInfo(iMagnet)%Magnetisation) - ! Side with kk=N + ! Side with kk=PP_N ! Calculate the magnet node magnetNode(:) = PermanentMagnetInfo(iMagnet)%BasePoint(:) +& vector1(:) / 2. * (1 + xGP(ii)) +& @@ -179,7 +179,7 @@ SUBROUTINE CalculateCuboidMagneticPotential(iMagnet) psiMagTemp = psiMagTemp + wGP(ii) * wGP(kk) / (4 * PI) / dist *& DOT_PRODUCT(normalUnitVector13, PermanentMagnetInfo(iMagnet)%Magnetisation) - ! Side with jj=N + ! Side with jj=PP_N ! Calculate the magnet node magnetNode(:) = PermanentMagnetInfo(iMagnet)%BasePoint(:) +& vector1(:) / 2. * (1 + xGP(ii)) +& @@ -214,7 +214,7 @@ SUBROUTINE CalculateCuboidMagneticPotential(iMagnet) psiMagTemp = psiMagTemp + wGP(jj) * wGP(kk) / (4 * PI) / dist *& DOT_PRODUCT(normalUnitVector23, PermanentMagnetInfo(iMagnet)%Magnetisation) - ! Side with ii=N + ! Side with ii=PP_N ! Calculate the magnet node magnetNode(:) = PermanentMagnetInfo(iMagnet)%BasePoint(:) +& vector2(:) / 2. * (1 + xGP(jj)) +& @@ -275,7 +275,7 @@ SUBROUTINE CalculateSphericMagneticPotential(iMagnet) !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars ,ONLY: PI -USE MOD_Preproc ,ONLY: PP_N +USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nElems, Elem_xGP USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights USE MOD_Interpolation_Vars ,ONLY: BGFieldVTKOutput, PsiMag @@ -1009,7 +1009,7 @@ SUBROUTINE CalculateGradient() !=================================================================================================================================== ! Compute the polynomial derivative Matrix -CALL PolynomialDerivativeMatrix(N,xGP,D) +CALL PolynomialDerivativeMatrix(PP_N,xGP,D) DO iElem=1,PP_nElems ! Compute the gradient in the reference system @@ -1028,9 +1028,9 @@ SUBROUTINE CalculateGradient() END DO !k END DO !l ! Transform the gradients from the reference system to the xyz-System. Only exact for cartesian mesh! - DO k=0,N - DO j=0,N - DO i=0,N + DO k=0,PP_N + DO j=0,PP_N + DO i=0,PP_N HField(1,i,j,k,iElem) = -1 * sJ(i,j,k,iElem) * (& Metrics_fTilde(1,i,j,k,iElem) * gradPsi_xi(i,j,k) +& Metrics_gTilde(1,i,j,k,iElem) * gradPsi_eta(i,j,k) +& diff --git a/src/posti/visu/readstate.f90 b/src/posti/visu/readstate.f90 index 14d45540f..a89a90c1b 100644 --- a/src/posti/visu/readstate.f90 +++ b/src/posti/visu/readstate.f90 @@ -146,11 +146,11 @@ SUBROUTINE ReadStateWithoutGradients(mpi_comm_IN,prmfile,statefile) CALL OpenDataFile(statefile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=mpi_comm_IN) ASSOCIATE (& nVar_State => INT(nVar_State,IK) ,& - PP_N => INT(PP_N,IK) ,& + N => INT(PP_N,IK) ,& nElems => INT(nElems,IK) ,& offsetElem => INT(offsetElem,IK) & ) - CALL ReadArray('DG_Solution',5,(/nVar_State,PP_N+1_IK,PP_N+1_IK,PP_N+1_IK,nElems/),offsetElem,5,RealArray=U) + CALL ReadArray('DG_Solution',5,(/nVar_State,N+1_IK,N+1_IK,N+1_IK,nElems/),offsetElem,5,RealArray=U) END ASSOCIATE CALL CloseDataFile() diff --git a/src/posti/visu/visu.f90 b/src/posti/visu/visu.f90 index 944dd4fab..29c0e9f48 100644 --- a/src/posti/visu/visu.f90 +++ b/src/posti/visu/visu.f90 @@ -217,7 +217,7 @@ SUBROUTINE visu_InitFile(mpi_comm_IN,statefile,postifile) CHARACTER(LEN=255),INTENT(INOUT) :: postifile !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL -INTEGER :: nElems_State +INTEGER :: nElems_State,N_HDF5 CHARACTER(LEN=255) :: NodeType_State, cwd !=================================================================================================================================== IF (STRICMP(fileType,'Mesh')) THEN @@ -260,7 +260,7 @@ SUBROUTINE visu_InitFile(mpi_comm_IN,statefile,postifile) ! if Mesh or State changed readin some more attributes/parameters IF (changedStateFile.OR.changedMeshFile) THEN - CALL GetDataProps('DG_Solution',nVar_State,PP_N,nElems_State,NodeType_State) + CALL GetDataProps('DG_Solution',nVar_State,N_HDF5,nElems_State,NodeType_State) IF (.NOT.STRICMP(NodeType_State, NodeType)) THEN CALL CollectiveStop(__STAMP__, & "NodeType of state does not match with NodeType the visu-posti is compiled with!") diff --git a/src/qds/equation/QDS_equation.f90 b/src/qds/equation/QDS_equation.f90 index bd731e456..3eb354ae6 100644 --- a/src/qds/equation/QDS_equation.f90 +++ b/src/qds/equation/QDS_equation.f90 @@ -53,7 +53,7 @@ SUBROUTINE QDS_InitEquation() !=================================================================================================================================== ! MODULES !USE MOD_Globals -USE MOD_PreProc, ONLY:PP_N +USE MOD_Preproc USE MOD_ReadInTools, ONLY:GETINT USE MOD_QDS_Equation_vars, ONLY:QDSIniExactFunc,U_Face_old,QDSnVar USE MOD_Mesh_Vars, ONLY:nBCSides From a1db4c402b1fab4582e5e4a21995189bab367c93 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 15 May 2020 18:10:28 +0200 Subject: [PATCH 21/74] added pre-processor variable rules to developer guide --- doc/developerguide/020_styleguide.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/developerguide/020_styleguide.md b/doc/developerguide/020_styleguide.md index d5f982c81..79b88a4cf 100644 --- a/doc/developerguide/020_styleguide.md +++ b/doc/developerguide/020_styleguide.md @@ -64,6 +64,11 @@ The separators `!====` and `!----` are exactly 132 characters long (here they ha PP_nVar ``` + Note that + + * `USE MOD_Preproc` cannot be used with `ONLY` because the pro-processor flags sometimes result in constants and not variables + * `PP_N` and other pre-processor variables that may be constants cannot be assigned in `ASSOCIATE` constructs + * Counters: the counting variable (lower case) + description (the first character is capital case) ``` DO iVar=1,PP_nVar From 2ac56437ee36bb5e5755178f657804172b031269 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 16 May 2020 15:41:06 +0200 Subject: [PATCH 22/74] Added N=1 hard compilation to DSMC check-in reggie --- regressioncheck/checks/CHE_DSMC/builds.ini | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/regressioncheck/checks/CHE_DSMC/builds.ini b/regressioncheck/checks/CHE_DSMC/builds.ini index 9551699d6..23e167df7 100644 --- a/regressioncheck/checks/CHE_DSMC/builds.ini +++ b/regressioncheck/checks/CHE_DSMC/builds.ini @@ -2,10 +2,10 @@ binary=./bin/piclas ! fixed compiler flags -CMAKE_BUILD_TYPE=RELEASE -PICLAS_BUILD_HDF5=OFF -PICLAS_POLYNOMIAL_DEGREE=N -PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=DSMC -PICLAS_MPI=ON -PICLAS_NODETYPE=GAUSS +CMAKE_BUILD_TYPE = RELEASE +PICLAS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N,1 +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = DSMC +PICLAS_MPI = ON +PICLAS_NODETYPE = GAUSS From e647a465127bad64222f25085ad6be7a546872bd Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 16 May 2020 17:29:26 +0200 Subject: [PATCH 23/74] added exclude.ini to checkin DSMC for some cases for hard coded N=1 --- .../checks/CHE_DSMC/2D_VTS_Insert_CellLocal/excludeBuild.ini | 2 ++ .../checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/excludeBuild.ini | 2 ++ .../SurfFlux_RefMapping_Tracing_TriaTracking/excludeBuild.ini | 2 ++ .../SurfFlux_Tria_Adaptive_ConstPressure/excludeBuild.ini | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 regressioncheck/checks/CHE_DSMC/2D_VTS_Insert_CellLocal/excludeBuild.ini create mode 100644 regressioncheck/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/excludeBuild.ini create mode 100644 regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/excludeBuild.ini create mode 100644 regressioncheck/checks/CHE_DSMC/SurfFlux_Tria_Adaptive_ConstPressure/excludeBuild.ini diff --git a/regressioncheck/checks/CHE_DSMC/2D_VTS_Insert_CellLocal/excludeBuild.ini b/regressioncheck/checks/CHE_DSMC/2D_VTS_Insert_CellLocal/excludeBuild.ini new file mode 100644 index 000000000..19aa341df --- /dev/null +++ b/regressioncheck/checks/CHE_DSMC/2D_VTS_Insert_CellLocal/excludeBuild.ini @@ -0,0 +1,2 @@ +! Skip N=1 hard coded +PICLAS_POLYNOMIAL_DEGREE=1 diff --git a/regressioncheck/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/excludeBuild.ini b/regressioncheck/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/excludeBuild.ini new file mode 100644 index 000000000..19aa341df --- /dev/null +++ b/regressioncheck/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/excludeBuild.ini @@ -0,0 +1,2 @@ +! Skip N=1 hard coded +PICLAS_POLYNOMIAL_DEGREE=1 diff --git a/regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/excludeBuild.ini b/regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/excludeBuild.ini new file mode 100644 index 000000000..19aa341df --- /dev/null +++ b/regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/excludeBuild.ini @@ -0,0 +1,2 @@ +! Skip N=1 hard coded +PICLAS_POLYNOMIAL_DEGREE=1 diff --git a/regressioncheck/checks/CHE_DSMC/SurfFlux_Tria_Adaptive_ConstPressure/excludeBuild.ini b/regressioncheck/checks/CHE_DSMC/SurfFlux_Tria_Adaptive_ConstPressure/excludeBuild.ini new file mode 100644 index 000000000..19aa341df --- /dev/null +++ b/regressioncheck/checks/CHE_DSMC/SurfFlux_Tria_Adaptive_ConstPressure/excludeBuild.ini @@ -0,0 +1,2 @@ +! Skip N=1 hard coded +PICLAS_POLYNOMIAL_DEGREE=1 From be749460b7212ab3b33526c5f2aad8ca1be483fa Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 16 May 2020 17:30:05 +0200 Subject: [PATCH 24/74] added hard coded N=1 for maxwell only reggie --- regressioncheck/checks/CHE_maxwell/builds.ini | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/regressioncheck/checks/CHE_maxwell/builds.ini b/regressioncheck/checks/CHE_maxwell/builds.ini index 525b496ed..5324927e1 100644 --- a/regressioncheck/checks/CHE_maxwell/builds.ini +++ b/regressioncheck/checks/CHE_maxwell/builds.ini @@ -2,14 +2,14 @@ binary=./bin/piclas ! fixed compiler flags -CMAKE_BUILD_TYPE=DEBUG -PICLAS_BUILD_HDF5=OFF -PICLAS_POLYNOMIAL_DEGREE=N -PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=RK4 -PICLAS_PARTICLES=OFF -PICLAS_MPI=ON -PICLAS_NODETYPE=GAUSS +CMAKE_BUILD_TYPE = DEBUG +PICLAS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N,1 +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = RK4 +PICLAS_PARTICLES = OFF +PICLAS_MPI = ON +PICLAS_NODETYPE = GAUSS ! exclude combinations EXCLUDE:PICLAS_EQNSYSNAME=poisson,PICLAS_TIMEDISCMETHOD=DSMC From 101c2b21d913f2fad6158a1c7b3b0f995cf5e07f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 16 May 2020 17:31:18 +0200 Subject: [PATCH 25/74] added hard coded N=1 for poisson reggie checkin --- regressioncheck/checks/CHE_poisson/builds.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/checks/CHE_poisson/builds.ini b/regressioncheck/checks/CHE_poisson/builds.ini index 82814c81d..ffd42a63b 100644 --- a/regressioncheck/checks/CHE_poisson/builds.ini +++ b/regressioncheck/checks/CHE_poisson/builds.ini @@ -4,7 +4,7 @@ binary=./bin/piclas ! fixed compiler flags CMAKE_BUILD_TYPE = DEBUG PICLAS_BUILD_HDF5 = OFF -PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_POLYNOMIAL_DEGREE = N,1 PICLAS_EQNSYSNAME = poisson PICLAS_TIMEDISCMETHOD = RK3 PICLAS_MPI = ON From 659152cbd0971aac53120501b11ef75897caf37b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 17 May 2020 21:56:41 +0200 Subject: [PATCH 26/74] added hard compiled N=1 to reggie table --- REGGIE.md | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/REGGIE.md b/REGGIE.md index e43474380..3a22315ea 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -8,16 +8,16 @@ PICLas utilizes the Reggie2.0 toolbox for regression testing. A detailed documen Overview of the test cases performed after a commit. -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :-----------------------------------------: | :-------------------------: | :-----------------------------------------------------: | :------------: | :---------------: | :-----------------------------------------------------------: | -| 01 | run_basic | maxwell,RK4 | DG-Operator | nProcs=1,2,5,8 | L2,Linf | | -| 02 | CHE_maxwell | maxwell, RK4, Particles=OFF | DG-Operator, only Maxwell field solver | nProcs=1,2,5,8 | L2,Linf | | -| 03 | CHE_poisson | Poisson,RK3 | HDG-Operator, secondary electron emission (SEE-I model) | nProcs=1,2,5,8 | L2,Linf | [Link](/regressioncheck/checks/CHE_poisson/poisson/readme.md) | -| 04 | [CHE_PIC_maxwell_RK4](#che_pic_maxwell_rk4) | PIC (maxwell, RK4) | | | | | -| 05 | [CHE_DSMC](#che_dsmc) | DSMC | | | | | -| 06 | CHE_PIC_maxwell_implicitBC | maxwell,PIC,ImplicitO4 | Implicit reflective particle BC | nProcs=1 | Particle Position | | -| 07 | [CHE_BGK](#che_bgkfpflow) | BGK-Flow | | | | | -| 08 | [CHE_FPFlow](#che_bgkfpflow) | FP-Flow | | | | | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :-----------------------------------------: | :-------------------------: | :-----------------------------------------------------: | :------------: | :---------------: | :-----------------------------------------------------------: | +| 01 | run_basic | maxwell,RK4 | DG-Operator | nProcs=1,2,5,8 | L2,Linf | | +| 02 | CHE_maxwell | maxwell, RK4, Particles=OFF | DG-Operator, only Maxwell field solver, hard compiled N=1 | nProcs=1,2,5,8 | L2,Linf | | +| 03 | CHE_poisson | Poisson,RK3 | HDG-Operator, secondary electron emission (SEE-I model), hard compiled N=1 | nProcs=1,2,5,8 | L2,Linf | [Link](/regressioncheck/checks/CHE_poisson/poisson/readme.md) | +| 04 | [CHE_PIC_maxwell_RK4](#che_pic_maxwell_rk4) | PIC (maxwell, RK4) | | | | | +| 05 | [CHE_DSMC](#che_dsmc) | DSMC | | | | | +| 06 | CHE_PIC_maxwell_implicitBC | maxwell,PIC,ImplicitO4 | Implicit reflective particle BC | nProcs=1 | Particle Position | | +| 07 | [CHE_BGK](#che_bgkfpflow) | BGK-Flow | | | | | +| 08 | [CHE_FPFlow](#che_bgkfpflow) | FP-Flow | | | | | #### CHE_PIC_maxwell_RK4 @@ -35,23 +35,23 @@ Regression testing for PIC, solving the complete Maxwell equations with RK4: [Li Small test cases to check features with DSMC timedisc: [Link to build](regressioncheck/checks/CHE_DSMC/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :--------------------------------------: | :--------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------: | :--------------------------------: | :----------------------------------------------------------------------------------------: | -| | 2D_VTS_Insert_CellLocal | | 2D/Axisymmetric, linear time step scaling: Initial particle insertion by cell_local | nProcs=2 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/checks/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/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/readme.md) | -| | BackgroundGas_VHS_MCC | | Reservoir simulation of an ionization using a background gas with DSMC and MCC-based collision probabilities | nProcs=1 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/checks/CHE_DSMC/BackgroundGas_VHS_MCC/readme.md) | -| | BC_DiffuseWall_EnergyAccommodation | | Reservoir relaxing towards wall temperature | nProcs=1,4 | Temperature | [Link](regressioncheck/checks/CHE_DSMC/BC_DiffuseWall_EnergyAccommodation/readme.md) | -| | BC_DiffuseWall_TempGrad | | Reservoir with a boundary temperature gradient along the x-axis | nProcs=1,4 | Temperature | [Link](regressioncheck/checks/CHE_DSMC/BC_DiffuseWall_TempGrad/readme.md) | -| | BC_InnerReflective_8elems | | Inner reflective BC (dielectric surfaces) low error tolerance, runs h5piclas2vtk after piclas execution and converts PartData to .vtk | nProcs=1,2,4,8 | h5diff: DSMCSurfState | [Link](regressioncheck/checks/CHE_DSMC/BC_InnerReflective_8elems/readme.md) | -| | BC_InnerReflective_36elems | | Inner reflective BC (dielectric surfaces) high error tolerance | nProcs=1,2,4,8,12 | h5diff: DSMCSurfState | [Link](regressioncheck/checks/CHE_DSMC/BC_InnerReflective_36elems/readme.md) | -| | BC_PorousBC | | PorousBC as a pump with 2 species | nProcs=3 | Total # of removed part through BC | | -| | BC_PorousBC_2DAxi | | PorousBC as a pump with 2 species (axisymmetric, with/without radial weighting) | nProcs=1,2 | Total number density | [Link](regressioncheck/checks/CHE_DSMC/BC_PorousBC_2DAxi/readme.md) | -| | cube | | Collismode=2,3 | nProcs=2 | | | -| | SurfFlux_RefMapping_Tracing_TriaTracking | | Surface flux emission (collisionless) with ARM (with all three trackings) and TriaSurfaceFlux (only TriaTracking) | nProcs=1 | PartAnalyze: nPart, TransTemp | [Link](regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/readme.md) | -| | SurfFlux_Tria_Adaptive_ConstPressure | | TriaSurfaceFlux with AdaptiveType=1/2 | nProcs=4 | Integrated mass flux | | -| | SurfFlux_Tria_Adaptive_ConstMassflow | | TriaSurfaceFlux with AdaptiveType=3,4 | nProcs=1 | Integrated mass flux | | -| | SurfaModel_Sampling | | Surface model sampling check | nProcs=1,2,4 | | [Link](regressioncheck/checks/CHE_DSMC/SurfaceModel_Sampling/readme.md) | -| | SurfaceModel_SMCR | | Surfacemodel 3 init/run check | nProcs=1,4 | | [Link](regressioncheck/checks/CHE_DSMC/SurfaceModel_SMCR/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :--------------------------------------: | :--------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------: | :--------------------------------: | :----------------------------------------------------------------------------------------: | +| | 2D_VTS_Insert_CellLocal | | 2D/Axisymmetric, linear time step scaling: Initial particle insertion by cell_local | nProcs=2 | PartAnalyze: NumDens, Temp | [Link](regressioncheck/checks/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/checks/CHE_DSMC/2D_VTS_SurfFlux_Tria/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/checks/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/checks/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/checks/CHE_DSMC/BC_DiffuseWall_TempGrad/readme.md) | +| | BC_InnerReflective_8elems | | Inner reflective BC (dielectric surfaces) low error tolerance, runs h5piclas2vtk after piclas execution and converts PartData to .vtk, hard compiled N=1 | nProcs=1,2,4,8 | h5diff: DSMCSurfState | [Link](regressioncheck/checks/CHE_DSMC/BC_InnerReflective_8elems/readme.md) | +| | BC_InnerReflective_36elems | | Inner reflective BC (dielectric surfaces) high error tolerance, hard compiled N=1 | nProcs=1,2,4,8,12 | h5diff: DSMCSurfState | [Link](regressioncheck/checks/CHE_DSMC/BC_InnerReflective_36elems/readme.md) | +| | BC_PorousBC | | PorousBC as a pump with 2 species, hard compiled N=1 | nProcs=3 | Total # of removed part through BC | | +| | BC_PorousBC_2DAxi | | PorousBC as a pump with 2 species (axisymmetric, with/without radial weighting), hard compiled N=1 | nProcs=1,2 | Total number density | [Link](regressioncheck/checks/CHE_DSMC/BC_PorousBC_2DAxi/readme.md) | +| | cube | | Collismode=2,3, hard compiled N=1 | nProcs=2 | | | +| | SurfFlux_RefMapping_Tracing_TriaTracking | | Surface flux emission (collisionless) with ARM (with all three trackings) and TriaSurfaceFlux (only TriaTracking) | nProcs=1 | PartAnalyze: nPart, TransTemp | [Link](regressioncheck/checks/CHE_DSMC/SurfFlux_RefMapping_Tracing_TriaTracking/readme.md) | +| | SurfFlux_Tria_Adaptive_ConstPressure | | TriaSurfaceFlux with AdaptiveType=1/2 | nProcs=4 | Integrated mass flux | | +| | SurfFlux_Tria_Adaptive_ConstMassflow | | TriaSurfaceFlux with AdaptiveType=3,4, hard compiled N=1 | nProcs=1 | Integrated mass flux | | +| | SurfaModel_Sampling | | Surface model sampling check, hard compiled N=1 | nProcs=1,2,4 | | [Link](regressioncheck/checks/CHE_DSMC/SurfaceModel_Sampling/readme.md) | +| | SurfaceModel_SMCR | | Surfacemodel 3 init/run check, hard compiled N=1 | nProcs=1,4 | | [Link](regressioncheck/checks/CHE_DSMC/SurfaceModel_SMCR/readme.md) | #### CHE_BGK/FPFlow From a60b7a03cd303946e425bbb91ff558b13dd1e1f8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 30 May 2020 17:47:47 +0100 Subject: [PATCH 27/74] Fixed CreateParticle() - RefMapping: the reference position in PartPosRef(:,iPart) of the newly created particle must be set here (before it is pushed or interpolated) - Setting PDM%IsNewPart(newParticleID) = .TRUE., which is required for reconstruction of LSERK and staggered time integration schemes --- src/particles/particle_operations.f90 | 35 +++++++++++---------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/particles/particle_operations.f90 b/src/particles/particle_operations.f90 index f9e09174b..fc21055c5 100644 --- a/src/particles/particle_operations.f90 +++ b/src/particles/particle_operations.f90 @@ -42,10 +42,12 @@ SUBROUTINE CreateParticle(Species,Pos,ElemID,Velocity,RotEnergy,VibEnergy,ElecEn !=================================================================================================================================== !> creates a single particle at correct array position and assign properties !=================================================================================================================================== -! MODULES ! +! MODULES USE MOD_Globals -USE MOD_Particle_Vars ,ONLY: PDM, PEM, PartState, LastPartPos, PartSpecies -USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, DSMC, PartStateIntEn ! , RadialWeighting +USE MOD_Particle_Vars ,ONLY: PDM, PEM, PartState, LastPartPos, PartSpecies,PartPosRef +USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, DSMC, PartStateIntEn +USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod +USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -62,15 +64,6 @@ SUBROUTINE CreateParticle(Species,Pos,ElemID,Velocity,RotEnergy,VibEnergy,ElecEn INTEGER :: newParticleID !=================================================================================================================================== - -!IPWRITE(UNIT_stdOut,*) 'NEW PARTICLE!' - -!newParticleID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+1) ! add +1 because PDM%CurrentNextFreePosition starts at 0 -!IF (newParticleID .EQ. 0) CALL abort(& -!__STAMP__& -!,'ERROR in CreateParticle: newParticleID.EQ.0 - maximum nbr of particles reached?') -!#if USE_MPI - ! Do not increase the ParticleVecLength for Phantom particles! PDM%ParticleVecLength = PDM%ParticleVecLength + 1 ! Increase particle vector length newParticleID = PDM%ParticleVecLength @@ -79,16 +72,16 @@ SUBROUTINE CreateParticle(Species,Pos,ElemID,Velocity,RotEnergy,VibEnergy,ElecEn __STAMP__& ,'CreateParticle: newParticleID.GT.PDM%MaxParticleNumber. newParticleID=',IntInfoOpt=newParticleID) END IF -!IF(Species.LT.0) PDM%PhantomParticles = PDM%PhantomParticles + 1 -!#endif /*USE_MPI*/ -! Increase the NextFreePosition for further particle creation -!PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 +PartSpecies(newParticleID) = Species +LastPartPos(1:3,newParticleID) = Pos(1:3) +PartState(1:3,newParticleID) = Pos(1:3) +PartState(4:6,newParticleID) = Velocity(1:3) -PartSpecies(newParticleID) = Species -LastPartPos(1:3,newParticleID)=Pos(1:3) -PartState(1:3,newParticleID) = Pos(1:3) -PartState(4:6,newParticleID) = Velocity(1:3) +! Set the new reference position here +IF(TrackingMethod.EQ.REFMAPPING)THEN + CALL GetPositionInRefElem(PartState(1:3,newParticleID),PartPosRef(1:3,newParticleID),ElemID) +END IF ! TrackingMethod.EQ.REFMAPPING IF (useDSMC.AND.(CollisMode.GT.1)) THEN PartStateIntEn(1,newParticleID) = VibEnergy @@ -100,7 +93,7 @@ SUBROUTINE CreateParticle(Species,Pos,ElemID,Velocity,RotEnergy,VibEnergy,ElecEn PDM%ParticleInside(newParticleID) = .TRUE. PDM%dtFracPush(newParticleID) = .FALSE. -PDM%IsNewPart(newParticleID) = .FALSE. ! ??????? correct ???? +PDM%IsNewPart(newParticleID) = .TRUE. PEM%Element(newParticleID) = ElemID PEM%lastElement(newParticleID) = ElemID From c32727423924a0e89e08dd6ad54ac509db8704a5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 30 May 2020 18:24:17 +0100 Subject: [PATCH 28/74] Added build and release compilation for Poisson check-in reggie --- .gitlab-ci.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f439e8eae..707156b0f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -101,11 +101,13 @@ stages: expire_in: 1 day when: on_failure paths: - - build_gnu_poisson + - build_gnu_poisson_release + - build_gnu_poisson_debug cache: key: "${CI_COMMIT_REF_SLUG}-GNU-POI" paths: - - build_gnu_poisson + - build_gnu_poisson_release + - build_gnu_poisson_debug policy: pull .template: &defaults_intel_poisson @@ -174,17 +176,23 @@ build_gnu_poisson: expire_in: 1 day when: on_failure paths: - - build_gnu_poisson + - build_gnu_poisson_release + - build_gnu_poisson_debug cache: key: "${CI_COMMIT_REF_SLUG}-GNU-POI" paths: - - build_gnu_poisson + - build_gnu_poisson_release + - build_gnu_poisson_debug policy: push stage: build script: - - mkdir -p build_gnu_poisson ; cd build_gnu_poisson + - mkdir -p build_gnu_poisson_release ; cd build_gnu_poisson_release - git clone git@gitlab.com:reggie2.0/reggie2.0.git reggie - - cmake .. -DPICLAS_EQNSYSNAME=poisson -DPICLAS_TIMEDISCMETHOD=RK3 -DPICLAS_BUILD_HDF5=OFF ; make -j all + - cmake .. -DCMAKE_BUILD_TYPE=Release -DPICLAS_EQNSYSNAME=poisson -DPICLAS_TIMEDISCMETHOD=RK3 -DPICLAS_BUILD_HDF5=OFF ; make -j all + - cd .. + - mkdir -p build_gnu_poisson_debug ; cd build_gnu_poisson_debug + - git clone git@gitlab.com:reggie2.0/reggie2.0.git reggie + - cmake .. -DCMAKE_BUILD_TYPE=Debug -DPICLAS_EQNSYSNAME=poisson -DPICLAS_TIMEDISCMETHOD=RK3 -DPICLAS_BUILD_HDF5=OFF ; make -j all # ---------------------------------------------------------------------------------------------------------------------------------------------------- # Stage "reggie_checkin": Run most simple reggie with previous builds on check-in @@ -211,7 +219,8 @@ gnu_poisson: tags: - withmodules-concurrent script: - - cd build_gnu_poisson ; python ./reggie/reggie.py ../regressioncheck/checks/CHE_poisson/poisson -e ./bin/piclas + - cd build_gnu_poisson_release ; python ./reggie/reggie.py ../regressioncheck/checks/CHE_poisson/poisson -e ./bin/piclas + - cd ../build_gnu_poisson_debug ; python ./reggie/reggie.py ../regressioncheck/checks/CHE_poisson/poisson -e ./bin/piclas # ---------------------------------------------------------------------------------------------------------------------------------------------------- # Stage "reggie_feature_checkin": Run most simple reggie features with previous builds on check-in (must be very fast) From 2c0ac3395e02c1e5a37cc4e2b645a38aac5faec0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 8 Jun 2020 12:41:21 +0200 Subject: [PATCH 29/74] Fixed INTENT(IN) variable, which was INTENT(IOOUT) and is considered an error in GNU 10.1 --- src/hdg/hdg.f90 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 4ea1f860e..63014fcd5 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -1049,7 +1049,7 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(INOUT) :: lambda(nGP_face*nSides) -INTEGER, INTENT(INOUT),OPTIONAL::iVar +INTEGER, INTENT(IN),OPTIONAL::iVar !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL,DIMENSION(nGP_face*nSides) :: V,Z,R @@ -1201,7 +1201,7 @@ SUBROUTINE EvalResidual(RHS,lambda,R,iVar) ! INPUT VARIABLES REAL, INTENT(IN) :: RHS(nGP_face,nSides) REAL, INTENT(INOUT) :: lambda(nGP_face,nSides) -INTEGER, INTENT(INOUT),OPTIONAL::iVar +INTEGER, INTENT(IN),OPTIONAL::iVar !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: R(nGP_face,nSides) @@ -1264,7 +1264,7 @@ SUBROUTINE MatVec(lambda, mv, iVar) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(INOUT) :: mv(nGP_face, nSides) -INTEGER, INTENT(INOUT),OPTIONAL::iVar +INTEGER, INTENT(IN),OPTIONAL::iVar !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: firstSideID, lastSideID @@ -1273,6 +1273,9 @@ SUBROUTINE MatVec(lambda, mv, iVar) #if USE_LOADBALANCE REAL :: tLBStart #endif /*USE_LOADBALANCE*/ +#if PP_nVar==1 +INTEGER :: dummy +#endif /*PP_nVar==1*/ !=================================================================================================================================== #if USE_LOADBALANCE @@ -1393,7 +1396,9 @@ SUBROUTINE MatVec(lambda, mv, iVar) ! Suppress compiler warning RETURN -iVar=0 +#if PP_nVar==1 +dummy=iVar +#endif /*PP_nVar==1*/ END SUBROUTINE MatVec From 57befe24f671b349f2484da87c65c0fb0081e0d5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 8 Jun 2020 12:48:04 +0200 Subject: [PATCH 30/74] Updated environment install scripts to GCCVERSION=10.1.0 and PARAVIEWVERSION=5.8.0 --- tools/Setup_ModuleEnv/InstallGCC.sh | 18 ++++- tools/Setup_ModuleEnv/InstallHDF5.sh | 1 + .../Setup_ModuleEnv/InstallMPIallCOMPILERS.sh | 1 + tools/Setup_ModuleEnv/InstallModules.sh | 6 ++ tools/Setup_ModuleEnv/InstallParaview.sh | 69 ++++++++++++++----- 5 files changed, 75 insertions(+), 20 deletions(-) diff --git a/tools/Setup_ModuleEnv/InstallGCC.sh b/tools/Setup_ModuleEnv/InstallGCC.sh index ba91dd1aa..d302ecbb8 100755 --- a/tools/Setup_ModuleEnv/InstallGCC.sh +++ b/tools/Setup_ModuleEnv/InstallGCC.sh @@ -19,10 +19,26 @@ if [ ! -e "${SOURCESDIR}" ]; then mkdir -p ${SOURCESDIR} fi +# NOTE: +#GCC depends on: +# +# GMP: GNU Multiple Precision Arithmetic Library +# MPFR: GNU Multiple-precision floating-point rounding library +# MPC: GNU Multiple-precision C library +# ELF: Executable and Linkable Format library +# PPL: Parma Polyhedra Library (optional, for memory optimizations) + + # DOWNLOAD and INSTALL GCC COMPILER (example gcc-7.4.0) #GCCVERSION='7.4.0' #GCCVERSION='8.3.0' -GCCVERSION='9.2.0' +#GCCVERSION='9.3.0' + +# 10.1.0: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+ +# sudo apt-get install libmpfr-dev +# sudo apt-get install libmpc-dev +GCCVERSION='10.1.0' + MODULEFILEDIR=${INSTALLDIR}/modules/modulefiles/compilers/gcc MODULEFILE=${MODULEFILEDIR}/${GCCVERSION} diff --git a/tools/Setup_ModuleEnv/InstallHDF5.sh b/tools/Setup_ModuleEnv/InstallHDF5.sh index f7e1a0acc..565e3ee51 100755 --- a/tools/Setup_ModuleEnv/InstallHDF5.sh +++ b/tools/Setup_ModuleEnv/InstallHDF5.sh @@ -89,6 +89,7 @@ for WHICHCOMPILER in ${COMPILERNAMES}; do break fi module load ${WHICHCOMPILER}/${COMPILERVERSION} + module list cd ${SOURCESDIR} if [ ! -e "${SOURCESDIR}/hdf5-${HDF5VERSION}.tar.gz" ]; then diff --git a/tools/Setup_ModuleEnv/InstallMPIallCOMPILERS.sh b/tools/Setup_ModuleEnv/InstallMPIallCOMPILERS.sh index d369016be..6dec79dc8 100755 --- a/tools/Setup_ModuleEnv/InstallMPIallCOMPILERS.sh +++ b/tools/Setup_ModuleEnv/InstallMPIallCOMPILERS.sh @@ -72,6 +72,7 @@ if [ "${WHICHCOMPILER}" == "gcc" ] || [ "${WHICHCOMPILER}" == "intel" ]; then break fi module load ${WHICHCOMPILER}/${COMPILERVERSION} + module list # build and installation cd ${SOURCEDIR} diff --git a/tools/Setup_ModuleEnv/InstallModules.sh b/tools/Setup_ModuleEnv/InstallModules.sh index c3ac1f93b..93dada180 100755 --- a/tools/Setup_ModuleEnv/InstallModules.sh +++ b/tools/Setup_ModuleEnv/InstallModules.sh @@ -52,6 +52,9 @@ if [ ! -d "${MODULESHOME}" ]; then make install 2>&1 | tee install.out fi + # Copy initialization to /etc/profile + # /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) + # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). if [ -z "$(grep "if.*Modules.*${MODULEVERSION}.*init.*bash.*then" /etc/profile)" ]; then sed -i '1 i\if [ -f /opt/modules/'${MODULEVERSION}'/Modules/'${MODULEVERSION}'/init/bash ]; then' /etc/profile sed -i '2 i\ . /opt/modules/'${MODULEVERSION}'/Modules/'${MODULEVERSION}'/init/bash' /etc/profile @@ -60,6 +63,9 @@ if [ ! -d "${MODULESHOME}" ]; then echo "modules init already exists in /etc/profile" exit fi + + # Copy initialization to /etc/bash.bashrc + # System-wide .bashrc file for interactive bash(1) shells. if [ -z "$(grep "if.*Modules.*${MODULEVERSION}.*init.*bash.*then" /etc/bash.bashrc)" ]; then sed -i '1 i\if [ -f /opt/modules/'${MODULEVERSION}'/Modules/'${MODULEVERSION}'/init/bash ]; then' /etc/bash.bashrc sed -i '2 i\ . /opt/modules/'${MODULEVERSION}'/Modules/'${MODULEVERSION}'/init/bash' /etc/bash.bashrc diff --git a/tools/Setup_ModuleEnv/InstallParaview.sh b/tools/Setup_ModuleEnv/InstallParaview.sh index 06ccf9d34..9d33aa40c 100755 --- a/tools/Setup_ModuleEnv/InstallParaview.sh +++ b/tools/Setup_ModuleEnv/InstallParaview.sh @@ -25,29 +25,38 @@ check_module () { LOADMODULES=1 for arg in "$@" do - if [ "$arg" == "--help" ] || [ "$arg" == "-h" ] - then + if [ "$arg" == "--help" ] || [ "$arg" == "-h" ]; then echo "Input arguments:" echo "--help/-h print help information" - echo "--modules/-m use modules defined in script by the user." + echo "--modules/-m use modules defined in this script by the user." echo " Otherwise, find modules automatically." exit fi - if [ "$arg" == "--modules" ] || [ "$arg" == "-m" ] - then + if [ "$arg" == "--modules" ] || [ "$arg" == "-m" ]; then LOADMODULES=0 # Set desired versions - CMAKEVERSION=3.15.3-d - GCCVERSION=9.2.0 + #CMAKEVERSION=3.15.3-d + CMAKEVERSION=3.17.0-d + #GCCVERSION=9.2.0 + GCCVERSION=10.1.0 #OPENMPIVERSION=3.1.4 - OPENMPIVERSION=4.0.1 + #OPENMPIVERSION=4.0.1 + OPENMPIVERSION=4.0.2 HDF5VERSION=1.10.5 break fi done -# DOWNLOAD and INSTALL PARAVIEW (example Paraview-2.1.6) -PARAVIEWVERSION=5.2.0 +# DOWNLOAD and INSTALL PARAVIEW (example Paraview-5.0.0) +#PARAVIEWVERSION=5.2.0 +#PARAVIEWVERSION=5.3.0 + +# Version 5.8.0 on Ubuntu 20.04 requires QT5, which is installed by default, but not with all required development libs +# sudo apt-get install libqt5x11extras5-dev +# sudo apt-get install libqt5svg5-dev +# sudo apt-get install qtxmlpatterns5-dev-tools +# sudo apt-get install qttools5-dev qt5-default libxt-dev libgl1-mesa-dev +PARAVIEWVERSION=5.8.0 INSTALLDIR=/opt SOURCEDIR=/opt/Installsources @@ -67,6 +76,7 @@ if [[ $LOADMODULES -eq 1 ]]; then HDF5VERSION=$(ls ${MODULESDIR}/libraries/hdf5/ | sed 's/ /\n/g' | grep -i "[0-9]\." | head -n 1 | tail -n 1) fi +echo " " echo "Modules found:" check_module "cmake" ${CMAKEVERSION} check_module "gcc " ${GCCVERSION} @@ -81,12 +91,16 @@ if [ ! -e "${PARAVIEWMODULEFILE}" ]; then echo "creating Paraview-${PARAVIEWVERSION} for GCC-${GCCVERSION} under" echo "$PARAVIEWMODULEFILE" echo " " + echo "Important: If the compilation step fails, try compiling single, .i.e., remove -j from make -j" + echo " " read -p "Press enter to continue" module purge module load cmake/${CMAKEVERSION} module load gcc/${GCCVERSION} module load openmpi/${OPENMPIVERSION}/gcc/${GCCVERSION} module load hdf5/${HDF5VERSION}/gcc/${GCCVERSION}/openmpi/${OPENMPIVERSION} + module list + echo " " # Install destination PARAVIEWINSTALLDIR=/opt/paraview/${PARAVIEWVERSION}/gcc-${GCCVERSION}/openmpi-${OPENMPIVERSION}/hdf5-${HDF5VERSION} @@ -112,8 +126,10 @@ if [ ! -e "${PARAVIEWMODULEFILE}" ]; then if [ -d "${SOURCEDIR}/ParaView-v${PARAVIEWVERSION}" ]; then # Check if renamed directory exists and create backup of it if [ -d "${SOURCEDIR}/paraview-${PARAVIEWVERSION}" ]; then + # Move directory, e.g., "paraview-5.8.0" to "paraview-5.8.0_bak" mv ${SOURCEDIR}/paraview-${PARAVIEWVERSION} ${SOURCEDIR}/paraview-${PARAVIEWVERSION}_bak fi + # The extracted directory is named, e.g., "ParaView-v5.8.0", which is renamed to "paraview-5.8.0" with small letters and no "v" mv ${SOURCEDIR}/ParaView-v${PARAVIEWVERSION} ${SOURCEDIR}/paraview-${PARAVIEWVERSION} fi #rm -rf paraview-${PARAVIEWVERSION}-source.tar.gz @@ -124,15 +140,29 @@ if [ ! -e "${PARAVIEWMODULEFILE}" ]; then fi cd ${SOURCEDIR}/paraview-${PARAVIEWVERSION}/build_gcc/${GCCVERSION} - cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DBUILD_EXAMPLES=OFF \ - -DPARAVIEW_ENABLE_PYTHON=ON \ - -DPARAVIEW_USE_MPI=ON \ - -DPARAVIEW_USE_VISITBRIDGE=OFF \ - -DPARAVIEW_INSTALL_DEVELOPMENT_FILES=ON \ - -DCMAKE_INSTALL_PREFIX=${PARAVIEWINSTALLDIR} \ - ${SOURCEDIR}/paraview-${PARAVIEWVERSION} + # CMAKE COMPILE FLAGS DEPEND ON THE CHOSEN PARAVIEW VERSION! + if [ "$PARAVIEWVERSION" == "5.2.0" ] || [ "$PARAVIEWVERSION" == "5.3.0" ] || [ "$PARAVIEWVERSION" == "5.4.0" ]; then + cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DBUILD_EXAMPLES=OFF \ + -DPARAVIEW_ENABLE_PYTHON=ON \ + -DPARAVIEW_USE_MPI=ON \ + -DPARAVIEW_USE_VISITBRIDGE=OFF \ + -DPARAVIEW_INSTALL_DEVELOPMENT_FILES=ON \ + -DCMAKE_INSTALL_PREFIX=${PARAVIEWINSTALLDIR} \ + ${SOURCEDIR}/paraview-${PARAVIEWVERSION} + elif [ "$PARAVIEWVERSION" == "5.7.0" ] || [ "$PARAVIEWVERSION" == "5.8.0" ]; then + cmake -DCMAKE_BUILD_TYPE=Release \ + -DPARAVIEW_USE_PYTHON=ON \ + -DPARAVIEW_USE_MPI=ON \ + -DPARAVIEW_INSTALL_DEVELOPMENT_FILES=ON \ + -DVTK_MODULE_USE_EXTERNAL_VTK_hdf5=ON \ + -DCMAKE_INSTALL_PREFIX=${PARAVIEWINSTALLDIR} \ + ${SOURCEDIR}/paraview-${PARAVIEWVERSION} + else + echo "ERROR: Set the correct cmake compile flags for the paraview version [$PARAVIEWVERSION]" + exit + fi make -j 2>&1 | tee make.out if [ ${PIPESTATUS[0]} -ne 0 ]; then echo " " @@ -142,6 +172,7 @@ if [ ! -e "${PARAVIEWMODULEFILE}" ]; then make install 2>&1 | tee install.out fi + # create modulefile if installation seems succesfull (check if mpicc, mpicxx, mpifort exists in installdir) if [ -e "${PARAVIEWINSTALLDIR}/bin/paraview" ]; then if [ ! -d "${PARAVIEWMODULEFILEDIR}" ]; then From 632c829130a89ccace58b308df61586447399d02 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 14 Jun 2020 14:13:57 +0200 Subject: [PATCH 31/74] Update std.out file clean-up script functionality, see --help for all available options. Now all lines containing 1. [ REACTION 85084 5 1] 2. [ CALCULATING THE ADAPTIVE SURFACE FLUX VALUES... Number of sampled particles: 0.0000000000000000 ] 3. [ 3382.0000000000000 1694.4798966228368] are removed. The automatic back-up file generation can now be prevented by running the script with "-c" or "--clean", which removes any corresponding std-*.out.bak files after clean-up. --- .../cleanUp_stdOut_files.py | 107 ++++++++++++++---- 1 file changed, 87 insertions(+), 20 deletions(-) diff --git a/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py b/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py index e5c14164d..0100569d4 100644 --- a/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py +++ b/tools/cleanUp_stdOut_files/cleanUp_stdOut_files.py @@ -11,6 +11,9 @@ except NameError: pass +def hasNumbers(inputString): + return bool(re.search(r'\d', inputString)) + def getFirst(line): first = line.strip("\n").split() if first: @@ -49,7 +52,67 @@ def getPartInfo(line): return PartID, Element, SpecID -def CleanDoPrintStatusLine(stdfile): +def RenameFiles(differences, stdfile, stdfile_backup, stdfile_new, args): + + # Check if differences exist (nLostParts or changedLines) + if differences > 0: + # Only create backup file if it does not exist (i.e. prevent over-writing backup files from other clean-up functions in the tool) + if not os.path.exists(stdfile_backup): + os.rename(stdfile, stdfile_backup) # backup original file (only once) + os.rename(stdfile_new, stdfile) # replace original file with cleaned file + else : + os.remove(stdfile_new) # remove new file (it is empty when no particles were lost) + + # Check if user has supplied the flag for backup file removal and the file actually exists + if args.clean and os.path.exists(stdfile_backup): + os.remove(stdfile_backup) # remove backup file + + +def CleanSingleLines(stdfile,args): + '''Remove lines such as + 1. [ REACTION 85084 5 1] + 2. [ CALCULATING THE ADAPTIVE SURFACE FLUX VALUES... Number of sampled particles: 0.0000000000000000 ] + 3. [ 3382.0000000000000 1694.4798966228368] + ''' + + stdfile_new = stdfile+".new" + stdfile_backup = stdfile+".bak" + + # 1. Read the original file content + with open(stdfile) as input: + lines = input.readlines() + + # REACTION 85084 5 1 + n=0 + changedLines=0 + with open(stdfile_new, "w") as output_new: + for line in lines: + n+=1 + #if all(c in line.strip("\n") for c in arr): + line_stripped = line.strip("\n") + line_split = line_stripped.split() + if line_stripped.startswith(' REACTION') and hasNumbers(line_stripped): + # 1. [ REACTION 85084 5 1] + # Ignore this line and increase the counter by 1 + changedLines+=1 + elif line_stripped.startswith(' CALCULATING THE ADAPTIVE SURFACE FLUX VALUES') and hasNumbers(line_stripped): + # 2. [ CALCULATING THE ADAPTIVE SURFACE FLUX VALUES... Number of sampled particles: 0.0000000000000000 ] + # Ignore this line and increase the counter by 1 + changedLines+=1 + elif line_stripped.count(' ') > 9 and len(line_split) == 2 and all(x.replace('.', '', 1).isdigit() for x in line_split): + # 3. [ 3382.0000000000000 1694.4798966228368] + # Ignore this line and increase the counter by 1 + changedLines+=1 + else: + # Write the line to the new (clean) file + output_new.write(line) + + # 3. Rename files + RenameFiles(changedLines, stdfile, stdfile_backup, stdfile_new, args) + + return changedLines + +def CleanDoPrintStatusLine(stdfile,args): stdfile_new = stdfile+".new" stdfile_backup = stdfile+".bak" @@ -74,21 +137,23 @@ def CleanDoPrintStatusLine(stdfile): for line in lines: n+=1 if all(c in line.strip("\n") for c in arr): + # Ignore this line and increase the counter by 1 changedLines+=1 else: + # Write the line to the new (clean) file output_new.write(line) # 3. Rename files - if changedLines > 0: - os.rename(stdfile, stdfile_backup) # backup original file - os.rename(stdfile_new, stdfile) # replace original file with cleaned file - else : - os.remove(stdfile_new) # remove new file (is empty when no particles were lost) + RenameFiles(changedLines, stdfile, stdfile_backup, stdfile_new, args) return changedLines -def CleanLostParticles(stdfile): +def CleanLostParticles(stdfile,args): + + if not os.path.exists(stdfile): + print("Error: the file does not exist : %s" % stdfile) + exit(1) stdfile_lost = stdfile+".lost" stdfile_new = stdfile+".new" @@ -268,26 +333,25 @@ def CleanLostParticles(stdfile): # 2.8. Close .h5 data file f1.close() - - # 3. Rename files - if nLostParts > 0: - os.rename(stdfile, stdfile_backup) # backup original file - os.rename(stdfile_new, stdfile) # replace original file with cleaned file - else : - os.remove(stdfile_new) # remove new file (is empty when no particles were lost) - os.remove(stdfile_lost) # remove lost file (is empty when no particles were lost) + RenameFiles(nLostParts, stdfile, stdfile_backup, stdfile_new, args) + os.remove(stdfile_lost) # remove lost file (is empty when no particles were lost) return nLostParts -def CleanFile(stdfile) : +def CleanFile(stdfile,args) : + + changedLines = 0 # 1. Remove lost particles from std.out file and write them to a .h5 file - nLostParts = CleanLostParticles(stdfile) + nLostParts = CleanLostParticles(stdfile,args) # 2. Remove remnants of DoPrintStatusLine=T - changedLines = CleanDoPrintStatusLine(stdfile) + changedLines += CleanDoPrintStatusLine(stdfile,args) + + # 3. Remove lines containing: "REACTION 85084 5 1" + changedLines += CleanSingleLines(stdfile,args) return nLostParts, changedLines @@ -338,6 +402,7 @@ def yellow(text) : parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') # Get command line arguments args = parser.parse_args() @@ -349,7 +414,6 @@ def yellow(text) : print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") print('='*132) - # Get maximum number of characters in h5 file names max_length=0 for stdfile in args.files : @@ -365,12 +429,15 @@ def yellow(text) : ext = ['.new', '.lost', '.h5', '.bak'] for stdfile in args.files : + # Check if file can be skipped, see variable "ext" with all file extensions that are to be ignored if stdfile.endswith(tuple(ext)): print("%s " % stdfile + yellow("(skipping)")) continue - nLostParts, changedLines = CleanFile(stdfile) + # Clean-up the current file + nLostParts, changedLines = CleanFile(stdfile,args) + # Display results if nLostParts > 0: if changedLines > 0: print("%s " % stdfile + red("Lost %s particles" % nLostParts) + " Written particles to %s-lost-particles.h5" % stdfile + red(" and removed %s lines" % changedLines)) From d31cdffbe3c85e85ca106fcb12306dd1738b8dde Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 15 Jun 2020 18:03:00 +0200 Subject: [PATCH 32/74] Output error norms for HDG to FieldAnalyze.csv --- src/analyze/analyzefield.f90 | 154 ++++++++++++++++----------- src/hdg/hdg.f90 | 30 +++--- src/hdg/hdg_vars.f90 | 6 +- src/loadbalance/loaddistribution.f90 | 4 +- 4 files changed, 117 insertions(+), 77 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index d6280b790..cb5e821f8 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -71,6 +71,9 @@ SUBROUTINE AnalyzeField(Time) USE MOD_Particle_Analyze_Vars,ONLY: IsRestart USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Dielectric_Vars ,ONLY: DoDielectric +#if USE_HDG +USE MOD_HDG_Vars ,ONLY: HDGNorm,iteration,Runtime,RunTimePerIteration +#endif /*USE_HDG*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -80,16 +83,41 @@ SUBROUTINE AnalyzeField(Time) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -LOGICAL :: isOpen -CHARACTER(LEN=350) :: outfile -INTEGER :: unit_index, OutputCounter,iPlane -REAL :: PoyntingIntegral(1:nPoyntingIntPlanes) +LOGICAL :: isOpen +CHARACTER(LEN=350) :: outfile +INTEGER :: unit_index, nOutputVarTotal,iPlane +REAL :: PoyntingIntegral(1:nPoyntingIntPlanes) +CHARACTER(LEN=150) :: formatStr +#if USE_HDG +INTEGER,PARAMETER :: nOutputVar=10 +#else +INTEGER,PARAMETER :: nOutputVar=8 +#endif /*USE_HDG*/ +CHARACTER(LEN=255),DIMENSION(nOutputVar) :: StrVarNames(nOutputVar)=(/ CHARACTER(LEN=255) :: & + 'time', & + 'E-El', & + 'E-Mag', & + 'E-phi', & + 'E-psi', & + 'E-pot' & +#if USE_HDG + ,'#iterations', & + 'RunTime', & + 'RunTimePerIteration', & + 'HDGNorm' & +#endif /*USE_HDG*/ + /) +!CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called multiple times at the beginning +CHARACTER(LEN=255),ALLOCATABLE :: tmpStr(:) ! needed because PerformAnalyze is called multiple times at the beginning +CHARACTER(LEN=1000) :: tmpStr2 +CHARACTER(LEN=1),PARAMETER :: delimiter="," +INTEGER :: I +CHARACTER(LEN=255) :: StrVarNameTmp !=================================================================================================================================== IF ( DoRestart ) THEN isRestart = .true. END IF IF (.NOT.DoFieldAnalyze) RETURN -OutputCounter = 2 unit_index = 537 #if USE_MPI IF(MPIROOT)THEN @@ -101,37 +129,43 @@ SUBROUTINE AnalyzeField(Time) OPEN(unit_index,file=TRIM(outfile),position="APPEND",status="OLD") !CALL FLUSH (unit_index) ELSE - OPEN(unit_index,file=TRIM(outfile)) - !CALL FLUSH (unit_index) - !--- insert header - - WRITE(unit_index,'(A8)',ADVANCE='NO') '001-TIME' - IF (CalcEpot) THEN - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11)',ADVANCE='NO') OutputCounter,'-E-El ' - OutputCounter = OutputCounter + 1 - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11)',ADVANCE='NO') OutputCounter,'-E-Mag ' - OutputCounter = OutputCounter + 1 - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11)',ADVANCE='NO') OutputCounter,'-E-phi ' - OutputCounter = OutputCounter + 1 - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11)',ADVANCE='NO') OutputCounter,'-E-psi ' - OutputCounter = OutputCounter + 1 - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11)',ADVANCE='NO') OutputCounter,'-E-pot ' - OutputCounter = OutputCounter + 1 - END IF - IF(CalcPoyntingInt)THEN - DO iPlane=1,nPoyntingIntPlanes - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A11,I0.3,A1,E14.7,A1)',ADVANCE='NO') & - OutputCounter,'-Plane-Pos-',iPlane,'(', PosPoyntingInt(iPlane),')' - OutputCounter = OutputCounter + 1 - END DO - END IF - WRITE(unit_index,'(A14)') ' ' + OPEN(unit_index,file=TRIM(outfile)) + !CALL FLUSH (unit_index) + !--- insert header + + ! Set the header line content + nPoyntingIntPlanes=MERGE(nPoyntingIntPlanes,0,CalcPoyntingInt) ! set to zero if the flag is false (otherwise not initialized) + ALLOCATE(tmpStr(1:nOutputVar+nPoyntingIntPlanes)) + tmpStr="" + nOutputVarTotal = 0 + DO I=1,nOutputVar + IF((.NOT.CalcEpot).AND.(I.LT.6)) CYCLE + WRITE(tmpStr(I),'(A,I0.3,A)')delimiter//'"',I,'-'//TRIM(StrVarNames(I))//'"' + nOutputVarTotal = nOutputVarTotal + 1 + END DO + + IF(CalcPoyntingInt)THEN + DO iPlane=1,nPoyntingIntPlanes + nOutputVarTotal = nOutputVarTotal + 1 + WRITE(StrVarNameTmp,'(A,I0.3,A1,E23.16E3,A1)') 'Plane-Pos-',iPlane,'(',PosPoyntingInt(iPlane),')' + WRITE(tmpStr(nOutputVarTotal),'(A,I0.3,A)')delimiter//'"',nOutputVarTotal,'-'//TRIM(StrVarNameTmp)//'"' + END DO + END IF + + ! Set the format + WRITE(formatStr,'(A1)')'(' + DO I=1,nOutputVarTotal + IF(I.EQ.nOutputVarTotal)THEN ! skip writing "," and the end of the line + WRITE(formatStr,'(A,A1,I2)')TRIM(formatStr),'A',LEN_TRIM(tmpStr(I)) + ELSE + WRITE(formatStr,'(A,A1,I2,A1)')TRIM(formatStr),'A',LEN_TRIM(tmpStr(I)),',' + END IF + END DO + + WRITE(formatStr,'(A,A1)')TRIM(formatStr),')' ! finish the format + WRITE(tmpStr2,formatStr)tmpStr ! use the format and write the header names to a temporary string + tmpStr2(1:1) = " " ! remove possible delimiter at the beginning (e.g. a comma) + WRITE(unit_index,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the temporary string END IF END IF #if USE_MPI @@ -154,32 +188,28 @@ SUBROUTINE AnalyzeField(Time) IF(CalcPoyntingInt) CALL CalcPoyntingIntegral(PoyntingIntegral,doProlong=.TRUE.) #endif -#if USE_MPI - IF(MPIROOT)THEN -#endif /*USE_MPI*/ - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') Time - IF (CalcEpot) THEN - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') WEl - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') WMag - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') WPhi - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') WPsi - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') WEl + WMag + WPhi + WPsi - END IF - IF(CalcPoyntingInt)THEN - DO iPlane=1,nPoyntingIntPlanes - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,WRITEFORMAT,ADVANCE='NO') PoyntingIntegral(iPlane) - END DO - END IF - WRITE(unit_index,'(A1)') ' ' -#if USE_MPI - END IF -#endif /*USE_MPI*/ +IF(MPIROOT)THEN + WRITE(unit_index,'(E23.16E3)',ADVANCE='NO') Time + IF (CalcEpot) THEN + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WMag + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPhi + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPsi + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WMag + WPhi + WPsi + END IF + IF(CalcPoyntingInt)THEN + DO iPlane=1,nPoyntingIntPlanes + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',',PoyntingIntegral(iPlane) + END DO + END IF +#if USE_HDG + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', REAL(iteration) + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', Runtime + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', RunTimePerIteration + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', HDGNorm +#endif /*USE_HDG*/ + write(unit_index,'(/)')! write 'newline' to file to finish the current line +END IF END SUBROUTINE AnalyzeField diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 63014fcd5..78035a360 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -1034,7 +1034,7 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_HDG_Vars ,ONLY: nGP_face,HDGDisplayConvergence +USE MOD_HDG_Vars ,ONLY: nGP_face,HDGDisplayConvergence,HDGNorm,iteration,Runtime,RunTimePerIteration USE MOD_HDG_Vars ,ONLY: EpsCG,MaxIterCG,PrecondType,useRelativeAbortCrit,OutIterCG USE MOD_TimeDisc_Vars ,ONLY: iter,IterDisplayStep USE MOD_Mesh_Vars ,ONLY: nSides,nMPISides_YOUR @@ -1056,7 +1056,6 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) REAL :: AbortCrit2 REAL :: omega,rr,vz,rz1,rz2,Norm_r2 REAL :: timestartCG,timeEndCG -INTEGER :: iteration INTEGER :: VecSize LOGICAL :: converged #if USE_LOADBALANCE @@ -1145,21 +1144,28 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) IF(converged) THEN !converged TimeEndCG=PICLASTIME() CALL EvalResidual(RHS,lambda,R) - CALL VectorDotProduct(VecSize,R(1:VecSize),R(1:VecSize),Norm_R2) !Z=V - IF(HDGDisplayConvergence.AND.(MOD(iter,IterDisplayStep).EQ.0)) THEN - SWRITE(UNIT_StdOut,'(A,X,I16)') '#iterations :',iteration - SWRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime [s]:',(TimeEndCG-TimeStartCG) - SWRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime/iteration [s]:',(TimeEndCG-TimeStartCG)/REAL(iteration) -! SWRITE(UNIT_StdOut,'(A,X,ES16.7)')'RunTime/iteration/DOF[s]:',(TimeEndCG-TimeStartCG)/REAL(iteration*PP_nElems*nGP_vol) - SWRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'Final Residual :',SQRT(Norm_R2) - SWRITE(UNIT_StdOut,'(132("-"))') - END IF + CALL VectorDotProduct(VecSize,R(1:VecSize),R(1:VecSize),Norm_R2) !Z=V (function contains ALLREDUCE) + + IF(MPIroot)THEN + RunTime = TimeEndCG-TimeStartCG + RunTimePerIteration = RunTime/REAL(iteration) + HDGNorm = SQRT(Norm_R2) + + IF(HDGDisplayConvergence.AND.(MOD(iter,IterDisplayStep).EQ.0)) THEN + WRITE(UNIT_StdOut,'(A,X,I16)') '#iterations :',iteration + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime [s]:',RunTime + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime/iteration [s]:',RunTimePerIteration + !WRITE(UNIT_StdOut,'(A,X,ES16.7)')'RunTime/iteration/DOF[s]:',(TimeEndCG-TimeStartCG)/REAL(iteration*PP_nElems*nGP_vol) + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'Final Residual :',HDGNorm + WRITE(UNIT_StdOut,'(132("-"))') + END IF + END IF ! MPIroot RETURN END IF !converged + IF (MOD(iteration , MAX(INT(REAL(MaxIterCG)/REAL(OutIterCG)),1) ).EQ.0) THEN SWRITE(*,'(2(A,I0),2(A,G0))') 'CG solver reached ',iteration, ' of ',MaxIterCG, ' iterations with res = ',rr, ' > ',AbortCrit2 END IF - #if USE_LOADBALANCE CALL LBStartTime(tLBStart) ! Start time measurement #endif /*USE_LOADBALANCE*/ diff --git a/src/hdg/hdg_vars.f90 b/src/hdg/hdg_vars.f90 index 8d74a3d0e..52f1f5531 100644 --- a/src/hdg/hdg_vars.f90 +++ b/src/hdg/hdg_vars.f90 @@ -77,7 +77,11 @@ MODULE MOD_HDG_Vars REAL,ALLOCATABLE :: IntMatMortar(:,:,:,:) ! Interpolation matrix for mortar: (nGP_face,nGP_Face,1:4(iMortar),1:3(MortarType)) INTEGER,ALLOCATABLE :: SmallMortarInfo(:) ! 1:nSides: info on small Mortar sides: ! -1: is neighbor small mortar , 0: not a small mortar, 1: small mortar on big side -LOGICAL :: HDGDisplayConvergence ! Display divergence criteria: Iterations, Runtime and Residual +LOGICAL :: HDGDisplayConvergence !< Display divergence criteria: Iterations, Runtime and Residual +REAL :: RunTime !< CG Solver runtime +REAL :: RunTimePerIteration !< CG Solver runtime per iteration +REAL :: HDGNorm !< Norm +INTEGER :: iteration !< number of iterations to achieve the norm !=================================================================================================================================== diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 996657cba..81228f4c2 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1134,7 +1134,7 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) 'PID', & 'SimulationWallTime',& 'InitializationWallTime'/) -CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called mutiple times at the beginning +CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called multiple times at the beginning CHARACTER(LEN=1000) :: tmpStr2 CHARACTER(LEN=1),PARAMETER :: delimiter="," !=================================================================================================================================== @@ -1165,7 +1165,7 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) WRITE(formatStr,'(A,A1)')TRIM(formatStr),')' ! finish the format WRITE(tmpStr2,formatStr)tmpStr ! use the format and write the header names to a temporary string - tmpStr2(1:1) = " " ! remove possible relimiter at the beginning (e.g. a comma) + tmpStr2(1:1) = " " ! remove possible delimiter at the beginning (e.g. a comma) WRITE(ioUnit,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the temporary string CLOSE(ioUnit) From d8773395ca21f2fe9281e1706418704fe31406e8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 15 Jun 2020 18:13:13 +0200 Subject: [PATCH 33/74] Fixed wrong nOutputVar for !USE_HDG case --- src/analyze/analyzefield.f90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index cb5e821f8..7276de6d8 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -83,15 +83,15 @@ SUBROUTINE AnalyzeField(Time) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -LOGICAL :: isOpen -CHARACTER(LEN=350) :: outfile -INTEGER :: unit_index, nOutputVarTotal,iPlane -REAL :: PoyntingIntegral(1:nPoyntingIntPlanes) -CHARACTER(LEN=150) :: formatStr +LOGICAL :: isOpen +CHARACTER(LEN=350) :: outfile +INTEGER :: unit_index, nOutputVarTotal,iPlane +REAL :: PoyntingIntegral(1:nPoyntingIntPlanes) +CHARACTER(LEN=150) :: formatStr #if USE_HDG -INTEGER,PARAMETER :: nOutputVar=10 +INTEGER,PARAMETER :: nOutputVar=10 #else -INTEGER,PARAMETER :: nOutputVar=8 +INTEGER,PARAMETER :: nOutputVar=6 #endif /*USE_HDG*/ CHARACTER(LEN=255),DIMENSION(nOutputVar) :: StrVarNames(nOutputVar)=(/ CHARACTER(LEN=255) :: & 'time', & From 65ae1bad99ae86f4d8de7fe94e4cf4fc889e7474 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 15 Jun 2020 19:11:26 +0200 Subject: [PATCH 34/74] Fixed correct line break command in FieldAnalyze.csv --- src/analyze/analyzefield.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index 7276de6d8..22050c99d 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -208,7 +208,7 @@ SUBROUTINE AnalyzeField(Time) WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', RunTimePerIteration WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', HDGNorm #endif /*USE_HDG*/ - write(unit_index,'(/)')! write 'newline' to file to finish the current line + write(unit_index,'(A)') '' ! write 'newline' to file to finish the current line END IF From c38c3b1b135a49cbdccaec43ce33f9d3af64c1e0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 17 Jun 2020 13:54:40 +0200 Subject: [PATCH 35/74] minor clean-up --- src/analyze/analyzefield.f90 | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index 22050c99d..218aabd1d 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -107,12 +107,11 @@ SUBROUTINE AnalyzeField(Time) 'HDGNorm' & #endif /*USE_HDG*/ /) -!CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called multiple times at the beginning -CHARACTER(LEN=255),ALLOCATABLE :: tmpStr(:) ! needed because PerformAnalyze is called multiple times at the beginning -CHARACTER(LEN=1000) :: tmpStr2 -CHARACTER(LEN=1),PARAMETER :: delimiter="," -INTEGER :: I -CHARACTER(LEN=255) :: StrVarNameTmp +CHARACTER(LEN=255),ALLOCATABLE :: tmpStr(:) ! needed because PerformAnalyze is called multiple times at the beginning +CHARACTER(LEN=1000) :: tmpStr2 +CHARACTER(LEN=1),PARAMETER :: delimiter="," +INTEGER :: I +CHARACTER(LEN=255) :: StrVarNameTmp !=================================================================================================================================== IF ( DoRestart ) THEN isRestart = .true. From 155a403931c5a31d230a69b58be993a8299b67fe Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 18 Jun 2020 19:45:25 +0200 Subject: [PATCH 36/74] Added calculation of field and particle ElemTime separately and added output to ElemTimeStatistics.csv --- src/analyze/analyze.f90 | 2 +- src/loadbalance/loadbalance.f90 | 149 ++++++++++++++---- src/loadbalance/loadbalance_timers.f90 | 57 ++++--- src/loadbalance/loadbalance_tools.f90 | 26 +-- src/loadbalance/loadbalance_vars.f90 | 12 +- src/loadbalance/loaddistribution.f90 | 58 +++++-- src/particles/pic/deposition/pic_depo.f90 | 3 +- .../pic/deposition/pic_depo_method.f90 | 16 +- src/precond/precond.f90 | 9 +- src/timedisc/timedisc.f90 | 6 + 10 files changed, 243 insertions(+), 95 deletions(-) diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index 816a17702..7e6b3093b 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -1218,7 +1218,7 @@ SUBROUTINE PerformAnalyze(OutputTime,FirstOrLastIter,OutPutHDF5) IF(.NOT.DoMeasureAnalyzeTime) StartAnalyzeTime=PICLASTIME() IF(MPIroot) THEN ! write out has to be "Sim time" due to analyzes in reggie. Reggie searches for exactly this tag - WRITE(UNIT_StdOut,'(A17,ES16.7)') ' Sim time : ',OutputTime + WRITE(UNIT_StdOut,'(A13,ES16.7)')' Sim time : ',OutputTime IF(DoMeasureAnalyzeTime)THEN WRITE(UNIT_StdOut,'(A17,ES16.7,A9,I11,A)')' Analyze time : ',AnalyzeTime, ' (called ',AnalyzeCount,' times)' AnalyzeCount = 0 diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index f4d6aad3c..c55c6f833 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -187,10 +187,11 @@ SUBROUTINE ComputeElemLoad() USE MOD_LoadBalance_Vars ,ONLY: nSurfacefluxPerElem,nPartsPerBCElem,nSurfacePartsPerElem USE MOD_Particle_Tracking_vars ,ONLY: DoRefMapping USE MOD_PICDepo_Vars ,ONLY: DepositionType -USE MOD_LoadBalance_Vars ,ONLY: ParticleMPIWeight +USE MOD_LoadBalance_Vars ,ONLY: ParticleMPIWeight,ElemTimePartTot,ElemTimePart #endif /*PARTICLES*/ USE MOD_LoadDistribution ,ONLY: WriteElemTimeStatistics -USE MOD_LoadBalance_Vars ,ONLY: CurrentImbalance,PerformLBSample +USE MOD_LoadBalance_Vars ,ONLY: CurrentImbalance,PerformLBSample,ElemTimeFieldTot,ElemTimeField +USE MOD_LoadBalance_Vars ,ONLY: WeightSum !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT VARIABLES @@ -202,8 +203,15 @@ SUBROUTINE ComputeElemLoad() #ifdef PARTICLES INTEGER(KIND=8) :: HelpSum REAL :: stotalDepos,stotalParts,sTotalTracks,stotalSurfacefluxes,sTotalBCParts,sTotalSurfaceParts +REAL :: ElemTimePartElem #endif /*PARTICLES*/ +REAL :: ElemTimeFieldElem !==================================================================================================================================== +! Initialize +ElemTimeFieldTot = 0. +#ifdef PARTICLES + ElemTimePartTot = 0. +#endif /*PARTICLES*/ ! If elem times are calculated by time measurement (PerformLBSample) and no Partweight Loadbalance is enabled IF(PerformLBSample .AND. LoadBalanceSample.GT.0) THEN @@ -262,23 +270,25 @@ SUBROUTINE ComputeElemLoad() ! distribute times of different routines on elements with respective weightings DO iElem=1,PP_nElems - ! time used in dg routines + ! Time used in DG routines #if USE_HDG - ElemTime(iElem) = ElemTime(iElem) + tCurrent(LB_DG)*REAL(ElemHDGSides(iElem))/REAL(TotalHDGSides) & - + tCurrent(LB_DGANALYZE)/REAL(PP_nElems) + ElemTimeFieldElem = tCurrent(LB_DG)*REAL(ElemHDGSides(iElem))/REAL(TotalHDGSides) + tCurrent(LB_DGANALYZE)/REAL(PP_nElems) #else - ElemTime(iElem) = ElemTime(iElem) + (tCurrent(LB_DG) + tCurrent(LB_DGANALYZE))/REAL(PP_nElems) + ElemTimeFieldElem = (tCurrent(LB_DG) + tCurrent(LB_DGANALYZE))/REAL(PP_nElems) #endif /*USE_HDG*/ + #if !(USE_HDG) - ! time used in pml routines + ! Add time used in PML routines IF(DoPML)THEN - IF(ElemToPML(iElem).GT.0 ) ElemTime(iElem) = ElemTime(iElem) + tCurrent(LB_PML)/REAL(nPMLElems) + IF(ElemToPML(iElem).GT.0 ) ElemTimeFieldElem = ElemTimeFieldElem + tCurrent(LB_PML)/REAL(nPMLElems) END IF #endif /*USE_HDG*/ + ElemTime(iElem) = ElemTime(iElem) + ElemTimeFieldElem + ElemTimeField = ElemTimeField + ElemTimeFieldElem #ifdef PARTICLES ! add particle LB times to elements with respective weightings - ElemTime(iElem) = ElemTime(iElem) & + ElemTimePartElem = & + tCurrent(LB_ADAPTIVE) * nPartsPerBCElem(iElem)*sTotalBCParts & + tCurrent(LB_INTERPOLATION) * nPartsPerElem(iElem)*sTotalParts & + tCurrent(LB_PUSH) * nPartsPerElem(iElem)*sTotalParts & @@ -290,11 +300,51 @@ SUBROUTINE ComputeElemLoad() + tCurrent(LB_SURF) * nSurfacePartsPerElem(iElem)*stotalSurfaceParts ! e.g. 'shape_function', 'shape_function_1d', 'shape_function_cylindrical' IF(TRIM(DepositionType(1:MIN(14,LEN(TRIM(ADJUSTL(DepositionType)))))).EQ.'shape_function')THEN - ElemTime(iElem) = ElemTime(iElem) & + ElemTimePartElem = ElemTimePartElem & + tCurrent(LB_DEPOSITION) * nDeposPerElem(iElem)*stotalDepos END IF + + ElemTime(iElem) = ElemTime(iElem) + ElemTimePartElem + ElemTimePart = ElemTimePart + ElemTimePartElem +#else + ElemTimePart = 0. #endif /*PARTICLES*/ END DO ! iElem=1,PP_nElems + + !IF(mpiroot)THEN + !write(*,*) "" + !WRITE (*,*) "ComputeElemLoad =" + !END IF ! mpiroot + !IPWRITE(UNIT_StdOut,*) "SUM(ElemTime) =", SUM(ElemTime) + !IPWRITE (*,*) "ElemTimeField =", ElemTimeField + !IPWRITE (*,*) "ElemTimePart =", ElemTimePart + !IPWRITE(UNIT_StdOut,*) "ElemTimeField+ElemTimePart =", ElemTimeField+ElemTimePart + ! Collect ElemTime for particles and field separately (only on root process) + CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + WeightSum = ElemTimeFieldTot ! only correct on MPI root + !IF(MPIROOT)THEN + !write(*,*) "" + !IPWRITE (*,*) "WeightSum =", WeightSum + !IPWRITE (*,*) "ElemTimeFieldTot =", ElemTimeFieldTot + !END IF ! MPIROOT +#ifdef PARTICLES + CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root + !IF(MPIROOT)THEN + !IPWRITE (*,*) "WeightSum =", WeightSum + !IPWRITE (*,*) "ElemTimePartTot =", ElemTimePartTot + !write(*,*) "" + !END IF ! MPIROOT +#else + ElemTimePartTot = 0. +#endif /*PARTICLES*/ + ! send WeightSum from MPI root to all other procs + CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) + !IF(MPIroot)THEN + !IPWRITE (*,*) "ALL MPI_BCAST(WeightSum =", WeightSum + !END IF ! MPIroot + + #ifdef PARTICLES ! If no Elem times are calculated but Partweight Loadbalance is enabled ELSE IF(PerformLBSample .AND. LoadBalanceSample.EQ.0) THEN @@ -302,8 +352,7 @@ SUBROUTINE ComputeElemLoad() nLoadBalance=nLoadBalance+1 ! no time measurement and particles are present: simply add the ParticleMPIWeight times the number of particles present DO iElem=1,PP_nElems - ElemTime(iElem) = ElemTime(iElem) & - + nPartsPerElem(iElem)*ParticleMPIWeight + 1.0 + ElemTime(iElem) = ElemTime(iElem) + nPartsPerElem(iElem)*ParticleMPIWeight + 1.0 END DO ! iElem=1,PP_nElems IF((MAXVAL(nPartsPerElem).GT.0).AND.(MAXVAL(ElemTime).LE.1.0))THEN IPWRITE (*,*) "parts, time =", MAXVAL(nPartsPerElem),MAXVAL(ElemTime) @@ -340,7 +389,7 @@ END SUBROUTINE ComputeElemLoad SUBROUTINE LoadBalance() !=================================================================================================================================== -! routine perfoming the load balancing stuff +! routine performing the load balancing stuff !=================================================================================================================================== ! USED MODULES USE MOD_Globals @@ -352,9 +401,11 @@ SUBROUTINE LoadBalance() #ifdef PARTICLES USE MOD_PICDepo_Vars ,ONLY: DepositionType USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart #endif /*PARTICLES*/ USE MOD_LoadBalance_Vars ,ONLY: CurrentImbalance, MaxWeight, MinWeight USE MOD_LoadBalance_Vars ,ONLY: Currentimbalance, PerformLoadBalance +USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -370,10 +421,16 @@ SUBROUTINE LoadBalance() IF(.NOT.PerformLoadBalance) THEN ElemTime=0. InitializationWallTime=0. +#ifdef PARTICLES + ElemTimePart = 0. +#endif /*PARTICLES*/ + ElemTimeField = 0. RETURN END IF -SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_StdOut,'(X)') +SWRITE(UNIT_StdOut,'(X)') +SWRITE(UNIT_StdOut,'(132("="))') SWRITE(UNIT_stdOut,'(A)') ' PERFORMING LOAD BALANCE ...' ! Measure init duration LB_StartTime=PICLASTIME() @@ -392,16 +449,24 @@ SUBROUTINE LoadBalance() ! zero ElemTime, the measurement starts again ElemTime=0. +#ifdef PARTICLES +ElemTimePart = 0. +#endif /*PARTICLES*/ +ElemTimeField = 0. IF( NewImbalance.GT.CurrentImbalance ) THEN SWRITE(UNIT_stdOut,'(A)') ' WARNING: LoadBalance not successful!' ELSE SWRITE(UNIT_stdOut,'(A)') ' LoadBalance successful!' END IF -SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' OldImbalance: ', CurrentImbalance -SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance -SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight -SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight +!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' OldImbalance: ', CurrentImbalance +!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance +!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight +!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight + + SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3)')& + ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' OldImbalance: ', CurrentImbalance,' NewImbalance: ',& + NewImbalance #ifdef PARTICLES ! e.g. 'shape_function', 'shape_function_1d', 'shape_function_cylindrical' @@ -447,25 +512,43 @@ SUBROUTINE ComputeImbalance() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +REAL :: WeightSum_loc !=================================================================================================================================== +!write(*,*) "" +!IF(mpiroot)THEN + !write(*,*) "COMPUTE IMBALANCE" +!END IF ! mpiroot IF(.NOT.PerformLBSample .AND. .NOT.PerformPartWeightLB) THEN WeightSum = 0. TargetWeight = 0. CurrentImbalance = -1.0 ELSE - WeightSum=SUM(ElemTime) + WeightSum_loc=SUM(ElemTime) + !IPWRITE(UNIT_StdOut,*) "SUM(ElemTime) =", SUM(ElemTime) - IF(ALMOSTZERO(WeightSum))THEN - IPWRITE(*,*) 'Info: The measured time of all elems is zero. ALMOSTZERO(WeightSum)=.TRUE., WeightSum=',WeightSum + IF(ALMOSTZERO(WeightSum_loc))THEN + IPWRITE(*,*) 'Info: The measured time of all elems is zero. ALMOSTZERO(WeightSum)=.TRUE., SUM(ElemTime)=',WeightSum_loc END IF - CALL MPI_ALLREDUCE(WeightSum,TargetWeight,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) - CALL MPI_ALLREDUCE(WeightSum,MaxWeight ,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,iError) - CALL MPI_ALLREDUCE(WeightSum,MinWeight ,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) - - WeightSum = TargetWeight ! Set total weight for writing to file - TargetWeight = TargetWeight/nProcessors ! Calculate the average value that is supposed to be the optimally distributed weight + !CALL MPI_ALLREDUCE(WeightSum_loc,TargetWeight,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(WeightSum_loc,MaxWeight ,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(WeightSum_loc,MinWeight ,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) + + !WeightSum = TargetWeight ! Set total weight for writing to file + !IF(MPIRoot)THEN + ! These two must be equal! + !IPWRITE(UNIT_StdOut,*) "WeightSum (TargetWeight) =", TargetWeight + !IPWRITE(UNIT_StdOut,*) "WeightSum (WeightSum) =", WeightSum + !END IF ! MPIRoot + !CALL abort(& + !__STAMP__& + !,'yolo') + ! Old (ALLREDUCE of sum(ElemTime) on TargetWeight) + !TargetWeight = TargetWeight/nProcessors ! Calculate the average value that is supposed to be the optimally distributed weight + + ! New + TargetWeight = WeightSum/nProcessors ! Calculate the average value that is supposed to be the optimally distributed weight !IF(ALMOSTZERO(WeightSum))CALL abort( __STAMP__& !,' ERROR: after ALLREDUCE, weight sum cannot be zero! WeightSum=',RealInfoOpt=WeightSum) @@ -480,11 +563,13 @@ SUBROUTINE ComputeImbalance() ELSE CurrentImbalance = (MaxWeight-TargetWeight ) / TargetWeight END IF - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7,A,ES15.7,A1)') ' CurrentImbalance: ', CurrentImbalance, ' (Threshold: ', DeviationThreshold, ')' - + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7,A,ES15.7,A1)') ' CurrentImbalance: ', CurrentImbalance, ' (Threshold: ', DeviationThreshold, ')' + SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3,A,ES8.2,A)')& + ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' TargetWeight: ', TargetWeight,' CurrentImbalance: ',& + CurrentImbalance, ' (Threshold: ', DeviationThreshold, ')' END IF END SUBROUTINE ComputeImbalance diff --git a/src/loadbalance/loadbalance_timers.f90 b/src/loadbalance/loadbalance_timers.f90 index 0a711daf7..567bd4566 100644 --- a/src/loadbalance/loadbalance_timers.f90 +++ b/src/loadbalance/loadbalance_timers.f90 @@ -134,40 +134,47 @@ SUBROUTINE LBPauseTime(LB_index,tLBStart) END SUBROUTINE LBPauseTime +#ifdef PARTICLES SUBROUTINE LBElemSplitTime(ElemID,tLBStart) !=================================================================================================================================== -!> Splits the time and resets LB_start. Adds time to Elemtime(ElemID) +!> Measure particle-related times for specific elements. Splits the time and resets LB_start. +!> Adds time to Elemtime(ElemID) and ElemTimePart. !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: LOCALTIME +USE MOD_Globals ,ONLY: LOCALTIME,abort USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES -INTEGER,INTENT(IN) :: ElemID -REAL,INTENT(INOUT) :: tLBStart +INTEGER,INTENT(IN) :: ElemID ! Element ID +REAL,INTENT(INOUT) :: tLBStart ! Time when timer was started !----------------------------------------------------------------------------------------------------------------------------------! ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------! ! LOCAL VARIABLES -REAL :: tLBEnd +REAL :: tLBEnd,DeltaTime !=================================================================================================================================== IF(.NOT. PerformLBSample) RETURN -tLBEnd = LOCALTIME() ! LB Time End -ElemTime(ELemID)=ElemTime(ElemID)+tLBEnd-tLBStart -tLBStart = tLBEnd !LOCALTIME() ! LB Time Start +tLBEnd = LOCALTIME() ! LB Time End +DeltaTime = tLBEnd-tLBStart +ElemTime(ELemID) = ElemTime(ElemID) + DeltaTime +ElemTimePart = ElemTimePart + DeltaTime +tLBStart = tLBEnd !LOCALTIME() ! LB Time Start END SUBROUTINE LBElemSplitTime SUBROUTINE LBElemPauseTime(ElemID,tLBStart) !=================================================================================================================================== -!> calculates end time and adds time to Elemtime(ElemID) -!> does not reset tLBstart +!> Measure particle-related times for specific elements. +!> Calculates end time and adds time to Elemtime(ElemID) and ElemTimePart. +!> Does not reset tLBstart !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals ,ONLY: LOCALTIME USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -177,23 +184,27 @@ SUBROUTINE LBElemPauseTime(ElemID,tLBStart) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------! ! LOCAL VARIABLES -REAL :: tLBEnd +REAL :: tLBEnd,DeltaTime !=================================================================================================================================== IF(.NOT. PerformLBSample) RETURN tLBEnd = LOCALTIME() ! LB Time End -ElemTime(ELemID)=ElemTime(ElemID)+tLBEnd-tLBStart +DeltaTime = tLBEnd-tLBStart +ElemTime(ELemID) = ElemTime(ElemID) + DeltaTime +ElemTimePart = ElemTimePart + DeltaTime END SUBROUTINE LBElemPauseTime SUBROUTINE LBElemPauseTime_avg(tLBStart) !=================================================================================================================================== -!> calculates end time and adds time to Elemtime(ElemID) -!> does not reset tLBstart +!> Measure particle-related times for all elements (averaged). +!> Calculates end time and adds time to Elemtime(ElemID) and ElemTimePart. +!> Does not reset tLBstart !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals ,ONLY: LOCALTIME USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -202,24 +213,27 @@ SUBROUTINE LBElemPauseTime_avg(tLBStart) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------! ! LOCAL VARIABLES -REAL :: tLBEnd +REAL :: tLBEnd,DeltaTime !=================================================================================================================================== IF(.NOT. PerformLBSample) RETURN tLBEnd = LOCALTIME() ! LB Time End -ElemTime(:)=ElemTime(:)+(tLBEnd-tLBStart)/nElems +DeltaTime = (tLBEnd-tLBStart) +ElemTime(:) = ElemTime(:) + DeltaTime/nElems +ElemTimePart = ElemTimePart + DeltaTime END SUBROUTINE LBElemPauseTime_avg SUBROUTINE LBElemSplitTime_avg(tLBStart) !=================================================================================================================================== -!> calculates end time and adds time to Elemtime(ElemID) -!> and resets tLBstart +!> Measure particle-related times for all elements (averaged). +!> Calculates end time and adds time to Elemtime(ElemID) and ElemTimePart and resets tLBstart !=================================================================================================================================== ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals ,ONLY: LOCALTIME USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -228,13 +242,16 @@ SUBROUTINE LBElemSplitTime_avg(tLBStart) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------! ! LOCAL VARIABLES -REAL :: tLBEnd +REAL :: tLBEnd,DeltaTime !=================================================================================================================================== IF(.NOT. PerformLBSample) RETURN tLBEnd = LOCALTIME() ! LB Time End -ElemTime(:)=ElemTime(:)+(tLBEnd-tLBStart)/nElems +DeltaTime = (tLBEnd-tLBStart) +ElemTime(:) = ElemTime(:) + DeltaTime/nElems +ElemTimePart = ElemTimePart + DeltaTime tLBStart = tLBEnd !LOCALTIME() ! LB Time Start END SUBROUTINE LBElemSplitTime_avg +#endif /*PARTICLES*/ END MODULE MOD_LoadBalance_Timers diff --git a/src/loadbalance/loadbalance_tools.f90 b/src/loadbalance/loadbalance_tools.f90 index d857befad..f3197968f 100644 --- a/src/loadbalance/loadbalance_tools.f90 +++ b/src/loadbalance/loadbalance_tools.f90 @@ -46,7 +46,7 @@ SUBROUTINE DomainDecomposition() USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems #if USE_HDG && USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: ElemHDGSides,TotalHDGSides +USE MOD_LoadBalance_Vars ,ONLY: ElemHDGSides,TotalHDGSides,ElemTimePart,ElemTimeField USE MOD_Analyze_Vars ,ONLY: CalcMeshInfo #endif /*USE_HDG && USE_LOADBALANCE*/ USE MOD_MPI_Vars ,ONLY: offsetElemMPI @@ -70,7 +70,8 @@ SUBROUTINE DomainDecomposition() INTEGER :: iProc INTEGER :: iElem !=================================================================================================================================== - +SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_stdOut,'(A)')' DOMAIN DECOMPOSITION ...' !simple partition: nGlobalelems/nprocs, do this on proc 0 SDEALLOCATE(offsetElemMPI) ALLOCATE(offsetElemMPI(0:nProcessors)) @@ -163,7 +164,11 @@ SUBROUTINE DomainDecomposition() ! Set new ElemTime depending on new load distribution SDEALLOCATE(ElemTime) ALLOCATE(ElemTime(1:nElems)) -ElemTime = 0. +ElemTime=0. +#ifdef PARTICLES +ElemTimePart = 0. +#endif /*PARTICLES*/ +ElemTimeField = 0. CALL AddToElemData(ElementOut,'ElemTime',RealArray=ElemTime(1:nElems)) ! Calculate new (theoretical) imbalance with offsetElemMPI information @@ -185,10 +190,13 @@ SUBROUTINE DomainDecomposition() __STAMP__, & ' LoadBalance: TargetWeight = ',RealInfoOpt=TargetWeight) SWRITE(UNIT_stdOut,'(A)') ' Calculated new (theoretical) imbalance with offsetElemMPI information' - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight - SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight + !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance + SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3)')& + ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' TargetWeight: ', TargetWeight,' NewImbalance: ',& + NewImbalance DEALLOCATE(WeightSum_proc) ELSE SWRITE(UNIT_stdOut,'(A)') ' No ElemTime found in restart file' @@ -196,8 +204,8 @@ SUBROUTINE DomainDecomposition() MaxWeight = -1. MinWeight = -1. END IF - - +SWRITE(UNIT_stdOut,'(A)')' DOMAIN DECOMPOSITION DONE!' +SWRITE(UNIT_StdOut,'(132("-"))') END SUBROUTINE DomainDecomposition diff --git a/src/loadbalance/loadbalance_vars.f90 b/src/loadbalance/loadbalance_vars.f90 index c473e28a8..de95b636d 100644 --- a/src/loadbalance/loadbalance_vars.f90 +++ b/src/loadbalance/loadbalance_vars.f90 @@ -71,10 +71,14 @@ MODULE MOD_LoadBalance_Vars ! Element Local measurement !----------------------------------------------------------------------------------------------------------------------------------- REAL,ALLOCATABLE :: ElemTime(:) -REAL,ALLOCATABLE :: ElemTime_tmp(:) ! Additional container for restarting and keeping the old ElemTime values in - ! the state.h5 file -INTEGER,ALLOCATABLE :: ElemHDGSides(:) ! number of master sides for the HDG solver for each element -INTEGER :: TotalHDGSides ! total number of master sides for the HDG solver over all local elements +REAL,ALLOCATABLE :: ElemTime_tmp(:) ! Additional container for restarting and keeping the old ElemTime values in + ! the state.h5 file +REAL :: ElemTimePartTot ! Total time spent for particle routines (all procs) +REAL :: ElemTimeFieldTot ! Total time spent for field routines (all procs) +REAL :: ElemTimePart ! Time spent for particle routines +REAL :: ElemTimeField ! Time spent for field routines +INTEGER,ALLOCATABLE :: ElemHDGSides(:) ! number of master sides for the HDG solver for each element +INTEGER :: TotalHDGSides ! total number of master sides for the HDG solver over all local elements REAL,ALLOCATABLE :: ElemGlobalTime(:) INTEGER(KIND=8),ALLOCATABLE :: nPartsPerElem(:) INTEGER(KIND=8),ALLOCATABLE :: nDeposPerElem(:) diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 996657cba..0b4fe25f0 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1108,6 +1108,10 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Globals ,ONLY: abort USE MOD_Globals ,ONLY: nProcessors +USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField +#ifdef PARTICLES +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart +#endif /*PARTICLES*/ !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -1119,24 +1123,29 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) REAL :: time_loc CHARACTER(LEN=22),PARAMETER :: outfile='ElemTimeStatistics.csv' INTEGER :: ioUnit,I -CHARACTER(LEN=50) :: formatStr -INTEGER,PARAMETER :: nOutputVar=12 +CHARACTER(LEN=150) :: formatStr +INTEGER,PARAMETER :: nOutputVar=16 CHARACTER(LEN=255),DIMENSION(nOutputVar) :: StrVarNames(nOutputVar)=(/ CHARACTER(LEN=255) :: & - 'time', & - 'Procs', & - 'MinWeight', & - 'MaxWeight', & - 'CurrentImbalance', & - 'TargetWeight (mean)', & - 'nLoadBalanceSteps', & - 'WeightSum', & - 'SimulationEfficiency',& - 'PID', & - 'SimulationWallTime',& - 'InitializationWallTime'/) + 'time', & + 'Procs', & + 'MinWeight', & + 'MaxWeight', & + 'CurrentImbalance', & + 'TargetWeight (mean)', & + 'nLoadBalanceSteps', & + 'WeightSum', & + 'SimulationEfficiency', & + 'PID', & + 'SimulationWallTime', & + 'InitializationWallTime', & + 'FieldTime', & + 'PartTime', & + 'FieldTimePercent', & + 'PartTimePercent'/) CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called mutiple times at the beginning CHARACTER(LEN=1000) :: tmpStr2 CHARACTER(LEN=1),PARAMETER :: delimiter="," +REAL :: SumElemTime,ElemTimeFieldPercent,ElemTimePartPercent !=================================================================================================================================== IF(.NOT.MPIRoot)RETURN @@ -1175,6 +1184,21 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) ELSE time_loc=time END IF + ! Calculate elem time proportions for field and particle routines + SumElemTime=ElemTimeField +#ifdef PARTICLES + SumElemTime=SumElemTime+ElemTimePart +#endif /*PARTICLES*/ + IF(SumElemTime.LE.0.)THEN + ElemTimeFieldPercent = 0. + ElemTimePartPercent = 0. + ELSE + ElemTimeFieldPercent = 100. * ElemTimeField / SumElemTime +#ifdef PARTICLES + ElemTimePartPercent = 100. * ElemTimePart / SumElemTime +#endif /*PARTICLES*/ + END IF ! ElemTimeField+ElemTimePart.LE.0. + IF(FILEEXISTS(outfile))THEN OPEN(NEWUNIT=ioUnit,FILE=TRIM(outfile),POSITION="APPEND",STATUS="OLD") WRITE(formatStr,'(A2,I2,A14,A1)')'(',nOutputVar,CSVFORMAT,')' @@ -1190,7 +1214,11 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) delimiter,SimulationEfficiency,& delimiter,PID,& delimiter,WallTime,& - delimiter,InitializationWallTime + delimiter,InitializationWallTime,& + delimiter,ElemTimeField,& + delimiter,ElemTimePart,& + delimiter,ElemTimeFieldPercent,& + delimiter,ElemTimePartPercent WRITE(ioUnit,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the data line CLOSE(ioUnit) ELSE diff --git a/src/particles/pic/deposition/pic_depo.f90 b/src/particles/pic/deposition/pic_depo.f90 index ba7cb3468..90238aca8 100644 --- a/src/particles/pic/deposition/pic_depo.f90 +++ b/src/particles/pic/deposition/pic_depo.f90 @@ -1351,8 +1351,7 @@ SUBROUTINE Deposition(DoInnerParts,doParticle_In) USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange #endif /*USE_MPI*/ #if USE_LOADBALANCE -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg -USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime #endif /*USE_LOADBALANCE*/ USE MOD_PICDepo_Method ,ONLY: DepositionMethod !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/particles/pic/deposition/pic_depo_method.f90 b/src/particles/pic/deposition/pic_depo_method.f90 index 99f9159dc..3a366e797 100644 --- a/src/particles/pic/deposition/pic_depo_method.f90 +++ b/src/particles/pic/deposition/pic_depo_method.f90 @@ -234,8 +234,7 @@ SUBROUTINE DepositionMethod_NGP(FirstPart,LastPart,DoInnerParts,doPartInExists,d USE MOD_Particle_Vars ,ONLY: PartState !#endif #if USE_LOADBALANCE -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg -USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemSplitTime,LBElemPauseTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Interpolation_Vars ,ONLY: wGP USE MOD_Mesh_Vars ,ONLY: sJ @@ -377,7 +376,7 @@ SUBROUTINE DepositionMethod_NBC(FirstPart,LastPart,DoInnerParts,doPartInExists,d USE MOD_PICDepo_Vars ,ONLY: PartSource USE MOD_Particle_Mesh_Vars ,ONLY: GEO #if USE_LOADBALANCE -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemSplitTime,LBElemPauseTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Part_Tools ,ONLY: isDepositParticle @@ -494,7 +493,7 @@ SUBROUTINE DepositionMethod_CVW(FirstPart,LastPart,DoInnerParts,doPartInExists,d USE MOD_PICDepo_Vars ,ONLY: PartSource,CellVolWeight_Volumes USE MOD_Part_Tools ,ONLY: isDepositParticle #if USE_LOADBALANCE -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemSplitTime,LBElemPauseTime_avg USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Mesh_Vars ,ONLY: nElems @@ -1107,8 +1106,7 @@ SUBROUTINE DepositionMethod_SF1D(FirstPart,LastPart,DoInnerParts,doPartInExists, #endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: nDeposPerElem -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg -USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemSplitTime,LBElemPauseTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Mesh_Vars ,ONLY: NbrOfCases,casematrix @@ -1384,8 +1382,7 @@ SUBROUTINE DepositionMethod_SF2D(FirstPart,LastPart,DoInnerParts,doPartInExists, #endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: nDeposPerElem -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg -USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemSplitTime,LBElemPauseTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Particle_Mesh_Vars ,ONLY: GEO,casematrix, NbrOfCases USE MOD_Mesh_Vars ,ONLY: nElems @@ -1725,8 +1722,7 @@ SUBROUTINE DepositionMethod_SFCS(FirstPart,LastPart,DoInnerParts,doPartInExists, USE MOD_PICDepo_Vars ,ONLY: ElemDepo_xGP,DoSFEqui,alpha_sf,w_sf #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: nDeposPerElem -USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime,LBElemSplitTime,LBElemPauseTime_avg -USE MOD_LoadBalance_Timers ,ONLY: LBElemSplitTime_avg +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBElemPauseTime_avg #endif /*USE_LOADBALANCE*/ USE MOD_Particle_Mesh_Vars ,ONLY: GEO,casematrix, NbrOfCases #if USE_MPI diff --git a/src/precond/precond.f90 b/src/precond/precond.f90 index 8cf351d6e..9bd829ce1 100644 --- a/src/precond/precond.f90 +++ b/src/precond/precond.f90 @@ -177,7 +177,7 @@ SUBROUTINE BuildPrecond(t,tStage,tDeriv,alpha,dt) #endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLBSample -USE MOD_LoadBalance_Vars ,ONLY: ElemTime +USE MOD_LoadBalance_Vars ,ONLY: ElemTime,ElemTimeField #endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -199,6 +199,9 @@ SUBROUTINE BuildPrecond(t,tStage,tDeriv,alpha,dt) #if USE_MPI REAL :: TotalTimeMPI(3) #endif /*USE_MPI*/ +#if USE_LOADBALANCE +REAL :: ElemTimePrecond +#endif /*USE_LOADBALANCE*/ !=================================================================================================================================== IF(PrecondType.EQ.0) RETURN !NO PRECONDITIONER @@ -364,7 +367,9 @@ SUBROUTINE BuildPrecond(t,tStage,tDeriv,alpha,dt) TotalTime=TotalTime+(TimeEnd-TimeStart) #if USE_LOADBALANCE IF(PerformLBSample)THEN - ElemTime(iElem)=ElemTime(iElem)+SUM(TimeEnd(1:2)-TimeStart(1:2)) + ElemTimePrecond = SUM(TimeEnd(1:2)-TimeStart(1:2)) + ElemTimeField = ElemTimeField +ElemTimePrecond + ElemTime(iElem) = ElemTime(iElem)+ElemTimePrecond END IF #endif /*USE_LOADBALANCE*/ IF((PrecondType.LE.2).AND.DebugMatrix.NE.0)THEN diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index f85152edd..06ecfbfb9 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -299,6 +299,7 @@ SUBROUTINE TimeDisc() USE MOD_LoadBalance_Vars ,ONLY: LoadBalanceSample,PerformLBSample,PerformLoadBalance,LoadBalanceMaxSteps,nLoadBalanceSteps USE MOD_Restart_Vars ,ONLY: DoInitialAutoRestart,InitialAutoRestartSample,IAR_PerformPartWeightLB USE MOD_Particle_Vars ,ONLY: WriteMacroVolumeValues, WriteMacroSurfaceValues, MacroValSampTime +USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField #endif /*USE_LOADBALANCE*/ #endif /*USE_MPI*/ #ifdef PARTICLES @@ -321,6 +322,7 @@ SUBROUTINE TimeDisc() USE MOD_Particle_Tracking_vars ,ONLY: tTracking,tLocalization,nTracks,MeasureTrackTime #if (USE_MPI) && (USE_LOADBALANCE) && defined(PARTICLES) USE MOD_DSMC_Vars ,ONLY: DSMC +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart #endif /* USE_LOADBALANCE && PARTICLES*/ USE MOD_Part_Emission ,ONLY: AdaptiveBCAnalyze USE MOD_Particle_Boundary_Vars ,ONLY: nAdaptiveBC, nPorousBC @@ -669,6 +671,10 @@ SUBROUTINE TimeDisc() END IF ELSE ElemTime=0. ! nullify ElemTime before measuring the time in the next cycle +#ifdef PARTICLES + ElemTimePart = 0. +#endif /*PARTICLES*/ + ElemTimeField = 0. END IF PerformLBSample=.FALSE. IF (DoInitialAutoRestart) THEN From 4ac9fab96ae2775ff9c52245b0eee74a3aeabf3b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 18 Jun 2020 22:06:50 +0200 Subject: [PATCH 37/74] fixed PARTICLE=OFF and Maxwell + clean-up --- src/loadbalance/loadbalance.f90 | 47 ++-------------------- src/loadbalance/loadbalance_timers.f90 | 15 +++++-- src/loadbalance/loadbalance_tools.f90 | 12 +++--- src/loadbalance/loaddistribution.f90 | 54 +++++++++++++++----------- 4 files changed, 54 insertions(+), 74 deletions(-) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index c55c6f833..1c2c4b6be 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -306,43 +306,18 @@ SUBROUTINE ComputeElemLoad() ElemTime(iElem) = ElemTime(iElem) + ElemTimePartElem ElemTimePart = ElemTimePart + ElemTimePartElem -#else - ElemTimePart = 0. #endif /*PARTICLES*/ END DO ! iElem=1,PP_nElems - !IF(mpiroot)THEN - !write(*,*) "" - !WRITE (*,*) "ComputeElemLoad =" - !END IF ! mpiroot - !IPWRITE(UNIT_StdOut,*) "SUM(ElemTime) =", SUM(ElemTime) - !IPWRITE (*,*) "ElemTimeField =", ElemTimeField - !IPWRITE (*,*) "ElemTimePart =", ElemTimePart - !IPWRITE(UNIT_StdOut,*) "ElemTimeField+ElemTimePart =", ElemTimeField+ElemTimePart ! Collect ElemTime for particles and field separately (only on root process) CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) WeightSum = ElemTimeFieldTot ! only correct on MPI root - !IF(MPIROOT)THEN - !write(*,*) "" - !IPWRITE (*,*) "WeightSum =", WeightSum - !IPWRITE (*,*) "ElemTimeFieldTot =", ElemTimeFieldTot - !END IF ! MPIROOT #ifdef PARTICLES CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root - !IF(MPIROOT)THEN - !IPWRITE (*,*) "WeightSum =", WeightSum - !IPWRITE (*,*) "ElemTimePartTot =", ElemTimePartTot - !write(*,*) "" - !END IF ! MPIROOT -#else - ElemTimePartTot = 0. #endif /*PARTICLES*/ ! send WeightSum from MPI root to all other procs CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) - !IF(MPIroot)THEN - !IPWRITE (*,*) "ALL MPI_BCAST(WeightSum =", WeightSum - !END IF ! MPIroot #ifdef PARTICLES @@ -455,18 +430,12 @@ SUBROUTINE LoadBalance() ElemTimeField = 0. IF( NewImbalance.GT.CurrentImbalance ) THEN - SWRITE(UNIT_stdOut,'(A)') ' WARNING: LoadBalance not successful!' + SWRITE(UNIT_stdOut,'(A)') ' WARNING: LoadBalance not successful! Determined new (theoretical) imbalance from elem distribution' ELSE - SWRITE(UNIT_stdOut,'(A)') ' LoadBalance successful!' + SWRITE(UNIT_stdOut,'(A)') ' LoadBalance successful! Determined new (theoretical) imbalance from elem distribution' END IF -!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' OldImbalance: ', CurrentImbalance -!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance -!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight -!SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight - - SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3)')& - ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' OldImbalance: ', CurrentImbalance,' NewImbalance: ',& - NewImbalance +SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3)')& + ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' OldImbalance: ', CurrentImbalance,' NewImbalance: ', NewImbalance #ifdef PARTICLES ! e.g. 'shape_function', 'shape_function_1d', 'shape_function_cylindrical' @@ -514,10 +483,6 @@ SUBROUTINE ComputeImbalance() ! LOCAL VARIABLES REAL :: WeightSum_loc !=================================================================================================================================== -!write(*,*) "" -!IF(mpiroot)THEN - !write(*,*) "COMPUTE IMBALANCE" -!END IF ! mpiroot IF(.NOT.PerformLBSample .AND. .NOT.PerformPartWeightLB) THEN WeightSum = 0. @@ -563,10 +528,6 @@ SUBROUTINE ComputeImbalance() ELSE CurrentImbalance = (MaxWeight-TargetWeight ) / TargetWeight END IF - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7,A,ES15.7,A1)') ' CurrentImbalance: ', CurrentImbalance, ' (Threshold: ', DeviationThreshold, ')' SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3,A,ES8.2,A)')& ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' TargetWeight: ', TargetWeight,' CurrentImbalance: ',& CurrentImbalance, ' (Threshold: ', DeviationThreshold, ')' diff --git a/src/loadbalance/loadbalance_timers.f90 b/src/loadbalance/loadbalance_timers.f90 index 567bd4566..5eed987f7 100644 --- a/src/loadbalance/loadbalance_timers.f90 +++ b/src/loadbalance/loadbalance_timers.f90 @@ -36,6 +36,7 @@ MODULE MOD_LoadBalance_Timers MODULE PROCEDURE LBPauseTime END INTERFACE +#ifdef PARTICLES INTERFACE LBElemSplitTime MODULE PROCEDURE LBElemSplitTime END INTERFACE @@ -52,16 +53,20 @@ MODULE MOD_LoadBalance_Timers MODULE PROCEDURE LBElemSplitTime_avg END INTERFACE -PUBLIC::LBStartTime -PUBLIC::LBSplitTime -PUBLIC::LBPauseTime PUBLIC::LBElemSplitTime PUBLIC::LBElemPauseTime PUBLIC::LBElemPauseTime_avg PUBLIC::LBElemSplitTime_avg + +#endif /*PARTICLES*/ + +PUBLIC::LBStartTime +PUBLIC::LBSplitTime +PUBLIC::LBPauseTime CONTAINS + SUBROUTINE LBStartTime(tLBStart) !=================================================================================================================================== !> calculates and sets start time for Loadbalance. @@ -83,6 +88,7 @@ SUBROUTINE LBStartTime(tLBStart) tLBStart = LOCALTIME() ! LB Time Start END SUBROUTINE LBStartTime + SUBROUTINE LBSplitTime(LB_index,tLBStart) !=================================================================================================================================== !> Splits the time and resets LB_start. Adds time to tcurrent(LB_index) for current proc @@ -108,6 +114,7 @@ SUBROUTINE LBSplitTime(LB_index,tLBStart) tLBStart = tLBEnd !LOCALTIME() ! LB Time Start END SUBROUTINE LBSplitTime + SUBROUTINE LBPauseTime(LB_index,tLBStart) !=================================================================================================================================== !> calculates end time and adds time to tcurrent(LB_index) for current proc @@ -164,6 +171,7 @@ SUBROUTINE LBElemSplitTime(ElemID,tLBStart) tLBStart = tLBEnd !LOCALTIME() ! LB Time Start END SUBROUTINE LBElemSplitTime + SUBROUTINE LBElemPauseTime(ElemID,tLBStart) !=================================================================================================================================== !> Measure particle-related times for specific elements. @@ -193,6 +201,7 @@ SUBROUTINE LBElemPauseTime(ElemID,tLBStart) ElemTimePart = ElemTimePart + DeltaTime END SUBROUTINE LBElemPauseTime + SUBROUTINE LBElemPauseTime_avg(tLBStart) !=================================================================================================================================== !> Measure particle-related times for all elements (averaged). diff --git a/src/loadbalance/loadbalance_tools.f90 b/src/loadbalance/loadbalance_tools.f90 index f3197968f..e4b6abc0e 100644 --- a/src/loadbalance/loadbalance_tools.f90 +++ b/src/loadbalance/loadbalance_tools.f90 @@ -45,8 +45,14 @@ SUBROUTINE DomainDecomposition() USE MOD_Globals USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField +#ifdef PARTICLES +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart +#endif /*PARTICLES*/ +#endif /*USE_LOADBALANCE*/ #if USE_HDG && USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: ElemHDGSides,TotalHDGSides,ElemTimePart,ElemTimeField +USE MOD_LoadBalance_Vars ,ONLY: ElemHDGSides,TotalHDGSides USE MOD_Analyze_Vars ,ONLY: CalcMeshInfo #endif /*USE_HDG && USE_LOADBALANCE*/ USE MOD_MPI_Vars ,ONLY: offsetElemMPI @@ -190,10 +196,6 @@ SUBROUTINE DomainDecomposition() __STAMP__, & ' LoadBalance: TargetWeight = ',RealInfoOpt=TargetWeight) SWRITE(UNIT_stdOut,'(A)') ' Calculated new (theoretical) imbalance with offsetElemMPI information' - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MaxWeight: ', MaxWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' MinWeight: ', MinWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' TargetWeight: ', TargetWeight - !SWRITE(UNIT_stdOut,'(A25,ES15.7)') ' NewImbalance: ', NewImbalance SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3)')& ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' TargetWeight: ', TargetWeight,' NewImbalance: ',& NewImbalance diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 0b4fe25f0..94afcc9af 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1124,28 +1124,35 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) CHARACTER(LEN=22),PARAMETER :: outfile='ElemTimeStatistics.csv' INTEGER :: ioUnit,I CHARACTER(LEN=150) :: formatStr +#ifdef PARTICLES +REAL :: SumElemTime,ElemTimeFieldPercent,ElemTimePartPercent INTEGER,PARAMETER :: nOutputVar=16 +#else +INTEGER,PARAMETER :: nOutputVar=12 +#endif /*PARTICLES*/ CHARACTER(LEN=255),DIMENSION(nOutputVar) :: StrVarNames(nOutputVar)=(/ CHARACTER(LEN=255) :: & - 'time', & - 'Procs', & - 'MinWeight', & - 'MaxWeight', & - 'CurrentImbalance', & - 'TargetWeight (mean)', & - 'nLoadBalanceSteps', & - 'WeightSum', & - 'SimulationEfficiency', & - 'PID', & - 'SimulationWallTime', & - 'InitializationWallTime', & - 'FieldTime', & - 'PartTime', & - 'FieldTimePercent', & - 'PartTimePercent'/) + 'time' , & + 'Procs' , & + 'MinWeight' , & + 'MaxWeight' , & + 'CurrentImbalance' , & + 'TargetWeight (mean)' , & + 'nLoadBalanceSteps' , & + 'WeightSum' , & + 'SimulationEfficiency' , & + 'PID' , & + 'SimulationWallTime' , & + 'InitializationWallTime' & +#ifdef PARTICLES + , 'FieldTime' , & + 'PartTime' , & + 'FieldTimePercent' , & + 'PartTimePercent' & +#endif /*PARTICLES*/ + /) CHARACTER(LEN=255),DIMENSION(nOutputVar) :: tmpStr ! needed because PerformAnalyze is called mutiple times at the beginning CHARACTER(LEN=1000) :: tmpStr2 CHARACTER(LEN=1),PARAMETER :: delimiter="," -REAL :: SumElemTime,ElemTimeFieldPercent,ElemTimePartPercent !=================================================================================================================================== IF(.NOT.MPIRoot)RETURN @@ -1184,20 +1191,18 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) ELSE time_loc=time END IF +#ifdef PARTICLES ! Calculate elem time proportions for field and particle routines SumElemTime=ElemTimeField -#ifdef PARTICLES SumElemTime=SumElemTime+ElemTimePart -#endif /*PARTICLES*/ IF(SumElemTime.LE.0.)THEN ElemTimeFieldPercent = 0. ElemTimePartPercent = 0. ELSE ElemTimeFieldPercent = 100. * ElemTimeField / SumElemTime -#ifdef PARTICLES ElemTimePartPercent = 100. * ElemTimePart / SumElemTime -#endif /*PARTICLES*/ END IF ! ElemTimeField+ElemTimePart.LE.0. +#endif /*PARTICLES*/ IF(FILEEXISTS(outfile))THEN OPEN(NEWUNIT=ioUnit,FILE=TRIM(outfile),POSITION="APPEND",STATUS="OLD") @@ -1214,11 +1219,14 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) delimiter,SimulationEfficiency,& delimiter,PID,& delimiter,WallTime,& - delimiter,InitializationWallTime,& - delimiter,ElemTimeField,& + delimiter,InitializationWallTime& +#ifdef PARTICLES + ,delimiter,ElemTimeField,& delimiter,ElemTimePart,& delimiter,ElemTimeFieldPercent,& delimiter,ElemTimePartPercent +#endif /*PARTICLES*/ + ; ! this is required for terminating the "&" when particles=off WRITE(ioUnit,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the data line CLOSE(ioUnit) ELSE From e351b69b8bb08834ed3b774a2ca56cf21d36f5ad Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 14:44:49 +0200 Subject: [PATCH 38/74] alignment in builds.ini --- regressioncheck/checks/CHE_maxwell/builds.ini | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/regressioncheck/checks/CHE_maxwell/builds.ini b/regressioncheck/checks/CHE_maxwell/builds.ini index 525b496ed..29bc2f43b 100644 --- a/regressioncheck/checks/CHE_maxwell/builds.ini +++ b/regressioncheck/checks/CHE_maxwell/builds.ini @@ -2,14 +2,14 @@ binary=./bin/piclas ! fixed compiler flags -CMAKE_BUILD_TYPE=DEBUG -PICLAS_BUILD_HDF5=OFF -PICLAS_POLYNOMIAL_DEGREE=N -PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=RK4 -PICLAS_PARTICLES=OFF -PICLAS_MPI=ON -PICLAS_NODETYPE=GAUSS +CMAKE_BUILD_TYPE = DEBUG +PICLAS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = RK4 +PICLAS_PARTICLES = OFF +PICLAS_MPI = ON +PICLAS_NODETYPE = GAUSS ! exclude combinations EXCLUDE:PICLAS_EQNSYSNAME=poisson,PICLAS_TIMEDISCMETHOD=DSMC From d44c573bf28e4a492d94ad0f12a92f70e276c31e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 14:55:14 +0200 Subject: [PATCH 39/74] Added piclas executable/symbolic link, *.out files and userblock.tmp to ignore list --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index e31130110..6236c253b 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ userguide.pdf developerguide.pdf *.pvsm core +piclas +*.out +userblock.tmp From 334bab0d86047bd3d632b2189214d10405456e61 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 16:35:54 +0200 Subject: [PATCH 40/74] Updated loadbalance with new determination of field/particle weights for pure DSMC simulation --- CMakeLists.txt | 6 ++++ src/loadbalance/loadbalance.f90 | 47 ++++++++++++++++----------- src/loadbalance/loadbalance_tools.f90 | 4 +-- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0ef1e196..eba3c4364 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -833,6 +833,12 @@ IF(PICLAS_CTAGS) FOREACH(item ${EQNS_WO_ACTUAL}) SET(EXLUDES "--exclude=src/equations/${item}/*" ${EXLUDES}) ENDFOREACH() + MESSAGE(STATUS "Ctags excluding: ${EXLUDES}") + # ctags options: + # -R Equivalent to --recurse. + # -f + # Write tags to specified file. Value of "-" writes tags to stdout + # ["tags"; or "TAGS" when -e supplied]. ADD_CUSTOM_COMMAND(OUTPUT ctags.txt COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ctags -R -f ctags.txt ${EXLUDES} src) ADD_CUSTOM_TARGET(tags DEPENDS ctags.txt) FIND_PROGRAM(CTAGS_PATH ctags) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 1c2c4b6be..89465b667 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -309,17 +309,6 @@ SUBROUTINE ComputeElemLoad() #endif /*PARTICLES*/ END DO ! iElem=1,PP_nElems - ! Collect ElemTime for particles and field separately (only on root process) - CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - WeightSum = ElemTimeFieldTot ! only correct on MPI root -#ifdef PARTICLES - CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root -#endif /*PARTICLES*/ - ! send WeightSum from MPI root to all other procs - CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) - - #ifdef PARTICLES ! If no Elem times are calculated but Partweight Loadbalance is enabled ELSE IF(PerformLBSample .AND. LoadBalanceSample.EQ.0) THEN @@ -327,7 +316,9 @@ SUBROUTINE ComputeElemLoad() nLoadBalance=nLoadBalance+1 ! no time measurement and particles are present: simply add the ParticleMPIWeight times the number of particles present DO iElem=1,PP_nElems - ElemTime(iElem) = ElemTime(iElem) + nPartsPerElem(iElem)*ParticleMPIWeight + 1.0 + ElemTimePartElem = nPartsPerElem(iElem)*ParticleMPIWeight + 1.0 + ElemTime(iElem) = ElemTime(iElem) + ElemTimePartElem + ElemTimePart = ElemTimePart + ElemTimePartElem END DO ! iElem=1,PP_nElems IF((MAXVAL(nPartsPerElem).GT.0).AND.(MAXVAL(ElemTime).LE.1.0))THEN IPWRITE (*,*) "parts, time =", MAXVAL(nPartsPerElem),MAXVAL(ElemTime) @@ -471,8 +462,12 @@ SUBROUTINE ComputeImbalance() ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals -USE MOD_LoadBalance_Vars, ONLY:WeightSum, TargetWeight,CurrentImbalance, MaxWeight, MinWeight -USE MOD_LoadBalance_Vars, ONLY:ElemTime, PerformLBSample, PerformPartWeightLB, DeviationThreshold +USE MOD_LoadBalance_Vars ,ONLY: WeightSum, TargetWeight,CurrentImbalance, MaxWeight, MinWeight +USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample, PerformPartWeightLB, DeviationThreshold +USE MOD_LoadBalance_Vars ,ONLY: ElemTimeFieldTot,ElemTimeField +#ifdef PARTICLES +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePartTot,ElemTimePart +#endif /*PARTICLES*/ !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -489,6 +484,22 @@ SUBROUTINE ComputeImbalance() TargetWeight = 0. CurrentImbalance = -1.0 ELSE + +#if (PP_TimeDiscMethod!=4) + ! Collect ElemTime for particles and field separately (only on root process) + ! Skip the reduce for DSMC timedisc + CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + WeightSum = ElemTimeFieldTot ! only correct on MPI root +#else + WeightSum = 0. ! initialize before adding particle info +#endif /*(PP_TimeDiscMethod!=4)*/ +#ifdef PARTICLES + CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root +#endif /*PARTICLES*/ + ! send WeightSum from MPI root to all other procs + CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) + WeightSum_loc=SUM(ElemTime) !IPWRITE(UNIT_StdOut,*) "SUM(ElemTime) =", SUM(ElemTime) @@ -519,14 +530,12 @@ SUBROUTINE ComputeImbalance() !,' ERROR: after ALLREDUCE, weight sum cannot be zero! WeightSum=',RealInfoOpt=WeightSum) ! new computation of current imbalance - IF(ABS(TargetWeight).EQ.0.)THEN + IF(ABS(TargetWeight).LE.0.)THEN CurrentImbalance = 0. - ELSE IF(ABS(TargetWeight).LT.0.0)THEN SWRITE(UNIT_stdOut,'(A,F14.2,A1)')& - ' ERROR: after ALLREDUCE, WeightSum/TargetWeight cannot be zero! TargetWeight=[',TargetWeight,']' - CurrentImbalance = HUGE(1.0) + ' ERROR: after ALLREDUCE, TargetWeight (=WeightSum/nProcessors) cannot be zero! TargetWeight=[',TargetWeight,']' ELSE - CurrentImbalance = (MaxWeight-TargetWeight ) / TargetWeight + CurrentImbalance = (MaxWeight-TargetWeight)/TargetWeight END IF SWRITE(UNIT_stdOut,'(A,ES9.3,A,ES9.3,A,ES9.3,A,ES9.3,A,ES8.2,A)')& ' MinWeight: ', MinWeight, ' MaxWeight: ', MaxWeight, ' TargetWeight: ', TargetWeight,' CurrentImbalance: ',& diff --git a/src/loadbalance/loadbalance_tools.f90 b/src/loadbalance/loadbalance_tools.f90 index e4b6abc0e..775ade7be 100644 --- a/src/loadbalance/loadbalance_tools.f90 +++ b/src/loadbalance/loadbalance_tools.f90 @@ -189,8 +189,8 @@ SUBROUTINE DomainDecomposition() ! WeightSum (Mesh global value) is already set in BalanceMethod scheme ! new computation of current imbalance - TargetWeight=SUM(WeightSum_proc)/nProcessors - NewImbalance = (MaxWeight-TargetWeight ) / TargetWeight + TargetWeight = SUM(WeightSum_proc)/nProcessors + NewImbalance = (MaxWeight-TargetWeight)/TargetWeight IF(TargetWeight.LE.0.0) CALL abort(& __STAMP__, & From 7b28cdfc1da005932d9f0082e13bb5dce32d7542 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 19:29:01 +0200 Subject: [PATCH 41/74] Fixed major bug in load balance routines. ElemTime must be nullified after user-restart in h5 output (where it is temporarily over-written with the ElemTime from the restart file) --- .gitignore | 1 + src/io_hdf5/hdf5_output.f90 | 4 ++++ src/loadbalance/loadbalance.f90 | 6 +++++- src/timedisc/timedisc.f90 | 4 +--- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 6236c253b..d0192e958 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ core piclas *.out userblock.tmp +*f90.orig diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index 1b624557a..0b1d8b660 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -659,6 +659,10 @@ SUBROUTINE WriteElemDataToSeparateContainer(FileName,ElemList,ElemDataName) offset = (/0_IK,offsetElem /),& collective = .TRUE.,RealArray = ElemTime_tmp) END ASSOCIATE + + ! After writing the old ElemTime values to disk, the array must be nullified (because they correspond to the restart file, which + ! might have been created with a totally different processor number and distribution) + ElemTime = 0. ELSE ASSOCIATE (& nVar => INT(nVar,IK) ,& diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 89465b667..7c23770d2 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -447,7 +447,7 @@ SUBROUTINE LoadBalance() InitializationWallTime=LB_Time-LB_StartTime SWRITE(UNIT_stdOut,'(A,F14.2,A)') ' INITIALIZATION DONE! [',InitializationWallTime,' sec ]' SWRITE(UNIT_stdOut,'(A)')' LOAD BALANCE DONE!' -SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_StdOut,'(132("="))') END SUBROUTINE LoadBalance #if USE_LOADBALANCE @@ -526,6 +526,10 @@ SUBROUTINE ComputeImbalance() ! New TargetWeight = WeightSum/nProcessors ! Calculate the average value that is supposed to be the optimally distributed weight + IF((TargetWeight.GT.MaxWeight).OR.(TargetWeight.LT.MinWeight))THEN + SWRITE (UNIT_stdOut,'(A)') " ERROR: after ALLREDUCE, TargetWeight is either smaller than MinWeight or larger than MaxWeight!" + END IF ! (TargetWeight.GT.MaxWeight).OR.(TargetWeight.LT.MinWeight) + !IF(ALMOSTZERO(WeightSum))CALL abort( __STAMP__& !,' ERROR: after ALLREDUCE, weight sum cannot be zero! WeightSum=',RealInfoOpt=WeightSum) diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 06ecfbfb9..a01d6d92d 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -581,9 +581,7 @@ SUBROUTINE TimeDisc() IF(MPIroot) THEN IF(DoDisplayIter)THEN IF(MOD(iter,IterDisplayStep).EQ.0) THEN - !SWRITE(*,*) "iter:", iter,"time:",time ! old format - !SWRITE(UNIT_stdOut,'(A,I21,A6,ES26.16E3,25X)',ADVANCE='NO')" iter:", iter,"time:",time ! new format for analyze time output - SWRITE(UNIT_stdOut,'(A,I21,A6,ES26.16E3,25X)' )" iter:", iter,"time:",time ! new format for analyze time output + SWRITE(UNIT_stdOut,'(A,I21,A6,ES26.16E3,25X)')" iter:", iter,"time:",time ! new format for analyze time output END IF END IF END IF From 5de8744094ca33f2af0178db2d66d5db72a69f52 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 20:16:48 +0200 Subject: [PATCH 42/74] Nullify ElemTime at the correct location (after ElemData is written to file) --- src/io_hdf5/hdf5_output.f90 | 10 ++++++++-- src/loadbalance/loadbalance_vars.f90 | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index 0b1d8b660..d00e6c430 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -481,7 +481,8 @@ SUBROUTINE WriteAdditionalElemData(FileName,ElemList) ! MODULES USE MOD_PreProc USE MOD_Globals -USE MOD_Mesh_Vars ,ONLY:offsetElem,nGlobalElems,nElems +USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems,nElems +USE MOD_LoadBalance_Vars ,ONLY: ElemTime,NullifyElemTime ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -556,6 +557,9 @@ SUBROUTINE WriteAdditionalElemData(FileName,ElemList) END ASSOCIATE DEALLOCATE(ElemData,StrVarNames) +! Check if ElemTime is to be nullified (required after user-restart) +IF(NullifyElemTime) ElemTime=0. + END SUBROUTINE WriteAdditionalElemData @@ -580,7 +584,7 @@ SUBROUTINE WriteElemDataToSeparateContainer(FileName,ElemList,ElemDataName) USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_HDF5_Input ,ONLY: ReadArray #if USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: ElemTime,ElemTime_tmp +USE MOD_LoadBalance_Vars ,ONLY: ElemTime,ElemTime_tmp,NullifyElemTime USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Mesh_Vars ,ONLY: nGlobalElems,offsetelem #endif /*USE_LOADBALANCE*/ @@ -639,12 +643,14 @@ SUBROUTINE WriteElemDataToSeparateContainer(FileName,ElemList,ElemDataName) #if USE_LOADBALANCE ! Check if ElemTime is all zeros and if this is a restart (save the old values) +NullifyElemTime=.FALSE. IF((MAXVAL(ElemData).LE.0.0) .AND.& ! Restart DoRestart .AND.& ! Restart (TRIM(ElemDataName).EQ.'ElemTime').AND.& ! only for ElemTime array ALLOCATED(ElemTime_tmp))THEN ! only allocated when not starting simulation from zero ! Additionally, store old values in ElemData container ElemTime = ElemTime_tmp + NullifyElemTime=.TRUE. ! Set array to 0. after ElemData is written (but before ElemTime is measured again) ! Write 'ElemTime' container ASSOCIATE (& diff --git a/src/loadbalance/loadbalance_vars.f90 b/src/loadbalance/loadbalance_vars.f90 index de95b636d..59be6c2b5 100644 --- a/src/loadbalance/loadbalance_vars.f90 +++ b/src/loadbalance/loadbalance_vars.f90 @@ -71,6 +71,7 @@ MODULE MOD_LoadBalance_Vars ! Element Local measurement !----------------------------------------------------------------------------------------------------------------------------------- REAL,ALLOCATABLE :: ElemTime(:) +LOGICAL :: NullifyElemTime REAL,ALLOCATABLE :: ElemTime_tmp(:) ! Additional container for restarting and keeping the old ElemTime values in ! the state.h5 file REAL :: ElemTimePartTot ! Total time spent for particle routines (all procs) From 1268e018b4d0f377207673e333db6462abd313a4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 20 Jun 2020 20:19:36 +0200 Subject: [PATCH 43/74] Remove previous ElemTime=0. statement --- src/io_hdf5/hdf5_output.f90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index d00e6c430..7676b16a6 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -558,6 +558,8 @@ SUBROUTINE WriteAdditionalElemData(FileName,ElemList) DEALLOCATE(ElemData,StrVarNames) ! Check if ElemTime is to be nullified (required after user-restart) +! After writing the old ElemTime values to disk, the array must be nullified (because they correspond to the restart file, which +! might have been created with a totally different processor number and distribution) IF(NullifyElemTime) ElemTime=0. END SUBROUTINE WriteAdditionalElemData @@ -666,9 +668,6 @@ SUBROUTINE WriteElemDataToSeparateContainer(FileName,ElemList,ElemDataName) collective = .TRUE.,RealArray = ElemTime_tmp) END ASSOCIATE - ! After writing the old ElemTime values to disk, the array must be nullified (because they correspond to the restart file, which - ! might have been created with a totally different processor number and distribution) - ElemTime = 0. ELSE ASSOCIATE (& nVar => INT(nVar,IK) ,& From 0695c4cad5e977f975c07e1fad68e0bd932a5096 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 21 Jun 2020 23:46:37 +0200 Subject: [PATCH 44/74] updated tools for determining the electric current from PartStateBoundary files --- .../calcElectricCurrentPartStateBoundary.py | 153 ++++++++++++++++-- 1 file changed, 142 insertions(+), 11 deletions(-) diff --git a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py index 81b666076..5ec8ecf4e 100644 --- a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py +++ b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py @@ -1,4 +1,5 @@ import numpy as np +import math from timeit import default_timer as timer import argparse import re @@ -139,7 +140,6 @@ def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read) : # 2 Read the attributes and determine the species charges from user input if InitialDataRead : PreviousTime = 0.0 - data = np.empty([NbrOfFiles, 2], dtype=float) FileCount=0 InitialDataRead = False @@ -179,28 +179,82 @@ def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read) : Charge[iSpec] = float(txt)*1.602176634e-19 print(yellow(" The charges of the species are: %s" % Charge)) + # Create empy data array + #data = np.empty([NbrOfFiles, 2], dtype=float) + data = np.zeros([NbrOfFiles, 2+len(Charge)], dtype=float) + #print("data = %s" % (data)) + #print("Charge = %s" % (Charge)) + #exit(0) # 2 Sum the chares in PartData and divide by the time difference to the current TotalCharge = 0. + SumCharge = np.zeros([len(Charge)], dtype=float) + #print("SumCharge = %s" % (SumCharge)) for i in range(len(b1)): SpecID = int(b1[i][SpeciesIndex]) +<<<<<<< Updated upstream +======= + + if CutOff.Check: + # Skip coordinate + if CutOff.Type == 'greater': + if b1[i][CutOff.Coord] > CutOff.Val: + #print(b1[i][0],b1[i][1],b1[i][2]) + continue + elif CutOff.Type == 'lesser': + if b1[i][CutOff.Coord] < CutOff.Val: + #print(b1[i][0],b1[i][1],b1[i][2]) + continue + # Skip radius + if CutOff.Rad is not None: + if CutOff.Type == 'greater': + if np.linalg.norm(b1[i][0:1]) > CutOff.Rad: + continue + elif CutOff.Type == 'lesser': + if np.linalg.norm(b1[i][0:1]) < CutOff.Rad: + continue + +>>>>>>> Stashed changes if SpecID not in Charge : txt = input(yellow(" Enter the charge for species %s in multiples of the elementary charge e=1.602176634e-19 : " % SpecID)) Charge[SpecID] = float(txt)*1.602176634e-19 print(yellow(" The charges of the species are: %s" % Charge)) - TotalCharge += Charge[SpecID] * b1[i][MPFIndex] - - dt=Time-PreviousTime - Current = TotalCharge / dt - PreviousTime = Time + # Add another column to the data array for the new species + AddData = np.zeros([NbrOfFiles, 1], dtype=float) + data = np.concatenate((data,AddData),axis=1) + #print(data) + # Add another entry for the sum of charge + AddSumCharge = np.zeros([1], dtype=float) + #print("AddSumCharge = %s" % (AddSumCharge)) + SumCharge = np.append(SumCharge,[0.]) + #print("SumCharge = %s" % (SumCharge)) + #exit(0) + + myindex = list(Charge.keys()).index(SpecID) + #print("myindex = %s" % (myindex)) + TotalCharge += Charge[SpecID] * b1[i][MPFIndex] + #print("TotalCharge = %s" % (TotalCharge)) + SumCharge[myindex] += Charge[SpecID] * b1[i][MPFIndex] + #print("SumCharge = %s" % (SumCharge)) + + dt = Time-PreviousTime + Current = TotalCharge / dt + PreviousTime = Time data[FileCount,0] = Time data[FileCount,1] = Current - FileCount += 1 + for SpecID, v in Charge.items(): + myindex = list(Charge.keys()).index(SpecID) + Current = SumCharge[myindex] / dt + data[FileCount,myindex+2] = Current + + #print("myindex = %s" % (myindex)) + + FileCount += 1 # 3 Close .h5 data file f1.close() - print("%s dt=%.2E charge=%.2E current=%.2E"% (statefile, dt, TotalCharge, Current)) + print("%s t=%.2E dt=%.2E charge=%.2E current=%.2E"% (statefile, Time, dt, TotalCharge, Current)) class bcolors : """color and font style definitions for changing output appearance""" @@ -247,7 +301,17 @@ def yellow(text) : """get command line arguments""" parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for adding up the charges of the particles in the PartState container of multiple .h5 files.\nSupply a single state file or a group of state files by using the wildcard "*", e.g. MySimulation_000.000000* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='Files (.h5) that are to be merged together.', nargs='+') +<<<<<<< Updated upstream parser.add_argument('-d', '--debug', action='store_true', help='Print additional imformation regarding the files onto screen.') +======= +parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +parser.add_argument('-p', '--parameter', default='parameter.ini', help='Name of the parameter file that contains the species information corresponding to the PartState containers. Default=parameter.ini') +parser.add_argument('-c', '--cutoff', action='store_true', help='Exclude particles by given a cut-off coordinate and removing particles that are either > or < as compared with this value.') +parser.add_argument('-o', '--coordinate', type=int, help='Cut-off coordinate 0: x-dir, 1: y-dir, 2: z-dir.') +parser.add_argument('-v', '--value', type=float, help='Cut-off value for removing particles.') +parser.add_argument('-r', '--radius', type=float, help='Cut-off value for removing particles with radius grater/lesser than the supplied value (uses -t, --type).') +parser.add_argument('-t', '--type', type=str, help='Cut-off type. Choose "greater" or "lesser" to remove particles with a coordinate > or < as compared with the cut-off value.') +>>>>>>> Stashed changes # Get command line arguments args = parser.parse_args() @@ -258,7 +322,32 @@ def yellow(text) : for arg in list(args.__dict__) : print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") print('='*132) +<<<<<<< Updated upstream #print() +======= + +# Check cut-off parameters +CutOff= types.SimpleNamespace() +CutOff.Check = args.cutoff +if args.cutoff: + CutOff.Coord = args.coordinate + CutOff.Val = args.value + CutOff.Rad = args.radius + CutOff.Type = args.type + if not CutOff.Coord in [0,1,2]: + print(red("Cut-Off: Coordinate [-o] must either be 0, 1 or 2.")) + exit(0) + if not CutOff.Type in ['greater','lesser']: + print(red('Cut-Off: Type [-t] must either be "greater" or "lesser".')) + exit(0) + if CutOff.Val is None and CutOff.Val is None: + print(red('Cut-Off: Value [-v] and/or Radius [-r] must be chosen.')) + exit(0) + mystr='xyz' + print(red("WARNING: Coordinate cut-off is activated. Removing particles with %s-coordinate %s than %s" % (mystr[CutOff.Coord], CutOff.Type, CutOff.Val))) + if CutOff.Rad is not None: + print(red("WARNING: Radius cut-off is activated. Removing particles with radius %s than %s" % (CutOff.Type, CutOff.Rad))) +>>>>>>> Stashed changes # Get maximum number of characters in h5 file names max_length=0 @@ -286,20 +375,62 @@ def yellow(text) : else: species_info_read=False +<<<<<<< Updated upstream +======= +if not species_info_read: + print(yellow("Parameter file [%s] not found. Please enter the required species information by hand or create a symbolic link to the parameter.ini file which was used to create the data" % args.parameter)) + +>>>>>>> Stashed changes InitialDataRead = True NbrOfFiles = len(args.files) -#print(NbrOfFiles) for statefile in args.files : +<<<<<<< Updated upstream if statefile.endswith('.h5'): #print(statefile) # Flip PartData GetInfoFromDataset(statefile,'PartData',NbrOfFiles,species_info_read) +======= + if statefile.endswith('.h5') and not statefile.endswith('_merged.h5'): + # check if file exists + if not os.path.exists(statefile): + print(red('File does not exist: [%s]' % statefile)) + exit(0) + else: + NbrOfFiles -= 1 + + +print("Reading %s files" % NbrOfFiles) +for statefile in args.files : + if statefile.endswith('.h5') and not statefile.endswith('_merged.h5'): + + # Read data from .h5 file + GetInfoFromDataset(statefile,'PartData',NbrOfFiles,species_info_read,CutOff) +>>>>>>> Stashed changes else: print(statefile," skipping") +#print( ) +#print("Charge = %s" % (Charge)) +#print("len(Charge) = %s" % (len(Charge))) +#x = ',"'.join(myTuple) +#print("x = %s" % (x)) + +myheader = '"time","Current [A]"' +for k, v in Charge.items(): + #print(k,v) + #print(list(Charge.keys()).index(k)) + + #print( ) + myheader = myheader+str(',"Spec-(%s)"' % k) + +print( ) +print("myheader = %s" % (myheader)) print(132*"-") #print(data) -print("The charge data has been written to CurrentOverTime_PartStateBoundary.csv") -np.savetxt('CurrentOverTime_PartStateBoundary.csv', data, delimiter=',', header='"time", "Current [A]"') +if 'data' in locals(): + print("The charge data has been written to CurrentOverTime_PartStateBoundary.csv") + np.savetxt('CurrentOverTime_PartStateBoundary.csv', data, delimiter=',', header=myheader) +else: + print("No output created.") print(132*"-") From 60d804eac15b9d763118c59f235da078e5b2dccf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 21 Jun 2020 23:52:28 +0200 Subject: [PATCH 45/74] fixed merge --- .../calcElectricCurrentPartStateBoundary.py | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py index 5ec8ecf4e..bed359d49 100644 --- a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py +++ b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py @@ -6,6 +6,7 @@ import shutil import os.path import configparser +import types # Bind raw_input to input in Python 2 try: @@ -83,7 +84,7 @@ def ReadConfig(parameterFile): return config -def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read) : +def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read,CutOff) : global InitialDataRead global SpeciesIndex global MPFIndex @@ -186,14 +187,12 @@ def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read) : #print("Charge = %s" % (Charge)) #exit(0) - # 2 Sum the chares in PartData and divide by the time difference to the current + # 2 Sum the charges in PartData and divide by the time difference to the current TotalCharge = 0. SumCharge = np.zeros([len(Charge)], dtype=float) #print("SumCharge = %s" % (SumCharge)) for i in range(len(b1)): SpecID = int(b1[i][SpeciesIndex]) -<<<<<<< Updated upstream -======= if CutOff.Check: # Skip coordinate @@ -214,7 +213,6 @@ def GetInfoFromDataset(statefile,data_set,NbrOfFiles,species_info_read) : if np.linalg.norm(b1[i][0:1]) < CutOff.Rad: continue ->>>>>>> Stashed changes if SpecID not in Charge : txt = input(yellow(" Enter the charge for species %s in multiples of the elementary charge e=1.602176634e-19 : " % SpecID)) Charge[SpecID] = float(txt)*1.602176634e-19 @@ -292,7 +290,7 @@ def yellow(text) : import h5py h5py_module_loaded = True except ImportError : - print(red('Could not import h5py module. This is required for analyse functions.')) + print(red('Could not import h5py module. This is required for reading .h5 files. Exit.')) exit(0) # Start the timer @@ -301,9 +299,6 @@ def yellow(text) : """get command line arguments""" parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for adding up the charges of the particles in the PartState container of multiple .h5 files.\nSupply a single state file or a group of state files by using the wildcard "*", e.g. MySimulation_000.000000* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='Files (.h5) that are to be merged together.', nargs='+') -<<<<<<< Updated upstream -parser.add_argument('-d', '--debug', action='store_true', help='Print additional imformation regarding the files onto screen.') -======= parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') parser.add_argument('-p', '--parameter', default='parameter.ini', help='Name of the parameter file that contains the species information corresponding to the PartState containers. Default=parameter.ini') parser.add_argument('-c', '--cutoff', action='store_true', help='Exclude particles by given a cut-off coordinate and removing particles that are either > or < as compared with this value.') @@ -311,7 +306,6 @@ def yellow(text) : parser.add_argument('-v', '--value', type=float, help='Cut-off value for removing particles.') parser.add_argument('-r', '--radius', type=float, help='Cut-off value for removing particles with radius grater/lesser than the supplied value (uses -t, --type).') parser.add_argument('-t', '--type', type=str, help='Cut-off type. Choose "greater" or "lesser" to remove particles with a coordinate > or < as compared with the cut-off value.') ->>>>>>> Stashed changes # Get command line arguments args = parser.parse_args() @@ -322,9 +316,6 @@ def yellow(text) : for arg in list(args.__dict__) : print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") print('='*132) -<<<<<<< Updated upstream -#print() -======= # Check cut-off parameters CutOff= types.SimpleNamespace() @@ -347,15 +338,14 @@ def yellow(text) : print(red("WARNING: Coordinate cut-off is activated. Removing particles with %s-coordinate %s than %s" % (mystr[CutOff.Coord], CutOff.Type, CutOff.Val))) if CutOff.Rad is not None: print(red("WARNING: Radius cut-off is activated. Removing particles with radius %s than %s" % (CutOff.Type, CutOff.Rad))) ->>>>>>> Stashed changes # Get maximum number of characters in h5 file names max_length=0 for statefile in args.files : max_length = max(max_length,len(statefile)) -parameterFile="parameter.ini" -config = ReadConfig(parameterFile) +#parameterFile="parameter.ini" +config = ReadConfig(args.parameter) if config : species_info_read=True @@ -370,26 +360,17 @@ def yellow(text) : Charge={} for iSpec in Species : Charge[iSpec] = float(config.get("Section1","Part-Species%d-ChargeIC" % iSpec)) - print(yellow(" Automatically fetched species ID's and charges from %s" % parameterFile)) + print(yellow(" Automatically fetched species ID's and charges from %s" % args.parameter)) print(yellow(" The charges of the species are: %s" % Charge)) else: species_info_read=False -<<<<<<< Updated upstream -======= if not species_info_read: print(yellow("Parameter file [%s] not found. Please enter the required species information by hand or create a symbolic link to the parameter.ini file which was used to create the data" % args.parameter)) ->>>>>>> Stashed changes InitialDataRead = True NbrOfFiles = len(args.files) for statefile in args.files : -<<<<<<< Updated upstream - if statefile.endswith('.h5'): - #print(statefile) - # Flip PartData - GetInfoFromDataset(statefile,'PartData',NbrOfFiles,species_info_read) -======= if statefile.endswith('.h5') and not statefile.endswith('_merged.h5'): # check if file exists if not os.path.exists(statefile): @@ -405,7 +386,6 @@ def yellow(text) : # Read data from .h5 file GetInfoFromDataset(statefile,'PartData',NbrOfFiles,species_info_read,CutOff) ->>>>>>> Stashed changes else: print(statefile," skipping") From e3e49f8dcb6adb5bcb09fc98e30a4ca77b9dc7fa Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 22 Jun 2020 00:43:52 +0200 Subject: [PATCH 46/74] fixed printing '#' to first header line in python output of .csv --- .../calcElectricCurrentPartStateBoundary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py index bed359d49..5ccced134 100644 --- a/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py +++ b/tools/calcElectricCurrentPartStateBoundary/calcElectricCurrentPartStateBoundary.py @@ -409,7 +409,7 @@ def yellow(text) : #print(data) if 'data' in locals(): print("The charge data has been written to CurrentOverTime_PartStateBoundary.csv") - np.savetxt('CurrentOverTime_PartStateBoundary.csv', data, delimiter=',', header=myheader) + np.savetxt('CurrentOverTime_PartStateBoundary.csv', data, delimiter=',', header=myheader, comments='') # comments='' is required to prevent the "#" from being written in the header line else: print("No output created.") print(132*"-") From 72432fb1ece2f297de160cba298e8d9fa03ef49e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 23 Jun 2020 12:34:23 +0200 Subject: [PATCH 47/74] correct indentation --- src/analyze/analyzefield.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index 218aabd1d..cd6182195 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -190,11 +190,11 @@ SUBROUTINE AnalyzeField(Time) IF(MPIROOT)THEN WRITE(unit_index,'(E23.16E3)',ADVANCE='NO') Time IF (CalcEpot) THEN - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WMag - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPhi - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPsi - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WMag + WPhi + WPsi + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WMag + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPhi + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPsi + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WMag + WPhi + WPsi END IF IF(CalcPoyntingInt)THEN DO iPlane=1,nPoyntingIntPlanes From e6a55c77a4191a3f6cc9a8a7877e2eabfe67b899 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 23 Jun 2020 12:46:58 +0200 Subject: [PATCH 48/74] Added more time discs for excluding Field solver in load balance --- src/loadbalance/loadbalance.f90 | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 7c23770d2..8169413ae 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -485,13 +485,13 @@ SUBROUTINE ComputeImbalance() CurrentImbalance = -1.0 ELSE -#if (PP_TimeDiscMethod!=4) +#if (PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400) + WeightSum = 0. ! initialize before adding particle info +#else ! Collect ElemTime for particles and field separately (only on root process) ! Skip the reduce for DSMC timedisc CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) WeightSum = ElemTimeFieldTot ! only correct on MPI root -#else - WeightSum = 0. ! initialize before adding particle info #endif /*(PP_TimeDiscMethod!=4)*/ #ifdef PARTICLES CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) @@ -517,9 +517,7 @@ SUBROUTINE ComputeImbalance() !IPWRITE(UNIT_StdOut,*) "WeightSum (TargetWeight) =", TargetWeight !IPWRITE(UNIT_StdOut,*) "WeightSum (WeightSum) =", WeightSum !END IF ! MPIRoot - !CALL abort(& - !__STAMP__& - !,'yolo') + ! Old (ALLREDUCE of sum(ElemTime) on TargetWeight) !TargetWeight = TargetWeight/nProcessors ! Calculate the average value that is supposed to be the optimally distributed weight From 7033f3f0c9e2fad440cdc9b742b4bc83dbe6ad66 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 23 Jun 2020 22:17:26 +0200 Subject: [PATCH 49/74] fixed header line cretion for FieldAnalyze.csv --- src/analyze/analyzefield.f90 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index cd6182195..5e85b6b90 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -134,11 +134,15 @@ SUBROUTINE AnalyzeField(Time) ! Set the header line content nPoyntingIntPlanes=MERGE(nPoyntingIntPlanes,0,CalcPoyntingInt) ! set to zero if the flag is false (otherwise not initialized) - ALLOCATE(tmpStr(1:nOutputVar+nPoyntingIntPlanes)) + nOutputVarTotal = nOutputVar + nPoyntingIntPlanes + IF(.NOT.CalcEpot) nOutputVarTotal = nOutputVarTotal - 5 + ALLOCATE(tmpStr(1:nOutputVarTotal)) tmpStr="" + nOutputVarTotal = 0 DO I=1,nOutputVar - IF((.NOT.CalcEpot).AND.(I.LT.6)) CYCLE + ! When NOT CalcEpot, skip entries 2,...,6 + IF((.NOT.CalcEpot).AND.((1.LT.I).AND.(I.LE.6))) CYCLE WRITE(tmpStr(I),'(A,I0.3,A)')delimiter//'"',I,'-'//TRIM(StrVarNames(I))//'"' nOutputVarTotal = nOutputVarTotal + 1 END DO From 9f9efe056a8b6ea63a64c63e04f30ad478b85ff8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 23 Jun 2020 22:17:30 +0200 Subject: [PATCH 50/74] Fixed INT(ParticleEmission), which can overflow easily (set to INT KIND=8 now) --- src/particles/particle_init.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index a3638309f..6ccc1f93d 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -1833,7 +1833,7 @@ SUBROUTINE InitializeVariables() END IF !--- integer check for ParticleEmissionType 2 IF((Species(iSpec)%Init(iInit)%ParticleEmissionType.EQ.2).AND. & - ((Species(iSpec)%Init(iInit)%ParticleEmission-INT(Species(iSpec)%Init(iInit)%ParticleEmission)).NE.0)) THEN + (ABS(Species(iSpec)%Init(iInit)%ParticleEmission-INT(Species(iSpec)%Init(iInit)%ParticleEmission,8)).GT.0)) THEN CALL abort(& __STAMP__& ,' If ParticleEmissionType = 2 (parts per iteration), ParticleEmission has to be an integer number') From fc1b73ead67b45b8098a48c0ac905e795871da05 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 25 Jun 2020 20:50:16 +0200 Subject: [PATCH 51/74] Updated merge part data and dsmc surf data --- .../merge_DSMCSurfState.py | 52 ++++++++++++++--- tools/merge_PartState/merge_PartState.py | 56 +++++++++++++++++-- 2 files changed, 94 insertions(+), 14 deletions(-) diff --git a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py b/tools/merge_DSMCSurfState/merge_DSMCSurfState.py index 0433f4c66..7f3690513 100644 --- a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py +++ b/tools/merge_DSMCSurfState/merge_DSMCSurfState.py @@ -35,6 +35,33 @@ def blue(text) : def yellow(text) : return bcolors.YELLOW+text+bcolors.ENDC +def GetDataSets(statefile) : + # Open h5 file and read container info + # -------------------------------------------- + # r : Readonly, file must exist + # r+ : Read/write, file must exist + # w : Create file, truncate if exists + # w- or x : Create file, fail if exists + # a : Read/write if exists, create otherwise (default + # -------------------------------------------- + # When sorting is used, the sorted array is written to the original .h5 file with a new name + f1 = h5py.File(statefile,'r+') + + # Usage: + # ------------------- + # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., + # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' + # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' + # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 + # ------------------- + data_set = 'SurfaceData2' + + datasets = list(f1.keys()) + + f1.close() + + return datasets + # import h5 I/O routines try : import h5py @@ -103,6 +130,10 @@ def yellow(text) : for statefile in files : max_length = max(max_length,len(statefile)) +print(132*"-") +datasets = GetDataSets(files[0]) +print("Found the following data sets:\n",datasets) + print(132*"-") s="Example.h5" print("".ljust(max_length-len(s)),s," | PartData(dim1, dim2)") @@ -128,17 +159,16 @@ def yellow(text) : # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 # ------------------- - data_set= 'SurfaceData' + data_set = 'SurfaceData' + + if not data_set in list(f1.keys()) : + print(red("ERROR: Dataset ['%s'] not found in file. Stop." % data_set)) + exit(0) # 1.1.1 Read the dataset from the hdf5 file b1 = f1[data_set][:] print("".ljust(max_length-len(statefile)),statefile," | PartData%s" % str(b1.shape)) - if n == 1: - # Create empty array when processing the first file - b1_merged = np.empty(b1.shape, dtype=float, order='C') # Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory. - - # Save old file if n > 1 : # Compare shape of the dataset of both files, throw error if they do not conincide @@ -147,8 +177,12 @@ def yellow(text) : print(s) exit(1) - # Add ne current array stored in b1 to b - b1_merged = b1_merged + b1 + # Add ne current array stored in b1 to b + b1_merged = b1_merged + b1 + else : + # Create empty array when processing the first file + b1_merged = b1 # np.empty(b1.shape, dtype=np.float64, order='C') # Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory. + # store the old shape for checking with next state file @@ -157,7 +191,7 @@ def yellow(text) : f1.close() print(132*"-") print("Files have been merged into %s | %s%s" % (newFile,data_set,b1_merged.shape)) - +print(132*"-") # Copy old file and modify PartState in the new file diff --git a/tools/merge_PartState/merge_PartState.py b/tools/merge_PartState/merge_PartState.py index 525ed04ae..4e179dcac 100644 --- a/tools/merge_PartState/merge_PartState.py +++ b/tools/merge_PartState/merge_PartState.py @@ -35,6 +35,32 @@ def blue(text) : def yellow(text) : return bcolors.YELLOW+text+bcolors.ENDC +def GetDataSets(statefile) : + # Open h5 file and read container info + # -------------------------------------------- + # r : Readonly, file must exist + # r+ : Read/write, file must exist + # w : Create file, truncate if exists + # w- or x : Create file, fail if exists + # a : Read/write if exists, create otherwise (default + # -------------------------------------------- + # When sorting is used, the sorted array is written to the original .h5 file with a new name + f1 = h5py.File(statefile,'r+') + + # Usage: + # ------------------- + # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., + # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' + # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' + # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 + # ------------------- + data_set = 'SurfaceData2' + + datasets = list(f1.keys()) + + f1.close() + + return datasets # import h5 I/O routines try : import h5py @@ -62,6 +88,7 @@ def yellow(text) : # Loop over all files and identify the latet simulation time maxtime=-1.0 +mintime=1.0e99 NbrOfFiles = len(args.files) files = [] for statefile in args.files : @@ -72,16 +99,24 @@ def yellow(text) : try : time = float(timestr) maxtime=max(time,maxtime) + mintime=min(time,mintime) if time == maxtime : maxtimestr = timestr maxtimeFile = statefile newFile = re.sub(timestr+'.h5', '', statefile)+maxtimestr+'_merged.h5' + if time == mintime : + mintimestr = timestr files.append(statefile) except : print("not considering "+statefile) +print("t_min : %s" % mintime) +print("t_min_str : %s" % mintimestr) print("t_max : %s" % maxtime) -print("t_max_str : %s" % timestr) +print("t_max_str : %s" % maxtimestr) + +dt = maxtime-mintime +print("delta t : %s" % dt) print("newfile : %s" % newFile) print() @@ -89,6 +124,9 @@ def yellow(text) : max_length=0 for statefile in files : max_length = max(max_length,len(statefile)) +print(132*"-") +datasets = GetDataSets(files[0]) +print("Found the following data sets:\n",datasets) print(132*"-") s="Example.h5" @@ -117,7 +155,11 @@ def yellow(text) : # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 # ------------------- - data_set= 'PartData' + data_set = 'PartData' + + if not data_set in list(f1.keys()) : + print(red("ERROR: Dataset ['%s'] not found in file. Stop." % data_set)) + exit(0) # 1.1.1 Read the dataset from the hdf5 file b1 = f1[data_set][:] @@ -126,10 +168,11 @@ def yellow(text) : # Save old file if n > 1 : # Compare shape of the dataset of both files, throw error if they do not conincide - if b1.shape[0] != b2.shape[0] : # e.g.: b1.shape = (48, 1, 1, 32) + if b1.shape[0] != b2_shape : # e.g.: b1.shape = (48, 1, 1, 32) s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\nThe dimensions dim1 = %s and dim2 = %s must be equal!\n\nAborted!" % (statefile,statefile_old,b1.shape,b2.shape,b1.shape[0],b2.shape[0]) print(s) exit(1) + # Concatenate files depending on the file version (beginning with v1.5 PartData's dimensions are switched) if file_version < 1.5 : # Concatenate columns @@ -139,12 +182,15 @@ def yellow(text) : b1_merged = np.concatenate((b1_merged, b1), axis=0) else : b1_merged = b1 - b2 = b1 + + + # store the old shape for checking with next state file + b2_shape = b1.shape[0] statefile_old = statefile f1.close() print(132*"-") print("Files have been merged into %s | %s%s" % (newFile,data_set,b1_merged.shape)) - +print(132*"-") # Copy old file and modify PartState in the new file From 7d62a6468eb6f76ba330b15643beea2b18e98f57 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 25 Jun 2020 20:50:47 +0200 Subject: [PATCH 52/74] Merged the two tools for merging state file containers (and DSMC etc.) into a single tool. --- .../merge_DSMCSurfState.py | 206 --------- tools/merge_PartState/merge_PartState.py | 205 --------- tools/merge_State/merge_State.py | 431 ++++++++++++++++++ 3 files changed, 431 insertions(+), 411 deletions(-) delete mode 100644 tools/merge_DSMCSurfState/merge_DSMCSurfState.py delete mode 100644 tools/merge_PartState/merge_PartState.py create mode 100644 tools/merge_State/merge_State.py diff --git a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py b/tools/merge_DSMCSurfState/merge_DSMCSurfState.py deleted file mode 100644 index 7f3690513..000000000 --- a/tools/merge_DSMCSurfState/merge_DSMCSurfState.py +++ /dev/null @@ -1,206 +0,0 @@ -import numpy as np -from timeit import default_timer as timer -import argparse -import re -import shutil - -class bcolors : - """color and font style definitions for changing output appearance""" - # Reset (user after applying a color to return to normal coloring) - ENDC ='\033[0m' - - # Regular Colors - BLACK ='\033[0;30m' - RED ='\033[0;31m' - GREEN ='\033[0;32m' - YELLOW ='\033[0;33m' - BLUE ='\033[0;34m' - PURPLE ='\033[0;35m' - CYAN ='\033[0;36m' - WHITE ='\033[0;37m' - - # Text Style - BOLD = '\033[1m' - UNDERLINE = '\033[4m' - -def red(text) : - return bcolors.RED+text+bcolors.ENDC - -def green(text) : - return bcolors.GREEN+text+bcolors.ENDC - -def blue(text) : - return bcolors.BLUE+text+bcolors.ENDC - -def yellow(text) : - return bcolors.YELLOW+text+bcolors.ENDC - -def GetDataSets(statefile) : - # Open h5 file and read container info - # -------------------------------------------- - # r : Readonly, file must exist - # r+ : Read/write, file must exist - # w : Create file, truncate if exists - # w- or x : Create file, fail if exists - # a : Read/write if exists, create otherwise (default - # -------------------------------------------- - # When sorting is used, the sorted array is written to the original .h5 file with a new name - f1 = h5py.File(statefile,'r+') - - # Usage: - # ------------------- - # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., - # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' - # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' - # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 - # ------------------- - data_set = 'SurfaceData2' - - datasets = list(f1.keys()) - - f1.close() - - return datasets - -# import h5 I/O routines -try : - import h5py - h5py_module_loaded = True -except ImportError : - print(red('Could not import h5py module. This is required for analyse functions.')) - exit(0) - -# Start the timer -start = timer() - -"""get command line arguments""" -parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for merging the PartState container of multiple .h5 files into a single file.\nSupply a single state file or a group of state files by using the wildcard "*", e.g. MySimulation_000.000000* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('files', type=str, help='Files (.h5) that are to be merged together.', nargs='+') - -# Get command line arguments -args = parser.parse_args() - -# Display all command line arguments -print('='*132) -print("Running with the following command line options") -for arg in list(args.__dict__) : - print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") -print('='*132) - -# Loop over all files and identify the latet simulation time -maxtime=-1.0 -mintime=1.0e99 -NbrOfFiles = len(args.files) -files = [] -for statefile in args.files : - #print(statefile) - pat = r'^.*\_(.*)\..*$' - match = re.search(pat, statefile) - timestr = match.group(1) - try : - time = float(timestr) - maxtime=max(time,maxtime) - mintime=min(time,mintime) - if time == maxtime : - maxtimestr = timestr - maxtimeFile = statefile - newFile = re.sub(timestr+'.h5', '', statefile)+maxtimestr+'_merged.h5' - - if time == mintime : - mintimestr = timestr - files.append(statefile) - except : - print("not considering "+statefile) - - -print("t_min : %s" % mintime) -print("t_min_str : %s" % mintimestr) - -print("t_max : %s" % maxtime) -print("t_max_str : %s" % maxtimestr) - -dt = maxtime-mintime -print("delta t : %s" % dt) - -print("newfile : %s" % newFile) -print() - -# Get maximum number of characters in h5 file names -max_length=0 -for statefile in files : - max_length = max(max_length,len(statefile)) - -print(132*"-") -datasets = GetDataSets(files[0]) -print("Found the following data sets:\n",datasets) - -print(132*"-") -s="Example.h5" -print("".ljust(max_length-len(s)),s," | PartData(dim1, dim2)") -print(132*"-") -n = 0 -for statefile in files : - n+=1 - # Open h5 file and read container info - # -------------------------------------------- - # r : Readonly, file must exist - # r+ : Read/write, file must exist - # w : Create file, truncate if exists - # w- or x : Create file, fail if exists - # a : Read/write if exists, create otherwise (default - # -------------------------------------------- - # When sorting is used, the sorted array is written to the original .h5 file with a new name - f1 = h5py.File(statefile,'r+') - - # Usage: - # ------------------- - # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., - # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' - # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' - # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 - # ------------------- - data_set = 'SurfaceData' - - if not data_set in list(f1.keys()) : - print(red("ERROR: Dataset ['%s'] not found in file. Stop." % data_set)) - exit(0) - - # 1.1.1 Read the dataset from the hdf5 file - b1 = f1[data_set][:] - print("".ljust(max_length-len(statefile)),statefile," | PartData%s" % str(b1.shape)) - - # Save old file - if n > 1 : - # Compare shape of the dataset of both files, throw error if they do not conincide - if b1.shape[0] != b2_shape : # e.g.: b1.shape = (48, 1, 1, 32) - s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\nThe dimensions dim1 = %s and dim2 = %s must be equal!\n\nAborted!" % (statefile,statefile_old,b1.shape,b2.shape,b1.shape[0],b2.shape[0]) - print(s) - exit(1) - - # Add ne current array stored in b1 to b - b1_merged = b1_merged + b1 - else : - # Create empty array when processing the first file - b1_merged = b1 # np.empty(b1.shape, dtype=np.float64, order='C') # Whether to store multi-dimensional data in row-major (C-style) or column-major (Fortran-style) order in memory. - - - - # store the old shape for checking with next state file - b2_shape = b1.shape[0] - statefile_old = statefile - f1.close() -print(132*"-") -print("Files have been merged into %s | %s%s" % (newFile,data_set,b1_merged.shape)) -print(132*"-") - - -# Copy old file and modify PartState in the new file -shutil.copyfile(maxtimeFile, newFile) -# Write new .h5 file -f1 = h5py.File(newFile,'r+') -del f1[data_set] -# file: Create new dataset -dset = f1.create_dataset(data_set, shape=b1_merged.shape, dtype=np.float64) -# write as C-continuous array via np.ascontiguousarray() -dset.write_direct(np.ascontiguousarray(b1_merged)) -f1.close() diff --git a/tools/merge_PartState/merge_PartState.py b/tools/merge_PartState/merge_PartState.py deleted file mode 100644 index 4e179dcac..000000000 --- a/tools/merge_PartState/merge_PartState.py +++ /dev/null @@ -1,205 +0,0 @@ -import numpy as np -from timeit import default_timer as timer -import argparse -import re -import shutil - -class bcolors : - """color and font style definitions for changing output appearance""" - # Reset (user after applying a color to return to normal coloring) - ENDC ='\033[0m' - - # Regular Colors - BLACK ='\033[0;30m' - RED ='\033[0;31m' - GREEN ='\033[0;32m' - YELLOW ='\033[0;33m' - BLUE ='\033[0;34m' - PURPLE ='\033[0;35m' - CYAN ='\033[0;36m' - WHITE ='\033[0;37m' - - # Text Style - BOLD = '\033[1m' - UNDERLINE = '\033[4m' - -def red(text) : - return bcolors.RED+text+bcolors.ENDC - -def green(text) : - return bcolors.GREEN+text+bcolors.ENDC - -def blue(text) : - return bcolors.BLUE+text+bcolors.ENDC - -def yellow(text) : - return bcolors.YELLOW+text+bcolors.ENDC - -def GetDataSets(statefile) : - # Open h5 file and read container info - # -------------------------------------------- - # r : Readonly, file must exist - # r+ : Read/write, file must exist - # w : Create file, truncate if exists - # w- or x : Create file, fail if exists - # a : Read/write if exists, create otherwise (default - # -------------------------------------------- - # When sorting is used, the sorted array is written to the original .h5 file with a new name - f1 = h5py.File(statefile,'r+') - - # Usage: - # ------------------- - # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., - # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' - # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' - # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 - # ------------------- - data_set = 'SurfaceData2' - - datasets = list(f1.keys()) - - f1.close() - - return datasets -# import h5 I/O routines -try : - import h5py - h5py_module_loaded = True -except ImportError : - print(red('Could not import h5py module. This is required for analyse functions.')) - exit(0) - -# Start the timer -start = timer() - -"""get command line arguments""" -parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for merging the PartState container of multiple .h5 files into a single file.\nSupply a single state file or a group of state files by using the wildcard "*", e.g. MySimulation_000.000000* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('files', type=str, help='Files (.h5) that are to be merged together.', nargs='+') - -# Get command line arguments -args = parser.parse_args() - -# Display all command line arguments -print('='*132) -print("Running with the following command line options") -for arg in list(args.__dict__) : - print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") -print('='*132) - -# Loop over all files and identify the latet simulation time -maxtime=-1.0 -mintime=1.0e99 -NbrOfFiles = len(args.files) -files = [] -for statefile in args.files : - #print(statefile) - pat = r'^.*\_(.*)\..*$' - match = re.search(pat, statefile) - timestr = match.group(1) - try : - time = float(timestr) - maxtime=max(time,maxtime) - mintime=min(time,mintime) - if time == maxtime : - maxtimestr = timestr - maxtimeFile = statefile - newFile = re.sub(timestr+'.h5', '', statefile)+maxtimestr+'_merged.h5' - if time == mintime : - mintimestr = timestr - files.append(statefile) - except : - print("not considering "+statefile) -print("t_min : %s" % mintime) -print("t_min_str : %s" % mintimestr) - -print("t_max : %s" % maxtime) -print("t_max_str : %s" % maxtimestr) - -dt = maxtime-mintime -print("delta t : %s" % dt) -print("newfile : %s" % newFile) -print() - -# Get maximum number of characters in h5 file names -max_length=0 -for statefile in files : - max_length = max(max_length,len(statefile)) -print(132*"-") -datasets = GetDataSets(files[0]) -print("Found the following data sets:\n",datasets) - -print(132*"-") -s="Example.h5" -print("".ljust(max_length-len(s)),s," | PartData(dim1, dim2)") -print(132*"-") -n = 0 -for statefile in files : - n+=1 - # Open h5 file and read container info - # -------------------------------------------- - # r : Readonly, file must exist - # r+ : Read/write, file must exist - # w : Create file, truncate if exists - # w- or x : Create file, fail if exists - # a : Read/write if exists, create otherwise (default - # -------------------------------------------- - # When sorting is used, the sorted array is written to the original .h5 file with a new name - f1 = h5py.File(statefile,'r+') - - file_version = f1.attrs.get('File_Version', default=-1.)[0] - - # Usage: - # ------------------- - # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., - # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' - # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' - # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 - # ------------------- - data_set = 'PartData' - - if not data_set in list(f1.keys()) : - print(red("ERROR: Dataset ['%s'] not found in file. Stop." % data_set)) - exit(0) - - # 1.1.1 Read the dataset from the hdf5 file - b1 = f1[data_set][:] - print("".ljust(max_length-len(statefile)),statefile," | PartData%s" % str(b1.shape)) - - # Save old file - if n > 1 : - # Compare shape of the dataset of both files, throw error if they do not conincide - if b1.shape[0] != b2_shape : # e.g.: b1.shape = (48, 1, 1, 32) - s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\nThe dimensions dim1 = %s and dim2 = %s must be equal!\n\nAborted!" % (statefile,statefile_old,b1.shape,b2.shape,b1.shape[0],b2.shape[0]) - print(s) - exit(1) - - # Concatenate files depending on the file version (beginning with v1.5 PartData's dimensions are switched) - if file_version < 1.5 : - # Concatenate columns - b1_merged = np.concatenate((b1_merged, b1), axis=1) - else : - # Concatenate rows - b1_merged = np.concatenate((b1_merged, b1), axis=0) - else : - b1_merged = b1 - - - # store the old shape for checking with next state file - b2_shape = b1.shape[0] - statefile_old = statefile - f1.close() -print(132*"-") -print("Files have been merged into %s | %s%s" % (newFile,data_set,b1_merged.shape)) -print(132*"-") - - -# Copy old file and modify PartState in the new file -shutil.copyfile(maxtimeFile, newFile) -# Write new .h5 file -f1 = h5py.File(newFile,'r+') -del f1[data_set] -# file: Create new dataset -dset = f1.create_dataset(data_set, shape=b1_merged.shape, dtype=np.float64) -# write as C-continuous array via np.ascontiguousarray() -dset.write_direct(np.ascontiguousarray(b1_merged)) -f1.close() diff --git a/tools/merge_State/merge_State.py b/tools/merge_State/merge_State.py new file mode 100644 index 000000000..79ced7022 --- /dev/null +++ b/tools/merge_State/merge_State.py @@ -0,0 +1,431 @@ +import numpy as np +from timeit import default_timer as timer +import argparse +import re +import shutil + +class bcolors : + """color and font style definitions for changing output appearance""" + # Reset (user after applying a color to return to normal coloring) + ENDC ='\033[0m' + + # Regular Colors + BLACK ='\033[0;30m' + RED ='\033[0;31m' + GREEN ='\033[0;32m' + YELLOW ='\033[0;33m' + BLUE ='\033[0;34m' + PURPLE ='\033[0;35m' + CYAN ='\033[0;36m' + WHITE ='\033[0;37m' + + # Text Style + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +def red(text) : + return bcolors.RED+text+bcolors.ENDC + +def green(text) : + return bcolors.GREEN+text+bcolors.ENDC + +def blue(text) : + return bcolors.BLUE+text+bcolors.ENDC + +def yellow(text) : + return bcolors.YELLOW+text+bcolors.ENDC + +def GetDataSets(statefile) : + # Open h5 file and read container info + # -------------------------------------------- + # r : Readonly, file must exist + # r+ : Read/write, file must exist + # w : Create file, truncate if exists + # w- or x : Create file, fail if exists + # a : Read/write if exists, create otherwise (default + # -------------------------------------------- + # When sorting is used, the sorted array is written to the original .h5 file with a new name + f1 = h5py.File(statefile,'r+') + + # Usage: + # ------------------- + # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., + # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' + # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' + # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 + # ------------------- + data_set = 'SurfaceData2' + + datasets = list(f1.keys()) + + f1.close() + + return datasets +# import h5 I/O routines +try : + import h5py + h5py_module_loaded = True +except ImportError : + print(red('Could not import h5py module. This is required for analyse functions.')) + exit(0) + +# Start the timer +start = timer() + +"""get command line arguments""" +parser = argparse.ArgumentParser(description='description:\n\ + Tool for merging multiple .h5 PICLas state files (MyProject_State_000.00*******.h5) containing different hdf5 containers into a single file.\n\ + Supply a single state file or a group of state files by using the wildcard "*", e.g. MyProject_000.00* for a list of file names.\n\n\ + Note the different modes that will be selected automatically depending on the name of the h5 container:\n\n\ + * \'PartData\' container will be concatenated (not added). To use this feature, supply [-p], [--particles]\n\ + * \'DG_Solution\' container in *_TimeAvg_*.h5 files will be averaged over the number of supplied files ([-a], [--average] is automatically turned on)'\ +,formatter_class=argparse.RawTextHelpFormatter) + +parser.add_argument('files', type=str, help='files (.h5) that are to be merged together.', nargs='+') +parser.add_argument('-a', '--average', action='store_true', help='average the values in the containers by dividing the sum of the arrays by the number of arrays (default=OFF)') +parser.add_argument('-p', '--particles', action='store_true', help='Concatenate \'PartData\' containers (default=OFF)') + +# Get command line arguments +args = parser.parse_args() + +# Display all command line arguments +print('='*132) +print("Running with the following command line options") +for arg in list(args.__dict__) : + print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") +print('='*132) + +# Loop over all files and identify the latet simulation time +maxtime=-1.0 +mintime=1.0e99 +NbrOfFiles = len(args.files) +files = [] +for statefile in args.files : + #print(statefile) + pat = r'^.*\_(.*)\..*$' + match = re.search(pat, statefile) + timestr = match.group(1) + try : + time = float(timestr) + maxtime=max(time,maxtime) + mintime=min(time,mintime) + if time == maxtime : + maxtimestr = timestr + maxtimeFile = statefile + newFile = re.sub(timestr+'.h5', '', statefile)+maxtimestr+'_merged.h5' + if time == mintime : + mintimestr = timestr + files.append(statefile) + except : + print("not considering "+statefile) +print("t_min : %s" % mintime) +print("t_min_str : %s" % mintimestr) + +print("t_max : %s" % maxtime) +print("t_max_str : %s" % maxtimestr) + +dt = maxtime-mintime +print("delta t : %s" % dt) +print("newfile : %s" % newFile) +print() + +# Get maximum number of characters in h5 file names +max_length=0 +AlreadyFound = False +for statefile in files : + if '_TimeAvg_' in statefile and not AlreadyFound : + print(green("Detected '_TimeAvg_' state file. Switching [-a], [--average] on.\nThis means that the arrays will be averaged after being summed up (by dividing by the total number of files).")) + args.average = True + AlreadyFound = True + max_length = max(max_length,len(statefile)) +print(132*"-") +datasets = GetDataSets(files[0]) +print("Found the following data sets:\n",datasets) + +print(132*"-") +s="Example.h5" +print("".ljust(max_length-len(s)),s," | PartData(dim1, dim2)") +print(132*"-") +n = 0 + +merged = False +foundPartData = False +foundDG_Solution = False +foundDG_Source = False +foundElemData = False +foundSurfaceData = False +for statefile in files : + n+=1 + # Open h5 file and read container info + # -------------------------------------------- + # r : Readonly, file must exist + # r+ : Read/write, file must exist + # w : Create file, truncate if exists + # w- or x : Create file, fail if exists + # a : Read/write if exists, create otherwise (default + # -------------------------------------------- + # When sorting is used, the sorted array is written to the original .h5 file with a new name + f1 = h5py.File(statefile,'r+') + + + # -------------------------------------------------------------------------------------------------------------------------------------- + # 'PartData' container (concatenate) + # -------------------------------------------------------------------------------------------------------------------------------------- + if args.particles : + merged = True + foundPartData = True + file_version = f1.attrs.get('File_Version', default=-1.)[0] + + # Usage: + # ------------------- + # available keys : print("Keys: %s" % f1.keys()) # yields, e.g., + # first key in list : a_group_key = list(f1.keys())[0] # yields 'DG_Solution' + # available attributes : print('\n'.join(x for x in f1.attrs)) # yields 'File_Type\n File_Version\n MeshFile' + # get specific attribute : file_version = f1.attrs.get('File_Version', default=-1.)[0] # yields, e.g., 1.5 + # ------------------- + data_set = 'PartData' + + if not data_set in list(f1.keys()) : + print(red("ERROR: Dataset ['%s'] not found in file. Stop." % data_set)) + exit(0) + + # 1.1.1 Read the dataset from the hdf5 file + PartData = f1[data_set][:] + print("".ljust(max_length-len(statefile)),statefile," | %s%s" % (data_set, str(PartData.shape))) + + # Save old file + if n > 1 : + # Concatenate files depending on the file version (beginning with v1.5 PartData's dimensions are switched) + if file_version < 1.5 : + # Compare shape of the dataset of both files, throw error if they do not coincide + if PartData.shape[0] != PartData_old_shape[0] : # e.g.: PartData.shape = (48, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\nThe dimensions dim1 = %s and dim2 = %s must be equal!\n\nAborted!"\ + % (statefile,statefile_old,PartData.shape,PartData_old_shape,PartData.shape[0],PartData_old_shape[0]) + print(red(s)) + exit(1) + + # Concatenate columns + PartData_merged = np.concatenate((PartData_merged, PartData), axis=1) + else : + # Compare shape of the dataset of both files, throw error if they do not coincide + if PartData.shape[1] != PartData_old_shape[1] : # e.g.: PartData.shape = (48, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\nThe dimensions dim1 = %s and dim2 = %s must be equal!\n\nAborted!"\ + % (statefile,statefile_old,PartData.shape,PartData_old_shape,PartData.shape[1],PartData_old_shape[1]) + print(red(s)) + exit(1) + # Concatenate rows + PartData_merged = np.concatenate((PartData_merged, PartData), axis=0) + else : + PartData_merged = PartData + + + # store the old shape for checking with next state file + PartData_old_shape = PartData.shape + + # -------------------------------------------------------------------------------------------------------------------------------------- + # 'DG_Solution' container (sum and maybe average if it is a *_TimeAvg_*.h5 file) + # -------------------------------------------------------------------------------------------------------------------------------------- + data_set = 'DG_Solution' + if data_set in list(f1.keys()) : + merged = True + foundDG_Solution = True + + # 1.1.1 Read the dataset from the hdf5 file + DG_Solution = f1[data_set][:] + print("".ljust(max_length-len(statefile)),statefile," | %s%s" % (data_set, str(DG_Solution.shape))) + + # Save old file + if n > 1 : + # Compare shape of the dataset of both files, throw error if they do not conincide + if DG_Solution.shape != DG_Solution_old_shape : # e.g.: DG_Solution.shape = (48, 1, 1, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\n\nAborted!"\ + % (statefile, statefile_old, DG_Solution.shape, DG_Solution_old_shape) + print(red(s)) + exit(1) + + # Add ne current array stored in DG_Solution to b + DG_Solution_merged = DG_Solution_merged + DG_Solution + else : + # Create empty array when processing the first file + DG_Solution_merged = DG_Solution + + # store the old shape for checking with next state file + DG_Solution_old_shape = DG_Solution.shape + + # -------------------------------------------------------------------------------------------------------------------------------------- + # 'DG_Source' container (sum and maybe average if it is a *_TimeAvg_*.h5 file) + # -------------------------------------------------------------------------------------------------------------------------------------- + data_set = 'DG_Source' + if data_set in list(f1.keys()) : + merged = True + foundDG_Source = True + + # 1.1.1 Read the dataset from the hdf5 file + DG_Source = f1[data_set][:] + print("".ljust(max_length-len(statefile)),statefile," | %s%s" % (data_set, str(DG_Source.shape))) + + # Save old file + if n > 1 : + # Compare shape of the dataset of both files, throw error if they do not conincide + if DG_Source.shape != DG_Source_old_shape : # e.g.: DG_Source.shape = (48, 1, 1, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\n\nAborted!"\ + % (statefile, statefile_old, DG_Source.shape, DG_Source_old_shape) + print(red(s)) + exit(1) + + # Add ne current array stored in DG_Source to b + DG_Source_merged = DG_Source_merged + DG_Source + else : + # Create empty array when processing the first file + DG_Source_merged = DG_Source + + # store the old shape for checking with next state file + DG_Source_old_shape = DG_Source.shape + + # -------------------------------------------------------------------------------------------------------------------------------------- + # 'ElemData' container (sum and maybe average if it is a *_TimeAvg_*.h5 file) + # -------------------------------------------------------------------------------------------------------------------------------------- + data_set = 'ElemData' + if data_set in list(f1.keys()) : + merged = True + foundElemData = True + + # 1.1.1 Read the dataset from the hdf5 file + ElemData = f1[data_set][:] + print("".ljust(max_length-len(statefile)),statefile," | %s%s" % (data_set, str(ElemData.shape))) + + # Save old file + if n > 1 : + # Compare shape of the dataset of both files, throw error if they do not conincide + if ElemData.shape != ElemData_old_shape : # e.g.: ElemData.shape = (48, 1, 1, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\n\nAborted!"\ + % (statefile, statefile_old, ElemData.shape, ElemData_old_shape) + print(red(s)) + exit(1) + + # Add ne current array stored in ElemData to b + ElemData_merged = ElemData_merged + ElemData + else : + # Create empty array when processing the first file + ElemData_merged = ElemData + + # store the old shape for checking with next state file + ElemData_old_shape = ElemData.shape + + # -------------------------------------------------------------------------------------------------------------------------------------- + # 'SurfaceData' container (sum and maybe average if it is a *_TimeAvg_*.h5 file) + # -------------------------------------------------------------------------------------------------------------------------------------- + data_set = 'SurfaceData' + if data_set in list(f1.keys()) : + merged = True + foundSurfaceData = True + + # 1.1.1 Read the dataset from the hdf5 file + SurfaceData = f1[data_set][:] + print("".ljust(max_length-len(statefile)),statefile," | %s%s" % (data_set, str(SurfaceData.shape))) + + # Save old file + if n > 1 : + # Compare shape of the dataset of both files, throw error if they do not conincide + if SurfaceData.shape != SurfaceData_old_shape : # e.g.: SurfaceData.shape = (48, 1, 1, 32) + s="\nDatasets are not compatible due to different shapes: Files [%s] and [%s] have shapes %s and %s\n\nAborted!"\ + % (statefile, statefile_old, SurfaceData.shape, SurfaceData_old_shape) + print(red(s)) + exit(1) + + # Add ne current array stored in SurfaceData to b + SurfaceData_merged = SurfaceData_merged + SurfaceData + else : + # Create empty array when processing the first file + SurfaceData_merged = SurfaceData + + # store the old shape for checking with next state file + SurfaceData_old_shape = SurfaceData.shape + + + + + statefile_old = statefile # store name when checking the dimensions in the next file + f1.close() + +# Check if anything was merged +if merged : + print(132*"-") + print("Finished reading data from %s files." % n) + n = float(n) + + # Copy old file and modify PartState in the new file + shutil.copyfile(maxtimeFile, newFile) + # Write new .h5 file + f1 = h5py.File(newFile,'r+') + + + if foundPartData: + data_set = 'PartData' + del f1[data_set] + # file: Create new dataset + PartDataSet = f1.create_dataset(data_set, shape=PartData_merged.shape, dtype=np.float64) + # Check if average is required + if args.average: + print(green("Averaged 'PartData' by dividing by %s" % n)) + PartData_merged = PartData_merged / n + # write as C-continuous array via np.ascontiguousarray() + PartDataSet.write_direct(np.ascontiguousarray(PartData_merged)) + print("Files have been merged into %s | %s%s" % (newFile,data_set,PartData_merged.shape)) + if foundDG_Solution: + data_set = 'DG_Solution' + del f1[data_set] + # file: Create new dataset + DG_SolutionSet = f1.create_dataset(data_set, shape=DG_Solution_merged.shape, dtype=np.float64) + # Check if average is required + if args.average: + print(green("Averaged 'DG_Solution' by dividing by %s" % n)) + DG_Solution_merged = DG_Solution_merged / n + # write as C-continuous array via np.ascontiguousarray() + DG_SolutionSet.write_direct(np.ascontiguousarray(DG_Solution_merged)) + print("Files have been merged into %s | %s%s" % (newFile,data_set,DG_Solution_merged.shape)) + if foundDG_Source: + data_set = 'DG_Source' + del f1[data_set] + # file: Create new dataset + DG_SourceSet = f1.create_dataset(data_set, shape=DG_Source_merged.shape, dtype=np.float64) + # Check if average is required + if args.average: + print(green("Averaged 'DG_Source' by dividing by %s" % n)) + DG_Source_merged = DG_Source_merged / n + # write as C-continuous array via np.ascontiguousarray() + DG_SourceSet.write_direct(np.ascontiguousarray(DG_Source_merged)) + print("Files have been merged into %s | %s%s" % (newFile,data_set,DG_Source_merged.shape)) + if foundElemData: + data_set = 'ElemData' + del f1[data_set] + # file: Create new dataset + ElemDataSet = f1.create_dataset(data_set, shape=ElemData_merged.shape, dtype=np.float64) + # Check if average is required + if args.average: + print(green("Averaged 'ElemData' by dividing by %s" % n)) + ElemData_merged = ElemData_merged / n + # write as C-continuous array via np.ascontiguousarray() + ElemDataSet.write_direct(np.ascontiguousarray(ElemData_merged)) + print("Files have been merged into %s | %s%s" % (newFile,data_set,ElemData_merged.shape)) + if foundSurfaceData: + data_set = 'SurfaceData' + del f1[data_set] + # file: Create new dataset + SurfaceDataSet = f1.create_dataset(data_set, shape=SurfaceData_merged.shape, dtype=np.float64) + # Check if average is required + if args.average: + print(green("Averaged 'SurfaceData' by dividing by %s" % n)) + SurfaceData_merged = SurfaceData_merged / n + # write as C-continuous array via np.ascontiguousarray() + SurfaceDataSet.write_direct(np.ascontiguousarray(SurfaceData_merged)) + print("Files have been merged into %s | %s%s" % (newFile,data_set,SurfaceData_merged.shape)) + + + print(132*"-") + + + + + + f1.close() From 21a98c0c8621ed02b1f8cf9288dc680b04eee30a Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 25 Jun 2020 20:57:10 +0200 Subject: [PATCH 53/74] added notice to merge state tool --- tools/merge_State/merge_State.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/merge_State/merge_State.py b/tools/merge_State/merge_State.py index 79ced7022..2bf56d795 100644 --- a/tools/merge_State/merge_State.py +++ b/tools/merge_State/merge_State.py @@ -78,7 +78,8 @@ def GetDataSets(statefile) : Supply a single state file or a group of state files by using the wildcard "*", e.g. MyProject_000.00* for a list of file names.\n\n\ Note the different modes that will be selected automatically depending on the name of the h5 container:\n\n\ * \'PartData\' container will be concatenated (not added). To use this feature, supply [-p], [--particles]\n\ - * \'DG_Solution\' container in *_TimeAvg_*.h5 files will be averaged over the number of supplied files ([-a], [--average] is automatically turned on)'\ + * \'DG_Solution\' container in *_TimeAvg_*.h5 files will be averaged over the number of supplied files ([-a], [--average] is automatically turned on)\n\n\ + Note that different types of files, e.g. "_DSMCSurfState_" and "_State_", are not allowed to be mixed. Choose one type!"' ,formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='files (.h5) that are to be merged together.', nargs='+') From 84cb9ee6b721b5c3bb50b8529f1a30630c109512 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 26 Jun 2020 22:12:58 +0200 Subject: [PATCH 54/74] updated tools table --- tools/TOOLS.md | 91 +++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/tools/TOOLS.md b/tools/TOOLS.md index fde8fc12c..b274a73a2 100644 --- a/tools/TOOLS.md +++ b/tools/TOOLS.md @@ -2,52 +2,51 @@ This is a loose collection of tools with respect to pre- and post-processing of various data. -| **Creation date** | **Name** | **Language** | **Function (short description)** | **Useful methods** | -| :-----: | :-------------------------------: | :------------: | :-----------------------------------------------------: | :-------------------------: | -| 2013-10-21 | analytic_QK_chemical_reactions | Matlab | | | -| 2020-03-23 | calcElectricCurrentPartStateBoundary | Python | Calculates the electric current deposited on a surface by summing all particle impacts (with corresponding charge) in the dataset 'PartData' in a given .h5 file by considering the temporal distance between two files | read 'PartState' from .h5 file | -| 2013-10-21 | cleanUp_stdOut_files | Python | Removes unwanted print statements from a std.out file (PICLas standard output) such as lost particle info (this is written to a .h5 file for viewing), the output of the statusline | .h5 State file creation from scratch with all required attributes | -| 2013-10-21 | convertEfieldMesh.f90 | Fortran | | | -| 2013-10-21 | convTec09ToTec06.mcr | Tecplot | | | -| 2013-10-21 | convTec09ToTec06.pl | Pearl | | | -| 2013-10-21 | convTec09ToTec06.py | Python | | | -| 2020-02-20 | crosssection_database | Python | | | -| 2013-10-21 | dat2vtk.pl | Pearl | | | -| 2013-10-21 | dat2vtk_alt.pl | Pearl | | | -| 2018-11-26 | editorconfig | Python | | | -| 2014-03-20 | electronic_data | Shell and Python | | | -| 2013-10-21 | extractParticleData.f90 | Fortran | | | -| 2019-10-31 | find_switched_indices | Shell | Search in all .f90 file recursively for occurrences of e.g. 'PartState(XXXX', where XXXX is a character string, because of the switched particle dimensions to consider how Fortran stores data column-based | | -| 2019-12-18 | flip_PartState | Python | Flips the dimensions of a 'PartState' container in one or more .h5 files to consider the cahnged dimensions of particle data to consider how Fortran stores data column-based | | -| 2020-05-12 | h5_dataset_copy | Python | Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. | | -| 2013-10-21 | laengsteZeile | Shell | | | -| 2016-04-20 | loadbalance | Python | | | -| 2013-10-21 | make_convertEfieldMesh.sh | Shell | | | -| 2013-10-21 | make_extractParticleData_GNU.sh | Shell | | | -| 2013-10-21 | make_extractParticleData_Intel.sh | Shell | | | -| 2013-10-21 | make_MergeDSMCSurfVTKFiles.sh | Shell | | | -| 2013-10-21 | make_MergeDSMCVTKFiles.sh | Shell | | | -| 2018-01-29 | matplotlib | Python | | | -| 2017-04-07 | maxima | ws maxima | | | -| 2013-10-21 | MergeAllDSMCVTKFiles.pl | Pearl | | | -| 2013-10-21 | MergeDSMCSurfVTKFiles.f90 | Fortran | | | -| 2013-10-21 | MergeDSMCVTKFiles.f90 | Fortran | | | -| 2020-04-27 | merge_DSMCSurfState | Python | merges the dataset 'SurfaceData' of all given .h5 DSMCSurfState.h5 files into a single one by summing all elements | | -| 2019-10-15 | merge_PartState | Python | | | -| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | -| 2014-01-22 | PML | Matlab | | | -| 2017-11-09 | profiling | Shell and Python | | | -| 2019-07-08 | RemoveTrailWhiteSpaces.sh | Shell | | | -| 2019-2020 | Setup_ModuleEnv | Shell | | | -| 2013-10-21 | SparkPlug_Postproctools | Python and Pearl | | | -| 2013-10-21 | tecplot_movie | Pearl and Tecplot | | | -| 2019-04-15 | test_max_warnings.sh | Shell | | | -| 2014-09-02 | toolbox_curved | Fortran | | | -| 2019-2020 | tutorials | PICLas ini files | | | -| 2016-11-18 | userblock | Shell and Python | | | -| 2019-10-22 | visuBox_PartState | Python | | | -| 2013-10-21 | writeDataBase.pl | Pearl | | | -| 2013-10-21 | writeDataBase.py | Python | | | +| **Creation date** | **Name** | **Language** | **Function (short description)** | **Useful methods** | +| :-----: | :-------------------------------: | :------------: | :-----------------------------------------------------: | :-------------------------: | +| 2013-10-21 | analytic_QK_chemical_reactions | Matlab | | | +| 2020-03-23 | calcElectricCurrentPartStateBoundary | Python | Calculates the electric current deposited on a surface by summing all particle impacts (with corresponding charge) in the dataset 'PartData' in a given .h5 file by considering the temporal distance between two files | read 'PartState' from .h5 file | +| 2013-10-21 | cleanUp_stdOut_files | Python | Removes unwanted print statements from a std.out file (PICLas standard output) such as lost particle info (this is written to a .h5 file for viewing), the output of the statusline | .h5 State file creation from scratch with all required attributes | +| 2013-10-21 | convertEfieldMesh.f90 | Fortran | | | +| 2013-10-21 | convTec09ToTec06.mcr | Tecplot | | | +| 2013-10-21 | convTec09ToTec06.pl | Pearl | | | +| 2013-10-21 | convTec09ToTec06.py | Python | | | +| 2020-02-20 | crosssection_database | Python | | | +| 2013-10-21 | dat2vtk.pl | Pearl | | | +| 2013-10-21 | dat2vtk_alt.pl | Pearl | | | +| 2018-11-26 | editorconfig | Python | | | +| 2014-03-20 | electronic_data | Shell and Python | | | +| 2013-10-21 | extractParticleData.f90 | Fortran | | | +| 2019-10-31 | find_switched_indices | Shell | Search in all .f90 file recursively for occurrences of e.g. 'PartState(XXXX', where XXXX is a character string, because of the switched particle dimensions to consider how Fortran stores data column-based | | +| 2019-12-18 | flip_PartState | Python | Flips the dimensions of a 'PartState' container in one or more .h5 files to consider the cahnged dimensions of particle data to consider how Fortran stores data column-based | | +| 2020-05-12 | h5_dataset_copy | Python | Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. | | +| 2013-10-21 | laengsteZeile | Shell | | | +| 2016-04-20 | loadbalance | Python | | | +| 2013-10-21 | make_convertEfieldMesh.sh | Shell | | | +| 2013-10-21 | make_extractParticleData_GNU.sh | Shell | | | +| 2013-10-21 | make_extractParticleData_Intel.sh | Shell | | | +| 2013-10-21 | make_MergeDSMCSurfVTKFiles.sh | Shell | | | +| 2013-10-21 | make_MergeDSMCVTKFiles.sh | Shell | | | +| 2018-01-29 | matplotlib | Python | | | +| 2017-04-07 | maxima | ws maxima | | | +| 2013-10-21 | MergeAllDSMCVTKFiles.pl | Pearl | | | +| 2013-10-21 | MergeDSMCSurfVTKFiles.f90 | Fortran | | | +| 2013-10-21 | MergeDSMCVTKFiles.f90 | Fortran | | | +| 2019-10-15 | merge_state | Python | merges the datasets of multiple .h5 PICLas state files into a single file (considers 'SurfaceData', 'ElemData', 'DG_Solution', 'DG_Sourse' and 'PartData'). When '_TimeAvg_' files supplied, the values are automatically averaged in addition to being summed up. This can also be done with a flag. | | +| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | +| 2014-01-22 | PML | Matlab | | | +| 2017-11-09 | profiling | Shell and Python | | | +| 2019-07-08 | RemoveTrailWhiteSpaces.sh | Shell | | | +| 2019-2020 | Setup_ModuleEnv | Shell | | | +| 2013-10-21 | SparkPlug_Postproctools | Python and Pearl | | | +| 2013-10-21 | tecplot_movie | Pearl and Tecplot | | | +| 2019-04-15 | test_max_warnings.sh | Shell | | | +| 2014-09-02 | toolbox_curved | Fortran | | | +| 2019-2020 | tutorials | PICLas ini files | | | +| 2016-11-18 | userblock | Shell and Python | | | +| 2019-10-22 | visuBox_PartState | Python | | | +| 2013-10-21 | writeDataBase.pl | Pearl | | | +| 2013-10-21 | writeDataBase.py | Python | | | ## ParaView Tools From fee1cbbddc2605abbf3a63eb19e555927e7b223c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 26 Jun 2020 22:22:26 +0200 Subject: [PATCH 55/74] fixed typo --- tools/TOOLS.md | 90 +++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/tools/TOOLS.md b/tools/TOOLS.md index b274a73a2..2a9a0e7bd 100644 --- a/tools/TOOLS.md +++ b/tools/TOOLS.md @@ -2,51 +2,51 @@ This is a loose collection of tools with respect to pre- and post-processing of various data. -| **Creation date** | **Name** | **Language** | **Function (short description)** | **Useful methods** | -| :-----: | :-------------------------------: | :------------: | :-----------------------------------------------------: | :-------------------------: | -| 2013-10-21 | analytic_QK_chemical_reactions | Matlab | | | -| 2020-03-23 | calcElectricCurrentPartStateBoundary | Python | Calculates the electric current deposited on a surface by summing all particle impacts (with corresponding charge) in the dataset 'PartData' in a given .h5 file by considering the temporal distance between two files | read 'PartState' from .h5 file | -| 2013-10-21 | cleanUp_stdOut_files | Python | Removes unwanted print statements from a std.out file (PICLas standard output) such as lost particle info (this is written to a .h5 file for viewing), the output of the statusline | .h5 State file creation from scratch with all required attributes | -| 2013-10-21 | convertEfieldMesh.f90 | Fortran | | | -| 2013-10-21 | convTec09ToTec06.mcr | Tecplot | | | -| 2013-10-21 | convTec09ToTec06.pl | Pearl | | | -| 2013-10-21 | convTec09ToTec06.py | Python | | | -| 2020-02-20 | crosssection_database | Python | | | -| 2013-10-21 | dat2vtk.pl | Pearl | | | -| 2013-10-21 | dat2vtk_alt.pl | Pearl | | | -| 2018-11-26 | editorconfig | Python | | | -| 2014-03-20 | electronic_data | Shell and Python | | | -| 2013-10-21 | extractParticleData.f90 | Fortran | | | -| 2019-10-31 | find_switched_indices | Shell | Search in all .f90 file recursively for occurrences of e.g. 'PartState(XXXX', where XXXX is a character string, because of the switched particle dimensions to consider how Fortran stores data column-based | | -| 2019-12-18 | flip_PartState | Python | Flips the dimensions of a 'PartState' container in one or more .h5 files to consider the cahnged dimensions of particle data to consider how Fortran stores data column-based | | -| 2020-05-12 | h5_dataset_copy | Python | Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. | | -| 2013-10-21 | laengsteZeile | Shell | | | -| 2016-04-20 | loadbalance | Python | | | -| 2013-10-21 | make_convertEfieldMesh.sh | Shell | | | -| 2013-10-21 | make_extractParticleData_GNU.sh | Shell | | | -| 2013-10-21 | make_extractParticleData_Intel.sh | Shell | | | -| 2013-10-21 | make_MergeDSMCSurfVTKFiles.sh | Shell | | | -| 2013-10-21 | make_MergeDSMCVTKFiles.sh | Shell | | | -| 2018-01-29 | matplotlib | Python | | | -| 2017-04-07 | maxima | ws maxima | | | -| 2013-10-21 | MergeAllDSMCVTKFiles.pl | Pearl | | | -| 2013-10-21 | MergeDSMCSurfVTKFiles.f90 | Fortran | | | -| 2013-10-21 | MergeDSMCVTKFiles.f90 | Fortran | | | -| 2019-10-15 | merge_state | Python | merges the datasets of multiple .h5 PICLas state files into a single file (considers 'SurfaceData', 'ElemData', 'DG_Solution', 'DG_Sourse' and 'PartData'). When '_TimeAvg_' files supplied, the values are automatically averaged in addition to being summed up. This can also be done with a flag. | | -| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | -| 2014-01-22 | PML | Matlab | | | -| 2017-11-09 | profiling | Shell and Python | | | -| 2019-07-08 | RemoveTrailWhiteSpaces.sh | Shell | | | -| 2019-2020 | Setup_ModuleEnv | Shell | | | -| 2013-10-21 | SparkPlug_Postproctools | Python and Pearl | | | -| 2013-10-21 | tecplot_movie | Pearl and Tecplot | | | -| 2019-04-15 | test_max_warnings.sh | Shell | | | -| 2014-09-02 | toolbox_curved | Fortran | | | -| 2019-2020 | tutorials | PICLas ini files | | | -| 2016-11-18 | userblock | Shell and Python | | | -| 2019-10-22 | visuBox_PartState | Python | | | -| 2013-10-21 | writeDataBase.pl | Pearl | | | -| 2013-10-21 | writeDataBase.py | Python | | | +| **Creation date** | **Name** | **Language** | **Function (short description)** | **Useful methods** | +| :-----: | :-------------------------------: | :------------: | :-----------------------------------------------------: | :-------------------------: | +| 2013-10-21 | analytic_QK_chemical_reactions | Matlab | | | +| 2020-03-23 | calcElectricCurrentPartStateBoundary | Python | Calculates the electric current deposited on a surface by summing all particle impacts (with corresponding charge) in the dataset 'PartData' in a given .h5 file by considering the temporal distance between two files | read 'PartState' from .h5 file | +| 2013-10-21 | cleanUp_stdOut_files | Python | Removes unwanted print statements from a std.out file (PICLas standard output) such as lost particle info (this is written to a .h5 file for viewing), the output of the statusline | .h5 State file creation from scratch with all required attributes | +| 2013-10-21 | convertEfieldMesh.f90 | Fortran | | | +| 2013-10-21 | convTec09ToTec06.mcr | Tecplot | | | +| 2013-10-21 | convTec09ToTec06.pl | Pearl | | | +| 2013-10-21 | convTec09ToTec06.py | Python | | | +| 2020-02-20 | crosssection_database | Python | | | +| 2013-10-21 | dat2vtk.pl | Pearl | | | +| 2013-10-21 | dat2vtk_alt.pl | Pearl | | | +| 2018-11-26 | editorconfig | Python | | | +| 2014-03-20 | electronic_data | Shell and Python | | | +| 2013-10-21 | extractParticleData.f90 | Fortran | | | +| 2019-10-31 | find_switched_indices | Shell | Search in all .f90 file recursively for occurrences of e.g. 'PartState(XXXX', where XXXX is a character string, because of the switched particle dimensions to consider how Fortran stores data column-based | | +| 2019-12-18 | flip_PartState | Python | Flips the dimensions of a 'PartState' container in one or more .h5 files to consider the cahnged dimensions of particle data to consider how Fortran stores data column-based | | +| 2020-05-12 | h5_dataset_copy | Python | Copies a dataset (e.g. PartData) from a .h5 state file to another file. Supply original datafile, target data file and dataset name. | | +| 2013-10-21 | laengsteZeile | Shell | | | +| 2016-04-20 | loadbalance | Python | | | +| 2013-10-21 | make_convertEfieldMesh.sh | Shell | | | +| 2013-10-21 | make_extractParticleData_GNU.sh | Shell | | | +| 2013-10-21 | make_extractParticleData_Intel.sh | Shell | | | +| 2013-10-21 | make_MergeDSMCSurfVTKFiles.sh | Shell | | | +| 2013-10-21 | make_MergeDSMCVTKFiles.sh | Shell | | | +| 2018-01-29 | matplotlib | Python | | | +| 2017-04-07 | maxima | ws maxima | | | +| 2013-10-21 | MergeAllDSMCVTKFiles.pl | Pearl | | | +| 2013-10-21 | MergeDSMCSurfVTKFiles.f90 | Fortran | | | +| 2013-10-21 | MergeDSMCVTKFiles.f90 | Fortran | | | +| 2019-10-15 | merge_state | Python | merges the datasets of multiple .h5 PICLas state files into a single file (considers 'SurfaceData', 'ElemData', 'DG_Solution', 'DG_Sourse' and 'PartData'). When '\_TimeAvg\_' files are supplied, the dataset values are automatically averaged in addition to being summed up. This can also be done with a flag. | | +| 2015-2017 | paraview | Python, XML and CPD | Collection of scripts and filters for ParaView, see [Link to ParaView Tools](#paraview-tools) | | +| 2014-01-22 | PML | Matlab | | | +| 2017-11-09 | profiling | Shell and Python | | | +| 2019-07-08 | RemoveTrailWhiteSpaces.sh | Shell | | | +| 2019-2020 | Setup_ModuleEnv | Shell | | | +| 2013-10-21 | SparkPlug_Postproctools | Python and Pearl | | | +| 2013-10-21 | tecplot_movie | Pearl and Tecplot | | | +| 2019-04-15 | test_max_warnings.sh | Shell | | | +| 2014-09-02 | toolbox_curved | Fortran | | | +| 2019-2020 | tutorials | PICLas ini files | | | +| 2016-11-18 | userblock | Shell and Python | | | +| 2019-10-22 | visuBox_PartState | Python | | | +| 2013-10-21 | writeDataBase.pl | Pearl | | | +| 2013-10-21 | writeDataBase.py | Python | | | ## ParaView Tools From d6efaecb3c6999c69baae83c290decb74c8bcabf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 Jun 2020 00:46:15 +0200 Subject: [PATCH 56/74] Added script for collecting std.out metrics --- tools/collect_metrics/collect_metrics.py | 301 +++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 tools/collect_metrics/collect_metrics.py diff --git a/tools/collect_metrics/collect_metrics.py b/tools/collect_metrics/collect_metrics.py new file mode 100644 index 000000000..e6f40ee42 --- /dev/null +++ b/tools/collect_metrics/collect_metrics.py @@ -0,0 +1,301 @@ +import numpy as np +from timeit import default_timer as timer +import argparse +import re +import shutil +import os +from collections import OrderedDict + +# Bind raw_input to input in Python 2 +try: + input = raw_input +except NameError: + pass + +class bcolors : + """color and font style definitions for changing output appearance""" + # Reset (user after applying a color to return to normal coloring) + ENDC ='\033[0m' + + # Regular Colors + BLACK ='\033[0;30m' + RED ='\033[0;31m' + GREEN ='\033[0;32m' + YELLOW ='\033[0;33m' + BLUE ='\033[0;34m' + PURPLE ='\033[0;35m' + CYAN ='\033[0;36m' + WHITE ='\033[0;37m' + + # Text Style + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +def red(text) : + return bcolors.RED+text+bcolors.ENDC + +def green(text) : + return bcolors.GREEN+text+bcolors.ENDC + +def blue(text) : + return bcolors.BLUE+text+bcolors.ENDC + +def yellow(text) : + return bcolors.YELLOW+text+bcolors.ENDC + +def assignOrder(order): + #@decorator + def do_assignment(to_func): + to_func.order = order + return to_func + return do_assignment + +class CollectedParameters(): + + #don't decorate functions you don't want called + def __init__(self): + #don't call this one either! + self.egg = 2 + #self.data = type('data',(object,),{})() + #self.data = {} + + + @assignOrder(1) + def GridCells(self,line): + if '#GridCells' in line : + content = line.split(':') + self.data['GridCells'] = np.int_(np.double(content[1])) + return True + else : + return False + + @assignOrder(2) + def Procs(self,line): + if '#Procs' in line : + content = line.split(':') + self.data['Procs'] = np.int_(np.double(content[1])) + return True + else : + return False + + @assignOrder(3) + def DOFs(self,line): + if '#DOFs' in line : + content = line.split(':') + self.data['DOFs'] = np.int_(np.double(content[1])) + return True + else : + return False + + @assignOrder(4) + def Timestep(self,line): + if 'Initial Timestep' in line : + content = line.split(':') + self.data['timestep'] = np.double(content[1]) + return True + else : + return False + + @assignOrder(5) + def DOFs(self,line): + if 'PICLAS FINISHED!' in line : + #print(line) + content = re.search(r"\[([A-Za-z0-9_\.\s]+)\]", line) + content = content.group(1) + if 'sec' in content : + content = content.replace('sec', '') + self.data['PICLasTime'] = np.double(content) + #self.data['PICLasTime'] = np.double(re.sub('[^0-9]','', content.group(1))) + return True + else : + return False + + @assignOrder(6) + def Efficiency(self,line): + if 'EFFICIENCY: SIMULATION TIME PER CALCULATION in [s]/[Core-h]:' in line : + #print(yellow(line)) + line = line.replace('EFFICIENCY: SIMULATION TIME PER CALCULATION in [s]/[Core-h]:', '') + if 'sec/h' in line : + line = line.replace('sec/h', '') + content = re.search(r"\[([A-Za-z0-9_\.\s\-]+)\]", line) + content = content.group(1) + self.data['Efficiency'] = np.double(content) + return True + else : + return False + + @assignOrder(7) + def Timesteps(self,line): + if '#Timesteps' in line : + content = line.split(':') + self.data['Timesteps'] = np.int_(np.double(content[1])) + return True + else : + return False + + @assignOrder(8) + def PID(self,line): + if 'PID: CALCULATION TIME PER TSTEP/DOF:' in line : + #print(line) + line = line.replace('PID: CALCULATION TIME PER TSTEP/DOF:', '') + content = re.search(r"\[([A-Za-z0-9_\.\s\-]+)\]", line) + content = content.group(1) + if 'sec' in content : + content = content.replace('sec', '') + self.data['PID'] = np.double(content) + #self.data['PICLasTime'] = np.double(re.sub('[^0-9]','', content.group(1))) + return True + else : + return False + + + +def AnalyzeStdOut(functions,line): + for func in functions: + #line='#GridCells : 3.6320000E+03' + found = func(line) + if found: + break + + + + + + + + + + +# Start the timer +start = timer() + +"""get command line arguments""" +parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-f', '--files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') +parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') + +# Get command line arguments +args = parser.parse_args() + +# Display all command line arguments +print('='*132) +print("Running with the following command line options") +for arg in list(args.__dict__) : + print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") +print('='*132) + +# Get maximum number of characters in h5 file names +max_length=0 +if args.files: + for stdfile in args.files : + max_length = max(max_length,len(stdfile)) + + InitialDataRead = True + NbrOfFiles = len(args.files) + +# Ignore: - cleaned (".new") +# - lost particles text files (".lost") +# - state files (".h5") +# - backup files (".bak") +ext = ['.new', '.lost', '.h5', '.bak'] +#print(args.files) +if args.files is not None: + for stdfile in args.files : + # Check if file can be skipped, see variable "ext" with all file extensions that are to be ignored + if stdfile.endswith(tuple(ext)): + print("%s " % stdfile + yellow("(skipping)")) + continue + + # Clean-up the current file + nLostParts, changedLines = CleanFile(stdfile,args) + + # Display results + if nLostParts > 0: + if changedLines > 0: + print("%s " % stdfile + red("Lost %s particles" % nLostParts) + " Written particles to %s-lost-particles.h5" % stdfile + red(" and removed %s lines" % changedLines)) + else: + print("%s " % stdfile + red("Lost %s particles" % nLostParts) + " Written particles to %s-lost-particles.h5" % stdfile) + else: + if changedLines > 0: + print("%s " % stdfile + red("Removed %s lines" % changedLines) ) + else: + print("%s" % stdfile) + +print(132*"-") + + + + + +MyCollParams = CollectedParameters() +functions = sorted( + #get a list of fields that have the order set + [ + getattr(MyCollParams, field) for field in dir(MyCollParams) + if hasattr(getattr(MyCollParams, field), "order") + ], + #sort them by their order + key = (lambda field: field.order) + ) + +#print(functions) + +total = [] +if args.files : + for stdfile in args.files : + AnalyzeStdOut(functions,line) +else : + #print(102*"X") + n=0 + directory = os.getcwd() + for stdfile in os.listdir(directory): + if stdfile.startswith("std") and stdfile.endswith(".out"): + #print(os.path.join(directory, stdfile)) + #MyCollParams.data['stdfile'] = os.path.join(directory, stdfile) + MyCollParams.data = OrderedDict() + MyCollParams.data['stdfile'] = stdfile + #print(stdfile) + # 1. Read the original file content + with open(stdfile) as input: + print("load %s" % stdfile) + lines = input.readlines() + + for line in lines: + AnalyzeStdOut(functions,line.strip()) + + total.append(MyCollParams.data) + #for key, value in MyCollParams.data.items() : + #print(blue(key),green(str(value))) + n+=1 + #if n>1: + #print(n) + #break + else: + continue + + +#print(total) +n=0 +OutputFile = ".stdfile.collected.csv" +with open(OutputFile, "w") as output: + for item in total: + + if n==0: + header = ''.join(',"%s"' % key for key, value in item.items() ) + header = header[1:] + print(header) + # Write the line to the file + output.write(header+'\n') + + + n+=1 + #print(item) + #print(item['stdfile']) + print("") + for key, value in item.items() : + print(blue(key),green(str(value))) + line = ''.join(',%s' % value for key, value in item.items() ) + line = line[1:] + print(line) + output.write(line+'\n') From cbaf41cf9200ec19cc2c4f4d1808c41237052f5b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 Jun 2020 02:04:46 +0200 Subject: [PATCH 57/74] Added python script for collecting files from different folders by recursive search --- tools/collect_files/collect_files.py | 140 +++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 tools/collect_files/collect_files.py diff --git a/tools/collect_files/collect_files.py b/tools/collect_files/collect_files.py new file mode 100644 index 000000000..c11214efa --- /dev/null +++ b/tools/collect_files/collect_files.py @@ -0,0 +1,140 @@ +import numpy as np +from timeit import default_timer as timer +import argparse +import re +import shutil +import os +from collections import OrderedDict + +# Bind raw_input to input in Python 2 +try: + input = raw_input +except NameError: + pass + +class bcolors : + """color and font style definitions for changing output appearance""" + # Reset (user after applying a color to return to normal coloring) + ENDC ='\033[0m' + + # Regular Colors + BLACK ='\033[0;30m' + RED ='\033[0;31m' + GREEN ='\033[0;32m' + YELLOW ='\033[0;33m' + BLUE ='\033[0;34m' + PURPLE ='\033[0;35m' + CYAN ='\033[0;36m' + WHITE ='\033[0;37m' + + # Text Style + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +def red(text) : + return bcolors.RED+text+bcolors.ENDC + +def green(text) : + return bcolors.GREEN+text+bcolors.ENDC + +def blue(text) : + return bcolors.BLUE+text+bcolors.ENDC + +def yellow(text) : + return bcolors.YELLOW+text+bcolors.ENDC + + + + + + + + + + + + + + + + + + + + + + + + +# Start the timer +start = timer() + +"""get command line arguments""" +parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.') +parser.add_argument('source', type=str, help='Files (std*.out) that are to be cleaned.') +parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') + +# Get command line arguments +args = parser.parse_args() + +# Display all command line arguments +print('='*132) +print("Running with the following command line options") +for arg in list(args.__dict__) : + print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") +print('='*132) + +# Get maximum number of characters in h5 file names +max_length=0 +if args.files: + for stdfile in args.files : + max_length = max(max_length,len(stdfile)) + + InitialDataRead = True + NbrOfFiles = len(args.files) + +#print(132*"-") + + + +paths = [] +home = os.getcwd() +#print(args.source) +print(yellow(os.path.abspath(args.source))) +print( ) + +for (dirpath, dirnames, filenames) in os.walk(args.source, topdown=True): + for file in filenames: + path = os.path.join(dirpath, file) + path = os.path.abspath(path) + oldfile = path + head,tail = os.path.split(path) + #if tail == 'ElemTimeStatistics.csv': + if tail == args.files: + + with open(oldfile) as input: + #print("load %s" % oldfile) + lines = input.readlines() + #print(len(lines)) + if len(lines) > 1: + basename = os.path.basename(head) + newfile = "%s/%s_%s" % (home,basename, tail) + #print(newfile) + print(blue(basename)+'/'+green(tail)) + #print(tail) + shutil.copyfile(oldfile, newfile) + +#print(132*"-") + +print('='*132) + + + + + + + + + From 0ce4027ec87b52ec6299e6f29775769e5c58abbe Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 Jun 2020 02:18:42 +0200 Subject: [PATCH 58/74] ignore almost empty files --- tools/collect_files/collect_files.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/collect_files/collect_files.py b/tools/collect_files/collect_files.py index c11214efa..b5608cc33 100644 --- a/tools/collect_files/collect_files.py +++ b/tools/collect_files/collect_files.py @@ -117,8 +117,9 @@ def yellow(text) : with open(oldfile) as input: #print("load %s" % oldfile) lines = input.readlines() - #print(len(lines)) - if len(lines) > 1: + + # The file should have at least two data points + if len(lines) > 2: basename = os.path.basename(head) newfile = "%s/%s_%s" % (home,basename, tail) #print(newfile) From 18cc19fda8b182cf3060db12c1ded44d411bc041 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 29 Jun 2020 13:06:23 +0200 Subject: [PATCH 59/74] Added missing load balance timers in BGGas_InsertParticles()) --- src/particles/dsmc/dsmc_bg_gas.f90 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index 2d1918e6b..04d04cac8 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -201,6 +201,9 @@ SUBROUTINE BGGas_InsertParticles() USE MOD_PARTICLE_Vars ,ONLY: PDM, PartSpecies, PartState, PEM, PartPosRef USE MOD_part_emission_tools ,ONLY: SetParticleChargeAndMass,SetParticleMPF,CalcVelocity_maxwell_lpn USE MOD_Particle_Tracking_Vars ,ONLY: DoRefmapping +#if USE_LOADBALANCE +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -210,7 +213,14 @@ SUBROUTINE BGGas_InsertParticles() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iNewPart, iPart, PositionNbr, iSpec +#if USE_LOADBALANCE +REAL :: tLBStart +#endif /*USE_LOADBALANCE*/ !=================================================================================================================================== +#if USE_LOADBALANCE +CALL LBStartTime(tLBStart) +#endif /*USE_LOADBALANCE*/ + iNewPart=0 PositionNbr = 0 DO iPart = 1, PDM%ParticleVecLength @@ -250,6 +260,9 @@ SUBROUTINE BGGas_InsertParticles() PDM%ParticleVecLength = MAX(PDM%ParticleVecLength,PositionNbr) PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + iNewPart +#if USE_LOADBALANCE +CALL LBPauseTime(LB_DSMC,tLBStart) +#endif /*USE_LOADBALANCE*/ END SUBROUTINE BGGas_InsertParticles From b3db8c9101e66da6d444a95844eb77b1095a84e0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 12:38:13 +0200 Subject: [PATCH 60/74] updated --help for merge_State.py script --- tools/merge_State/merge_State.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/merge_State/merge_State.py b/tools/merge_State/merge_State.py index 2bf56d795..602a0e356 100644 --- a/tools/merge_State/merge_State.py +++ b/tools/merge_State/merge_State.py @@ -74,12 +74,13 @@ def GetDataSets(statefile) : """get command line arguments""" parser = argparse.ArgumentParser(description='description:\n\ - Tool for merging multiple .h5 PICLas state files (MyProject_State_000.00*******.h5) containing different hdf5 containers into a single file.\n\ + Tool for merging multiple .h5 PICLas state files (MyProject_State_000.000000*.h5) containing different hdf5 containers into a single file.\n\ Supply a single state file or a group of state files by using the wildcard "*", e.g. MyProject_000.00* for a list of file names.\n\n\ Note the different modes that will be selected automatically depending on the name of the h5 container:\n\n\ - * \'PartData\' container will be concatenated (not added). To use this feature, supply [-p], [--particles]\n\ - * \'DG_Solution\' container in *_TimeAvg_*.h5 files will be averaged over the number of supplied files ([-a], [--average] is automatically turned on)\n\n\ - Note that different types of files, e.g. "_DSMCSurfState_" and "_State_", are not allowed to be mixed. Choose one type!"' + * \'%s\', \'%s\', \'%s\' and \'%s\' are added together\n\ + * \'%s\' container will be concatenated (not added together). To use this feature, supply [-p], [--particles]\n\ + * \'%s\' container in *_TimeAvg_*.h5 files will be averaged over the number of supplied files ([-a], [--average] is automatically turned on)\n\n\ + Note that different types of files, e.g. "_DSMCSurfState_" and "_State_", are not allowed to be mixed. Choose one type!' % (green("SurfaceData"), green("ElemData"), green("DG_Source"), green("DG_Solution"), green("PartData"), green("DG_Solution")) ,formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='files (.h5) that are to be merged together.', nargs='+') From e303b232c4f7073ed6b42aaeaa0ce570c0346cbf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 12:51:11 +0200 Subject: [PATCH 61/74] added description for file collecting script --- tools/collect_files/collect_files.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/collect_files/collect_files.py b/tools/collect_files/collect_files.py index b5608cc33..3a4b9fb2b 100644 --- a/tools/collect_files/collect_files.py +++ b/tools/collect_files/collect_files.py @@ -70,11 +70,21 @@ def yellow(text) : start = timer() """get command line arguments""" -parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) +parser = argparse.ArgumentParser(description='DESCRIPTION:\n\ +Collects files (e.g. ElemTimeStatistics.csv) from a user-supplied folder recursively by sweeping through all sub-directories.\n\ +All files found will be copied into the current directory and are renamed using the host directory name as prefix.\n\n\ +Example:\n\ + - files: ElemTimeStatistics.csv\n\ + - source: path/to/TestCases/\n\n\ +where TestCases/ contains the sub-directories folder1, folder2, folder3, each containing a separate version of ElemTimeStatistics.csv would result in\n\ + - folder1_ElemTimeStatistics.csv\n\ + - folder2_ElemTimeStatistics.csv\n\ + - folder3_ElemTimeStatistics.csv\n\n\ +in the directory where the script is executed.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.') parser.add_argument('source', type=str, help='Files (std*.out) that are to be cleaned.') -parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') -parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') +#parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +#parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') # Get command line arguments args = parser.parse_args() From f760b8763d9c59ea5339b48143172df658515a43 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 13:17:14 +0200 Subject: [PATCH 62/74] Updated python script for collecting - files - metrics from std.out files --- tools/collect_files/collect_files.py | 4 +- tools/collect_metrics/collect_metrics.py | 68 +++++++++++------------- 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/tools/collect_files/collect_files.py b/tools/collect_files/collect_files.py index 3a4b9fb2b..732025b29 100644 --- a/tools/collect_files/collect_files.py +++ b/tools/collect_files/collect_files.py @@ -81,8 +81,8 @@ def yellow(text) : - folder2_ElemTimeStatistics.csv\n\ - folder3_ElemTimeStatistics.csv\n\n\ in the directory where the script is executed.', formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.') -parser.add_argument('source', type=str, help='Files (std*.out) that are to be cleaned.') +parser.add_argument('files', type=str, help='Name of the files that are to be collected.') +parser.add_argument('source', type=str, help='Directory path where the recursive search starts.') #parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') #parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') diff --git a/tools/collect_metrics/collect_metrics.py b/tools/collect_metrics/collect_metrics.py index e6f40ee42..20285f8e2 100644 --- a/tools/collect_metrics/collect_metrics.py +++ b/tools/collect_metrics/collect_metrics.py @@ -150,7 +150,7 @@ def PID(self,line): -def AnalyzeStdOut(functions,line): +def AnalyzeLine(functions,line): for func in functions: #line='#GridCells : 3.6320000E+03' found = func(line) @@ -170,10 +170,22 @@ def AnalyzeStdOut(functions,line): start = timer() """get command line arguments""" -parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for cleaning std*.out files.\nSupply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names.', formatter_class=argparse.RawTextHelpFormatter) +parser = argparse.ArgumentParser(description='DESCRIPTION:\n\ +Collects metrics from std*.out files.\n\ +Supply a single file or a group of files by using the wildcard "*", e.g. std* for a list of file names or supply nothing to analyze all std.out files in the current directory.\n\n\ +Collected information includes\n\ + - Number of grid cells (#GridCells)\n\ + - Number of processors (#Procs)\n\ + - Number of field degrees of freedom (#DOFs)\n\ + - Time step (Initial Timestep)\n\ + - Total PICLas wall time (PICLAS FINISHED!)\n\ + - Simulation efficiency (SIMULATION TIME PER CALCULATION in [s]/[Core-h])\n\ + - Number of time steps (#Timesteps)\n\ + - Performance index (PID: CALCULATION TIME PER TSTEP/DOF)\n\n\ +The output is stored in .stdfile.collected.csv', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('-f', '--files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') -parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') -parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') +#parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +#parser.add_argument('-c', '--clean', action='store_true', help='Clean-up afterwards by removing any *.bak backup files.') # Get command line arguments args = parser.parse_args() @@ -199,7 +211,7 @@ def AnalyzeStdOut(functions,line): # - state files (".h5") # - backup files (".bak") ext = ['.new', '.lost', '.h5', '.bak'] -#print(args.files) +files = [] if args.files is not None: for stdfile in args.files : # Check if file can be skipped, see variable "ext" with all file extensions that are to be ignored @@ -207,20 +219,9 @@ def AnalyzeStdOut(functions,line): print("%s " % stdfile + yellow("(skipping)")) continue - # Clean-up the current file - nLostParts, changedLines = CleanFile(stdfile,args) - - # Display results - if nLostParts > 0: - if changedLines > 0: - print("%s " % stdfile + red("Lost %s particles" % nLostParts) + " Written particles to %s-lost-particles.h5" % stdfile + red(" and removed %s lines" % changedLines)) - else: - print("%s " % stdfile + red("Lost %s particles" % nLostParts) + " Written particles to %s-lost-particles.h5" % stdfile) - else: - if changedLines > 0: - print("%s " % stdfile + red("Removed %s lines" % changedLines) ) - else: - print("%s" % stdfile) + files.append(stdfile) + # Over-write files list with cleaned list + args.files = files print(132*"-") @@ -239,43 +240,38 @@ def AnalyzeStdOut(functions,line): key = (lambda field: field.order) ) -#print(functions) total = [] if args.files : for stdfile in args.files : - AnalyzeStdOut(functions,line) + MyCollParams.data = OrderedDict() + MyCollParams.data['stdfile'] = stdfile + with open(stdfile) as input: + print("load %s" % stdfile) + lines = input.readlines() + + for line in lines: + AnalyzeLine(functions,line.strip()) + + total.append(MyCollParams.data) else : - #print(102*"X") - n=0 directory = os.getcwd() for stdfile in os.listdir(directory): if stdfile.startswith("std") and stdfile.endswith(".out"): - #print(os.path.join(directory, stdfile)) - #MyCollParams.data['stdfile'] = os.path.join(directory, stdfile) MyCollParams.data = OrderedDict() MyCollParams.data['stdfile'] = stdfile - #print(stdfile) - # 1. Read the original file content with open(stdfile) as input: print("load %s" % stdfile) lines = input.readlines() for line in lines: - AnalyzeStdOut(functions,line.strip()) + AnalyzeLine(functions,line.strip()) total.append(MyCollParams.data) - #for key, value in MyCollParams.data.items() : - #print(blue(key),green(str(value))) - n+=1 - #if n>1: - #print(n) - #break else: continue -#print(total) n=0 OutputFile = ".stdfile.collected.csv" with open(OutputFile, "w") as output: @@ -290,8 +286,6 @@ def AnalyzeStdOut(functions,line): n+=1 - #print(item) - #print(item['stdfile']) print("") for key, value in item.items() : print(blue(key),green(str(value))) From dae107293a13108663bce40f9fac2bd7892c7b7c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 13:22:00 +0200 Subject: [PATCH 63/74] Added tool description in table --- tools/TOOLS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/TOOLS.md b/tools/TOOLS.md index 2a9a0e7bd..f05cfdc5b 100644 --- a/tools/TOOLS.md +++ b/tools/TOOLS.md @@ -7,6 +7,8 @@ This is a loose collection of tools with respect to pre- and post-processing of | 2013-10-21 | analytic_QK_chemical_reactions | Matlab | | | | 2020-03-23 | calcElectricCurrentPartStateBoundary | Python | Calculates the electric current deposited on a surface by summing all particle impacts (with corresponding charge) in the dataset 'PartData' in a given .h5 file by considering the temporal distance between two files | read 'PartState' from .h5 file | | 2013-10-21 | cleanUp_stdOut_files | Python | Removes unwanted print statements from a std.out file (PICLas standard output) such as lost particle info (this is written to a .h5 file for viewing), the output of the statusline | .h5 State file creation from scratch with all required attributes | +| 2020-06-27 | collect_files | Python | Collects files (e.g. ElemTimeStatistics.csv) from a user-supplied folder recursively by sweeping through all sub-directories. | .h5 State file creation from scratch with all required attributes | +| 2020-06-27 | collect_metrics | Python | Collects metrics (number of cells, time steps, processors) from std*.out files. | .h5 State file creation from scratch with all required attributes | | 2013-10-21 | convertEfieldMesh.f90 | Fortran | | | | 2013-10-21 | convTec09ToTec06.mcr | Tecplot | | | | 2013-10-21 | convTec09ToTec06.pl | Pearl | | | From 33ed67c74444db97d7ef5ec404b40003dd452d55 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 30 Jun 2020 17:07:54 +0200 Subject: [PATCH 64/74] Updated version number to 1.6.3 --- src/globals/globals_vars.f90 | 2 +- src/piclaslib.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/globals/globals_vars.f90 b/src/globals/globals_vars.f90 index a5424c27f..e0708f1cb 100644 --- a/src/globals/globals_vars.f90 +++ b/src/globals/globals_vars.f90 @@ -22,7 +22,7 @@ MODULE MOD_Globals_Vars ! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- CHARACTER(LEN=6),PARAMETER :: ProgramName = 'PICLas' !> name of this program -REAL,PARAMETER :: FileVersion = 1.62 !> FileVersion number saved in each hdf5 file with hdf5 header +REAL,PARAMETER :: FileVersion = 1.63 !> FileVersion number saved in each hdf5 file with hdf5 header REAL :: FileVersionHDF5 !> FileVersion number read from hdf5 restart file REAL :: WallTime !> Wall time needed by a simulation (is not reset by !> performing a load balance step, only by user restart) diff --git a/src/piclaslib.f90 b/src/piclaslib.f90 index a900ddea9..3029cf638 100644 --- a/src/piclaslib.f90 +++ b/src/piclaslib.f90 @@ -77,7 +77,7 @@ SUBROUTINE InitializePiclas() SWRITE(UNIT_stdOut,'(A)')" | ) ___) (___| (____/\| (____/\| ) ( |/\____) |" SWRITE(UNIT_stdOut,'(A)')" |/ \_______/(_______/(_______/|/ \|\_______)" SWRITE(UNIT_stdOut,'(132(" "))') -SWRITE(UNIT_stdOut,'(A)')"piclas version 1.6.2" +SWRITE(UNIT_stdOut,'(A)')"piclas version 1.6.3" SWRITE(UNIT_stdOut,'(132("="))') CALL ParseCommandlineArguments() From a122364f897c3d19596bfd4b2fcd29b995a83cd8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:22:31 +0200 Subject: [PATCH 65/74] - Fixed output of HDG convergence info (when 0 iterations occur) - Added load balance timers to the part of the SUBROUTINE VectorDotProduct(dim1,A,B,Resu) without ALLREDUCE --- src/analyze/analyze.f90 | 11 ++++--- src/hdg/hdg.f90 | 72 +++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index 7e6b3093b..f920852df 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -88,7 +88,7 @@ SUBROUTINE DefineParametersAnalyze() #ifdef CODE_ANALYZE CALL prms%CreateLogicalOption( 'DoCodeAnalyzeOutput' , 'print code analyze info to CodeAnalyze.csv','.TRUE.') #endif /* CODE_ANALYZE */ -CALL prms%CreateIntOption( 'Field-AnalyzeStep' , 'Analyze is performed each Nth time step','1') +CALL prms%CreateIntOption( 'Field-AnalyzeStep' , 'Analyze is performed each Nth time step. Set to 0 to completely skip.','1') CALL prms%CreateLogicalOption( 'CalcPotentialEnergy', 'Calculate Potential Energy. Output file is Database.csv','.FALSE.') CALL prms%CreateLogicalOption( 'CalcPointsPerWavelength', 'Flag to compute the points per wavelength in each cell','.FALSE.') @@ -147,7 +147,7 @@ SUBROUTINE InitAnalyze() IF ((.NOT.InterpolationInitIsDone).OR.AnalyzeInitIsDone) THEN CALL abort(& __STAMP__& - ,'InitAnalyse not ready to be called or already called.',999,999.) + ,'InitAnalyse not ready to be called or already called.') RETURN END IF SWRITE(UNIT_StdOut,'(132("-"))') @@ -164,9 +164,12 @@ SUBROUTINE InitAnalyze() doCalcTimeAverage = GETLOGICAL('CalcTimeAverage') IF(doCalcTimeAverage) CALL InitTimeAverage() -FieldAnalyzeStep = GETINT('Field-AnalyzeStep','1') -IF (FieldAnalyzeStep.EQ.0) FieldAnalyzeStep = HUGE(FieldAnalyzeStep) +FieldAnalyzeStep = GETINT('Field-AnalyzeStep') DoFieldAnalyze = .FALSE. +#if (USE_HDG) +IF (FieldAnalyzeStep.GT.0) DoFieldAnalyze = .TRUE. +#endif /*USE_HDG*/ +IF (FieldAnalyzeStep.EQ.0) FieldAnalyzeStep = HUGE(FieldAnalyzeStep) CalcEpot = GETLOGICAL('CalcPotentialEnergy') IF(CalcEpot) DoFieldAnalyze = .TRUE. IF(CalcPoyntingInt) DoFieldAnalyze = .TRUE. diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 78035a360..350493e50 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -77,7 +77,7 @@ SUBROUTINE DefineParametersHDG() CALL prms%CreateIntOption( 'HDGSkipInit' , 'TODO-DEFINE-PARAMETER', '0') CALL prms%CreateRealOption( 'HDGSkip_t0' , 'TODO-DEFINE-PARAMETER', '0.') -CALL prms%CreateLogicalOption( 'HDGDisplayConvergence' , 'Display divergence criteria: Iterations, Runtime and Residual', '.FALSE.') +CALL prms%CreateLogicalOption( 'HDGDisplayConvergence' , 'Display divergence criteria: Iterations, RunTime and Residual', '.FALSE.') END SUBROUTINE DefineParametersHDG @@ -1034,7 +1034,7 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_HDG_Vars ,ONLY: nGP_face,HDGDisplayConvergence,HDGNorm,iteration,Runtime,RunTimePerIteration +USE MOD_HDG_Vars ,ONLY: nGP_face,HDGDisplayConvergence,iteration USE MOD_HDG_Vars ,ONLY: EpsCG,MaxIterCG,PrecondType,useRelativeAbortCrit,OutIterCG USE MOD_TimeDisc_Vars ,ONLY: iter,IterDisplayStep USE MOD_Mesh_Vars ,ONLY: nSides,nMPISides_YOUR @@ -1098,6 +1098,9 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) IF(converged) THEN !converged ! SWRITE(*,*)'CG not needed, residual already =0' ! SWRITE(UNIT_StdOut,'(132("-"))') + TimeEndCG=PICLASTIME() + iteration = 0 + IF(MPIroot) CALL DisplayConvergence(TimeEndCG-TimeStartCG, iteration, Norm_R2) RETURN END IF !converged AbortCrit2=EpsCG**2 @@ -1145,21 +1148,7 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) TimeEndCG=PICLASTIME() CALL EvalResidual(RHS,lambda,R) CALL VectorDotProduct(VecSize,R(1:VecSize),R(1:VecSize),Norm_R2) !Z=V (function contains ALLREDUCE) - - IF(MPIroot)THEN - RunTime = TimeEndCG-TimeStartCG - RunTimePerIteration = RunTime/REAL(iteration) - HDGNorm = SQRT(Norm_R2) - - IF(HDGDisplayConvergence.AND.(MOD(iter,IterDisplayStep).EQ.0)) THEN - WRITE(UNIT_StdOut,'(A,X,I16)') '#iterations :',iteration - WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime [s]:',RunTime - WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime/iteration [s]:',RunTimePerIteration - !WRITE(UNIT_StdOut,'(A,X,ES16.7)')'RunTime/iteration/DOF[s]:',(TimeEndCG-TimeStartCG)/REAL(iteration*PP_nElems*nGP_vol) - WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'Final Residual :',HDGNorm - WRITE(UNIT_StdOut,'(132("-"))') - END IF - END IF ! MPIroot + IF(MPIroot) CALL DisplayConvergence(TimeEndCG-TimeStartCG, iteration, Norm_R2) RETURN END IF !converged @@ -1193,6 +1182,43 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) END SUBROUTINE CG_solver +SUBROUTINE DisplayConvergence(ElapsedTime, iteration, Norm_R2) +!----------------------------------------------------------------------------------------------------------------------------------! +! Set the global convergence properties of the HDG (CG) Solver and print then to StdOut) +!----------------------------------------------------------------------------------------------------------------------------------! +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_HDG_Vars ,ONLY: HDGDisplayConvergence,HDGNorm,RunTime,RunTimePerIteration +USE MOD_Globals ,ONLY: UNIT_StdOut +USE MOD_TimeDisc_Vars ,ONLY: iter,IterDisplayStep +!----------------------------------------------------------------------------------------------------------------------------------! +IMPLICIT NONE +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: ElapsedTime +INTEGER,INTENT(IN) :: iteration +REAL,INTENT(IN) :: Norm_R2 +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +RunTime = ElapsedTime +IF(iteration.GT.0)THEN + RunTimePerIteration = RunTime/REAL(iteration) +ELSE + RunTimePerIteration = 0. +END IF ! iteration.GT.0 +HDGNorm = SQRT(Norm_R2) + +IF(HDGDisplayConvergence.AND.(MOD(iter,IterDisplayStep).EQ.0)) THEN + WRITE(UNIT_StdOut,'(A,X,I16)') '#iterations :',iteration + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime [s]:',RunTime + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'RunTime/iteration [s]:',RunTimePerIteration + !WRITE(UNIT_StdOut,'(A,X,ES16.7)')'RunTime/iteration/DOF[s]:',(TimeEndCG-TimeStartCG)/REAL(iteration*PP_nElems*nGP_vol) + WRITE(UNIT_StdOut,'(A,X,ES25.14E3)')'Final Residual :',HDGNorm + WRITE(UNIT_StdOut,'(132("-"))') +END IF +END SUBROUTINE DisplayConvergence + + SUBROUTINE EvalResidual(RHS,lambda,R,iVar) !=================================================================================================================================== ! @@ -1416,6 +1442,9 @@ SUBROUTINE VectorDotProduct(dim1,A,B,Resu) ! MODULES USE MOD_Globals USE MOD_PreProc +#if USE_LOADBALANCE +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1432,12 +1461,21 @@ SUBROUTINE VectorDotProduct(dim1,A,B,Resu) #if USE_MPI REAL :: ResuSend #endif +#if USE_LOADBALANCE +REAL :: tLBStart +#endif /*USE_LOADBALANCE*/ !=================================================================================================================================== +#if USE_LOADBALANCE +CALL LBStartTime(tLBStart) ! Start time measurement +#endif /*USE_LOADBALANCE*/ Resu=0. DO i=1,dim1 Resu=Resu + A(i)*B(i) END DO +#if USE_LOADBALANCE +CALL LBPauseTime(LB_DG,tLBStart) ! Pause/Stop time measurement +#endif /*USE_LOADBALANCE*/ #if USE_MPI ResuSend=Resu From f726bff034ee677b8b74e9ea7c7209331b2a08eb Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:23:59 +0200 Subject: [PATCH 66/74] Removed MPI Reduce calls in field analyze for magnetic field and correction factors (Maxwell only) --- src/analyze/analyzefield.f90 | 112 ++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 29 deletions(-) diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index 5e85b6b90..c1b5e3dba 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -66,8 +66,10 @@ SUBROUTINE AnalyzeField(Time) ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_Analyze_Vars ,ONLY: DoFieldAnalyze,CalcEpot,CalcPoyntingInt,nPoyntingIntPlanes,PosPoyntingInt, & - Wel,Wmag,Wphi,Wpsi +USE MOD_Analyze_Vars ,ONLY: DoFieldAnalyze,CalcEpot,CalcPoyntingInt,nPoyntingIntPlanes,PosPoyntingInt,WEl +#if (PP_nVar==8) +USE MOD_Analyze_Vars ,ONLY: WMag,WPhi,WPsi +#endif /*PP_nVar=8*/ USE MOD_Particle_Analyze_Vars,ONLY: IsRestart USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Dielectric_Vars ,ONLY: DoDielectric @@ -88,23 +90,31 @@ SUBROUTINE AnalyzeField(Time) INTEGER :: unit_index, nOutputVarTotal,iPlane REAL :: PoyntingIntegral(1:nPoyntingIntPlanes) CHARACTER(LEN=150) :: formatStr +#if (PP_nVar==8) +INTEGER,PARAMETER :: helpInt=4 +#else +INTEGER,PARAMETER :: helpInt=0 +#endif /*PP_nVar=8*/ #if USE_HDG -INTEGER,PARAMETER :: nOutputVar=10 +INTEGER,PARAMETER :: helpInt2=4 #else -INTEGER,PARAMETER :: nOutputVar=6 +INTEGER,PARAMETER :: helpInt2=0 #endif /*USE_HDG*/ +INTEGER,PARAMETER :: nOutputVar=2+helpInt+helpInt2 CHARACTER(LEN=255),DIMENSION(nOutputVar) :: StrVarNames(nOutputVar)=(/ CHARACTER(LEN=255) :: & 'time', & - 'E-El', & - 'E-Mag', & + 'E-El' & +#if (PP_nVar==8) + ,'E-Mag', & 'E-phi', & 'E-psi', & - 'E-pot' & + 'E-pot' & +#endif /*PP_nVar=8*/ #if USE_HDG - ,'#iterations', & - 'RunTime', & - 'RunTimePerIteration', & - 'HDGNorm' & + ,'HDG-#iterations', & + 'HDG-RunTime', & + 'HDG-RunTimePerIteration', & + 'HDG-Norm' & #endif /*USE_HDG*/ /) CHARACTER(LEN=255),ALLOCATABLE :: tmpStr(:) ! needed because PerformAnalyze is called multiple times at the beginning @@ -135,16 +145,24 @@ SUBROUTINE AnalyzeField(Time) ! Set the header line content nPoyntingIntPlanes=MERGE(nPoyntingIntPlanes,0,CalcPoyntingInt) ! set to zero if the flag is false (otherwise not initialized) nOutputVarTotal = nOutputVar + nPoyntingIntPlanes +#if (PP_nVar==8) IF(.NOT.CalcEpot) nOutputVarTotal = nOutputVarTotal - 5 +#else + IF(.NOT.CalcEpot) nOutputVarTotal = nOutputVarTotal - 1 +#endif /*PP_nVar=8*/ ALLOCATE(tmpStr(1:nOutputVarTotal)) tmpStr="" nOutputVarTotal = 0 DO I=1,nOutputVar ! When NOT CalcEpot, skip entries 2,...,6 +#if (PP_nVar==8) IF((.NOT.CalcEpot).AND.((1.LT.I).AND.(I.LE.6))) CYCLE - WRITE(tmpStr(I),'(A,I0.3,A)')delimiter//'"',I,'-'//TRIM(StrVarNames(I))//'"' +#else + IF((.NOT.CalcEpot).AND.(I.EQ.2)) CYCLE +#endif /*PP_nVar=8*/ nOutputVarTotal = nOutputVarTotal + 1 + WRITE(tmpStr(nOutputVarTotal),'(A,I0.3,A)')delimiter//'"',nOutputVarTotal,'-'//TRIM(StrVarNames(I))//'"' END DO IF(CalcPoyntingInt)THEN @@ -158,17 +176,14 @@ SUBROUTINE AnalyzeField(Time) ! Set the format WRITE(formatStr,'(A1)')'(' DO I=1,nOutputVarTotal - IF(I.EQ.nOutputVarTotal)THEN ! skip writing "," and the end of the line - WRITE(formatStr,'(A,A1,I2)')TRIM(formatStr),'A',LEN_TRIM(tmpStr(I)) - ELSE - WRITE(formatStr,'(A,A1,I2,A1)')TRIM(formatStr),'A',LEN_TRIM(tmpStr(I)),',' - END IF + WRITE(formatStr,'(A,A1,A1,I2)')TRIM(formatStr),',','A',LEN_TRIM(tmpStr(I)) END DO + formatStr(2:2) = ' ' ! remove comma + WRITE(formatStr,'(A,A1)')TRIM(formatStr),')' ! finish the format - WRITE(formatStr,'(A,A1)')TRIM(formatStr),')' ! finish the format - WRITE(tmpStr2,formatStr)tmpStr ! use the format and write the header names to a temporary string - tmpStr2(1:1) = " " ! remove possible delimiter at the beginning (e.g. a comma) - WRITE(unit_index,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the temporary string + WRITE(tmpStr2,formatStr)tmpStr(1:nOutputVarTotal) ! use the format and write the header names to a temporary string + tmpStr2(1:1) = " " ! remove possible delimiter at the beginning (e.g. a comma) + WRITE(unit_index,'(A)')TRIM(ADJUSTL(tmpStr2)) ! clip away the front and rear white spaces of the temporary string END IF END IF #if USE_MPI @@ -181,11 +196,19 @@ SUBROUTINE AnalyzeField(Time) ! 2) magnetic field ! 3) divergence correction magnetic ! 4) divergence correction electric + charge +#if (PP_nVar==8) IF(DoDielectric)THEN - CALL CalcPotentialEnergy_Dielectric(WEl,WMag, Wphi, Wpsi) + CALL CalcPotentialEnergy_Dielectric(WEl,WMag,Wphi,Wpsi) ELSE CALL CalcPotentialEnergy(WEl,WMag,Wphi,Wpsi) END IF +#else + IF(DoDielectric)THEN + CALL CalcPotentialEnergy_Dielectric(WEl) + ELSE + CALL CalcPotentialEnergy(WEl) + END IF +#endif /*PP_nVar=8*/ END IF #if (PP_nVar>=6) IF(CalcPoyntingInt) CALL CalcPoyntingIntegral(PoyntingIntegral,doProlong=.TRUE.) @@ -195,10 +218,12 @@ SUBROUTINE AnalyzeField(Time) WRITE(unit_index,'(E23.16E3)',ADVANCE='NO') Time IF (CalcEpot) THEN WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl +#if (PP_nVar==8) WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WMag WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPhi WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WPsi WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', WEl + WMag + WPhi + WPsi +#endif /*PP_nVar=8*/ END IF IF(CalcPoyntingInt)THEN DO iPlane=1,nPoyntingIntPlanes @@ -699,7 +724,12 @@ SUBROUTINE FinalizePoyntingInt() END SUBROUTINE FinalizePoyntingInt + +#if (PP_nVar==8) SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) +#else +SUBROUTINE CalcPotentialEnergy(WEl) +#endif /*PP_nVar=8*/ !=================================================================================================================================== ! Initializes variables necessary for analyse subroutines !=================================================================================================================================== @@ -708,7 +738,10 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) USE MOD_Preproc USE MOD_Mesh_Vars, ONLY : nElems, sJ USE MOD_Interpolation_Vars, ONLY : wGP -USE MOD_Equation_Vars, ONLY : smu0, eps0 +#if (PP_nVar==8) +USE MOD_Equation_Vars, ONLY : smu0 +#endif /*PP_nVar=8*/ +USE MOD_Equation_Vars, ONLY : eps0 #if !(USE_HDG) USE MOD_DG_Vars, ONLY : U #endif /*PP_nVar=8*/ @@ -729,7 +762,10 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL,INTENT(OUT) :: WEl, WMag , Wpsi,Wphi +REAL,INTENT(OUT) :: WEl +#if (PP_nVar==8) +REAL,INTENT(OUT) :: WMag,Wpsi,Wphi +#endif /*PP_nVar=8*/ !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iElem @@ -748,9 +784,11 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) !=================================================================================================================================== Wel=0. +#if (PP_nVar==8) WMag=0. Wphi=0. Wpsi=0. +#endif /*PP_nVar=8*/ DO iElem=1,nElems #if !(USE_HDG) IF(DoPML)THEN @@ -809,8 +847,8 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) END DO WEl = WEl * eps0 * 0.5 -WMag = WMag * smu0 * 0.5 #if (PP_nVar==8) +WMag = WMag * smu0 * 0.5 ! caution: change of coefficients for divergence energies Wphi = Wphi * eps0*0.5 Wpsi = Wpsi * smu0*0.5 @@ -820,15 +858,15 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) ! todo: only one reduce with array IF(MPIRoot)THEN CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) #if (PP_nVar==8) + CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) CALL MPI_REDUCE(MPI_IN_PLACE,Wphi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) CALL MPI_REDUCE(MPI_IN_PLACE,Wpsi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) #endif /*PP_nVar=8*/ ELSE CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) #if (PP_nVar==8) + CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) CALL MPI_REDUCE(Wphi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) CALL MPI_REDUCE(Wpsi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) #endif /*PP_nVar=8*/ @@ -838,7 +876,11 @@ SUBROUTINE CalcPotentialEnergy(WEl, WMag, Wphi, Wpsi) END SUBROUTINE CalcPotentialEnergy +#if (PP_nVar==8) SUBROUTINE CalcPotentialEnergy_Dielectric(WEl, WMag, Wphi, Wpsi) +#else +SUBROUTINE CalcPotentialEnergy_Dielectric(WEl) +#endif /*PP_nVar=8*/ !=================================================================================================================================== ! Initializes variables necessary for analyse subroutines !=================================================================================================================================== @@ -854,8 +896,9 @@ SUBROUTINE CalcPotentialEnergy_Dielectric(WEl, WMag, Wphi, Wpsi) USE MOD_Interpolation_Vars ,ONLY: wGP #if (PP_nVar==8) USE MOD_Dielectric_vars ,ONLY: DielectricMu +USE MOD_Equation_Vars ,ONLY: smu0 #endif /*PP_nVar=8*/ -USE MOD_Equation_Vars ,ONLY: smu0, eps0 +USE MOD_Equation_Vars ,ONLY: eps0 USE MOD_Dielectric_vars ,ONLY: isDielectricElem,DielectricEps,ElemToDielectric #if !(USE_HDG) USE MOD_DG_Vars ,ONLY: U @@ -877,7 +920,10 @@ SUBROUTINE CalcPotentialEnergy_Dielectric(WEl, WMag, Wphi, Wpsi) ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL,INTENT(OUT) :: WEl, WMag , Wpsi,Wphi +REAL,INTENT(OUT) :: WEl +#if (PP_nVar==8) +REAL,INTENT(OUT) :: WMag,Wpsi,Wphi +#endif /*PP_nVar=8*/ !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iElem @@ -896,9 +942,11 @@ SUBROUTINE CalcPotentialEnergy_Dielectric(WEl, WMag, Wphi, Wpsi) !=================================================================================================================================== Wel=0. +#if (PP_nVar==8) WMag=0. Wphi=0. Wpsi=0. +#endif /*PP_nVar=8*/ DO iElem=1,nElems #if !(USE_HDG) @@ -1001,18 +1049,24 @@ SUBROUTINE CalcPotentialEnergy_Dielectric(WEl, WMag, Wphi, Wpsi) END DO WEl = WEl * eps0 * 0.5 +#if (PP_nVar==8) WMag = WMag * smu0 * 0.5 ! caution: change of coefficients for divergence energies Wphi = Wphi * eps0*0.5 Wpsi = Wpsi * smu0*0.5 +#endif /*PP_nVar=8*/ #if USE_MPI IF(MPIRoot)THEN CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) +#if (PP_nVar==8) CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) +#endif /*PP_nVar=8*/ ELSE CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) +#if (PP_nVar==8) CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) +#endif /*PP_nVar=8*/ END IF #endif /*USE_MPI*/ From 45a9db9dda0731ab19fa5092bcf6af9ba30d5cb7 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:25:17 +0200 Subject: [PATCH 67/74] removed duplicate output of PICLas wall time --- src/init/piclas_init.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index b096365d7..8e479fe53 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -417,7 +417,6 @@ SUBROUTINE FinalizePiclas(IsLoadBalance) #endif /*USE_LOADBALANCE*/ CALL DisplaySimulationTime(Time, StartTime, 'FINISHED') ELSE - SWRITE(UNIT_stdOut,'(A,F14.2,A)') ' PICLAS RUNNING! [',Time-StartTime,' sec ]' CALL DisplaySimulationTime(Time, StartTime, 'RUNNING') END IF ! .NOT.IsLoadBalance SWRITE(UNIT_stdOut,'(132("="))') From fcf30f42d67be0801c07d69e0df0fb0c73514310 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:25:41 +0200 Subject: [PATCH 68/74] Removed unused vars and added comments to LB vars --- src/interpolation/interpolation.f90 | 2 ++ src/loadbalance/loadbalance_vars.f90 | 8 ++++---- src/particles/particle_rhs.f90 | 1 - 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/interpolation/interpolation.f90 b/src/interpolation/interpolation.f90 index eb50ba773..4c1a59f05 100644 --- a/src/interpolation/interpolation.f90 +++ b/src/interpolation/interpolation.f90 @@ -126,7 +126,9 @@ SUBROUTINE InitInterpolation(NIn) !---------------------------------------------------------------------------------------------------------------------------- !local variables CHARACTER(LEN=40) :: DefStr +#if !(PP_N == N) INTEGER :: Ntmp +#endif /*!(PP_N == N)*/ !============================================================================================================================ IF (InterpolationInitIsDone) THEN CALL CollectiveStop(__STAMP__,& diff --git a/src/loadbalance/loadbalance_vars.f90 b/src/loadbalance/loadbalance_vars.f90 index 59be6c2b5..98cd97e1b 100644 --- a/src/loadbalance/loadbalance_vars.f90 +++ b/src/loadbalance/loadbalance_vars.f90 @@ -23,13 +23,13 @@ MODULE MOD_LoadBalance_Vars ! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- LOGICAL :: DoLoadBalance ! DoLoadBalance -LOGICAL :: PerformLoadBalance=.FALSE. ! Flag if loadbalance is performed in current iter -INTEGER :: LoadBalanceSample ! Number of samples for loadbalance +LOGICAL :: PerformLoadBalance=.FALSE. ! Flag if load balance is performed in current time step iteration +INTEGER :: LoadBalanceSample ! Number of samples for load balance LOGICAL :: PerformLBSample ! Flag for enabling time measurement in current - ! timestep (automatically set depending on LB + ! Time step (automatically set depending on LB ! sampling method) LOGICAL :: PerformPartWeightLB ! Flag for performing LB with partMPIWeight - ! instead of summed Elemtimes + ! instead of summed ElemTimes ! -> nParts*PartWeight written into elemtime array LOGICAL :: InitLoadBalanceIsDone ! Switch for checking diff --git a/src/particles/particle_rhs.f90 b/src/particles/particle_rhs.f90 index a4e135695..9de8ac9bd 100644 --- a/src/particles/particle_rhs.f90 +++ b/src/particles/particle_rhs.f90 @@ -662,7 +662,6 @@ SUBROUTINE PartRHS_CEM(PartID,FieldAtParticle,Pt,LorentzFacInvIn) REAL,INTENT(OUT) :: Pt(1:3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: qmt REAL :: velosq,F(1:3) !=================================================================================================================================== ASSOCIATE (& From 90dc1bffee89af8e754c92680ac1bcb31692875c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:26:05 +0200 Subject: [PATCH 69/74] Skip the output of all read-in parameters during load balance step --- src/readintools/options.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/readintools/options.f90 b/src/readintools/options.f90 index 2fb9f9daf..ae08cd9ff 100644 --- a/src/readintools/options.f90 +++ b/src/readintools/options.f90 @@ -313,6 +313,9 @@ SUBROUTINE print(this, maxNameLen, maxValueLen, mode) ! MODULES USE MOD_StringTools USE MOD_ISO_VARYING_STRING +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance +#endif /*USE_LOADBALANCE*/ IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES @@ -328,6 +331,9 @@ SUBROUTINE print(this, maxNameLen, maxValueLen, mode) INTEGER :: length INTEGER :: commentLen !================================================================================================================================== +#if USE_LOADBALANCE +IF(PerformLoadBalance) RETURN +#endif /*USE_LOADBALANCE*/ IF(mode.EQ.1) commentLen=80 !--help IF(mode.EQ.2) commentLen=50 !--markdown WRITE(fmtName,*) maxNameLen From 34b852cf76ab7aa7a69ea462be8f8d7b90c1dc2b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:26:31 +0200 Subject: [PATCH 70/74] Removed read-in of HDG lambda solution during restart as the side sorting is not correct, this will be fixed in a future update --- src/restart/restart.f90 | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/restart/restart.f90 b/src/restart/restart.f90 index c0048c320..6765ca85a 100644 --- a/src/restart/restart.f90 +++ b/src/restart/restart.f90 @@ -330,7 +330,7 @@ SUBROUTINE Restart() USE MOD_Dielectric_Vars ,ONLY: DoDielectricSurfaceCharge #endif /*PARTICLES*/ #if USE_HDG -USE MOD_HDG_Vars ,ONLY: lambda, nGP_face +USE MOD_HDG_Vars ,ONLY: lambda!, nGP_face USE MOD_HDG ,ONLY: RestartHDG #endif /*USE_HDG*/ #if USE_QDS_DG @@ -354,7 +354,8 @@ SUBROUTINE Restart() INTEGER :: iPML #endif #if USE_HDG -LOGICAL :: DG_SolutionLambdaExists,DG_SolutionUExists +!LOGICAL :: DG_SolutionLambdaExists +LOGICAL :: DG_SolutionUExists INTEGER(KIND=8) :: iter #endif /*USE_HDG*/ INTEGER :: iElem @@ -533,13 +534,16 @@ SUBROUTINE Restart() ! !DG_Solution contains a 4er-/3er-/7er-array, not PP_nVar!!! CALL ReadArray('DG_Solution' ,5,(/PP_nVarTmp,PP_NTmp+1_IK,PP_NTmp+1_IK,PP_NTmp+1_IK,PP_nElemsTmp/),OffsetElemTmp,5,RealArray=U) END IF - CALL DatasetExists(File_ID,'DG_SolutionLambda',DG_SolutionLambdaExists) - IF(DG_SolutionLambdaExists)THEN - CALL ReadArray('DG_SolutionLambda',3,(/PP_nVarTmp,nGP_face,nSides-nMPISides_YOUR/),offsetSide,3,RealArray=lambda) - CALL RestartHDG(U) ! calls PostProcessGradient for calculate the derivative, e.g., the electric field E - ELSE - lambda=0. - END IF + ! CURRENTLY, THE FOLLOWING DOES NOT MAKE SENSE AS THE SIDES ARE NOT SORTED CORRECTLY! + !CALL DatasetExists(File_ID,'DG_SolutionLambda',DG_SolutionLambdaExists) + !IF(DG_SolutionLambdaExists)THEN + ! write(*,*) "READ lambda" + ! stop + ! CALL ReadArray('DG_SolutionLambda',3,(/PP_nVarTmp,nGP_face,nSides-nMPISides_YOUR/),offsetSide,3,RealArray=lambda) + ! CALL RestartHDG(U) ! calls PostProcessGradient for calculate the derivative, e.g., the electric field E + !ELSE + lambda=0. + !END IF #else CALL ReadArray('DG_Solution',5,(/PP_nVarTmp,PP_NTmp+1_IK,PP_NTmp+1_IK,PP_NTmp+1_IK,PP_nElemsTmp/),OffsetElemTmp,5,RealArray=U) IF(DoPML)THEN From 5fe07d73f1198ffb04d4c340d5e8556058e9b311 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 30 Jun 2020 20:27:39 +0200 Subject: [PATCH 71/74] Added coloured output to ' PERFORMING LOAD BALANCE ...' --- src/loadbalance/loadbalance.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 8169413ae..85289d25b 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -372,6 +372,7 @@ SUBROUTINE LoadBalance() USE MOD_LoadBalance_Vars ,ONLY: CurrentImbalance, MaxWeight, MinWeight USE MOD_LoadBalance_Vars ,ONLY: Currentimbalance, PerformLoadBalance USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField +USE MOD_StringTools ,ONLY: set_formatting,clear_formatting ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -397,7 +398,9 @@ SUBROUTINE LoadBalance() SWRITE(UNIT_StdOut,'(X)') SWRITE(UNIT_StdOut,'(X)') SWRITE(UNIT_StdOut,'(132("="))') +CALL set_formatting("green") SWRITE(UNIT_stdOut,'(A)') ' PERFORMING LOAD BALANCE ...' +CALL clear_formatting() ! Measure init duration LB_StartTime=PICLASTIME() From 00f384ea4cbfdf24b9041035af2b53f4224c151c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Jul 2020 11:13:39 +0200 Subject: [PATCH 72/74] Clean-up LoadBalanc=OFF, which is now also considered in the reggie example CHE_BGK --- regressioncheck/checks/CHE_BGK/builds.ini | 15 +++++++------- src/loadbalance/loadbalance.f90 | 10 +++++----- src/loadbalance/loadbalance_tools.f90 | 24 +++++++++++------------ src/loadbalance/loaddistribution.f90 | 3 +-- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/regressioncheck/checks/CHE_BGK/builds.ini b/regressioncheck/checks/CHE_BGK/builds.ini index 3d24954ce..0c67de8a5 100644 --- a/regressioncheck/checks/CHE_BGK/builds.ini +++ b/regressioncheck/checks/CHE_BGK/builds.ini @@ -2,10 +2,11 @@ binary=./bin/piclas ! fixed compiler flags -CMAKE_BUILD_TYPE=RELEASE -PICLAS_BUILD_HDF5=OFF -PICLAS_POLYNOMIAL_DEGREE=N -PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=BGK-Flow -PICLAS_MPI=ON -PICLAS_NODETYPE=GAUSS +CMAKE_BUILD_TYPE = RELEASE +PICLAS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = BGK-Flow +PICLAS_MPI = ON +PICLAS_NODETYPE = GAUSS +PICLAS_LOADBALANCE = OFF diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 85289d25b..c86fac0fb 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -33,14 +33,15 @@ MODULE MOD_LoadBalance INTERFACE ComputeElemLoad MODULE PROCEDURE ComputeElemLoad END INTERFACE -#endif /*USE_LOADBALANCE*/ INTERFACE LoadBalance MODULE PROCEDURE LoadBalance END INTERFACE +#endif /*USE_LOADBALANCE*/ -PUBLIC::InitLoadBalance,LoadBalance +PUBLIC::InitLoadBalance #if USE_LOADBALANCE +PUBLIC::LoadBalance PUBLIC::ComputeElemLoad #endif /*USE_LOADBALANCE*/ #endif /*USE_MPI*/ @@ -153,7 +154,7 @@ SUBROUTINE InitLoadBalance() PerformLBSample = .FALSE. #if USE_LOADBALANCE -ALLOCATE( tCurrent(1:LB_NTIMES) ) +ALLOCATE(tCurrent(1:LB_NTIMES)) ! Allocation length (1:number of loadbalance times) ! look into piclas.h for more info about time names tCurrent=0. @@ -350,7 +351,6 @@ SUBROUTINE ComputeElemLoad() tCurrent = 0. END SUBROUTINE ComputeElemLoad -#endif /*USE_LOADBALANCE*/ SUBROUTINE LoadBalance() @@ -453,7 +453,7 @@ SUBROUTINE LoadBalance() SWRITE(UNIT_StdOut,'(132("="))') END SUBROUTINE LoadBalance -#if USE_LOADBALANCE + SUBROUTINE ComputeImbalance() !----------------------------------------------------------------------------------------------------------------------------------! ! subroutine to compute the imbalance diff --git a/src/loadbalance/loadbalance_tools.f90 b/src/loadbalance/loadbalance_tools.f90 index 775ade7be..29cc8c5e8 100644 --- a/src/loadbalance/loadbalance_tools.f90 +++ b/src/loadbalance/loadbalance_tools.f90 @@ -45,23 +45,22 @@ SUBROUTINE DomainDecomposition() USE MOD_Globals USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems -#if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: ElemTimeField -#ifdef PARTICLES -USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart -#endif /*PARTICLES*/ -#endif /*USE_LOADBALANCE*/ -#if USE_HDG && USE_LOADBALANCE +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: ElemTime +#if USE_HDG USE MOD_LoadBalance_Vars ,ONLY: ElemHDGSides,TotalHDGSides USE MOD_Analyze_Vars ,ONLY: CalcMeshInfo -#endif /*USE_HDG && USE_LOADBALANCE*/ +#endif /*USE_HDG*/ +#endif /*USE_LOADBALANCE*/ USE MOD_MPI_Vars ,ONLY: offsetElemMPI USE MOD_LoadDistribution ,ONLY: ApplyWeightDistributionMethod #ifdef PARTICLES USE MOD_Particle_VarTimeStep ,ONLY: VarTimeStep_InitDistribution USE MOD_Particle_Vars ,ONLY: VarTimeStep +USE MOD_LoadBalance_Vars ,ONLY: ElemTimePart #endif /*PARTICLES*/ -USE MOD_LoadBalance_Vars ,ONLY: NewImbalance,MaxWeight,MinWeight,ElemGlobalTime,LoadDistri,PartDistri,TargetWeight,ElemTime +USE MOD_LoadBalance_Vars ,ONLY: NewImbalance,MaxWeight,MinWeight,ElemGlobalTime,LoadDistri,PartDistri,TargetWeight USE MOD_IO_HDF5 !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE @@ -154,9 +153,8 @@ SUBROUTINE DomainDecomposition() ! read ElemTime by all ranks CALL ReadElemTime(single=.FALSE.) END IF ! ElemTimeExists -#endif /*USE_LOADBALANCE*/ -#if USE_HDG && USE_LOADBALANCE +#if USE_HDG ! Allocate container for number of master sides for the HDG solver for each element SDEALLOCATE(ElemHDGSides) ALLOCATE(ElemHDGSides(1:nElems)) @@ -165,17 +163,19 @@ SUBROUTINE DomainDecomposition() CALL AddToElemData(ElementOut,'ElemHDGSides',IntArray=ElemHDGSides(1:nElems)) END IF ! CalcMeshInfo TotalHDGSides=0 -#endif /*USE_HDG && USE_LOADBALANCE*/ +#endif /*USE_HDG*/ ! Set new ElemTime depending on new load distribution SDEALLOCATE(ElemTime) ALLOCATE(ElemTime(1:nElems)) ElemTime=0. +CALL AddToElemData(ElementOut,'ElemTime',RealArray=ElemTime(1:nElems)) +#endif /*USE_LOADBALANCE*/ + #ifdef PARTICLES ElemTimePart = 0. #endif /*PARTICLES*/ ElemTimeField = 0. -CALL AddToElemData(ElementOut,'ElemTime',RealArray=ElemTime(1:nElems)) ! Calculate new (theoretical) imbalance with offsetElemMPI information IF(ElemTimeExists.AND.MPIRoot)THEN diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 18363b33a..c22f3bbfc 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1193,8 +1193,7 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time,iter) END IF #ifdef PARTICLES ! Calculate elem time proportions for field and particle routines - SumElemTime=ElemTimeField - SumElemTime=SumElemTime+ElemTimePart + SumElemTime=ElemTimeField+ElemTimePart IF(SumElemTime.LE.0.)THEN ElemTimeFieldPercent = 0. ElemTimePartPercent = 0. From 7b4d5d3cf535521d9b1c259f65f88933784c30fa Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 1 Jul 2020 16:49:43 +0200 Subject: [PATCH 73/74] Fixed install target for piclas library --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eba3c4364..125b40c27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -628,13 +628,15 @@ function(add_exec target) ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "SUCCESS: ${TARGETUP} BUILD COMPLETE!") endfunction() -FUNCTION(add_lib target) +FUNCTION(add_lib_shared target) ADD_LIBRARY(${target} SHARED ${ARGN}) TARGET_LINK_LIBRARIES(${target} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/userblock.o libpiclasstatic userblocklib stacksizelib ${linkedlibs}) SET_TARGET_PROPERTIES(${target} PROPERTIES PREFIX "" COMPILE_FLAGS ${PICLAS_COMPILE_FLAGS} LINKER_LANGUAGE Fortran) - INSTALL(PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${target} DESTINATION bin) + INSTALL(TARGETS ${target} LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_EXECUTE) STRING(TOUPPER ${target} TARGETUP) ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "SUCCESS: ${TARGETUP} BUILD COMPLETE!") ENDFUNCTION() @@ -767,7 +769,7 @@ SET_TARGET_PROPERTIES(stacksizelib PROPERTIES LINKER_LANGUAGE C # we link the statically built libs -add_lib(libpiclasshared ./src/piclaslib.f90) +add_lib_shared(libpiclasshared ./src/piclaslib.f90) SET_TARGET_PROPERTIES(libpiclasshared PROPERTIES OUTPUT_NAME "libpiclas") ADD_DEPENDENCIES(libpiclasshared libpiclasstatic userblocklib stacksizelib ${INTERNALLIBS}) add_exec(piclas ./src/piclas.f90) @@ -822,7 +824,6 @@ ADD_CUSTOM_COMMAND(TARGET piclas POST_BUILD COMMAND echo \"alias piclas='${C # Install # ========================================================================= INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/configuration.cmake ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/userblock.txt DESTINATION bin) - # ========================================================================= # Ctags # ========================================================================= From ca62590a2abe3c3d3ecdf3cab58886cef2d377dc Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 1 Jul 2020 16:57:13 +0200 Subject: [PATCH 74/74] Added WORLD_READ permission for shared libraries --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 125b40c27..91db74e11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -636,7 +636,7 @@ FUNCTION(add_lib_shared target) LINKER_LANGUAGE Fortran) INSTALL(TARGETS ${target} LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE - WORLD_EXECUTE) + WORLD_READ WORLD_EXECUTE) STRING(TOUPPER ${target} TARGETUP) ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "SUCCESS: ${TARGETUP} BUILD COMPLETE!") ENDFUNCTION()