[petsc-users] DMNetworkGetEdgeRange() in parallel

Miguel Angel Salazar de Troya salazardetroya at gmail.com
Mon Feb 23 14:15:00 CST 2015


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

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


More information about the petsc-users mailing list