[petsc-users] DMNetworkGetEdgeRange() in parallel

Miguel Angel Salazar de Troya salazardetroya at gmail.com
Wed Feb 25 08:48:10 CST 2015


I modified the DMNetwork example to include the new DM with the modified
section. It has the same problems. Please find attached the code to this
email.

Thanks

On Tue, Feb 24, 2015 at 6:49 PM, Matthew Knepley <knepley at gmail.com> wrote:

> On Tue, Feb 24, 2015 at 6:42 PM, Miguel Angel Salazar de Troya <
> salazardetroya at gmail.com> wrote:
>
>> I implemented the code as agreed, but I don't get the results I expected.
>> When I create the vector with DMCreateGlobalVector(), I obtain a vector
>> with a layout similar to the original DMNetwork, instead of the cloned
>> network with the new PetscSection. The code is as follows:
>>
>> DMClone(dm, &dmEdge);
>>
>> PetscSectionCreate(PETSC_COMM_WORLD, &s);
>> PetscSectionSetNumFields(s, 1);
>> PetscSectionSetFieldComponents(s, 0, 1);
>>
>> // Now to set the chart, I pick the edge range
>>
>> DMNetworkGetEdgeRange(dmEdge, & eStart, & eEnd)
>>
>> PetscSectionSetChart(s, eStart, eEnd);
>>
>> for(PetscInt e = eStart; c < eEnd; ++e) {
>>      PetscSectionSetDof(s, e, 1);
>>      PetscSectionSetFieldDof(s, e, 0, 1);
>> }
>> PetscSectionSetUp(s);
>>
>> DMSetDefaultSection(dmEdge s);
>> DMCreateGlobalVector(dmEdge, &globalVec);
>>
>> When I get into DMCreateGlobalVector(dmEdge, &globalVec) in the debugger,
>> in the function DMCreateSubDM_Section_Private() I call
>> PetscSectionView() on the section
>>
>
> I have no idea why you would be in DMCreateSubDM().
>
> Just view globalVec. If the code is as above, it will give you a vector
> with that layout. If not
> it should be trivial to make a small code and send it. I do this
> everywhere is PETSc, so the
> basic mechanism certainly works.
>
>   Thanks,
>
>      Matt
>
>
>> obtained by DMGetDefaultGlobalSection(dm, &sectionGlobal), and I obtain
>> a PetscSection nothing like the one I see when I call PetscSectionView()
>> on the PetscSection I created above. Does this have anything to do? I
>> tried to compare this strange PetscSection with the one from the original
>> DMNetwork, I call DMGetDefaultGlobalSection(dm, &sectionGlobal) before
>> the first line of the snippet above and I get this error message.
>>
>> 0]PETSC ERROR: --------------------- Error Message
>> --------------------------------------------------------------
>> [0]PETSC ERROR: Object is in wrong state
>> [0]PETSC ERROR: DM must have a default PetscSection in order to create a
>> global PetscSection
>>
>> Thanks in advance
>> Miguel
>>
>>
>> On Mon, Feb 23, 2015 at 3:24 PM, Matthew Knepley <knepley at gmail.com>
>> wrote:
>>
>>> 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
>>>
>>
>>
>>
>> --
>> *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/20150225/953f893a/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: case9.m
Type: text/x-objcsrc
Size: 2000 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: makefile
Type: application/octet-stream
Size: 430 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pf.c
Type: text/x-csrc
Size: 23659 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0002.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pf.h
Type: text/x-chdr
Size: 5267 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0001.h>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pfoptions
Type: application/octet-stream
Size: 262 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0003.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PFReadData.c
Type: text/x-csrc
Size: 6870 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150225/953f893a/attachment-0003.c>


More information about the petsc-users mailing list