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;
class Champ_Don_base base class of Given Fields (not calculated)
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & remplir_coord_noeuds(DoubleTab &) const =0
class Champ_base This class is the base of the fields hierarchy.
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()
Returns the discretized domain associated with the equation.
const Nom & le_nom() const override
Returns the name of the field.
Matrice_Base class - Base class of the matrix hierarchy.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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
Returns the reference to the equation pointed to by MorEqn::mon_equation.
OBS_PTR(Equation_base) mon_equation
class Nom: a character string for naming TRUST objects.
const std::string & getString() const
Base class for TRUST objects (Objet_U).
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
static double mp_max(double)
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Solveur_Masse_base Represents the mass matrix of an 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
Returns appliquer_impl(x/temporal_coefficient) if a temporal coefficient is set, otherwise returns ap...
void set_name_of_coefficient_temporel(const Nom &)
Allows choosing the name of the temporal coefficient to use for apply.
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
Base class for output streams.
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")