16#include <Convection_Diffusion_Phase_field.h>
17#include <Source_Con_Phase_field_Binaire.h>
18#include <Source_Qdm_VDF_Phase_field.h>
19#include <Navier_Stokes_phase_field.h>
20#include <Source_Con_Phase_field.h>
21#include <Check_espace_virtuel.h>
22#include <MD_Vector_composite.h>
23#include <Milieu_Phase_field.h>
24#include <Champ_Fonc_Tabule.h>
25#include <Domaine_Cl_VDF.h>
26#include <TRUSTTab_parts.h>
27#include <Champ_Uniforme.h>
28#include <Equation_base.h>
29#include <Probleme_base.h>
30#include <Matrix_tools.h>
31#include <Domaine_VDF.h>
32#include <Milieu_base.h>
33#include <SolveurSys.h>
41#include <Perf_counters.h>
56 Cerr <<
"Source_Con_Phase_field_Binaire::readOn" << finl;
60 SFichier fichier_residu(
"residu.txt");
61 fichier_residu <<
"# SAUVEGARDE DU RESIDU #" << finl;
62 fichier_residu <<
"# Time \t Time simu \t Residu" << finl;
64 SFichier fichier_eval(
"eval.txt");
65 fichier_eval <<
"# Time simu \t Number eval FormFunctionOld" << finl;
81 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
82 if (prov_face.
size() == 0)
106 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
107 const IntTab& face_voisins = domaine_VDF.
face_voisins();
108 const DoubleVect& volumes = domaine_VDF.
volumes();
110 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
111 if (prov_face.
size() == 0)
121 int nbfaces = domaine_VDF.
nb_faces();
123 double kappa_face, vol0, vol1;
125 for (
int fac = ndeb; fac < nbfaces; fac++)
127 el0 = face_voisins(fac, 0);
128 el1 = face_voisins(fac, 1);
131 kappa_face = (vol0 * kappa_var(el0) + vol1 * kappa_var(el1)) / (vol0 + vol1);
134 prov_face(fac) = kappa_face * prov_face(fac);
160 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
161 if (prov_face.
size() == 0)
168 prov_face *= fermeture.get_alpha();
171 opdiv.
calculer(prov_face, div_alpha_gradC);
190 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
191 const IntTab& face_voisins = domaine_VDF.
face_voisins();
192 const DoubleVect& volumes = domaine_VDF.
volumes();
194 const int nbfaces = domaine_VDF.
nb_faces();
198 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
199 if (prov_face.
size() == 0)
211 prov_face *= fermeture.get_alpha() *
rho0_;
214 for (
int fac = ndeb; fac < nbfaces; fac++)
216 el0 = face_voisins(fac, 0);
217 el1 = face_voisins(fac, 1);
221 rho_face = (vol0 * rhoPF(el0) + vol1 * rhoPF(el1)) / (vol0 + vol1);
222 prov_face(fac) *= fermeture.get_alpha() * rho_face;
227 opdiv.
calculer(prov_face, div_alpha_rho_gradC);
237 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
310 Cout <<
"C à la sortie de JFNK = " << c_demi << finl;
311 Cout <<
"mutilde à la sortie de JFNK = " << mutilde_demi << finl;
313 Cout <<
"C^n = " << c << finl;
314 Cout <<
"mutilde^n = " << mutilde << finl;
316 const double theta = 0.6;
319 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
325 c_demi(n_elem) -= (1 - theta) * c(n_elem);
326 c_demi(n_elem) /= theta;
338 mutilde_demi(n_elem) -= (1 - theta) * mutilde(n_elem);
339 mutilde_demi(n_elem) /= theta;
342 Cout <<
" -------------------------------------- " << finl;
343 Cout <<
"C^n+1 = " << c_demi << finl;
344 Cout <<
"mutilde^n+1 = " << mutilde_demi << finl;
363 mutilde = mutilde_demi;
380 if (prov_elem.
size() == 0)
385 DoubleTab kappa_var(prov_elem);
387 for (
int ikappa = 0; ikappa < nb_elem; ikappa++)
413 Cerr <<
"Type de schema errone !!" << finl;
423 const int nb_elem = le_dom_VDF_->nb_elem_tot();
432 ch_kappa_ou_alpha_->
nommer(
"ch_kappa_ou_alpha");
442 Cerr <<
"------------ INITIALISER MATRICE ---------------" << finl;
448 for (
int i = 0; i < 2; i++)
449 for (
int j = 0; j < 2; j++)
456 Stencil stencil(0, 2);
458 for (
int e = 0; e < nb_elem; e++)
464 for (
int e = 0; e < nb_elem; e++)
471 ch_kappa_ou_alpha_->valeurs() = -fermeture.get_alpha();
476 const DoubleVect& vol = le_dom_VDF_->volumes();
477 tab_divide_any_shape(ch_kappa_ou_alpha_->valeurs(), vol);
495 Cout <<
"MATRICE BLOCS =========== " << finl;
506 const int nb_elem = le_dom_VDF_->nb_elem_tot();
508 if (fermeture.get_kappa_ind() == 0)
512 for (
int elem = 0; elem < nb_elem; elem++)
513 kappa_tab_(elem) = fermeture.call_kappa_func_c(donne(elem));
530 const double theta = 0.6;
533 ch_kappa_ou_alpha_->valeurs() *= (theta * dt);
534 const DoubleVect& vol = le_dom_VDF_->volumes();
535 tab_divide_any_shape(ch_kappa_ou_alpha_->valeurs(), vol);
554 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
555 const IntTab& face_voisins = domaine_VDF.
face_voisins();
556 const IntTab& elem_faces = domaine_VDF.
elem_faces();
557 const DoubleTab& positions = domaine_VDF.
xp();
570 int nb_faces_au_bord;
573 double dvarkeep = 0.;
575 double valeur_diag = 0.;
576 const double theta = 0.6;
577 double kappa_interpolee = 0.;
581 Cout <<
"Explicit mobility: Building matrix A used in JFNK..." << finl;
595 DoubleTab kappa_var(c);
597 if (fermeture.get_kappa_ind() == 0)
598 kappa_var = fermeture.get_kappa();
601 for (
int elem = 0; elem < nb_elem; elem++)
602 kappa_var(elem) = fermeture.call_kappa_func_c(c(elem));
605 dimensionnement = (2 * nb_compo_ + 1) * nb_elem;
607 for (
int elem = 0; elem < nb_elem; elem++)
609 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
611 f0 = elem_faces(elem, ncomp);
612 voisin = face_voisins(f0, 0);
613 if (face_voisins(f0, 0) == elem)
614 voisin = face_voisins(f0, 1);
621 dimensionnement += nb_elem;
622 dimensionnement *= 2;
632 for (
int elem = 0; elem < nb_elem; elem++)
636 nb_faces_au_bord = 0;
643 tab1(compt1) = compt2;
647 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
649 f0 = elem_faces(elem, ncomp);
650 voisin = face_voisins(f0, 0);
651 if (face_voisins(f0, 0) == elem)
652 voisin = face_voisins(f0, 1);
660 for (
int ncomp = 0; ncomp < 2 * nb_compo_ - nb_faces_au_bord; ncomp++)
663 min_tri = nb_elem + 1;
666 for (
int ncomp_tri = 0; ncomp_tri < 2 * nb_compo_; ncomp_tri++)
668 f0 = elem_faces(elem, ncomp_tri);
671 voisin = face_voisins(f0, 0);
672 if (face_voisins(f0, 0) == elem)
673 voisin = face_voisins(f0, 1);
679 if (voisin != -1 && old_tri == -1)
681 dvar2 = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
683 kappa_interpolee = pow(std::fabs(kappa_var(elem) * kappa_var(voisin)), 0.5);
686 if (kappa_var(elem) == 0 || kappa_var(voisin) == 0)
687 kappa_interpolee = 0;
689 kappa_interpolee = 2. / (1. / kappa_var(elem) + 1. / kappa_var(voisin));
692 kappa_interpolee = (kappa_var(elem) + kappa_var(voisin)) / 2.;
694 valeur_diag += theta * kappa_interpolee * (dt / dvar2);
700 if (voisin > old_tri)
702 min_tri = std::min(min_tri, voisin);
703 if (min_tri == voisin)
704 dvarkeep = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
710 if (old_tri < elem && min_tri > elem)
712 coeff(compt) = valeur_diag;
713 tab2(compt2) = elem + nb_elem;
720 kappa_interpolee = pow(std::fabs(kappa_var(elem) * kappa_var(min_tri)), 0.5);
723 if (kappa_var(elem) == 0 || kappa_var(min_tri) == 0)
724 kappa_interpolee = 0;
726 kappa_interpolee = 2. / (1. / kappa_var(elem) + 1. / kappa_var(min_tri));
729 kappa_interpolee = (kappa_var(elem) + kappa_var(min_tri)) / 2.;
731 coeff(compt) = -theta * kappa_interpolee * (dt / dvarkeep);
732 tab2(compt2) = min_tri + nb_elem;
738 if (ncomp == 2 * nb_compo_ - nb_faces_au_bord - 1 && min_tri < elem)
740 coeff(compt) = valeur_diag;
741 tab2(compt2) = elem + nb_elem;
755 for (
int elem = 0; elem < nb_elem; elem++)
759 nb_faces_au_bord = 0;
762 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
764 f0 = elem_faces(elem, ncomp);
765 voisin = face_voisins(f0, 0);
766 if (face_voisins(f0, 0) == elem)
767 voisin = face_voisins(f0, 1);
775 for (
int ncomp = 0; ncomp < 2 * nb_compo_ - nb_faces_au_bord; ncomp++)
778 min_tri = nb_elem + 1;
780 for (
int ncomp_tri = 0; ncomp_tri < 2 * nb_compo_; ncomp_tri++)
782 f0 = elem_faces(elem, ncomp_tri);
785 voisin = face_voisins(f0, 0);
786 if (face_voisins(f0, 0) == elem)
787 voisin = face_voisins(f0, 1);
791 if (voisin != -1 && old_tri == -1)
793 dvar2 = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
794 valeur_diag += -fermeture.get_alpha() / dvar2;
800 if (voisin > old_tri)
802 min_tri = std::min(min_tri, voisin);
803 if (min_tri == voisin)
804 dvarkeep = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
810 if (old_tri < elem && min_tri > elem)
812 coeff(compt) = valeur_diag;
819 tab1(compt1) = compt2;
826 coeff(compt) = fermeture.get_alpha() / dvarkeep;
827 tab2(compt2) = min_tri;
833 tab1(compt1) = compt2;
840 if (ncomp == 2 * nb_compo_ - nb_faces_au_bord - 1 && min_tri < elem)
842 coeff(compt) = valeur_diag;
855 tab2(compt2) = elem + nb_elem;
872 tab1(compt1) = dimensionnement + 1;
875 if (compt != dimensionnement)
877 Cerr <<
"Erreur lors du calcul de la matrice du point fixe : nombre d'elements non nuls calcules different du nombre d'elements non nuls prevus" << finl;
883 Cerr <<
"Implicit mobility: the matrix A used in JFNK is not implemented." << finl;
888 Cerr <<
"STOP: argument mobilite_explicite cannot be different than 0 or 1." << finl;
889 Cerr <<
"==> Must have an error in the code." << finl;
905 const int nb_elem = le_dom_VDF_->nb_elem_tot();
907 DoubleVect term_cin(nb_elem);
910 DoubleVect second_membre(2 * nb_elem);
911 DoubleTab Ax1(2 * nb_elem);
914 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
916 second_membre(n_elem) = c(n_elem);
918 term_cin(n_elem) = 0.;
922 second_membre(n_elem + nb_elem) = term_cin(n_elem) + fermeture.get_beta() * fermeture.call_dWdc(x1(n_elem));
932 DoubleTab Ax1_mutilde(c);
933 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
935 Ax1_c(n_elem) = Ax1(n_elem);
936 Ax1_mutilde(n_elem) = Ax1(n_elem + nb_elem);
942 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
944 Ax1(n_elem) = Ax1_c(n_elem);
945 Ax1(n_elem + nb_elem) = Ax1_mutilde(n_elem);
949 for (
int n_elem = 0; n_elem < 2 * nb_elem; n_elem++)
950 v0(n_elem) = (Ax1(n_elem) - second_membre(n_elem));
959 const double delta = 1.e-5;
980void tabToVecOld(
const DoubleTab& tab, Vec& f)
982 PetscScalar *f_array;
984 VecGetArray(f, &f_array);
985 VecGetSize(f, &size);
989 VecRestoreArray(f, &f_array);
993void vecToTabOld(
const Vec& v, DoubleTab& result)
996 const PetscScalar *array;
997 VecGetSize(v, &size);
998 VecGetArrayRead(v, &array);
1000 for (PetscInt i = 0; i < size; ++i)
1001 result((
int)i) = array[i];
1002 VecRestoreArrayRead(v, &array);
1034PetscErrorCode FormFunctionOld(SNES snes, Vec x, Vec f,
void* ctx)
1042 DoubleTab x1(2*nb_elem);
1059 DoubleTrav second_membre(x1);
1061 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
1063 second_membre(n_elem) = C(n_elem);
1064 second_membre(n_elem + nb_elem) = fermeture.get_beta() * fermeture.call_dWdc(x1(n_elem));
1068 second_membre -= Ax1;
1070 tabToVecOld(second_membre, f);
1080PetscErrorCode MySNESMonitor(SNES snes, PetscInt its, PetscReal norm,
void* ctx)
1084 double temps_exec = statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time);
1086 Cout <<
"[SNES] Iteration " << its <<
" : ||F(x)|| = " << norm << finl;
1090 SFichier fichier_residu(
"residu.txt", ios::app);
1109PetscErrorCode LuisKSPMonitor(KSP ksp, PetscInt its, PetscReal rnorm,
void* ctx)
1111 Cout <<
" [KSP] Iteration " << its <<
" : residu = " << rnorm << finl;
1128 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1130 x1(n_elem) = c(n_elem);
1131 x1(n_elem + nb_elem_tot) = mutilde(n_elem);
1143 VecCreate(PETSC_COMM_WORLD, &x);
1144 VecSetSizes(x, PETSC_DECIDE, ns);
1145 VecSetFromOptions(x);
1150 VecDuplicate(x, &r);
1153 PetscInt x_size, r_size;
1154 VecGetSize(x, &x_size);
1155 VecGetSize(r, &r_size);
1156 assert(x_size == ns);
1157 assert(r_size == ns);
1161 FormFunctionOld(
nullptr, x, r, &
equation());
1165 VecNorm(r, NORM_2, &norm);
1166 PetscPrintf(PETSC_COMM_WORLD,
"Résidu F(x) = %g\n", (
double)norm);
1169 SNESCreate(PETSC_COMM_WORLD, &snes);
1171 SNESSetType(snes, SNESNEWTONLS);
1174 SNESSetFunction(snes, r, FormFunctionOld, &
equation());
1177 SNESLineSearch linesearch;
1178 SNESGetLineSearch(snes, &linesearch);
1180 SNESLineSearchSetType(linesearch, SNESLINESEARCHNONE);
1183 const char* ls_type;
1184 SNESLineSearchGetType(linesearch, &ls_type);
1185 PetscPrintf(PETSC_COMM_WORLD,
"Type of Line Search used: %s\n", ls_type);
1190 MatCreateSNESMF(snes, &J);
1194 MatMFFDSetFunctionError(J,
erel_);
1195 MatMFFDSetType(J,
"ds");
1196 MatMFFDDSSetUmin(J,
umin_);
1198 SNESSetJacobian(snes, J, J, MatMFFDComputeJacobian,
nullptr);
1201 MatView(J, PETSC_VIEWER_STDOUT_WORLD);
1213 SNESSetForceIteration(snes, PETSC_TRUE);
1214 SNESSetMaxLinearSolveFailures(snes, 200);
1218 SNESGetForceIteration(snes, &force_it);
1219 PetscPrintf(PETSC_COMM_WORLD,
"Force iteration: %s\n", force_it ?
"ON" :
"OFF");
1222 SNESGetKSP(snes, &ksp);
1223 KSPSetType(ksp, KSPGMRES);
1224 KSPGMRESSetRestart(ksp,
nkr_);
1232 PCSetType(pc, PCNONE);
1236 KSPMonitorSet(ksp, LuisKSPMonitor,
nullptr,
nullptr);
1237 SNESMonitorSet(snes, MySNESMonitor, &
equation(),
nullptr);
1247 PetscOptionsView(
nullptr, PETSC_VIEWER_STDOUT_WORLD);
1248 PetscOptionsLeft(
nullptr);
1251 SNESSetOptionsPrefix(snes,
"mysolver_");
1253 SNESSetFromOptions(snes);
1255 SNESView(snes, PETSC_VIEWER_STDOUT_WORLD);
1258 SNESSolve(snes,
nullptr, x);
1262 SNESGetNumberFunctionEvals(snes, &nfunc);
1266 SFichier fichier_eval(
"eval.txt", ios::app);
1271 const char *reasonstr;
1272 SNESGetConvergedReasonString(snes, &reasonstr);
1273 Cout <<
"SNES converged for this reason: " << reasonstr << finl;
1275 DoubleTrav solution(ns);
1277 vecToTabOld(x,solution);
1279 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1281 c_demi(n_elem) = solution(n_elem);
1282 mutilde_demi(n_elem) = solution(n_elem + nb_elem_tot);
1308 return petsc_snes(c, mutilde, c_demi, mutilde_demi);
1311 int i, j, nk, i0, im, it, ii;
1312 double tem = 1., res, ccos, ssin;
1315 double temps_exec = 0.;
1327 DoubleTrav c_update(nb_elem_tot);
1329 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1331 x1(n_elem) = c(n_elem);
1332 x1(n_elem + nb_elem_tot) = mutilde(n_elem);
1335 Cout <<
"Vecteur x1 = " << x1 << finl;
1337 DoubleTab v(ns,
nkr_);
1339 DoubleVect r(
nkr_ + 1);
1354 Cout <<
"Residu v0 = " << v0 << finl;
1359 for (ii = 0; ii < c.
size(); ii++)
1360 res += v0(ii) * v0(ii);
1362 res += v0(ii) * v0(ii);
1368 Cout <<
"Norme du premier résidu = " << res << finl;
1376 Cout <<
"Source Concentration Phase Field - JFNK" << finl;
1377 Cout <<
"Stopping rule scalar : " <<
rtol_ << finl;
1390 for (j = 0; j <
nkr_; j++)
1392 for (ii = 0; ii < ns; ii++)
1402 for (i = 0; i <= j; i++)
1404 for (ii = 0; ii < c.
size(); ii++)
1405 h(i, j) += v0(ii) * v(ii, i);
1407 h(i, j) += v0(ii) * v(ii, i);
1408 h(i, j) =
mp_sum(h(i, j));
1410 for (ii = 0; ii < ns; ii++)
1411 v0(ii) -= h(i, j) * v(ii, i);
1417 for (ii = 0; ii < c.
size(); ii++)
1418 tem += v0(ii) * v0(ii);
1420 tem += v0(ii) * v0(ii);
1435 for (i = 0; i < nk; i++)
1438 tem = 1. / sqrt(h(i, i) * h(i, i) + h(im, i) * h(im, i));
1439 ccos = h(i, i) * tem;
1440 ssin = -h(im, i) * tem;
1441 for (j = i; j < nk; j++)
1444 h(i, j) = ccos * tem - ssin * h(im, j);
1445 h(im, j) = ssin * tem + ccos * h(im, j);
1447 r[im] = ssin * r[i];
1452 for (i = nk - 1; i >= 0; i--)
1455 for (i0 = i - 1; i0 >= 0; i0--)
1456 r[i0] -= h(i0, i) * r[i];
1458 for (i = 0; i < nk; i++)
1459 for (ii = 0; ii < ns; ii++)
1460 x1(ii) += r[i] * v(ii, i);
1464 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1465 c_update(n_elem) = x1(n_elem);
1477 for (ii = 0; ii < c.
size(); ii++)
1478 res += v0(ii) * v0(ii);
1480 res += v0(ii) * v0(ii);
1485 Cout <<
" - At it = " << it <<
", residu scalar = " << res;
1488 temps_exec = statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time);
1492 SFichier fichier_residu(
"residu.txt", ios::app);
1500 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1502 c_demi(n_elem) = x1(n_elem);
1503 mutilde_demi(n_elem) = x1(n_elem + nb_elem_tot);
1506 Cout <<
"Number of iterations to reach convergence : " << it + 1 << finl;
1516 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
1518 c_demi(n_elem) = x1(n_elem);
1519 mutilde_demi(n_elem) = x1(n_elem + nb_elem_tot);
1522 Cout <<
"Stopped before convergence" << finl;
1529 SFichier fichier_eval(
"eval.txt", ios::app);
1535 Cerr <<
"Error: Phase_field - Bad input for choosing between resolution with PETSc or not." << finl;
1557 mutilde = div_alpha_gradC;
1562 const int taille = mutilde.
size();
1563 for (
int i = 0; i < taille; i++)
1565 mutilde(i) += fermeture.get_beta() * fermeture.call_dWdc(c(i));
1571 assert_invalide_items_non_calcules(mutilde);
1586 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
1587 if (prov_face.
size() == 0)
1592 opgrad.
calculer(c_demi, prov_face);
1594 prov_face *= fermeture.get_alpha();
1597 opdiv.
calculer(prov_face, mutilde_demi);
1601 mutilde_demi *= -1.;
1603 const int taille = mutilde_demi.
size();
1604 for (
int i = 0; i < taille; i++)
1606 mutilde_demi(i) += fermeture.get_beta() * fermeture.call_dWdc(c_demi(i));
1614 assert_invalide_items_non_calcules(mutilde_demi);
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
DoubleTab & valeurs() override
Returns the array of field values at the current time.
const Champ_Inc_base & inconnue() const override
Returns the unknown field of the equation: the concentration.
classe Convection_Diffusion_Phase_field Cas particulier de Convection_Diffusion_Concentration
const DoubleTab & get_div_alpha_gradC() const
DoubleTab & set_div_alpha_gradC()
Champ_Fonc_base & set_mutilde_()
const Milieu_base & milieu() const override
Returns the physical medium of the equation.
const Champ_Fonc_base & get_mutilde_() const
DoubleTab & set_mutilde_demi()
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int nb_faces() const
Returns the total number of faces.
double volumes(int i) const
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
double xp(int num_elem, int k) const
int premiere_face_int() const
A face is internal if and only if it separates two elements.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
An input stream whose source is a character string.
Class defining operators and methods for all reading operation in an input flow (file,...
class Equation_base The role of an equation is the calculation of one or more fields....
Sources & sources()
Returns the source terms associated with the equation.
Solveur_Masse_base & solv_masse()
Returns the mass solver associated with the equation.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Returns the discretized boundary condition domain associated with the equation.
Schema_Temps_base & schema_temps()
Returns the time scheme associated with the equation.
int get_kappa_ind() const
double call_kappa_func_c(const double d) const
void nommer(const Nom &) override
Gives a name to the field.
virtual DoubleVect & multvect_(const DoubleVect &, DoubleVect &) const
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const Champ_Don_base & rho() const
const Fermeture_Phase_field_base & get_fermeture() const
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
classe Navier_Stokes_phase_field Cette classe porte les termes de l'equation de la dynamique
Navier_Stokes_std This class carries the terms of the momentum equation.
const Champ_Inc_base & inconnue() const override
Returns the velocity (unknown field of the equation) (const version).
Operateur_Div & operateur_divergence()
Returns the divergence operator associated with the equation.
Operateur_Grad & operateur_gradient()
Returns the gradient operator associated with the equation.
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Operateur_Div Generic class of the hierarchy of operators computing the divergence.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initializes the array passed as parameter with the contribution of the operator.
Classe Operateur_Grad Generic class of the hierarchy of operators computing the gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initializes the array passed as parameter with the contribution of the operator.
static double mp_sum(double)
Computes the sum of x over all processors in the current group.
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
SFichier is to the C++ ofstream class what Sortie is to the C++ ostream class.
double temps_courant() const
Returns the current time.
double pas_de_temps() const
Returns the current time step (delta_t).
virtual DoubleTab & appliquer(DoubleTab &) const
Returns appliquer_impl(x/temporal_coefficient) if a temporal coefficient is set, otherwise returns ap...
Base class for output streams.
Operateur_Diff terme_diffusif_vdf_
void calculer_mutilde_demi(DoubleTab &, DoubleTab &) const
Matrice_Morse ancienne_matrice_
DoubleTab & div_kappa_grad(const DoubleTab &, const DoubleTab &, DoubleTab &) const
void calculer_residu_jfnk(const DoubleTab &, DoubleTab &, const DoubleTab &)
Construire le residu du JFNK.
Matrice_Bloc & get_matrice_diffusion_CH()
void assembler_ancienne_matrice()
Ancien assemblage de matrice "à la main" : ne prend pas en compte les différents types de schémas num...
void update_bloc_kappa(const DoubleTab &)
void calculer_mutilde(DoubleTab &) const
Calcul de mutilde au centre des elements.
bool is_matrix_initialised_
void initialiser_matrice_bloc()
int resolution_jfnk(const DoubleTab &, const DoubleTab &, DoubleTab &, DoubleTab &)
Algorithme JFNK (ancienne version de D. Jamet et nouvelle version de PETSc).
void calculer_div_alpha_grad(const DoubleTab &, DoubleTab &) const
Calcul de Div(alpha*rho*Grad((C)) au centre des elements.
int petsc_snes(const DoubleTab &, const DoubleTab &, DoubleTab &, DoubleTab &)
void jacobian_vect(const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &)
Construire la jacobienne multipliée par un vecteur Y.
Matrice_Bloc matrice_diffusion_CH_
void premier_demi_dt() override
Calcule le premier demi pas de temps dans le cas implicite Calcule le pas de temps dans le cas explic...
DoubleTab & laplacien(const DoubleTab &, DoubleTab &) const
void update_tab_kappa(const DoubleTab &)
void calculer_div_alpha_rho_grad(const DoubleTab &, DoubleTab &) const
Calcul de Div(alpha*rho*Grad((C)) au centre des elements.
virtual void calculer_u2_elem(DoubleVect &)
double drhodc(const int n_elem) const
_SIZE_ dimension_tot(int) const override
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")