TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Remailleur_Collision_FT_Juric.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Remailleur_Collision_FT_Juric.h>
17#include <Transport_Interfaces_FT_Disc.h>
18#include <Probleme_base.h>
19#include <Domaine.h>
20#include <Param.h>
21#include <Scatter.h>
22#include <Synonyme_info.h>
23
24Implemente_instanciable_sans_constructeur(Remailleur_Collision_FT_Juric,"Remailleur_Collision_FT_Juric",Remailleur_Collision_FT_base);
25Add_synonym(Remailleur_Collision_FT_Juric, "Juric");
26
27Remailleur_Collision_FT_Juric::Remailleur_Collision_FT_Juric() :
28 source_isovaleur_(INDICATRICE) // Valeur par defaut: la plus robuste.
29{
30}
31
33{
34 return os;
35}
36
37/*! @brief Lecture du parametre Source_Isovaleur.
38 *
39 * Format attendu :
40 * { [ source_isovaleur indicatrice | fonction_distance ] }
41 *
42 */
44{
46 Param param(que_suis_je());
47 int src = INDICATRICE;
48 param.ajouter("source_isovaleur", & src);
49 param.dictionnaire("indicatrice", INDICATRICE);
50 param.dictionnaire("fonction_distance", FONCTION_DISTANCE);
51 param.lire_avec_accolades_depuis(is);
52 if (src == INDICATRICE)
53 {
55 Cerr << " Using indicator function to reconstruct interfaces" << finl;
56 }
57 else
58 {
60 Cerr << " Using distance function to reconstruct interfaces (DANGEROUS: not robust)" << finl;
61 }
62 return is;
63}
64
65static void calculer_iso_avec_distance(const Domaine& domaine,
66 const Champ_base& indicatrice,
67 const DoubleTab& distance,
68 DoubleTab& fonction_iso)
69{
70 fonction_iso = distance;
71
72 // Remplissage des valeurs non calculees de la distance :
73 // on met une valeur positive si l'indicatrice vaut 1 et
74 // negative si l'indicatrice vaut 0
75 int i;
76 const int nb_som = distance.dimension(0);
77 DoubleTab indicatrice_sommets(nb_som,1);
78 indicatrice.valeur_aux_sommets(domaine, indicatrice_sommets);
79 const double valeur_invalide = -1.E30;
80 for (i = 0; i < nb_som; i++)
81 {
82 double d = fonction_iso(i);
83 if (d < valeur_invalide)
84 {
85 double indic = indicatrice_sommets(i,0);
86 d = (indic < 0.5) ? -1.e6 : 1.e6;
87 fonction_iso(i) = d;
88 }
89 }
90 fonction_iso.echange_espace_virtuel();
91}
92
93static void calculer_iso_avec_indicatrice(const Domaine& domaine,
94 const Champ_base& indicatrice,
95 DoubleTab& fonction_iso)
96{
97 const int nb_som = fonction_iso.dimension(0);
98 // Creation d'un tableau temporaire a deux dimensions
99 // (attendu par valeur_aux_sommets())
100 DoubleTab f(nb_som,1);
101 indicatrice.valeur_aux_sommets(domaine, f);
102 int i;
103 for (i = 0; i < nb_som; i++)
104 {
105 fonction_iso(i) = f(i, 0) - 0.5;
106 }
107 fonction_iso.echange_espace_virtuel();
108}
109
110/*! @brief Remaillage complet des interfaces par la methode de Juric: On calcule une fonction distance a l'interface evaluee aux sommets
111 *
112 * du maillage eulerien et on construit une isovaleur de cette fonction distance.
113 *
114 */
116 Maillage_FT_Disc& maillage,
117 Champ_base& indicatrice) const
118{
119 int res = 1;
120 Process::Journal()<<"DEB Remailleur_Collision_FT_Juric::traite_RuptureCoalescenceInterfaces"<<finl;
121
122 const Transport_Interfaces_FT_Disc& eq_transport_FT = maillage.equation_transport();
123 const Domaine& domaine = eq_transport_FT.domaine_dis().domaine();
124
125 DoubleTab fonction_iso;
126
127 switch(source_isovaleur_)
128 {
129 case INDICATRICE:
130 {
131 domaine.creer_tableau_sommets(fonction_iso);
132 calculer_iso_avec_indicatrice(domaine, indicatrice, fonction_iso);
133 break;
134 }
136 {
137 const DoubleTab& distance = eq_transport_FT.get_update_distance_interface_sommets();
138 calculer_iso_avec_distance(domaine, indicatrice, distance, fonction_iso);
139 break;
140 }
141 default:
142 Cerr << "Erreur dans Remailleur_Collision_FT_Juric::traite_RuptureCoalescenceInterfaces" << finl;
143 Cerr << " option source_isovaleur_ non implementee" << finl;
144 assert(0);
146 }
147
148 const Marching_Cubes& marching_cubes = eq_transport_FT.marching_cubes();
149
150 marching_cubes.construire_iso(fonction_iso, // Le champ dont on prend l'isovaleur
151 0., // La valeur
152 maillage,
153 indicatrice.valeurs(), // L'indicatrice est remise a jour dans les phases
155
156 Process::Journal()<<"FIN Remailleur_Collision_FT_Juric::traite_RuptureCoalescenceInterfaces res="<<res<<finl;
157 return res;
158}
159
161 int nb_fa7Intersectees,
162 const IntTab& couples_fa7Intersectees,
163 const DoubleTab& segmentsInter_fa7Intersectees,
164 Champ_base& indicatrice)
165{
166 int res = traite_RuptureCoalescenceInterfaces(maillage, indicatrice);
167 return res;
168}
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual DoubleTab & valeur_aux_sommets(const Domaine &, DoubleTab &) const
renvoie les valeurs aux sommets du Domaine dom
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
: class Maillage_FT_Disc Cette classe decrit un maillage:
Transport_Interfaces_FT_Disc & equation_transport()
int construire_iso(const DoubleVect &valeurs_sommets, double isovaleur, Maillage_FT_Disc &maillage, DoubleVect &indicatrice_approchee, const Maillage_FT_Disc::AjoutPhase phase, int ignorer_collision=0) const
Construction d'un maillage en segments ou en triangles comme l'isovaleur d'une fonction discretisee a...
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe Remailleur_Collision_FT_Juric Classe implementant un remailleur d'interfaces entrees en collis...
int traite_RuptureCoalescenceInterfaces(Maillage_FT_Disc &maillage, int nb_fa7Intersectees, const IntTab &couples_fa7Intersectees, const DoubleTab &segmentsInter_fa7Intersectees, Champ_base &indicatrice) override
classe Remailleur_Collision_FT_base Classe de base pour la hierarchie des remailleurs d'interfaces en...
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
virtual const DoubleTab & get_update_distance_interface_sommets() const
Renvoi de la distance signee entre l'interface et les sommets du maillage eulerien.
virtual const Marching_Cubes & marching_cubes() const