Skip to content

Commit 54a90f2

Browse files
authored
Merge pull request #24 from nicola-giuliani/new_quadrature_set_up
new singular quadrature routine
2 parents 79ff603 + 65ad647 commit 54a90f2

3 files changed

Lines changed: 353 additions & 85 deletions

File tree

include/bem_problem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class BEMProblem : public ParameterAcceptor
128128
/// in our computations (assemble system and compute_normals-gradients).
129129
void reinit();
130130

131+
const Quadrature<dim-1> & get_singular_quadrature(const unsigned int index) const;
132+
131133
/// This function compute a very specific case, a double node that has a
132134
/// dirichlet-dirichlet condition. In this case there is a constraint for
133135
/// the normal derivative since we want a conitnuos velocity thus a conitnuos

source/bem_problem.cc

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,44 @@ void BEMProblem<dim>::reinit()
316316

317317
}
318318

319+
320+
template<>
321+
const Quadrature<2> &BEMProblem<3>::get_singular_quadrature(const unsigned int index) const
322+
{
323+
Assert(index < fe->dofs_per_cell,
324+
ExcIndexRange(0, fe->dofs_per_cell, index));
325+
326+
327+
328+
static std::vector<Quadrature<2> > quadratures;
329+
{
330+
if (quadratures.size() == 0)
331+
for (unsigned int i=0; i<fe->dofs_per_cell; ++i)
332+
{
333+
quadratures.push_back(QSplit<2> (QDuffy (singular_quadrature_order,1.),fe->get_unit_support_points()[i]));
334+
}
335+
}
336+
337+
return quadratures[index];
338+
339+
}
340+
341+
template<>
342+
const Quadrature<1> &BEMProblem<2>::get_singular_quadrature(const unsigned int index) const
343+
{
344+
Assert(index < fe->dofs_per_cell,
345+
ExcIndexRange(0, fe->dofs_per_cell, index));
346+
347+
static std::vector<Quadrature<1> > quadratures;
348+
if (quadratures.size() == 0)
349+
for (unsigned int i=0; i<fe->dofs_per_cell; ++i)
350+
{
351+
quadratures.push_back(QTelles<1>(singular_quadrature_order,
352+
fe->get_unit_support_points()[i]));
353+
}
354+
return quadratures[index];
355+
}
356+
319357
template <int dim>
320358
void BEMProblem<dim>::declare_parameters (ParameterHandler &prm)
321359
{
@@ -566,25 +604,6 @@ void BEMProblem<dim>::assemble_system()
566604
dirichlet_matrix = 0;
567605

568606

569-
std::vector<Quadrature<dim-1> > sing_quadratures;
570-
for (unsigned int i=0; i<fe->dofs_per_cell; ++i)
571-
{
572-
if (fe->degree > 1)
573-
{
574-
sing_quadratures.push_back(QIterated<dim-1>(QGauss<1> (singular_quadrature_order),fe->degree));
575-
}
576-
else
577-
{
578-
sing_quadratures.push_back
579-
(QTelles<dim-1>(singular_quadrature_order,
580-
fe->get_unit_support_points()[i]));
581-
//
582-
// Usage of alternative singular quadrature formula
583-
// (QGaussOneOverR<dim-1>(singular_quadrature_order,
584-
// fe->get_unit_support_points()[i],true));
585-
}
586-
}
587-
588607

589608
// Next, we initialize an FEValues
590609
// object with the quadrature
@@ -945,8 +964,7 @@ void BEMProblem<dim>::assemble_system()
945964

946965
const Quadrature<dim-1> *
947966
singular_quadrature
948-
= dynamic_cast<Quadrature<dim-1>*>(
949-
&sing_quadratures[singular_index]);
967+
= &(get_singular_quadrature(singular_index));
950968
Assert(singular_quadrature, ExcInternalError());
951969

952970
FEValues<dim-1,dim> fe_v_singular (*mapping, *fe, *singular_quadrature,

0 commit comments

Comments
 (0)