Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
PoissonModule.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2#include "PoissonModule.h"
3
4#include <arcane/MathUtils.h>
5#include <arcane/IParallelMng.h>
6#include <arcane/ITimeLoopMng.h>
7
8using namespace Arcane;
9
10/*---------------------------------------------------------------------------*/
11/*---------------------------------------------------------------------------*/
12
14{
15 // pour que les dépouillement ne se superpose pas
16 m_global_deltat = 1;
17
18 // initialisation de la temperature sur toutes les mailles
19 // ...
20
21 // application de la temperature aux limites
22 applyBoundaryConditions();
23}
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
29{
30 Real max_delta_cell_t = 0;
31
32 // mise a jour de la temperature aux mailles
33 // ...
34 {
35 // calcul de la nouvelle temperature
36 // ...
37 // new_cell_t
38 // ...
39
40 // on observe l'ecart
41 Real delta_cell_t = math::abs(new_cell_t - m_cell_temperature[icell]);
42 max_delta_cell_t = math::max(max_delta_cell_t, delta_cell_t);
43
44 // mise a jour de la temperature
45 m_cell_temperature[icell] = new_cell_t;
46 }
47
48 // mise a jour de la temperature aux noeuds
49 // ...
50
51 // Vu le calcul, la syncronisation de la temperature aux mailles est inutile
52 // syncronisation de la temperature aux noeuds et réduction de l'écart
53 // ...
54
55 // application des conditions aux limites
56 applyBoundaryConditions();
57
58 // test d'arret de la boucle en temps
59 if (max_delta_cell_t < 0.2) subDomain()->timeLoopMng()->stopComputeLoop(true);
60}
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
65void PoissonModule::applyBoundaryConditions()
66{
67 // boucle sur les conditions aux limites
68 int nb_boundary_condition = options()->boundaryCondition.size();
69 for (int i = 0; i < nb_boundary_condition; ++i)
70 {
71 FaceGroup face_group = options()->boundaryCondition[i]->surface();
72 Real temperature = options()->boundaryCondition[i]->value();
73 TypesPoisson::eBoundaryCondition type = options()->boundaryCondition[i]->type();
74
75 // boucle sur les faces de la surface
76 ENUMERATE_FACE(iface, face_group)
77 {
78 const Face & face = * iface;
79 Integer nb_node = face.nbNode();
80
81 // boucle sur les noeuds de la face
82 for (NodeEnumerator inode(face.nodes()); inode(); ++inode)
83 {
84 switch (type)
85 {
86 case TypesPoisson::Temperature:
87 m_node_temperature[inode] = temperature;
88 break;
89 case TypesPoisson::Unknown:
90 break;
91 }
92 }
93 }
94 }
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100ARCANE_REGISTER_MODULE_POISSON(PoissonModule);
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
Face d'une maille.
Definition Item.h:932
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Definition Item.h:771
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
virtual void initTemperatures()
virtual void propagateTemperatures()
ItemEnumeratorT< Node > NodeEnumerator
Enumérateurs sur des noeuds.
Definition ItemTypes.h:254
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
double Real
Type représentant un réel.