[petsc-users] DMNetworkGetEdgeRange() in parallel

Matthew Knepley knepley at gmail.com
Mon Feb 23 15:24:54 CST 2015


On Mon, Feb 23, 2015 at 2:15 PM, Miguel Angel Salazar de Troya <
salazardetroya at gmail.com> wrote:

> Thanks a lot, the partition should be done before setting up the section,
> right?
>

The partition will be automatic. All you have to do is make the local
section. The DM is already partitioned,
and the Section will inherit that.

  Matt


> Miguel
>
> On Mon, Feb 23, 2015 at 2:05 PM, Matthew Knepley <knepley at gmail.com>
> wrote:
>
>> On Mon, Feb 23, 2015 at 1:40 PM, Miguel Angel Salazar de Troya <
>> salazardetroya at gmail.com> wrote:
>>
>>> Wouldn't including the edge variables in the global vector make the code
>>> slower? I'm using the global vector in a TS, using one of the explicit RK
>>> schemes. The edge variables would not be updated in the RHSFunction
>>> evaluation. I only change the edge variables in the TSUpdate. If the global
>>> vector had the edge variables, it would be a much larger vector, and all
>>> the vector operations performed by the TS would be slower. Although the
>>> vector F returned by the RHSFunction would be zero in the edge variable
>>> components. I guess that being the vector sparse that would not be a
>>> problem.
>>>
>>> I think I'm more interested in the PetscSection approach because it
>>> might require less modifications in my code. However, I don't know how I
>>> could do this. Maybe something like this?
>>>
>>> PetscSectionCreate(PETSC_COMM_WORLD, &s);
>>> PetscSectionSetNumFields(s, 1);
>>> PetscSectionSetFieldComponents(s, 0, 1);
>>>
>>> // Now to set the chart, I pick the edge range
>>>
>>> DMNetworkGetEdgeRange(dm, & eStart, & eEnd
>>>
>>> PetscSectionSetChart(s, eStart, eEnd);
>>>
>>> for(PetscInt e = eStart; c < eEnd; ++e) {
>>>      PetscSectionSetDof(s, e, 1);
>>>      PetscSectionSetFieldDof(s, e, 1, 1);
>>>
>>
>> It should be PetscSectionSetFieldDof(s, e, 0, 1);
>>
>>
>>> }
>>> PetscSectionSetUp(s);
>>>
>>> Now in the manual I see this:
>>>
>>
>> First you want to do:
>>
>>   DMClone(dm, &dmEdge);
>>
>> and then use dmEdge below.
>>
>>
>>> DMSetDefaultSection(dm, s);
>>> DMGetLocalVector(dm, &localVec);
>>> DMGetGlobalVector(dm, &globalVec);
>>>
>>> Setting up the default section in the DM would interfere with the
>>> section already set up with the variables in the vertices?
>>>
>>
>> Yep, thats why you would use a clone.
>>
>>   Thanks,
>>
>>      Matt
>>
>>
>>> Thanks a lot for your responses.
>>>
>>>
>>>
>>> On Mon, Feb 23, 2015 at 11:37 AM, Matthew Knepley <knepley at gmail.com>
>>> wrote:
>>>
>>>> On Mon, Feb 23, 2015 at 9:27 AM, Miguel Angel Salazar de Troya <
>>>> salazardetroya at gmail.com> wrote:
>>>>
>>>>> I'm iterating through local edges given in DMNetworkGetEdgeRange().
>>>>> For each edge, I extract or modify its corresponding value in a global
>>>>> petsc vector. Therefore that vector must have as many components as edges
>>>>> there are in the network. To extract the value in the vector, I use
>>>>> VecGetArray() and a variable counter that is incremented in each iteration.
>>>>> The array that I obtain in VecGetArray() has to be the same size than
>>>>> the edge range. That variable counter starts as 0, so if the array that I
>>>>> obtained in VecGetArray() is x_array, x_array[0] must be the
>>>>> component in the global vector that corresponds with the start edge given
>>>>> in DMNetworkGetEdgeRange()
>>>>>
>>>>> I need that global petsc vector because I will use it in other
>>>>> operations, it's not just data. Sorry for the confusion. Thanks in advance.
>>>>>
>>>>
>>>> This sounds like an assembly operation. The usual paradigm is to
>>>> compute in the local space, and then communicate to get to the global
>>>> space. So you would make a PetscSection that had 1 (or some) unknowns on
>>>> each cell (edge) and then you can use DMCreateGlobal/LocalVector() and
>>>> DMLocalToGlobal() to do this.
>>>>
>>>> Does that make sense?
>>>>
>>>>   Thanks,
>>>>
>>>>      Matt
>>>>
>>>>
>>>>> Miguel
>>>>>
>>>>>
>>>>> On Mon, Feb 23, 2015 at 9:09 AM, Matthew Knepley <knepley at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> On Mon, Feb 23, 2015 at 8:42 AM, Miguel Angel Salazar de Troya <
>>>>>> salazardetroya at gmail.com> wrote:
>>>>>>
>>>>>>> Thanks, that will help me. Now what I would like to have is the
>>>>>>> following: if I have two processors and ten edges, the partitioning results
>>>>>>> in the first processor having the edges 0-4 and the second processor, the
>>>>>>> edges 5-9. I also have a global vector with as many components as edges,
>>>>>>> 10. How can I partition it so the first processor also has the 0-4
>>>>>>> components and the second, the 5-9 components of the vector?
>>>>>>>
>>>>>> I think it would help to know what you want to accomplish. This is
>>>>>> how you are proposing to do it.'
>>>>>>
>>>>>> If you just want to put data on edges, DMNetwork has a facility for
>>>>>> that already.
>>>>>>
>>>>>>   Thanks,
>>>>>>
>>>>>>      Matt
>>>>>>
>>>>>>
>>>>>>> Miguel
>>>>>>> On Feb 23, 2015 8:08 AM, "Abhyankar, Shrirang G." <
>>>>>>> abhyshr at mcs.anl.gov> wrote:
>>>>>>>
>>>>>>>>  Miguel,
>>>>>>>>    One possible way is to store the global numbering of any
>>>>>>>> edge/vertex in the "component" attached to it. Once the mesh gets
>>>>>>>> partitioned, the components are also distributed so you can easily retrieve
>>>>>>>> the global number of any edge/vertex by accessing its component. This is
>>>>>>>> what is done in the DMNetwork example pf.c although the global numbering is
>>>>>>>> not used for anything.
>>>>>>>>
>>>>>>>>  Shri
>>>>>>>>  From: Matthew Knepley <knepley at gmail.com>
>>>>>>>> Date: Mon, 23 Feb 2015 07:54:34 -0600
>>>>>>>> To: Miguel Angel Salazar de Troya <salazardetroya at gmail.com>
>>>>>>>> Cc: "petsc-users at mcs.anl.gov" <petsc-users at mcs.anl.gov>
>>>>>>>> Subject: Re: [petsc-users] DMNetworkGetEdgeRange() in parallel
>>>>>>>>
>>>>>>>>   On Sun, Feb 22, 2015 at 3:59 PM, Miguel Angel Salazar de Troya <
>>>>>>>> salazardetroya at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Thanks. Once I obtain that Index Set with the routine DMPlexCreateCellNumbering()
>>>>>>>>> (I assume that the edges in DMNetwork correspond to cells in DMPlex) can I
>>>>>>>>> use it to partition a vector with as many components as edges I have in my
>>>>>>>>> network?
>>>>>>>>>
>>>>>>>>
>>>>>>>>  I do not completely understand the question.
>>>>>>>>
>>>>>>>>  If you want a partition of the edges, you can use
>>>>>>>> DMPlexCreatePartition() and its friend DMPlexDistribute(). What
>>>>>>>> are you trying to do?
>>>>>>>>
>>>>>>>>     Matt
>>>>>>>>
>>>>>>>>
>>>>>>>>>  Thanks
>>>>>>>>> Miguel
>>>>>>>>>
>>>>>>>>> On Sun, Feb 22, 2015 at 12:15 PM, Matthew Knepley <
>>>>>>>>> knepley at gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>>  On Sun, Feb 22, 2015 at 11:01 AM, Miguel Angel Salazar de Troya
>>>>>>>>>> <salazardetroya at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi
>>>>>>>>>>>
>>>>>>>>>>>  I noticed that the routine DMNetworkGetEdgeRange() returns the
>>>>>>>>>>> local indices for the edge range. Is there any way to obtain the global
>>>>>>>>>>> indices? So if my network has 10 edges, the processor 1 has the 0-4 edges
>>>>>>>>>>> and the processor 2, the 5-9 edges, how can I obtain this information?
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  One of the points of DMPlex is we do not require a global
>>>>>>>>>> numbering. Everything is numbered
>>>>>>>>>> locally, and the PetscSF maps local numbers to local numbers in
>>>>>>>>>> order to determine ownership.
>>>>>>>>>>
>>>>>>>>>>  If you want to create a global numbering for some reason, you
>>>>>>>>>> can using DMPlexCreatePointNumbering().
>>>>>>>>>> There are also cell and vertex versions that we use for output,
>>>>>>>>>> so you could do it just for edges as well.
>>>>>>>>>>
>>>>>>>>>>    Thanks,
>>>>>>>>>>
>>>>>>>>>>       Matt
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>  Thanks
>>>>>>>>>>>  Miguel
>>>>>>>>>>>
>>>>>>>>>>>  --
>>>>>>>>>>>  *Miguel Angel Salazar de Troya*
>>>>>>>>>>> Graduate Research Assistant
>>>>>>>>>>> Department of Mechanical Science and Engineering
>>>>>>>>>>> University of Illinois at Urbana-Champaign
>>>>>>>>>>> (217) 550-2360
>>>>>>>>>>> salaza11 at illinois.edu
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  --
>>>>>>>>>> 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
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>  --
>>>>>>>>>  *Miguel Angel Salazar de Troya*
>>>>>>>>> Graduate Research Assistant
>>>>>>>>> Department of Mechanical Science and Engineering
>>>>>>>>> University of Illinois at Urbana-Champaign
>>>>>>>>> (217) 550-2360
>>>>>>>>> salaza11 at illinois.edu
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>  --
>>>>>>>> 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
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Miguel Angel Salazar de Troya*
>>>>> Graduate Research Assistant
>>>>> Department of Mechanical Science and Engineering
>>>>> University of Illinois at Urbana-Champaign
>>>>> (217) 550-2360
>>>>> salaza11 at illinois.edu
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> 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
>>>>
>>>
>>>
>>>
>>> --
>>> *Miguel Angel Salazar de Troya*
>>> Graduate Research Assistant
>>> Department of Mechanical Science and Engineering
>>> University of Illinois at Urbana-Champaign
>>> (217) 550-2360
>>> salaza11 at illinois.edu
>>>
>>>
>>
>>
>> --
>> 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
>>
>
>
>
> --
> *Miguel Angel Salazar de Troya*
> Graduate Research Assistant
> Department of Mechanical Science and Engineering
> University of Illinois at Urbana-Champaign
> (217) 550-2360
> salaza11 at illinois.edu
>
>


-- 
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150223/f2941dc0/attachment.html>


More information about the petsc-users mailing list