On 08/28/2013 06:08 PM, Matthew Knepley wrote:
On Wed, Aug 28, 2013 at 10:01 AM, Olivier Bonnefon <[email protected] <mailto:[email protected]>> wrote:

    On 08/28/2013 10:28 AM, Olivier Bonnefon wrote:
    On 08/23/2013 04:42 PM, Matthew Knepley wrote:
    On Fri, Aug 23, 2013 at 9:35 AM, Olivier Bonnefon
    <[email protected]
    <mailto:[email protected]>> wrote:

        Hello,

        Thanks for your answers, I'm now able to import and
        distribute a mesh:


    You might simplify this to

    if (rank) {obNbCells = 0; obNbVertex = 0;}
    ierr =
    
DMPlexCreateFromCellList(comm,dim,obNbCells,obNbVertex,3,0,obCells,2,obVertex,dm);CHKERRQ(ierr);

        if (!rank){
                ierr =
        
DMPlexCreateFromCellList(comm,dim,obNbCells,obNbVertex,3,0,obCells,2,obVertex,dm);CHKERRQ(ierr);
                 for (i=0;i<obNbBound;i++){
                   ierr =DMPlexSetLabelValue(*dm, "marker",
        obBoundary[i]+obNbCells, 1);CHKERRQ(ierr);
                 }
        }else {
                  ierr =
        
DMPlexCreateFromCellList(comm,dim,0,0,3,0,obCells,2,obVertex,dm);CHKERRQ(ierr);
        }

        ierr = DMPlexDistribute(*dm, partitioner, 0,
        &distributedMesh);CHKERRQ(ierr);
        if (distributedMesh) {
              ierr = DMDestroy(dm);CHKERRQ(ierr);
              *dm  = distributedMesh;
        }

        Is it possible to known the resulting partition ? ie, What
        is the mapping between the initial cell number and the local
        cell (used in DMPlexComputeResidualFEM)?
        I need this to write an efficient implementation of the FEM
        struct functions f0 and g0, space depending.


    Yes, but I really do not think you want to do things that way. I
    am assuming you want different material models or something
    in different places. The way I envision that is using a DMLabel
    to mark up parts of the domain. All labels are automatically
    distributed with the mesh. Is that what you want?
    Hello,

    It is exactly what I need: I'm mobilized a landscape, and the
    parameters of the model depend of the type of crop. Therefore, I
    have created a label for each type of crop and I have labeled
    each triangle with the corresponding label:

     for (i=0;i<obNbCells;i++){
         if (labelCells[i]==1){
            ierr =DMPlexSetLabelValue(*dm, "marker1", i,
    1);CHKERRQ(ierr);
         }else{
            ierr =DMPlexSetLabelValue(*dm, "marker2", i,
    1);CHKERRQ(ierr);
         }
     }

    So, I'm able to mark the triangles, but I'm not able to get this
    label in the plugin "fem.f0Funcs" and "fem.g0Funcs": These
    plugins are called by looping on the triangles in the function
    "FEMIntegrateResidualBatch", but the dm is not available, so I
    can't use the functions DMPlexGetLabel, DMLabelGetStratumSize and
    DMLabelGetStratumIS. What is the good way to get the labels in
    the user plugins of the fem struct ?


So lets start with the abstract problem so that I can see exactly what you want to do. In ex12 (or ex62, etc.) I have a single equation, so I do a loop over all cells. This loop takes place in DMPlexComputeResidualFEM(). You would instead like to do a few loops over sets of cells with different material models, using different f0/f1. Is this correct?

    Thanks a lot for your help.

    Olivier B
    Hello,

    This is the solution I implemented to get the label level in the
    plugins "fem.f0Funcs" and "fem.g0Funcs":

     I need the DM and the index element, so i do:
    1) I  add some static variables:
    static DM * spDM[128];
    static int scurElem[128];


Notice that the DM is available in DMPlexComputeResidualFEM(). Here is what the function does:

  a) Batches up elements into groups

b) Integrates each group using a call to FEMIntegrateResidualBatch(). Notice that in 'next' this has changed to PetscFEIntegrateResidual() since we have added a few FEM classes to make things
       simpler and more flexible.

What you can do, I think, to get what you want is:

