16#include <Solveur_Masse_base.h>
17#include <TRUSTTab_parts.h>
18#include <Equation_base.h>
19#include <Champ_Uniforme.h>
20#include <Matrice_Morse.h>
27Solveur_Masse_base::Solveur_Masse_base() : has_coefficient_temporel_(0), penalisation_flag_(1), penalisation_(0) {}
70 if (name ==
"no_coeff")
102 values = coeff.valeurs();
107 values.
ref(coeff.valeurs());
113 values.
ref(coeff.valeurs());
120 ref_coeff->valeur_aux(nodes,values);
125 DoubleTab_parts values_parts(values);
126 tab_divide_any_shape(x, values_parts[0], VECT_REAL_ITEMS);
138 DoubleTrav inco(
equation().inconnue().valeurs());
143 DoubleTrav tab_diag(
equation().inconnue().valeurs());
148 if(penalisation_flag)
150 ToDo_Kokkos(
"critical");
151 if (penalisation_==0)
154 for(
int i=0; i<sz; i++)
155 penal=std::max(penal, matmo(i,i));
157 penalisation_=(mp_max_vect(tab_diag)/dt + penal)*1.e3;
160 for(
int i=0; i<sz; i++)
162 if (tab_diag.
addr()[i]==0)
166 matmo(i,i)+=penalisation_;
169 matmo(i,i)+=penalisation_/dt;
172 matmo(i,i)+=1./(tab_diag.
addr()[i]*dt);
177 CDoubleArrView diag =
static_cast<const ArrOfDouble&
>(tab_diag).view_ro();
178 Matrice_Morse_View mat;
180 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), sz, KOKKOS_LAMBDA(
184 mat.add(i, i, 1. / (diag(i) * dt));
186 end_gpu_timer(__KERNEL_NAME__);
203 const DoubleTab* py = &tab_y;
214 tab_diag.
copy(
equation().inconnue().valeurs(), RESIZE_OPTIONS::NOCOPY_NOINIT);
217 if (penalisation_flag)
219 if (penalisation_==0)
220 penalisation_ = mp_max_vect(tab_diag)*1.e3;
225 double penalisation = penalisation_;
226 CDoubleArrView diag =
static_cast<const ArrOfDouble&
>(tab_diag).view_ro();
227 CDoubleArrView y =
static_cast<const ArrOfDouble&
>(*py).view_ro();
228 DoubleArrView x =
static_cast<ArrOfDouble&
>(tab_x).view_rw();
229 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), sz, KOKKOS_LAMBDA(
const int i)
232 x(i)=penalisation*y(i);
234 x(i)+=1./(diag(i)*dt)*y(i);
236 end_gpu_timer(__KERNEL_NAME__);
245 DoubleTrav diag(
equation().inconnue().valeurs());
251 if (penalisation_==0)
254 for(
int i=0; i<sz; i++)
255 penal=std::max(penal, matmo(i,i));
257 penalisation_=(mp_max_vect(diag)/dt_locaux.
local_max_vect() + penal)*1.e3;
263 ToDo_Kokkos(
"critical");
264 for(
int i=0; i<sz; i++)
266 if (diag.
addr()[i]==0)
270 matmo(i,i)+=penalisation_;
273 matmo(i,i)+=penalisation_/dt_locaux[i];
276 matmo(i,i)+=1./(diag.
addr()[i]*dt_locaux[i]);
285 diag.
copy(
equation().inconnue().valeurs(), RESIZE_OPTIONS::NOCOPY_NOINIT);
290 if (penalisation_==0)
291 penalisation_ = mp_max_vect(diag)*1.e3;
295 ToDo_Kokkos(
"critical");
296 for(
int i=0; i<sz; i++)
298 if (diag.
addr()[i]==0)
299 x.
addr()[i]=penalisation_*y.
addr()[i];
301 x.
addr()[i]+=1./(diag.
addr()[i]*dt_locaux[i])*y.
addr()[i];
309 int sz=dt_locaux.
size();
311 diag.
copy(
equation().inconnue().valeurs(), RESIZE_OPTIONS::NOCOPY_NOINIT);
316 if (penalisation_==0)
317 penalisation_ = mp_max_vect(diag)*1.e3;
321 ToDo_Kokkos(
"critical");
322 for(
int i=0; i<sz; i++)
324 if (diag.
addr()[i]==0)
327 m_dt_locaux[i]=(1./diag.
addr()[i])*dt_locaux[i];
338 int sz=dt_locaux.
size();
340 diag.
copy(
equation().inconnue().valeurs(), RESIZE_OPTIONS::NOCOPY_NOINIT);
345 if (penalisation_==0)
346 penalisation_ = mp_max_vect(diag)*1.e3;
350 ToDo_Kokkos(
"critical");
351 for(
int i=0; i<sz; i++)
353 if (diag.
addr()[i]==0)
356 m_dt_locaux[i]=(1./diag.
addr()[i])/dt_locaux[i];
368 DoubleTrav tab_diag(
equation().inconnue().valeurs());
375 CDoubleArrView diag =
static_cast<const ArrOfDouble&
>(tab_diag).view_ro();
376 CDoubleArrView y =
static_cast<const ArrOfDouble&
>(tab_y).view_ro();
377 DoubleArrView x =
static_cast<ArrOfDouble&
>(tab_x).view_wo();
378 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), sz, KOKKOS_LAMBDA(
const int i)
383 end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
387 for(
int i=0; i<sz; i++)
388 if (tab_diag.
addr()[i]<1.e-12)
408 IntTab indice(size, 2);
409 for(
int i=0; i<size; ++i)
411 indice(i,0) = indice(i,1) = i;
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
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & remplir_coord_noeuds(DoubleTab &) const =0
classe Champ_base Cette classe est la base de la hierarchie des champs.
static void verifier(const char *const msg, double)
virtual void apply_old_to_new_volume_scaling(DoubleTab &tab, const Domaine_dis_base &dvf) const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Champ_Inc_base & inconnue() const =0
const Champ_base & get_champ(const Motcle &nom) const override
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 Matrice_Base Classe de base de la hierarchie des matrices.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
int nb_lignes() const override
Return local number of lines (=size on the current proc).
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
OBS_PTR(Equation_base) mon_equation
class Nom Une chaine de caractere pour nommer les objets de TRUST
const std::string & getString() const
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.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static double mp_max(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
virtual void dimensionner(Matrice_Morse &matrix) const
virtual void assembler()
DOES NOTHING.
virtual Matrice_Base & ajouter_masse_dt_local(DoubleVect &dt_locaux, Matrice_Base &matrice, int penalisation=1) const
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual void get_masse_divide_by_local_dt(DoubleVect &m_dt_locaux, DoubleVect &dt_locaux, int penalisation=1)
virtual void get_masse_dt_local(DoubleVect &m_dt_locaux, DoubleVect &dt_locaux, int penalisation=1)
virtual Matrice_Base & ajouter_masse(double dt, Matrice_Base &matrice, int penalisation=1) const
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
int has_coefficient_temporel_
virtual DoubleTab & corriger_solution(DoubleTab &x, const DoubleTab &y, int incr=0) const
virtual void preparer_calcul()
virtual void resetTime(double temps)
DOES NOTHING - to override in derived classes.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
void set_name_of_coefficient_temporel(const Nom &)
permet de choisir le nom du coefficient temporelle que l'on veut utiliser pour appliquer
Nom name_of_coefficient_temporel_
virtual int has_interface_blocs() const
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, double dt, const tabs_t &semi_impl, int resoudre_en_increments) const
Classe de base des flux de sortie.
virtual void ref(const TRUSTTab &)
_SIZE_ dimension_tot(int) const override
void copy(const TRUSTTab &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_TYPE_ local_max_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")