7#include "arcane/aleph/tests/AlephTest.h"
8#include "arcane/aleph/tests/AlephTestScheme.h"
9#include "arcane/aleph/tests/AlephTestSchemeFaces.h"
11#include "arcane/mesh/CellFamily.h"
12#include "arcane/mesh/FaceFamily.h"
23using namespace Arcane;
25ARCANE_REGISTER_SERVICE_ALEPHTESTSCHEMEFACES(Faces, AlephTestSchemeFaces);
32: ArcaneAlephTestSchemeFacesObject(sbi)
34 debug() <<
"\33[37m\t[AlephTestSchemeFaces::AlephTestSchemeFaces] New"
38AlephTestSchemeFaces::~AlephTestSchemeFaces(
void)
40 debug() <<
"\33[37m\t[AlephTestSchemeFaces::AlephTestSchemeFaces] Delete"
47void AlephTestSchemeFaces::
50 ItacFunction(AlephTestSchemeFaces);
52 for (
int i = module_options->boundaryCondition.size() - 1; i >= 0; --i) {
53 Real temperature = module_options->boundaryCondition[i]->value();
54 FaceGroup face_group = module_options->boundaryCondition[i]->surface();
57 m_face_temperature[iFace] = temperature;
65void AlephTestSchemeFaces::
66preFetchNumElementsForEachRow(
IntegerArray& rows_nb_element,
69 ItacFunction(AlephTestSchemeFaces);
70 debug() <<
"\33[37m\t[AlephTestSchemeFaces::preFetchNumElementsForEachRow]"
73 rows_nb_element.
fill(1);
78 if (iFace->backCell().isOwn())
79 rows_nb_element[m_cell_matrix_idx[iFace->backCell()] - rank_row_offset] += 1;
80 if (iFace->frontCell().isOwn())
81 rows_nb_element[m_cell_matrix_idx[iFace->frontCell()] - rank_row_offset] += 1;
88void AlephTestSchemeFaces::
93 m_cell_coefs[iCell] = 0.;
95 debug() <<
"\33[37m[AlephTestSchemeFaces::setValues] inner-faces"
98 if (iFace->backCell().isOwn()) {
99 const Real surface = AlephTestModule::geoFaceSurface(*iFace, nodesCoordinates());
100 aleph_mat->setValue(m_cell_matrix_idx[iFace->backCell()],
101 m_cell_matrix_idx[iFace->frontCell()], -deltaT / surface);
102 m_cell_coefs[iFace->backCell()] += 1.0 / surface;
104 if (iFace->frontCell().isOwn()) {
105 const Real surface = AlephTestModule::geoFaceSurface(*iFace, nodesCoordinates());
106 aleph_mat->setValue(m_cell_matrix_idx[iFace->frontCell()],
107 m_cell_matrix_idx[iFace->backCell()], -deltaT / surface);
108 m_cell_coefs[iFace->frontCell()] += 1.0 / surface;
111 debug() <<
"\33[37m[AlephTestSchemeFaces::setValues] outer-faces"
114 if (!iFace->cell(0).isOwn())
116 m_cell_coefs[iFace->cell(0)] += 1.0 / AlephTestModule::geoFaceSurface(*iFace,
nodesCoordinates());
118 debug() <<
"\33[37m[AlephTestSchemeFaces::setValues] diagonale"
121 aleph_mat->
setValue(m_cell_matrix_idx[iCell], m_cell_matrix_idx[iCell], 1.0 + deltaT * m_cell_coefs[iCell]);
123 debug() <<
"\33[37m[AlephTestSchemeFaces::setValues] done"
130bool AlephTestSchemeFaces::
131amrRefine(
RealArray& values,
const Real trigRefine)
133 ItacFunction(AlephTestSchemeFaces);
136 debug() <<
"\33[37m[AlephTestModule::_FaceAmrRefine]"
148 if ((*iCell).level() == 1)
151 const Real T1 = values[m_cell_matrix_idx[iCell]];
152 const Real ecart_relatif = ECART_RELATIF(T0, T1);
153 Cell iItem = (*iCell);
155 if (ecart_relatif > trigRefine) {
157 cells_lid.
add((*iCell).localId());
162 if (cells_lid.
size() == 0)
165 debug() <<
"\33[37m[AlephTestModule::_amrRefine] NOW refine"
167 MESH_MODIFIER_REFINE_ITEMS(mesh());
168 mesh()->modifier()->endUpdate();
171 CellInfoListView cells(mesh()->cellFamily());
173 for (
Integer i = 0, is = cells_lid.
size(); i < is; ++i) {
174 Int32 lid = cells_lid[i];
175 Cell cell = cells[lid];
177 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(cell); j < js; ++j) {
180 auto faces =
allCells().
view()[CELL_H_CHILD(cell, j).localId()].toCell().faces();
182 for (Face face : faces){
183 if (face.isSubDomainBoundary()) {
185 m_face_temperature[face] = m_face_temperature[cell.
face(index)];
189 m_face_temperature[face] = 0;
196 debug() <<
"\33[37m[AlephTestModule::_amrRefine] done"
204bool AlephTestSchemeFaces::
205amrCoarsen(
RealArray& values,
const Real trigCoarsen)
207 ItacFunction(AlephTestSchemeFaces);
210 debug() <<
"\33[37m[AlephTestModule::_FaceAmrCoarsen]"
214 mesh::FaceReorienter faceReorienter(mesh());
215 mesh::DynamicMesh* dynMesh =
dynamic_cast<mesh::DynamicMesh*
>(mesh());
216 CellInfoListView cells(mesh()->cellFamily());
230 if (cell.
level() == 1)
233 if (!CELL_HAS_H_CHILDREN(cell))
237 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(cell); j < js; ++j)
238 coarsit &= CELL_H_CHILD(cell, j).isActive();
239 if (coarsit ==
false)
243 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(cell); j < js; ++j) {
245 newTs[j] = values[m_cell_matrix_idx[CELL_H_CHILD(cell, j)]];
247 coarsit &= (ECART_RELATIF(oldTs[j], newTs[j]) < trigCoarsen);
250 if (coarsit ==
false)
254 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(cell); j < js; ++j)
255 coarsit &= (ECART_RELATIF(newTs[j], newTs[(j + 1) % 4]) < trigCoarsen);
256 if (coarsit ==
false)
259 debug() <<
"\n\t\t\t\t\t\t[FaceAmrCoarsen] parent cell to COARSE #" << cell.
localId();
262 parents_to_coarsen_lid.
add((*iCell).localId());
265 (*iCell).mutableItemBase().removeFlags(ItemInternal::II_CoarsenInactive);
266 ARCANE_ASSERT(((*iCell).isActive()), (
"Parent not active!"));
272 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(cell); j < js; ++j) {
273 children_to_coarsen_lid.
add(CELL_H_CHILD(cell, j).localId());
274 CELL_H_CHILD(cell, j).mutableItemBase().setFlags(CELL_H_CHILD(cell, j).itemBase().flags() | ItemInternal::II_Inactive);
280 for( Face face : parent.
faces()) {
281 if ((!face.backCell().null()) && (!face.frontCell().null())) {
282 debug() <<
"\t\t\t[FaceAmrCoarsen] FOCUS face #" << face.localId() <<
", "
283 << face.backCell().localId() <<
"->"
284 << face.frontCell().localId();
286 const Cell& neighbour = (face.backCell().localId() == parent.
localId()) ? face.frontCell() : face.backCell();
287 debug() <<
"\t\t\t[FaceAmrCoarsen] neighbour #" << neighbour.
localId() <<
", level=" << neighbour.
level();
290 ARCANE_ASSERT((neighbour.
level() == 0), (
"Wrong neighbour level!"));
294 debug() <<
"\t\t\t[FaceAmrCoarsen] neighbour is ACTIVE";
295 debug() <<
"\t\t\t[FaceAmrCoarsen] hit: face_" << face.localId() <<
": " << neighbour.
localId() <<
"->" << parent.
localId();
307 found[0] = found[1] =
false;
309 for (
Integer j = 0, js = CELL_NB_H_CHILDREN(neighbour); j < js; ++j) {
312 auto faces = CELL_H_CHILD(neighbour, j).faces();
313 for (Face face : faces){
314 if (face.backCell().null())
316 if (face.frontCell().null())
319 Cell other = (face.frontCell().localId() == CELL_H_CHILD(neighbour, j).localId()) ? face.backCell() : face.frontCell();
323 if (other.
level() == 0)
327 if (CELL_H_PARENT(other).localId() != parent.
localId())
330 debug() <<
"\t\t\t\t[FaceAmrCoarsen] hit: face_" << face.localId() <<
": " << CELL_H_CHILD(neighbour, j).localId() <<
"->" << parent.
localId();
331 faces_to_attach.
add(face.localId());
333 found[iFound++] =
true;
342 else if (face.backCell().null()) {
343 debug() <<
"\t\t\t[FaceAmrCoarsen] skip face #" << face.localId() <<
", ?->" << face.frontCell().localId() <<
" ";
346 debug() <<
"\t\t\t[FaceAmrCoarsen] skip face #" << face.localId() <<
", " << face.backCell().localId() <<
"->?"
353 if (parents_to_coarsen_lid.
size() == 0)
356 CellInfoListView cells_view(mesh()->cellFamily());
357 FaceInfoListView faces_view(mesh()->faceFamily());
360 for (
Integer j = 0, js = children_to_coarsen_lid.
size(); j < js; ++j) {
363 dynMesh->trueCellFamily().
removeCell(cells_view[children_to_coarsen_lid[j]]);
373 for (
Integer j = 0, js = faces_to_attach.
size(); j < js; ++j) {
374 Face face = faces_view[faces_to_attach[j]];
375 if (face.
itemBase().
flags() & ItemInternal::II_HasBackCell) {
376 debug() <<
"\t\t[FaceAmrCoarsen] NOW patch face_" << faces_to_attach[j] <<
": " << face.
backCell().
localId() <<
"->" << lids_to_be_attached[j];
378 dynMesh->trueFaceFamily().
addFrontCellToFace(face, cells_view[lids_to_be_attached[j]]);
381 debug() <<
"\t\t[FaceAmrCoarsen] NOW patch face_" << faces_to_attach[j] <<
": " << face.
frontCell().
localId() <<
"->" << lids_to_be_attached[j];
383 dynMesh->trueFaceFamily().
addBackCellToFace(face, cells_view[lids_to_be_attached[j]]);
385 faceReorienter.checkAndChangeOrientation(face);
390 mesh()->modifier()->endUpdate();
392 debug() <<
"\t\t[FaceAmrCoarsen] nbCell=" << MESH_ALL_ACTIVE_CELLS(mesh()).size();
416 debug() <<
"[AlephTestModule::FaceAmrCoarsen] done";
Arcane::VariableCellReal m_cell_temperature
Variables du service.
CaseOptionsAlephTestSchemeFaces * options() const
Options du jeu de données du service.
Integer size() const
Nombre d'éléments du vecteur.
Matrice d'un système linéaire.
void setValue(const VariableRef &, const Item &, const VariableRef &, const Item &, const Real)
setValue à partir d'arguments en IVariables, Items et Real
void fill(const DataType &data)
Remplissage du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
Face face(Int32 i) const
i-ème face de la maille
Cell frontCell() const
Maille devant la face (maille nulle si aucune)
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
Int32 flags() const
Flags de l'entité
ItemVectorView view() const
Vue sur les entités du groupe.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
impl::ItemBase itemBase() const
Partie interne de l'entité.
CellGroup allCells() const
Retourne le groupe contenant toutes les mailles.
VariableNodeReal3 & nodesCoordinates() const
Retourne les coordonnées des noeuds du maillage.
void addFlags(Int32 added_flags)
Ajoute les flags \added_flags à ceux de l'entité
Structure contenant les informations pour créer un service.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
void removeCell(Cell cell)
void addFrontCellToFace(Face face, Cell new_cell)
Ajoute une maille devant la face.
void addBackCellToFace(Face face, Cell new_cell)
Ajoute une maille derrière la face.
ItemGroupT< Face > FaceGroup
Groupe de faces.
Int32 Integer
Type représentant un entier.
Array< Integer > IntegerArray
Tableau dynamique à une dimension d'entiers.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
double Real
Type représentant un réel.
Array< Real > RealArray
Tableau dynamique à une dimension de réels.
std::int32_t Int32
Type entier signé sur 32 bits.