Ok, I think what I will do is the following:

void top_bc(const PetscReal x[], PetscScalar *u, void *ctx)
{
  *u = 0.2;
}
void bottom_bc(const PetscReal x[], PetscScalar *u, void *ctx)
{
  *u = 0.0;
}


ierr = DMPlexAddBoundary(dm, PETSC_TRUE,"bottom","Face Sets",0,(void (*)())bottom_bc,1,ids[0],&user);CHKERRQ(ierr); ierr = DMPlexAddBoundary(dm, PETSC_TRUE,"top","Face Sets",0,(void (*)())top_bc,1,ids[1],&user);CHKERRQ(ierr);

Matt, have you started writing some documentation for these function?
If not I could probably get something started since I'm reading them.

Another question, how do I explain to my DMPlex that I am solving an elasticity problem and hence my solution field will be a 2 components vector and not a scalar? I haven't seen where you set this info in snes example 12...

Best,
Luc

On 01/22/2015 05:19 PM, Matthew Knepley wrote:
On Thu, Jan 22, 2015 at 4:17 PM, Luc Berger-Vergiat <[email protected] <mailto:[email protected]>> wrote:

    Yes you are right, I corrected for the machine epsilon.
    I also looked deeper in Petsc's source code and I think I
    understand better how you implemented the GMSH reader.
    For instance the label I really care about is "Face Sets" since it
    detects automatically the BC's for me.
    An issue is that "Face Sets" contains 4 strata and I only care
    about two of these strata.
    How can I get the names of the Strata and how can I loop over the
    strata to assign my BCs?


Instead of "marker" give "Face Sets"

Instead of 1, give 2

Instead of &id give ids, where PetscInt ids[2] = {stratumValue1, stratumValue2}

  Thanks,

    Matt

    Best,
    Luc

    On 01/22/2015 05:12 PM, Matthew Knepley wrote:
    On Thu, Jan 22, 2015 at 12:08 PM, Luc Berger-Vergiat
    <[email protected] <mailto:[email protected]>> wrote:

        Hi all,
        I'm trying to test some functionalities in DMPlex,
        specifically I want to do a 2d fem simulation using a mesh
        generated by GMSH.
        At this point I am trying to understand how Dirichlet BC can
        be applied.

        Can you explain to me what arguments I have to pass to:
        DMPlexAddBoundary()?


      ierr = DMPlexAddBoundary(dm, PETSC_TRUE,"wall","marker",(void
    (*)())top_displacement,1,&id,user)

    PETSC_TRUE means that these unknowns will be eliminated from the
    global system

    "wall" is the name of the BC

    "marker" is the name of the DMLabel that you want to use to
    identify the mesh points

    1 is the number of label IDs that identify constrained mesh points

    id is the label ID which identifies constrained mesh points

    top_displacement is the function used to set boundary values

        I am attaching a little bit of c code and my mesh.geo and
        mesh.msh so that you understand the context.
        The BCs I want to apply are displacement of 0.2 in the y
        direction if y==1.0
        0.0 in the x direction if y==0.0


    I might do this:

    void top_displacement(const PetscReal x[], PetscScalar *u, void *ctx)
    {
      *u = x[1] < PETSC_MACHINE_EPSILON ? 0.0 : 0.2;
    }

      Thanks,

         Matt


-- Best,
        Luc




-- 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




--
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

Reply via email to