Hi Pietro

Why are you note using a volume integral to evaluate the Neumann contribution at a face (i.e. a point)? Surely you should be using the equivalent of the face quadrature in 1D? I know this is covered in the docs somewhere.

regards
Andrew

On 28 Sep 2009, at 7:21 PM, Pietro Maximoff wrote:

Hi

My main problem is the application of the Neumann B.C in 1D. Initially, I thought this was all fine but compared to the exact solution, it's far from it. Below is the assemble_system function I'm using. I'm not applying the Neumann B.C properly. So, could you please help look over the code and point out what I'm doing wrong.

The governing differential equation is:

d/dx (x * du/dx) = 2/x^2                   on  the domain   1 <  x < 2

subject to these boundary conditions:

u(1) = 2
(-x * du/dx) = 0.5   @ x = 2


The assemble function:

template <int dim>
void LaplaceProblem<dim>::assemble_system ()
{
    QGauss<dim>  quadrature_formula(3);
    //QGauss<dim-1> face_quadrature_formula(3);


    const RightHandSide<dim> right_hand_side;


    FEValues<dim> fe_values (fe, quadrature_formula,
            update_values   | update_gradients |
            update_quadrature_points | update_JxW_values);

//    FEFaceValues<dim> fe_face_values (fe, face_quadrature_formula,
//            update_values         | update_quadrature_points  |
//            update_normal_vectors | update_JxW_values);

    const unsigned int   dofs_per_cell = fe.dofs_per_cell;
    const unsigned int   n_q_points    = quadrature_formula.size();
// const unsigned int n_face_q_points = face_quadrature_formula.size();

    FullMatrix<double>   cell_matrix (dofs_per_cell, dofs_per_cell);
    Vector<double>       cell_rhs (dofs_per_cell);

    std::vector<unsigned int> local_dof_indices (dofs_per_cell);


typename DoFHandler<dim>::active_cell_iterator cell = dof_handler.begin_active(),
    endc = dof_handler.end();

    for (; cell!=endc; ++cell)
    {
        fe_values.reinit (cell);
        cell_matrix = 0;
        cell_rhs = 0;

        for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
            for (unsigned int i=0; i<dofs_per_cell; ++i)
            {
                for (unsigned int j=0; j<dofs_per_cell; ++j)
cell_matrix(i,j) += (fe_values.shape_grad (i, q_point) * fe_values.shape_grad (j, q_point) * fe_values.JxW (q_point)) * fe_values.quadrature_point(q_point)[0];

cell_rhs(i) += (fe_values.shape_value (i, q_point) * right_hand_side.value (fe_values.quadrature_point (q_point)) * fe_values.JxW (q_point));
            }
for (unsigned int vertex=0;
              vertex < GeometryInfo<2>::vertices_per_cell;
              ++vertex)
for (unsigned int vertex = 0; vertex < GeometryInfo<1>::vertices_per_cell; ++vertex
          if (cell->at_boundary(1) == true) {
              fe_values.reinit(cell);

for (unsigned int q_point=0; q_point<n_q_points; + +q_point){
                    const double neumann_value = -0.5;

                   for (unsigned int i=0; i<dofs_per_cell; ++i)
cell_rhs(i) += (neumann_value * fe_values.shape_value(i,q_point) * fe_values.JxW(q_point));
              }

          }

        cell->get_dof_indices (local_dof_indices);
        for (unsigned int i=0; i<dofs_per_cell; ++i)
        {
            for (unsigned int j=0; j<dofs_per_cell; ++j)
                system_matrix.add (local_dof_indices[i],
                        local_dof_indices[j],
                        cell_matrix(i,j));

            system_rhs(local_dof_indices[i]) += cell_rhs(i);
        }
    }


    std::map<unsigned int,double> boundary_values;
    VectorTools::interpolate_boundary_values (dof_handler,
            0,
            BoundaryValues<dim>(),
            boundary_values);
    MatrixTools::apply_boundary_values (boundary_values,
            system_matrix,
            solution,
            system_rhs);
}


Thank you.

Pietro


_______________________________________________
dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii

_______________________________________________
dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii

Reply via email to