Yeah I just got the compiler warning for (int) instead of (int *).
Final remark of the day, with GMSH you can do the following in the .geo:

Physical Line("bottom") = {line_id1};
Physical Line("right")     = {line_id2};
Physical Line("left")       = {line_id3};
Physical Line("top")       = {line_id4};

which in turns will get you something like this in the .msh:

$PhysicalNames
4
1 2 "bottom"
1 3 "right"
1 4 "left"
1 5 "top"
$EndPhysicalNames

It would be cool to catch these in order to define multiple label names to get a Petsc structure that looks like this:
Labels:
  bottom: 1 strata of sizes (12)
  right: 1 strata of sizes (12)
  top: 1 strata of sizes (12)
  left: 1 strata of sizes (12)
  depth: 3 strata of sizes (169, 312, 144)

instead of:
Labels:
  Face Sets: 4 strata of sizes (12, 12, 12, 12)
  depth: 3 strata of sizes (169, 312, 144)

Best,
Luc

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

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


You need &ids[0] and &ids[1].


    Matt, have you started writing some documentation for these function?


I thought I had, but I cannot find the branch.

    If not I could probably get something started since I'm reading them.


That would be great.

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


Yes, ex12 is all scalar. In the call to PetscFECreateDefault() there is a 1, which you would make 'dim'.

  Thanks,

    Matt

    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




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