Dear all, 

I am implementing a very simple linear elastic problem, and I've succeeded 
in using Dirichlet conditions. However, reading the tutorial I am unable to 
implement a Neumann condition. In my simple example I have something like 
this:

 ^^^^^^^^^^ f
+----------+
|          |
|          |
|          |
|          |
+----------+
//////////// clamped

I don't understand how I can implement the integral on the top boundary, at 
the moment I've written this code (which does not compile):

    // Force (neumann bc), no force for now

    ConstantFunction<2> right_hand_side(std::vector<double>({ 0.0, 0.0 }));

    

    // Force on boundary (neumann bc)

    ConstantFunction<2> right_face_side(std::vector<double>({ 0.0, 111.0 
}));


    // For each cell

    for (auto cell : dof_handler.active_cell_iterators())

    {

        // Zero local matrix and vector

        cell_matrix = 0;

        cell_rhs    = 0;

        

        // Compute FE values for this cell

        fe_values.reinit(cell);

        

        // Compute lambda and mu (in case we can use custom functions)

        lambda.value_list(fe_values.get_quadrature_points(), lambda_values);

        mu.value_list(fe_values.get_quadrature_points(), mu_values);


        // Neumann force vector

        right_hand_side.vector_value_list(fe_values.get_quadrature_points(), 
rhs_values);


        // ...assemble lhs matrix and rhs vector


        // Neumann (boundary forces, 2 is top boundary)

        for (unsigned int face_number = 0; face_number < GeometryInfo<dim>::
faces_per_cell; ++face_number)

        {

            if (cell->face(face_number)->at_boundary() && (cell->face
(face_number)->boundary_id() == 2))

            {

                const unsigned int n_face_q_points = 
face_quadrature_formula.size();


                fe_face_values.reinit(cell, face_number);

                

                auto qps = fe_face_values.get_quadrature_points();


                for (unsigned int q_point = 0; q_point < n_face_q_points; 
++q_point)

                {

                    const double neumann_value = 
right_face_side.value(fe_face_values.quadrature_point(q_point));

                    

                    for (unsigned int i = 0; i < dofs_per_cell; ++i)

                    {

                        cell_rhs(i) += (neumann_value *

                                        fe_face_values.shape_value(i, 
q_point) *

                                        fe_face_values.JxW(q_point));

                    }

                }

            }

        } // Boundary forces

I have also tried to use the normal vector, but weirdly enough, I don't get 
a tension, but a shear with the following code:

                    const double neumann_value = (right_face_side.value(qps[
q_point], 0) * fe_face_values.normal_vector(q_point)[0])

                                               + (right_face_side.value(qps[
q_point], 1) * fe_face_values.normal_vector(q_point)[1]);

How can I implement this? 

Thanks!

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dealii+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to