@@ -311,9 +311,9 @@ bool AdaptiveSIM::adaptMesh (int iStep, std::streamsize outPrec)
311311 if (eNorm .cols () < 1 || gNorm [adaptor ](adNorm ) < errTol * refNorm ) return false;
312312
313313 // Calculate row index in eNorm of the error norm to adapt based on
314- size_t i , eRow = adNorm ;
314+ size_t eRow = adNorm ;
315315 NormBase * norm = model .getNormIntegrand ();
316- for (i = 0 ; i < adaptor ; i ++ )
316+ for (size_t i = 0 ; i < adaptor ; i ++ )
317317 eRow += norm -> getNoFields (i + 1 );
318318 delete norm ;
319319
@@ -363,10 +363,12 @@ bool AdaptiveSIM::adaptMesh (int iStep, std::streamsize outPrec)
363363#ifdef HAS_LRSPLINE
364364 prm .MLGN = GlobalNodes ::calcGlobalNodes (refBasis , model .getInterfaces ());
365365 nNodes = * std ::max_element (prm .MLGN .back ().begin (), prm .MLGN .back ().end ()) + 1 ;
366+ if (model .getProcessAdm ().getNoProcs () > 1 )
367+ prm .pMLGN = GlobalNodes ::calcDDMapping (refBasis , prm .MLGN , model , nNodes );
366368#endif
367369 }
368370 errors .reserve (nNodes );
369- for (i = 0 ; i < nNodes ; i ++ )
371+ for (int i = 0 ; i < nNodes ; i ++ )
370372 errors .push_back (DblIdx (0.0 ,i ));
371373
372374 for (i = 0 ; i < errors .size (); i ++ )
@@ -378,18 +380,21 @@ bool AdaptiveSIM::adaptMesh (int iStep, std::streamsize outPrec)
378380
379381 // extract element norms for this patch
380382 Vector locNorm (patch -> getNoElms ());
381- for (i = 1 ; i <= patch -> getNoElms (); ++ i )
383+ for (size_t i = 1 ; i <= patch -> getNoElms (); ++ i )
382384 locNorm (i ) = eNorm (eRow , patch -> getElmID (i ));
383385
384386 // remap from geometry basis to refinement basis
385387 Vector locErr (patch -> getNoRefineNodes ());
386388 static_cast < ASMunstruct * > (patch )-> remapErrors (locErr , locNorm );
387389
388390 // insert into global error array
389- for (i = 0 ; i < locErr .size (); ++ i )
390- if (model .getNoPatches () > 1 )
391- errors [prm .MLGN [patch -> idx ][i ]].first += locErr [i ];
392- else
391+ for (size_t i = 0 ; i < locErr .size (); ++ i )
392+ if (model .getNoPatches () > 1 ) {
393+ if (prm .pMLGN .empty ())
394+ errors [prm .MLGN [patch -> idx ][i ]].first += locErr [i ];
395+ else
396+ errors [prm .pMLGN [prm .MLGN [patch -> idx ][i ]]].first += locErr [i ];
397+ } else
393398 errors [i ].first += locErr [i ];
394399 }
395400 }
@@ -400,10 +405,21 @@ bool AdaptiveSIM::adaptMesh (int iStep, std::streamsize outPrec)
400405 <<" is available for isotropic_function only." << std ::endl ;
401406 return false;
402407 }
403- for (i = 0 ; i < eNorm .cols (); i ++ )
408+ for (size_t i = 0 ; i < eNorm .cols (); i ++ )
404409 errors .push_back (DblIdx (eNorm (eRow ,1 + i ),i ));
405410 }
406411
412+ #ifdef HAVE_MPI
413+ std ::vector < double > perr (errors .size (), 0.0 );
414+ if (model .getProcessAdm ().getNoProcs () > 1 ) {
415+ for (size_t i = 0 ; i < errors .size (); ++ i )
416+ perr [i ] = errors [i ].first ;
417+ model .getProcessAdm ().allReduce (perr , MPI_SUM );
418+ for (size_t i = 0 ; i < errors .size (); ++ i )
419+ errors [i ].first = perr [i ];
420+ }
421+ #endif
422+
407423 // Sort the elements in the sequence of decreasing errors
408424 std ::sort (errors .begin (),errors .end (),std ::greater < DblIdx > ());
409425
@@ -468,8 +484,15 @@ bool AdaptiveSIM::adaptMesh (int iStep, std::streamsize outPrec)
468484 return false;
469485
470486 prm .elements .reserve (refineSize );
471- for (i = 0 ; i < refineSize ; i ++ )
472- prm .elements .push_back (errors [i ].second );
487+ for (size_t i = 0 ; i < refineSize ; i ++ )
488+ if (prm .pMLGN .empty ())
489+ prm .elements .push_back (errors [i ].second );
490+ else {
491+ auto it = std ::find (prm .pMLGN .begin (),
492+ prm .pMLGN .end (), errors [i ].second );
493+ if (it != prm .pMLGN .end ())
494+ prm .elements .push_back (it - prm .pMLGN .begin ());
495+ }
473496
474497 // Now refine the mesh
475498 if (!storeMesh )
0 commit comments