I
am solving a cylinder symmetric Poisson
problem in deal.ii.
My
program is already working properly, but I
found the solution by trial&error, and my
hope is to get the final understanding of what
I did via the user group.
My
question is closely related to this
stack exchange question , wherethe
math is done for an equation independent on
the z coordinate, but depending on theta.
The
Poisson equation (strong form) in cylinder
coordinates with cylinder symmetry is
1r∂∂r(r∂∂rϕ(r,z))+∂2dz2ϕ(r,z)=−ρ(r,z)
In order to avoid the sinularity at r = 0, Prof. Bangerth
suggested in the SE link to multiply with the proper area element
2
p r dr dz in order to get the weak
form
\frac{1}{r} \frac{∂}{∂r}(r \frac{∂}{∂r}
\phi(r,z)) + \frac{∂^2}{dz^2}\phi(r,z) = - \rho(r,z)
∫0R∫−∞∞φ(r,z){∂∂r(r∂∂rϕ(r,z))+r∂2∂z2ϕ(r,z)}drdz=
-∫0R∫−∞∞φ(r,z)ρ(r,z)rdrdz
After integration by parts, I get
the following equation (where I am not so sure anymore if it is
correct):
∫0R∫−∞∞r∂φ∂r∂ϕ∂r+r∂φ∂z∂ϕdzdrdz=∫0R∫−∞∞ϕρrdrdz\int_0^R
\int_{-\infinity}^\infinity r \frac{∂\varphi}{∂r}
\frac{∂\phi}{∂r} + r
\frac{∂\varphi}{∂z}\frac{∂\phi}{dz} dr dz =
\int_0^R \int_{-\infinity}^\infinity \phi \rho r
dr dz
My questions now are
a) Is the weak form above correct
for the cylinder symmetric case?
b) How do I implement this in
deal.ii?
c) When I look at the first term in
the PDE's strong form, I can carry out the first term r
derivative by applying the derivative product rule, which
results in terms having a first and a second derivative in r,
respectively. Therefore, the solution should be in any case a
linear combination of first derivative and second derivative
values.
I used tutorial step-63 with
success as a starting point, where the advection-diffusion
equation has both a second derivative (diffusion) term, and a
first derivative (=advection) term. Further, I used an analytic
known solution of my problem to compare the results, and I get
reasonable solutions for e = 1 and b = 2. But why beta = 2 and
not beta = 1?
Another way of looking at the
problem: I found just by experimenting, that the following to
deal.ii implementations give the same (reasonable) results for
my problem:
//--- first
implementation ----
double
advection_direction[0] = 2.0, double
advection_direction[1] = 0;
cell_matrix(i, j) +=
fe_values.JxW(q_point)* (
(radius
* fe_values.shape_grad(i, q_point) * fe_values.shape_grad(j,
q_point)) +
(fe_values.shape_value(i, q_point) *
(advection_direction * fe_values.shape_grad(j, q_point) );
cell_rhs(i) += radius
* radius * some_value;
//---- second
implementation, but identical results ---
double
advection_direction[0] = 1.0, double
advection_direction[1] = 0;
cell_matrix(i, j) +=
fe_values.JxW(q_point)* (
(fe_values.shape_grad(i, q_point) * fe_values.shape_grad(j,
q_point)) +
(1.0 / radius *
fe_values.shape_value(i, q_point) * (advection_factor *
fe_values.shape_grad(j, q_point) );
cell_rhs(i) +=
some_value;
The difference between both versions seems to be a factor r² in
the weak form. But I don't understand why the advection term needs
a different value ( 1 versus 2) for both versions. My impression
is that the factor of 2 is a result of the integration by parts,
when including a factor r² (its derivative is 2r), but I don't see
the actual connection between my experimental results and the math
above.
Any help or hint into the right direction is appreciated
Regards
Andreas