chombo-discharge
Loading...
Searching...
No Matches
CD_CdrPlasmaImExSdcStepper.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_CDRPLASMAIMEXSDCSTEPPER_H
14#define CD_CDRPLASMAIMEXSDCSTEPPER_H
15
16// Our includes
17#include <CD_AmrMesh.H>
18#include <CD_CdrPlasmaStepper.H>
19#include <CD_CdrIterator.H>
20#include <CD_RtIterator.H>
21#include <CD_NamespaceHeader.H>
22
23namespace Physics {
24 namespace CdrPlasma {
25
42 {
43 public:
47 class CdrStorage;
48
52 class FieldStorage;
53
57 class RtStorage;
58
62 class SigmaStorage;
63
68
73 CdrPlasmaImExSdcStepper(RefCountedPtr<CdrPlasmaPhysics>& a_physics);
74
79
85 Real
86 advance(const Real a_dt) override;
87
93 void
94 allocateInternals() override;
95
99 void
100 deallocateInternals() override;
101
108 void
109 regridInternals(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override;
110
114 void
115 parseOptions() override;
116
120 void
121 parseRuntimeOptions() override;
122
123 protected:
127 Vector<RefCountedPtr<CdrStorage>> m_cdrScratch;
128
132 Vector<RefCountedPtr<RtStorage>> m_rteScratch;
133
137 RefCountedPtr<FieldStorage> m_fieldScratch;
138
142 RefCountedPtr<SigmaStorage> m_sigmaScratch;
143
148
152 int m_p;
153
157 int m_k;
158
163
168
174
179
184
189
194
199
204
209
214
219
224
229
234
239
244
249
254
259
264
269
274
279
284
289
294
298 Vector<Real> m_cdrError;
299
304
309
314
319 Vector<Vector<Real>> m_qmj;
320
324 Vector<Vector<Real>> m_vandermonde;
325
329 Vector<Real> m_nodes;
330
334 Vector<Real> m_tm;
335
339 Vector<Real> m_dtm;
340
344 std::string m_whichNodes;
345
351 RefCountedPtr<CdrStorage>&
352 getCdrStorage(const CdrIterator<CdrSolver>& a_solverIt);
353
359 RefCountedPtr<RtStorage>&
360 getRtStorage(const RtIterator<RtSolver>& a_solverIt);
361
365 void
367
371 void
373
377 void
379
383 void
385
391 Vector<EBAMRCellData*>
392 getCdrSolversPhiK(const int a_m);
393
399 EBAMRIVData&
400 getSigmaSolverK(const int a_m);
401
406 void
407 setupQuadratureNodes(const int a_p);
408
413 void
414 setupUniformNodes(const int a_p);
415
420 void
421 setupLobattoNodes(const int a_p);
422
427 void
428 setupChebyshevNodes(const int a_p);
429
434 void
435 setupQmj(const int a_p);
436
442 void
443 setupSubintervals(const Real a_time, const Real a_dt);
444
451 void
452 quad(EBAMRCellData& a_quad, const Vector<EBAMRCellData>& a_integrand, const int a_m);
453
460 void
461 quad(EBAMRIVData& a_quad, const Vector<EBAMRIVData>& a_integrand, const int a_m);
462
466 void
468
472 void
474
478 void
480
484 void
486
491 void
492 integrateRtTransient(const Real a_dt);
493
497 void
499
507 void
508 integrate(const Real a_dt, const Real a_time, const bool a_lagged_terms);
509
516 void
517 integrateAdvectionReaction(const Real a_dt, const int a_m, const bool a_lagged_terms);
518
525 void
526 integrateAdvection(const Real a_dt, const int a_m, const bool a_lagged_terms);
527
534 void
535 integrateDiffusion(const Real a_dt, const int a_m, const bool a_lagged_terms);
536
541 Vector<EBAMRCellData*>
542 getCdrErrors();
543
548 void
550
554 void
555 computeFD0();
556
560 void
562
566 void
568
575 void
576 computeNewDt(bool& a_accept_step, const Real a_dt, const int a_num_corrections);
577
587 void
588 adaptiveReport(const Real a_first_dt,
589 const Real a_dt,
590 const Real a_new_dt,
591 const int a_corr,
592 const int a_rej,
593 const Real a_max_err);
594
598 void
599 updateField();
600
606 void
607 updateField(const Vector<EBAMRCellData*>& a_densities, const EBAMRIVData& a_sigma);
608
612 void
614
618 void
619 storeSolvers();
620
624 void
626
633 void
634 computeReactionNetwork(const int a_m, const Real a_time, const Real a_dt);
635
639 void
641
645 void
647
652 void
653 computeCdrEbStates(const Vector<EBAMRCellData*>& a_phis);
654
658 void
660
665 void
666 computeCdrDomainStates(const Vector<EBAMRCellData*>& a_phis);
667
671 void
673
678 void
679 computeCdrGradients(const Vector<EBAMRCellData*>& a_phis);
680
685 void
686 computeCdrFluxes(const Real a_time);
687
693 void
694 computeCdrFluxes(const Vector<EBAMRCellData*>& a_phis, const Real a_time);
695
700 void
701 computeCdrDomainFluxes(const Real a_time);
702
708 void
709 computeCdrDomainFluxes(const Vector<EBAMRCellData*>& a_phis, const Real a_time);
710
715 void
716 computeCdrVelo(const Real a_time);
717
723 void
724 computeCdrVelo(const Vector<EBAMRCellData*>& a_phis, const Real a_time);
725
730 Real
731 computeDt() override;
732
736 void
738
743 Real
745
750 Real
752
761 void
762 writeStepProfile(const Real a_dt,
763 const Real a_error,
764 const int a_substeps,
765 const int a_corrections,
766 const int a_rejections);
767
771 void
772 parseNodes();
773
777 void
779
783 void
785
789 void
791
795 void
797 };
798 } // namespace CdrPlasma
799} // namespace Physics
800
801#include <CD_NamespaceFooter.H>
802
803#endif
Declaration of core class for handling AMR-related operations (with embedded boundaries)
Declaration of an iterator class for CdrLayout (for iterating through subsets of solvers).
Declaration of Physics::CdrPlasma::CdrPlasmaStepper, the abstract base class for CDR plasma time step...
Iterator class for RtLayout.
Iterator class for CdrLayout. This allows iteration through solvers (or subsets of solvers).
Definition CD_CdrIterator.H:28
Per-CDR-species scratch storage for the IMEX-SDC time stepper.
Definition CD_CdrPlasmaImExSdcStorage.H:33
Field solver scratch storage for the IMEX-SDC time stepper.
Definition CD_CdrPlasmaImExSdcStorage.H:427
Per-RTE-solver scratch storage for the IMEX-SDC time stepper.
Definition CD_CdrPlasmaImExSdcStorage.H:572
Surface charge solver scratch storage for the IMEX-SDC time stepper.
Definition CD_CdrPlasmaImExSdcStorage.H:687
CdrPlasmaStepper subclass that advances plasma equations using implicit-explicit spectral deferred co...
Definition CD_CdrPlasmaImExSdcStepper.H:42
Real getMaxNodeDistance()
Return the largest sub-interval width in the current SDC discretization.
Definition CD_CdrPlasmaImExSdcStepper.cpp:265
void copySigmaPToSigma()
Copy the SDC sigma^k storage at the final node p back into the surface charge solver.
Definition CD_CdrPlasmaImExSdcStepper.cpp:540
Vector< Real > m_nodes
Quadrature node positions in [0, 1].
Definition CD_CdrPlasmaImExSdcStepper.H:329
void integrate(const Real a_dt, const Real a_time, const bool a_lagged_terms)
Perform one complete SDC sweep over all subintervals.
Definition CD_CdrPlasmaImExSdcStepper.cpp:719
Vector< Vector< Real > > m_qmj
SDC integration matrix Q_{mj}. Entry [m][j] is the weight of node j in the quadrature approximation o...
Definition CD_CdrPlasmaImExSdcStepper.H:319
void restoreSolvers()
Restore CDR, RTE, field, and surface charge solver states from scratch.
Definition CD_CdrPlasmaImExSdcStepper.cpp:2045
bool m_computeD
Debug flag: if false, skip diffusion coefficient updates.
Definition CD_CdrPlasmaImExSdcStepper.H:263
std::string m_whichNodes
Node type selector: "uniform", "lobatto", or "chebyshev".
Definition CD_CdrPlasmaImExSdcStepper.H:344
void allocateFieldStorage()
Allocate scratch storage for the field solver.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1381
Vector< Real > m_dtm
Sub-interval widths: m_dtm[m] = m_tm[m+1] - m_tm[m].
Definition CD_CdrPlasmaImExSdcStepper.H:339
void storeSolvers()
Save the current CDR, RTE, field, and surface charge solver states to scratch.
Definition CD_CdrPlasmaImExSdcStepper.cpp:2015
void computeCdrEbStates()
Extrapolate current CDR solver states to EB centroids.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1518
Real m_maxDtGrowth
Maximum growth factor applied to the time step by the PI controller.
Definition CD_CdrPlasmaImExSdcStepper.H:178
bool m_doPoisson
Debug flag: if false, skip the Poisson solve.
Definition CD_CdrPlasmaImExSdcStepper.H:253
Real m_decreaseSafety
Additional safety factor applied when decreasing the time step.
Definition CD_CdrPlasmaImExSdcStepper.H:203
int m_k
Number of SDC correction sweeps to perform per time step.
Definition CD_CdrPlasmaImExSdcStepper.H:157
bool m_computeS
Debug flag: if false, skip source term evaluation.
Definition CD_CdrPlasmaImExSdcStepper.H:273
void setupQmj(const int a_p)
Compute the SDC integration matrix Q_{mj} from the current node positions.
Definition CD_CdrPlasmaImExSdcStepper.cpp:396
bool m_extrapAdvect
If true, extrapolate CDR states to the half-time before computing advective fluxes.
Definition CD_CdrPlasmaImExSdcStepper.H:218
void computeCdrDomainFluxes(const Real a_time)
Compute CDR boundary fluxes on domain faces from current solver states.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1730
bool m_haveDtErr
True once a time step error estimate has been computed.
Definition CD_CdrPlasmaImExSdcStepper.H:288
void copyCdrToPhiM0()
Copy current CDR solver states into the SDC phi^k storage at node 0.
Definition CD_CdrPlasmaImExSdcStepper.cpp:656
void computeCdrDomainStates()
Extrapolate current CDR solver states to domain faces.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1595
Real getMaxError()
Return the maximum CDR error norm across all species.
bool m_consistentE
If true, recompute the electric field consistently at each SDC node.
Definition CD_CdrPlasmaImExSdcStepper.H:278
Real computeDt() override
Compute the next time step based on CFL and adaptive-stepping constraints.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1260
void setupChebyshevNodes(const int a_p)
Build p+1 Chebyshev nodes on [0, 1].
Definition CD_CdrPlasmaImExSdcStepper.cpp:378
Real m_maxCFL
Maximum CFL number allowed during adaptive stepping.
Definition CD_CdrPlasmaImExSdcStepper.H:188
void parseRuntimeOptions() override
Parse runtime-adjustable options from ParmParse.
Definition CD_CdrPlasmaImExSdcStepper.cpp:88
int m_maxRetries
Maximum number of step rejections before accepting regardless.
Definition CD_CdrPlasmaImExSdcStepper.H:147
void computeNewDt(bool &a_accept_step, const Real a_dt, const int a_num_corrections)
Evaluate the PI step-size controller and decide whether to accept or reject the step.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1175
void setupLobattoNodes(const int a_p)
Build p+1 Gauss-Lobatto nodes on [0, 1].
Definition CD_CdrPlasmaImExSdcStepper.cpp:321
Real m_minCFL
Minimum CFL number allowed during adaptive stepping.
Definition CD_CdrPlasmaImExSdcStepper.H:183
void integrateRtStationary()
Advance RTE solvers to the stationary solution.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1898
Real m_errThresh
Error threshold below which a step is accepted.
Definition CD_CdrPlasmaImExSdcStepper.H:193
void reconcileIntegrands()
Compute the combined operator F = F_AR + F_D at all SDC nodes.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1022
bool m_consistentRTE
If true, recompute the RTE solution consistently at each SDC node.
Definition CD_CdrPlasmaImExSdcStepper.H:283
void computeFD0()
Compute the diffusion operator F_D at the first SDC node (t^n) from current solver states.
Definition CD_CdrPlasmaImExSdcStepper.cpp:689
void initializeErrors()
Initialize error storage to zero before beginning correction sweeps.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1096
int m_p
Number of SDC quadrature subintervals. There are p+1 nodes covering [t^n, t^{n+1}].
Definition CD_CdrPlasmaImExSdcStepper.H:152
void parseAdvectionOptions()
Parse advection-related options (half-time extrapolation).
Definition CD_CdrPlasmaImExSdcStepper.cpp:235
void computeCdrVelo(const Real a_time)
Compute CDR drift velocities from the current field in scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1492
Vector< EBAMRCellData * > getCdrErrors()
Return AMR pointers to the CDR error fields for all species.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1928
void parseDiffusionCoupling()
Parse the implicit diffusion coupling method (TGA or Crank-Nicholson).
Definition CD_CdrPlasmaImExSdcStepper.cpp:160
void integrateRtTransient(const Real a_dt)
Advance RTE solvers transiently over a_dt.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1878
void allocateCdrStorage()
Allocate scratch storage for all CDR solvers.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1366
RefCountedPtr< CdrStorage > & getCdrStorage(const CdrIterator< CdrSolver > &a_solverIt)
Return the SDC scratch storage associated with a given CDR solver.
Definition CD_CdrPlasmaImExSdcStepper.cpp:253
Real m_sigmaError
Surface charge error norm from the most recent correction comparison.
Definition CD_CdrPlasmaImExSdcStepper.H:303
void parseNodes()
Parse the quadrature node type (m_whichNodes) and number of subintervals (m_p).
Definition CD_CdrPlasmaImExSdcStepper.cpp:124
int m_minCorr
Minimum number of corrections that must be completed before accepting a step.
Definition CD_CdrPlasmaImExSdcStepper.H:167
Real advance(const Real a_dt) override
Advance equations by one time step using the IMEX-SDC algorithm.
Definition CD_CdrPlasmaImExSdcStepper.cpp:553
void parseOptions() override
Parse all startup options from ParmParse.
Definition CD_CdrPlasmaImExSdcStepper.cpp:57
void updateField()
Solve the Poisson equation using the current CDR solver densities and surface charge.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1846
void adaptiveReport(const Real a_first_dt, const Real a_dt, const Real a_new_dt, const int a_corr, const int a_rej, const Real a_max_err)
Print a diagnostic summary of the adaptive stepping outcome.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1234
bool m_computeV
Debug flag: if false, skip drift velocity updates.
Definition CD_CdrPlasmaImExSdcStepper.H:268
void updateDiffusionCoefficients()
Recompute diffusion coefficients from the current electric field in scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1918
void deallocateInternals() override
Deallocate all internal SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1411
bool m_doRTE
Debug flag: if false, skip the RTE advance.
Definition CD_CdrPlasmaImExSdcStepper.H:258
void computeCdrFluxes(const Real a_time)
Compute CDR boundary fluxes on EB faces from current solver states.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1662
void copySigmaToM0()
Copy current surface charge into the SDC sigma^k storage at node 0.
Definition CD_CdrPlasmaImExSdcStepper.cpp:675
Real m_preError
Error from the previous step, used by the PI controller.
Definition CD_CdrPlasmaImExSdcStepper.H:313
void copyPhiPToCdr()
Copy the SDC phi^k storage at the final node p back into the CDR solvers.
Definition CD_CdrPlasmaImExSdcStepper.cpp:522
bool m_doDiffusion
Debug flag: if false, skip the implicit diffusion integration.
Definition CD_CdrPlasmaImExSdcStepper.H:248
bool m_haveError
True once an error estimate has been computed in the current step.
Definition CD_CdrPlasmaImExSdcStepper.H:233
Real m_extrapDt
Time step used for half-time extrapolation of advection states.
Definition CD_CdrPlasmaImExSdcStepper.H:213
bool m_profileSteps
If true, write per-step SDC profile data to a file.
Definition CD_CdrPlasmaImExSdcStepper.H:293
RefCountedPtr< FieldStorage > m_fieldScratch
Field solver SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.H:137
EBAMRIVData & getSigmaSolverK(const int a_m)
Return the surface charge sigma^k at SDC node m.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1962
bool m_useTGA
If true, use the TGA (Crank-Nicholson/RK2) second-order implicit diffusion scheme.
Definition CD_CdrPlasmaImExSdcStepper.H:238
void quad(EBAMRCellData &a_quad, const Vector< EBAMRCellData > &a_integrand, const int a_m)
Compute the quadrature sum of a_integrand from node 0 to node a_m.
Definition CD_CdrPlasmaImExSdcStepper.cpp:480
void integrateAdvection(const Real a_dt, const int a_m, const bool a_lagged_terms)
Advance CDR species from node m to m+1 using explicit advection only (no diffusion).
Definition CD_CdrPlasmaImExSdcStepper.cpp:904
int m_errorIdx
CDR species index used to drive the adaptive step-size controller.
Definition CD_CdrPlasmaImExSdcStepper.H:173
void parseDebugOptions()
Parse debug flags that toggle individual physics operators.
Definition CD_CdrPlasmaImExSdcStepper.cpp:199
Vector< RefCountedPtr< CdrStorage > > m_cdrScratch
Per-CDR-solver SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.H:127
void allocateRtStorage()
Allocate scratch storage for all RTE solvers.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1389
RefCountedPtr< RtStorage > & getRtStorage(const RtIterator< RtSolver > &a_solverIt)
Return the SDC scratch storage associated with a given RTE solver.
Definition CD_CdrPlasmaImExSdcStepper.cpp:259
void finalizeErrors()
Accumulate the maximum correction norm into m_cdrError and m_sigmaError.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1124
Vector< RefCountedPtr< RtStorage > > m_rteScratch
Per-RTE-solver SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.H:132
void parseAdaptiveOptions()
Parse adaptive time-stepping parameters (thresholds, safety factors, growth limits).
Definition CD_CdrPlasmaImExSdcStepper.cpp:173
Vector< Real > m_tm
Absolute time at each SDC node: m_tm[m] = t^n + m_nodes[m] * dt.
Definition CD_CdrPlasmaImExSdcStepper.H:334
int m_errorNorm
Error norm selector: 0 for L-infinity, 2 for L2.
Definition CD_CdrPlasmaImExSdcStepper.H:162
RefCountedPtr< SigmaStorage > m_sigmaScratch
Surface charge solver SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.H:142
void writeStepProfile(const Real a_dt, const Real a_error, const int a_substeps, const int a_corrections, const int a_rejections)
Write per-step SDC performance data to a profile file.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1972
Vector< Real > m_cdrError
Per-CDR-species error norm from the most recent correction comparison.
Definition CD_CdrPlasmaImExSdcStepper.H:298
void setupUniformNodes(const int a_p)
Build p+1 uniformly spaced nodes on [0, 1].
Definition CD_CdrPlasmaImExSdcStepper.cpp:303
void regridInternals(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Regrid hook for internal storage. No operations are performed.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1336
void integrateDiffusion(const Real a_dt, const int a_m, const bool a_lagged_terms)
Advance CDR species from node m to m+1 using implicit diffusion only.
Definition CD_CdrPlasmaImExSdcStepper.cpp:959
Real m_maxError
Maximum error across all species and surface charge.
Definition CD_CdrPlasmaImExSdcStepper.H:308
Vector< Vector< Real > > m_vandermonde
Vandermonde matrix used to compute the integration weights from the node positions.
Definition CD_CdrPlasmaImExSdcStepper.H:324
void computeElectricFieldIntoScratch()
Compute the electric field from the current field solver state and store in m_fieldScratch.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1441
bool m_adaptiveDt
If true, use the PI controller to adaptively select the time step.
Definition CD_CdrPlasmaImExSdcStepper.H:223
Vector< EBAMRCellData * > getCdrSolversPhiK(const int a_m)
Return the CDR phi^k values at SDC node m.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1945
void setupQuadratureNodes(const int a_p)
Build quadrature nodes of type m_whichNodes with p subintervals.
Definition CD_CdrPlasmaImExSdcStepper.cpp:281
void setupSubintervals(const Real a_time, const Real a_dt)
Map the unit-interval node positions to [a_time, a_time + a_dt] and compute sub-interval widths.
Definition CD_CdrPlasmaImExSdcStepper.cpp:452
void allocateInternals() override
Allocate internal SDC scratch storage.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1347
Real m_safety
Safety factor applied to the step-size controller's growth estimate.
Definition CD_CdrPlasmaImExSdcStepper.H:198
virtual ~CdrPlasmaImExSdcStepper()
Destructor.
Definition CD_CdrPlasmaImExSdcStepper.cpp:48
void computeCdrGradients()
Compute cell-centered gradients of current CDR solver densities.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1463
bool m_doAdvectionSource
Debug flag: if false, skip the advection and reaction integration.
Definition CD_CdrPlasmaImExSdcStepper.H:243
void computeReactionNetwork(const int a_m, const Real a_time, const Real a_dt)
Evaluate the reaction network source terms at SDC node m and store the result.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1828
Real m_newDt
Tentative time step for the next advance call, set by computeNewDt().
Definition CD_CdrPlasmaImExSdcStepper.H:208
void integrateAdvectionReaction(const Real a_dt, const int a_m, const bool a_lagged_terms)
Advance CDR species from node m to m+1 using explicit advection+reaction and implicit diffusion.
Definition CD_CdrPlasmaImExSdcStepper.cpp:806
void allocateSigmaStorage()
Allocate scratch storage for the surface charge solver.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1403
void computeSigmaFlux()
Compute the surface charge boundary flux from current solver states.
Definition CD_CdrPlasmaImExSdcStepper.cpp:1806
bool m_printReport
If true, print a report of the adaptive stepping outcome after each step.
Definition CD_CdrPlasmaImExSdcStepper.H:228
CdrPlasmaImExSdcStepper()=delete
Disallowed default constructor.
Abstract base class for advancing the coupled CDR plasma equations in time.
Definition CD_CdrPlasmaStepper.H:46
Iterator class for RtLayout.
Definition CD_RtIterator.H:25
Namespace containing physics models for use with chombo-discharge.
Definition CD_AdvectionDiffusion.H:16