16#include <Adhoc_JFNK.h>
17#include <Schema_Euler_Semi_Implicite.h>
18#include <Schema_Cahn_Hilliard.h>
19#include <Fermeture_Thermo_base.h>
20#include <Potentiel_Chimique_base.h>
28 os <<
"--------------------------------------------------" << finl;
30 os <<
" -- residual threshold = " <<
tol_ << finl ;
31 os <<
" -- residue min = " <<
tol_min_ << finl;
32 os <<
" -- residue max = " <<
tol_max_ << finl;
33 os <<
" -- number of iterations = " <<
maxit_ << finl;
34 os <<
" -- Krylov space dimension = " <<
nkr_ << finl;
35 os <<
"--------------------------------------------------" << finl;
41 Cerr <<
"Reading parameters of " <<
que_suis_je() <<
" solver ..." << finl;
56 param.lire_avec_accolades_depuis(is);
68 const double delta = 1.e-5;
70 DoubleTrav c_autre_direction(c_theta);
72 c_autre_direction = v0;
73 c_autre_direction *= delta;
74 c_autre_direction += c_theta;
100 Cout <<
" -------- [Adhoc_JFNK] Solving..." << finl;
104 Cerr <<
"[Adhoc_JFNK] Cannot solve any other equation than Cahn_Hilliard yet. Needs to be generalized." << finl;
109 DoubleTrav c_n(inconnue);
110 DoubleTrav c_theta(inconnue);
119 DoubleTrav r(
nkr_ + 1);
120 DoubleTrav v0(c_theta);
121 DoubleTrav v1(c_theta);
131 res = mp_norme_vect(v0);
133 Cout <<
" - At it = " << 0 <<
", residu scalar = " << res << finl;
137 SFichier fichier_residu(
"residu.out", ios::app);
138 fichier_residu << statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time)
149 Cout <<
"Stopping rule scalar : " <<
tol_min_ << finl;
152 for (
int it = 1; it <
maxit_+1; it++)
163 for (
int j = 0; j <
nkr_; j++)
174 for (
int i = 0; i <= j; i++)
177 DoubleTab& vvi = v[i];
178 h(i,j) += mp_prodscal(v0,vvi);
181 for (
int ii = 0; ii < v0.
dimension(0); ii++)
182 for (
int k = 0; k < nb_param; k++)
183 v0(ii, k) -= h(i,j) * vvi(ii, k);
188 double tem = mp_norme_vect(v0);
208 for (
int i = 0; i < nk; i++)
211 double tem = 1. / sqrt(h(i, i) * h(i, i) + h(iplus1, i) * h(iplus1, i));
212 double ccos = h(i, i) * tem;
213 double ssin = -h(iplus1, i) * tem;
214 for (
int j = i; j < nk; j++)
217 h(i, j) = ccos * tem - ssin * h(iplus1,j);
218 h(iplus1, j) = ssin * tem + ccos * h(iplus1,j);
220 r[iplus1] = ssin * r[i];
225 for (
int i = nk - 1; i >= 0; i--)
228 for (
int i0 = i - 1; i0 >= 0; i0--)
229 r[i0] -= h(i0, i) * r[i];
233 for(
int i=0; i<nk; i++)
235 DoubleTrav vvi = v[i];
237 for (
int ii = 0; ii < c_theta.
dimension(0); ii++)
238 for (
int k = 0; k < nb_param; k++)
239 c_theta(ii, k) += r[i] * vvi(ii, k);
248 res=mp_norme_vect(v0);
250 Cout <<
" - At it = " << it <<
", residu scalar = " << res << finl;
252 double temps_exec = statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time);
255 SFichier fichier_residu(
"residu.out", ios::app);
269 Cerr <<
"Stopped before convergence" << finl;
bool iterer_eqn(Equation_base &equation, const DoubleTab &inconnue, DoubleTab &result, double dt, int numero_iteration, int &ok) override
Permet de résoudre l'équation non linéaire H(c) = c_theta - c_n - theta * dt * M^-1 * D * mu_theta = ...
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
DoubleTab jacobian_vect(const DoubleTab &, DoubleTab &, Cahn_Hilliard &)
Construire le jacobien.
void nommer(const Nom &name) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
virtual DoubleTab fonction_residu(const DoubleTab &)
Construit la fonction résidu pour un algorithme de Newton :
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
double temps_courant() const
Renvoie le temps courant.
class Solveur_non_lineaire
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")