Arcane  v3.14.10.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
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50using namespace Arcane;
51using namespace Arcane::Materials;
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
56
57class HyodaMixedCellsUnitTest: public ArcaneHyodaMixedCellsUnitTestObject{
58public:
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 }
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;
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());
133 ids.fill(UniqueArray<Int32>());
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){
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 }
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
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.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Maille arcane d'un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual MeshMaterialInfo * registerMaterialInfo(const String &name)=0
Enregistre les infos du matériau de nom name.
virtual void endCreate(bool is_continue=false)=0
Indique qu'on a fini de créer les milieux.
virtual IMeshEnvironment * createEnvironment(const MeshEnvironmentBuildInfo &infos)=0
Créé un milieu avec les infos infos.
virtual ConstArrayView< IMeshEnvironment * > environments() const =0
Liste des milieux.
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.
Informations pour la création d'un 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 Dom.h:204
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Structure contenant les informations pour créer un service.
Paramètres nécessaires à la construction d'une variable.
Chaîne de caractères unicode.
#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.
Int32 toInt32(Real r)
Converti un Real en Int32.
Definition Convert.h:71
Active toujours les traces dans les parties Arcane concernant les matériaux.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.