Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
HyodaMixedCellsUnitTest.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* HyodaMixedCellsUnitTest.cc (C) 2000-2023 */
9/* */
10/* Service du test de l'affichage des mailles mixtes. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13#include "arcane/BasicTimeLoopService.h"
14
15#include "arcane/ITimeLoopMng.h"
16#include "arcane/ITimeLoopService.h"
17#include "arcane/ITimeLoop.h"
18#include "arcane/TimeLoopEntryPointInfo.h"
19#include "arcane/IMesh.h"
20#include "arcane/IItemFamily.h"
21#include "arcane/ItemPrinter.h"
22#include "arcane/IParallelMng.h"
23
24
25#include "arcane/materials/IMeshMaterialMng.h"
26#include "arcane/materials/IMeshMaterial.h"
27#include "arcane/materials/IMeshEnvironment.h"
28#include "arcane/materials/MeshMaterialModifier.h"
29#include "arcane/materials/MeshMaterialVariableRef.h"
30#include "arcane/materials/MaterialVariableBuildInfo.h"
31#include "arcane/materials/MeshEnvironmentBuildInfo.h"
32#include "arcane/materials/CellToAllEnvCellConverter.h"
33#include "arcane/materials/MatItemVector.h"
34
35#include <arcane/hyoda/Hyoda.h>
36#include <arcane/hyoda/HyodaMix.h>
37#include "arcane/utils/IOnlineDebuggerService.h"
38
39#include "arcane/tests/ArcaneTestGlobal.h"
40#include "arcane/tests/HyodaMixedCellsUnitTest_axl.h"
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45ARCANETEST_BEGIN_NAMESPACE
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50using namespace Arcane;
51using namespace Arcane::Materials;
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
56
57class HyodaMixedCellsUnitTest: public ArcaneHyodaMixedCellsUnitTestObject{
58public:
59 HyodaMixedCellsUnitTest(const ServiceBuildInfo &sbi):
60 ArcaneHyodaMixedCellsUnitTestObject(sbi),
61 m_sub_domain(subDomain()),
62 m_material_mng(IMeshMaterialMng::getReference(subDomain()->defaultMesh())),
63 m_theta(0.0),
64 //m_density(Materials::MaterialVariableBuildInfo(m_material_mng, "density")),
65 //m_density(VariableBuildInfo(subDomain()->defaultMesh(),"density")),
66 m_interface_normal(VariableBuildInfo(subDomain()->defaultMesh(), "InterfaceNormal")),
67 m_interface_distance(VariableBuildInfo(subDomain()->defaultMesh(), "InterfaceDistance2")){
68 }
69 ~HyodaMixedCellsUnitTest(){}
70public:
71 // **************************************************************************
72 // * build
73 // **************************************************************************
74 void build(){
75 info() << "\33[7m[HyodaMixedCellsUnitTest::build]\33[m";
76 // On demande à HyODA d'afficher les interfaces
77 //if (platform::getOnlineDebuggerService()) platform::getOnlineDebuggerService()->doMixedCells();
78 }
79
80
81 // **************************************************************************
82 // * onTimeLoopStartInit
83 // **************************************************************************
84 void onTimeLoopStartInit(){
85 info() << "\33[7m[HyodaMixedCellsUnitTest::onTimeLoopStartInit]\33[m";
86 // Initialisation du pas de temps
87 m_global_deltat=1.0;
88
89 ENUMERATE_FACE(face,allFaces()){
90 m_qedge[face]=(Real)face->uniqueId().asInteger();
91 }
92
93 // Lecture des matériaux
94 for(Integer i=0,n=options()->material().size(); i<n; ++i){
95 String mat_name = options()->material[i].name;
96 info() << "Registering material" << mat_name;
97 m_material_mng->registerMaterialInfo(mat_name);
98 }
99
100 // Lecture des milieux
101 for(Integer i=0,n=options()->environment().size(); i<n; ++i){
102 String env_name = options()->environment[i].name;
103 info() << "Creating environment name=" << env_name;
104 Materials::MeshEnvironmentBuildInfo env_build(env_name);
105 for( Integer k=0,kn=options()->environment[i].material.size(); k<kn; ++k ){
106 String mat_name = options()->environment[i].material[k];
107 info() << "\tAdding material " << mat_name << " for environment " << env_name;
108 env_build.addMaterial(mat_name);
109 }
110 m_material_mng->createEnvironment(env_build);
111 }
112 // Signale au gestionnaire que tous les milieux ont été créés et qu'il peut allouer les variables.
113 m_material_mng->endCreate();
114
115 // Récupération des xMax et calcul des incréments en x: ix
116 Real maxX=0.0;
117 Real maxY=0.0;
118 ENUMERATE_CELL(cell, allCells()){
119 for (Node node : cell->nodes() ){
120 maxX=math::max(maxX, nodesCoordinates()[node].x);
121 maxY=math::max(maxY, nodesCoordinates()[node].y);
122 }
123 }
124 m_sub_domain->parallelMng()->reduce(Parallel::ReduceMax,maxX);
125 m_sub_domain->parallelMng()->reduce(Parallel::ReduceMax,maxY);
126
127 // On découpe en x les différents milieux
128 Real ix=maxX/options()->environment().size();
129 info() << "maxX="<<maxX<<", ix="<<ix;
130 info() << "maxY="<<maxY;
131
132 UniqueArray2< UniqueArray<Int32> > ids(options()->environment().size(),options()->material().size());
134 //Int32Array ids[options()->environment().size()][options()->material().size()];
135 ENUMERATE_CELL(cell, allCells()){
136 //info() << "Cell #" << cell->uniqueId()<<", .x0="<<nodesCoordinates()[cell->node(0)].x;
137 //info() << "Cell #" << cell->uniqueId()<<", .y2="<<nodesCoordinates()[cell->node(2)].y;
138 //info() << "floor(x/ix)="<<math::floor(nodesCoordinates()[cell->node(0)].x/ix);
139 Int32 iEnv = Convert::toInt32(math::floor(nodesCoordinates()[cell->node(0)].x/ix));
140 Real iy=maxY/m_material_mng->environments()[iEnv]->nbMaterial();
141 Int32 iMat0 = Convert::toInt32(math::floor(nodesCoordinates()[cell->node(0)].y/iy));
142 //Int32 iMat2=math::floor(nodesCoordinates()[cell->node(2)].y/iy);
143 //info()<<"iMat0="<<iMat0<<", iMat2="<<iMat2;
144 ids[iEnv][iMat0].add(cell.itemLocalId());
145 //if (iMat2!=iMat0) ids[iEnv][iMat2].add(cell.itemLocalId());
146 }
147
148 // On rajoute en dur les mailles 1 et 4
149 ids[0][1].add(1);
150 ids[0][1].add(4);
151
152 // Une fois les matériaux et milieux créés, il est possible d'ajouter ou de
153 // supprimer des mailles pour un matériau. Il n'est pas nécessaire de
154 // modifier les mailles par milieu: Arcane se charge de recalculer automatiquement
155 // la liste des mailles d'un milieu en fonction de celles de ses matériaux.
156 for(Integer i=0,n=options()->environment().size(); i<n; ++i){
157 IMeshEnvironment *env = m_material_mng->environments()[i];
158 info() << "[EnvInit] "<<env->name()<<", nbMaterial="<<env->nbMaterial();
159 for(Integer j=0,jMax=env->nbMaterial(); j<jMax; ++j){
160 MeshMaterialModifier modifier(m_material_mng);
161 modifier.addCells(env->materials()[j],ids[i][j]);
162 info() << "\t[EnvInit] adding cell #"<<ids[i][j];
163 }
164 }
165
166
167 // Itération sur tous les milieux, puis tous les matériaux et
168 // toutes les mailles de ce matériau
169 ENUMERATE_ENV(ienv, m_material_mng){
170 IMeshEnvironment* env = *ienv;
171 ENUMERATE_MAT(imat,env){
172 IMeshMaterial* mat = *imat;
173 ENUMERATE_MATCELL(imatcell,mat){
174 MatCell mc = *imatcell;
175 info() << "Cell #"<<mc.globalCell().localId()<<" mat=" << mc.materialId();
176 m_density[mc]=1.0+Real(mc.globalCell().localId()+mc.materialId());
177 //if (mc.globalCell().localId()==1)
178 }
179 }
180 ENUMERATE_ENVCELL(ienvcell,env){
181 EnvCell mmcell = *ienvcell;
182 info() << "Cell env=" << mmcell.environmentId();
183 m_density[mmcell]=10.0+ Real(mmcell.environmentId());
184 }
185 }
186
187 ENUMERATE_CELL(cell,allCells()){
188 m_density[*cell] = (double)cell.itemLocalId();
189 info()<<"m_density[*cell]="<<m_density[*cell];
190 }
191
192 // Initialisation des variables
193 m_interface_distance.resize(1);
194 ENUMERATE_CELL(cell, allCells()){
195 //info()<<"\t[onTimeLoopStartInit] cell #"<<cell->uniqueId();
196 //m_interface_distance2[cell][0]=1.0/sqrt(2.0);
197 m_interface_distance[cell][0]=((nodesCoordinates()[cell->node(0)]-(nodesCoordinates()[cell->node(0)]+
198 nodesCoordinates()[cell->node(1)]+
199 nodesCoordinates()[cell->node(2)]+
200 nodesCoordinates()[cell->node(3)])/4.0).normL2())/2.0;
201 //info()<<"\t[onTimeLoopStartInit] m_interface_distance2="<<m_interface_distance2[cell][0];
202 //m_concentration[cell]=1.0/(1.0+((Real)cell->uniqueId().asInt32()));
203 }
204 }
205
206
207 // **************************************************************************
208 // * onTimeLoopBeginLoop
209 // **************************************************************************
210 void onTimeLoopBeginLoop(){
211 const Real3 normal=Real3(cos(m_theta),sin(m_theta),0.0);
212 info() << "\33[7m[HyodaMixedCellsUnitTest::onTimeLoopBeginLoop]\33[m m_theta="<<m_theta;
213 info() << "[HyodaMixedCellsUnitTest::onTimeLoopBeginLoop] normal="<<normal;
214 ARCANE_HYODA_SOFTBREAK(subDomain());
215 if (m_global_iteration()>options()->iterations())
216 subDomain()->timeLoopMng()->stopComputeLoop(true);
217 ENUMERATE_CELL(cell, allCells()){
218 m_interface_normal[cell]=normal;
219 //m_interface_distance2[cell][0]+=0.123;
220 //if (m_interface_distance2[cell][0]>=+1.0) m_interface_distance2[cell][0]=0.0;
221 }
222 m_theta+=cgrPI/180.0;
223 /*ENUMERATE_CELL(cell,allCells()){
224 info()<<"m_density[*cell]="<<m_density[*cell];
225 }*/
226 }
227
228
229 // **************************************************************************
230 // * onTimeLoopRestore
231 // **************************************************************************
232 void onTimeLoopRestore(){
233 info() << "\33[7m[HyodaMixedCellsUnitTest::onTimeLoopRestore]\33[m";
234 }
235
236private:
237 ISubDomain *m_sub_domain;
238 IMeshMaterialMng* m_material_mng;
239 Real m_theta;
240 //MaterialVariableCellReal m_density;
241 VariableCellReal3 m_interface_normal;
242 VariableCellArrayReal m_interface_distance;
243};
244
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
249ARCANE_REGISTER_SERVICE_HYODAMIXEDCELLSUNITTEST(HyodaMixedCellsUnitTest,
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259ARCANETEST_END_NAMESPACE
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
void fill(const DataType &data)
Remplissage du tableau.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:219
Cell globalCell() const
Maille globale.
Maille arcane d'un milieu.
__host__ __device__ Int32 environmentId() const
Identifiant du milieu.
virtual String name() const =0
Nom du composant.
virtual ConstArrayView< IMeshMaterial * > materials()=0
Liste des matériaux de ce milieu.
virtual Integer nbMaterial() const =0
Nombre de matériaux dans le milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
static IMeshMaterialMng * getReference(const MeshHandleOrMesh &mesh_handle, bool create=true)
Récupère ou créé la référence associée à mesh.
Interface d'un matériau d'un maillage.
Représente un matériau d'une maille multi-matériau.
__host__ __device__ Int32 materialId() const
Identifiant du matériau.
Informations pour la création d'un milieu.
void addMaterial(const String &name)
Ajoute le matériau de nom name au milieu.
Objet permettant de modifier les matériaux ou les milieux.
void addCells(IMeshMaterial *mat, SmallSpan< const Int32 > ids)
Ajoute les mailles d'indices locaux ids au matériau mat.
Noeud d'un maillage.
Definition Item.h:573
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Structure contenant les informations pour créer un service.
Chaîne de caractères unicode.
Vecteur de données 2D avec sémantique par valeur (style STL).
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
#define ENUMERATE_ENV(ienv, container)
Macro pour itérer sur une liste de milieux.
#define ENUMERATE_ENVCELL(iname, env)
Macro pour itérer sur toutes les mailles d'un milieu.
#define ENUMERATE_MATCELL(iname, mat)
Macro pour itérer sur toutes les mailles d'un matériau.
#define ENUMERATE_MAT(imat, container)
Macro pour itérer sur une liste de matériaux.
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableArrayRefT< Cell, Real > VariableCellArrayReal
Grandeur au centre des mailles de type tableau de réel.
Int32 toInt32(Real r)
Converti un Real en Int32.
Definition Convert.h:63
Active toujours les traces dans les parties Arcane concernant les matériaux.
@ ReduceMax
Maximum des valeurs.
__host__ __device__ double floor(double v)
Arondir v à l'entier immédiatement inférieur.
Definition Math.h:96
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.