35 const DoubleTab& k_passe = ch_k.
passe();
37 const DoubleVect& ve = domaine.volumes();
40 const DoubleTab& diss_passe = ch_diss.
passe();
41 const DoubleTab& diss = ch_diss.
valeurs();
43 const int nf_tot = domaine.nb_faces_tot();
45 const int ne = domaine.nb_elem();
46 const int ne_tot = domaine.nb_elem_tot();
49 const std::string Type_diss = get_dissipation_type(
equation());
50 Matrice_Morse *Mdiss = matrices.count(Type_diss) ? matrices.at(Type_diss) :
nullptr;
52 assert(N == 1 || k_passe.
line_size() == 1);
56 DoubleTab grad_f_diss(nf_tot, N);
60 Op_Grad_diss.
calculer(diss_passe, grad_f_diss);
64 DoubleTab grad_f_k(nf_tot, N);
68 Op_Grad_k.
calculer(k_passe, grad_f_k);
71 DoubleTab grad_e_diss(ne_tot, N, D);
72 DoubleTab grad_e_k(ne_tot, N, D);
73 face_to_elem_VDF(domaine, grad_f_diss, grad_e_diss);
74 face_to_elem_VDF(domaine, grad_f_k, grad_e_k);
78 DoubleTab grad_diss_dot_grad_k(ne, N);
79 for (
int n = 0; n < N; n++)
80 for (
int e = 0; e < ne; e++)
82 grad_diss_dot_grad_k(e, n) = 0;
83 for (
int d = 0; d < D; d++)
84 grad_diss_dot_grad_k(e, n) += grad_e_diss(e, n, d) * grad_e_k(e, n, d);
89 for (
int e = 0; e < ne; e++)
90 for (
int n = 0; n < N; n++)
92 const double peve = pe(e) * ve(e);
94 if (Type_diss ==
"tau")
97 const double dot_min = std::min(grad_diss_dot_grad_k(e, n), 0.);
98 secmem(e, n) += peve *
sigma_d_ * diss(e, n) * dot_min;
102 (*Mdiss)(N * e + n, N * e + n) -= peve *
sigma_d_ * dot_min;
104 else if (Type_diss ==
"omega")
106 if (diss(e, n) > 1.e-8)
109 const double dp = std::max(diss_passe(e, n), 1.e-6);
110 const double dot_max = std::max(grad_diss_dot_grad_k(e, n), 0.);
111 secmem(e, n) += peve *
sigma_d_ / dp * (2 - diss(e, n) / dp) * dot_max;
115 (*Mdiss)(N * e + n, N * e + n) -= peve *
sigma_d_ * (-1 / (dp * dp)) * dot_max;