16#include <Discretisation_base.h>
17#include <Operateur_Diff_base.h>
18#include <Schema_Temps_base.h>
19#include <Aire_interfaciale.h>
20#include <Masse_Multiphase.h>
21#include <Neumann_val_ext.h>
22#include <MD_Vector_tools.h>
23#include <Assembleur_base.h>
24#include <TRUSTTab_parts.h>
25#include <QDM_Multiphase.h>
26#include <Pb_Multiphase.h>
27#include <Pb_Conduction.h>
28#include <MD_Vector_std.h>
29#include <Matrix_tools.h>
30#include <Matrice_Bloc.h>
31#include <Array_tools.h>
32#include <Domaine_VF.h>
41#include <TablePrinter.h>
45template class std::map<std::string, matrices_t>;
46template class std::map<std::string, Matrice_Morse>;
49Implemente_instanciable_sans_constructeur(
SETS,
"SETS",
Simpler);
67Implemente_instanciable_sans_constructeur(
ICE,
"ICE",
SETS);
99 crit_conv_ = {{
"alpha", 1e-2 }, {
"temperature", 1e-1 },
100 {
"enthalpie", 1e2 }, {
"vitesse", 1e-2 },
101 {
"pression", 100 }, {
"k", 1e-2 },
102 {
"tau", 1e-2 }, {
"omega", 1e-2 },
103 {
"k_WIT", 1e-2 }, {
"interfacial_area", 1e2 }
110 if (mot ==
Motcle(
"criteres_convergence"))
117 for (is >> nom; nom !=
"}"; is >> nom)
124 else if (mot ==
"iter_min")
126 else if (mot ==
"iter_max")
128 else if (mot ==
"pression_degeneree")
130 else if (mot ==
"pressure_reduction" || mot ==
"reduction_pression")
147static inline double corriger_incr_alpha(
const DoubleTab& alpha, DoubleTab& incr,
double& err_a_sum)
150 double a_sum, corr_max = 0;
158 for (
int n = 0; n < N; n++)
160 n_a(n) = alpha(i, n) + incr(i, n);
163 err_a_sum = std::max(err_a_sum, std::abs(a_sum - 1));
166 for (
int n = 0; n < N; n++)
168 n_a(n) = std::max(n_a(n), 0.);
171 if (
static_cast<bool>(a_sum))
172 for (
int n = 0; n < N; n++)
175 for (
int n = 0; n < N; n++)
178 for (
int n = 0; n < N; n++)
180 corr_max = std::max(corr_max,
181 std::fabs(alpha(i, n) + incr(i, n) - n_a(n)));
182 incr(i, n) = n_a(n) - alpha(i, n);
194 for (
int n = 0; n < N; n++)
195 if (uk(i, n) + incr(i, n) < 0)
197 if (-uk(i, n) - incr(i, n) > corr_max)
198 corr_max = std::abs(uk(i, n) + incr(i, n));
199 incr(i, n) = -uk(i, n);
205void SETS::init_cv_ctx(
const DoubleTab& secmem,
const DoubleVect& norme)
207 cv_ctx = (SETS::cv_test_t *) calloc(1,
sizeof(SETS::cv_test_t));
215 ArrOfBit items_to_keep;
219 for (
int i = 0; i < size; i++)
220 if (items_to_keep[i])
224 KSPConvergedDefaultCreate(&cv_ctx->defctx);
227#if PETSC_VERSION_GE(3,24,0)
228PetscErrorCode SETS::destroy_cvctx(
void **mctx)
230 SETS::cv_test_t *ctx = (SETS::cv_test_t *)*mctx;
235 PetscErrorCode err = KSPConvergedDefaultDestroy(&ctx->defctx);
240PetscErrorCode SETS::destroy_cvctx(
void *mctx)
242 SETS::cv_test_t *ctx = (SETS::cv_test_t *)mctx;
247 PetscErrorCode err = KSPConvergedDefaultDestroy(ctx->defctx);
254PetscErrorCode SETS::convergence_test(KSP ksp, PetscInt it, PetscReal rnorm, KSPConvergedReason *reason,
void *mctx)
256 SETS::cv_test_t *ctx = (SETS::cv_test_t *)mctx;
257 if (ctx->t ==
nullptr)
260 KSPGetOperators(ksp,&m,
nullptr);
261 MatCreateVecs(m, &ctx->v, &ctx->t);
262 VecSetOption(ctx->v, VEC_IGNORE_NEGATIVE_INDICES,PETSC_TRUE);
267 KSPBuildResidual(ksp, ctx->t, ctx->v, &resi);
270 PetscErrorCode ret = KSPConvergedDefault(ksp, it, rnorm, reason, &ctx->defctx);
271 if (ret || *reason <= 0)
return ret;
276 VecGetValues(resi, ctx->obj->ix.size_array(), ctx->obj->ix.addr(), ctx->obj->residu.addr());
278 for (
int i = 0; ok && i < ctx->obj->norm.size(); i++)
279 if (ctx->obj->ix[i] >= 0)
280 ok &= std::abs(ctx->obj->residu[i]) < ctx->obj->norm[i] * ctx->eps_alpha;
287 const DoubleTab& inut,
290 int numero_iteration,
318 DoubleTrav secmem_unused;
320 dt, matrix_unused, 0, secmem_unused, numero_iteration, cv, ok);
332 for (
auto &&op_ext : op_diff.
op_ext)
333 semi_impl[nom_inco + (op_ext != &op_diff ?
"/" + op_ext->
equation().probleme().
le_nom().getString() :
"")] = op_ext->equation().inconnue().passe();
339 DoubleTrav secmem(current);
342 mat_pred_[nom_pb_inco].ajouter_multvect(current, secmem);
367 DoubleTab& pression,
double dt,
369 DoubleTrav& secmem_unused,
int nb_ite,
int& cv,
int& ok)
377 double err_a_sum = 0;
379 std::vector<Equation_base*> eq_list;
380 for (
int i = 0; i < n_eq; i++)
382 std::map<std::string, Equation_base*> eqs;
383 std::vector<std::string> noms;
384 for (
int i = 0; i < n_eq; i++)
386 noms.push_back(eq_list[i]->inconnue().
le_nom().getString());
387 eqs[noms[i]] = eq_list[i];
389 noms.push_back(
"pression");
391 std::map<std::string, Champ_Inc_base*> inco;
392 for (
auto &i_eq : eqs)
393 inco[i_eq.first] = &i_eq.second->inconnue();
394 inco[
"pression"] = &eq_qdm.
pression();
401 for (
auto &&i_eq : eqs)
402 if (i_eq.second != &eq_qdm)
404 semi_impl[i_eq.first] = i_eq.second->inconnue().passe();
405 if (i_eq.second->has_champ_conserve())
406 semi_impl[i_eq.second->champ_conserve().le_nom().getString()] = i_eq.second->champ_conserve().passe();
407 if (i_eq.second->has_champ_convecte())
408 semi_impl[i_eq.second->champ_convecte().le_nom().getString()] = i_eq.second->champ_convecte().passe();
413 DoubleTrav secmem(current);
422 mat_pred_[
"vitesse"].ajouter_multvect(current, secmem);
424 semi_impl[
"vitesse"] = current;
427 for (
auto &&i_eq : eqs)
428 if (i_eq.second != &eq_qdm)
430 Cerr <<
"Prediction of " << i_eq.first << finl;
431 const DoubleTab inut_loc(0);
432 iterer_eqn(*i_eq.second, inut_loc, i_eq.second->inconnue().valeurs(), dt, 0, ok);
448 for (
int i = 0; i <= n_eq; i++)
449 for (
int j = 0; j <= n_eq; j++)
451 for (
auto &&i_eq : eqs)
452 i_eq.second->dimensionner_blocs(
mats_[i_eq.first], semi_impl);
453 eq_qdm.assembleur_pression()->dimensionner_continuite(
mats_[
"pression"]);
456 for (
int i = 0; i <= n_eq; i++)
457 for (
int j = 0; j <= n_eq; j++)
458 if (!
mats_[noms[i]][noms[j]]->nb_lignes() && !
mats_[noms[i]][noms[j]]->nb_colonnes())
459 mats_[noms[i]][noms[j]]->dimensionner(inco[noms[i]]->valeurs().size_totale(), inco[noms[j]]->valeurs().size_totale(), 0);
462 for (
int i = 0; i <= n_eq; i++)
463 mdc.
add_part(inco[noms[i]]->valeurs().get_md_vector(), inco[noms[i]]->valeurs().line_size());
476 DoubleTrav v_inco, v_incr, v_sec;
480 DoubleTab_parts p_incr(v_incr);
481 DoubleTab_parts p_sec(v_sec);
483 for (
int i = 0; i <= n_eq; i++)
485 incr[noms[i]] = &p_incr[i];
486 sec[noms[i]] = &p_sec[i];
491 DoubleTab_parts p_inco(v_inco);
492 for (
int i = 0; i <= n_eq; i++)
493 p_inco[i] = inco[noms[i]]->valeurs();
503 Cerr <<
"SETS => File " << fichier <<
" is created ..." << finl;
505 newton_evol <<
"# File showing the simulation time, time step, Newton iterations, status and convergence of the increments." << finl;
506 newton_evol <<
"# Time \t Time_step \t Newton \t Status \t ";
509 for (
auto &&n_i : inco)
511 tp.
AddColumn(n_i.first, std::max(12, (
int) n_i.first.length()));
514 SFichier newton_evol(fichier, ios::app);
515 newton_evol << n_i.first <<
"\t ";
528 eqs[
"temperature"]->assembler_blocs_avec_inertie(
mats_[
"temperature"], *sec[
"temperature"], semi_impl) :
529 eqs[
"enthalpie"]->assembler_blocs_avec_inertie(
mats_[
"enthalpie"], *sec[
"enthalpie"], semi_impl);
531 for (
auto &n_e : eqs)
532 if (n_e.first !=
"temperature" && n_e.first !=
"enthalpie")
533 n_e.second->assembler_blocs_avec_inertie(
mats_[n_e.first], *sec[n_e.first], semi_impl);
536 eq_qdm.assembleur_pression()->assembler_continuite(
mats_[
"pression"], *sec[
"pression"]);
543 std::vector<std::set<std::pair<std::string, int>>> ordre;
545 ordre.push_back( { {
"vitesse", 1 } });
546 ordre.push_back( { {
"vitesse", 0 } }), ordre.push_back( { });
547 for (
auto &&nom : noms)
548 if (nom !=
"vitesse" && nom !=
"pression")
549 ordre.back().insert( { { nom, 0 } });
553 Cerr <<
"Echec de l'elimination!";
560 if (!cv_ctx && sub_type(
Solv_Petsc, solv_p.valeur()))
562 init_cv_ctx(*sec[
"pression"], eq_qdm.assembleur_pression()->norme_continuite());
563 ref_cast(
Solv_Petsc, solv_p.valeur()).set_convergence_test(convergence_test, cv_ctx, destroy_cvctx);
568 if (mp_max_abs_vect(*sec[
"pression"]) > 1e-16)
570 matrice_pression_.ajouter_multvect(inco[
"pression"]->valeurs(), *sec[
"pression"]);
571 solv_p->reinit(), solv_p->set_return_on_error(1);
575 Cerr <<
"Echec du solveur!";
578 incr[
"pression"]->echange_espace_virtuel();
579 *incr[
"pression"] -= inco[
"pression"]->valeurs();
582 *incr[
"pression"] = 0;
585 for (
auto &&n_v : b_p)
587 *incr[n_v.first] = n_v.second;
588 A_p_[n_v.first].ajouter_multvect(*incr[
"pression"], *incr[n_v.first]);
589 incr[n_v.first]->echange_espace_virtuel();
595 solv_p->reinit(), solv_p->set_return_on_error(1);
599 Cerr <<
"Echec du solveur!";
610 for (
auto &&n_v : incr)
612 const double vm = mp_min_vect(*n_v.second);
613 const double vM = mp_max_vect(*n_v.second);
614 const double x = std::fabs(vM) > std::fabs(vm) ? vM : vm;
623 cv = corriger_incr_alpha(inco[
"alpha"]->valeurs(), *incr[
"alpha"], err_a_sum) <
crit_conv_[
"alpha"];
624 for (
auto &&n_v : incr)
626 cv &= mp_max_abs_vect(*n_v.second) <
crit_conv_.at(n_v.first);
629 for (
auto &&n_i : inco)
630 n_i.second->valeurs() += *incr[n_i.first];
632 inco[
"pression"]->valeurs() -= mp_min_vect(inco[
"pression"]->valeurs());
635 Cerr <<
"Erreur en alpha!";
640 Cerr <<
"Sortie des bornes!";
650 SFichier newton_evol(fichier, ios::app);
651 newton_evol.
setf(ios::scientific);
656 newton_evol <<
"*KO*\t ";
658 newton_evol <<
"OK\t ";
661 newton_evol << itr <<
"\t ";
675 for (
auto &&n_i : inco)
676 n_i.second->futur() = n_i.second->valeurs();
678 ConstDoubleTab_parts ppart(inco[
"pression"]->valeurs());
686 for (
auto &&n_i : inco)
687 n_i.second->futur() = n_i.second->valeurs() = n_i.second->passe();
689 Cerr <<
que_suis_je() +
": pressure solver inaccuracy detected (requested precision " <<
crit_conv_[
"alpha"] <<
" , achieved precision " << err_a_sum <<
" )" << finl;
695int SETS::eliminer(
const std::vector<std::set<std::pair<std::string, int>>> ordre,
696 const std::string inco_p,
697 const std::map<std::string, matrices_t>& mats,
699 std::map<std::string, Matrice_Morse>& A_p,
704 std::map<std::pair<std::string, int>,
int> offs;
705 std::map<std::pair<std::string, int>, std::array<int, 2>> dims;
706 for (
auto &&n_v : sec)
708 ConstDoubleTab_parts part(*n_v.second);
709 for (
int i = 0; i < part.
size(); i++)
711 offs[ { n_v.first, i }] = offs.count( { n_v.first, i - 1 }) ? offs[ { n_v.first, i - 1 }] + dims[ { n_v.first, i - 1 }][0] * dims[ { n_v.first, i - 1 }][1] : 0;
712 dims[ { n_v.first, i }] = { part[i].dimension_tot(0), part[i].line_size() };
717 std::set<std::pair<std::string, int>> e_ib;
718 std::set<std::string> e_i;
720 int prems = !A_p.size();
725 for (
auto &&bloc : ordre)
727 std::set<std::string> i_bloc, dep;
728 for (
auto &&i_b : bloc)
729 i_bloc.insert(i_b.first);
730 for (
auto &&i_b : bloc)
731 for (
auto &&v_m : mats.at(i_b.first))
732 if (v_m.second->nb_colonnes() && v_m.first != inco_p && e_i.count(v_m.first) && !i_bloc.count(v_m.first))
733 dep.insert(v_m.first);
736 std::pair<std::string, int> i_b0 = *bloc.begin();
737 IntTrav calc(dims[i_b0][0]);
738 A = mats.at(i_b0.first).at(i_b0.first);
748 for (
auto &&i_b : bloc)
749 if (dims[i_b0][0] != dims[i_b][0])
751 Cerr <<
"SETS::eliminer() : discretisation des inconnues" << i_b0.first <<
"/" << i_b0.second <<
" et " << i_b.first <<
"/" << i_b.second <<
" incompatibles!" << finl;
755 std::vector<std::set<int>> stencil(calc.
size_array());
756 for (
auto &&i_b : bloc)
757 for (
auto &&v_m : mats.at(i_b.first))
758 if (v_m.second->nb_coeff())
762 if (v_m.first == inco_p)
766 for (
auto j = v_m.second->get_tab1()(oMg + M * i) - 1; j < v_m.second->get_tab1()(oMg + M * (i + 1)) - 1; j++)
767 stencil[i].insert(v_m.second->get_tab2()(j) - 1);
769 else if (e_i.count(v_m.first) || i_bloc.count(v_m.first))
771 A = A_p.count(v_m.first) ? &A_p.at(v_m.first) :
nullptr;
774 for (
auto j = v_m.second->get_tab1()(oMg + M * i) - 1; j < v_m.second->get_tab1()(oMg + M * (i + 1)) - 1; j++)
776 const int jb = v_m.second->get_tab2()(j) - 1;
778 while (offs.count( { v_m.first, k + 1 }) && jb >= offs.at( { v_m.first, k + 1 }))
780 const int oNg = offs[ { v_m.first, k }];
781 const int N = dims[ { v_m.first, k }][1];
782 const int n = jb - oNg - N * i;
783 if (bloc.count( { v_m.first, k }) && n >= 0 && n < N)
785 else if (e_ib.count( { v_m.first, k }))
786 for (
auto l = A->
get_tab1()(jb) - 1; l < A->get_tab1()(jb + 1) - 1; l++)
787 stencil[i].insert(A->
get_tab2()(l) - 1);
790 Cerr <<
"SETS::eliminer() : dependance ( " << i_b.first <<
"/" << i_b.second <<
" , " << v_m.first <<
"/" << k <<
" ) interdite!" << finl;
797 Cerr <<
"SETS::eliminer() : dependance ( " << i_b.first <<
"/" << i_b.second <<
" , " << v_m.first <<
" ) interdite!" << finl;
802 for (
auto &&i_bl : bloc)
810 for (
int m = 0; m < M; m++)
811 for (
auto &&col : stencil[i])
815 A_p[i_bl.first].nb_colonnes() ? A_p[i_bl.first] += mat2 : A_p[i_bl.first] = mat2;
819 std::vector<std::string> vbloc(i_bloc.begin(), i_bloc.end());
820 std::vector<std::string> vdep(dep.begin(), dep.end());
821 const int nv = (int) vbloc.size(), nd = (int) vdep.size();
822 std::vector<int> size, off_l, off_g;
824 for (
auto &&i_b : bloc)
827 size.push_back(dims[i_b][1]);
828 off_g.push_back(offs[i_b]);
832 std::vector<const Matrice_Morse*> pmat(nv), dAp(nd);
833 std::vector<std::vector<const Matrice_Morse*>> mat(nv), dmat(nv);
834 std::vector<const DoubleTab*> vsec(nv), dbp(nd);
836 std::vector<Matrice_Morse*> Ap(nv);
837 std::vector<DoubleTab*> bp(nv);
839 for (
int i = 0; i < nv; i++)
841 Ap[i] = &A_p[vbloc[i]];
842 vsec[i] = sec.at(vbloc[i]);
843 if (!b_p.count(vbloc[i]))
844 b_p[vbloc[i]] = *vsec[i];
845 bp[i] = &b_p[vbloc[i]];
846 const matrices_t& line = mats.at(vbloc[i]);
847 pmat[i] = line.count(inco_p) && line.at(inco_p)->nb_colonnes() ? line.at(inco_p) :
nullptr;
849 for (
int j = 0; j < nv; j++)
850 mat[i][j] = line.count(vbloc[j]) && line.at(vbloc[j])->nb_colonnes() ? line.at(vbloc[j]) :
nullptr;
852 for (
int j = 0; j < nd; j++)
853 dmat[i][j] = line.count(vdep[j]) && line.at(vdep[j])->nb_colonnes() ? line.at(vdep[j]) :
nullptr;
857 for (
int i = 0; i < nd; i++)
859 dbp[i] = &b_p.at(vdep[i]);
860 dAp[i] = &A_p.at(vdep[i]);
863 DoubleTrav D(nb, nb);
870 const auto deb = Ap[0]->get_tab1()(off_g[0] + size[0] * i) - 1;
871 const auto fin = Ap[0]->get_tab1()(off_g[0] + size[0] * i + 1) - 1;
872 const int ic = (int)(fin - deb);
873 const int nc = ic + 1;
876 for (
int j = 0; j < nv; j++)
880 const int oMl = off_l[j];
881 for (
int m = 0; m < M; m++)
882 S(ic, oMl + m) = vsec[j]->
addr()[oMg + M * i + m];
887 for (
int j = 0; j < nv; j++)
891 const int oMl = off_l[j];
892 for (
int k = 0; k < nv; k++)
895 const int N = size[k];
896 const int oNg = off_g[k];
897 const int oNl = off_l[k];
898 for (
int m = 0; m < M; m++)
899 for (
auto l = mat[j][k]->get_tab1()(oMg + M * i + m) - 1; l < mat[j][k]->get_tab1()(oMg + M * i + m + 1) - 1; l++)
901 const int jb = mat[j][k]->get_tab2()(l) - 1;
902 const int n = jb - oNg - N * i;
904 D(oMl + m, oNl + n) = mat[j][k]->get_coeff()(l);
907 const double coeff = mat[j][k]->get_coeff()(l);
908 S(ic, oMl + m) -= coeff * bp[k]->
addr()[jb];
910 for (
auto lb = Ap[k]->get_tab1()(jb) - 1; lb < Ap[k]->get_tab1()(jb + 1) - 1; lb++)
912 const int col = Ap[k]->get_tab2()(lb);
914 while(Ap[0]->get_tab2()(pos) != col && pos < fin)
916 assert(Ap[0]->get_tab2()(pos) == col);
917 S((
int)(pos - deb), oMl + m) -= coeff * Ap[k]->get_coeff()(lb);
924 for (
int j = 0; j < nv; j++)
929 const int oMl = off_l[j];
930 for (
int m = 0; m < M; m++)
933 for (
auto k = pmat[j]->get_tab1()(oMg + M * i + m) - 1; k < pmat[j]->get_tab1()(oMg + M * i + m + 1) - 1; k++)
935 int col = pmat[j]->get_tab2()(k);
937 while (Ap[0]->get_tab2()(pos) != col && pos < fin)
939 assert(Ap[0]->get_tab2()(pos) == col);
940 S((
int)(pos - deb), oMl + m) -= pmat[j]->get_coeff()(k);
945 for (
int j = 0; j < nv; j++)
946 for (
int k = 0; k < nd; k++)
951 const int oMl = off_l[j];
952 for (
int m = 0; m < M; m++)
953 for (
auto l = dmat[j][k]->get_tab1()(oMg + M * i + m) - 1; l < dmat[j][k]->get_tab1()(oMg + M * i + m + 1) - 1; l++)
955 const double coeff = dmat[j][k]->get_coeff()(l);
956 const int jb = dmat[j][k]->get_tab2()(l) - 1;
957 S(ic, oMl + m) -= coeff * dbp[k]->
addr()[jb];
959 for (
auto lb = dAp[k]->get_tab1()(jb) - 1; lb < dAp[k]->get_tab1()(jb + 1) - 1; lb++)
961 const int col = dAp[k]->get_tab2()(lb);
963 while (Ap[0]->get_tab2()(pos) != col && pos < fin)
965 assert(Ap[0]->get_tab2()(pos) == col);
966 S((
int)(pos - deb), oMl + m) -= coeff * dAp[k]->get_coeff()(lb);
972 F77NAME(dgetrf)(&nb, &nb, &D(0, 0), &nb, &piv(0), &infoo);
975 F77NAME(dgetrs)(&trans, &nb, &nc, &D(0, 0), &nb, &piv(0), &S(0, 0), &nb, &infoo);
978 for (
int j = 0; j < nv; j++)
982 const int oMl = off_l[j];
983 for (
int m = 0; m < M; m++)
985 bp[j]->addr()[oMg + M * i + m] = S(ic, oMl + m);
987 auto l = Ap[j]->get_tab1()(oMg + M * i + m) - 1;
988 for (
int k = 0; k < ic; k++, l++)
989 Ap[j]->get_set_coeff()(l) = S(k, oMl + m);
995 for (
auto &&i_b : bloc)
996 e_ib.insert(i_b), e_i.insert(i_b.first);
1002 const std::map<std::string, Matrice_Morse>& A_p,
1004 const std::map<std::string, matrices_t>& mats,
1010 secmem = *sec.at(inco_p);
1023 Stencil stencil(0, 2);
1025 for (
auto &&n_m : mats.at(inco_p))
1026 if (n_m.second && n_m.second->nb_colonnes())
1028 const Matrice_Morse& Mp = *n_m.second, *Ap = n_m.first != inco_p ? &A_p.at(n_m.first) :
nullptr;
1029 for (
int i = 0; i < np; i++)
1033 for (
int m = 0; m < M; m++, ib++)
1036 const int k = Mp.
get_tab2()(j) - 1;
1037 for (
auto l = (Ap ? Ap->get_tab1()(k) - 1 : 0); l < (Ap ? Ap->get_tab1()(k + 1) - 1 : 1); l++)
1038 stencil.
append_line(ib, Ap ? Ap->get_tab2()(l) - 1 : k);
1042 tableau_trier_retirer_doublons(stencil);
1048 for (
auto &&n_m : mats.at(inco_p))
1049 if (n_m.first == inco_p && n_m.second && n_m.second->nb_colonnes())
1051 else if (n_m.second && n_m.second->nb_colonnes())
1053 const Matrice_Morse& Mp = *n_m.second, &Ap = A_p.at(n_m.first);
1054 const DoubleTab& bp = b_p.at(n_m.first);
1055 for (
int i = 0; i < np; i++)
1059 for (
int m = 0; m < M; m++, ib++)
1061 const auto deb = P.
get_tab1()(ib) - 1;
1062 const auto fin = P.
get_tab1()(ib + 1) - 1;
1065 const int k = Mp.
get_tab2()(j) - 1;
1068 for (
auto l = Ap.get_tab1()(k) - 1; l < Ap.get_tab1()(k + 1) - 1; l++)
1070 const int col = Ap.get_tab2()(l);
1072 while (P.
get_tab2()(pos) != col && pos < fin)
1083 for (
auto i = 0; i < P.
get_tab1()(1) - 1; i++)
classe Aire_interfaciale Equation de transport de l'aire interfaciale
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
classe Energie_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressib...
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....
virtual void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={})
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual bool positive_unkown()
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual const Operateur & operateur(int) const =0
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
classe ICE (semi-implicte ICE, a la CATHARE 3D)
int get_sequential_items_flags(ArrOfBit &flags, int line_size=1) const
Metadata for a distributed composite vector.
void add_part(const MD_Vector &part, int shape=0, Nom name="")
Append the "part" descriptor to the composite vector.
classe Masse_Multiphase Cas particulier de Convection_Diffusion_std pour un fluide quasi conpressible
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
const auto & get_coeff() const
virtual int check_unknown_range() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Champ_Inc_base & pression_pa()
SolveurSys & solveur_pression()
Renvoie le solveur en pression (version const).
Champ_Inc_base & pression()
Classe Neumann_val_ext Cette classe est la classe de base de la hierarchie des conditions.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const std::string & getString() const
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.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
std::vector< const Operateur_Diff_base * > op_ext
virtual Operateur_base & l_op_base()=0
Classe Pb_Conduction Cette classe represente un probleme de conduction avec rho et Cp non uniformes :
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
virtual bool resolution_en_T() const
int nombre_d_equations() const override
Renvoie le nombre d'equation, Renvoie 2 car il y a 2 equations a un probleme de.
const Equation_base & equation(int) const override
Renvoie l'equation d'hydraulique de type Navier_Stokes_std si i=0 Renvoie l'equation de la thermique ...
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps du probleme.
static double mp_min(double)
static trustIdType mppartial_sum(trustIdType i)
Calul de la somme partielle de i sur les processeurs 0 a me()-1 (renvoie 0 sur le processeur 0).
static double mp_max(double)
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.
static bool mp_and(bool)
Calcule le 'et' logique de b sur tous les processeurs du groupe courant.
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) override
classe SETS (semi-implicite + etapes de stabilisation, a la TRACE)
Entree & lire(const Motcle &, Entree &) override
Matrice_Bloc mat_semi_impl_
double facsec_diffusion_for_sets() const
std::map< std::string, Matrice_Morse > A_p_
static int eliminer(const std::vector< std::set< std::pair< std::string, int > > > ordre, const std::string inco_p, const std::map< std::string, matrices_t > &mats, const ptabs_t &sec, std::map< std::string, Matrice_Morse > &A_p, tabs_t &b_p)
void iterer_NS(Equation_base &, DoubleTab ¤t, DoubleTab &pression, double, Matrice_Morse &, double, DoubleTrav &, int nb_iter, int &converge, int &ok) override
double unknown_positivation(const DoubleTab &uk, DoubleTab &incr)
std::map< std::string, double > crit_conv_
static void assembler(const std::string inco_p, const std::map< std::string, Matrice_Morse > &A_p, const tabs_t &b_p, const std::map< std::string, matrices_t > &mats, const ptabs_t &sec, Matrice_Morse &matrice, DoubleTab &secmem, int p_degen)
std::map< std::string, matrices_t > mats_
std::vector< double > incr_var_convergence_
std::map< std::string, Matrice_Morse > mat_pred_
Matrice_Morse matrice_pression_
bool iterer_eqn(Equation_base &equation, const DoubleTab &inconnue, DoubleTab &result, double dt, int numero_iteration, int &ok) override
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.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
virtual Entree & lire(const Motcle &, Entree &)
Parametre_implicite & get_and_set_parametre_implicite(Equation_base &eqn)
virtual DoubleTab & corriger_solution(DoubleTab &x, const DoubleTab &y, int incr=0) const
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ size_totale() const
virtual const MD_Vector & get_md_vector() const
void AddColumn(const std::string &header_name, int column_width)
Add a column to our table.