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 <knep...@gmail.com> wrote: > On Mon, Feb 23, 2015 at 1:40 PM, Miguel Angel Salazar de Troya < > salazardetr...@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 <knep...@gmail.com> >> wrote: >> >>> On Mon, Feb 23, 2015 at 9:27 AM, Miguel Angel Salazar de Troya < >>> salazardetr...@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 <knep...@gmail.com> >>>> wrote: >>>> >>>>> On Mon, Feb 23, 2015 at 8:42 AM, Miguel Angel Salazar de Troya < >>>>> salazardetr...@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." < >>>>>> abhy...@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 <knep...@gmail.com> >>>>>>> Date: Mon, 23 Feb 2015 07:54:34 -0600 >>>>>>> To: Miguel Angel Salazar de Troya <salazardetr...@gmail.com> >>>>>>> Cc: "petsc-users@mcs.anl.gov" <petsc-users@mcs.anl.gov> >>>>>>> Subject: Re: [petsc-users] DMNetworkGetEdgeRange() in parallel >>>>>>> >>>>>>> On Sun, Feb 22, 2015 at 3:59 PM, Miguel Angel Salazar de Troya < >>>>>>> salazardetr...@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 < >>>>>>>> knep...@gmail.com> wrote: >>>>>>>> >>>>>>>>> On Sun, Feb 22, 2015 at 11:01 AM, Miguel Angel Salazar de Troya < >>>>>>>>> salazardetr...@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 >>>>>>>>>> salaz...@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 >>>>>>>> salaz...@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 >>>> salaz...@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 >> salaz...@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 salaz...@illinois.edu