Skip to content

Commit 3a9a8ae

Browse files
committed
Added: Optional arguments for setting the output precision in
AdaptiveSIM::solveStep and AdaptiveSIM::adaptMesh
1 parent 4c6d82e commit 3a9a8ae

2 files changed

Lines changed: 28 additions & 21 deletions

File tree

src/SIM/AdaptiveSIM.C

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
276277
typedef 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%)

src/SIM/AdaptiveSIM.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@ class AdaptiveSIM : public SIMadmin
4646
//! \param[in] inputfile File to read model parameters from after refinement
4747
//! \param[in] iStep Refinement step counter
4848
//! \param[in] withRF Whether nodal reaction forces should be computed or not
49-
bool solveStep(const char* inputfile, int iStep, bool withRF = false);
49+
//! \param[in] precision Number of digits after decimal point
50+
bool solveStep(const char* inputfile, int iStep, bool withRF = false,
51+
std::streamsize precision = 6);
5052

5153
//! \brief Refines the current mesh based on the element norms.
5254
//! \param[in] iStep Refinement step counter
53-
bool adaptMesh(int iStep);
55+
//! \param[in] outPrec Number of digits after the decimal point in norm print
56+
bool adaptMesh(int iStep, std::streamsize outPrec = 0);
5457

5558
//! \brief Writes current mesh and results to the VTF-file.
5659
//! \param[in] infile File name used to construct the VTF-file name from

0 commit comments

Comments
 (0)