a) Write a new MY_DMPlexComputeResidualFEM() to do a few loops. This is supplied to your app using

ierr = DMSNESSetFunctionLocal(dm, (PetscErrorCode (*)(DM,Vec,Vec,void*)) MY_DMPlexComputeResidualFEM, &user);CHKERRQ(ierr); ierr = DMSNESSetJacobianLocal(dm, (PetscErrorCode (*)(DM,Vec,Mat,Mat,MatStructure*,void*)) MY_DMPlexComputeJacobianFEM, &user);CHKERRQ(ierr);

just as in the examples. You could use different f0/f1 for each loop somehow.

b) Write a new PetscFEIntegrateResidual() that does what you want. The easiest way to do this is create a new PetscFE subclass, since they only really do one thing which is these integrals. I can help you. HOWEVER, if what you really want to do is get coefficient information into f0/f1 instead of a different physical model, then you can do something easier that we just put in. You can layout a coefficient, like nu in

  \div \nu \grad u = \rho

and provide a DM for \nu. This will be passed all the way down inside until f0 gets

  f0Func(u, gradU, nu, gradNu, x, f0)

so that the pointwise values of the your coefficient and its gradient are available to your physics.

I am sure there will be questions about this, but the first thing to do is get entirely clear what you want to do.
Hello,

This is the 2D systems I want to simulate:

system 1:
0=\div \rho(x) \grad u + r(x)*u(1-u)

corresponding to the stationary state of the time dependent problem:
system 2:
\partial_t u = \div \rho(x) \grad u + r(x)*u(1-u)

It represents the diffusion of a specie throw a 2D space, u is the density of this specie.

I want also to study the effect of a predator p:
system 3:
\partial_t u = \div \rho_u(x) \grad u + r(x)*u(1-u) - \beta (x) p*u
\partial_t p = \div \rho_p(x) \grad p - \delta (x) p + \gamma (x) p*u

I'm focused on the (system 1).

About the geometry:
The geometry come from the landscape composed of crops. There are different type of crops. The functions ( \rho(x), r(x), \delta (x), \beta (x)) depend on this type of crops.

I'm focused on the (system 1). I'm working from the ex12.c. Therefore, the plungins functions are:

f0_u(u,grad_u,x,f0){
...
f0= r(x)*u*(1-u)
...
}

f1_u(u,grad_u,x,f1){
...
f1[comp*dim+d] = rho(x)*gradU[comp*dim+d];
...
}

g0_u(u,grad_u,x,g0){
...
g0=-r(x)*(1-2*u)
...
}

g3_uu(u,grad_u,x,g3){
...
g3[((compI*Ncomp+compI)*dim+d)*dim+d] = \rho(x);
...
}

For an efficient implementation of theses plugins, I have to know the type of crop. If I well understand your previous mail, you propose to me to defined my own struct PetscFEM adding my useful parameters (crop type for example). I have to overload the functions DMPlexComputeResidualFEM, DMPlexComputeJacobianFEM, FEMIntegrateResidualBatch, FEMIntegrateJacobianActionBatch. I agree, thanks a lot.

Regards,

Olivier B

  Thanks,

      Matt

    2) I overload the DMPlexComputeJacobianFEM with :
       PetscErrorCode MY_DMPlexComputeJacobianFEM(DM dm, Vec X, Mat
    Jac, Mat JacP, MatStructure *str,void *user)
    {

     PetscMPIInt rank;
     PetscErrorCode ierr;

     PetscFunctionBeginUser;
     ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr);
     spDM[rank]=&dm;
     PetscFunctionReturn(DMPlexComputeJacobianFEM(dm, X, Jac,JacP,
    str,user));

    }
    3) overload FEMIntegrateResidualBatch adding code:
    .
    .
      for (e = 0; e < Ne; ++e) {
        scurElem[rank]=e;//added ligne
    .
    .

    So that, I can get the label level using  DMPlexHasLabel and
    DMLabelGetValue

    I'm sure this solution is awful, and works only in this version,
    but i didn't find a better way to get the label in the plugins fem
    struc. Do you know the correct way to do that ??

    Thanks,

    Olivier B

      Thanks,

         Matt

        Regards,

        Olivier B

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


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