43 GenericGSInternalUpdater(GeometryT& geom,
ITraceMng* traceMng)
45 , m_trace_mng(traceMng)
50 m_group_property = group_property;
53#define SAVE_PROPERTY(property, type, item, group, expr) \
54 if (m_group_property->hasProperty((property))) { \
55 ItemGroupGeometryProperty::StorageInfo& storage = m_group_property->storages[property]; \
56 if (ContainerAccessorT<type>::getVarContainer(storage)) { \
57 IGeometryMng::type##Variable& mMap = *ContainerAccessorT<type>::getVarContainer(storage); \
58 ENUMERATE_ITEMWITHNODES((item), (group)) \
60 mMap[*(item)] = (expr); \
65 template <
typename ComputeLineFunctor>
72 ComputeLineFunctor functor(&m_geom);
73 ENUMERATE_ITEMWITHNODES(item, group)
75 functor.computeOrientedMeasureAndCenter(*item, orientations[item.index()], centers[item.index()]);
78 SAVE_PROPERTY(IGeometryProperty::PMeasure,
Real, item, group,
math::normeR3(orientations[item.index()]));
79 SAVE_PROPERTY(IGeometryProperty::PLength,
Real, item, group,
math::normeR3(orientations[item.index()]));
80 SAVE_PROPERTY(IGeometryProperty::PArea,
Real, item, group, 0);
81 SAVE_PROPERTY(IGeometryProperty::PVolume,
Real, item, group, 0);
82 SAVE_PROPERTY(IGeometryProperty::PCenter,
Real3, item, group, centers[item.index()]);
83 SAVE_PROPERTY(IGeometryProperty::PNormal,
Real3, item, group, orientations[item.index()]);
84 SAVE_PROPERTY(IGeometryProperty::PVolumeSurfaceRatio,
Real, item, group, 0);
87 template <
typename ComputeSurfaceFunctor>
94 ComputeSurfaceFunctor functor(&m_geom);
95 ENUMERATE_ITEMWITHNODES(item, group)
97 functor.computeOrientedMeasureAndCenter(*item, normals[item.index()], centers[item.index()]);
100 SAVE_PROPERTY(IGeometryProperty::PMeasure,
Real, item, group,
math::normeR3(normals[item.index()]));
101 SAVE_PROPERTY(IGeometryProperty::PLength,
Real, item, group, 0);
102 SAVE_PROPERTY(IGeometryProperty::PArea,
Real, item, group,
math::normeR3(normals[item.index()]));
103 SAVE_PROPERTY(IGeometryProperty::PVolume,
Real, item, group, 0);
104 SAVE_PROPERTY(IGeometryProperty::PCenter,
Real3, item, group, centers[item.index()]);
105 SAVE_PROPERTY(IGeometryProperty::PNormal,
Real3, item, group, normals[item.index()]);
106 SAVE_PROPERTY(IGeometryProperty::PVolumeSurfaceRatio,
Real, item, group, 0);
109 template <
typename ComputeVolumeFunctor>
116 ComputeVolumeFunctor functor(&m_geom);
117 ENUMERATE_ITEMWITHNODES(item, group)
119 functor.computeOrientedMeasureAndCenter(*item, volumes[item.index()], centers[item.index()]);
122 SAVE_PROPERTY(IGeometryProperty::PMeasure,
Real, item, group, volumes[item.index()]);
123 SAVE_PROPERTY(IGeometryProperty::PLength,
Real, item, group, 0);
124 SAVE_PROPERTY(IGeometryProperty::PArea,
Real, item, group, 0);
125 SAVE_PROPERTY(IGeometryProperty::PVolume,
Real, item, group, volumes[item.index()]);
126 SAVE_PROPERTY(IGeometryProperty::PCenter,
Real3, item, group, centers[item.index()]);
127 SAVE_PROPERTY(IGeometryProperty::PNormal,
Real3, item, group, 0);
129 if (m_group_property->hasProperty((IGeometryProperty::PVolumeSurfaceRatio))) {
131 ENUMERATE_ITEMWITHNODES(item, group)
133 functor.computeVolumeArea(*item, areas[item.index()]);
135 SAVE_PROPERTY(IGeometryProperty::PVolumeSurfaceRatio,
Real, item, group, volumes[item.index()] / areas[item.index()]);
143 applyLineTemplate<typename GeometryT::ComputeLine2>(group);
148 applySurfaceTemplate<typename GeometryT::ComputeTriangle3>(group);
153 applySurfaceTemplate<typename GeometryT::ComputeQuad4>(group);
158 applySurfaceTemplate<typename GeometryT::ComputePentagon5>(group);
163 applySurfaceTemplate<typename GeometryT::ComputeHexagon6>(group);
168 applyVolumeTemplate<typename GeometryT::ComputeTetraedron4>(group);
173 applyVolumeTemplate<typename GeometryT::ComputePyramid5>(group);
178 applyVolumeTemplate<typename GeometryT::ComputePentaedron6>(group);
183 applyVolumeTemplate<typename GeometryT::ComputeHexaedron8>(group);
188 applyVolumeTemplate<typename GeometryT::ComputeHeptaedron10>(group);
193 applyVolumeTemplate<typename GeometryT::ComputeOctaedron12>(group);
198 applyVolumeTemplate<typename GeometryT::ComputeHemiHexa7>(group);
203 applyVolumeTemplate<typename GeometryT::ComputeHemiHexa6>(group);
208 applyVolumeTemplate<typename GeometryT::ComputeHemiHexa5>(group);
213 applyVolumeTemplate<typename GeometryT::ComputeAntiWedgeLeft6>(group);
218 applyVolumeTemplate<typename GeometryT::ComputeAntiWedgeRight6>(group);
223 applyVolumeTemplate<typename GeometryT::ComputeDiTetra5>(group);
226 void applyDualNode(
ItemVectorView group) { ARCANE_UNUSED(group); }
227 void applyDualEdge(
ItemVectorView group) { ARCANE_UNUSED(group); }
228 void applyDualFace(
ItemVectorView group) { ARCANE_UNUSED(group); }
229 void applyDualCell(
ItemVectorView group) { ARCANE_UNUSED(group); }