79#ifdef PARALLEL_MODE_MPI
80 int updateReallyNeededGlobal = 0;
81 if (_statisticsUpdateNeeded ) {
82 updateReallyNeededGlobal = 1;
85 if (updateReallyNeededGlobal>0) {
86 _statisticsUpdateNeeded =
true;
92 if (_statisticsUpdateNeeded ) {
93 int updateReallyNeeded = 0;
94 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
95 if (_superGeometry->getBlockGeometry(iCloc).getStatistics().getStatisticsStatus() ) {
96 auto& blockGeometry =
const_cast<BlockGeometry<T,2>&
>(_superGeometry->getBlockGeometry(iCloc));
103#ifdef PARALLEL_MODE_MPI
107 if (updateReallyNeeded==0) {
108 _statisticsUpdateNeeded =
false;
117 std::set<int> tmpMaterials{};
118 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
119 const auto& blockMaterial2n = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaterial2n();
120 for (
auto [material, _] : blockMaterial2n) {
121 tmpMaterials.insert(material);
124 _nMaterials = tmpMaterials.size();
127 _material2n = std::map<int, int>();
129#ifdef PARALLEL_MODE_MPI
134 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
135 std::map<int, int> material2n = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaterial2n();
136 std::map<int, int>::iterator iter;
138 for (iter = material2n.begin(); iter != material2n.end(); iter++) {
139 if (iter->second!=0) {
140 std::vector<T> minPhysR = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMinPhysR(iter->first);
141 std::vector<T> maxPhysR = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaxPhysR(iter->first);
142 if (_material2n.count(iter->first) == 0) {
143 _material2n[iter->first] = iter->second;
144 _material2min[iter->first] = minPhysR;
145 _material2max[iter->first] = maxPhysR;
149 _material2n[iter->first] += iter->second;
150 for (
int iDim=0; iDim<2; iDim++) {
151 if (_material2min[iter->first][iDim] > minPhysR[iDim]) {
152 _material2min[iter->first][iDim] = minPhysR[iDim];
154 if (_material2max[iter->first][iDim] < maxPhysR[iDim]) {
155 _material2max[iter->first][iDim] = maxPhysR[iDim];
165#ifdef PARALLEL_MODE_MPI
166 int materials[_nMaterials];
167 int materialsInBuf[_nMaterials];
168 int materialCount[_nMaterials];
169 int materialCountInBuf[_nMaterials];
170 T materialMinR[2*_nMaterials];
171 T materialMaxR[2*_nMaterials];
172 T materialMinRinBuf[2*_nMaterials];
173 T materialMaxRinBuf[2*_nMaterials];
175 for (
int iM=0; iM<_nMaterials; iM++) {
178 for (
int iDim=0; iDim<2; iDim++) {
179 materialMinRinBuf[2*iM + iDim] = T();
180 materialMaxRinBuf[2*iM + iDim] = T();
184 std::map<int, int>::iterator iMaterial;
185 for (iMaterial = _material2n.begin(); iMaterial != _material2n.end(); iMaterial++) {
186 materials[counter] = iMaterial->first;
187 materialCount[counter] = iMaterial->second;
188 for (
int iDim=0; iDim<2; iDim++) {
189 materialMinR[2*counter + iDim] = _material2min[iMaterial->first][iDim];
190 materialMaxR[2*counter + iDim] = _material2max[iMaterial->first][iDim];
201 for (
int iM=0; iM<_nMaterials; iM++) {
202 if (materialsInBuf[iM]!=-1) {
203 std::vector<T> minPhysR(2,T());
204 std::vector<T> maxPhysR(2,T());
205 for (
int iDim=0; iDim<2; iDim++) {
206 minPhysR[iDim] = materialMinRinBuf[2*iM + iDim];
207 maxPhysR[iDim] = materialMaxRinBuf[2*iM + iDim];
209 if (_material2n.count(materialsInBuf[iM]) == 0) {
210 _material2n[materialsInBuf[iM]] = materialCountInBuf[iM];
211 _material2min[materialsInBuf[iM]] = minPhysR;
212 _material2max[materialsInBuf[iM]] = maxPhysR;
215 _material2n[materialsInBuf[iM]] += materialCountInBuf[iM];
216 for (
int iDim=0; iDim<2; iDim++) {
217 if (_material2min[materialsInBuf[iM]][iDim] > minPhysR[iDim]) {
218 _material2min[materialsInBuf[iM]][iDim] = minPhysR[iDim];
220 if (_material2max[materialsInBuf[iM]][iDim] < maxPhysR[iDim]) {
221 _material2max[materialsInBuf[iM]][iDim] = maxPhysR[iDim];
235 clout <<
"updated" << std::endl;
237 _statisticsUpdateNeeded =
false;