Hello,

Thanks you, it works. If I remove the NullSpaceCondition I get the correct solution also with Neumann BC. From my point of view, the linear system I get is not singular because there is a unique solution. Do you agree ?

Regards,
Olivier Bonnefon


On 11/25/2014 03:01 PM, Matthew Knepley wrote:
On Tue, Nov 25, 2014 at 4:08 AM, Olivier Bonnefon <[email protected] <mailto:[email protected]>> wrote:

    Hello,

    Thank you for your answer, I agree with you.

    I have adapted the ex12 example for the system:

    -\nabla \nabla u + u + f = 0 in \Omega  (1)

    with f = 4-x^2-y^2
    The solution is still x^2-y^2.

    It consists in adding the following gradient function:

    void g0_uu(const PetscScalar u[], const PetscScalar u_t[], const
    PetscScalar u_x[], const PetscScalar a[], const PetscScalar a_t[],
    const PetscScalar a_x[], const PetscReal x[], PetscScalar g0[])
    {
      g0[0] = 1.0;
    }
    ...
    //and set gradient
    ierr = PetscDSSetJacobian(prob, 0, 0, g0_uu, NULL, NULL,
    g3_uu);CHKERRQ(ierr);
    ...
    Of course, I have modified the f0_u function.


    With Dirichlet BC, I get the solution.

    With Neumann BC, the solution is still shifted down (-2/3). The
    problem (1) with Neumann BC has a unique solution.
    How remove the condition \int_\Omega u = 0 ?


That condition is one way of imposing boundary conditions for pressure. When I call MatSetNullSpace(), I am implying this condition. You can take out that call, but the system will be singular. You would have to add a condition on the pressure somehow, like fixing it at a point. This tends to make the system more ill-conditioned, but if that is appropriate
for you, then you make a similar call to

ierr = DMPlexAddBoundary(cdm, user->bcType == DIRICHLET, "wall", user->bcType == NEUMANN ? "boundary" : "marker", 0, user->exactFuncs[0], 1, &id, user);CHKERRQ(ierr);

but for field 1. To test , you can jsut change 0 to 1 in this call. However, this sets the entire boundary, and you really only need to set the pressure at one point, so you could make another label that only has a single point and use that instead.

  Thanks,

     Matt

    Thanks
    Olivier Bonnefon



    On 11/06/2014 07:14 AM, Matthew Knepley wrote:
    On Mon, Nov 3, 2014 at 9:46 AM, Olivier Bonnefon
    <[email protected]
    <mailto:[email protected]>> wrote:

        Hello,

        Thank for your answer, I'll explain my trouble:

        My problem is that the BC Neumann leads to wrong result.

        With Dirichlet BC, I get:
        -------------------------------

        > ./ex12 -run_type full -refinement_limit 0.0    -bc_type
        dirichlet -interpolate 0 -petscspace_order 1 -show_initial
        -show_solution -dm_plex_print_fem 1
        ...
        ...
        Solution
        Vec Object:potential 1 MPI processes
          type: seq
        0.5

        This result is correct.

        With Neuman BC, I get:
        --------------------------------

        > ./ex12 -run_type full -refinement_limit 0.0    -bc_type
        neumann -interpolate 1 -petscspace_order 1 -show_initial
        -dm_plex_print_fem 1 -show_solution -bd_petscspace_order 1
        -snes_linesearch_monitor -snes_monitor
        -ksp_monitor_true_residual -snes_converged_reason
        -ksp_converged_reason
        ....
        ....


        Solution
        Vec Object:potential 1 MPI processes
          type: seq
        -0.75
        -0.583333
        0.0833333
        -0.583333
        -0.333333
        0.416667
        0.0833333
        0.416667
        1.25


        That is not the values of the solution x*x+y*y.


    Sorry, this is poor documentation on my part. I will fix it in
    the example. The Naumann solution
    explicitly discards the constant part, meaning

      \int_\Omega u = 0

    If we look at my solution

      \int^1_0 dx \int^1_0 dy x^2 + y^2 = 2/3

    However, this is for the continuum result, whereas we are
    enforcing this in the discrete case.
    Thus, what we really get is 0.75, since we are integrating linear
    patches instead of quadratic
    patches. After shifting by that, you still do not get exactly x^2
    + y^2 since there is some
    discretization error. If you run with P2 you should get the exact
    answer, shifted down to eliminate
    the DC component.

      Thanks,

         Matt


        I tried many ksp options.
        Moreover, the neumann BC with "-run_type full" is not cover
        in the list
        
https://bitbucket.org/petsc/petsc/src/fced3c3f9e703542693913793d15321603e40fe6/config/builder.py?at=master#cl-257

        Do you know what is wrong ?

        Thanks,

        Olivier Bonnefon

        On 10/31/2014 06:50 PM, Matthew Knepley wrote:
        On Fri, Oct 31, 2014 at 10:43 AM, Olivier Bonnefon
        <[email protected]
        <mailto:[email protected]>> wrote:

            Hello,

            I'm working on the snes/examples/tutorial/ex12 version
            3.5.2.

            I didn't succed to run the simplest case with Neumann BC:

            ./ex12 -run_type full -refinement_limit 0.0 -bc_type
            neumann -interpolate 1 -petscspace_order 1 -show_initial
            -dm_plex_print_fem 1 -show_solution -bd_petscspace_order
            1 -snes_linesearch_monitor -snes_monitor
            -ksp_monitor_true_residual -snes_converged_reason
            -ksp_converged_reason

            This leads to dofs negatives values.


        I do not understand what you mean. Please always mail the
        full error message.

            Do you know the options to get a correct result with
            Neumann BC ?


        There are some tests here:

        
https://bitbucket.org/petsc/petsc/src/fced3c3f9e703542693913793d15321603e40fe6/config/builder.py?at=master#cl-257

           Matt

            Regards,
            Olivier Bonnefon




-- What most experimenters take for granted before they begin
        their experiments is infinitely more interesting than any
        results to which their experiments lead.
        -- Norbert Wiener


-- Olivier Bonnefon
        INRA PACA-Avignon, Unité BioSP
        Tel:+33 (0)4 32 72 21 58  <tel:%2B33%20%280%294%2032%2072%2021%2058>




-- What most experimenters take for granted before they begin their
    experiments is infinitely more interesting than any results to
    which their experiments lead.
    -- Norbert Wiener


-- Olivier Bonnefon
    INRA PACA-Avignon, Unité BioSP
    Tel:+33 (0)4 32 72 21 58  <tel:%2B33%20%280%294%2032%2072%2021%2058>




--
What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener


--
Olivier Bonnefon
INRA PACA-Avignon, Unité BioSP
Tel: +33 (0)4 32 72 21 58

Reply via email to