88#ifdef PARALLEL_MODE_MPI
90 int updateReallyNeededGlobal = 0;
91 if (_statisticsUpdateNeeded) {
92 updateReallyNeededGlobal = 1;
96 if (updateReallyNeededGlobal>0) {
97 _statisticsUpdateNeeded =
true;
103 if (_statisticsUpdateNeeded ) {
104 int updateReallyNeeded = 0;
105 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
106 if (_superGeometry->getBlockGeometry(iCloc).getStatistics().getStatisticsStatus() ) {
107 auto& blockGeometry =
const_cast<BlockGeometry<T,3>&
>(_superGeometry->getBlockGeometry(iCloc));
109 updateReallyNeeded++;
114#ifdef PARALLEL_MODE_MPI
118 if (updateReallyNeeded==0) {
119 _statisticsUpdateNeeded =
false;
128 std::set<int> tmpMaterials{};
129 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
130 const auto& blockMaterial2n = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaterial2n();
131 for (
auto [material, _] : blockMaterial2n) {
132 tmpMaterials.insert(material);
135 _nMaterials = tmpMaterials.size();
138 _material2n = std::map<int, std::size_t>();
140#ifdef PARALLEL_MODE_MPI
145 for (
int iCloc=0; iCloc<_superGeometry->getLoadBalancer().size(); iCloc++) {
146 std::map<int, std::size_t> material2n = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaterial2n();
147 std::map<int, std::size_t>::iterator iter;
149 for (iter = material2n.begin(); iter != material2n.end(); iter++) {
150 if (iter->second!=0) {
151 std::vector<T> minPhysR = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMinPhysR(iter->first);
152 std::vector<T> maxPhysR = _superGeometry->getBlockGeometry(iCloc).getStatistics().getMaxPhysR(iter->first);
153 if (_material2n.count(iter->first) == 0) {
154 _material2n[iter->first] = iter->second;
155 _material2min[iter->first] = minPhysR;
156 _material2max[iter->first] = maxPhysR;
159 _material2n[iter->first] += iter->second;
160 for (
int iDim=0; iDim<3; iDim++) {
161 if (_material2min[iter->first][iDim] > minPhysR[iDim]) {
162 _material2min[iter->first][iDim] = minPhysR[iDim];
164 if (_material2max[iter->first][iDim] < maxPhysR[iDim]) {
165 _material2max[iter->first][iDim] = maxPhysR[iDim];
174#ifdef PARALLEL_MODE_MPI
175 std::ptrdiff_t materials[_nMaterials];
176 std::ptrdiff_t materialsInBuf[_nMaterials];
177 std::ptrdiff_t materialCount[_nMaterials];
178 std::ptrdiff_t materialCountInBuf[_nMaterials];
179 T materialMinR[3*_nMaterials];
180 T materialMaxR[3*_nMaterials];
181 T materialMinRinBuf[3*_nMaterials];
182 T materialMaxRinBuf[3*_nMaterials];
184 for (
int iM=0; iM<_nMaterials; iM++) {
187 for (
int iDim=0; iDim<3; iDim++) {
188 materialMinRinBuf[3*iM + iDim] = T();
189 materialMaxRinBuf[3*iM + iDim] = T();
192 std::size_t counter = 0;
193 std::map<int, std::size_t>::iterator iMaterial;
194 for (iMaterial = _material2n.begin(); iMaterial != _material2n.end(); iMaterial++) {
195 materials[counter] = iMaterial->first;
196 materialCount[counter] = iMaterial->second;
197 for (
int iDim=0; iDim<3; iDim++) {
198 materialMinR[3*counter + iDim] = _material2min[iMaterial->first][iDim];
199 materialMaxR[3*counter + iDim] = _material2max[iMaterial->first][iDim];
218 for (
int iM=0; iM<_nMaterials; iM++) {
219 if (materialsInBuf[iM]!=-1) {
220 std::vector<T> minPhysR(3,T());
221 std::vector<T> maxPhysR(3,T());
222 for (
int iDim=0; iDim<3; iDim++) {
223 minPhysR[iDim] = materialMinRinBuf[3*iM + iDim];
224 maxPhysR[iDim] = materialMaxRinBuf[3*iM + iDim];
226 if (_material2n.count(materialsInBuf[iM]) == 0) {
227 _material2n[materialsInBuf[iM]] = materialCountInBuf[iM];
228 _material2min[materialsInBuf[iM]] = minPhysR;
229 _material2max[materialsInBuf[iM]] = maxPhysR;
232 _material2n[materialsInBuf[iM]] += materialCountInBuf[iM];
233 for (
int iDim=0; iDim<3; iDim++) {
234 if (_material2min[materialsInBuf[iM]][iDim] > minPhysR[iDim]) {
235 _material2min[materialsInBuf[iM]][iDim] = minPhysR[iDim];
237 if (_material2max[materialsInBuf[iM]][iDim] < maxPhysR[iDim]) {
238 _material2max[materialsInBuf[iM]][iDim] = maxPhysR[iDim];
248 typename std::map< int, olb::Vector<T, 3> >::const_iterator iter;
250 for (
int iDim = 0; iDim < 3; iDim++ ) {
252 for ( iter = _material2min.begin(); iter != _material2min.end(); iter++ ) {
253 if ( iter->first != 0 ) {
254 if ( _minOverMaterial[iDim] > iter->second[iDim] ) {
255 _minOverMaterial[iDim] = iter->second[iDim];
260 for ( iter = _material2max.begin(); iter != _material2max.end(); iter++ ) {
261 if ( iter->first != 0 ) {
262 if ( _maxOverMaterial[iDim] < iter->second[iDim] ) {
263 _maxOverMaterial[iDim] = iter->second[iDim];
274 clout <<
"updated" << std::endl;
276 _statisticsUpdateNeeded =
false;