TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Sch_CN_iteratif.h
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Sch_CN_iteratif_included
17#define Sch_CN_iteratif_included
18
19#include <Schema_Temps_base.h>
20#include <TRUSTTabs_forward.h>
21
22/*! @brief classe Sch_CN_iteratif Schema en temps alternant un demi-pas de temps d'Euler implicite et un demi-pas de temps de LeapFrog.
23 *
24 * La resolution implicite est iterative (point fixe).
25 * Le pas de temps est calcule comme le produit du pas de temps de stabilite explicite par un facsec.
26 * Le facsec est ajuste automatiquement pour que la resolution converge en un nombre d'iterations predefini.
27 * Les caracteristiques de chaque iteration sont ecrites dans le fichier dt_CN.
28 *
29 * La resolution est gouvernee par 4 parametres (valeurs par defauts entre parentheses) :
30 * * seuil (1e-3) : le seuil de convergence. Plus il est bas, plus la resolution est precise.
31 * * facsec_max (2) : la valeur du facsec que l'on ne veut pas depasser (eviter les instabilites et capter les phenomenes physiques)
32 * * niter_min (2) : le nombre minimum d'iterations. En deca, on continue a iterer meme si on semble avoir atteint la convergence.
33 * * niter_avg (3) : le nombre d'iterations que l'on souhaite faire pour arriver a convergence.
34 * * niter_max (6) : le nombre d'iteration au-dela duquel on reessaye avec un facsec plus petit.
35 *
36 * Conseil pour le choix des parametres d'ajustement du facsec :
37 * * Choisir seuil en fonction de la precision desiree.
38 * * Choisir niter_min : 2 garantit un schema d'ordre 2 en temps.
39 * * Si on cherche un stationnaire, choisir seuil_statio >= seuil.
40 * * Choisir facsec_max en fonction des phenomenes physiques a capter.
41 * * Commencer par tester avec une grande valeur de niter_avg. Observer le comportement du nombre d'iterations.
42 * Il bute sur une valeur maximum avant de retomber.
43 * * Choisir niter_avg aux 2/3 de cette valeur maximum, et niter_max aux 4/3 ou au double environ.
44 *
45 *
46 * @sa Schema_Temps_base
47 */
49{
50 Declare_instanciable(Sch_CN_iteratif);
51
52public :
53
54 ////////////////////////////////
55 // //
56 // Caracteristiques du schema //
57 // //
58 ////////////////////////////////
59
60 int nb_valeurs_temporelles() const override;
61 int nb_valeurs_futures() const override;
62 double temps_futur(int i) const override;
63 double temps_defaut() const override;
64
65 /////////////////////////////////////////
66 // //
67 // Fin des caracteristiques du schema //
68 // //
69 /////////////////////////////////////////
70
71 bool initTimeStep(double dt) override;
72 bool iterateTimeStep(bool& converged) override;
73
75
76 void completer() override {}
77 void set_param(Param& titi) const override;
78
79protected :
80
82
83 virtual bool convergence(const DoubleTab& u0, const DoubleTab& up1, const DoubleTab& delta, int p) const;
84 virtual bool divergence(const DoubleTab& u0, const DoubleTab& up1, const DoubleTab& delta, int p) const;
85 virtual void ajuster_facsec(type_convergence cv);
86
87 virtual bool iterateTimeStepOnEquation(int i,bool& converged);
88
89 double seuil=1.e-3; // To determine convergence
90 int niter_min=2; // Minimum number of iterations (before, continue to iterate)
91 int niter_max=6; // Maximum number of iterations (after, considered as not convergent)
92 int niter_avg=3; // Average number of iterations wanted (facsec adjusted to fit that number)
93 double facsec_max=2; // Maximum facsec (not to miss the physics)
94
95 // Used internally.
96 int iteration = -1; // Number of iterations done for the current time step.
97 double last_facsec = -100.; // facsec at the beginning of time step resolution,
98 // to avoid changing facsec several times for the same time step.
99};
100
101#endif
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
classe Sch_CN_iteratif Schema en temps alternant un demi-pas de temps d'Euler implicite et un demi-pa...
virtual bool iterateTimeStepOnEquation(int i, bool &converged)
Calcule une iteration de la resolution sur l'equation i.
bool initTimeStep(double dt) override
int faire_un_pas_de_temps_eqn_base(Equation_base &) override
virtual bool divergence(const DoubleTab &u0, const DoubleTab &up1, const DoubleTab &delta, int p) const
Indique si le calcul iteratif a diverge.
bool iterateTimeStep(bool &converged) override
Calculate the U(n+1) unknown for each equation (if solved) of the problem with the selected time sche...
virtual bool convergence(const DoubleTab &u0, const DoubleTab &up1, const DoubleTab &delta, int p) const
Indique si le calcul iteratif a converge.
int nb_valeurs_futures() const override
Renvoie le nombre de valeurs temporelles futures.
void set_param(Param &titi) const override
int nb_valeurs_temporelles() const override
Renvoie le nombre de valeurs temporelles a conserver.
double temps_futur(int i) const override
Renvoie le le temps a la i-eme valeur future.
double temps_defaut() const override
Renvoie le temps que doivent utiliser les champs a l'appel de valeurs().
void completer() override
virtual void ajuster_facsec(type_convergence cv)
class Schema_Temps_base