using namespace gismo;
int main(
int argc,
char *argv[])
{
real_t refParameter;
bool plot = false;
bool manual = false;
bool HB = false;
bool dump;
RefineLoopMax = 2;
initUnifRef = 2;
degree = 2;
refCriterion = PUCA;
refParameter = 0.85;
dump = false;
gsCmdLine cmd(
"Solving a PDE with adaptive refinement using THB-splines.");
cmd.addSwitch("plot", "Plot resulting mesh in ParaView", plot);
cmd.addInt("r", "refine", "Maximum number of adaptive refinement steps to perform",
RefineLoopMax);
cmd.addInt("i", "initial-ref", "Initial number of uniform refinement steps to perform",
initUnifRef);
cmd.addInt("", "degree", "Spline degree of the THB basis", degree);
cmd.addInt("c", "criterion", "Criterion to be used for adaptive refinement (1-3, see documentation)",
refCriterion);
cmd.addInt("E", "extension", "Criterion to be used for adaptive refinement (1-3, see documentation)",
refExt);
cmd.addReal("p", "parameter", "Parameter for adaptive refinement", refParameter);
cmd.addSwitch("dump", "Write geometry and sequence of bases into XML files",
dump);
cmd.addSwitch("manual", "Uses the 'addLevel' feature of the THB basis, where levels can be specified manually", manual);
cmd.addSwitch("HB", "Uses a Hierarchical basis instead of a Truncated Hierarchical basis", HB);
try { cmd.getValues(argc,argv); } catch (int rv) { return rv; }
gsInfo<<"Source function "<< f << "\n";
gsInfo<<"Exact solution "<< g <<".\n" << "\n";
gsInfo << " --- Geometry:\n" << *geo << "\n";
gsInfo << "Number of patches: " << patches.nPatches() << "\n";
if (dump)
gsInfo << "\nCoarse discretization basis:\n" << tbb << "\n";
for (int i = 0; i < initUnifRef; ++i)
{
if (manual)
else
tbb.uniformRefine();
}
if (manual)
{
if (HB)
else
for (
index_t k=0; k!=degree-2; k++)
{
tbb.removeKnot(0.5,0,1);
}
{
}
}
else
{
if (HB)
else
}
boxes.row(0)<<0.25,0.75;
boxes.row(1)<<0.00,1.00;
pa.options().setInt("DirichletValues", dirichlet::l2Projection);
if (dump)
gsWrite(bases[0],
"adapt_basis_0.xml");
for( int RefineLoop = 1; RefineLoop <= RefineLoopMax ; RefineLoop++ )
{
gsInfo << "\n============================== Loop " << RefineLoop << " of " << RefineLoopMax << " ==============================" << "\n" << "\n";
std::string unity_string = unity ? "has " : "does not have ";
gsInfo<<
" * Number of elements: "<<HTB_tmp->
numElements()<<
"\n";
gsInfo<<
" * Maximum level: "<<HTB_tmp->
maxLevel()+1<<
"\n";
gsInfo<<
" * Tree size: "<<HTB_tmp->
treeSize()<<
"\n";
gsInfo<<
" * Number of functions: "<<HTB_tmp->
size()<<
"\n";
gsInfo<<" * Size per level: ";
for(
unsigned i = 0; i<= HTB_tmp->
maxLevel(); i++)
gsInfo << HTB_tmp->getXmatrix()[i].size()<< " ";
gsInfo<<"\n";
gsInfo<<" * Partition of unity: The basis "<<unity_string<<"the partition of unity property\n";
gsInfo<<"=========================================================================\n";
gsInfo << "Assembling... " << std::flush;
pa.assemble();
gsInfo << "done." << "\n";
gsInfo << "Solving... " << std::flush;
gsMatrix<> solVector = gsSparseSolver<>::CGDiagonal(pa.matrix() ).solve( pa.rhs() );
gsInfo << "done." << "\n";
pa.constructSolution(solVector, mpsol);
ev.setIntegrationElements(pa.multiBasis());
gsExprEvaluator<>::geometryMap Gm = ev.getMap(patches);
auto ff = ev.getVariable(f, Gm);
ev.integralElWise( (ilapl(f1,Gm) + ff).sqNorm() *
meas(Gm) );
const std::vector<real_t> & elErrEst = ev.elementwise();
std::vector<bool> elMarked( elErrEst.size() );
gsInfo <<"Marked "<< std::count(elMarked.begin(), elMarked.end(), true)<<"\n";
pa.refresh();
if (dump)
{
std::stringstream ss;
ss << "adapt_basis_" << RefineLoop << ".xml";
gsWrite(pa.multiBasis()[0], ss.str());
}
if ( (RefineLoop == RefineLoopMax) && plot)
{
gsInfo<<"Plotting in Paraview...\n";
gsWriteParaview<>(sol, "p2d_adaRef_sol", 5001, true);
gsWriteParaview<>(pa.multiBasis()[0], "basis", 500, true);
}
}
gsInfo << "\nFinal basis: " << pa.multiBasis()[0] << "\n";
delete HTB;
return EXIT_SUCCESS;
}