From 700141864515fb492302364d6dcf276b84e1fbe4 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Mon, 13 Apr 2026 17:56:57 +0100 Subject: [PATCH 01/11] Amjuel data for various types of molecular reactions: ionisation, recombination, dissociation, charge exchange, elastic collisions. --- json_database/AMJUEL_H.2_0.3T.json | 21 ++++++ json_database/AMJUEL_H.2_3.2.3.json | 21 ++++++ json_database/AMJUEL_H.4_2.2.10.json | 109 +++++++++++++++++++++++++++ json_database/AMJUEL_H.4_2.2.11.json | 109 +++++++++++++++++++++++++++ json_database/AMJUEL_H.4_2.2.12.json | 109 +++++++++++++++++++++++++++ json_database/AMJUEL_H.4_2.2.14.json | 109 +++++++++++++++++++++++++++ json_database/AMJUEL_H.4_2.2.5g.json | 109 +++++++++++++++++++++++++++ json_database/AMJUEL_H.4_2.2.9.json | 109 +++++++++++++++++++++++++++ 8 files changed, 696 insertions(+) create mode 100644 json_database/AMJUEL_H.2_0.3T.json create mode 100644 json_database/AMJUEL_H.2_3.2.3.json create mode 100644 json_database/AMJUEL_H.4_2.2.10.json create mode 100644 json_database/AMJUEL_H.4_2.2.11.json create mode 100644 json_database/AMJUEL_H.4_2.2.12.json create mode 100644 json_database/AMJUEL_H.4_2.2.14.json create mode 100644 json_database/AMJUEL_H.4_2.2.5g.json create mode 100644 json_database/AMJUEL_H.4_2.2.9.json diff --git a/json_database/AMJUEL_H.2_0.3T.json b/json_database/AMJUEL_H.2_0.3T.json new file mode 100644 index 000000000..45f41d3c2 --- /dev/null +++ b/json_database/AMJUEL_H.2_0.3T.json @@ -0,0 +1,21 @@ +{ + "info": { + "fit_type": "T", + "ref": "Amjuel H.2 0.3T", + "reaction_lbl": "p + H2 -> p + H2 (total rate coefficient)", + "notes": "Total rate coefficient for elastic collisions between H2 and H+. Maxwellian rate coefficient vs. T_p, with H2 at rest, obtained by taking the corresponding Beam-Maxw. rate coefficient at Eb=0.06 eV and verification by independent integration of cross-section" + }, + "coeffs": [ + [ + -1.857812000000E+01, + 2.411708000000E-01, + 1.046088000000E-02, + -1.203649000000E-02, + -3.679626000000E-03, + 2.895358000000E-04, + 1.354441000000E-04, + -2.712317000000E-06, + -1.356528000000E-06 + ] + ] +} diff --git a/json_database/AMJUEL_H.2_3.2.3.json b/json_database/AMJUEL_H.2_3.2.3.json new file mode 100644 index 000000000..184f072ff --- /dev/null +++ b/json_database/AMJUEL_H.2_3.2.3.json @@ -0,0 +1,21 @@ +{ + "info": { + "fit_type": "T", + "ref": "Amjuel H.2 3.2.3", + "reaction_lbl": "p + H2 -> H + H2+", + "notes": "H2/H+ charge exchange. Effective ion conversion rate (charge exchange on H2) v eff = v H2(v=0) + v=114 v H2(v) pH2(v) Same vibrational distribution (as function of T_e) as above. Therefore: single parameter fit vs. T_e, since vibrational distribution does not depend upon density, E_0 is fixed (0.1 eV) and Tp = Te = T." + }, + "coeffs": [ + [ + -2.163099643422E+01, + 3.206843053514E+00, + -3.369939911269E+00, + 1.290238400703E+00, + -3.988189754178E-01, + 1.462287796966E-01, + -3.524154596754E-02, + 4.146324082808E-03, + -1.846022446828E-04 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.10.json b/json_database/AMJUEL_H.4_2.2.10.json new file mode 100644 index 000000000..535a6c77a --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.10.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.10", + "reaction_lbl": "e + H2 -> 2e + H + H+", + "notes": "Ionization and dissociation of H2" + }, + "coeffs": [ + [ + -3.793749300315E+01, + -3.333162972531E-01, + 1.849601203843E-01, + -8.803945197107E-02, + 2.205180180735E-02, + -2.852568161901E-03, + 1.942314738448E-04, + -6.597388255594E-06, + 8.798544848606E-08 + ], + [ + 1.280249398154E+01, + 1.028969438485E+00, + -3.271855492638E-01, + 1.305597441611E-01, + -3.408439821910E-02, + 4.591924060066E-03, + -3.167471002157E-04, + 1.070920193931E-05, + -1.408139742113E-07 + ], + [ + -3.778148553140E+00, + -1.415561059533E+00, + 2.928509524911E-01, + -7.425165688158E-02, + 2.028424685287E-02, + -3.042376564749E-03, + 2.279124955373E-04, + -8.197224564797E-06, + 1.130682076163E-07 + ], + [ + 2.499987501522E-01, + 1.032922656537E+00, + -1.580288004759E-01, + 9.934702707539E-03, + -2.450845732158E-03, + 5.716646876513E-04, + -5.339115778704E-05, + 2.135848413694E-06, + -3.072223247387E-08 + ], + [ + 2.480574522949E-01, + -4.372934216955E-01, + 6.448433196301E-02, + 1.229222932630E-03, + -9.281410519553E-04, + 5.946235618034E-05, + -8.758032156912E-08, + -7.270955072707E-08, + 1.100087131523E-09 + ], + [ + -9.960628182831E-02, + 1.092652428162E-01, + -1.782307798975E-02, + 1.192181214757E-04, + 2.310636556641E-04, + -2.492990725967E-05, + 1.217600444191E-06, + -3.624263301602E-08, + 6.139167092128E-10 + ], + [ + 1.709129400742E-02, + -1.574889001363E-02, + 2.865310743302E-03, + -1.700396064727E-04, + -1.502644504654E-06, + 3.297869416435E-07, + 6.572135289627E-10, + 4.269190108005E-10, + -3.666090917669E-11 + ], + [ + -1.435304503973E-03, + 1.203823111704E-03, + -2.350465388313E-04, + 2.507288189894E-05, + -3.077975735212E-06, + 3.748299687254E-07, + -2.613600078122E-08, + 8.263175463927E-10, + -8.509179497022E-12 + ], + [ + 4.808639828229E-05, + -3.761591649539E-05, + 7.490531472388E-06, + -1.077314971617E-06, + 1.950247963978E-07, + -2.569729600929E-08, + 1.804377780165E-09, + -6.031847199601E-11, + 7.416020205748E-13 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.11.json b/json_database/AMJUEL_H.4_2.2.11.json new file mode 100644 index 000000000..b400510cc --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.11.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.11", + "reaction_lbl": "e + H2+ -> 2e + H+ + H+", + "notes": "Dissociative ionization of H2+" + }, + "coeffs": [ + [ + -3.708803769397E+01, + 9.784233987341E-02, + -7.200361272130E-03, + 6.496843022778E-03, + -1.420590818760E-03, + 1.703620321164E-04, + -1.160738946400E-05, + 4.148222302162E-07, + -6.007853385325E-09 + ], + [ + 1.561780529774E+01, + -1.673256230592E-02, + 2.743322772895E-02, + -1.026956102747E-02, + 1.999561527383E-03, + -2.043607814503E-04, + 1.084177127603E-05, + -2.671800995803E-07, + 2.093182411476E-09 + ], + [ + -6.874406034117E+00, + -7.782929961315E-03, + -6.888773684846E-03, + 2.306107197863E-03, + -4.029222834436E-04, + 3.932152471491E-05, + -2.094907364150E-06, + 5.682907060010E-08, + -6.320752545610E-10 + ], + [ + 2.010540060675E+00, + -3.226785148562E-03, + -6.181192193854E-03, + 2.388146990238E-03, + -5.018901320009E-04, + 5.520233512352E-05, + -3.080798536641E-06, + 7.864770315002E-08, + -6.357395371638E-10 + ], + [ + -3.614768906120E-01, + 3.710098881765E-03, + 2.045814599796E-03, + -8.523935993991E-04, + 1.751295192861E-04, + -1.944203941844E-05, + 1.138888354831E-06, + -3.256303793266E-08, + 3.501794038444E-10 + ], + [ + 2.956861321735E-02, + -5.524443504504E-04, + -2.457951062112E-05, + 3.433179945503E-05, + -1.450208898992E-06, + -2.447566480782E-07, + 1.375679100044E-08, + 4.863880510459E-10, + -3.004374374556E-11 + ], + [ + 9.662490252868E-04, + -1.548556801431E-04, + 1.417215042439E-05, + -6.444863591678E-06, + -1.566028729499E-06, + 4.152486680818E-07, + -2.855068942744E-08, + 6.081804811000E-10, + 9.512865901179E-13 + ], + [ + -3.543571865464E-04, + 4.662969089421E-05, + -1.471117766355E-05, + 5.235585096328E-06, + -5.779667826854E-07, + 2.139729421817E-08, + -3.656048425230E-10, + 3.759866326965E-11, + -1.486151370215E-12 + ], + [ + 1.827109843671E-05, + -3.179895716088E-06, + 1.432429412413E-06, + -5.141065080107E-07, + 7.734387173369E-08, + -6.163336831045E-09, + 3.128313515842E-10, + -1.061842444216E-11, + 1.771099769640E-13 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.12.json b/json_database/AMJUEL_H.4_2.2.12.json new file mode 100644 index 000000000..e70f226cd --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.12.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.12", + "reaction_lbl": "e + H2+ -> e + H + H+", + "notes": "Dissociative excitation of H2+. Effective dissociative excitation of H2+ to H and H+, including the component e+H2+ -> H + H* -> H + H+ from dissociative recombination of H2+ with excited products." + }, + "coeffs": [ + [ + -1.793443274600E+01, + -4.932783688604E-02, + 1.039088280849E-01, + -4.375935166008E-02, + 9.196691651936E-03, + -1.043378648769E-03, + 6.600342421838E-05, + -2.198466460165E-06, + 3.004145701249E-08 + ], + [ + 2.236108757681E+00, + -2.545406018621E-02, + -1.160421006835E-01, + 4.407846563362E-02, + -8.192521304984E-03, + 8.200277386433E-04, + -4.508284363534E-05, + 1.282824614809E-06, + -1.474719350236E-08 + ], + [ + -3.620018994703E-01, + 6.721527680150E-02, + 1.564387124002E-02, + -4.939045440424E-03, + 4.263195867947E-04, + 1.034216805418E-05, + -3.975028601900E-06, + 2.322116289258E-07, + -4.381217154470E-09 + ], + [ + -4.353922258965E-01, + -3.051033606589E-02, + 3.512861172521E-02, + -1.179504564265E-02, + 2.091772760029E-03, + -1.991100044575E-04, + 1.018080238045E-05, + -2.597941866088E-07, + 2.524118386011E-09 + ], + [ + 1.580381801957E-01, + 2.493654957203E-03, + -1.601970998119E-02, + 5.346709597939E-03, + -8.711870134835E-04, + 7.542066727545E-05, + -3.410778344979E-06, + 7.120460603822E-08, + -4.412295474522E-10 + ], + [ + 1.697880687685E-02, + 2.106675963900E-03, + 4.521983358170E-04, + -3.017151690655E-04, + 6.209239389357E-05, + -7.598119096817E-06, + 5.523273241689E-07, + -2.130508249251E-08, + 3.319099650589E-10 + ], + [ + -1.521914651109E-02, + -7.527862162788E-04, + 9.095551479381E-04, + -2.372576223034E-04, + 3.018561480848E-05, + -1.365255868731E-06, + -4.604769733903E-08, + 5.867910270430E-09, + -1.357779142836E-10 + ], + [ + 2.406276368070E-03, + 9.971361856278E-05, + -1.760978402353E-04, + 4.877659148871E-05, + -6.477358351729E-06, + 3.541106430252E-07, + 1.309772899670E-09, + -8.072907334230E-10, + 2.074669430611E-11 + ], + [ + -1.219469579955E-04, + -4.785505675232E-06, + 9.858840337511E-06, + -2.779210878533E-06, + 3.720379996058E-07, + -2.110289928486E-08, + 3.753875073646E-11, + 4.024906665497E-11, + -1.075990572574E-12 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.14.json b/json_database/AMJUEL_H.4_2.2.14.json new file mode 100644 index 000000000..b0947320c --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.14.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.14", + "reaction_lbl": "e + H2+ -> H + H", + "notes": "Dissociative recombination of H2+. Effective dissociative recombination of H2+ to H and H, subtracting the ionising component e+H2+ -> H + H* -> H + H+ from dissociative recombination of H2+ with excited products." + }, + "coeffs": [ + [ + -1.664335253647E+01, + 8.953780953631E-02, + -1.056411030518E-01, + 4.477000808690E-02, + -9.729945434357E-03, + 1.174456882002E-03, + -7.987743820637E-05, + 2.842957892768E-06, + -4.104508608435E-08 + ], + [ + -6.005444031657E-01, + 4.063933992726E-02, + -4.753947846841E-02, + 2.188304031377E-02, + -5.201085606791E-03, + 6.866340394051E-04, + -5.059940013116E-05, + 1.930213882205E-06, + -2.963966822809E-08 + ], + [ + 4.494812032769E-04, + 7.884508616595E-05, + 3.688007562485E-04, + -4.659255785539E-04, + 1.907115980400E-04, + -3.434324710145E-05, + 3.067651560323E-06, + -1.325689465590E-07, + 2.212493073620E-09 + ], + [ + 1.632894866655E-04, + 3.108116177617E-04, + -3.521552580917E-04, + -2.233169775063E-04, + 1.869415236037E-04, + -4.329991211511E-05, + 4.465256901322E-06, + -2.136296167564E-07, + 3.873085368404E-09 + ], + [ + -7.234142549752E-05, + -1.316311320262E-03, + 1.643509328764E-03, + -6.412764282779E-04, + 1.048891053765E-04, + -7.018555173322E-06, + 4.776213235854E-08, + 1.380537343974E-08, + -4.199397846492E-10 + ], + [ + -1.504085050039E-05, + 1.315865970237E-04, + -1.025653773999E-04, + 5.310324781249E-05, + -1.831888048039E-05, + 3.423755373077E-06, + -3.303384352061E-07, + 1.551627097700E-08, + -2.809391819541E-10 + ], + [ + 1.113923667684E-05, + 2.711411525392E-05, + -8.495922363727E-05, + 4.026487801017E-05, + -6.289324474240E-06, + 1.911447036702E-07, + 3.638198230235E-08, + -3.235540606394E-09, + 7.605442050634E-11 + ], + [ + -1.843926162250E-06, + -1.663674537499E-06, + 1.308069926896E-05, + -7.324021449032E-06, + 1.431739868187E-06, + -1.085644779665E-07, + 1.143164983367E-09, + 2.151595003971E-10, + -7.052562220005E-12 + ], + [ + 9.864173150662E-08, + -2.212261708468E-07, + -4.431749501051E-07, + 3.270530731011E-07, + -7.282085521177E-08, + 6.578253567957E-09, + -1.925258267827E-10, + -4.217474167519E-12, + 2.364754029318E-13 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.5g.json b/json_database/AMJUEL_H.4_2.2.5g.json new file mode 100644 index 000000000..89ee2a89b --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.5g.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.5g", + "reaction_lbl": "e + H2 -> e + H + H", + "notes": "Dissociation of H2 with vibrational distribution. H2 multi-step model, data: Sawada/Fujimoto/Greenland. H(1), H2, H2+, H+ transported (slow species). The H2(v) are in vibrational equilibrium (depends only upon T_e), and the electronic levels in the molecules as discussed in (Sawada and Fujimoto, 1995) are taken into account. CX losses from vibr. distribution are computed assuming Te = Ti, ne = np, and an energy of H2-Beam = 0.1 eV." + }, + "coeffs": [ + [ + -2.702372540584E+01, + -3.152103191633E-03, + 5.990692171729E-03, + -3.151252835426E-03, + 7.457309144890E-04, + -9.238664007853E-05, + 6.222557542845E-06, + -2.160024578659E-07, + 3.028755759836E-09 + ], + [ + 1.081756417479E+01, + -1.487216964825E-02, + 1.417396532101E-02, + -4.689911797083E-03, + 7.180338663163E-04, + -5.502798587526E-05, + 1.983066081752E-06, + -2.207639762507E-08, + -2.116339335271E-10 + ], + [ + -5.368872027676E+00, + 5.419787589654E-03, + -1.747268613395E-02, + 9.532963297450E-03, + -2.196705622859E-03, + 2.611447288152E-04, + -1.695536960581E-05, + 5.737375510694E-07, + -7.940900078995E-09 + ], + [ + 1.340684229143E+00, + 1.058157580038E-02, + -3.446019122786E-03, + -7.032769815599E-04, + 4.427959286553E-04, + -7.370484189164E-05, + 5.746786010618E-06, + -2.182085196303E-07, + 3.264045809897E-09 + ], + [ + -1.561644923145E-01, + -3.847438570333E-03, + 3.571477356851E-03, + -1.103305795473E-03, + 1.476712517858E-04, + -8.461162952132E-06, + 9.757111870171E-08, + 8.130014050833E-09, + -2.234996157750E-10 + ], + [ + -1.444731533894E-04, + -3.194532513126E-04, + -2.987368098475E-04, + 2.092094838648E-04, + -4.339352509941E-05, + 4.009328699469E-06, + -1.762651912129E-07, + 3.357860444624E-09, + -1.857322587267E-11 + ], + [ + 2.117693926546E-03, + 2.679309814780E-04, + -1.037559373832E-04, + 7.297053580368E-06, + 1.454171585421E-06, + -2.251616910293E-07, + 9.191700327811E-09, + -2.052366968228E-11, + -3.567738654108E-12 + ], + [ + -2.143738340207E-04, + -3.539232757385E-05, + 1.909399233821E-05, + -3.819368125069E-06, + 3.754063159414E-07, + -2.441872829462E-08, + 1.437490161488E-09, + -6.172308568891E-11, + 1.104905484620E-12 + ], + [ + 6.979740947331E-06, + 1.462031952352E-06, + -8.858634506391E-07, + 2.099830142707E-07, + -2.606862169776E-08, + 2.039813579349E-09, + -1.113483084607E-10, + 3.859777100010E-12, + -5.909099891913E-14 + ] + ] +} diff --git a/json_database/AMJUEL_H.4_2.2.9.json b/json_database/AMJUEL_H.4_2.2.9.json new file mode 100644 index 000000000..f90d36974 --- /dev/null +++ b/json_database/AMJUEL_H.4_2.2.9.json @@ -0,0 +1,109 @@ +{ + "info": { + "fit_type": "nT", + "ref": "Amjuel H.4 2.2.9", + "reaction_lbl": "e + H2 -> 2e + H2+", + "notes": "Ionization of H2" + }, + "coeffs": [ + [ + -3.574773783577E+01, + 3.470247049909E-01, + -9.683166540937E-02, + 1.959576276250E-03, + 2.479361119190E-03, + -1.196632952666E-04, + -1.862956119592E-05, + 1.669867158509E-06, + -3.673736278200E-08 + ], + [ + 1.769208985507E+01, + -1.311169841222E+00, + 4.700486215943E-01, + -5.521175478827E-02, + -2.689651616933E-03, + 7.308915874002E-04, + -2.920560755694E-05, + -3.148831240316E-07, + 2.514856386324E-08 + ], + [ + -8.291764008409E+00, + 1.591701525694E+00, + -5.814996025336E-01, + 9.160898084105E-02, + -4.770789631868E-03, + 1.994775632224E-05, + -7.511552245648E-06, + 1.089689676313E-06, + -2.920863498031E-08 + ], + [ + 2.555712347240E+00, + -8.625268584825E-01, + 2.612076696684E-01, + -3.686525285376E-02, + 1.945480608139E-03, + -3.690918356665E-05, + 4.836340453567E-06, + -4.165748666929E-07, + 9.265898224345E-09 + ], + [ + -5.370404654062E-01, + 2.375816996323E-01, + -4.165908778170E-02, + 1.732469114063E-03, + 3.693513203529E-04, + -4.931268184607E-05, + 2.727501534044E-06, + -1.081027384449E-07, + 2.420509440644E-09 + ], + [ + 7.443307905391E-02, + -3.322214182214E-02, + -2.351235556666E-03, + 1.723053881691E-03, + -2.096625925098E-04, + 1.358575558294E-05, + -1.041586202167E-06, + 6.928574330531E-08, + -1.746656185835E-09 + ], + [ + -6.391785721973E-03, + 1.862554278190E-03, + 1.540632467396E-03, + -3.547150770477E-04, + 1.392157055273E-05, + 1.047463944093E-06, + 1.513510667993E-08, + -9.915499708242E-09, + 3.298173891188E-10 + ], + [ + 3.001729098239E-04, + 3.497202259366E-05, + -1.742029226138E-04, + 2.296551698214E-05, + 2.357520372192E-06, + -5.306085513950E-07, + 2.223137028418E-08, + 3.340169309800E-10, + -2.560542889504E-11 + ], + [ + -5.607182991432E-06, + -5.779550092391E-06, + 6.495742927455E-06, + -3.040011333889E-07, + -2.361542565281E-07, + 3.655056080262E-08, + -1.771478792301E-09, + 1.334615260635E-11, + 6.831564719957E-13 + ] + ] +} From 36492606f43cbc079307e977e73df8913a17b470 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:47:29 +0100 Subject: [PATCH 02/11] Modify SpeciesParser regex to cope with molecules. Update variable and function names, docs accordingly. --- include/species_parser.hxx | 24 ++++++++--------- src/species_parser.cxx | 42 +++++++++++++++--------------- tests/unit/test_species_parser.cxx | 40 ++++++++++++++-------------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/include/species_parser.hxx b/include/species_parser.hxx index ac8a11338..79d2a2a36 100644 --- a/include/species_parser.hxx +++ b/include/species_parser.hxx @@ -11,11 +11,12 @@ class SpeciesParser { public: /** - * @brief Construct a new SpeciesParser object by extracting the element and charge from - * a species string. + * @brief Construct a new SpeciesParser object by extracting the base species and charge + * from a species string. * @details Valid string requirements: - * - Element name must be 1 or 2 letters and is stored in lower case. - * - Any integer can precede the element name, but is discarded + * - Base species (atom, molecule, or electron) consists of 1 or 2 letters optionally + * followed by an integer, and is stored in lower case. e.g. "he" or "h2" + * - Any integer can *precede* the base species, but is discarded * e.g. "2he" is parsed as "he" * - A "+" or a "-", optionally followed by an integer is interpreted as the charge. * e.g. "he-1" (-1), "H" (0) or "ne+8" (+8) @@ -27,15 +28,14 @@ public: SpeciesParser(const std::string& species_str); int get_charge() const { return this->charge; } - std::string get_element() const { return this->element; } + std::string get_base_species() const { return this->base_species; } std::string get_str() const { return this->species_str; } /** - * @brief Get an appropriate long name for the element in this species (e.g. "hydrogen" - * for "h"). + * @brief Get an appropriate long name for the base species (e.g. "hydrogen" for "h"). * - * @return std::string The long name of the species, or the element name if no long name - * is defined + * @return std::string The long name of the species, or the base species name if no long + * name is defined */ std::string long_name() const; @@ -54,13 +54,13 @@ public: SpeciesParser recombined(); private: - SpeciesParser(const std::string element, int charge); + SpeciesParser(const std::string base_species, int charge); /// Species string std::string species_str; - /// Atomic element of the species (or 'e' for electrons) - std::string element; + /// Base species form: atom, molecule, or electron (unneutralized) + std::string base_species; /// Charge of the species int charge; diff --git a/src/species_parser.cxx b/src/species_parser.cxx index 430e75648..56146448d 100644 --- a/src/species_parser.cxx +++ b/src/species_parser.cxx @@ -10,8 +10,8 @@ static std::map long_names = { {"t", "tritium"}, {"he", "helium"}, }; -std::string construct_species_str(std::string element, int charge) { - if (element == "e") { +std::string construct_species_str(std::string base_species, int charge) { + if (base_species == "e") { // Special case for electrons if (charge != -1) { throw BoutException( @@ -38,7 +38,7 @@ std::string construct_species_str(std::string element, int charge) { charge_str = "-" + std::to_string(-charge); } } - return element + charge_str; + return base_species + charge_str; } } @@ -47,21 +47,21 @@ std::string construct_species_str(std::string element, int charge) { /// SpeciesParser::SpeciesParser(const std::string& species_str) { - // Extract element name, charge and ionisation state with regex - // Any number preceding the element is discarded - std::regex pattern("^([0-9]*)([a-zA-Z]{1,2})([\\+|\\-]?)([0-9]*)$"); + // Extract base species, charge and ionisation state with regex + // Any number preceding the base species is discarded + std::regex pattern("^([0-9]*)([a-zA-Z]{1,2}[0-9]*)([\\+|\\-]?)([0-9]*)$"); std::smatch matches; bool has_matches = std::regex_search(species_str, matches, pattern); - // String must provide at least an element name + // String must provide at least a base species if (!has_matches || !matches[1].matched) { throw BoutException( fmt::format("Unable to extract charge from species name {}", species_str)); } - // Store element name; always lower case - this->element = matches[2]; - std::transform(this->element.begin(), this->element.end(), this->element.begin(), - ::tolower); + // Store base species; always lower case + this->base_species = matches[2]; + std::transform(this->base_species.begin(), this->base_species.end(), + this->base_species.begin(), ::tolower); // Extract charge, electron is a special case if (species_str == "e") { @@ -73,39 +73,39 @@ SpeciesParser::SpeciesParser(const std::string& species_str) { } // Stored species string discards any leading number and is always lower case - this->species_str = construct_species_str(this->element, this->charge); + this->species_str = construct_species_str(this->base_species, this->charge); } /// -SpeciesParser::SpeciesParser(const std::string element, int charge) - : element(element), charge(charge) { - this->species_str = construct_species_str(element, charge); +SpeciesParser::SpeciesParser(const std::string base_species, int charge) + : base_species(base_species), charge(charge) { + this->species_str = construct_species_str(base_species, charge); } /// std::string SpeciesParser::long_name() const { - auto it = long_names.find(this->element); + auto it = long_names.find(this->base_species); if (it != long_names.end()) { return it->second; } else { - return this->element; + return this->base_species; } } /// SpeciesParser SpeciesParser::ionised() { - if (this->element == "e") { + if (this->base_species == "e") { throw BoutException("Cannot change electron charge!"); } int new_charge = this->charge + 1; - return SpeciesParser(this->element, new_charge); + return SpeciesParser(this->base_species, new_charge); } /// SpeciesParser SpeciesParser::recombined() { - if (this->element == "e") { + if (this->base_species == "e") { throw BoutException("Cannot change electron charge!"); } int new_charge = this->charge - 1; - return SpeciesParser(this->element, new_charge); + return SpeciesParser(this->base_species, new_charge); } diff --git a/tests/unit/test_species_parser.cxx b/tests/unit/test_species_parser.cxx index 1f69f8786..f8712b114 100644 --- a/tests/unit/test_species_parser.cxx +++ b/tests/unit/test_species_parser.cxx @@ -9,7 +9,7 @@ class SpeciesParserTest : public ::testing::Test {}; /// @brief Check parsing of a neutral species with a prefix > 1 TEST_F(SpeciesParserTest, ParseNeutral) { SpeciesParser parser("2he"); - EXPECT_EQ(parser.get_element(), "he"); + EXPECT_EQ(parser.get_base_species(), "he"); EXPECT_EQ(parser.get_charge(), 0); // Species string should not include the prefix number and should be lower case EXPECT_EQ(parser.get_str(), "he"); @@ -18,17 +18,17 @@ TEST_F(SpeciesParserTest, ParseNeutral) { /// @brief Check parsing of various positively charged species. TEST_F(SpeciesParserTest, ParsePositivelyCharged) { SpeciesParser parser1("h+"); - EXPECT_EQ(parser1.get_element(), "h"); + EXPECT_EQ(parser1.get_base_species(), "h"); EXPECT_EQ(parser1.get_charge(), 1); EXPECT_EQ(parser1.get_str(), "h+"); SpeciesParser parser2("He+2"); - EXPECT_EQ(parser2.get_element(), "he"); + EXPECT_EQ(parser2.get_base_species(), "he"); EXPECT_EQ(parser2.get_charge(), 2); EXPECT_EQ(parser2.get_str(), "he+2"); SpeciesParser parser3("ne+8"); - EXPECT_EQ(parser3.get_element(), "ne"); + EXPECT_EQ(parser3.get_base_species(), "ne"); EXPECT_EQ(parser3.get_charge(), 8); EXPECT_EQ(parser3.get_str(), "ne+8"); } @@ -37,17 +37,17 @@ TEST_F(SpeciesParserTest, ParsePositivelyCharged) { TEST_F(SpeciesParserTest, ParseNegativelyCharged) { SpeciesParser parser1("He-1"); - EXPECT_EQ(parser1.get_element(), "he"); + EXPECT_EQ(parser1.get_base_species(), "he"); EXPECT_EQ(parser1.get_charge(), -1); EXPECT_EQ(parser1.get_str(), "he-"); SpeciesParser parser2("li-2"); - EXPECT_EQ(parser2.get_element(), "li"); + EXPECT_EQ(parser2.get_base_species(), "li"); EXPECT_EQ(parser2.get_charge(), -2); EXPECT_EQ(parser2.get_str(), "li-2"); SpeciesParser parser3("ne-5"); - EXPECT_EQ(parser3.get_element(), "ne"); + EXPECT_EQ(parser3.get_base_species(), "ne"); EXPECT_EQ(parser3.get_charge(), -5); EXPECT_EQ(parser3.get_str(), "ne-5"); } @@ -57,13 +57,13 @@ TEST_F(SpeciesParserTest, ParseElectron) { // "e" parsed as electron SpeciesParser parser1("e"); EXPECT_EQ(parser1.get_charge(), -1); - EXPECT_EQ(parser1.get_element(), "e"); + EXPECT_EQ(parser1.get_base_species(), "e"); EXPECT_EQ(parser1.get_str(), "e"); // "e-" parsed as electron SpeciesParser parser2("e-"); EXPECT_EQ(parser2.get_charge(), -1); - EXPECT_EQ(parser2.get_element(), "e"); + EXPECT_EQ(parser2.get_base_species(), "e"); EXPECT_EQ(parser2.get_str(), "e"); // Charges other than -1 throw for electrons @@ -85,7 +85,7 @@ TEST_F(SpeciesParserTest, LongNames) { SpeciesParser parser5("t"); ASSERT_EQ(parser5.long_name(), "tritium"); - // Species without preset long names should return the element name + // Species without preset long names should return the base species name SpeciesParser parser6("li"); ASSERT_EQ(parser6.long_name(), "li"); } @@ -94,7 +94,7 @@ TEST_F(SpeciesParserTest, LongNames) { TEST_F(SpeciesParserTest, IoniseNeutral) { SpeciesParser neutral("h"); SpeciesParser ionised = neutral.ionised(); - EXPECT_EQ(ionised.get_element(), "h"); + EXPECT_EQ(ionised.get_base_species(), "h"); EXPECT_EQ(ionised.get_charge(), 1); EXPECT_EQ(ionised.get_str(), "h+"); } @@ -103,7 +103,7 @@ TEST_F(SpeciesParserTest, IoniseNeutral) { TEST_F(SpeciesParserTest, IoniseSinglyIonised) { SpeciesParser singly("li+"); SpeciesParser doubly = singly.ionised(); - EXPECT_EQ(doubly.get_element(), "li"); + EXPECT_EQ(doubly.get_base_species(), "li"); EXPECT_EQ(doubly.get_charge(), 2); EXPECT_EQ(doubly.get_str(), "li+2"); } @@ -112,7 +112,7 @@ TEST_F(SpeciesParserTest, IoniseSinglyIonised) { TEST_F(SpeciesParserTest, IoniseHighlyIonised) { SpeciesParser highly("ne+8"); SpeciesParser next = highly.ionised(); - EXPECT_EQ(next.get_element(), "ne"); + EXPECT_EQ(next.get_base_species(), "ne"); EXPECT_EQ(next.get_charge(), 9); EXPECT_EQ(next.get_str(), "ne+9"); } @@ -125,12 +125,12 @@ TEST_F(SpeciesParserTest, MultipleIonisations) { SpeciesParser hep1 = he.ionised(); EXPECT_EQ(hep1.get_charge(), 1); - EXPECT_EQ(hep1.get_element(), "he"); + EXPECT_EQ(hep1.get_base_species(), "he"); EXPECT_EQ(hep1.get_str(), "he+"); SpeciesParser hep2 = hep1.ionised(); EXPECT_EQ(hep2.get_charge(), 2); - EXPECT_EQ(hep2.get_element(), "he"); + EXPECT_EQ(hep2.get_base_species(), "he"); EXPECT_EQ(hep2.get_str(), "he+2"); } @@ -138,7 +138,7 @@ TEST_F(SpeciesParserTest, MultipleIonisations) { TEST_F(SpeciesParserTest, RecombineSinglyIonised) { SpeciesParser singly("h+"); SpeciesParser neutral = singly.recombined(); - EXPECT_EQ(neutral.get_element(), "h"); + EXPECT_EQ(neutral.get_base_species(), "h"); EXPECT_EQ(neutral.get_charge(), 0); EXPECT_EQ(neutral.get_str(), "h"); } @@ -147,7 +147,7 @@ TEST_F(SpeciesParserTest, RecombineSinglyIonised) { TEST_F(SpeciesParserTest, RecombineHighlyIonised) { SpeciesParser highly("ne+9"); SpeciesParser next = highly.recombined(); - EXPECT_EQ(next.get_element(), "ne"); + EXPECT_EQ(next.get_base_species(), "ne"); EXPECT_EQ(next.get_charge(), 8); EXPECT_EQ(next.get_str(), "ne+8"); } @@ -159,12 +159,12 @@ TEST_F(SpeciesParserTest, MultipleRecombinations) { SpeciesParser hep1 = hep2.recombined(); EXPECT_EQ(hep1.get_charge(), 1); - EXPECT_EQ(hep1.get_element(), "he"); + EXPECT_EQ(hep1.get_base_species(), "he"); EXPECT_EQ(hep1.get_str(), "he+"); SpeciesParser he0 = hep1.recombined(); EXPECT_EQ(he0.get_charge(), 0); - EXPECT_EQ(he0.get_element(), "he"); + EXPECT_EQ(he0.get_base_species(), "he"); EXPECT_EQ(he0.get_str(), "he"); } @@ -187,4 +187,4 @@ TEST_F(SpeciesParserTest, InvalidStrings) { ASSERT_THROW(SpeciesParser("%&?!"), BoutException); ASSERT_THROW(SpeciesParser("he +"), BoutException); ASSERT_THROW(SpeciesParser("H -"), BoutException); -} \ No newline at end of file +} From d4df86ad67b089def5faac7ae8a609e2a9601b98 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:48:13 +0100 Subject: [PATCH 03/11] Fix incomplete docstring. --- tests/unit/test_reactions.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_reactions.cxx b/tests/unit/test_reactions.cxx index ba886a230..94ee0b0c0 100644 --- a/tests/unit/test_reactions.cxx +++ b/tests/unit/test_reactions.cxx @@ -6,7 +6,7 @@ namespace hermes { //======================== General reaction class tests ======================= /// @brief Test parsing of various input optionsReactionBase constructor should throw if -/// the reaction type string is not +/// the reaction type string is not valid TEST(ReactionTest, InputOptions) { const std::string comp_name = "test"; @@ -120,6 +120,11 @@ TEST_F(DTpCXTest, SourcesRegression) { sources_regression_test(); } // H/H+ CX with neutral momentum gain turned off TEST_F(HHpCXTest_noNeutralMomGain, SourcesRegression) { sources_regression_test(); } +// CX involving molecules of H isotopes (non-exhaustive) +TEST_F(D2DpCXTest, SourcesRegression) { + generate_data(); // sources_regression_test(); +} + // He ionization TEST_F(HeIzn01Test, SourcesRegression) { sources_regression_test(); } From b0cdf15a5f8fe8cf019033e4ed8696b611295645 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:49:22 +0100 Subject: [PATCH 04/11] Fix for uninitialised multipliers. --- include/izn_rec_reaction.hxx | 7 +++++-- include/reaction.hxx | 4 ++-- src/izn_rec_reaction.cxx | 5 ++++- src/reaction.cxx | 3 +++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/izn_rec_reaction.hxx b/include/izn_rec_reaction.hxx index daec56344..086aca8b4 100644 --- a/include/izn_rec_reaction.hxx +++ b/include/izn_rec_reaction.hxx @@ -51,6 +51,9 @@ protected: /// Name of the (heavy) species with which collision freqs. are associated in the state std::string heavy_collfreq_species; + /// Radiation rate multiplier, extracted from input options + BoutReal radiation_multiplier; + private: /// Short reaction type string used in diagnostic names ("iz" or "rec") const std::string short_reaction_type; @@ -81,7 +84,7 @@ struct IznReaction : public IznRecReaction { * @param solver The solver object for the simulation (discarded by this class) */ IznReaction(std::string name, Options& options, [[maybe_unused]] Solver* solver) - : IznReaction(name, options){}; + : IznReaction(name, options) {}; }; /** @@ -106,7 +109,7 @@ struct RecReaction : public IznRecReaction { * @param solver The solver object for the simulation (discarded by this class) */ RecReaction(std::string name, Options& options, [[maybe_unused]] Solver* solver) - : RecReaction(name, options){}; + : RecReaction(name, options) {}; }; } // namespace hermes diff --git a/include/reaction.hxx b/include/reaction.hxx index 9f9a36460..c4b724663 100644 --- a/include/reaction.hxx +++ b/include/reaction.hxx @@ -83,8 +83,8 @@ protected: Options& units; BoutReal Tnorm, Nnorm, FreqNorm; - /// Rate multipliers, extracted from input options - BoutReal rate_multiplier, radiation_multiplier; + /// Rate multiplier. Defaults to 1, but subclasses may read an option and overwrite. + BoutReal rate_multiplier; /// Output diagnostics? bool diagnose; diff --git a/src/izn_rec_reaction.cxx b/src/izn_rec_reaction.cxx index 580cd94c6..c809ce661 100644 --- a/src/izn_rec_reaction.cxx +++ b/src/izn_rec_reaction.cxx @@ -18,6 +18,9 @@ IznRecReaction::IznRecReaction(std::string short_reaction_type, std::string name this->heavy_product = this->parser->get_single_species(species_filter::heavy, species_filter::products); + // Multiplier defaults to 1, subclasses may read appropriate an option and overwrite + this->radiation_multiplier = 1; + /* Data for calculating the electron energy loss rate. Data type is assumed to be the same as the izn/rec rate data for now and the data ID is @@ -226,4 +229,4 @@ RecReaction::RecReaction(std::string name, Options& options) .withDefault(1.0); } -} // namespace hermes \ No newline at end of file +} // namespace hermes diff --git a/src/reaction.cxx b/src/reaction.cxx index ebebf9aa7..b967d6b73 100644 --- a/src/reaction.cxx +++ b/src/reaction.cxx @@ -28,6 +28,9 @@ Reaction::Reaction(std::string name, Options& options) .doc("Output additional diagnostics?") .withDefault(false); + // Multiplier defaults to 1, subclasses may read appropriate an option and overwrite + this->rate_multiplier = 1.0; + std::string reaction_str, data_src_id; ReactionDataTypes data_src_type; From 0c21b3812f10b1e05ee634c7d0b1d69621baccd5 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:52:06 +0100 Subject: [PATCH 05/11] Core functionality for molecular reactions in the Kotov mechanism (except elastic ion-molecule collisions), plus rate data defaults and regression tests. --- CMakeLists.txt | 4 + hermes-3.cxx | 217 ++++++++--------- include/hydrogen_molecule_reactions.hxx | 225 ++++++++++++++++++ include/molecular_reactions.hxx | 125 ++++++++++ include/reaction_settings.hxx | 48 +++- src/hydrogen_molecule_reactions.cxx | 11 + src/molecular_reactions.cxx | 40 ++++ tests/unit/reactions/D2DissIzn.nc | Bin 0 -> 111153 bytes tests/unit/reactions/D2DpCX.nc | Bin 0 -> 165179 bytes tests/unit/reactions/H2Diss.nc | Bin 0 -> 84817 bytes tests/unit/reactions/H2NonDissIzn.nc | Bin 0 -> 89806 bytes tests/unit/reactions/T2pDissExc.nc | Bin 0 -> 106170 bytes tests/unit/reactions/T2pDissRec.nc | Bin 0 -> 89788 bytes .../test_hydrogen_molecule_reaction_inst.cxx | 31 +++ tests/unit/test_molecule_reactions.hxx | 144 +++++++++++ tests/unit/test_reactions.cxx | 14 +- tests/unit/test_reactions.hxx | 27 ++- 17 files changed, 763 insertions(+), 123 deletions(-) create mode 100644 include/hydrogen_molecule_reactions.hxx create mode 100644 include/molecular_reactions.hxx create mode 100644 src/hydrogen_molecule_reactions.cxx create mode 100644 src/molecular_reactions.cxx create mode 100644 tests/unit/reactions/D2DissIzn.nc create mode 100644 tests/unit/reactions/D2DpCX.nc create mode 100644 tests/unit/reactions/H2Diss.nc create mode 100644 tests/unit/reactions/H2NonDissIzn.nc create mode 100644 tests/unit/reactions/T2pDissExc.nc create mode 100644 tests/unit/reactions/T2pDissRec.nc create mode 100644 tests/unit/test_hydrogen_molecule_reaction_inst.cxx create mode 100644 tests/unit/test_molecule_reactions.hxx diff --git a/CMakeLists.txt b/CMakeLists.txt index e37fe7311..85004f3ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ set(HERMES_SOURCES src/component.cxx src/component_scheduler.cxx src/cx_reaction.cxx + src/hydrogen_molecule_reactions.cxx src/ionisation.cxx src/izn_rec_reaction.cxx src/div_ops.cxx @@ -83,6 +84,7 @@ set(HERMES_SOURCES src/isothermal.cxx src/quasineutral.cxx src/diamagnetic_drift.cxx + src/molecular_reactions.cxx src/recalculate_metric.cxx src/relax_potential.cxx src/sheath_closure.cxx @@ -144,10 +146,12 @@ set(HERMES_SOURCES include/guarded_options.hxx include/neutral_full_velocity.hxx include/hermes_utils.hxx + include/hydrogen_molecule_reactions.hxx include/solkit_hydrogen_charge_exchange.hxx include/integrate.hxx include/ionisation.hxx include/izn_rec_reaction.hxx + include/molecular_reactions.hxx include/neutral_boundary.hxx include/neutral_mixed.hxx include/neutral_parallel_diffusion.hxx diff --git a/hermes-3.cxx b/hermes-3.cxx index 5a06834b9..baef922cf 100644 --- a/hermes-3.cxx +++ b/hermes-3.cxx @@ -51,6 +51,7 @@ #include "include/fixed_fraction_radiation.hxx" #include "include/fixed_temperature.hxx" #include "include/fixed_velocity.hxx" +#include "include/hydrogen_molecule_reactions.hxx" #include "include/ionisation.hxx" #include "include/isothermal.hxx" #include "include/izn_rec_reaction.hxx" @@ -96,8 +97,8 @@ BOUT_OVERRIDE_DEFAULT_OPTION("mesh:calcParallelSlices_on_communicate", false); class DecayLengthBoundary : public BoundaryOp { public: DecayLengthBoundary() : gen(nullptr) {} - DecayLengthBoundary(BoundaryRegion* region, std::shared_ptr g) - : BoundaryOp(region), gen(std::move(g)) {} + DecayLengthBoundary(BoundaryRegion* region, std::shared_ptr g) + : BoundaryOp(region), gen(std::move(g)) {} using BoundaryOp::clone; /// Create a copy of this boundary condition @@ -118,10 +119,11 @@ class DecayLengthBoundary : public BoundaryOp { ASSERT1(mesh == f.getMesh()); // Get cell radial length - Coordinates *coord = mesh->getCoordinates(); + Coordinates* coord = mesh->getCoordinates(); Field2D dx = coord->dx; Field2D g11 = coord->g11; - Field2D dr = dx / sqrt(g11); // cell radial length. dr = dx/(Bpol * R) and g11 = (Bpol*R)**2 + Field2D dr = + dx / sqrt(g11); // cell radial length. dr = dx/(Bpol * R) and g11 = (Bpol*R)**2 // Only implemented for cell centre quantities ASSERT1(f.getLocation() == CELL_CENTRE); @@ -129,11 +131,13 @@ class DecayLengthBoundary : public BoundaryOp { // This loop goes over the first row of boundary cells (in X and Y) for (bndry->first(); !bndry->isDone(); bndry->next1d()) { for (int zk = 0; zk < mesh->LocalNz; zk++) { // Loop over Z points - BoutReal decay_length = 3; // Default decay length is 3 normalised units (usually ~3mm) + BoutReal decay_length = + 3; // Default decay length is 3 normalised units (usually ~3mm) if (gen) { // Pick up the boundary condition setting from the input file // Must be specified in normalised units like the other BCs inputs - decay_length = gen->generate(bout::generator::Context(bndry, zk, CELL_CENTRE, 0.0, mesh)); + decay_length = + gen->generate(bout::generator::Context(bndry, zk, CELL_CENTRE, 0.0, mesh)); } // Set value in inner guard cell f(bndry->x, bndry->y, zk) // using the final domain cell value f(bndry->x - bndry->bx, bndry->y - bndry->by, zk) @@ -142,19 +146,21 @@ class DecayLengthBoundary : public BoundaryOp { // (-1, 0) X inner boundary (Core or PF) // (0, 1) Y upper boundary (outer lower target) // (0, -1) Y lower boundary (inner lower target) - + // Distance between final cell centre and inner guard cell centre in normalised units - BoutReal distance = 0.5 * (dr(bndry->x, bndry->y) + - dr(bndry->x - bndry->bx, bndry->y - bndry->by)); + BoutReal distance = + 0.5 + * (dr(bndry->x, bndry->y) + dr(bndry->x - bndry->bx, bndry->y - bndry->by)); - // Exponential decay - f(bndry->x, bndry->y, zk) = - f(bndry->x - bndry->bx, bndry->y - bndry->by, zk) * exp(-1 * distance / decay_length); + // Exponential decay + f(bndry->x, bndry->y, zk) = f(bndry->x - bndry->bx, bndry->y - bndry->by, zk) + * exp(-1 * distance / decay_length); // Set any remaining guard cells (i.e. the outer guards) to the same value // Should the outer guards have the decay continue, or just copy what the inners have? for (int i = 1; i < bndry->width; i++) { - f(bndry->x + i * bndry->bx, bndry->y + i * bndry->by, zk) = f(bndry->x, bndry->y, zk); + f(bndry->x + i * bndry->bx, bndry->y + i * bndry->by, zk) = + f(bndry->x, bndry->y, zk); } } } @@ -170,8 +176,8 @@ class DecayLengthBoundary : public BoundaryOp { int Hermes::init(bool restarting) { - auto &options = Options::root()["hermes"]; - + auto& options = Options::root()["hermes"]; + output.write("\nGit Version of Hermes: {:s}\n", hermes::version::revision); options["revision"] = hermes::version::revision; options["revision"].setConditionallyUsed(); @@ -193,7 +199,7 @@ int Hermes::init(bool restarting) { units["inv_meters_cubed"] = Nnorm; units["eV"] = Tnorm; units["Tesla"] = Bnorm; - units["seconds"] = 1./Omega_ci; + units["seconds"] = 1. / Omega_ci; units["meters"] = rho_s0; // Put into the options tree, so quantities can be normalised @@ -212,11 +218,13 @@ int Hermes::init(bool restarting) { TRACE("Loading metric tensor"); if (options.isSet("loadmetric")) { - throw BoutException("Error: The loadmetric option has been renamed to recalculate_metric.\n" - "Note: The default (true/false) is inverted for the new option.\n" - "Setting recalculate_metric=false (the default) uses the metric in the grid file.\n" - "Setting recalculate_metric=true loads Rxy, Bpxy etc from the grid file.\n" - " This assumes an orthogonal coordinate system. See manual for details."); + throw BoutException( + "Error: The loadmetric option has been renamed to recalculate_metric.\n" + "Note: The default (true/false) is inverted for the new option.\n" + "Setting recalculate_metric=false (the default) uses the metric in the grid " + "file.\n" + "Setting recalculate_metric=true loads Rxy, Bpxy etc from the grid file.\n" + " This assumes an orthogonal coordinate system. See manual for details."); } if (options["recalculate_metric"] @@ -227,28 +235,23 @@ int Hermes::init(bool restarting) { } else { // Check that the grid file contains at least one metric tensor component // Note: Older grid files did not, so would silently default to the identity metric - if (!(mesh->sourceHasVar("J") or - mesh->sourceHasVar("g11") or - mesh->sourceHasVar("g22") or - mesh->sourceHasVar("g33") or - mesh->sourceHasVar("g12") or - mesh->sourceHasVar("g23") or - mesh->sourceHasVar("g13") or - mesh->sourceHasVar("g_11") or - mesh->sourceHasVar("g_22") or - mesh->sourceHasVar("g_33") or - mesh->sourceHasVar("g_12") or - mesh->sourceHasVar("g_23") or - mesh->sourceHasVar("g_13"))) { - throw BoutException("Grid input does not contain any metric components (J, g11, g_22 etc).\n" - "Set hermes:recalculate_metric=true to calculate from Rxy, Bpxy etc.\n" - "If the default identity metric is intended then set e.g. mesh:J=1\n"); + if (!(mesh->sourceHasVar("J") or mesh->sourceHasVar("g11") + or mesh->sourceHasVar("g22") or mesh->sourceHasVar("g33") + or mesh->sourceHasVar("g12") or mesh->sourceHasVar("g23") + or mesh->sourceHasVar("g13") or mesh->sourceHasVar("g_11") + or mesh->sourceHasVar("g_22") or mesh->sourceHasVar("g_33") + or mesh->sourceHasVar("g_12") or mesh->sourceHasVar("g_23") + or mesh->sourceHasVar("g_13"))) { + throw BoutException( + "Grid input does not contain any metric components (J, g11, g_22 etc).\n" + "Set hermes:recalculate_metric=true to calculate from Rxy, Bpxy etc.\n" + "If the default identity metric is intended then set e.g. mesh:J=1\n"); } if (options["normalise_metric"] - .doc("Normalise input metric tensor? (assumes input is in SI units)") - .withDefault(true)) { - Coordinates *coord = mesh->getCoordinates(); + .doc("Normalise input metric tensor? (assumes input is in SI units)") + .withDefault(true)) { + Coordinates* coord = mesh->getCoordinates(); // To use non-orthogonal metric // Normalise coord->dx /= rho_s0 * rho_s0 * Bnorm; @@ -296,7 +299,7 @@ int Hermes::init(bool restarting) { int Hermes::rhs(BoutReal time, bool linear) { // Need to reset the state, since fields may be modified in transform steps state = Options(); - + set(state["time"], time); state["units"] = units.copy(); set(state["linear"], linear); @@ -330,82 +333,70 @@ void Hermes::outputVars(Options& options) { // Save normalisation quantities. These may be used by components // to calculate conversion factors to SI units - set_with_attrs(options["Tnorm"], Tnorm, { - {"units", "eV"}, - {"conversion", 1}, // Already in SI units - {"standard_name", "temperature normalisation"}, - {"long_name", "temperature normalisation"} - }); - set_with_attrs(options["Nnorm"], Nnorm, { - {"units", "m^-3"}, - {"conversion", 1}, - {"standard_name", "density normalisation"}, - {"long_name", "Number density normalisation"} - }); - set_with_attrs(options["Bnorm"], Bnorm, { - {"units", "T"}, - {"conversion", 1}, - {"standard_name", "magnetic field normalisation"}, - {"long_name", "Magnetic field normalisation"} - }); - set_with_attrs(options["Cs0"], Cs0, { - {"units", "m/s"}, - {"conversion", 1}, - {"standard_name", "velocity normalisation"}, - {"long_name", "Sound speed normalisation"} - }); - set_with_attrs(options["Omega_ci"], Omega_ci, { - {"units", "s^-1"}, - {"conversion", 1}, - {"standard_name", "frequency normalisation"}, - {"long_name", "Cyclotron frequency normalisation"} - }); - set_with_attrs(options["rho_s0"], rho_s0, { - {"units", "m"}, - {"conversion", 1}, - {"standard_name", "length normalisation"}, - {"long_name", "Gyro-radius length normalisation"} - }); + set_with_attrs(options["Tnorm"], Tnorm, + {{"units", "eV"}, + {"conversion", 1}, // Already in SI units + {"standard_name", "temperature normalisation"}, + {"long_name", "temperature normalisation"}}); + set_with_attrs(options["Nnorm"], Nnorm, + {{"units", "m^-3"}, + {"conversion", 1}, + {"standard_name", "density normalisation"}, + {"long_name", "Number density normalisation"}}); + set_with_attrs(options["Bnorm"], Bnorm, + {{"units", "T"}, + {"conversion", 1}, + {"standard_name", "magnetic field normalisation"}, + {"long_name", "Magnetic field normalisation"}}); + set_with_attrs(options["Cs0"], Cs0, + {{"units", "m/s"}, + {"conversion", 1}, + {"standard_name", "velocity normalisation"}, + {"long_name", "Sound speed normalisation"}}); + set_with_attrs(options["Omega_ci"], Omega_ci, + {{"units", "s^-1"}, + {"conversion", 1}, + {"standard_name", "frequency normalisation"}, + {"long_name", "Cyclotron frequency normalisation"}}); + set_with_attrs(options["rho_s0"], rho_s0, + {{"units", "m"}, + {"conversion", 1}, + {"standard_name", "length normalisation"}, + {"long_name", "Gyro-radius length normalisation"}}); scheduler->outputVars(options); } void Hermes::restartVars(Options& options) { - set_with_attrs(options["Tnorm"], Tnorm, { - {"units", "eV"}, - {"conversion", 1}, // Already in SI units - {"standard_name", "temperature normalisation"}, - {"long_name", "temperature normalisation"} - }); - set_with_attrs(options["Nnorm"], Nnorm, { - {"units", "m^-3"}, - {"conversion", 1}, - {"standard_name", "density normalisation"}, - {"long_name", "Number density normalisation"} - }); - set_with_attrs(options["Bnorm"], Bnorm, { - {"units", "T"}, - {"conversion", 1}, - {"standard_name", "magnetic field normalisation"}, - {"long_name", "Magnetic field normalisation"} - }); - set_with_attrs(options["Cs0"], Cs0, { - {"units", "m/s"}, - {"conversion", 1}, - {"standard_name", "velocity normalisation"}, - {"long_name", "Sound speed normalisation"} - }); - set_with_attrs(options["Omega_ci"], Omega_ci, { - {"units", "s^-1"}, - {"conversion", 1}, - {"standard_name", "frequency normalisation"}, - {"long_name", "Cyclotron frequency normalisation"} - }); - set_with_attrs(options["rho_s0"], rho_s0, { - {"units", "m"}, - {"conversion", 1}, - {"standard_name", "length normalisation"}, - {"long_name", "Gyro-radius length normalisation"} - }); + set_with_attrs(options["Tnorm"], Tnorm, + {{"units", "eV"}, + {"conversion", 1}, // Already in SI units + {"standard_name", "temperature normalisation"}, + {"long_name", "temperature normalisation"}}); + set_with_attrs(options["Nnorm"], Nnorm, + {{"units", "m^-3"}, + {"conversion", 1}, + {"standard_name", "density normalisation"}, + {"long_name", "Number density normalisation"}}); + set_with_attrs(options["Bnorm"], Bnorm, + {{"units", "T"}, + {"conversion", 1}, + {"standard_name", "magnetic field normalisation"}, + {"long_name", "Magnetic field normalisation"}}); + set_with_attrs(options["Cs0"], Cs0, + {{"units", "m/s"}, + {"conversion", 1}, + {"standard_name", "velocity normalisation"}, + {"long_name", "Sound speed normalisation"}}); + set_with_attrs(options["Omega_ci"], Omega_ci, + {{"units", "s^-1"}, + {"conversion", 1}, + {"standard_name", "frequency normalisation"}, + {"long_name", "Cyclotron frequency normalisation"}}); + set_with_attrs(options["rho_s0"], rho_s0, + {{"units", "m"}, + {"conversion", 1}, + {"standard_name", "length normalisation"}, + {"long_name", "Gyro-radius length normalisation"}}); scheduler->restartVars(options); } diff --git a/include/hydrogen_molecule_reactions.hxx b/include/hydrogen_molecule_reactions.hxx new file mode 100644 index 000000000..ad2fa7c8c --- /dev/null +++ b/include/hydrogen_molecule_reactions.hxx @@ -0,0 +1,225 @@ +#pragma once +#ifndef HYDROGEN_MOLECULE_REACTIONS_H +#define HYDROGEN_MOLECULE_REACTIONS_H + +#include "cx_reaction.hxx" +#include "molecular_reactions.hxx" +#include + +namespace hermes { + +enum class HIsotope { h, d, t }; + +/** + * @brief Reaction class for molecular charge exchange / ion conversion. + * + * @details Based on CXReaction. + */ +struct MolHCX : public CXReaction { + /** + * @brief Main constructor for MolHCX. + * + * @param name + * @param options The options object + */ + MolHCX(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHCX(std::string name, Options& options, Solver*); +}; + +/** + * @brief Class to handle dissociation of molecular Hydrogen (and its isotopes). + */ +template +struct MolHDissociation : public Dissociation { + /** + * @brief Constructor for MolHDissociation. + * + * @param name + * @param options The options object + */ + MolHDissociation(std::string name, Options& options) : Dissociation(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHDissociation(std::string name, Options& options, Solver* solver) + : Dissociation(name, options, solver) {} +}; + +/** + * @brief Class to handle dissociative excitation of molecular Hydrogen (and its + * isotopes). + */ +template +struct MolHDissociativeExc : public DissociativeExc { + /** + * @brief Constructor for MolHDissociativeExc. + * + * @param name + * @param options The options object + */ + MolHDissociativeExc(std::string name, Options& options) + : DissociativeExc(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHDissociativeExc(std::string name, Options& options, Solver* solver) + : DissociativeExc(name, options, solver) {} +}; + +/** + * @brief Class to handle dissociative ionisation of molecular Hydrogen (and its + * isotopes). + */ +template +struct MolHDissociativeIzn : public DissociativeIzn { + /** + * @brief Constructor for MolHDissociativeIzn. + * + * @param name + * @param options The options object + */ + MolHDissociativeIzn(std::string name, Options& options) + : DissociativeIzn(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHDissociativeIzn(std::string name, Options& options, Solver* solver) + : DissociativeIzn(name, options, solver) {} +}; + +/** + * @brief Class to handle non-dissociative ionisation of molecular Hydrogen (and its + * isotopes). + */ +template +struct MolHNonDissociativeIzn : public NonDissociativeIzn { + /** + * @brief Constructor for MolHNonDissociativeIzn. + * + * @param name + * @param options The options object + */ + MolHNonDissociativeIzn(std::string name, Options& options) + : NonDissociativeIzn(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHNonDissociativeIzn(std::string name, Options& options, Solver* solver) + : NonDissociativeIzn(name, options, solver) {} +}; + +/** + * @brief Class to handle dissociative recombination of molecular Hydrogen (and its + * isotopes). + */ +template +struct MolHDissociativeRec : public DissociativeRec { + /** + * @brief Constructor for MolHDissociativeRec. + * + * @param name + * @param options The options object + */ + MolHDissociativeRec(std::string name, Options& options) + : DissociativeRec(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHDissociativeRec(std::string name, Options& options, Solver* solver) + : DissociativeRec(name, options, solver) {} +}; + +} // namespace hermes + +// Register molecular Hydrogen reactions +namespace { + +// Non-dissociative ionisation of H isotope molecules +RegisterComponent> + register_h2_nondiss_izn_h("h2 + e -> h2+ + 2e"); +RegisterComponent> + register_d2_nondiss_izn_d("d2 + e -> d2+ + 2e"); +RegisterComponent> + register_t2_nondiss_izn_t("t2 + e -> t2+ + 2e"); + +// Dissociation of H isotope molecules +RegisterComponent> + register_h2_diss("h2 + e -> 2h + e"); +RegisterComponent> + register_d2_diss("d2 + e -> 2d + e"); +RegisterComponent> + register_t2_diss("t2 + e -> 2t + e"); + +// Dissociative ionisation of H isotope molecules +RegisterComponent> + register_h2_diss_izn_h("h2 + e -> h + h+ + 2e"); +RegisterComponent> + register_d2_diss_izn_d("d2 + e -> d + d+ + 2e"); +RegisterComponent> + register_t2_diss_izn_t("t2 + e -> t + t+ + 2e"); + +// Charge exchange between H isotope molecules and H isotope ions +RegisterComponent register_h2_h_cx("h2 + h+ -> h2+ + h"); +RegisterComponent register_d2_d_cx("d2 + d+ -> d2+ + d"); +RegisterComponent register_t2_t_cx("t2 + t+ -> t2+ + t"); + +// Dissociative recombination of H isotope molecular ions +RegisterComponent> + register_h2_plus_rec_h("h2+ + e -> 2h"); +RegisterComponent> + register_d2_plus_rec_d("d2+ + e -> 2d"); +RegisterComponent> + register_t2_plus_rec_t("t2+ + e -> 2t"); + +// Dissociative excitation of H isotope molecular ions +RegisterComponent> + register_h2_plus_diss_exc_h("h2+ + e -> h + h+ + e"); +RegisterComponent> + register_d2_plus_diss_exc_d("d2+ + e -> d + d+ + e"); +RegisterComponent> + register_t2_plus_diss_exc_t("t2+ + e -> t + t+ + e"); + +// Dissociative ionisation of H isotope molecular ions +RegisterComponent> + register_h2_plus_diss_izn_h("h2+ + e -> 2h+ + 2e"); +RegisterComponent> + register_d2_plus_diss_izn_d("d2+ + e -> 2d+ + 2e"); +RegisterComponent> + register_t2_plus_diss_izn_t("t2+ + e -> 2t+ + 2e"); + +} // namespace + +#endif // HYDROGEN_MOLECULE_REACTIONS_H diff --git a/include/molecular_reactions.hxx b/include/molecular_reactions.hxx new file mode 100644 index 000000000..233554a9b --- /dev/null +++ b/include/molecular_reactions.hxx @@ -0,0 +1,125 @@ +#pragma once +#ifndef MOLECULAR_REACTIONS_H +#define MOLECULAR_REACTIONS_H + +#include "cx_reaction.hxx" +#include "reaction.hxx" +#include + +namespace hermes { + +/** + * @brief Base class for dissociation reactions involving molecules. + * + * @details Inherits from Reaction to handle dissociation of molecular species. + */ +struct Dissociation : public Reaction { + /** + * @brief Main constructor for Dissociation. + * + * @param name + * @param options The options object + */ + Dissociation(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + Dissociation(std::string name, Options& options, Solver*); +}; + +/** + * @brief Base class for dissociative excitation reactions involving molecules. + */ +struct DissociativeExc : public Reaction { + /** + * @brief Main constructor for DissociativeExc. + * + * @param name + * @param options The options object + */ + DissociativeExc(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + DissociativeExc(std::string name, Options& options, Solver*); +}; + +/** + * @brief Base class for dissociative ionization reactions involving molecules. + */ +struct DissociativeIzn : public Reaction { + /** + * @brief Main constructor for DissociativeIzn. + * + * @param name + * @param options The options object + */ + DissociativeIzn(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + DissociativeIzn(std::string name, Options& options, Solver*); +}; + +/** + * @brief Base class for non-dissociative ionization reactions involving molecules. + */ +struct NonDissociativeIzn : public Reaction { + /** + * @brief Main constructor for NonDissociativeIzn. + * + * @param name + * @param options The options object + */ + NonDissociativeIzn(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + NonDissociativeIzn(std::string name, Options& options, Solver*); +}; + +/** + * @brief Base class for dissociative recombination reactions involving molecules. + */ +struct DissociativeRec : public Reaction { + /** + * @brief Main constructor for DissociativeRec. + * + * @param name + * @param options The options object + */ + DissociativeRec(std::string name, Options& options); + + /** + * @brief Constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation + */ + DissociativeRec(std::string name, Options& options, Solver*); +}; + +} // namespace hermes + +#endif // MOLECULAR_REACTIONS_H diff --git a/include/reaction_settings.hxx b/include/reaction_settings.hxx index 2f2cd3eee..caafe8c39 100644 --- a/include/reaction_settings.hxx +++ b/include/reaction_settings.hxx @@ -58,31 +58,67 @@ static inline void add_default_id(ReactionDataTypes data_type, static inline void generate_default_data_ids_map() { constexpr char H_isotopes[] = {'h', 'd', 't'}; - // H isotope izn + // Various atomic and molecular reactions involving H isotopes + std::string reaction_str; for (const char& isotope : H_isotopes) { - std::string reaction_str = fmt::format("{} + e -> {}+ + 2e", isotope, isotope); + reaction_str = fmt::format("{} + e -> {}+ + 2e", isotope, isotope); + // Ionisation of atoms add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, "H.4_2.1.5"); add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v_E, "H.10_2.1.5"); - } - // H isotope rec - for (const char& isotope : H_isotopes) { - std::string reaction_str = fmt::format("{}+ + e -> {}", isotope, isotope); + // Recombination of ions + reaction_str = fmt::format("{}+ + e -> {}", isotope, isotope); add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, "H.4_2.1.8"); add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v_E, "H.10_2.1.8"); + + // Dissociation of neutral molecules + reaction_str = fmt::format("{}2 + e -> 2{} + e", isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.5g"); + + // Non-dissociative ionisation of neutral molecules + reaction_str = fmt::format("{}2 + e -> {}2+ + 2e", isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.9"); + + // Dissociative ionisation of neutral molecules + reaction_str = fmt::format("{}2 + e -> {} + {}+ + 2e", isotope, isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.10"); + + // Dissociative ionisation of (singly-) ionised molecules + reaction_str = fmt::format("{}2+ + e -> 2{}+ + 2e", isotope, isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.11"); + + // Dissociative excitation of (singly-) ionised molecules + reaction_str = fmt::format("{}2+ + e -> {} + {}+ + e", isotope, isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.12"); + + // Dissociative recombination of (singly-) ionised molecules + reaction_str = fmt::format("{}2+ + e -> 2{}", isotope, isotope); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.4_2.2.14"); } // H isotope CX for (const char& isotope1 : H_isotopes) { for (const char& isotope2 : H_isotopes) { + // Atom-ion CX std::string reaction_str = fmt::format("{} + {}+ -> {}+ + {}", isotope1, isotope2, isotope1, isotope2); add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, "H.2_3.1.8"); + // Molecule-ion CX + reaction_str = + fmt::format("{}2 + {}+ -> {}2+ + {}", isotope1, isotope2, isotope1, isotope2); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.2_3.2.3"); } } diff --git a/src/hydrogen_molecule_reactions.cxx b/src/hydrogen_molecule_reactions.cxx new file mode 100644 index 000000000..4403380f8 --- /dev/null +++ b/src/hydrogen_molecule_reactions.cxx @@ -0,0 +1,11 @@ +#include "hydrogen_molecule_reactions.hxx" + +namespace hermes { + +// MolHCX implementation +MolHCX::MolHCX(std::string name, Options& options) : CXReaction(name, options) {} + +MolHCX::MolHCX(std::string name, Options& options, Solver* solver) + : CXReaction(name, options, solver) {} + +} // namespace hermes diff --git a/src/molecular_reactions.cxx b/src/molecular_reactions.cxx new file mode 100644 index 000000000..ef2333069 --- /dev/null +++ b/src/molecular_reactions.cxx @@ -0,0 +1,40 @@ +#include "molecular_reactions.hxx" + +namespace hermes { + +// Dissociation implementation +Dissociation::Dissociation(std::string name, Options& options) + : Reaction(name, options) {} + +Dissociation::Dissociation(std::string name, Options& options, Solver*) + : Reaction(name, options) {} + +// DissociativeExc implementation +DissociativeExc::DissociativeExc(std::string name, Options& options) + : Reaction(name, options) {} + +DissociativeExc::DissociativeExc(std::string name, Options& options, Solver*) + : Reaction(name, options) {} + +// DissociativeIzn implementation +DissociativeIzn::DissociativeIzn(std::string name, Options& options) + : Reaction(name, options) {} + +DissociativeIzn::DissociativeIzn(std::string name, Options& options, Solver*) + : Reaction(name, options) {} + +// NonDissociativeIzn implementation +NonDissociativeIzn::NonDissociativeIzn(std::string name, Options& options) + : Reaction(name, options) {} + +NonDissociativeIzn::NonDissociativeIzn(std::string name, Options& options, Solver*) + : Reaction(name, options) {} + +// DissociativeRec implementation +DissociativeRec::DissociativeRec(std::string name, Options& options) + : Reaction(name, options) {} + +DissociativeRec::DissociativeRec(std::string name, Options& options, Solver*) + : Reaction(name, options) {} + +} // namespace hermes diff --git a/tests/unit/reactions/D2DissIzn.nc b/tests/unit/reactions/D2DissIzn.nc new file mode 100644 index 0000000000000000000000000000000000000000..72b25ba3ce861072a9f1a4e4e7ec6656bb095a50 GIT binary patch literal 111153 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 literal 0 HcmV?d00001 diff --git a/tests/unit/reactions/D2DpCX.nc b/tests/unit/reactions/D2DpCX.nc new file mode 100644 index 0000000000000000000000000000000000000000..f5f1c7446bf57269b0b30cdbe57a505083b4a31b GIT binary patch literal 165179 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 literal 0 HcmV?d00001 diff --git a/tests/unit/reactions/H2Diss.nc b/tests/unit/reactions/H2Diss.nc new file mode 100644 index 0000000000000000000000000000000000000000..41dca7f981070f1e0dbe9ddfc42a3a7c6d371323 GIT binary patch literal 84817 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 literal 0 HcmV?d00001 diff --git a/tests/unit/reactions/T2pDissExc.nc b/tests/unit/reactions/T2pDissExc.nc new file mode 100644 index 0000000000000000000000000000000000000000..2d026f85550e005046d2cba4ebd15345fbc93e43 GIT binary patch literal 106170 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 literal 0 HcmV?d00001 diff --git a/tests/unit/reactions/T2pDissRec.nc b/tests/unit/reactions/T2pDissRec.nc new file mode 100644 index 0000000000000000000000000000000000000000..cfe6da9b483042025801df7291c798ccd2e3291a GIT binary patch literal 89788 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 literal 0 HcmV?d00001 diff --git a/tests/unit/test_hydrogen_molecule_reaction_inst.cxx b/tests/unit/test_hydrogen_molecule_reaction_inst.cxx new file mode 100644 index 000000000..736d5e3c1 --- /dev/null +++ b/tests/unit/test_hydrogen_molecule_reaction_inst.cxx @@ -0,0 +1,31 @@ +#include "../../include/hydrogen_molecule_reactions.hxx" +#include "fake_mesh_fixture.hxx" +#include "test_extras.hxx" +#include "gtest/gtest.h" + +namespace bout { +namespace globals { +extern Mesh* mesh; +} +} // namespace bout +using namespace bout::globals; + +using HydrogenMoleculeReactionInstTest = FakeMeshFixture; + +static Options base_options{ + {"units", {{"eV", 1.0}, {"inv_meters_cubed", 1.0}, {"seconds", 1.0}}}}; + + +TEST_F(HydrogenMoleculeReactionInstTest, CreateMolHDissociativeExc) { + hermes::ReactionBase::reset_instance_counter(); + Options options = base_options.copy(); + options["test"]["type"] = "h2+ + e -> h + h+ + e"; + hermes::MolHDissociativeExc component("test", options, nullptr); +} + +TEST_F(HydrogenMoleculeReactionInstTest, CreateMolHDissociativeIzn) { + hermes::ReactionBase::reset_instance_counter(); + Options options = base_options.copy(); + options["test"]["type"] = "h2 + e -> h + h+ + 2e"; + hermes::MolHDissociativeIzn component("test", options, nullptr); +} diff --git a/tests/unit/test_molecule_reactions.hxx b/tests/unit/test_molecule_reactions.hxx new file mode 100644 index 000000000..196b968ed --- /dev/null +++ b/tests/unit/test_molecule_reactions.hxx @@ -0,0 +1,144 @@ +#pragma once +#ifndef TEST_MOLECULE_REACTIONS_H +#define TEST_MOLECULE_REACTIONS_H + +#include "hydrogen_molecule_reactions.hxx" + +namespace hermes { + +/** + * @brief Class to test dissociative reactions. + * + */ + +template +class DissociativeReactionTest : public ReactionTest { + + static_assert(std::is_base_of(), + "Template arg to DissociativeReactionTest must derive from Reaction"); + +protected: + DissociativeReactionTest(std::string lbl, std::string reaction_str) + : ReactionTest(lbl, reaction_str) { + + // Generate sorted lists of heavy reactants and products + this->heavy_reactants = + this->parser.get_species(species_filter::reactants, species_filter::heavy); + std::sort(this->heavy_reactants.begin(), this->heavy_reactants.end()); + this->heavy_products = + this->parser.get_species(species_filter::products, species_filter::heavy); + std::sort(this->heavy_products.begin(), this->heavy_products.end()); + this->heavy_species = this->parser.get_species(species_filter::heavy); + std::sort(this->heavy_species.begin(), this->heavy_species.end()); + }; + + /// Sorted lists of heavy reactants, products, all species, for use in generating the + /// test state. + std::vector heavy_reactants; + std::vector heavy_products; + std::vector heavy_species; + + /** + * @brief Generated state should work with any number of heavy reactants/products. + * + * @return Options + */ + Options generate_state() final { + // Must have at least one heavy reactant and one heavy product. + if (heavy_reactants.size() == 0 || heavy_products.size() == 0) { + throw BoutException( + fmt::format("DissociativeReactionTest::generate_state expects reactions with " + "at least one heavy reactant and one heavy product.")); + } + + std::string comp_name("test" + this->lbl); + Field3D e_vel(1.0); + Options state{{comp_name, + { + {"type", this->parser.get_reaction_str()}, + {"diagnose", true}, + }}, + {"units", {{"eV", 1.0}, {"inv_meters_cubed", 1.0}, {"seconds", 1.0}}}, + {"species", {{"e", {{"AA", 1. / 1836}}}}}}; + + // Linear functions for various fields that are inputs to the reaction transforms + + // Cycle through axes when setting fields, starting with x + // (species names are sorted, so the state generated should be order independent) + linfunc_axis axis = linfunc_axis::x; + + // Densities and temperatures for electrons + state["species"]["e"]["density"] = FieldFactory::get()->create3D( + this->gen_lin_field_str(this->logn_min, this->logn_max, axis++), &state, mesh); + state["species"]["e"]["temperature"] = FieldFactory::get()->create3D( + this->gen_lin_field_str(this->logT_min, this->logT_max, axis++), &state, mesh); + + // Densities and temperatures for all heavy reactants + for (const auto& reactant : this->heavy_reactants) { + state["species"][reactant]["density"] = FieldFactory::get()->create3D( + this->gen_lin_field_str(this->logn_min, this->logn_max, axis++), &state, mesh); + + state["species"][reactant]["temperature"] = FieldFactory::get()->create3D( + this->gen_lin_field_str(this->logT_min, this->logT_max, axis++), &state, mesh); + } + + // Masses, velocities for all heavy species + for (const auto& sp_name : this->heavy_species) { + state["species"][sp_name]["AA"] = 1.0; + state["species"][sp_name]["velocity"] = FieldFactory::get()->create3D( + this->gen_lin_field_str(this->logv_min, this->logv_max, axis++), &state, mesh); + } + return state; + } +}; + +// Dissociation of H2 +class H2DissTest : public DissociativeReactionTest> { +public: + H2DissTest() + : DissociativeReactionTest>("H2Diss", + "h2 + e -> 2h + e") {} +}; + +// Dissociative excitation of T2 +class T2pDissExcTest : public DissociativeReactionTest> { +public: + T2pDissExcTest() + : DissociativeReactionTest>( + "T2pDissExc", "t2+ + e -> t + t+ + e") {} +}; + +// Dissociative ionisation of D2 +class D2DissIznTest : public DissociativeReactionTest> { +public: + D2DissIznTest() + : DissociativeReactionTest>( + "D2DissIzn", "d2 + e -> d + d+ + 2e") {} +}; + +// Non-dissociative ionisation of H2 +class H2NonDissIznTest + : public DissociativeReactionTest> { +public: + H2NonDissIznTest() + : DissociativeReactionTest>( + "H2NonDissIzn", "h2 + e -> h2+ + 2e") {} +}; + +// Dissociative recombination of T2+ +class T2pDissRecTest : public DissociativeReactionTest> { +public: + T2pDissRecTest() + : DissociativeReactionTest>("T2pDissRec", + "t2+ + e -> 2t") {} +}; + +// CX involving molecules +class D2DpCXTest : public CXReactionTest { +public: + D2DpCXTest() : CXReactionTest("D2DpCX", "d2 + d+ -> d2+ + d") {} +}; + +} // namespace hermes + +#endif // TEST_MOLECULE_REACTIONS_H diff --git a/tests/unit/test_reactions.cxx b/tests/unit/test_reactions.cxx index 94ee0b0c0..399371a83 100644 --- a/tests/unit/test_reactions.cxx +++ b/tests/unit/test_reactions.cxx @@ -1,6 +1,7 @@ #include "test_adas_reactions.hxx" #include "test_cx_reactions.hxx" #include "test_izn_rec_reactions.hxx" +#include "test_molecule_reactions.hxx" namespace hermes { @@ -120,10 +121,17 @@ TEST_F(DTpCXTest, SourcesRegression) { sources_regression_test(); } // H/H+ CX with neutral momentum gain turned off TEST_F(HHpCXTest_noNeutralMomGain, SourcesRegression) { sources_regression_test(); } +/* Various dissociation reactions involving neutral/ionic molecules of H + * isotopes(non-exhaustive) + */ +TEST_F(H2DissTest, SourcesRegression) { sources_regression_test(); } +TEST_F(T2pDissExcTest, SourcesRegression) { sources_regression_test(); } +TEST_F(D2DissIznTest, SourcesRegression) { sources_regression_test(); } +TEST_F(H2NonDissIznTest, SourcesRegression) { sources_regression_test(); } +TEST_F(T2pDissRecTest, SourcesRegression) { sources_regression_test(); } + // CX involving molecules of H isotopes (non-exhaustive) -TEST_F(D2DpCXTest, SourcesRegression) { - generate_data(); // sources_regression_test(); -} +TEST_F(D2DpCXTest, SourcesRegression) { sources_regression_test(); } // He ionization TEST_F(HeIzn01Test, SourcesRegression) { sources_regression_test(); } diff --git a/tests/unit/test_reactions.hxx b/tests/unit/test_reactions.hxx index 3fb65361a..a8fc3ca52 100644 --- a/tests/unit/test_reactions.hxx +++ b/tests/unit/test_reactions.hxx @@ -22,6 +22,31 @@ enum class linfunc_axis { x, y, z }; +/** + * @brief Prefix increment operator for linfunc_axis. + * + * @param current_val The current value of the enum. + * @return linfunc_axis& The incremented value of the enum. + */ +inline linfunc_axis& operator++(linfunc_axis& current) { + current = (current == linfunc_axis::z) + ? linfunc_axis::x + : static_cast(static_cast(current) + 1); + return current; +} + +/** + * @brief Postfix increment operator for linfunc_axis. + * + * @param current The current value of the enum. + * @return linfunc_axis The old value of the enum. + */ +inline linfunc_axis operator++(linfunc_axis& current, int) { + linfunc_axis old = current; + ++current; + return old; +} + /// Global mesh namespace bout::globals { extern Mesh* mesh; @@ -47,7 +72,7 @@ class ReactionTest : public FakeMeshFixture_tmpl<8, 8, 8> { protected: ReactionTest(std::string lbl, std::string reaction_str) - : lbl(lbl), parser(reaction_str){}; + : lbl(lbl), parser(reaction_str) {}; std::string lbl; ReactionParser parser; From ab98edb7acac32d436241793e8565f324f58cd65 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:55:42 +0100 Subject: [PATCH 06/11] Allow Reaction subclasses to turn off population change sources entirely. --- include/reaction.hxx | 6 ++- src/reaction.cxx | 113 ++++++++++++++++++++++--------------------- 2 files changed, 64 insertions(+), 55 deletions(-) diff --git a/include/reaction.hxx b/include/reaction.hxx index c4b724663..5adb4193e 100644 --- a/include/reaction.hxx +++ b/include/reaction.hxx @@ -60,8 +60,10 @@ struct Reaction : public ReactionBase { * * @param name * @param options Options object + * @param add_pop_change_sources Whether to add population change sources (default: + * true) */ - Reaction(std::string name, Options& options); + Reaction(std::string name, Options& options, bool add_pop_change_sources = true); /** * @brief Copy all diagnostics into the output, setting the appropriate metadata at the @@ -210,6 +212,8 @@ protected: } private: + const bool add_pop_change_sources; + // Channels to determine how momentum and energy are distributed to product species std::map> energy_channels; std::map> momentum_channels; diff --git a/src/reaction.cxx b/src/reaction.cxx index b967d6b73..e9b3da230 100644 --- a/src/reaction.cxx +++ b/src/reaction.cxx @@ -14,10 +14,11 @@ namespace hermes { /// -Reaction::Reaction(std::string name, Options& options) +Reaction::Reaction(std::string name, Options& options, bool add_pop_change_sources) : ReactionBase({readOnly("species:{sp}:{r_val}"), readOnly("species:e:{e_val}"), readWrite("species:{sp}:{w_val}")}), - units(options["units"]), name(name) { + units(options["units"]), add_pop_change_sources(add_pop_change_sources), + name(name) { // Extract some relevant options, units to member vars for readability this->Tnorm = get(this->units["eV"]); @@ -280,63 +281,67 @@ void Reaction::transform_impl(GuardedOptions& state) { // Subclasses perform any additional transform tasks transform_additional(state, rate_calc_results); - // Use the stoichiometric values to set density sources for all species - Field3D density_source(0.0); - for (const auto& sp_name : this->parser->get_species()) { - int pop_change = this->parser->pop_change(sp_name); - if (pop_change != 0) { - // Density sources - density_source = pfactors.at(sp_name) * pop_change * rate_calc_results.rate; - update_source>(state, sp_name, ReactionDiagnosticType::density_src, - density_source); + if (this->add_pop_change_sources) { + + // Use the stoichiometric values to set density sources for all species + Field3D density_source(0.0); + for (const auto& sp_name : this->parser->get_species()) { + int pop_change = this->parser->pop_change(sp_name); + if (pop_change != 0) { + // Density sources + density_source = pfactors.at(sp_name) * pop_change * rate_calc_results.rate; + update_source>(state, sp_name, ReactionDiagnosticType::density_src, + density_source); + } } - } - // Population change-driven sources for all species other than electrons - init_channel_weights(state); - Field3D momentum_source, energy_source; - for (const auto& [sp_name, pop_change_s] : this->parser->get_mom_energy_pop_changes()) { - // No momentum, energy source for electrons due to pop change - if (sp_name.compare("e") == 0) { - continue; - } - momentum_source = 0.0; - energy_source = 0.0; - if (pop_change_s < 0) { - // For species with net loss, sources follows directly from pop change - momentum_source = pop_change_s * rate_calc_results.rate - * get(state["species"][sp_name]["AA"]) - * get(state["species"][sp_name]["velocity"]); - energy_source = pop_change_s * rate_calc_results.rate * (3. / 2) - * get(state["species"][sp_name]["temperature"]); - } else if (pop_change_s > 0) { - // Species with net gain receive a proportion of the momentum and energy lost by - // consumed reactants. See init_channel_weights() for default splitting factors. - for (auto& rsp_name : heavy_reactant_species) { - // All consumed (net loss) reactants can contribute - int pop_change_r = this->parser->pop_change_reactant(rsp_name); - if (pop_change_r < 0) { - momentum_source += -pop_change_r * pfactors.at(rsp_name) - * this->momentum_channels[rsp_name][sp_name] - * rate_calc_results.rate - * get(state["species"][rsp_name]["AA"]) - * get(state["species"][rsp_name]["velocity"]); - energy_source += -pop_change_r * pfactors.at(rsp_name) - * this->energy_channels[rsp_name][sp_name] - * rate_calc_results.rate * (3. / 2) - * get(state["species"][rsp_name]["temperature"]); + // Population change-driven sources for all species other than electrons + init_channel_weights(state); + Field3D momentum_source, energy_source; + for (const auto& [sp_name, pop_change_s] : + this->parser->get_mom_energy_pop_changes()) { + // No momentum, energy source for electrons due to pop change + if (sp_name.compare("e") == 0) { + continue; + } + momentum_source = 0.0; + energy_source = 0.0; + if (pop_change_s < 0) { + // For species with net loss, sources follows directly from pop change + momentum_source = pop_change_s * rate_calc_results.rate + * get(state["species"][sp_name]["AA"]) + * get(state["species"][sp_name]["velocity"]); + energy_source = pop_change_s * rate_calc_results.rate * (3. / 2) + * get(state["species"][sp_name]["temperature"]); + } else if (pop_change_s > 0) { + // Species with net gain receive a proportion of the momentum and energy lost by + // consumed reactants. See init_channel_weights() for default splitting factors. + for (auto& rsp_name : heavy_reactant_species) { + // All consumed (net loss) reactants can contribute + int pop_change_r = this->parser->pop_change_reactant(rsp_name); + if (pop_change_r < 0) { + momentum_source += -pop_change_r * pfactors.at(rsp_name) + * this->momentum_channels[rsp_name][sp_name] + * rate_calc_results.rate + * get(state["species"][rsp_name]["AA"]) + * get(state["species"][rsp_name]["velocity"]); + energy_source += -pop_change_r * pfactors.at(rsp_name) + * this->energy_channels[rsp_name][sp_name] + * rate_calc_results.rate * (3. / 2) + * get(state["species"][rsp_name]["temperature"]); + } } + } else { + // No pop change + continue; } - } else { - // No pop change - continue; - } - // Update sources - update_source>(state, sp_name, ReactionDiagnosticType::momentum_src, - momentum_source); - update_source>(state, sp_name, ReactionDiagnosticType::energy_src, - energy_source); + // Update sources + update_source>(state, sp_name, ReactionDiagnosticType::momentum_src, + momentum_source); + update_source>(state, sp_name, ReactionDiagnosticType::energy_src, + energy_source); + } } } From 7999eae24a04e10a9c3233e5aed9d425255eeb91 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:53:19 +0100 Subject: [PATCH 07/11] Allow reaction momentum/energy exchange due to population changes to be turned off entirely for particular species. --- src/reaction.cxx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/reaction.cxx b/src/reaction.cxx index e9b3da230..0d0a2d95e 100644 --- a/src/reaction.cxx +++ b/src/reaction.cxx @@ -193,12 +193,21 @@ void Reaction::init_channel_weights(GuardedOptions& state) { double total_energy_weight = std::accumulate( this->energy_channels[reactant].begin(), this->energy_channels[reactant].end(), 0.0, [](double sum, const auto& pair) { return sum + pair.second; }); - ASSERT0(total_energy_weight >= 0 && total_energy_weight <= 1); + if (total_energy_weight < 0 || total_energy_weight > 1.0) { + throw BoutException(fmt::format("Total energy channel weight for reactant '{}' is " + "{} (must satisfy 0 <= weight <= 1).", + reactant, total_energy_weight)); + } double total_momentum_weight = std::accumulate(this->momentum_channels[reactant].begin(), this->momentum_channels[reactant].end(), 0.0, [](double sum, const auto& pair) { return sum + pair.second; }); - ASSERT0(total_momentum_weight >= 0 && total_momentum_weight <= 1); + if (total_momentum_weight < 0 || total_momentum_weight > 1.0) { + throw BoutException( + fmt::format("Total momentum channel weight for reactant '{}' is " + "{} (must satisfy 0 <= weight <= 1).", + reactant, total_momentum_weight)); + } } } From d0d8d78e1a38f9c8332a59ae80f9535927d4fce3 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 08:53:47 +0100 Subject: [PATCH 08/11] Initial versions of ElasticCollision, MolHElasticCollision classes. Default rate data settings and a regression test for H ion-molecule collisions. --- CMakeLists.txt | 2 + include/elastic_collisions.hxx | 51 ++++++++++++++ include/hydrogen_molecule_reactions.hxx | 39 ++++++++++- include/reaction_settings.hxx | 7 +- src/elastic_collisions.cxx | 64 ++++++++++++++++++ tests/unit/reactions/H2HpElastic.nc | Bin 0 -> 74942 bytes .../test_hydrogen_molecule_reaction_inst.cxx | 31 --------- tests/unit/test_molecule_reactions.hxx | 10 +++ tests/unit/test_reactions.cxx | 3 + 9 files changed, 174 insertions(+), 33 deletions(-) create mode 100644 include/elastic_collisions.hxx create mode 100644 src/elastic_collisions.cxx create mode 100644 tests/unit/reactions/H2HpElastic.nc delete mode 100644 tests/unit/test_hydrogen_molecule_reaction_inst.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 85004f3ff..9f23434cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ set(HERMES_SOURCES src/component.cxx src/component_scheduler.cxx src/cx_reaction.cxx + src/elastic_collisions.cxx src/hydrogen_molecule_reactions.cxx src/ionisation.cxx src/izn_rec_reaction.cxx @@ -134,6 +135,7 @@ set(HERMES_SOURCES include/component_scheduler.hxx include/diamagnetic_drift.hxx include/div_ops.hxx + include/elastic_collisions.hxx include/electromagnetic.hxx include/electron_force_balance.hxx include/evolve_density.hxx diff --git a/include/elastic_collisions.hxx b/include/elastic_collisions.hxx new file mode 100644 index 000000000..ced9f5f38 --- /dev/null +++ b/include/elastic_collisions.hxx @@ -0,0 +1,51 @@ +#pragma once +#ifndef ELASTIC_COLLISIONS_H +#define ELASTIC_COLLISIONS_H + +#include "reaction.hxx" +#include + +namespace hermes { + +/** + * @brief Base class for elastic collision 'reactions'. + */ +struct ElasticCollision : public Reaction { + /** + * @brief Main constructor for ElasticCollision. + * + * @details Passes `add_pop_change_sources`=`false` to the Reaction + * constructor to disable standard density, momentum, energy sources due to population + * changes. + * + * @param name + * @param options The options object + */ + ElasticCollision(std::string name, Options& options); + + /** + * @brief ElasticCollision constructor used by component factory. + * + * @param name + * @param options The options object + * @param solver The solver object for the simulation (discarded by this class) + */ + ElasticCollision(std::string name, Options& options, Solver*); + + /** + * @brief Perform additional transformations specific to elastic collisions. + * + * @param state + * @param rate_calc_results + */ + void transform_additional([[maybe_unused]] GuardedOptions& state, + [[maybe_unused]] const RateData& rate_calc_results) final; + +private: + /// @brief Names of the two reactant species (== the product species) + std::string r1, r2; +}; + +} // namespace hermes + +#endif // ELASTIC_COLLISIONS_H diff --git a/include/hydrogen_molecule_reactions.hxx b/include/hydrogen_molecule_reactions.hxx index ad2fa7c8c..76c16b1bf 100644 --- a/include/hydrogen_molecule_reactions.hxx +++ b/include/hydrogen_molecule_reactions.hxx @@ -3,6 +3,7 @@ #define HYDROGEN_MOLECULE_REACTIONS_H #include "cx_reaction.hxx" +#include "elastic_collisions.hxx" #include "molecular_reactions.hxx" #include @@ -11,7 +12,7 @@ namespace hermes { enum class HIsotope { h, d, t }; /** - * @brief Reaction class for molecular charge exchange / ion conversion. + * @brief Class to handle charge exchange between Hydrogen (isotope) ions and molecules. * * @details Based on CXReaction. */ @@ -162,6 +163,34 @@ struct MolHDissociativeRec : public DissociativeRec { : DissociativeRec(name, options, solver) {} }; +/** + * @brief Templated hydrogen molecule elastic collision reaction. + * + * @details Child class of ElasticCollision, templated on hydrogen isotope. + */ +template +struct MolHElasticCollision : public ElasticCollision { + /** + * @brief Constructor for MolHElasticCollision. + * + * @param name The name of the reaction + * @param options The options object + */ + MolHElasticCollision(std::string name, Options& options) + : ElasticCollision(name, options) {} + + /** + * @brief Constructor used by component factory. + * + * @param name The name of the reaction + * @param options The options object + * @param solver The solver object for the simulation + */ + MolHElasticCollision(std::string name, Options& options, + [[maybe_unused]] Solver* solver) + : MolHElasticCollision(name, options) {} +}; + } // namespace hermes // Register molecular Hydrogen reactions @@ -220,6 +249,14 @@ RegisterComponent> RegisterComponent> register_t2_plus_diss_izn_t("t2+ + e -> 2t+ + 2e"); +// Elastic collisions between H isotope molecules and H isotope ions +RegisterComponent> + register_h2_h_elastic("h2 + h+ -> h2+ + h+"); +RegisterComponent> + register_d2_d_elastic("d2 + d+ -> d2+ + d+"); +RegisterComponent> + register_t2_t_elastic("t2 + t+ -> t2+ + t+"); + } // namespace #endif // HYDROGEN_MOLECULE_REACTIONS_H diff --git a/include/reaction_settings.hxx b/include/reaction_settings.hxx index caafe8c39..8eece0357 100644 --- a/include/reaction_settings.hxx +++ b/include/reaction_settings.hxx @@ -106,7 +106,7 @@ static inline void generate_default_data_ids_map() { "H.4_2.2.14"); } - // H isotope CX + // CX and elastic collisions involving H isotopes for (const char& isotope1 : H_isotopes) { for (const char& isotope2 : H_isotopes) { // Atom-ion CX @@ -119,6 +119,11 @@ static inline void generate_default_data_ids_map() { fmt::format("{}2 + {}+ -> {}2+ + {}", isotope1, isotope2, isotope1, isotope2); add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, "H.2_3.2.3"); + // Molecule-ion elastic collisions + reaction_str = + fmt::format("{}2 + {}+ -> {}2 + {}+", isotope1, isotope2, isotope1, isotope2); + add_default_id(ReactionDataTypes::Amjuel, reaction_str, ReactionCoeffTypes::sigma_v, + "H.2_0.3T"); } } diff --git a/src/elastic_collisions.cxx b/src/elastic_collisions.cxx new file mode 100644 index 000000000..03c6d5521 --- /dev/null +++ b/src/elastic_collisions.cxx @@ -0,0 +1,64 @@ +#include "elastic_collisions.hxx" + +namespace hermes { + +/// +ElasticCollision::ElasticCollision(std::string name, Options& options) + : Reaction(name, options, false) { + std::vector reactants = + this->parser->get_species(species_filter::reactants); + std::vector products = this->parser->get_species(species_filter::products); + + // Must have 2 reactants + if (reactants.size() != 2) { + throw BoutException(fmt::format("Expected exactly two reactant species in " + "elastic collision reaction, but found {}: {}", + reactants.size(), fmt::join(reactants, ", "))); + } + + // Check that reactants and products match (order-independent) + std::sort(reactants.begin(), reactants.end()); + std::sort(products.begin(), products.end()); + ASSERT2(reactants == products); + if (reactants != products) { + throw BoutException(fmt::format("Reactant and product species don't match in " + "elastic collision reaction: reactants are {} but " + "products are {}", + fmt::join(reactants, ", "), + fmt::join(products, ", "))); + } + + // Store reactant names for convenience + this->r1 = reactants[0]; + this->r2 = reactants[1]; + + // Diagnostics + add_diagnostic( + this->r1, fmt::format("F{}{}", this->r1, this->r2), + fmt::format("Momentum exchange due to elastic collisions between {} and {}", + this->r1, this->r2), + ReactionDiagnosticType::momentum_src, this->rate_data->src_str()); +} + +/// +void ElasticCollision::transform_additional( + [[maybe_unused]] GuardedOptions& state, + [[maybe_unused]] const RateData& rate_calc_results) { + + // Frictional force between the two species + const BoutReal& m1 = state["species"][this->r1]["AA"].GetRef(); + const BoutReal& m2 = state["species"][this->r2]["AA"].GetRef(); + const Field3D& v1 = state["species"][this->r1]["velocity"].GetRef(); + const Field3D& v2 = state["species"][this->r2]["velocity"].GetRef(); + + Field3D mu = (m1 * m2) / (m1 + m2); + Field3D momentum_exchange = rate_calc_results.rate * mu * (v1 - v2); + + // Subtract from r1 and diagnostic + update_source>(state, this->r1, ReactionDiagnosticType::momentum_src, + momentum_exchange); + // Add to r2 + add(state["species"][this->r2]["momentum_source"], momentum_exchange); +} + +} // namespace hermes diff --git a/tests/unit/reactions/H2HpElastic.nc b/tests/unit/reactions/H2HpElastic.nc new file mode 100644 index 0000000000000000000000000000000000000000..6889a71761f72e4fbc688bd855ffd8c43cecadc9 GIT binary patch literal 74942 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 Cc>&A- literal 0 HcmV?d00001 diff --git a/tests/unit/test_hydrogen_molecule_reaction_inst.cxx b/tests/unit/test_hydrogen_molecule_reaction_inst.cxx deleted file mode 100644 index 736d5e3c1..000000000 --- a/tests/unit/test_hydrogen_molecule_reaction_inst.cxx +++ /dev/null @@ -1,31 +0,0 @@ -#include "../../include/hydrogen_molecule_reactions.hxx" -#include "fake_mesh_fixture.hxx" -#include "test_extras.hxx" -#include "gtest/gtest.h" - -namespace bout { -namespace globals { -extern Mesh* mesh; -} -} // namespace bout -using namespace bout::globals; - -using HydrogenMoleculeReactionInstTest = FakeMeshFixture; - -static Options base_options{ - {"units", {{"eV", 1.0}, {"inv_meters_cubed", 1.0}, {"seconds", 1.0}}}}; - - -TEST_F(HydrogenMoleculeReactionInstTest, CreateMolHDissociativeExc) { - hermes::ReactionBase::reset_instance_counter(); - Options options = base_options.copy(); - options["test"]["type"] = "h2+ + e -> h + h+ + e"; - hermes::MolHDissociativeExc component("test", options, nullptr); -} - -TEST_F(HydrogenMoleculeReactionInstTest, CreateMolHDissociativeIzn) { - hermes::ReactionBase::reset_instance_counter(); - Options options = base_options.copy(); - options["test"]["type"] = "h2 + e -> h + h+ + 2e"; - hermes::MolHDissociativeIzn component("test", options, nullptr); -} diff --git a/tests/unit/test_molecule_reactions.hxx b/tests/unit/test_molecule_reactions.hxx index 196b968ed..69d797fc3 100644 --- a/tests/unit/test_molecule_reactions.hxx +++ b/tests/unit/test_molecule_reactions.hxx @@ -139,6 +139,16 @@ public: D2DpCXTest() : CXReactionTest("D2DpCX", "d2 + d+ -> d2+ + d") {} }; +// Elastic collision between H2 and H+ +// Use DissociativeReactionTest fixture for now +class H2HpElasticCollisionTest + : public DissociativeReactionTest> { +public: + H2HpElasticCollisionTest() + : DissociativeReactionTest>( + "H2HpElastic", "h2 + h+ -> h2 + h+") {} +}; + } // namespace hermes #endif // TEST_MOLECULE_REACTIONS_H diff --git a/tests/unit/test_reactions.cxx b/tests/unit/test_reactions.cxx index 399371a83..3805c919c 100644 --- a/tests/unit/test_reactions.cxx +++ b/tests/unit/test_reactions.cxx @@ -133,6 +133,9 @@ TEST_F(T2pDissRecTest, SourcesRegression) { sources_regression_test(); } // CX involving molecules of H isotopes (non-exhaustive) TEST_F(D2DpCXTest, SourcesRegression) { sources_regression_test(); } +// Elastic collision between H2 and H+ +TEST_F(H2HpElasticCollisionTest, SourcesRegression) { sources_regression_test(); } + // He ionization TEST_F(HeIzn01Test, SourcesRegression) { sources_regression_test(); } From 52dc1efb75815113f44da9f88a7d8ca7b1e2d848 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 11:55:29 +0100 Subject: [PATCH 09/11] Tidy up molecular reaction class constructors. --- CMakeLists.txt | 1 - include/molecular_reactions.hxx | 25 ++++++++++-------- src/hydrogen_molecule_reactions.cxx | 4 +-- src/molecular_reactions.cxx | 40 ----------------------------- 4 files changed, 17 insertions(+), 53 deletions(-) delete mode 100644 src/molecular_reactions.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f23434cf..dc2113b2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,6 @@ set(HERMES_SOURCES src/isothermal.cxx src/quasineutral.cxx src/diamagnetic_drift.cxx - src/molecular_reactions.cxx src/recalculate_metric.cxx src/relax_potential.cxx src/sheath_closure.cxx diff --git a/include/molecular_reactions.hxx b/include/molecular_reactions.hxx index 233554a9b..61d576def 100644 --- a/include/molecular_reactions.hxx +++ b/include/molecular_reactions.hxx @@ -20,7 +20,7 @@ struct Dissociation : public Reaction { * @param name * @param options The options object */ - Dissociation(std::string name, Options& options); + Dissociation(std::string name, Options& options) : Reaction(name, options) {}; /** * @brief Constructor used by component factory. @@ -29,7 +29,8 @@ struct Dissociation : public Reaction { * @param options The options object * @param solver The solver object for the simulation */ - Dissociation(std::string name, Options& options, Solver*); + Dissociation(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : Dissociation(name, options) {}; }; /** @@ -42,7 +43,7 @@ struct DissociativeExc : public Reaction { * @param name * @param options The options object */ - DissociativeExc(std::string name, Options& options); + DissociativeExc(std::string name, Options& options) : Reaction(name, options) {}; /** * @brief Constructor used by component factory. @@ -51,7 +52,8 @@ struct DissociativeExc : public Reaction { * @param options The options object * @param solver The solver object for the simulation */ - DissociativeExc(std::string name, Options& options, Solver*); + DissociativeExc(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : DissociativeExc(name, options) {}; }; /** @@ -64,7 +66,7 @@ struct DissociativeIzn : public Reaction { * @param name * @param options The options object */ - DissociativeIzn(std::string name, Options& options); + DissociativeIzn(std::string name, Options& options) : Reaction(name, options) {}; /** * @brief Constructor used by component factory. @@ -73,7 +75,8 @@ struct DissociativeIzn : public Reaction { * @param options The options object * @param solver The solver object for the simulation */ - DissociativeIzn(std::string name, Options& options, Solver*); + DissociativeIzn(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : DissociativeIzn(name, options) {}; }; /** @@ -86,7 +89,7 @@ struct NonDissociativeIzn : public Reaction { * @param name * @param options The options object */ - NonDissociativeIzn(std::string name, Options& options); + NonDissociativeIzn(std::string name, Options& options) : Reaction(name, options) {}; /** * @brief Constructor used by component factory. @@ -95,7 +98,8 @@ struct NonDissociativeIzn : public Reaction { * @param options The options object * @param solver The solver object for the simulation */ - NonDissociativeIzn(std::string name, Options& options, Solver*); + NonDissociativeIzn(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : NonDissociativeIzn(name, options) {}; }; /** @@ -108,7 +112,7 @@ struct DissociativeRec : public Reaction { * @param name * @param options The options object */ - DissociativeRec(std::string name, Options& options); + DissociativeRec(std::string name, Options& options) : Reaction(name, options) {}; /** * @brief Constructor used by component factory. @@ -117,7 +121,8 @@ struct DissociativeRec : public Reaction { * @param options The options object * @param solver The solver object for the simulation */ - DissociativeRec(std::string name, Options& options, Solver*); + DissociativeRec(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : DissociativeRec(name, options) {}; }; } // namespace hermes diff --git a/src/hydrogen_molecule_reactions.cxx b/src/hydrogen_molecule_reactions.cxx index 4403380f8..ac6bd5937 100644 --- a/src/hydrogen_molecule_reactions.cxx +++ b/src/hydrogen_molecule_reactions.cxx @@ -5,7 +5,7 @@ namespace hermes { // MolHCX implementation MolHCX::MolHCX(std::string name, Options& options) : CXReaction(name, options) {} -MolHCX::MolHCX(std::string name, Options& options, Solver* solver) - : CXReaction(name, options, solver) {} +MolHCX::MolHCX(std::string name, Options& options, [[maybe_unused]] Solver* solver) + : MolHCX(name, options) {} } // namespace hermes diff --git a/src/molecular_reactions.cxx b/src/molecular_reactions.cxx deleted file mode 100644 index ef2333069..000000000 --- a/src/molecular_reactions.cxx +++ /dev/null @@ -1,40 +0,0 @@ -#include "molecular_reactions.hxx" - -namespace hermes { - -// Dissociation implementation -Dissociation::Dissociation(std::string name, Options& options) - : Reaction(name, options) {} - -Dissociation::Dissociation(std::string name, Options& options, Solver*) - : Reaction(name, options) {} - -// DissociativeExc implementation -DissociativeExc::DissociativeExc(std::string name, Options& options) - : Reaction(name, options) {} - -DissociativeExc::DissociativeExc(std::string name, Options& options, Solver*) - : Reaction(name, options) {} - -// DissociativeIzn implementation -DissociativeIzn::DissociativeIzn(std::string name, Options& options) - : Reaction(name, options) {} - -DissociativeIzn::DissociativeIzn(std::string name, Options& options, Solver*) - : Reaction(name, options) {} - -// NonDissociativeIzn implementation -NonDissociativeIzn::NonDissociativeIzn(std::string name, Options& options) - : Reaction(name, options) {} - -NonDissociativeIzn::NonDissociativeIzn(std::string name, Options& options, Solver*) - : Reaction(name, options) {} - -// DissociativeRec implementation -DissociativeRec::DissociativeRec(std::string name, Options& options) - : Reaction(name, options) {} - -DissociativeRec::DissociativeRec(std::string name, Options& options, Solver*) - : Reaction(name, options) {} - -} // namespace hermes From 2a7b1094ea44b2e3da40c13ab16acb78c038be81 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 11:56:00 +0100 Subject: [PATCH 10/11] Test invalid elastic collision reaction strings. --- src/elastic_collisions.cxx | 12 +++++++----- tests/unit/test_reactions.cxx | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/elastic_collisions.cxx b/src/elastic_collisions.cxx index 03c6d5521..b5759afa5 100644 --- a/src/elastic_collisions.cxx +++ b/src/elastic_collisions.cxx @@ -33,11 +33,13 @@ ElasticCollision::ElasticCollision(std::string name, Options& options) this->r2 = reactants[1]; // Diagnostics - add_diagnostic( - this->r1, fmt::format("F{}{}", this->r1, this->r2), - fmt::format("Momentum exchange due to elastic collisions between {} and {}", - this->r1, this->r2), - ReactionDiagnosticType::momentum_src, this->rate_data->src_str()); + if (this->diagnose) { + add_diagnostic( + this->r1, fmt::format("F{}{}", this->r1, this->r2), + fmt::format("Momentum exchange due to elastic collisions between {} and {}", + this->r1, this->r2), + ReactionDiagnosticType::momentum_src, this->rate_data->src_str()); + } } /// diff --git a/tests/unit/test_reactions.cxx b/tests/unit/test_reactions.cxx index 3805c919c..d360f470c 100644 --- a/tests/unit/test_reactions.cxx +++ b/tests/unit/test_reactions.cxx @@ -5,7 +5,7 @@ namespace hermes { -//======================== General reaction class tests ======================= +// ======================= General reaction class tests ======================= /// @brief Test parsing of various input optionsReactionBase constructor should throw if /// the reaction type string is not valid TEST(ReactionTest, InputOptions) { @@ -49,7 +49,7 @@ TEST(ReactionTest, InputOptions) { ASSERT_THROW(CXReaction(comp_name, invalid_input2), BoutException); } -//======================== CX reaction class tests ======================= +// ========================== CX reaction class tests ========================= /// @brief CXReaction constructor should throw for strings that aren't valid CX /// reactions @@ -98,7 +98,36 @@ TEST(CXReactionTest, OrderIndependentReactionStrs) { } } -//====================== Reaction source regression tests ===================== +// =================== ElasticCollision reaction class tests ================== +/// @brief Test validity of various reaction strings for elastic collisions +TEST(ElasticCollisionTest, ReactionStrings) { + Options base_options{ + {"test", {{"data_ids", "H.2_0.3T"}}}, + {"units", {{"eV", 1.0}, {"inv_meters_cubed", 1.0}, {"seconds", 1.0}}}}; + + // Swapped order should work + std::string valid_reaction_str = "h2 + d+ -> d+ + h2 "; + ReactionBase::reset_instance_counter(); + Options options = base_options.copy(); + options["test"]["type"] = valid_reaction_str; + ASSERT_NO_THROW(ElasticCollision("test", options)); + + // Invalid elastic collision reaction strings + std::string too_few_species = "h -> h"; + std::string too_many_species = "h + d+ + t -> h + d+ + t"; + std::string reactants_products_mismatch = "h2 + d+ -> h2 +d"; + + // Test that constructor throws for each invalid reaction string + for (const auto& invalid_reaction_str : + {too_few_species, too_many_species, reactants_products_mismatch}) { + ReactionBase::reset_instance_counter(); + Options options = base_options.copy(); + options["test"]["type"] = invalid_reaction_str; + ASSERT_THROW(ElasticCollision("test", options), BoutException); + } +} + +// ===================== Reaction source regression tests ===================== // H isotopes ionization TEST_F(HIznTest, SourcesRegression) { sources_regression_test(); } From 3c65b0df86e5ef4f45ca90382118b7f6361b2022 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 24 Apr 2026 11:54:56 +0100 Subject: [PATCH 11/11] Test invalid reaction momentum/energy channel weights. --- tests/unit/test_reactions.cxx | 18 +++++++++++++++++- tests/unit/test_reactions.hxx | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_reactions.cxx b/tests/unit/test_reactions.cxx index d360f470c..56a472486 100644 --- a/tests/unit/test_reactions.cxx +++ b/tests/unit/test_reactions.cxx @@ -8,7 +8,7 @@ namespace hermes { // ======================= General reaction class tests ======================= /// @brief Test parsing of various input optionsReactionBase constructor should throw if /// the reaction type string is not valid -TEST(ReactionTest, InputOptions) { +TEST(ReactionConfigTest, InputOptions) { const std::string comp_name = "test"; // Base input with two reaction strings @@ -49,6 +49,22 @@ TEST(ReactionTest, InputOptions) { ASSERT_THROW(CXReaction(comp_name, invalid_input2), BoutException); } +/// @brief Values < 0 or > 1 for momentum/energy channels should throw +TEST(ReactionConfigTest, InvalidChannelWeightOptions) { + Options base_options{ + {"test", {{"type", "(h2 + d+ -> d+ + h2)"}, {"data_ids", "H.2_0.3T"}}}, + {"units", {{"eV", 1.0}, {"inv_meters_cubed", 1.0}, {"seconds", 1.0}}}}; + + ReactionBase::reset_instance_counter(); + Options options1 = base_options.copy(); + auto invalid_mom_weights_reaction = InvalidMomWeightsReaction("test", options1); + ASSERT_THROW(invalid_mom_weights_reaction.transform(options1), BoutException); + + ReactionBase::reset_instance_counter(); + Options options2 = base_options.copy(); + auto invalid_energy_weights_reaction = InvalidEnergyWeightsReaction("test", options2); + ASSERT_THROW(invalid_energy_weights_reaction.transform(options2), BoutException); +} // ========================== CX reaction class tests ========================= /// @brief CXReaction constructor should throw for strings that aren't valid CX diff --git a/tests/unit/test_reactions.hxx b/tests/unit/test_reactions.hxx index a8fc3ca52..2927a66a4 100644 --- a/tests/unit/test_reactions.hxx +++ b/tests/unit/test_reactions.hxx @@ -241,6 +241,29 @@ protected: } }; +/// An invalid reaction ( > 1 total energy weight for the first reactant) +struct InvalidEnergyWeightsReaction : public Reaction { + InvalidEnergyWeightsReaction(const std::string& name, Options& options) + : Reaction(name, options) { + std::string r1 = this->parser->get_reactant_by_position(1); + for (const std::string& product : + this->parser->get_species(species_filter::products)) { + this->set_energy_channel_weight(r1, product, 1.1); + } + } +}; +/// An invalid reaction ( < 0 total momentum weight for the first reactant) +struct InvalidMomWeightsReaction : public Reaction { + InvalidMomWeightsReaction(const std::string& name, Options& options) + : Reaction(name, options) { + std::string r1 = this->parser->get_reactant_by_position(1); + for (const std::string& product : + this->parser->get_species(species_filter::products)) { + this->set_momentum_channel_weight(r1, product, -0.1); + } + } +}; + } // namespace hermes #endif