BELFEM 0.9.3
Berkeley Lab Finite Element Framework
Loading...
Searching...
No Matches
cl_FEM_Controller.hpp
Go to the documentation of this file.
1/*
2 * BELFEM -- The Berkeley Lab Finite Element Framework
3 * Copyright (c) 2026, The Regents of the University of California,
4 * through Lawrence Berkeley National Laboratory (subject to receipt of any required
5 * approvals from the U.S. Dept. of Energy). All rights reserved.
6 *
7 * Developers: Christian Messe, Gregory Giard
8 *
9 * See the top-level LICENSE file for the complete license and disclaimer.
10 */
11#ifndef CL_FEM_CONTROLLER_HPP
12#define CL_FEM_CONTROLLER_HPP
14#include "typedefs.hpp"
15#include "cl_Timer.hpp"
16#include "cl_Input_Section.hpp"
17#include "cl_Circuit.hpp"
19#include "cl_FEM_Kernel.hpp"
20#include "cl_ShiftRegister.hpp"
21
22namespace belfem
23{
24 class Mesh ;
25
26 namespace fem
27 {
28 class Kernel ;
29 class IWG_Timestep ;
30
38 {
39 const proc_t mCommRank ;
40 const proc_t mCommSize ;
41 Kernel * mKernel = nullptr ;
42 IWG_Timestep * mEquation = nullptr ;
43 Mesh * mMesh = nullptr ;
44 Kernel * mKernel2 = nullptr ;
45 IWG_Timestep * mEquation2 = nullptr ;
46 Mesh * mMesh2 = nullptr ;
47 Circuit * mCircuit = nullptr ;
48
49 real mTime = 0.0 ;
50 real mDeltaTime = BELFEM_QUIET_NAN ;
51 real mDeltaTimeTemporary = BELFEM_QUIET_NAN ; //Temporary time step to reach the time steps to be saved
52 real mDeltaTime0 = BELFEM_QUIET_NAN ;
53
64 real mDeltaTimeInitial = BELFEM_QUIET_NAN ;
65 uint mRunningTimeStep = 0 ;
66 uint mMeshTimeStep = 1 ;
67
68 real mTime2 = 0.0 ;
69 real mDeltaTime2 = BELFEM_QUIET_NAN ;
70 real mDeltaTimeTemporary2 = BELFEM_QUIET_NAN ; //Temporary time step to reach the time steps to be saved
71
72 // - - - - - - begin user settings - - - - - -
73
74 real mAlpha = 0.5 ;
75 real mBeta = 1.1 ;
76 real mGamma = 0.4 ;
77
78 uint mMinNumIterations = 2 ;
79 uint mMaxNumIterations = 100 ;
80 uint mIterationTarget = 20 ;
81
89 uint mDivergenceStrikes = 0 ;
90
91 // stagnation guard: if the mean absolute deviation of the last
92 // mStallWindow residuals (in dB) stays below mStallBand while the
93 // residual is still above tolerance, the timestep is cut instead of
94 // grinding on to mMaxNumIterations (see iterate_coupled).
95 // The band must sit ABOVE the noise of a floored residual, or the
96 // Newton->Picard demotion this guard exists for never fires: the
97 // sidecoatings floor wandered +-0.05..0.2 dB against the old
98 // 0.001 dB band and burned the full watchdog window instead.
99 // Genuine convergence moves >= O(1) dB per iterate, so 0.2 dB
100 // separates the two regimes. Deck override: "stall tolerance"
101 uint mStallWindow = 5 ;
102 real mStallBand = 0.2 ; // dB
103
104 // progress watchdog: cut the timestep when the residual has not
105 // reached a NEW MINIMUM for this many iterations while still above
106 // 10x tolerance. Catches what the flat-band guard cannot see:
107 // omega-sawtooth limit cycles ( locally "converging" on any short
108 // window ) and slow monotone creep of the thermal residual at the
109 // relaxation floor. 0 disables. Input key: "watchdog window".
110 uint mWatchdogWindow = 30 ;
111 uint mWatchdogWindow2 = 30 ;
112
119 real mWatchdogOmegaPrev = BELFEM_QUIET_NAN ;
120 real mWatchdogOmegaPrev2 = BELFEM_QUIET_NAN ;
121
122 uint mMinNumIterations2 = 2 ;
123 uint mMaxNumIterations2 = 100 ;
124 uint mIterationTarget2 = 20 ;
125
126 uint mMaxNumIterationsDiv = 10 ; //Number of diverging iterations before resetting the relaxation
127 uint mNumIterationsDiv = 0; //Number of diverging iterations
128 // conditioning diagnostic, per field. It describes a property of
129 // ONE solve, and the two fields configure their solvers
130 // separately ( "linear magnetic" / "linear thermal", falling back
131 // to "linear" ), so the flag lives with them.
132 // "compute conditioning" in the solver section still sets both.
133 //
134 // These gate the EIGENVALUE estimate and nothing else. The MUMPS
135 // Arioli/Demmel/Duff numbers have their own flag below -- the two
136 // diagnostics are independent, and either may be asked for alone
137 bool mComputeConditioning = false ; // magnetic; always costs ARPACK
138 bool mComputeConditioning2 = false ; // thermal
139
140 // "mumps error analysis", per field, read from the same three
141 // places as the flag above. Gates MUMPS ICNTL(11) ONLY -- the
142 // COND1 / COND2 / omega2 triple that feeds the "MUMPS ADD" footer
143 // rows. A no-op on any other library, which is why the key names
144 // MUMPS: see the warnings raised for a field that asks for it
145 // without one
146 bool mMumpsErrorAnalysis = false ; // magnetic
147 bool mMumpsErrorAnalysis2 = false ; // thermal
148
149 // guards check_thermal_diagnostics() against warning twice: both
150 // attach paths call it, and a caller can use both
151 bool mThermalDiagnosticsChecked = false ;
152
153 // whether set_params has run. The thermal diagnostics must not be
154 // judged against the DEFAULT flags, so their check requires both
155 // prerequisites -- parsed params AND an attached kernel -- and
156 // runs from whichever call arrives second, in any order
157 bool mParamsSet = false ;
158
167 real mOmegaNoiseBand = 0.05 ;
168
169 // MIT-3a: consecutive first-trial Newton steps that at least
170 // halved the residual. The geometric omega recovery
171 // ( tGrowth = 2.0 ) requires TWO of them, because a single
172 // qualifying step is not evidence of contraction near a noise
173 // floor -- on tapestack3d the doubling fired once ( omega
174 // 0.483 -> 0.966 ) and regressed on the very next iterate.
175 // SCOPE: this addresses the x2 rule ONLY; a later loss in the
176 // same trace came from ordinary arctan growth and is NOT fixed
177 // here. A healthily
178 // contracting Newton earns the streak on its second step and
179 // keeps the acceleration; a lucky step never does.
180 //
181 // Reset on: timestep start ( both drivers ), reject,
182 // promotion, escalation, and every demotion ON THE COUPLED
183 // PATH -- the evidence belongs to one uninterrupted Newton
184 // run, not to the timestep. NOTE this is NOT simply
185 // "wherever mFirstFlip is reset": iterate_magnetic's
186 // promotion clears mFirstFlip without touching the streak.
187 // That twin never increments and never consumes the streak
188 // ( it has no x2 rule ), and initialize_magnetic zeroes at
189 // every step start, so the omission is inert -- but do not
190 // rely on the mFirstFlip locator when adding a path
191 uint mNewtonTrustStreak = 0 ;
192
193 real mEpsilonSwitch = 1e-4 ; // residual at which Picard hands off to Newton (Messe et al. 2023, Eq. 13)
194 real mRelativeEpsilonTarget = 1e-6 ; // relative error criterion
199 real mAbsoluteEpsilonTarget = 0.0 ;
200
201 real mEpsilonSwitch2 = 1e-3 ; // thermal residual at which Picard hands off to Newton
202 real mRelativeEpsilonTarget2 = 1e-6 ; // relative thermal error criterion
203 real mAbsoluteEpsilonTarget2 = 0.0 ; // absolute thermal error criterion ( see above: opt-in )
204
211 real mThermalUpdateGate = BELFEM_REAL_MAX ;
212
217 bool mThermalFrozen = false ;
218
219 real mSimulationTime = BELFEM_REAL_MAX ;
220 bool mAdaptTimestep = true ;
221 real mSaveEvery = 0.0 ;
222 bool mLastSave = false ;
223 bool mSave = true ;
224
225 // - - - - - - end user settings - - - - - -
226
227 real mOmegaNewton = 1.0 ;
228 real mOmegaPicard = 1.0 ;
229 real mOmegaNewton2 = 1.0 ;
230 real mOmegaPicard2 = 1.0 ;
231 bool mJustPicard = false ;
232 bool mJustPicard2 = false ;
233
236 uint mThermalFlipCount = 0 ;
237
242 uint mAndersonDepth = 0 ;
243 uint mAndersonDepth2 = 0 ;
244
250 uint mAndersonCommits = 0 ;
251 uint mAndersonCommits2 = 0 ;
252
253 // Picard-breakdown rescue ( see try_escalate_to_newton ). When the magnetic
254 // Picard iteration diverges at a residual far above mEpsilonSwitch -- so the
255 // normal Picard->Newton promotion never fires -- the controller escalates to
256 // the configured Newton tangent once before cutting the timestep. mForceNewton
257 // pins the solver to Newton for the rest of the attempt; mNewtonEscalated caps
258 // the escalation at one per timestep attempt so it cannot ping-pong.
259 bool mForceNewton = false ;
260 bool mNewtonEscalated = false ;
261
262 // Thermal twin of the pair above ( see try_escalate_thermal_to_newton,
263 // ). The thermal Picard residual can floor bit-flat ABOVE
264 // mEpsilonSwitch2, and since the coupled Picard->Newton promotion fires
265 // only below the switch, Newton is gated behind progress that only
266 // Newton can make. Same lifecycle as the magnetic pair: cleared in
267 // initialize_timestep / initialize_thermal, at most one escalation
268 // per timestep attempt.
269 bool mForceNewton2 = false ;
270 bool mNewtonEscalated2 = false ;
271
273 SolverAlgorithm mAlgorithmThermal = SolverAlgorithm::Picard ;
277
278 real mOmega0 = BELFEM_QUIET_NAN ;
279
280 real mOmegaMin = 0.001 ;
281 real mOmegaMax = 1.0 ;
282 real mOmegaMin2 = 0.1 ;
283 real mOmegaMax2 = 1.0 ;
284
285 real mTime0 = 0.0 ;
286 real mTime02 = 0.0 ;
287 Timer * mTimer = nullptr ;
288
289 real mEpsilon = BELFEM_REAL_MAX ;
290 real mEpsilon0 = BELFEM_REAL_MAX ;
291
292 real mEpsilon2 = BELFEM_REAL_MAX ;
293 real mEpsilon20 = BELFEM_REAL_MAX ;
294
298 real mEpsilonAbs2 = BELFEM_REAL_MAX ;
299
305 real mEpsilonAbs = BELFEM_REAL_MAX ;
306
313 uint mThermalFlatCount = 0 ;
314 bool mThermalStalled = false ;
315
322 bool mMagneticHitTarget = false ;
323
329 bool mMagBodyRanLastTrip = true ;
330
331 bool mTripExit = false ;
332
335 real mBestEpsilon = BELFEM_REAL_MAX ;
336 real mBestEpsilon2 = BELFEM_REAL_MAX ;
337 uint mBestEpsilonIteration = 0 ;
338 uint mBestEpsilonIteration2 = 0 ;
339
344 uint mSolverFailCount = 0 ;
345
350 bool mUseLegacyTimestepControl = false ;
351
358 real mCtrlKp = 0.15 ;
359 real mCtrlKi = 0.30 ;
360 real mCtrlKd = 0.0 ;
361
366 real mCtrlErr0 = 1.0 ;
367 real mCtrlErr1 = 1.0 ;
368 real mCtrlErr2 = 1.0 ;
369
376 uint mPostFailureHold = 0 ;
377 uint mPostFailureHoldSteps = 2 ;
378
384 uint mFloorRetries = 0 ;
385 uint mFloorEscalationCap = 4 ;
386
394 uint mMaxFloorRetries = 20 ;
395
399 enum class ResetReason
400 {
401 Stall, // magnetic stagnation guard
402 Watchdog, // magnetic or thermal progress watchdog
403 Budget, // iteration budget, divergence rule, or a NaN body residual
404 LineSearch, // Newton line search cut
405 SolverFailure, // linear solver reported a failure
406 NaN, // a head residual is NaN
407 Circuit // the circuit solve failed
408 };
409
415 bool mStallSuspended = false ;
416
419 uint mMaxNumIterationsDeck = 100 ;
420 uint mMaxNumIterations2Deck = 100 ;
421 uint mWatchdogWindowDeck = 30 ;
422 uint mWatchdogWindow2Deck = 30 ;
423
429 bool mAllowRestart = true ;
430
432 uint mIteration = 0 ;
433 uint mIteration2 = 0 ;
434 uint mIterationTime = 0 ;
435 uint mIteration0 = 0 ;
436 uint mIteration02 = 0 ;
437 uint mEigenAnalysisTime = 0 ;
438 uint mPostprocesingTime = 0 ;
439
451
455 // slot 0 : the eigen estimate ( spectral ratio, or kappa_2 when
456 // the symmetric driver earned the name )
457 // slot 1 : MUMPS ADD COND1
458 // slot 2 : MUMPS ADD COND2
459 // slot 3 : MUMPS omega2 -- NOT reported, it is the discriminator
460 // that says whether slot 2 is a measurement at all
463
464 real mDeltaTimeMax = BELFEM_REAL_MAX ;
465 real mDeltaTimeMin = 1e-10 ;
466 bool mReset = false ;
467 bool mResetThermal = false ;
468 bool mFirstFlip = false ;
469 bool mFirstFlip2 = false ;
470
471 bool mIsFullyCoupled = true ;
472 real mCouplingFactor = 1 ; //Number of thermal time steps within each magnetic time steps
473
474
475 Cell < PhysicalBoundaryCondition * > mCircuitCurrentBCs ;
476 Cell < PhysicalBoundaryCondition * > mCircuitVoltageBCs ;
477
478 Vector< real > mLHS ;
479 Vector< real > mLHS0 ;
480 bool mFirstIVSave = true ;
481
484 Cell< string > mIVNamesI ;
485 Cell< string > mIVNamesU ;
486
487 // ring buffer of the last mStallWindow residuals (in dB)
488 ShiftRegister< real > mResidualHistory ;
489
490 Cell< Vector< real > > mBackupFields ;
491 Vector< real > mBackupDofValues ;
492
494 real mLastJJcMax = 0. ;
495
500 bool mBoxSectionOpen = false ;
501
506 bool mPostProcessed = false ;
507
508 public:
509
510 Controller( Kernel * aKernel, Kernel * aKernel2 = nullptr ) ;
511
512 ~Controller();
513
514 void
516
517 void
519
520 void
522
523//------------------------------------------------------------------------------
524
528 void
530
531 void
533
534 void
536
537 bool
539
540 void
541 finalize( const bool aPostProcess = true );
542
543 const real &
544 time() const;
545
546 const real &
547 time_thermal() const;
548
549 real
550 epsilon() const ;
551
552 uint
553 iteration() const ;
554
555
556 bool
557 is_fullycoupled() const ;
558
559 bool
560 reset() const ;
561
562 void
563 save( const std::string & aFilename );
564
565 void
566 save_IV( const std::string & aFilename );
567
573 void
575
576 void
577 set_params( const input::Section * aSection );
578
579 void
580 set_thermal_kernel( Kernel * aKernel );
581
582 real
583 simulation_time() const ;
584
585 bool
586 save() const ;
587
588 void
589 set_circuit( Circuit * aCircuit );
590
591 Circuit *
592 circuit() ;
593
594 Kernel *
595 kernel() ;
596
597 Kernel *
599
600 void
601 save_memdump( const string & aPath );
602
603 void
604 load_memdump( const string & aPath );
605
607 euler_method() const ;
608
609
610 private:
611
612 // imposes the voltage/current boundary conditions on the RHS ( rank 0 only,
613 // after assembly and before the solve ); shared by the magnetic iterate paths
617
618 void
619 iterate_coupled();
620
621 void
622 iterate_magnetic();
623
624 void
625 iterate_thermal();
626
627 void
628 impose_voltage_bcs();
629
630 // env-gated diagnostic dump of the assembled system, shared by both
631 // iterate paths; off unless BELFEM_DUMP_SYSTEM is set.
632 // aTag names the field in the file name, and aCount is that field's
633 // OWN budget -- one shared counter let whichever field assembled
634 // first spend all four dumps and starve the other
635 void
636 dump_system_if_requested( DofManager * aDofMgr,
637 const char * aTag,
638 int & aCount );
639
643 int mDumpCountMagnetic = 0 ;
644 int mDumpCountThermal = 0 ;
645
646
647 // magnetic stagnation guard: if the residual window is flat ( deviation below
648 // mStallBand ), Newton falls back to Picard internally; returns true only when
649 // Picard itself has stalled, signalling the caller to reset_timestep()
650 bool
651 magnetic_stagnation_forces_reset();
652
653 // progress watchdogs ( see mWatchdogWindow ): update the best-residual
654 // tracker and return true when the attempt has made no new minimum for
655 // the configured window while still far from tolerance -- UNLESS the
656 // field's relaxation grew since the previous call, which marks a line
657 // search recovering from an overshoot rather than a stall. It still
658 // fires when omega remains pinned. It spares the recovery from a
659 // cascading timestep cut.
660 //
661 // aOmega must be the relaxation that PRODUCED the current residual --
662 // the caller's post-line-search tOmega / tOmega2 -- never re-derived
663 // from the live algorithm, which a same-call escalation or a
664 // stagnation demotion may already have flipped or mutated.
665 bool
666 watchdog_magnetic( const real aOmega );
667
668 bool
669 watchdog_thermal( const real aOmega );
670
671 // Anderson bookkeeping ( plan §3.2 ): SolverData stages the pair,
672 // the controller decides its fate. Helpers keep the commit
673 // counters and the per-kernel SolverData in sync; all are cheap
674 // no-ops while the respective depth is 0.
675 void anderson_commit_magnetic();
676 void anderson_discard_magnetic();
677 void anderson_clear_magnetic();
678 void anderson_commit_thermal();
679 void anderson_clear_thermal();
680
681 // Picard-breakdown rescue: if the configured terminal algorithm is Newton and
682 // the magnetic Picard iteration has broken down ( residual stuck far above
683 // mEpsilonSwitch, so the normal promotion never fires ), switch to the Newton
684 // tangent for the rest of this timestep attempt instead of cutting Δt. Returns
685 // true if it escalated ( caller keeps iterating ), false otherwise ( caller
686 // resets ). Escalates at most once per attempt, guarded by mNewtonEscalated.
687 bool
688 try_escalate_to_newton();
689
690 // Thermal twin: called from the coupled stagnation
691 // detector when the thermal Picard residual sits bit-flat above
692 // mEpsilonSwitch2 with Newton configured but not running. Returns
693 // true if it escalated. At most once per attempt ( mNewtonEscalated2 ).
694 bool
695 try_escalate_thermal_to_newton();
696
697 void
698 reset_timestep( const ResetReason aReason );
699
700 void
701 reset_thermal();
702
703 void
704 adjust_timestep();
705
706 void
707 compute_circuit_current() ;
708
709 void
710 compute_conditioning();
711
712 // MUMPS computes its condition estimate during the SOLVE, so the
713 // error analysis is armed for exactly ONE solve per timestep --
714 // the first iterate -- and disarmed as soon as the value is read.
715 // Leaving it armed for the whole step would pay for the analysis
716 // on every solve in every iteration but read only one value.
717 // The first iterate is also the better sample: it is assembled at
718 // the converged previous step, so kappa is measured at a
719 // comparable state in every timestep and the series is a trend.
720 // All four are no-ops unless that FIELD's error-analysis flag is
721 // set ( mMumpsErrorAnalysis / mMumpsErrorAnalysis2 -- NOT the
722 // eigen flags, which gate a different diagnostic ) and its own
723 // solver is MUMPS. They run on EVERY rank, unguarded:
724 // the ICNTL setting must match across the communicator, and the
725 // branch is taken identically everywhere
726 void
727 arm_conditioning_magnetic();
728
729 void
730 arm_conditioning_thermal();
731
732 void
733 capture_conditioning_magnetic();
734
735 void
736 capture_conditioning_thermal();
737
742 void
743 setup_thermal_eigen();
744
750 void
751 check_magnetic_diagnostics();
752
754 void
755 check_thermal_diagnostics();
756
757//-----------------------------------------------------------------------------
758
775 void
776 check_iterative_solver_headroom(
777 DofManager * aDofMgr,
778 const real aNonlinTol,
779 const char * aFieldName ) const ;
780
781//-----------------------------------------------------------------------------
782
793 void
794 check_compression_headroom(
795 DofManager * aDofMgr,
796 const real aNonlinTol,
797 const char * aFieldName ) const ;
798
799//-----------------------------------------------------------------------------
800
808 void
809 synchronize_history_fields(
810 IWG_Timestep * aEquation,
811 DofManager * aDofMgr,
812 const uint aStepCount,
813 const string & aPath,
814 const char * aEquationName );
815
816 void
817 print_header();
818
823 void
824 print_line_magnetic( const real aEpsilon, const real aOmega );
825
826 void
827 print_line_thermal( const real aEpsilon, const real aOmega );
828
829 void
830 print_footer();
831
835 void
836 print_thermal_stall_warning();
837
838 real
839 get_Tmax();
840
841 real
842 get_Imax();
843
851 string
852 excitation_cell();
853
854 real
855 get_JJCmax();
856
857 void
858 print_physics_stats();
859
860 void
861 reset_dotQ();
862
863 void
864 collect_dotQ();
865
866 };
867
868 inline
869 Circuit *
871 {
872 return mCircuit;
873 }
874
875 inline
876 Kernel *
878 {
879 return mKernel;
880 }
881
882 inline
883 Kernel *
885 {
886 return mKernel2;
887 }
888
889 inline
892 {
893 return mTimeStepping;
894 }
895
896 }
897}
898
899#endif //CL_FEM_CONTROLLER_HPP
Definition cl_Circuit.hpp:20
Top-level container for all mesh entities.
Definition cl_Mesh.hpp:60
High-resolution wall-clock timing.
Definition cl_Timer.hpp:28
void create_iv_names()
names the I/U pair of every abstract dof: after the deck label of the terminal condition that drives ...
Definition cl_FEM_Controller.cpp:4028
void solve_thermal()
Definition cl_FEM_Controller.cpp:2037
EulerMethod euler_method() const
Definition cl_FEM_Controller.hpp:891
void set_circuit(Circuit *aCircuit)
Definition cl_FEM_Controller.cpp:5060
Kernel * thermal_kernel()
Definition cl_FEM_Controller.hpp:884
const real & time() const
Definition cl_FEM_Controller.cpp:143
bool is_fullycoupled() const
Definition cl_FEM_Controller.cpp:3986
void save_IV(const std::string &aFilename)
Definition cl_FEM_Controller.cpp:4119
void save(const std::string &aFilename)
Definition cl_FEM_Controller.cpp:3998
void solve_magnetic()
Definition cl_FEM_Controller.cpp:2016
bool reset() const
Definition cl_FEM_Controller.cpp:3992
Controller(Kernel *aKernel, Kernel *aKernel2=nullptr)
Definition cl_FEM_Controller.cpp:76
const real & time_thermal() const
Definition cl_FEM_Controller.cpp:149
real simulation_time() const
Definition cl_FEM_Controller.cpp:5030
void initialize_magnetic()
Definition cl_FEM_Controller.cpp:320
void set_params(const input::Section *aSection)
Definition cl_FEM_Controller.cpp:4226
void save_memdump(const string &aPath)
Definition cl_FEM_Controller.cpp:5156
void set_thermal_kernel(Kernel *aKernel)
Definition cl_FEM_Controller.cpp:4967
void initialize_thermal()
Definition cl_FEM_Controller.cpp:422
bool solve_circuit()
Definition cl_FEM_Controller.cpp:2523
Kernel * kernel()
Definition cl_FEM_Controller.hpp:877
real epsilon() const
Definition cl_FEM_Controller.cpp:155
uint iteration() const
Definition cl_FEM_Controller.cpp:161
void initialize_timestep()
Definition cl_FEM_Controller.cpp:167
Circuit * circuit()
Definition cl_FEM_Controller.hpp:870
void load_memdump(const string &aPath)
Definition cl_FEM_Controller.cpp:5245
void finalize(const bool aPostProcess=true)
Definition cl_FEM_Controller.cpp:3028
void solve_coupled()
Definition cl_FEM_Controller.cpp:950
Main workhorse: DOF management, assembly coordination and the solver interface.
Definition cl_FEM_DofManager.hpp:52
Base class for transient problems.
Definition cl_IWG_Timestep.hpp:33
Top-level orchestrator.
Definition cl_FEM_Kernel.hpp:56
One hierarchical section of a configuration file.
Definition cl_Input_Section.hpp:34
Definition cl_IFB_LINE3.hpp:21
SolverAlgorithm
Definition en_FEM_SolverAlgorithm.hpp:20
@ Picard
Definition en_FEM_SolverAlgorithm.hpp:23
USER GUIDES:
Definition cl_Capacitor.cpp:16
EulerMethod
Definition en_SolverEnums.hpp:47
@ BackwardDifference1
Definition en_SolverEnums.hpp:52
unsigned int uint
Definition typedefs.hpp:30
int proc_t
Definition commtypes.hpp:29
double real
Definition typedefs.hpp:36
#define BELFEM_REAL_MAX
Definition typedefs.hpp:80
#define BELFEM_QUIET_NAN
Definition typedefs.hpp:86