From a32895aabc6b9c530815908bbbedbfeff65dc1d1 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 18:44:12 +0200 Subject: [PATCH 1/5] =?UTF-8?q?[arcane,tests]=20S=C3=A9pare=20le=20calcul?= =?UTF-8?q?=20des=20mailles=20=C3=A0=20supprimer=20de=20la=20mise=20=C3=A0?= =?UTF-8?q?=20jour=20de=20la=20temp=C3=A9rature.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En profite pour corriger un 'MeshModifier::addCells()' qui aurait du être un 'removeCells()'. --- .../arcane/tests/MaterialHeatTestModule.cc | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc index b5433a03e..da8c1dc15 100644 --- a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc +++ b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc @@ -22,6 +22,7 @@ #include "arcane/materials/MeshMaterialInfo.h" #include "arcane/materials/CellToAllEnvCellConverter.h" #include "arcane/materials/MeshMaterialModifier.h" +#include "arcane/materials/ComponentItemVectorView.h" #include "arcane/tests/ArcaneTestGlobal.h" #include "arcane/tests/MaterialHeatTest_axl.h" @@ -248,6 +249,8 @@ _computeOneMaterial(const HeatObject& heat_object) CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); + const bool is_verbose = false; + UniqueArray mat_cells_to_add_value; UniqueArray mat_cells_to_add; ENUMERATE_ (Cell, icell, allCells()) { @@ -264,6 +267,8 @@ _computeOneMaterial(const HeatObject& heat_object) // On conserve la valeur à ajouter pour ne pas la recalculer mat_cells_to_add_value.add(to_add); mat_cells_to_add.add(cell.localId()); + if (is_verbose) + info() << "Add LID=" << cell.localId() << " T=" << to_add; } else m_mat_temperature[mc] += to_add; @@ -290,25 +295,40 @@ _computeOneMaterial(const HeatObject& heat_object) } } + const Real cold_value = 300.0; + // Refroidit chaque maille du matériau d'une quantité fixe. - // Si la températeur devient inférieure à zéro on supprime la maille + // Si la températeure devient inférieure à zéro on supprime la maille // de ce matériau. - UniqueArray mat_cells_to_remove; - ENUMERATE_MATCELL (imatcell, current_mat) { - MatCell mc = *imatcell; - Real t = m_mat_temperature[mc]; - t -= 300.0; - if (t < 0) { - t = 0.0; - mat_cells_to_remove.add(mc.globalCell().localId()); + if (is_verbose) + info() << "MAT_BEFORE: " << current_mat->matView()._internalLocalIds(); + { + UniqueArray mat_cells_to_remove; + ENUMERATE_MATCELL (imatcell, current_mat) { + MatCell mc = *imatcell; + Real t = m_mat_temperature[mc]; + if (t < cold_value) { + mat_cells_to_remove.add(mc.globalCell().localId()); + if (is_verbose) + info() << "Remove LID=" << mc.globalCell().localId() << " T=" << t; + } + } + + if (!mat_cells_to_remove.empty()) { + MeshMaterialModifier modifier(m_material_mng); + info() << "MAT_MODIF: Remove n=" << mat_cells_to_remove.size() << " cells to material=" << current_mat->name(); + modifier.removeCells(current_mat, mat_cells_to_remove); } - m_mat_temperature[mc] = t; } + if (is_verbose) + info() << "MAT_AFTER: " << current_mat->matView()._internalLocalIds(); - if (!mat_cells_to_remove.empty()) { - MeshMaterialModifier modifier(m_material_mng); - info() << "MAT_MODIF: Remove n=" << mat_cells_to_remove.size() << " cells to material=" << current_mat->name(); - modifier.addCells(current_mat, mat_cells_to_remove); + ENUMERATE_MATCELL (imatcell, current_mat) { + Real t = m_mat_temperature[imatcell]; + t -= cold_value; + if (t <= 0) + ARCANE_FATAL("Invalid negative temperature '{0}' cell_lid={1}", t, (*imatcell).globalCell().localId()); + m_mat_temperature[imatcell] = t; } } From 5dc14498e86ea974104ea8072f43c80d6d6a65bc Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 18:49:56 +0200 Subject: [PATCH 2/5] [arcane,tests] Nettoyage et utilise une structure de travail pour contenir la liste des modifications. --- .../arcane/tests/MaterialHeatTestModule.cc | 138 +++++++++++------- 1 file changed, 87 insertions(+), 51 deletions(-) diff --git a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc index da8c1dc15..7fa158ab0 100644 --- a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc +++ b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc @@ -57,6 +57,28 @@ class MaterialHeatTestModule Real3 velocity; //! Matériaux qui sera chauffé par cet objet. IMeshMaterial* material = nullptr; + //! Index de cet objet dans la liste globale + Int32 index = 0; + }; + + //! Tableau de travail pour la mise à jour des liste de matériaux + struct MaterialWorkArray + { + void clear() + { + mat_cells_to_add_value.clear(); + mat_cells_to_add.clear(); + mat_cells_to_remove.clear(); + } + + public: + + //! Liste des valeurs de température dans les mailles à ajouter + UniqueArray mat_cells_to_add_value; + //! Liste des mailles à ajouter + UniqueArray mat_cells_to_add; + //! Liste des mailles à supprimer + UniqueArray mat_cells_to_remove; }; public: @@ -79,10 +101,11 @@ class MaterialHeatTestModule private: void _computeCellsCenter(); - void _computeOneMaterial(const HeatObject& heat_object); + void _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa); void _buildHeatObjects(); - void _copyToGlobal(IMeshMaterial* mat, Int32 var_index); + void _copyToGlobal(const HeatObject& heat_object); IMeshMaterial* _findMaterial(const String& name); + void _computeGlobalTemperature(); }; /*---------------------------------------------------------------------------*/ @@ -194,8 +217,11 @@ compute() _computeCellsCenter(); - for (const HeatObject& ho : m_heat_objects) - _computeOneMaterial(ho); + MaterialWorkArray work_array; + for (const HeatObject& ho : m_heat_objects) { + work_array.clear(); + _computeOneMaterial(ho, work_array); + } // Remplit la variable composante associée de la variable 'AllTemperature' // pour chaque matériau. Cela permet de voir leur valeur facilement dans @@ -203,41 +229,19 @@ compute() ENUMERATE_ (Cell, icell, allCells()) { m_all_temperature[icell].fill(0.0); } - { - Int32 index = 0; - for (const HeatObject& ho : m_heat_objects) { - _copyToGlobal(ho.material, index); - ++index; - } - } - { - // Calcule dans 'Temperature' la somme des températures des milieux et matériaux - CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); - ENUMERATE_ (Cell, icell, allCells()) { - Cell cell = *icell; - AllEnvCell all_env_cell = all_env_cell_converter[cell]; - Real global_temperature = 0.0; - ENUMERATE_CELL_ENVCELL (ienvcell, all_env_cell) { - EnvCell env_cell = *ienvcell; - Real env_temperature = 0.0; - ENUMERATE_CELL_MATCELL (imatcell, env_cell) { - MatCell mc = *imatcell; - env_temperature += m_mat_temperature[mc]; - } - m_mat_temperature[env_cell] = env_temperature; - global_temperature += env_temperature; - } - m_mat_temperature[cell] = global_temperature; - } + for (const HeatObject& ho : m_heat_objects) { + _copyToGlobal(ho); } + + _computeGlobalTemperature(); } /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ void MaterialHeatTestModule:: -_computeOneMaterial(const HeatObject& heat_object) +_computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) { Real3 heat_center = heat_object.center; heat_center += heat_object.velocity * m_global_time(); @@ -251,8 +255,8 @@ _computeOneMaterial(const HeatObject& heat_object) const bool is_verbose = false; - UniqueArray mat_cells_to_add_value; - UniqueArray mat_cells_to_add; + //UniqueArray mat_cells_to_add_value; + //UniqueArray mat_cells_to_add; ENUMERATE_ (Cell, icell, allCells()) { Cell cell = *icell; AllEnvCell all_env_cell = all_env_cell_converter[cell]; @@ -265,8 +269,8 @@ _computeOneMaterial(const HeatObject& heat_object) // Si 'mc' est nul cela signifie que ce matériau n'est // pas présent dans la maille. Il faudra donc l'ajouter. // On conserve la valeur à ajouter pour ne pas la recalculer - mat_cells_to_add_value.add(to_add); - mat_cells_to_add.add(cell.localId()); + wa.mat_cells_to_add_value.add(to_add); + wa.mat_cells_to_add.add(cell.localId()); if (is_verbose) info() << "Add LID=" << cell.localId() << " T=" << to_add; } @@ -276,8 +280,8 @@ _computeOneMaterial(const HeatObject& heat_object) } // Ajoute les mailles matériaux nécessaires - if (!mat_cells_to_add.empty()) { - ConstArrayView ids(mat_cells_to_add); + if (!wa.mat_cells_to_add.empty()) { + ConstArrayView ids(wa.mat_cells_to_add); { MeshMaterialModifier modifier(m_material_mng); info() << "MAT_MODIF: Add n=" << ids.size() << " cells to material=" << current_mat->name(); @@ -291,7 +295,7 @@ _computeOneMaterial(const HeatObject& heat_object) // Ne devrait pas arriver car on l'a ajouté juste avant if (mc.null()) ARCANE_FATAL("Internal invalid null mat cell"); - m_mat_temperature[mc] = mat_cells_to_add_value[i]; + m_mat_temperature[mc] = wa.mat_cells_to_add_value[i]; } } @@ -303,21 +307,20 @@ _computeOneMaterial(const HeatObject& heat_object) if (is_verbose) info() << "MAT_BEFORE: " << current_mat->matView()._internalLocalIds(); { - UniqueArray mat_cells_to_remove; ENUMERATE_MATCELL (imatcell, current_mat) { MatCell mc = *imatcell; Real t = m_mat_temperature[mc]; if (t < cold_value) { - mat_cells_to_remove.add(mc.globalCell().localId()); + wa.mat_cells_to_remove.add(mc.globalCell().localId()); if (is_verbose) info() << "Remove LID=" << mc.globalCell().localId() << " T=" << t; } } - if (!mat_cells_to_remove.empty()) { + if (!wa.mat_cells_to_remove.empty()) { MeshMaterialModifier modifier(m_material_mng); - info() << "MAT_MODIF: Remove n=" << mat_cells_to_remove.size() << " cells to material=" << current_mat->name(); - modifier.removeCells(current_mat, mat_cells_to_remove); + info() << "MAT_MODIF: Remove n=" << wa.mat_cells_to_remove.size() << " cells to material=" << current_mat->name(); + modifier.removeCells(current_mat, wa.mat_cells_to_remove); } } if (is_verbose) @@ -336,8 +339,10 @@ _computeOneMaterial(const HeatObject& heat_object) /*---------------------------------------------------------------------------*/ void MaterialHeatTestModule:: -_copyToGlobal(IMeshMaterial* mat, Int32 var_index) +_copyToGlobal(const HeatObject& heat_object) { + IMeshMaterial* mat = heat_object.material; + Int32 var_index = heat_object.index; Real total_mat_temperature = 0.0; ENUMERATE_MATCELL (imatcell, mat) { MatCell mc = *imatcell; @@ -376,13 +381,18 @@ _buildHeatObjects() { info() << "MaterialHeatTestModule::_buildHeatObjects()"; - for (const auto& opt : options()->heatObject()) { - HeatObject ho; - ho.center = opt->center; - ho.velocity = opt->velocity; - ho.radius = opt->radius; - ho.material = _findMaterial(opt->material); - m_heat_objects.add(ho); + { + Int32 index = 0; + for (const auto& opt : options()->heatObject()) { + HeatObject ho; + ho.center = opt->center; + ho.velocity = opt->velocity; + ho.radius = opt->radius; + ho.material = _findMaterial(opt->material); + ho.index = index; + m_heat_objects.add(ho); + ++index; + } } m_all_temperature.resize(m_heat_objects.size()); @@ -403,6 +413,32 @@ _findMaterial(const String& name) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ +void MaterialHeatTestModule:: +_computeGlobalTemperature() +{ + // Calcule dans 'Temperature' la somme des températures des milieux et matériaux + CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); + ENUMERATE_ (Cell, icell, allCells()) { + Cell cell = *icell; + AllEnvCell all_env_cell = all_env_cell_converter[cell]; + Real global_temperature = 0.0; + ENUMERATE_CELL_ENVCELL (ienvcell, all_env_cell) { + EnvCell env_cell = *ienvcell; + Real env_temperature = 0.0; + ENUMERATE_CELL_MATCELL (imatcell, env_cell) { + MatCell mc = *imatcell; + env_temperature += m_mat_temperature[mc]; + } + m_mat_temperature[env_cell] = env_temperature; + global_temperature += env_temperature; + } + m_mat_temperature[cell] = global_temperature; + } +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + ARCANE_REGISTER_MODULE_MATERIALHEATTEST(MaterialHeatTestModule); /*---------------------------------------------------------------------------*/ From 4b7a8a745f63dfdd50454fe3540e9ecf0c21b358 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 19:33:20 +0200 Subject: [PATCH 3/5] =?UTF-8?q?[arcane,tests]=20Effectue=20l'ajout=20et=20?= =?UTF-8?q?la=20suppression=20des=20mailles=20d'un=20mat=C3=A9riau=20en=20?= =?UTF-8?q?une=20seule=20=C3=A9tape.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arcane/tests/MaterialHeatTestModule.cc | 135 ++++++++++++------ 1 file changed, 93 insertions(+), 42 deletions(-) diff --git a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc index 7fa158ab0..0283163c4 100644 --- a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc +++ b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc @@ -55,6 +55,10 @@ class MaterialHeatTestModule Real radius = 0.0; //! Vitesse Real3 velocity; + //! Températeure de refroissement + Real cold_value = 300.0; + //! Températeure de chauffage + Real heat_value = 1000.0; //! Matériaux qui sera chauffé par cet objet. IMeshMaterial* material = nullptr; //! Index de cet objet dans la liste globale @@ -106,6 +110,8 @@ class MaterialHeatTestModule void _copyToGlobal(const HeatObject& heat_object); IMeshMaterial* _findMaterial(const String& name); void _computeGlobalTemperature(); + void _computeCellsToAdd(const HeatObject& heat_object, MaterialWorkArray& wa); + void _computeCellsToRemove(const HeatObject& heat_object, MaterialWorkArray& wa); }; /*---------------------------------------------------------------------------*/ @@ -143,6 +149,9 @@ buildInit() Materials::IMeshMaterialMng* mm = IMeshMaterialMng::getReference(defaultMesh()); int flags = (int)eModificationFlags::GenericOptimize | (int)eModificationFlags::OptimizeMultiAddRemove; + flags |= (int)eModificationFlags::OptimizeMultiAddRemove; + flags |= (int)eModificationFlags::OptimizeMultiMaterialPerEnvironment; + m_material_mng->setModificationFlags(flags); m_material_mng->setMeshModificationNotified(true); @@ -217,10 +226,9 @@ compute() _computeCellsCenter(); - MaterialWorkArray work_array; + UniqueArray work_arrays(m_heat_objects.size()); for (const HeatObject& ho : m_heat_objects) { - work_array.clear(); - _computeOneMaterial(ho, work_array); + _computeOneMaterial(ho, work_arrays[ho.index]); } // Remplit la variable composante associée de la variable 'AllTemperature' @@ -245,18 +253,88 @@ _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) { Real3 heat_center = heat_object.center; heat_center += heat_object.velocity * m_global_time(); - const Real heat_value = 1000.0; + const Real heat_value = heat_object.heat_value; Real heat_radius = heat_object.radius; const Real heat_radius_norm = heat_radius * heat_radius; - IMeshMaterial* current_mat = heat_object.material; CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); + //! Chauffe les mailles déjà présentes dans le matériau + ENUMERATE_MATCELL (imatcell, current_mat) { + MatCell mc = *imatcell; + Cell cell = mc.globalCell(); + Real3 center = m_cell_center[cell]; + Real distance2 = (center - heat_center).squareNormL2(); + if (distance2 < heat_radius_norm) { + Real to_add = heat_value / (1.0 + distance2); + m_mat_temperature[mc] += to_add; + } + } + + _computeCellsToRemove(heat_object, wa); + _computeCellsToAdd(heat_object, wa); + + { + MeshMaterialModifier modifier(m_material_mng); + + // Supprime les mailles matériaux nécessaires + ConstArrayView remove_ids = wa.mat_cells_to_remove; + if (!remove_ids.empty()) { + info() << "MAT_MODIF: Remove n=" << remove_ids.size() << " cells to material=" << current_mat->name(); + modifier.removeCells(current_mat, remove_ids); + } + + // Ajoute les mailles matériaux nécessaires + ConstArrayView add_ids(wa.mat_cells_to_add); + if (!add_ids.empty()) { + info() << "MAT_MODIF: Add n=" << add_ids.size() << " cells to material=" << current_mat->name(); + modifier.addCells(current_mat, add_ids); + } + } + + // Initialise les nouvelles valeurs partielles + { + ConstArrayView ids(wa.mat_cells_to_add); + for (Int32 i = 0, n = ids.size(); i < n; ++i) { + AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(ids[i])]; + MatCell mc = current_mat->findMatCell(all_env_cell); + // Teste que la maille n'est pas nulle. + // Ne devrait pas arriver car on l'a ajouté juste avant + if (mc.null()) + ARCANE_FATAL("Internal invalid null mat cell"); + m_mat_temperature[mc] = wa.mat_cells_to_add_value[i]; + } + } + + const Real cold_value = heat_object.cold_value; + + ENUMERATE_MATCELL (imatcell, current_mat) { + Real t = m_mat_temperature[imatcell]; + t -= cold_value; + if (t <= 0) + ARCANE_FATAL("Invalid negative temperature '{0}' cell_lid={1}", t, (*imatcell).globalCell().localId()); + m_mat_temperature[imatcell] = t; + } +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +void MaterialHeatTestModule:: +_computeCellsToAdd(const HeatObject& heat_object, MaterialWorkArray& wa) +{ + Real3 heat_center = heat_object.center; + heat_center += heat_object.velocity * m_global_time(); + const Real heat_value = heat_object.heat_value; + Real heat_radius = heat_object.radius; + const Real heat_radius_norm = heat_radius * heat_radius; + IMeshMaterial* current_mat = heat_object.material; + CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); + const bool is_verbose = false; - //UniqueArray mat_cells_to_add_value; - //UniqueArray mat_cells_to_add; + // Détermine les nouvelles à ajouter au matériau ENUMERATE_ (Cell, icell, allCells()) { Cell cell = *icell; AllEnvCell all_env_cell = all_env_cell_converter[cell]; @@ -274,31 +352,18 @@ _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) if (is_verbose) info() << "Add LID=" << cell.localId() << " T=" << to_add; } - else - m_mat_temperature[mc] += to_add; } } +} - // Ajoute les mailles matériaux nécessaires - if (!wa.mat_cells_to_add.empty()) { - ConstArrayView ids(wa.mat_cells_to_add); - { - MeshMaterialModifier modifier(m_material_mng); - info() << "MAT_MODIF: Add n=" << ids.size() << " cells to material=" << current_mat->name(); - modifier.addCells(current_mat, ids); - } - // Initialise les nouvelles valeurs partielles - for (Int32 i = 0, n = ids.size(); i < n; ++i) { - AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(ids[i])]; - MatCell mc = current_mat->findMatCell(all_env_cell); - // Teste que la maille n'est pas nulle. - // Ne devrait pas arriver car on l'a ajouté juste avant - if (mc.null()) - ARCANE_FATAL("Internal invalid null mat cell"); - m_mat_temperature[mc] = wa.mat_cells_to_add_value[i]; - } - } +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +void MaterialHeatTestModule:: +_computeCellsToRemove(const HeatObject& heat_object, MaterialWorkArray& wa) +{ + IMeshMaterial* current_mat = heat_object.material; + const bool is_verbose = false; const Real cold_value = 300.0; // Refroidit chaque maille du matériau d'une quantité fixe. @@ -316,23 +381,9 @@ _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) info() << "Remove LID=" << mc.globalCell().localId() << " T=" << t; } } - - if (!wa.mat_cells_to_remove.empty()) { - MeshMaterialModifier modifier(m_material_mng); - info() << "MAT_MODIF: Remove n=" << wa.mat_cells_to_remove.size() << " cells to material=" << current_mat->name(); - modifier.removeCells(current_mat, wa.mat_cells_to_remove); - } } if (is_verbose) info() << "MAT_AFTER: " << current_mat->matView()._internalLocalIds(); - - ENUMERATE_MATCELL (imatcell, current_mat) { - Real t = m_mat_temperature[imatcell]; - t -= cold_value; - if (t <= 0) - ARCANE_FATAL("Invalid negative temperature '{0}' cell_lid={1}", t, (*imatcell).globalCell().localId()); - m_mat_temperature[imatcell] = t; - } } /*---------------------------------------------------------------------------*/ From 53dd3fad5f25b433032d243769a03ce3c2450723 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 21:29:37 +0200 Subject: [PATCH 4/5] =?UTF-8?q?[arcane,tests]=20S=C3=A9pare=20les=20diff?= =?UTF-8?q?=C3=A9rentes=20de=20phase=20la=20boucle=20de=20calcul.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arcane/tests/MaterialHeatTestModule.cc | 100 ++++++++++++------ 1 file changed, 70 insertions(+), 30 deletions(-) diff --git a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc index 0283163c4..3fe222ea2 100644 --- a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc +++ b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc @@ -112,6 +112,9 @@ class MaterialHeatTestModule void _computeGlobalTemperature(); void _computeCellsToAdd(const HeatObject& heat_object, MaterialWorkArray& wa); void _computeCellsToRemove(const HeatObject& heat_object, MaterialWorkArray& wa); + void _addHeat(const HeatObject& heat_object); + void _addCold(const HeatObject& heat_object); + void _initNewCells(const HeatObject& heat_object, MaterialWorkArray& wa); }; /*---------------------------------------------------------------------------*/ @@ -227,10 +230,24 @@ compute() _computeCellsCenter(); UniqueArray work_arrays(m_heat_objects.size()); + + // Ajoute de la chaleur à chaque matériau + for (const HeatObject& ho : m_heat_objects) + _addHeat(ho); + + // Calcule les mailles à ajouter et supprimer for (const HeatObject& ho : m_heat_objects) { _computeOneMaterial(ho, work_arrays[ho.index]); } + // Initialise les nouvelles valeurs partielles + for (const HeatObject& ho : m_heat_objects) + _initNewCells(ho, work_arrays[ho.index]); + + // Refroidit chaque matériau + for (const HeatObject& ho : m_heat_objects) + _addCold(ho); + // Remplit la variable composante associée de la variable 'AllTemperature' // pour chaque matériau. Cela permet de voir leur valeur facilement dans // les outils de dépouillement @@ -251,27 +268,8 @@ compute() void MaterialHeatTestModule:: _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) { - Real3 heat_center = heat_object.center; - heat_center += heat_object.velocity * m_global_time(); - const Real heat_value = heat_object.heat_value; - Real heat_radius = heat_object.radius; - const Real heat_radius_norm = heat_radius * heat_radius; IMeshMaterial* current_mat = heat_object.material; - CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); - - //! Chauffe les mailles déjà présentes dans le matériau - ENUMERATE_MATCELL (imatcell, current_mat) { - MatCell mc = *imatcell; - Cell cell = mc.globalCell(); - Real3 center = m_cell_center[cell]; - Real distance2 = (center - heat_center).squareNormL2(); - if (distance2 < heat_radius_norm) { - Real to_add = heat_value / (1.0 + distance2); - m_mat_temperature[mc] += to_add; - } - } - _computeCellsToRemove(heat_object, wa); _computeCellsToAdd(heat_object, wa); @@ -292,21 +290,37 @@ _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) modifier.addCells(current_mat, add_ids); } } +} +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +void MaterialHeatTestModule:: +_initNewCells(const HeatObject& heat_object, MaterialWorkArray& wa) +{ // Initialise les nouvelles valeurs partielles - { - ConstArrayView ids(wa.mat_cells_to_add); - for (Int32 i = 0, n = ids.size(); i < n; ++i) { - AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(ids[i])]; - MatCell mc = current_mat->findMatCell(all_env_cell); - // Teste que la maille n'est pas nulle. - // Ne devrait pas arriver car on l'a ajouté juste avant - if (mc.null()) - ARCANE_FATAL("Internal invalid null mat cell"); - m_mat_temperature[mc] = wa.mat_cells_to_add_value[i]; - } + IMeshMaterial* current_mat = heat_object.material; + CellToAllEnvCellConverter all_env_cell_converter(m_material_mng); + ConstArrayView ids(wa.mat_cells_to_add); + + for (Int32 i = 0, n = ids.size(); i < n; ++i) { + AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(ids[i])]; + MatCell mc = current_mat->findMatCell(all_env_cell); + // Teste que la maille n'est pas nulle. + // Ne devrait pas arriver car on l'a ajouté juste avant + if (mc.null()) + ARCANE_FATAL("Internal invalid null mat cell"); + m_mat_temperature[mc] = wa.mat_cells_to_add_value[i]; } +} +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +void MaterialHeatTestModule:: +_addCold(const HeatObject& heat_object) +{ + IMeshMaterial* current_mat = heat_object.material; const Real cold_value = heat_object.cold_value; ENUMERATE_MATCELL (imatcell, current_mat) { @@ -321,6 +335,32 @@ _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ +void MaterialHeatTestModule:: +_addHeat(const HeatObject& heat_object) +{ + Real3 heat_center = heat_object.center; + heat_center += heat_object.velocity * m_global_time(); + const Real heat_value = heat_object.heat_value; + const Real heat_radius_norm = heat_object.radius * heat_object.radius; + + IMeshMaterial* current_mat = heat_object.material; + + //! Chauffe les mailles déjà présentes dans le matériau + ENUMERATE_MATCELL (imatcell, current_mat) { + MatCell mc = *imatcell; + Cell cell = mc.globalCell(); + Real3 center = m_cell_center[cell]; + Real distance2 = (center - heat_center).squareNormL2(); + if (distance2 < heat_radius_norm) { + Real to_add = heat_value / (1.0 + distance2); + m_mat_temperature[mc] += to_add; + } + } +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + void MaterialHeatTestModule:: _computeCellsToAdd(const HeatObject& heat_object, MaterialWorkArray& wa) { From 483e1ea729cc08852f0ce3acf6f80af1d2e16196 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Fri, 7 Jul 2023 14:25:28 +0200 Subject: [PATCH 5/5] =?UTF-8?q?[arcane,tests]=20Effectue=20la=20modificati?= =?UTF-8?q?on=20des=20mat=C3=A9riaux/milieux=20en=20une=20seule=20op=C3=A9?= =?UTF-8?q?ration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arcane/tests/MaterialHeatTestModule.cc | 58 +++++++++---------- arcane/ceapart/tests/testMaterialHeat-1.arc | 2 +- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc index 3fe222ea2..5cdf50b96 100644 --- a/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc +++ b/arcane/ceapart/src/arcane/tests/MaterialHeatTestModule.cc @@ -105,7 +105,6 @@ class MaterialHeatTestModule private: void _computeCellsCenter(); - void _computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa); void _buildHeatObjects(); void _copyToGlobal(const HeatObject& heat_object); IMeshMaterial* _findMaterial(const String& name); @@ -237,7 +236,32 @@ compute() // Calcule les mailles à ajouter et supprimer for (const HeatObject& ho : m_heat_objects) { - _computeOneMaterial(ho, work_arrays[ho.index]); + MaterialWorkArray& wa = work_arrays[ho.index]; + _computeCellsToRemove(ho, wa); + _computeCellsToAdd(ho, wa); + } + + // Effectue les modifications des matériaux + { + MeshMaterialModifier modifier(m_material_mng); + for (const HeatObject& ho : m_heat_objects) { + MaterialWorkArray& wa = work_arrays[ho.index]; + IMeshMaterial* mat = ho.material; + + // Supprime les mailles matériaux nécessaires + ConstArrayView remove_ids = wa.mat_cells_to_remove; + if (!remove_ids.empty()) { + info() << "MAT_MODIF: Remove n=" << remove_ids.size() << " cells to material=" << mat->name(); + modifier.removeCells(mat, remove_ids); + } + + // Ajoute les mailles matériaux nécessaires + ConstArrayView add_ids(wa.mat_cells_to_add); + if (!add_ids.empty()) { + info() << "MAT_MODIF: Add n=" << add_ids.size() << " cells to material=" << mat->name(); + modifier.addCells(mat, add_ids); + } + } } // Initialise les nouvelles valeurs partielles @@ -265,36 +289,6 @@ compute() /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -void MaterialHeatTestModule:: -_computeOneMaterial(const HeatObject& heat_object, MaterialWorkArray& wa) -{ - IMeshMaterial* current_mat = heat_object.material; - - _computeCellsToRemove(heat_object, wa); - _computeCellsToAdd(heat_object, wa); - - { - MeshMaterialModifier modifier(m_material_mng); - - // Supprime les mailles matériaux nécessaires - ConstArrayView remove_ids = wa.mat_cells_to_remove; - if (!remove_ids.empty()) { - info() << "MAT_MODIF: Remove n=" << remove_ids.size() << " cells to material=" << current_mat->name(); - modifier.removeCells(current_mat, remove_ids); - } - - // Ajoute les mailles matériaux nécessaires - ConstArrayView add_ids(wa.mat_cells_to_add); - if (!add_ids.empty()) { - info() << "MAT_MODIF: Add n=" << add_ids.size() << " cells to material=" << current_mat->name(); - modifier.addCells(current_mat, add_ids); - } - } -} - -/*---------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------*/ - void MaterialHeatTestModule:: _initNewCells(const HeatObject& heat_object, MaterialWorkArray& wa) { diff --git a/arcane/ceapart/tests/testMaterialHeat-1.arc b/arcane/ceapart/tests/testMaterialHeat-1.arc index c65c7d34f..54f29de9d 100644 --- a/arcane/ceapart/tests/testMaterialHeat-1.arc +++ b/arcane/ceapart/tests/testMaterialHeat-1.arc @@ -7,7 +7,7 @@ - 1 + 5 Temperature AllTemperatures