@@ -214,7 +214,8 @@ bool AdaptiveSIM::initAdaptor (size_t normGroup)
214214}
215215
216216
217- bool AdaptiveSIM ::solveStep (const char * inputfile , int iStep , bool withRF )
217+ bool AdaptiveSIM ::solveStep (const char * inputfile , int iStep , bool withRF ,
218+ std ::streamsize precision )
218219{
219220 model .getProcessAdm ().cout <<"\nAdaptive step " << iStep << std ::endl ;
220221 if (iStep > 1 )
@@ -265,7 +266,7 @@ bool AdaptiveSIM::solveStep (const char* inputfile, int iStep, bool withRF)
265266 return false;
266267
267268 return model .dumpResults (solution .front (),0.0 ,
268- model .getProcessAdm ().cout ,true,6 );
269+ model .getProcessAdm ().cout ,true,precision );
269270}
270271
271272
@@ -276,12 +277,14 @@ bool AdaptiveSIM::solveStep (const char* inputfile, int iStep, bool withRF)
276277typedef std ::pair < double ,int > DblIdx ;
277278
278279
279- bool AdaptiveSIM ::adaptMesh (int iStep )
280+ bool AdaptiveSIM ::adaptMesh (int iStep , std :: streamsize outPrec )
280281{
281282 if (iStep < 2 )
282283 return true;
283284
285+ std ::streamsize oldPrec = outPrec > 0 ? IFEM ::cout .precision (outPrec ) : 0 ;
284286 this -> printNorms ();
287+ if (outPrec > 0 ) IFEM ::cout .precision (oldPrec );
285288
286289 if (adaptor >= gNorm .size () || adaptor >= eNorm .rows ())
287290 return false;
@@ -346,22 +349,23 @@ bool AdaptiveSIM::adaptMesh (int iStep)
346349 std ::vector < DblIdx > errors ;
347350 if (scheme == 2 ) // use errors per function
348351 {
349- if (model .getFEModel ()[0 ]-> getNoRefineNodes () !=
350- model .getFEModel ()[0 ]-> getNoNodes (1 )) {
351- if (model .getNoPatches () > 1 ) {
352- std ::cerr <<" *** AdaptiveSIM::adaptMesh: Multi-patch refinement"
353- <<" is not available for mixed models." << std ::endl ;
354- return false;
355- }
356- errors .reserve (model .getFEModel ()[0 ]-> getNoRefineNodes ());
357- for (i = 0 ; i < model .getFEModel ()[0 ]-> getNoRefineNodes (); i ++ )
358- errors .push_back (DblIdx (0.0 ,i ));
359- } else {
360- errors .reserve (model .getNoNodes ());
361- for (i = 0 ; i < model .getNoNodes (); i ++ )
362- errors .push_back (DblIdx (0.0 ,i ));
352+ ASMbase * patch = model .getPatch (1 );
353+ if (!patch ) return false;
354+
355+ if (patch -> getNoRefineNodes () == patch -> getNoNodes (1 ))
356+ errors .resize (model .getNoNodes (),DblIdx (0.0 ,0 ));
357+ else if (model .getNoPatches () == 1 )
358+ errors .resize (patch -> getNoRefineNodes (),DblIdx (0.0 ,0 ));
359+ else
360+ {
361+ std ::cerr <<" *** AdaptiveSIM::adaptMesh: Multi-patch refinement"
362+ <<" is not available for mixed models." << std ::endl ;
363+ return false;
363364 }
364365
366+ for (i = 0 ; i < errors .size (); i ++ )
367+ errors [i ].second = i ;
368+
365369 for (ASMbase * patch : model .getFEModel ()) {
366370 if (!patch ) return false;
367371
@@ -407,8 +411,8 @@ bool AdaptiveSIM::adaptMesh (int iStep)
407411 limit = errors .front ().first * beta /100.0 ;
408412 break ;
409413 case AVERAGE : // beta percent of avg error (typical 100%)
410- for (size_t i = 0 ; i < errors . size (); i ++ )
411- sumErr += errors [ i ] .first ;
414+ for (const DblIdx & error : errors )
415+ sumErr += error .first ;
412416 limit = sumErr /errors .size () * beta /100.0 ;
413417 break ;
414418 case MINIMUM : // beta percent of min error (more than 100%)
0 commit comments