16#include <Domaine_Cl_dis_base.h>
17#include <Schema_Temps_base.h>
18#include <Source_PDF_base.h>
19#include <Equation_base.h>
20#include <Probleme_base.h>
24#include <Interpolation_IBM_elem_fluid.h>
25#include <Interpolation_IBM_mean_gradient.h>
26#include <Interpolation_IBM_hybrid.h>
27#include <Interpolation_IBM_power_law_tbl.h>
28#include <Interpolation_IBM_power_law_tbl_u_star.h>
29#include <Interpolation_IBM_thermal_wall_law.h>
61 param.lire_avec_accolades(s);
62 if (interpolation_lue_)
64 if (!(interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_aucune"))
67 if ((interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_power_law_tbl") || (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_power_law_tbl_u_star") )
imm_wall_law_ =
true;
68 interpolation_lue_->set_source(*
this);
75 Cerr <<
"You are using a " <<
que_suis_je() <<
" source term but your problem is not an IBM problem !" << finl;
76 Cerr <<
"Fix your data set and use one of the following problems : " << finl;
81 for (
auto &itr : noms_pb)
82 if (itr.contient(
"_IBM"))
83 Cerr <<
" - " << itr << finl;
85 Cerr <<
" - Pb_Couple_Optimisation_IBM" << finl;
102 prepro_lu_->associer_pb(pb);
113 int nb_comp=dim_esp*dim_esp;
115 Noms unites(nb_comp);
123 if (champ_rotation_lu_)
129 Cerr<<
"Source_PDF_base::associer_pb: rotation term is missing "<<finl;
135 int nb_comp0=dim_esp;
136 Noms nom_c0(nb_comp0);
137 Noms unites0(nb_comp0);
145 if (champ_barycentre_lu_)
158 if (
equation().discretisation().is_ef())
167 champ_aire_->valeurs() = prepro_lu_->get_champ_aire();
177 Cerr<<
"Source_PDF_base::associer_pb: aire term is missing "<<finl;
186 Noms nom_c11(nb_comp);
187 Noms unites11(nb_comp);
193 Motcle directive(
"temperature");
194 if (
equation().inconnue().is_vectorial()) directive=
"vitesse";
205 interpolation_lue_->discretise(pb.
discretisation(),le_dom_dis_base);
235 for (
int ele=0; ele<nb_case; ele++)
236 for (
int k=0; k<dim_esp; k++)
237 for (
int i=k+1; i<dim_esp; i++)
239 double tmp=val(ele,3*k+i);
240 val(ele,3*k+i)=val(ele,3*i+k);
253 if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_gradient_moyen" || interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_power_law_tbl_u_star")
279 modele_lu_.affecter_variable_imposee(le_dom_VF, coords);
284 if (nb_comp != dim_esp)
286 Cerr<<
"Source_PDF_base::calcul_variable_imposee: dimension variable differente "<<dim_esp<<
"! "<<finl;
316 const Domaine& le_dom = le_dom_dis.
domaine();
321 const IntTab& elems = le_dom.
les_elems() ;
322 const IntTab& elem_face = the_dom_VF.
elem_faces();
325 assert (elem_voisins.
size() == nb_elem_tot);
326 for (
int num_elem = 0; num_elem < nb_elem_tot; num_elem++) elem_voisins[num_elem].vide();
328 for (
int num_elem = 0; num_elem < nb_elem_tot; num_elem++)
330 if (aireArray(num_elem) > 0.)
332 if (!elem_voisins[num_elem].est_vide())
334 Cerr<<
"IBM : Source_PDF_base::compute_NeighNode_IBM_elem: Neighbour liste is not empty for element "<<num_elem<<
" : Abort"<<finl;
339 IntList node_of_elem;
341 for (
int nod=0; nod<nb_som_elem; nod++)
343 int nod_glob = elems(num_elem, nod);
346 for (
int fac=0; fac<nb_faces_elem; fac++)
348 int num_fac = elem_face(num_elem, fac);
350 for (
int voisin=0; voisin<2; voisin++)
352 int num_elem_v = face_voisins(num_fac,voisin);
353 if ( (num_elem_v!=-1) && (num_elem_v!=num_elem) )
355 if (aireArray(num_elem_v) > 0. || all_elem_vois) elem_voisins[num_elem].add_if_not(num_elem_v);
362 for (
int fac_v=0; fac_v<nb_faces_elem; fac_v++)
364 int num_fac_v = elem_face(num_elem_v, fac_v);
365 for (
int voisin_v=0; voisin_v<2; voisin_v++)
367 int num_elem_v_v = face_voisins(num_fac_v,voisin_v);
368 if ( (num_elem_v_v!=-1) && (num_elem_v_v!=num_elem_v) && (num_elem_v_v!=num_elem) )
370 if (aireArray(num_elem_v_v) > 0. || all_elem_vois)
373 for (
int nod_v_v=0; nod_v_v<nb_som_elem; nod_v_v++)
375 int num_nod_v_v = elems(num_elem_v_v, nod_v_v);
376 if (node_of_elem.
contient(num_nod_v_v)) iok = 1;
379 if (iok == 1) elem_voisins[num_elem].add_if_not(num_elem_v_v);
401 const Domaine& dom = le_dom_dis.
domaine();
406 DoubleTrav hmax(dim_esp);
407 for (
int k=0; k < dim_esp; k++)
410 double xmax = -1.e30;
411 for (
int id_loc=0; id_loc < nb_som_elem; id_loc++)
413 int id_glob = elems(elem,id_loc);
414 xmin = std::min(xmin, coordsDom3D(id_glob, k));
415 xmax = std::max(xmax, coordsDom3D(id_glob, k));
420 for (
int k=0; k<dim_esp; k++) hcharac += hmax(k) * abs(rotation(elem,3*k+(dim_esp-1)));
421 hcharac = abs(hcharac);
423 double aire = the_dom_VF.
volumes(elem) / hcharac;
438 Cerr <<
"Source_PDF_base::update_pseudo_level_set_IBM: No Interpolation. Aborting..." << finl;
443 Cerr <<
"Source_PDF_base::update_pseudo_level_set_IBM: No IBM prepro. Aborting..." << finl;
448 assert(dim_esp == 3);
462 assert (vecteur_deplacement.
dimension(0) == nb_som);
463 assert (vecteur_deplacement.
dimension(1) == dim_esp);
467 const Domaine& dom = le_dom_dis.
domaine();
474 for (
int e=0; e<nb_elem; e++)
477 for (
int il=0; il<nb_som_elem; il++)
480 if (level_set(i) == -99999.)
486 for (
int k=0; k<dim_esp; k++) nor_nor += nor(i, k)*nor(i, k);
487 if (nor_nor <= 1.e-10) nb_nor_nul += 1;
489 if ( nb_nor_nul == nb_som_elem )
490 for (
int il=0; il<nb_som_elem; il++) level_set(elems(e,il)) = -99999.;
494 DoubleTrav grad_phi_e_0(nb_elem,dim_esp) ;
495 DoubleTrav grad_phi_i_0(nb_som,dim_esp) ;
496 IntTrav contrib_i(nb_som);
499 for (
int e=0; e<nb_elem; e++)
501 int initialised_vertex_in_e = 1;
502 if (e == etarg) Cerr<<
">>> elem = "<<e<<
" : grad phi"<<finl;
504 for (
int il=0; il<nb_som_elem; il++)
507 if (level_set(i) == -99999.)
509 initialised_vertex_in_e = 0;
512 int dir_grad_phi_0 = (level_set(i)<0.?-1:(level_set(i)==0.?0.:1));
514 for (
int k=0; k<dim_esp; k++) nor_nor += nor(i, k)*nor(i, k);
515 if (e == etarg) Cerr<<
"i = "<<i<<
" norme carree normal = "<<nor_nor<<
" dir_grad_phi_0 = "<<dir_grad_phi_0<<finl;
516 if (nor_nor > 1.e-10)
518 for (
int k=0; k<dim_esp; k++) grad_phi_e_0(e,k) += dir_grad_phi_0*nor(i, k);
525 for (
int k=0; k<dim_esp; k++) nor_nor += grad_phi_e_0(e,k)*grad_phi_e_0(e,k);
526 if (nor_nor > 1.e-10)
528 for (
int k=0; k<dim_esp; k++) grad_phi_e_0(e,k) /= sqrt(nor_nor);
532 if ( initialised_vertex_in_e == 0)
535 double level_set_ref = -99999.;
536 DoubleTrav XYZ_ref(dim_esp);
537 for (
int il=0; il<nb_som_elem; il++)
541 for (
int k=0; k<dim_esp; k++) nor_nor += nor(i, k)*nor(i, k);
542 if (level_set(i) != -99999. && nor_nor > 1.e-10)
544 level_set_ref = level_set(i) ;
545 for (
int k=0; k<dim_esp; k++) XYZ_ref(k) = coordsDom3D(i,k);
549 if (e == etarg) Cerr<<
"Vertex non initialise : level_set_ref = "<<level_set_ref<<finl;
551 for (
int il=0; il<nb_som_elem; il++)
554 if (level_set(i) == -99999.)
556 double prod_sca = 0.;
557 for (
int k=0; k<dim_esp; k++) prod_sca += (coordsDom3D(i,k)-XYZ_ref(k))*grad_phi_e_0(e,k);
558 level_set(i) = level_set_ref + prod_sca;
564 for (
int il=0; il<nb_som_elem; il++)
567 for (
int k=0; k<dim_esp; k++) grad_phi_i_0(i,k) += grad_phi_e_0(e,k);
574 for (
int il=0; il<nb_som_elem; il++)
577 Cerr<<
"i = "<<i<<
" ; old level set = "<<level_set(i)<<
" ; nor = ";
578 for (
int k=0; k<dim_esp; k++) Cerr<<nor(i,k)<<
" ";
579 Cerr<<
" ; deplacement = ";
580 for (
int k=0; k<dim_esp; k++) Cerr<<vecteur_deplacement(i,k)<<
" ";
583 Cerr<<
"grad_phi_e_0 = ";
584 for (
int k=0; k<dim_esp; k++) Cerr<<grad_phi_e_0(e,k)<<
" ";
590 for (
int i=0; i<nb_som; i++)
592 if (contrib_i(i) != 0)
594 for (
int k=0; k<dim_esp; k++) grad_phi_i_0(i,k) /=contrib_i(i);
598 for (
int k=0; k<dim_esp; k++) nor_nor += grad_phi_i_0(i,k)*grad_phi_i_0(i,k);
599 if (nor_nor > 1.e-10)
600 for (
int k=0; k<dim_esp; k++) grad_phi_i_0(i,k) /= sqrt(nor_nor);
606 IntTrav advect_faite(nb_som) ;
609 DoubleTrav new_normal_e(bary);
610 for (
int e=0; e<nb_elem; e++)
612 if (e == etarg) Cerr<<
">>> elem = "<<e<<
" : Advecte phi"<<finl;
613 double nor_nor_e_0 = 0.;
614 for (
int k=0; k<dim_esp; k++) nor_nor_e_0 += grad_phi_e_0(e,k)*grad_phi_e_0(e,k);
615 if (nor_nor_e_0 <= 1.0e-10)
continue;
617 double contrib_e = 0.;
618 for (
int il=0; il<nb_som_elem; il++)
622 if (advect_faite(i) == 0)
626 Cerr<<
" ** node = "<<i<<finl;
627 Cerr<<
" vecteur_deplacement = ";
628 for (
int k=0; k<dim_esp; k++) Cerr<<vecteur_deplacement(i,k)<<
" ";
632 if (level_set(i) != -99999.)
634 double vdotnorm = 0.0 ;
635 for (
int k=0; k<dim_esp; k++) vdotnorm += vecteur_deplacement(i,k)*grad_phi_i_0(i,k);
636 level_set(i) -= alpha*vdotnorm;
638 advect_faite(i) = (level_set(i)<0.?-1:1);
644 for (
int k=0; k<dim_esp; k++) Cerr<<nor(i,k)<<
" ";
646 Cerr<<
" new level set : "<<level_set(i)<<
" ; advect_faite = "<<advect_faite(i)<<finl;
647 Cerr<<
" grad_phi_i_0 = ";
648 for (
int k=0; k<dim_esp; k++) Cerr<<grad_phi_i_0(i,k)<<
" ";
654 for (
int k=0; k<dim_esp; k++)
655 bary(e,k) += coordsDom3D(i,k)-(level_set(i)*grad_phi_i_0(i,k));
659 Cerr<<
" ** node = "<<i;
660 Cerr<<
" ; new level set = "<<level_set(i);
661 Cerr<<
" ; coords = ";
662 for (
int k=0; k<dim_esp; k++) Cerr<<coordsDom3D(i,k)<<
" ";
664 Cerr<<
" Projection : ";
665 for (
int k=0; k<dim_esp; k++) Cerr<<coordsDom3D(i,k)-(level_set(i)*grad_phi_i_0(i,k))<<
" ";
670 for (
int k=0; k<dim_esp; k++) bary(e,k) /= contrib_e;
675 double level_ref = 0.;
676 for (
int il=0; il<nb_som_elem; il++)
679 if (level_set(i) != 0. && level_set(i) != -99999.)
681 level_ref = level_set(i);
687 for (
int il=0; il<nb_som_elem; il++)
690 if (level_set(i) != 0. && level_set(i) != -99999.)
692 iok = (level_ref*level_set(i) < 0. ? 1:0) ;
698 if (nor_nor_e_0 > 1.0e-10) iok += 1;
704 for (
int k=0; k<dim_esp; k++) new_normal_e(e, k) = grad_phi_e_0(e,k);
707 Cerr<<
"aire = "<<aire(e)<<finl;
708 Cerr<<
"new_bary_e = ";
709 for (
int k=0; k<dim_esp; k++) Cerr<<bary(e,k)<<
" ";
711 Cerr<<
"new_normal_e = ";
712 for (
int k=0; k<dim_esp; k++) Cerr<<new_normal_e(e,k)<<
" ";
717 for (
int k=0; k<dim_esp; k++) bary(e,k) =0.;
725 DoubleTrav t1EulerArr(bary);
726 DoubleTrav t2EulerArr(bary);
727 for (
int e=0; e<nb_elem; e++)
731 prepro_lu_->computeLocalFrame(new_normal_e, t1EulerArr, t2EulerArr, e);
732 prepro_lu_->computeMatRot(new_normal_e, t1EulerArr, t2EulerArr, e);
735 rotation = prepro_lu_->get_champ_rotation();
738 for (
int e=0; e<nb_elem; e++)
743 if (e == etarg) Cerr<<
"aire = "<<aire(e)<<finl;
753 prepro_lu_->compute_solid_fluid(1);
761 prepro_lu_-> Save_Med_File();
770 assert (dim_esp == 3);
772 DoubleTab& aire = ref_cast_non_const(DoubleTab,
champ_aire_->valeurs());
774 DoubleTab& rotation = ref_cast_non_const(DoubleTab,
champ_rotation_->valeurs());
777 const Domaine& dom = le_dom_dis.
domaine();
782 assert (nb_elem == vecteur_deplacement.
dimension(0));
783 assert (dim_esp == vecteur_deplacement.
dimension(1));
784 IntTab indic_dead_cell(nb_elem);
788 IntLists elem_voisins(nb_elem_tot);
792 IntTrav toward_new_elem(nb_elem);
795 DoubleTrav bary_zero(bary);
798 for (
int e=0; e<nb_elem; e++)
801 for (
int k=0; k<dim_esp; k++) norm_vd2 += vecteur_deplacement(e,k)*vecteur_deplacement(e,k);
804 for (
int k=0; k<dim_esp; k++) bary(e,k) = bary_zero(e,k) + alpha * vecteur_deplacement(e,k) ;
805 if (elem_voisins[e].size() >= 2 && sqrt(norm_vd2) > 1.e-10)
807 for (
int voi=0; voi<elem_voisins[e].
size(); voi++)
809 for (
int k=0; k<dim_esp; k++) bary(e,k) += alpha * raid * bary_zero((elem_voisins[e])[voi],k);
811 for (
int k=0; k<dim_esp; k++) bary(e,k) /= (1 + alpha * raid * elem_voisins[e].
size());
814 if (aire(toward_new_elem(e)) <= 0. ) indic_dead_cell(toward_new_elem(e)) = 1;
818 toward_new_elem(e) =-2;
824 DoubleTrav new_aire(aire);
825 DoubleTrav new_bary(bary);
826 DoubleTrav new_rotation(rotation);
827 IntTrav contrib(nb_elem);
829 for (
int e=0; e<nb_elem; e++)
831 if (toward_new_elem(e) == -1 )
833 Cerr<<
"Source_PDF_base::update_elem_IBM: element displacement is not valid."<<finl;
836 else if (toward_new_elem(e) == -2 )
841 for (
int k=0; k<dim_esp; k++) new_bary(toward_new_elem(e),k) += bary(e,k);
842 for (
int k=0; k<rotation.
dimension(1); k++) new_rotation(toward_new_elem(e),k) += rotation(e,k);
843 new_aire(toward_new_elem(e)) += aire(e);
844 contrib(toward_new_elem(e)) += 1;
850 int aire_geometriq_ok = 1;
852 for (
int e=0; e<nb_elem; e++)
856 for (
int k=0; k<dim_esp; k++) new_bary(e,k) /= contrib(e);
857 for (
int k=0; k<rotation.
dimension(1); k++) new_rotation(e,k) /= contrib(e);
859 if (aire_geometriq_ok)
861 else new_aire(e) /= contrib(e);
867 for (
int e=0; e<nb_elem; e++)
869 aire(e) = new_aire(e);
870 for (
int k=0; k<dim_esp; k++) bary(e,k) = new_bary(e,k);
871 for (
int k=0; k<rotation.
dimension(1); k++) rotation(e,k) = new_rotation(e,k);
879 IntLists elem_voisins_new(nb_elem_tot);
883 for (
int e=0; e<nb_elem_tot; e++)
885 if ( elem_voisins_new[e].size() < 2)
890 for (
int e_old=0; e_old<nb_elem_tot; e_old++)
891 if (toward_new_elem(e_old) == e) antecedents.
add_if_not(e_old);
896 for (
int ant=0; ant<antecedents.
size(); ant++)
900 int nb_vois_ant = elem_voisins[antecedents[ant]].
size();
901 for (
int vois_ant=0; vois_ant<nb_vois_ant; vois_ant++)
903 int old_vois = (elem_voisins[antecedents[ant]])[vois_ant];
906 for (
int vois_e=0; vois_e<elem_voisins_new[e].
size(); vois_e++)
907 if ( (elem_voisins_new[e])[vois_e] == toward_new_elem(old_vois) ) i_present = 1;
908 if ( (!i_present) && (toward_new_elem(old_vois) != e) ) to_link.
add_if_not(toward_new_elem(old_vois));
914 DoubleTrav Xtest(dim_esp);
915 for (
int n=0; n <to_link.
size(); n++)
921 for (
int nb_step=0; nb_step<(decoup-1); nb_step++)
923 for (
int k=0; k<dim_esp; k++) Xtest(k) = bary(e,k) + (bary(to_link[n], k) - bary(e,k))/decoup*(nb_step+1);
925 if (elem_Xtest != -1)
927 if (aire(elem_Xtest) <= 0.)
929 for (
int k=0; k<dim_esp; k++) bary(elem_Xtest,k) = Xtest(k);
930 for (
int k=0; k<rotation.
dimension(1); k++) rotation(elem_Xtest,k) = (rotation(e,k) + rotation(to_link[n],k)) / 2.;
951 prepro_lu_->compute_solid_fluid(1);
963 if (!prepro_lu_)
return;
964 Cerr<<
"(IBM) source PDF base: Prepro IBM verification if any ...."<<finl;
966 const DoubleTab& aireArray = prepro_lu_->champ_aire_->valeurs();
967 const DoubleTab& baryArray = prepro_lu_->champ_bary_->valeurs();
968 const DoubleTab& normalArray = prepro_lu_->champ_normal_->valeurs();
969 const DoubleTab& rotationArray = prepro_lu_->champ_rotation_->valeurs();
970 const DoubleTab& isNodeDirichletArray = prepro_lu_->isNodeDirichlet_->valeurs();
971 const DoubleTab& solideArray = prepro_lu_->solid_points_->valeurs();
972 const DoubleTab& fluidArray = prepro_lu_->fluid_points_->valeurs();
974 const DoubleTab& solid_elemsArray = prepro_lu_->solid_elems_->valeurs();
975 const DoubleTab& fluid_elemsArray = prepro_lu_->fluid_elems_->valeurs();
976 const DoubleTab& corresp_elemsArray = prepro_lu_->corresp_elems_->valeurs();
986 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for aire :"<<finl;
991 if (champ_barycentre_lu_)
993 const DoubleTab& baryArray_src_pdf = champ_barycentre_lu_->valeurs();
995 assert(baryArray_src_pdf.
dimension(1)==dim_esp);
996 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for barycenter :"<<finl;
1001 if (champ_rotation_lu_)
1003 const DoubleTab& rotArray_src_pdf = champ_rotation_lu_->valeurs();
1004 assert(rotArray_src_pdf.
dimension(1)==dim_esp*dim_esp);
1006 assert(normalArray.
dimension(1)==dim_esp);
1007 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for normal :"<<finl;
1008 for (
int k = 0; k < dim_esp; k++)
1010 double err_L2_norm =0.;
1011 double err_max_norm = 0.;
1012 double L2_norm = 0.;
1013 for (
int elem = 0; elem <normalArray.
dimension(0); elem++)
1014 if (aireArray(elem) > 0.)
1016 double diff_norm = abs(normalArray(elem,k) - rotArray_src_pdf(elem,3*k+(dim_esp-1)));
1017 err_L2_norm += diff_norm * diff_norm ;
1018 L2_norm += rotArray_src_pdf(elem,3*k+(dim_esp-1)) * rotArray_src_pdf(elem,3*k+(dim_esp-1)) ;
1019 if (diff_norm > err_max_norm) err_max_norm = diff_norm;
1021 if (L2_norm > 1.0e-12) err_L2_norm = sqrt(err_L2_norm / L2_norm);
1023 Cerr<<
" composant # "<<k<<
" => "<<err_L2_norm<<
" "<<err_max_norm;
1029 if (champ_rotation_lu_)
1031 const DoubleTab& rotArray_src_pdf = champ_rotation_lu_->valeurs();
1032 assert(rotArray_src_pdf.
dimension(1)==dim_esp*dim_esp);
1034 assert(rotationArray.
dimension(1)==dim_esp*dim_esp);
1035 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for rotation :"<<finl;
1043 Cerr<<
"Prepro_IBM::verify_results_prepro: Interpolation_IBM"<<finl;
1046 if (interpolation_lue_->is_dirichlet_lu_)
1048 const DoubleTab& isNodeDirichletArray_src_pdf = interpolation_lue_->is_dirichlet_lu_->valeurs();
1049 assert(isNodeDirichletArray_src_pdf.
dimension(0)==isNodeDirichletArray.
dimension(0));
1050 assert(isNodeDirichletArray_src_pdf.
dimension(1)==isNodeDirichletArray.
dimension(1));
1051 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for isNodeDirichlet :"<<finl;
1056 if (interpolation_lue_->solid_points_lu_)
1058 const DoubleTab& solideArray_src_pdf = interpolation_lue_->solid_points_lu_->valeurs();
1060 assert(solideArray_src_pdf.
dimension(1)==dim_esp);
1061 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for solid projection :"<<finl;
1066 if (interpolation_lue_->corresp_elems_lu_)
1068 const DoubleTab& corresp_elems_src_pdf = interpolation_lue_->corresp_elems_lu_->valeurs();
1069 assert(corresp_elems_src_pdf.
dimension(1)==1);
1071 assert(corresp_elemsArray.
dimension(1)==1);
1072 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for correspondance elems :"<<finl;
1076 Cerr<<
"interpolation_lue_->que_suis_je() = "<<interpolation_lue_->que_suis_je()<<finl;
1078 if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_gradient_moyen")
1080 Cerr<<
"Prepro_IBM::verify_results_prepro: >> mean_gradient"<<finl;
1084 if (interp.solid_elems_lu_)
1086 const DoubleTab& solid_elemsArray_src_pdf = interp.solid_elems_lu_->valeurs();
1089 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for solid projection element :"<<finl;
1095 if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_element_fluide")
1097 Cerr<<
"Prepro_IBM::verify_results_prepro: >> elem_fluide"<<finl;
1101 if (interp.fluid_points_lu_)
1103 const DoubleTab& fluidArray_src_pdf = interp.fluid_points_lu_->valeurs();
1105 assert(fluidArray_src_pdf.
dimension(1)==dim_esp);
1106 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for fluid projection :"<<finl;
1111 if (interp.fluid_elems_lu_)
1113 const DoubleTab& fluid_elemsArray_src_pdf = interp.fluid_elems_lu_->valeurs();
1116 Cerr<<
"Prepro_IBM::verify_results_prepro: relative L2-norm and abs max-norm errors for fluid projection element :"<<finl;
1126 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1141 if (
equation().discretisation().is_ef())
1146 else if (!(
equation().discretisation().is_vdf()) && !(
equation().discretisation().is_vef()))
1148 Cerr<<
"Source_PDF_base::rotate_imposed_velocit: discretisation is not EF, VEF, VDF : "<<
equation().
discretisation()<<finl;
1152 DoubleTab vitesse = vitesse_imposee;
1154 int dim_var=vitesse_imposee.
dimension(1);
1159 vitesse_imposee = 0.;
1162 for (
int num_elem=0; num_elem<nb_elem_tot; num_elem++)
1164 double norm = sqrt(rotation(num_elem,0)*rotation(num_elem,0)
1165 +rotation(num_elem,1)*rotation(num_elem,1)
1166 +rotation(num_elem,2)*rotation(num_elem,2)
1167 +rotation(num_elem,3)*rotation(num_elem,3)
1168 +rotation(num_elem,4)*rotation(num_elem,4)
1169 +rotation(num_elem,5)*rotation(num_elem,5)
1170 +rotation(num_elem,6)*rotation(num_elem,6)
1171 +rotation(num_elem,7)*rotation(num_elem,7)
1172 +rotation(num_elem,8)*rotation(num_elem,8));
1175 for (
int i=0; i<nb_dof_elem; i++)
1177 int s = elems(num_elem,i);
1178 for (
int c=0; c<dim_var; c++)
1180 for (
int k=0; k<dim_var; k++)
1182 vitesse_imposee(s,c) += rotation(num_elem,3*c+k)*vitesse(s,k);
1186 marqueur(s,0) += 1.0;
1190 for (
int i=0; i<nb_som_tot; i++)
1192 if(marqueur(i,0) > 0.)
1194 for (
int c=0; c<dim_var; c++)
1196 vitesse_imposee(i,c) /= marqueur(i,0);
1211 for (
int i = 0; i < nb_som; i++)
1213 if ((marqueur(i) >= val + eps) || (marqueur(i) <= val - eps))
1215 for (
int j = 0; j < dim; j++)
1219 for (
int j = 0; j < dim_var; j++)
1226 for (
int j = 0; j < dim; j++)
1230 for (
int j = 0; j < dim_var; j++)
1241 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1256 DoubleTab indic(nb_nodes);
1258 for (
int num_elem=0; num_elem<nb_elems; num_elem++)
1260 if (aire(num_elem)>0.)
1262 for (
int i=0; i<nb_som_elem; i++)
1264 int s1=elems(num_elem,i);
1277 if (size_dead_cell_tab == 0)
return coeff;
1278 if (elem >= size_dead_cell_tab)
1280 Cerr<<
"Source_PDF_base::fonct_regul_PDF: element = "<<elem<<
" >= size of tab indicateur_dead_cell = "<<size_dead_cell_tab<<finl;
1288 DoubleTab& rotation = ref_cast_non_const(DoubleTab,
champ_rotation_->valeurs());
1291 double coeff_regul_PDF =
modele_lu_.regul_coeff_PDF_;
1292 double h_ref = coeff_regul_PDF * h_max_elem;
1293 coeff = max((h_ref - dist)/h_ref , 0.);
1302 double val_coeff = 0.;
1308 double inv_dt = 1./dt;
1310 val_coeff = rho_m * inv_dt;
1320 val_coeff *= coeff_relax ;
1350 sum_dir_loc[i]+=rotation(num_elem,3*i+k);
1354 for (
int comp=0; comp<
dimension; comp++)
1356 diag_coef(comp) = 0. ;
1358 diag_coef(comp)+=tuvw[k]*sum_dir_loc[k]*rotation(num_elem,3*k+comp);
1376 ArrOfDouble variable_elem(dim_var);
1378 if (dim_var != 1 && dim_var != dim_esp)
1380 Cerr<<
"compute_coeff_elem: dimension variable differente 1 ou "<<dim_esp<<
"! "<<finl;
1383 DoubleTab coeff(nb_elems, dim_var);
1386 const DoubleTab& rho_m=
champ_rho_->valeurs();
1387 if (
equation().probleme().schema_temps().temps_courant()==0)
1394 DoubleVect val_diag_coef(dim_var);
1395 for (
int num_elem=0; num_elem<nb_elems; num_elem++)
1397 if (aire(num_elem)<=0.)
1399 for (
int comp=0; comp<dim_var; comp++) coeff(num_elem, comp) = 1. ;
1405 for (
int s=0; s<nb_som_elem; s++)
1407 int som_glob=elems(num_elem,s);
1408 for (
int comp=0; comp<dim_var; comp++)
1409 variable_elem[comp]+=variable(som_glob,comp);
1412 val_coeff =
fonct_coeff(rho_m(num_elem), aire(num_elem), dt) ;
1414 if (dim_var == dim_esp)
1423 for (
int comp=0; comp<dim_esp; comp++)
1424 coeff(num_elem, comp) = 1.+ val_coeff * val_diag_coef(comp) * dt / rho_m(num_elem) ;
1444 if (
equation().discretisation().is_ef())
1449 else if (!(
equation().discretisation().is_vdf()) && !(
equation().discretisation().is_vef()))
1451 Cerr<<
"Source_PDF_base::compute_coeff_matrice: discretisation is not EF, VEF, VDF : "<<
equation().
discretisation()<<finl;
1460 if (dim_var != 1 && dim_var != dim_esp)
1462 Cerr<<
"compute_coeff_matrice: dimension variable differente 1 ou "<<dim_esp<<
"! "<<finl;
1465 ArrOfDouble variable_elem(dim_var);
1466 DoubleTab coeff(variable);
1467 IntTab contrib(nb_dof_tot, dim_var);
1472 const DoubleTab& rho_m=
champ_rho_->valeurs();
1476 DoubleVect val_diag_coef(dim_var), coeff_el(dim_var) ;
1477 for (
int num_elem=0; num_elem<nb_elems; num_elem++)
1479 if (aire(num_elem)<=0.)
1481 for (
int comp=0; comp<dim_var; comp++) coeff_el(comp) = 0. ;
1486 for (
int s=0; s<nb_dof_elem; s++)
1488 int dof_glob=elems(num_elem,s);
1489 for (
int comp=0; comp<dim_var; comp++)
1490 variable_elem[comp]+=variable(dof_glob,comp)/nb_dof_elem;
1493 val_coeff =
fonct_coeff(rho_m(num_elem), aire(num_elem), dt) ;
1495 if (dim_var == dim_esp)
1504 for (
int comp=0; comp<dim_var; comp++)
1505 coeff_el(comp) = val_coeff * val_diag_coef(comp) * dt / rho_m(num_elem) ;
1507 for (
int i = 0; i<nb_dof_elem; i++)
1509 int s = elems(num_elem,i);
1510 for (
int comp=0; comp<dim_var; comp++)
1512 if (coeff_el(comp) > 0.)
1514 coeff(s,comp)+= coeff_el(comp);
1515 contrib(s, comp) += 1;
1523 for (
int s = 0; s<nb_dof_tot; s++)
1525 for (
int comp=0; comp<dim_var; comp++)
1528 if (contrib(s,comp) != 0)
1530 val += coeff(s,comp)/contrib(s,comp);
1532 coeff(s,comp) = val;
1542 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1550 DoubleTab pond = rho_m;
1551 double inv_coef1 = 1. / coef1;
1555 for (
int num_elem=0; num_elem<nb_elems; num_elem++)
1557 pond(num_elem) =
fonct_coeff(rho_m(num_elem), aire(num_elem), dt) ;
1558 pond(num_elem) *= volume(num_elem)*inv_coef1*inv_coef1;
1576 const int i_traitement_special = 0 ;
1577 ajouter_(variable, resu, i_traitement_special) ;
1583 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1590 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1603 int i_traitement_special = 0;
1605 DoubleTrav add_zero_term(variable);
1622 DoubleTrav resu(variable);
1623 calculer(resu, i_traitement_special);
1627 DoubleTrav flag_cl(resu);
1633 DoubleVect source_term[3];
1636 Cerr<<
"(IBM) Source_PDF_base: Bilan terme PDF = ";
1637 for (
int i=0; i<nb_comp; i++)
1639 source_term[i] = champ_nodal_->valeurs();
1640 source_term[i] = 0.;
1641 for (
int j=0; j<nb_som; j++)
1643 double filter = (std::fabs(resu(j,i)) > 0?1.:0.);
1644 filter *= flag_cl(j,i);
1645 source_term[i](j) = (resu(j,i) -
sec_mem_pdf(j,i) + add_term(j,i) )*filter;
1653 bilan(i) = mp_somme_vect(source_term[i]);
1654 Cerr<<
bilan(i)<<
" ";
1669 return ajouter_(variable,resu, i_traitement_special);
1674 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1680 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1686 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1692 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1698 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1704 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1712 if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_element_fluide")
1714 else if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_gradient_moyen")
1716 else if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_hybride")
1718 else if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_power_law_tbl")
1720 else if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_power_law_tbl_u_star")
1722 else if (interpolation_lue_->que_suis_je() ==
"Interpolation_IBM_thermal_wall_law")
1744 double my_dt = std::max(dt_ref,dt_min);
1745 if (
equation().probleme().schema_temps().temps_courant()==0) my_dt = 1.;
1756 int nb_data_vit = variable.
size();
1757 int nb_node_2 = coeff_node.
dimension(0) ;
1759 if (nb_data_vit != nb_node_2 * ncomp)
1761 Cerr<<
"Source_PDF_base: numbers of nodes are different for variable and coeff_node."<<finl;
1765 for(
int i=0; i<nb_node_2; i++)
1767 for (
int j=0; j<ncomp; j++)
1769 if (coeff_node(i,j)!= 1.0)
1771 variable(i,j)=vit_dir(i,j);
1780 Cerr <<
"Source_PDF_base: Not implemented for current discretisation. Aborting..." << finl;
1795 if (type!=
"") nomfichier+=(
Nom)
"_"+type;
1810 fic <<
"# Time" << espace <<
"Fx" << espace <<
"Fy" << espace <<
"Fz";
1815 fic <<
"# Time" << espace <<
"Sum";
1819 Cerr <<
"Source_PDF_base: for scalar or vector only; dim = " <<
modele_lu_.dim_variable_ << finl;
1826 os.
ouvrir(nomfichier,ios::app);
1829 os.
setf(ios::scientific);
1842 Cerr <<
"Source_PDF_NS_base: Not implemented for current discretisation. Aborting..." << finl;
1848 Cerr <<
"Source_PDF_NS_base: Not implemented for current discretisation. Aborting..." << finl;
1857 Motcle directive(
"temperature");
1858 if (
equation().inconnue().is_vectorial()) directive=
"vitesse";
1862 if (motlu==
"source_term_pdf" && !champ_source_term_PDF_)
1867 noms[0]=
"source_term_PDF";
1875 noms[0]=
"source_term_PDF";
1876 Noms unites(nb_comp);
1883 if (motlu==
"barycentre_IBM" && !champ_barycentre_IBM_)
1886 Noms nomsb(nb_comp);
1887 nomsb[0]=
"barycentre_IBM";
1888 Noms unitesb(nb_comp);
1894 if (motlu==
"normal_IBM" && !champ_normal_IBM_)
1897 Noms nomsn(nb_comp);
1898 nomsn[0]=
"normal_IBM";
1899 Noms unitesn(nb_comp);
1905 if (motlu==
"aire_IBM" && !champ_aire_IBM_)
1911 if (motlu==
"velocity_shape_IBM" && !champ_vitesse_shape_IBM_)
1914 Noms nomsv(nb_comp);
1915 for (
int i=0; i< nb_comp; i++) nomsv[i]=
"velocity_shape_IBM";
1916 Noms unitesv(nb_comp);
1917 for (
int i=0; i< nb_comp; i++) unitesv[i] =
"m/s";
1922 if (motlu==
"pseudo_level_set_IBM" && !champ_pseudo_level_set_IBM_)
1925 Noms nompl(nb_comp);
1926 for (
int i=0; i< nb_comp; i++) nompl[i]=
"pseudo_level_set_IBM";
1927 Noms unitepl(nb_comp);
1928 for (
int i=0; i< nb_comp; i++) unitepl[i] =
"m";
1929 Motcle directiveps(
"temperature");
1938 noms_compris.add(
"source_term_pdf");
1939 noms_compris.add(
"barycentre_IBM");
1940 noms_compris.add(
"normal_IBM");
1941 noms_compris.add(
"aire_IBM");
1942 noms_compris.add(
"velocity_shape_IBM");
1943 noms_compris.add(
"pseudo_level_set_IBM");
1944 if (opt==DESCRIPTION)
1945 Cerr<<
" Source_PDF_base : "<< noms_compris <<finl;
1947 nom.add(noms_compris);
1952 if (nom ==
"source_term_pdf" && champ_source_term_PDF_)
1957 else if (nom ==
"barycentre_IBM" && champ_barycentre_IBM_)
1962 else if (nom ==
"normal_IBM" && champ_normal_IBM_)
1967 else if (nom ==
"aire_IBM" && champ_aire_IBM_)
1972 else if (nom ==
"velocity_shape_IBM" && champ_vitesse_shape_IBM_)
1977 else if (nom ==
"pseudo_level_set_IBM" && champ_pseudo_level_set_IBM_)
1988 if (nom ==
"source_term_pdf" && champ_source_term_PDF_)
1990 else if (nom ==
"barycentre_IBM" && champ_barycentre_IBM_)
1992 else if (nom ==
"normal_IBM" && champ_normal_IBM_)
1994 else if (nom ==
"aire_IBM" && champ_aire_IBM_)
1996 else if (nom ==
"velocity_shape_IBM" && champ_vitesse_shape_IBM_)
1998 else if (nom ==
"pseudo_level_set_IBM" && champ_pseudo_level_set_IBM_)
2008 if (nom==
"source_term_pdf")
2010 if (!champ_source_term_PDF_)
2011 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2014 DoubleTab& valeurs = champ_source_term_PDF_->valeurs();
2020 for (
int num0=0; num0<nb_d0; num0++)
2021 for (
int num1=0; num1<nb_d1; num1++)
2025 champ_source_term_PDF_ ->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
2028 else if (nom==
"barycentre_IBM")
2030 if (!champ_barycentre_IBM_)
2031 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2034 DoubleTab& valeurs = champ_barycentre_IBM_->valeurs();
2041 for (
int num0=0; num0<nb_d0; num0++)
2042 for (
int num1=0; num1<nb_d1; num1++)
2043 valeurs(num0,num1)=barycentre(num0,num1);
2046 champ_barycentre_IBM_->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
2049 else if (nom==
"normal_IBM")
2051 if (!champ_normal_IBM_)
2052 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2055 DoubleTab& valeurs = champ_normal_IBM_->valeurs();
2061 for (
int num0=0; num0<nb_d0; num0++)
2062 for (
int num1=0; num1<dim_esp; num1++)
2063 valeurs(num0,num1)=rotation(num0,3*num1+(dim_esp-1));
2066 champ_normal_IBM_->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
2069 else if (nom==
"aire_IBM")
2071 if (!champ_aire_IBM_)
2072 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2075 DoubleTab& valeurs = champ_aire_IBM_->valeurs();
2082 for (
int num0=0; num0<nb_d0; num0++)
2083 for (
int num1=0; num1<nb_d1; num1++)
2084 valeurs(num0,num1)=aire(num0,num1);
2087 champ_aire_IBM_->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
2090 else if (nom==
"velocity_shape_IBM")
2092 if (!champ_vitesse_shape_IBM_)
2093 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2096 DoubleTab& valeurs = champ_vitesse_shape_IBM_->valeurs();
2100 const DoubleTab& vitesse =
modele_lu_.get_vitesse_shape_IBM();
2103 for (
int num0=0; num0<nb_d0; num0++)
2104 for (
int num1=0; num1<nb_d1; num1++)
2105 valeurs(num0,num1)=vitesse(num0,num1);
2108 champ_vitesse_shape_IBM_->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
2111 else if (nom==
"pseudo_level_set_IBM")
2113 if (!champ_pseudo_level_set_IBM_)
2114 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
2117 DoubleTab& valeurs = champ_pseudo_level_set_IBM_->valeurs();
2121 if (interpolation_lue_->pseudo_level_set_)
2125 int nb_d0 = pseudo_level_set.
dimension(0);
2126 for (
int num0=0; num0<nb_d0; num0++) valeurs(num0)=pseudo_level_set(num0);
2130 champ_pseudo_level_set_IBM_->mettre_a_jour(
equation().probleme().schema_temps().temps_courant());
DoubleTab & futur(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.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual bool is_ef() 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
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
DoubleTab_t & les_sommets()
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
const DoubleTab_t & coord_sommets() const
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_faces_tot() const
renvoie le nombre total de faces.
double volumes(int i) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const DoubleTab & get_pseudo_level_set()
virtual void set_fields_from_prepro_to_interp(Prepro_IBM_base &)
void calculer_normal_et_distance_proj_solid()
void set_pseudo_level_set(DoubleTab &it)
const DoubleTab & get_normal_proj_solid() const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
OBS_PTR(Equation_base) mon_equation
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
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 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.
const DoubleTab & get_champ_rotation()
void set_champ_aire(DoubleTab &champ_aire)
const DoubleTab & get_champ_barycentre()
void set_champ_rotation(DoubleTab &champ_rotation)
const DoubleTab & get_champ_aire()
void set_champ_barycentre(DoubleTab &champ_bary)
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.
const Champ_base & get_champ(const Motcle &nom) const override
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
bool & reprise_effectuee()
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
int nb_impr() const
Renvoie le nombre d'impressions effectuees.
double temps_courant() const
Renvoie le temps courant.
int precision_impr() const
double pas_temps_min() const
Renvoie le pas de temps minimum.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
class Source_PDF_base Base class for the source terms for the penalisation of the momentum in the Imm...
virtual void calculer_vitesse_imposee_power_law_tbl_u_star()
ArrOfDouble get_tuvw_local() const
int impr(Sortie &) const override
void set_dt_computation_pdf(double dt)
const int & getInterpolationBool() const
int type_variable_imposee_
bool matrice_pression_variable_bool_
double temps_computation_pdf_
void set_temps_computation_pdf(double temps_pdf)
DoubleTab compute_pond(const DoubleTab &rho_m, const DoubleTab &aire, const DoubleVect &volume_thilde, int &nb_som_elem, int &nb_elems) const
void creer_champ(const Motcle &motlu) override
virtual void calculer_variable_imposee_elem_fluid()
double aire_geometrique_IBM(DoubleTab &, int)
const PDF_model & get_modele() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
DoubleVect & compute_source_term_PDF(int, DoubleTab &, DoubleVect &)
const Interpolation_IBM_base & getInterpolationLu() const
virtual void filtre_CLD(DoubleTab &) const
virtual void calculer_vitesse_imposee_power_law_tbl()
void comp_diff_L2_max(double dim0, double dim1, const DoubleTab &Array_src, const DoubleTab &Array_prep)
void calculer_variable_imposee()
void compute_NeighNode_IBM_elem(DoubleTab &, IntLists &, bool all_elem_vois=false)
void mettre_a_jour(double) override
DOES NOTHING - to override in derived classes.
virtual void calculer_variable_imposee_mean_grad()
double dt_computation_pdf_
virtual void compute_variable_imposee_projete(const DoubleTab &, const DoubleTab &, double, double)
void update_elem_IBM(DoubleTab &, double, double)
double fonct_regul_PDF(const int, const double)
bool barycentre_from_prepro_
virtual void compute_indicateur_nodal_champ_aire()
void get_fields_from_prepro(Prepro_IBM_base &)
void rotate_imposed_velocity(DoubleTab &)
DoubleTab & calculer_pdf(DoubleTab &) const
virtual DoubleVect diag_coeff_elem(ArrOfDouble &, const DoubleTab &, int) const
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const override
contribution a la matrice implicite des termes sources par defaut pas de contribution
DoubleTab source_term_PDF
virtual DoubleTab compute_coeff_matrice() const
virtual void volume_source_term_PDF(DoubleTab &)
void ouvrir_fichier(SFichier &, const Nom &, const int) const override
Ouverture/creation d'un fichier d'impression d'un terme source A surcharger dans les classes derivees...
virtual void correct_variable(const DoubleTab &, DoubleTab &) const
virtual void correct_pressure(const DoubleTab &, DoubleTab &, const DoubleTab &) const
virtual void multiply_coeff_volume(DoubleTab &) const
double fonct_coeff(const double, const double, const double) const
DoubleTab indicateur_nodal_champ_aire_
IntTab indicateur_dead_cell_
void set_fields_to_prepro(Prepro_IBM_base &)
virtual void calculer_variable_imposee_hybrid()
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void update_pseudo_level_set_IBM(DoubleTab &, double)
DoubleTab & ajouter_(const DoubleTab &, DoubleTab &) const override
void set_variable_imposee()
DoubleTab & calculer(DoubleTab &) const override
virtual void calculer_temperature_imposee_wall_law()
virtual DoubleTab compute_coeff_elem() const
DoubleTab & ajouter(DoubleTab &) const override
const Champ_base & get_champ(const Motcle &) const override
void associer_pb(const Probleme_base &) override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
bool rotation_from_prepro_
void verify_results_prepro()
DoubleTab variable_imposee_
virtual void correct_incr_pressure(const DoubleTab &, DoubleTab &) const
Champs_compris champs_compris_
const Nom description() const
virtual int has_interface_blocs() const
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
class Source_dep_inco_base Les sources heritant de cette clase doivent coder ajouter_ de facon a perm...
TRUSTList & add_if_not(_TYPE_)
Ajout d'un element a la liste ssi il n'existe pas deja.
int contient(_TYPE_) const
Verifie si un element appartient ou non a la liste.
void vide()
Vide la liste.
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
static int les_sous_types(const Nom &, Noms &sous_types)
Donne les noms des sous-types, un type mere etant donne par son nom.