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
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation: la 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
Renvoie le milieu physique de l'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
renvoie le nombre global de faces.
double volumes(int i) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
double xp(int num_elem, int k) const
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Une entree dont la source est une chaine de caracteres.
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....
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
int get_kappa_ind() const
double call_kappa_func_c(const double d) const
void nommer(const Nom &) override
Donne un nom au champ.
virtual DoubleVect & multvect_(const DoubleVect &, DoubleVect &) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Champ_Don_base & rho() const
const Fermeture_Phase_field_base & get_fermeture() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
classe Navier_Stokes_phase_field Cette classe porte les termes de l'equation de la dynamique
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Operateur_Div & operateur_divergence()
Renvoie l'operateur de calcul de la divergence associe a l'equation.
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient 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.
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
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.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
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")