16#include <Parametre_diffusion_implicite.h>
17#include <Solveur_Implicite_base.h>
18#include <Schema_Euler_explicite.h>
19#include <Schema_Euler_Implicite.h>
20#include <Source_dep_inco_base.h>
21#include <Operateur_Conv_base.h>
22#include <Op_Conv_negligeable.h>
23#include <Operateur_Diff_base.h>
24#include <Discretisation_base.h>
25#include <Matrice_Morse_Diag.h>
26#include <Frontiere_dis_base.h>
27#include <Matrice_Morse_Sym.h>
28#include <Operateur_base.h>
29#include <TRUSTTab_parts.h>
30#include <EcrFicPartage.h>
31#include <Postraitement.h>
32#include <Equation_base.h>
33#include <Milieu_base.h>
34#include <TRUST_2_PDI.h>
35#include <Domaine_VF.h>
36#include <SolveurSys.h>
37#include <Domaine_VF.h>
43#include <Perf_counters.h>
55Equation_base::Equation_base()
60 Nom expr_equation_non_resolue=
"0";
61 equation_non_resolue_.setNbVar(1);
62 equation_non_resolue_.setString(expr_equation_non_resolue);
63 equation_non_resolue_.addVar(
"t");
64 equation_non_resolue_.parseString();
70 std::string str= equation_non_resolue_.getString();
71 std::string str2(
"INPUT_INT_VALUE");
72 if (str.compare(str2)==0)
74 Nom name = eq_non_resolue_input_.getName();
75 int eq_non_resolue_int = mon_probleme->getOutputIntValue(name);
76 return eq_non_resolue_int;
80 double t = le_schema_en_temps->temps_courant();
81 equation_non_resolue_.setVar(
"t",t);
82 return (
int)equation_non_resolue_.eval();
96 Cerr <<
"There is no object of type Domaine_dis yet associated to the equation " <<
que_suis_je() << finl;
97 Cerr <<
"This means that the problem has not been discretized or" << finl;
98 Cerr <<
"that instruction Discretiser is misplaced" << finl;
101 return le_dom_dis.valeur();
116 Cerr <<
"There is no object of type Domaine_dis associated to the equation " <<
que_suis_je() << finl;
117 Cerr <<
"This means that the problem has not been discretized" << finl;
121 return le_dom_dis.valeur();
138 le_dom_Cl_dis->completer();
142 if (mon_probleme->is_coupled())
145 int nb_cl = le_dom_Cl_dis->nb_cond_lim();
146 for (
int i=0; i<nb_cl; i++)
148 const Cond_lim_base& la_cl = le_dom_Cl_dis->les_conditions_limites(i);
151 bool raccord_found =
false;
155 raccord_found =
true;
159 raccord_found =
true;
161 if ( raccord_found && !sub_type(Raccord_base,la_frontiere))
163 Cerr <<
"====================================================================" << finl;
164 Cerr <<
"Boundary " << la_frontiere.
le_nom() <<
" should be a raccord" << finl;
165 Cerr <<
"Add in your data file between the definition and the partition of the domain " << mon_probleme->domaine().
le_nom() <<
" : " << finl;
166 Cerr <<
"Modif_bord_to_raccord " << mon_probleme->domaine().
le_nom() <<
" " << la_frontiere.
le_nom() << finl;
176 if (liste_modeles_.size()==0)
177 liste_modeles_.add(mod);
182 Nom msg=
"Equation_base::completer(), nb_op = " ;
184 for(
int i=0; i<nb_op; i++)
197 if(
operateur(i).l_op_base().get_decal_temps()==1)
245 Cerr<<
"Reading of data for a "<<
que_suis_je()<<
" equation"<<finl;
248 Nom expr_equation_non_resolue=
"0";
249 param.ajouter(
"disable_equation_residual",&disable_equation_residual_);
250 equation_non_resolue_.setString(expr_equation_non_resolue);
251 param.lire_avec_accolades_depuis(is);
266 param.
ajouter(
"parametre_equation",¶metre_equation_);
281 else if (mot==
"conditions_limites|boundary_conditions")
287 else if (mot==
"conditions_initiales|initial_conditions")
292 else if (mot==
"ecrire_fichier_xyz_valeur")
294 xyz_field_values_file_.associer_eqn(*
this);
295 is >> xyz_field_values_file_;
298 else if (mot==
"rename_equation|renommer_equation")
300 Cerr <<
"Equation " <<
nom_ <<
" renamed to : ";
302 Cerr <<
nom_ << finl;
305 else if (mot==
"equation_non_resolue")
309 Motcle expr_equation_non_resolue;
310 is >> expr_equation_non_resolue;
311 equation_non_resolue_.setString(expr_equation_non_resolue);
312 if (expr_equation_non_resolue==
"INPUT_INT_VALUE")
313 is >> eq_non_resolue_input_;
315 equation_non_resolue_.parseString();
329 static bool already_read=
false;
332 Cerr <<
"Error: the 'sources' keyword should only appear once per equation." << finl;
333 Cerr <<
"To declare several source terms, list them inside a single block separated by commas:" << finl;
334 Cerr <<
" sources { TermA { ... } , TermB { ... } }" << finl;
339 Cerr <<
"Reading of source terms" << finl ;
378 Cerr <<
"Reading of initial conditions\n";
385 Cerr <<
"We expected a { while reading " <<
que_suis_je() << finl;
386 Cerr <<
"and not : " << nom << finl;
393 Cerr << nom <<
" is not the name of the unknown "
399 const int nb_comp = ch_init->nb_comp();
409 Cerr <<
"We expected a } while reading " <<
que_suis_je() << finl;
410 Cerr <<
"and not : " << nom << finl;
426 Cerr <<
"Reading of boundaries conditions\n";
429 Cerr <<
"Error while reading boundaries conditions : " <<
431 Cerr <<
"The Domaine_Cl_dis_base is empty ..." << finl;
434 is >> le_dom_Cl_dis.valeur();
484 field_tag +=
Nom(temps,
probleme().reprise_format_temps());
490 avancer_fichier_with_syno(fich,field_tag,field_tag_syno);
494 avancer_fichier(fich,field_tag);
509 Nom field_tag_syno=field_tag;
510 auto create_syno= [field_tag](std::string pattern, std::string replace)
513 std::size_t pos = s.find(pattern);
514 while (pos != std::string::npos)
516 s.replace(pos, pattern.length(), replace);
517 pos = s.find(pattern, pos + replace.length());
523 field_tag_syno=create_syno(
"PolyMAC_CDO",
"PolyMAC");
525 field_tag_syno=create_syno(
"PolyMAC_MPFA",
"PolyMAC_P0");
527 field_tag_syno=create_syno(
"PolyMAC_HFV",
"PolyMAC_P0P1NC");
528 return field_tag_syno;
539 return le_schema_en_temps->limpr();
566 xyz_field_values_file_.write_fields();
581 DoubleTrav secmem(derivee);
585 derivee_en_temps_inco_sources(secmem);
588 bool calcul_explicite =
false;
595 if (
schema_temps().diffusion_implicite() && !calcul_explicite)
604 secmem *= time_factor;
614 if(
operateur(i).l_op_base().get_decal_temps()!=1)
618 DoubleTrav secmem_tmp(secmem);
620 if (i == 1) secmem_tmp *= time_factor;
621 secmem += secmem_tmp;
642 solveur_masse->appliquer(secmem);
643 if (
schema_temps().diffusion_implicite() && !calcul_explicite)
727 Cerr <<
"Must be coded ... " << finl;
733 Cerr <<
"Error in Equation_base::derivee_en_temps_inco" << finl;
734 Cerr <<
"implicite_ = " <<
implicite_ <<
" has not been initialized!" << finl;
735 Cerr <<
"May be " <<
que_suis_je() <<
"::completer() method doesn't call Equation_base::completer()" << finl;
736 Cerr <<
"Contact TRUST support." << finl;
749 return mon_probleme.valeur();
760 return mon_probleme.valeur();
787 if (
nom_ == nom_vide)
795 for(
int i=0; i<nb_op; i++)
809 Cerr <<
"Discretizing of the boundary conditions... ";
812 Cerr <<
" OK " << finl;
814 le_dom_Cl_dis->associer_eqn(*
this);
815 le_dom_Cl_dis->associer_inconnue(
inconnue());
821 solveur_masse.typer(typ);
822 solveur_masse->associer_eqn(*
this);
823 solveur_masse->associer_domaine_dis_base(
domaine_dis());
824 solveur_masse->associer_domaine_cl_dis_base(le_dom_Cl_dis.valeur());
828 Motcle directive(
"temperature");
832 Nom nom(
"derivee_en_temps_");
857 le_schema_en_temps=un_schema_en_temps;
867 if(!le_schema_en_temps)
870 <<
"has not been associated to a time scheme " << finl;
873 return le_schema_en_temps.valeur();
883 if(!le_schema_en_temps)
886 <<
"has not been associated to a time scheme " << finl;
889 return le_schema_en_temps.valeur();
925 if (reset && champ_conserve_) champ_conserve_->reset_champ_calcule();
926 if (reset && champ_convecte_) champ_convecte_->reset_champ_calcule();
927 if (champ_conserve_) champ_conserve_->mettre_a_jour(temps);
928 if (champ_convecte_) champ_convecte_->mettre_a_jour(temps);
944 if (champ_conserve_) champ_conserve_->abortTimeStep();
945 if (champ_convecte_) champ_convecte_->abortTimeStep();
953 if(solveur_masse) solveur_masse->resetTime(time);
955 le_dom_Cl_dis->resetTime(time);
959 if (champ_conserve_) champ_conserve_->resetTime(time);
960 if (champ_convecte_) champ_convecte_->resetTime(time);
979 solveur_masse->preparer_calcul();
981 for(
int i=0; i<nb_op; i++)
991 le_dom_Cl_dis->initialiser(temps);
994 msg+=
" dans Equation_base::preparer_calcul 1";
1006 msg+=
" dans Equation_base::preparer_calcul ";
1034 if (champ_conserve_) champ_conserve_->changer_temps_futur(tps,i);
1035 if (champ_convecte_) champ_convecte_->changer_temps_futur(tps,i);
1056 solveur_masse->mettre_a_jour(temps_present);
1097 Cerr <<
"Error : " <<
que_suis_je() <<
" has not been associated to a problem ! " << finl;
1100 return mon_probleme->discretisation();
1109 if (motlu ==
Motcle(inco))
1122 itr->creer_champ(motlu);
1128 inco_residu +=
"_residu";
1130 if (nom ==
Motcle(inco_residu))
1137 if (itr->le_nom() == nom)
1156 if (itr->has_champ(nom, ref_champ))
1165 inco_residu +=
"_residu";
1167 if (nom ==
Motcle(inco_residu))
1171 if (itr->le_nom() == nom)
1187 if (itr->has_champ(nom))
1196 inco_residu +=
"_residu";
1197 if (nom ==
Motcle(inco_residu))
1206 if (itr->le_nom() == nom && itr->temps() !=
inconnue().temps())
1224 if (itr->has_champ(nom, ref_champ))
1227 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1232 if (opt == DESCRIPTION)
1244 itr->get_noms_champs_postraitables(noms, opt);
1262 for(
int i=0; i<nb_op; i++)
1268 if (dt_op>0 && !diff_impl)
1277 if (i == 0) Cout <<
" " << finl <<
"Printing of the next provisional time steps for the equation: " <<
que_suis_je() << finl;
1279 Cout <<
" convective";
1281 Cout <<
" diffusive";
1283 Cout <<
" operator ";
1284 Cout<<
" time step : "<<
dt_op_bak[i] << finl;
1317 Cerr << finl <<
"**** Advice (printed only on the first " << nw <<
" time steps) ****" << finl;
1318 Cerr <<
"You could use diffusion_implicite option into the Euler scheme to increase" << finl;
1319 Cerr <<
"the stability time step of the " << this->
que_suis_je() <<
" equation by impliciting the diffusive operator." << finl;
1333 for(
int i=0; i<nb_op; i++)
1340 Cerr<<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<finl;
1341 Cerr<<
"STEADY option is not compatible with the 'CONVECTION { NEGLIGEABLE }' model!"<<finl;
1342 Cerr <<
"Please, contact TRUST support." << finl;
1343 Cerr<<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<finl;
1362 const Conds_lim& les_cl=le_dom_Cl_dis->les_conditions_limites();
1375 static Motcle defaut=
"indetermine";
1388 const int nb_composantes = ch_ref.
nb_comp();
1391 if (nature==scalaire)
1395 Cerr<<
"The nature of the field "<<nom<<
" unknown to the equation name "<<
le_nom()<<
" is scalar."<<finl;
1396 Cerr<<
"The number of components readed for this field "<<nb_comp<<
" is not compatible with its nature."<<finl;
1397 Cerr<<
"We must read only one component for this field."<<finl;
1401 else if (nature==quadrature_scalaire)
1405 else if (nature==vectoriel)
1409 Cerr<<
"The nature of the field "<<nom<<
" unknown to the equation name "<<
le_nom()<<
" is vector."<<finl;
1410 Cerr<<
"The number of components readed for this field "<<nb_comp<<
" is not compatible with its nature."<<finl;
1415 else if (nature==quadrature_vectoriel)
1419 else if (nature==multi_scalaire)
1421 if (nb_comp!=nb_composantes)
1423 Cerr<<
"The nature of the field "<<nom<<
" unknown to the equation name "<<
le_nom()<<
" is multiscalar."<<finl;
1424 Cerr<<
"The number of components readed for this field "<<nb_comp<<
" does not match the number expected."<<finl;
1425 Cerr<<
"It should read "<<nb_composantes<<
" components for this field."<<finl;
1429 else if (nature==basis_function_order_1_scalar)
1439 else if (nature==basis_function_order_2_scalar)
1449 else if (nature==basis_function_order_1_vectorial)
1459 else if (nature==basis_function_order_2_vectorial)
1471 Cerr<<
"The nature of the field is not recognized"<<finl;
1483 double dt = le_schema_en_temps->pas_de_temps();
1484 double dt_convection;
1485 if (le_schema_en_temps->no_conv_subiteration_diffusion_implicite())
1492 if(inf_strict(dt_convection,dt))
1496 double epsilon = 1.e-10;
1497 int nstep = (int)((dt / dt_convection)*(1+epsilon)) + 1 ;
1498 if (( nstep % 2 ) != 0 ) nstep += 1 ;
1499 double dt_loc = dt/double(nstep) ;
1500 Cout <<
"Convection Semi Implicite: Number of Sub-Cycles : " << nstep <<
" with dt_loc = " << dt_loc <<
" dt =" << dt << finl ;
1503 DoubleTrav solution_loc(solution);
1504 solution_loc = solution;
1506 derivee.
copy(secmem, RESIZE_OPTIONS::NOCOPY_NOINIT);
1507 for (
int i=0; i<nstep; i++)
1517 solveur_masse->appliquer(derivee);
1518 solution_loc.
ajoute(dt_loc, derivee, VECT_REAL_ITEMS);
1522 secmem /= double(nstep) ;
1542 if (le_schema_en_temps->impr_diffusion_implicite())
1543 Cout <<
"Implicited diffusion algorithm applied on " <<
que_suis_je() <<
" equation:" << finl;
1545 int size_s =
sources().size();
1546 ArrOfInt marq(size_s);
1547 for (
int i = 0; i < size_s; i++)
1555 bool has_diffusion_implicit_solver = parametre_equation() &&
1558 if (has_diffusion_implicit_solver)
1563 Cerr <<
"solveur_dffusion_implicite can't be used yet with source terms depending from the unknowns. " << finl;
1568 Cerr <<
"solveur_dffusion_implicite can't be used yet with penalization. " << finl;
1571 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
1575 DoubleTrav copie(secmem);
1578 solveur_masse->ajouter_masse(1, secmem, copie);
1586 DoubleTrav present(solution);
1589 statistics().end_count(STD_COUNTERS::matrix_assembly);
1591 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
1596 statistics().end_count(STD_COUNTERS::matrix_assembly);
1601 Cout <<
"Diffusion operator implicited for the equation " <<
que_suis_je()
1602 <<
" : Conjugate gradient converged in " << niter <<
" iterations." << finl;
1612 statistics().begin_count(STD_COUNTERS::implicit_diffusion,statistics().get_last_opened_counter_level()+1);
1616 Cerr <<
"the size of the solution and the second member does not match";
1621 int nmax = le_schema_en_temps->niter_max_diffusion_implicite();
1627 int precond_diag = 0;
1630 if (size_terme_mul) precond_diag = 1;
1632 double seuil_diffusion_implicite = le_schema_en_temps->seuil_diffusion_implicite();
1637 parametre_equation().valeur());
1646 statistics().end_count(STD_COUNTERS::implicit_diffusion,0,0);
1650 double dt = le_schema_en_temps->pas_de_temps();
1653 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
1656 if (nb_comp * nb_case != n)
1658 Cerr <<
"the size of the unknown and the second member does not match" << finl;
1659 Cerr <<
"dimension_tot nbdim1 nb_comp = " << nb_case <<
" " << nb_comp << finl;
1660 Cerr <<
"size_totale = " << n << finl;
1663 if (
diag_.ordre()==1)
diag_.dimensionne_diag(n);
1666 for (
int i = 0; i < size_s; i++)
1671 DoubleTrav tab_tempo(
inconnue().valeurs());
1673 Matrice_Morse_View matrice;
1675 DoubleTabView tempo = tab_tempo.
view_wo();
1676 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
1677 Kokkos::RangePolicy<>(0, nb_case), KOKKOS_LAMBDA(
1680 for (
int ncp = 0; ncp < nb_comp; ncp++)
1681 tempo(ca, ncp) = matrice.diag(ca * nb_comp + ncp);
1683 end_gpu_timer(__KERNEL_NAME__);
1685 solveur_masse->appliquer(tab_tempo);
1690 CDoubleTabView tempo = tab_tempo.
view_ro();
1691 CDoubleTabView terme_mul_v = terme_mul.
view_ro();
1692 Matrice_Morse_View matrice;
1694 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
1695 Kokkos::RangePolicy<>(0, nb_case), KOKKOS_LAMBDA(
1698 double tmp = (size_terme_mul ? terme_mul_v(ca, 0) : 1) / dt;
1699 for (
int ncpa = 0; ncpa < nb_comp; ncpa++)
1700 matrice.diag(ca * nb_comp + ncpa) = 1. / (tmp + tempo(ca, ncpa) * aCKN);
1702 end_gpu_timer(__KERNEL_NAME__);
1704 statistics().end_count(STD_COUNTERS::matrix_assembly);
1707 auto matvec = [&](
const DoubleTab& input_field, DoubleTab& output_field)
1710 statistics().end_count(STD_COUNTERS::implicit_diffusion,0,0);
1714 for (
int i = 0; i < size_s; i++)
1718 statistics().begin_count(STD_COUNTERS::implicit_diffusion,statistics().get_last_opened_counter_level()+1);
1721 statistics().begin_count(STD_COUNTERS::implicit_diffusion,statistics().get_last_opened_counter_level()+1);
1723 DoubleTrav p(solution);
1724 DoubleTrav moins_phiB(solution);
1725 matvec(p, moins_phiB);
1727 DoubleTrav resu(solution);
1728 matvec(solution, resu);
1729 solveur_masse->appliquer(resu);
1737 ToDo_Kokkos(
"critical for IBC");
1740 for (
int i = 0; i < size_terme_mul; i++)
1741 sol(i) *= terme_mul(i);
1749 DoubleTrav sum_sources(secmem);
1750 statistics().end_count(STD_COUNTERS::implicit_diffusion,0,0);
1751 for (
int i = 0; i < size_s; i++)
1753 sources()(i).ajouter(sum_sources);
1754 statistics().begin_count(STD_COUNTERS::implicit_diffusion,statistics().get_last_opened_counter_level()+1);
1756 secmem.
ajoute(-1., sum_sources);
1758 secmem.
ajoute(1. / dt, sol, VECT_REAL_ITEMS);
1759 resu.
ajoute(1. / dt, sol, VECT_REAL_ITEMS);
1769 diag_.multvect(residu, z);
1775 double initial_residual = mp_carre_norme_vect(z);
1784 if (le_schema_en_temps->impr_diffusion_implicite()) Cout <<
"Residu(0)=" << initial_residual << finl;
1785 double seuil = seuil_diffusion_implicite * seuil_diffusion_implicite;
1788 if (initial_residual > seuil)
1789 seuil = seuil_diffusion_implicite * initial_residual;
1791 double residual = seuil;
1792 double prodrz_old = mp_prodscal(residu, z);
1794 if (size_terme_mul) pp=p;
1798 if (initial_residual != 0)
1799 while (niter++ <= nmax)
1804 solveur_masse->appliquer(resu);
1806 if (aCKN!=1) resu *= aCKN;
1809 for (
int i = 0; i < size_terme_mul; i++)
1810 pp(i) = p(i) * terme_mul(i);
1811 resu.
ajoute(1. / dt, pp, VECT_REAL_ITEMS);
1814 resu.
ajoute(1. / dt, p, VECT_REAL_ITEMS);
1815 double alfa = prodrz_old / mp_prodscal(resu, p);
1817 solution.
ajoute(alfa, p, VECT_REAL_ITEMS);
1818 residu.
ajoute(alfa, resu, VECT_REAL_ITEMS);
1821 diag_.multvect(residu, z);
1825 residual = local_carre_norme_vect(z);
1826 double prodrz_new = local_prodscal(residu, z);
1828 if (le_schema_en_temps->impr_diffusion_implicite())
1829 Cout <<
"Iteration n=" << niter <<
" Residu(n)/Residu(0)=" << residual / initial_residual << finl;
1835 p *= (prodrz_new / prodrz_old);
1837 prodrz_old = prodrz_new;
1842 <<
"Already 100 iterations of the conjugate gradient solver used for diffusion implicited algorithm."
1845 <<
"The calculation is diverging, may be because of incorrect initial and/or boundary conditions for the equation "
1848 <<
"You may also try to stop the calculation and rerun it with a lower facsec, say 0.9 or may be less: 0.5."
1853 if ((le_schema_en_temps->no_error_if_not_converged_diffusion_implicite() == 0) && (niter > nmax))
1855 Cerr <<
"No convergence of the implicited diffusion algorithm for the equation " <<
que_suis_je() <<
" in "
1856 << nmax <<
" iterations." << finl;
1857 Cerr <<
"Residue : " << residual <<
" Threshold : " << seuil << finl;
1858 Cerr <<
"======================================================================================" << finl;
1859 Cerr <<
"The problem is post processed to help you to see where the non convergence is located." << finl;
1864 Cerr <<
"The problem " <<
probleme().
le_nom() <<
" has been saved too." << finl;
1868 Cout <<
"Diffusion operator implicited for the equation " <<
que_suis_je()
1869 <<
" : Conjugate gradient converged in " << niter <<
" iterations." << finl;
1875 matvec(
inconnue().valeurs(), resu);
1881 statistics().end_count(STD_COUNTERS::implicit_diffusion);
1896 return liste_modeles_(0);
1904 if (champ_conserve_) champ_conserve_->
avancer(i);
1905 if (champ_convecte_) champ_convecte_->
avancer(i);
1911 if (champ_conserve_) champ_conserve_->
reculer(i);
1912 if (champ_convecte_) champ_convecte_->
reculer(i);
1917#define BLOQUE Cerr<<__PRETTY_FUNCTION__<< " "<<__FILE__<<":"<<(int)__LINE__<<" not coded, retrieves coding simpler" <<finl;exit()
1980 bool isInit =
false;
2052 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
2054 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
2098 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
2100 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
2103 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
2105 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
2113 Cerr <<
"Unknown value in Equation_base::assembler for " << (int)type_codage << finl;
2129 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
2133 statistics().end_count(STD_COUNTERS::matrix_assembly);
2161 for (
auto && i_m : matrices) i_m.second->get_set_coeff() = 0;
2166 statistics().end_count(STD_COUNTERS::ajouter_blocs,0,0);
2168 statistics().begin_count(STD_COUNTERS::source_terms,statistics().get_last_opened_counter_level()+1);
2170 les_sources(i)->ajouter_blocs(matrices, secmem, semi_impl);
2172 statistics().end_count(STD_COUNTERS::source_terms);
2175 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
2179 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
2186 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
2194 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
2197 statistics().end_count(STD_COUNTERS::ajouter_blocs);
2203 if (champ_conserve_)
return;
2209 champ_conserve_->associer_eqn(*
this);
2211 champ_conserve_->nommer(nom_fonc.first);
2212 champ_conserve_->init_champ_calcule(*
this, nom_fonc.second);
2221 ConstDoubleTab_parts part(inco.
valeurs());
2224 if (coeff) tab_multiply_any_shape(val, coeff->valeurs(), VECT_ALL_ITEMS);
2227 if (coeff) tab_multiply_any_shape(bval, coeff->valeur_aux_bords(), VECT_ALL_ITEMS);
2230 if (coeff) der = coeff->valeurs();
2240 for (
int i=0; i<size; i++)
2243 fic << residu_(i) << tab;
2245 double residual_limit = ( nb_unknowns == 0 ? DMAXFLOAT : DMAXFLOAT/nb_unknowns);
2246 if (residu_(i)>residual_limit)
2249 Cerr <<
"Equation " <<
le_nom() <<
" is diverging:" << finl;
2250 Cerr <<
"A residual ||dI/dt|| for this equation is bigger than " << residual_limit <<
" !" << finl;
2251 Cerr <<
"Have a look at the " <<
nom_du_cas() <<
".dt_ev file." << finl;
2258 double vmax = mp_max_vect(
inconnue().valeurs());
2259 double vmin = mp_min_vect(
inconnue().valeurs());
2269 int size = residu_.size_array();
2270 Nom tmp(
""),ajout(
"");
2276 for (
int i=0; i<size; i++)
2281 if(norm !=
"max") tmp+=
"-norm";
2316 residu_.resize(size);
2317 residu_initial_.resize(size);
2327 DoubleTab& tab = field_residu_->valeurs();
2332 ConstDoubleTab_parts parts(residual);
2341 Cerr<<
"The method operateur_fonctionnel is not coded for equation "<<
que_suis_je()<<finl;
2348 Cerr<<
"The method operateur_fonctionnel is not coded for equation "<<
que_suis_je()<<finl;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
virtual void associer_domaine_cl_dis(const Domaine_Cl_dis_base &)
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
void resetTime(double time) override
double changer_temps(const double temps) override
Fixe le temps du champ.
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the field to save/restore.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual void associer_eqn(const Equation_base &)
Associe le champ a l'equation dont il represente une inconnue.
virtual void verifie_valeurs_cl()
int sauvegarder(Sortie &) const override
Sauvegarde le champ inconnue sur un flot de sortie.
Champ_Inc_base & avancer(int i=1)
Avance le pointeur courant de i pas de temps, dans la liste des valeurs temporelles conservees.
Champ_Inc_base & reculer(int i=1)
Recule le pointeur courant de i pas de temps, dans la liste des valeurs temporelles conservees.
int reprendre(Entree &) override
Lecture d'un champ inconnue a partir d'un flot d'entree en vue d'une reprise.
DoubleTab valeur_aux_bords() const override
renvoie la valeur du champ aux faces de bord
double changer_temps_futur(double, int i=1)
Fixe le temps du ieme champ futur.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Champ_base & affecter(const Champ_base &)
Affecter un champ dans un autre.
double temps() const
Renvoie le temps du champ.
virtual void abortTimeStep()
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
int compatible_avec_eqn(const Equation_base &) const
Renvoie si TOUTES les conditions aux limites du vecteurs sont compatibles avec l'equation passee en p...
int compatible_avec_discr(const Discretisation_base &) const
Renvoie si TOUTES les conditions aux limites du vecteurs sont compatibles avec la discretisation pass...
static void verifier(const char *const msg, double)
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
static void creer_champ(OWN_PTR(Champ_Inc_base)&ch, const Domaine_dis_base &z, const Nom &type, const Nom &nom, const Nom &unite, int nb_comp, int nb_ddl, int nb_pas_dt, double temps, const Nom &directive=NOM_VIDE, const Nom &nom_discretisation=NOM_VIDE)
Methode statique qui cree un OWN_PTR(Champ_Inc_base) du type specifie.
virtual Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operteur, const Equation_base &eqn, const OBS_PTR(Champ_base)&champ_supp=OBS_PTR(Champ_base)()) const
remplit le Nom type en focntion de la classe de operateur, du type de l'operateur et de l'equation
virtual type_calcul_du_residu codage_du_calcul_du_residu() const
@ VIA_CONTRIBUER_AU_SECOND_MEMBRE
virtual void residu(const Domaine_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
void calculer_derivee_en_temps(double t1, double t2)
Calcule le taux d'accroissement des CLs instationnaires entre t1 et t2.
virtual void imposer_cond_lim(Champ_Inc_base &, double)=0
void set_temps_defaut(double temps)
Change le i-eme temps futur de toutes les CLs.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
int avancer(double temps)
Tourne la roue des CLs jusqu'au temps donne.
void changer_temps_futur(double temps, int i)
Change le i-eme temps futur de toutes les CLs.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
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 int equation_non_resolue() const
Matrice_Morse matrice_stockee
virtual void dimensionner_termes_croises(Matrice_Morse &matrice, const Probleme_base &autre_pb, int nl, int nc)
virtual void ajouter_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, DoubleTab &resu) const
virtual void set_param(Param &titi) const override
const Nom & le_nom() const override
Renvoie le nom de l'equation.
virtual void associer_milieu_equation()
virtual Entree & lire_cond_init(Entree &)
Lecture des conditions initiales dans un flot d'entree.
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
virtual const Milieu_base & milieu() const =0
DoubleTab & derivee_en_temps_conv(DoubleTab &, const DoubleTab &)
Add convection term In: solution is the unknown I.
virtual const RefObjU & get_modele(Type_modele type) const
virtual void avancer(int i=1)
virtual void associer_domaine_dis(const Domaine_dis_base &)
Associe le domaine discretise a l'equation.
void set_residuals(const DoubleTab &residual)
void nommer(const Nom &nom) override
Methode appelee lorsqu'on cree l'instance de l'objet dans le jeu de donnees (Interprete::ajouter).
virtual void dimensionner_matrice_sans_mem(Matrice_Morse &mat_morse)
virtual int verif_Cl() const
Verifie la compatibilite des conditions limites avec l'equation.
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the data to save/restore. This has to be overrode f...
virtual void imprimer(Sortie &os) const
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
virtual void associer_pb_base(const Probleme_base &)
S'associe au Probleme passe en parametre.
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
void set_calculate_time_derivative(int i)
OWN_PTR(Parametre_equation_base) ¶metre_equation()
virtual void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={})
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
void init_champ_conserve() const
Champ_Inc_base & champ_conserve() const
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual void valider_iteration()
methode virtuelle permettant de corriger l'onconnue lors d'iterations implicites par exemple K-eps do...
virtual void mettre_a_jour_champs_conserves(double temps, int reset=0)
virtual const Champ_Inc_base & inconnue() const =0
Nom create_polymacfamily_syno(const Nom &field_tag) const
Create a synonym of a field name in order to ensure backward compatibility with old names of the Poly...
OBS_PTR(Schema_Temps_base) le_schema_en_temps
const Champ_base & get_champ(const Motcle &nom) const override
virtual Entree & lire_cl(Entree &)
Lecture des conditions limites sur un flot d'entree.
virtual DoubleTab & corriger_derivee_expl(DoubleTab &)
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual void contribuer_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, Matrice_Morse &matrice) const
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual int impr(Sortie &os) const
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
virtual void abortTimeStep()
Reinitialiser ce qui doit l'etre.
virtual void assembler_avec_inertie(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
int calculate_time_derivative() const
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
virtual int nombre_d_operateurs() const =0
Champs_Fonc list_champ_combi
virtual double get_time_factor() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
virtual void imprime_residu(SFichier &)
virtual int nombre_d_operateurs_tot() const
virtual bool updateGivenFields()
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual std::pair< std::string, fonc_calc_t > get_fonc_champ_conserve() const
void initialise_residu(int=0)
virtual void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
virtual void modifier_pour_Cl(Matrice_Morse &mat_morse, DoubleTab &secmem) const
virtual DoubleTab & derivee_en_temps_inco(DoubleTab &)
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual const Champ_Inc_base & derivee_en_temps() const
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual void verifie_ch_init_nb_comp(const Champ_Inc_base &ch_ref, const int nb_comp) const
Verification du nombre de composantes lues pour la specification d un champ.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
virtual void associer_sch_tps_base(const Schema_Temps_base &)
S'associe au schema_en_temps.
virtual void reculer(int i=1)
virtual DoubleTab & corriger_derivee_impl(DoubleTab &)
int limpr() const
Demande au schema en temps si il faut effectuer une impression.
void creer_champ(const Motcle &motlu) override
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
void Gradient_conjugue_diff_impl(DoubleTrav &secmem, DoubleTab &solution)
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
virtual void dimensionner_matrice(Matrice_Morse &mat_morse)
virtual const Operateur & operateur_fonctionnel(int) const
virtual void discretiser()
Discretise l'equation.
void calculer_pas_de_temps_locaux(DoubleTab &) const
virtual Entree & lire_sources(Entree &)
Lecture des termes sources dans un flot d'entree.
virtual int has_interface_blocs() const
virtual void resetTime(double time)
Reset current time of the equation. Used from ICoCo. See documentation of Problem_base::resetTime().
Champs_compris champs_compris_
virtual void assembler_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const
virtual const Operateur & operateur(int) const =0
static void calculer_champ_conserve(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
virtual Champ_Inc_base & champ_convecte() const
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
virtual const Motcle & domaine_application() const
Renvoie "indetermine" Navier_Stokes_standard par exemple surcharge cette methode.
virtual double calculer_pas_de_temps() const
Calcul du prochain pas de temps.
virtual Nom expression_residu()
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
const Nom & nom_compo(int) const
Renvoie le nom de la ieme composante du champ.
virtual Nature_du_champ nature_du_champ() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
Classe Matrice_Base Classe de base de la hierarchie des matrices.
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void clean() override
Remplit la matrice avec des zeros.
int ordre() const override
Renvoie l'ordre de la matrice: - le nombre de lignes si la matrice est carree.
bool & constant_stencil() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
void set_nb_columns(const int)
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
void set_est_definie(int)
virtual void associer_equation(const Equation_base *eqn) const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void associer_eqn(const Equation_base &)
Associe une equation a l'objet.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual int debute_par(const char *const n) const
const std::string & getString() const
const Nom & le_nom() const override
Renvoie *this;.
Un tableau de chaine de caracteres (VECT(Nom)).
classe Objet_U Cette classe est la classe de base des Objets de TRUST
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.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Classe Op_Conv_negligeable Cette classe represente un opperateur de convection negligeable.
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
virtual void ajouter_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, DoubleTab &resu) const
virtual void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const
DOES NOTHING - to override in derived classes.
const SolveurSys & get_solveur() const
void creer_champ(const Motcle &motlu) override
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
SolveurSys & set_solveur()
virtual int has_interface_blocs() const
void tester_contribuer_a_avec(const DoubleTab &, const Matrice_Morse &)
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
int get_decal_temps() const
virtual void preparer_calcul()
virtual void dimensionner_termes_croises(Matrice_Morse &, const Probleme_base &autre_pb, int nl, int nc) const
virtual void dimensionner(Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
const Matrice & get_matrice() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={ }) const
virtual void contribuer_au_second_membre(DoubleTab &) const
DOES NOTHING - to override in derived classes.
virtual void resetTime(double time)
virtual void abortTimeStep()
virtual int systeme_invariant() const
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
virtual void contribuer_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, Matrice_Morse &matrice) const
classe Operateur Classe generique de la hierarchie des operateurs.
virtual Operateur_base & l_op_base()=0
double calculer_pas_de_temps() const
Calcule le prochain pas de temps.
int impr(Sortie &os) const
Imprime l'operateur sur un flot de sortie de facon inconditionnelle.
virtual DoubleTab & calculer(const DoubleTab &, DoubleTab &) const =0
virtual void mettre_a_jour(double temps)
Effecttue une mise a jour en temps de l'operateur.
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const =0
virtual void completer()
Met a jour les references des objets associes a l'operateur.
void calculer_pas_de_temps_locaux(DoubleTab &) const
Calculate the next local time steps.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
classe Parametre_diffusion_implicite Un objet Parametre_diffusion_implicite est un objet regroupant l...
const int & nb_it_max() const
const int & crank() const
const double & seuil_diffusion_implicite() const
const int & precoditionnement_diag() const
classe Parametre_implicite Un objet Parametre_implicite est un objet regroupant les differentes
bool & calcul_explicite()
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
int postraiter(int force=1) override
Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps du probleme.
virtual void finir()
Finit le postraitement et sauve le probleme dans un fichier.
static void mp_sum_for_each(T &arg1, T &arg2)
C++14 compatible mp_sum_for_each: combine multiple mp_sum calls into one collective operation Usage: ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
: classe Schema_Euler_explicite Cette classe represente un schema en temps d'Euler explicite: U(n+1) ...
class Schema_Implicite_base Classe de base pour tous les schemas en temps implicite
int diffusion_implicite() const
Renvoie 1 si le schema en temps a ete lu diffusion_implicite.
int limpr() const
Renvoie 1 s'il y a lieu d'effectuer une impression (cf dt_impr) Renvoie 0 sinon.
int & set_stationnaire_atteint()
double temps_courant() const
Renvoie le temps courant.
const Nom & norm_residu() const
virtual void ajouter_inertie(Matrice_Base &mat_morse, DoubleTab &secmem, const Equation_base &eqn) const
virtual double temps_futur(int i) const =0
double pas_temps_max() const
Renvoie le pas de temps maximum.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const Equation_base &eqn, const tabs_t &semi_impl={}) const
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual int nb_valeurs_futures() const =0
virtual void modifier_second_membre(const Equation_base &eqn, DoubleTab &secmem)
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
double temps_init() const
Renvoie le temps initial.
virtual double temps_defaut() const =0
virtual void completer()=0
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
void set_penalisation_flag(int pen)
virtual void dimensionner(Matrice_Morse &matrix) const
const Nom & get_name_of_coefficient_temporel() const
int has_coefficient_temporel() const
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual Matrice_Base & ajouter_masse(double dt, Matrice_Base &matrice, int penalisation=1) const
virtual DoubleTab & corriger_solution(DoubleTab &x, const DoubleTab &y, int incr=0) const
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
virtual int has_interface_blocs() const
Classe de base des flux de sortie.
class Source_dep_inco_base Les sources heritant de cette clase doivent coder ajouter_ de facon a perm...
class Sources Sources represente une liste de Source.
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
contribution a la matrice implicite des termes sources par defaut pas de contribution
DoubleTab & ajouter(DoubleTab &) const
Ajoute la contribution de toutes les sources de la liste au tableau passe en parametre,...
_SIZE_ size_array() const
virtual void ref(const TRUSTTab &)
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
void copy(const TRUSTTab &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
_SIZE_ size_reelle_ok() const
void ajoute(_SCALAR_TYPE_ alpha, const TRUSTVect &y, Mp_vect_options opt=VECT_ALL_ITEMS)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
static int is_PDI_restart()