// JS.Primales Problem zusammenstellen.
void
-Laplace::assemble_primal(const Function<2>&,const Function<2>&)
+Laplace::assemble_primal()
{
deallog << "Assembling primal problem" << endl;
// JS. Platz für neue Matrix mit (?) (2x = quadratisch) Anzahl der Zellen,
}
-// JS. Ergebnis zurückgeben. Wie funktioniert das ?
-double
-Laplace::result(const Function<2>& interior, const Function<2>& boundary)
-{
- double erg = 0., ergex = 0.;
- FEValues<2> fevalues(fe_primal, qc_integrate,
- UpdateFlags(update_q_points | update_JxW_values));
- FEFaceValues<2> ffvalues(fe_primal, qf_integrate,
- UpdateFlags(update_q_points | update_JxW_values));
- vector<double> uh(qc_integrate.n_quadrature_points);
- vector<double> uf(qf_integrate.n_quadrature_points);
-
- // JS.Alle Zellen durch.
- for (DoFHandler<2>::active_cell_iterator c = dof_primal.begin_active()
- ; c != dof_primal.end() ; ++c)
- {
- double s = 0.;
- fevalues.reinit(c, stb);
-
- fevalues.get_function_values(u, uh);
-
- for (unsigned int k=0;k<qc_integrate.n_quadrature_points;++k)
- {
- s += fevalues.JxW(k)
- * uh[k] * interior(fevalues.get_quadrature_points()[k]);
- ergex += fevalues.JxW(k)
- // * exact(fevalues.get_quadrature_points()[k])
- * interior(fevalues.get_quadrature_points()[k]);
- }
- // JS.Alle Zellränder.
- for (unsigned fi=0;fi<GeometryInfo<2>::faces_per_cell;++fi)
- {
- DoFHandler<2>::face_iterator f = c->face(fi);
- unsigned char bi = f->boundary_indicator();
- if (bi == 0xFF) continue;
- ffvalues.reinit(c, fi, stb);
- ffvalues.get_function_values(u, uf);
-
- // JS.??? Integrationspunkte ???
- for (unsigned k=0;k<qf_primal.n_quadrature_points;++k)
- {
- s += ffvalues.JxW(k)
- * uf[k] * boundary(ffvalues.get_quadrature_points()[k]);
- }
- }
- erg += s;
- }
- deallog << "Results " << setw(18) << setprecision(15) << erg << " " << ergex << endl;
- return erg;
-}
-
-// JS. Gitter anpassen
-void
-Laplace::adapt()
-{
- tr.refine_and_coarsen_fixed_fraction(f, .5, 0);
-}
-
class Laplace
{
- Function<2>& exact;
protected:
Point<2> direction;
Triangulation<2> tr;
DoFHandler<2> dof_primal;
-// DoFHandler<2> dof_dual;
dSMatrixStruct matrix_structure;
AdvMatrix A;
~Laplace();
void remesh(unsigned int global_refine = 0);
- void assemble_primal(const Function<2>& boundary, const Function<2>& rhs);
+ void assemble_primal();
void solve_primal();
- double result(const Function<2>& interior, const Function<2>& boundary);
-
- void adapt();
-
void write_data(const char* name);
-
- void fill_vector(dVector& v, const Function<2>& f) const;
};
deallog << "Firstgrid " << firstgrid << endl;
// JS.Benötigte Funktionen zur Lösung des Problems
- WeightFunction weight;
- BoundaryFct boundary;
Laplace lap;
// JS.Logstream ist ein stack, ab hier wird "Adaptive:" vor jede Zeile
lap.remesh(firstgrid);
else
{
-//JS. lap.adapt();
lap.remesh(1);
}
deallog.push("Primal");
// JS.exakte Lösung mit 0 auf der rechten Seite
- lap.assemble_primal(boundary,zero);
+ lap.assemble_primal();
lap.solve_primal();
// JS.ab hier kein "Adaptive:" mehr
deallog.pop();
sprintf(fname,"T%02d",step);
- // JS.Daten zurückschreiben. Aber welche ?
- lap.result(weight,boundary);
+ // JS.Daten zurückschreiben.
lap.write_data(fname);
}
// JS.Logfile sauber abschließen und Schluß