On Thu, Sep 26, 2024 at 11:20 AM MIGUEL MOLINOS PEREZ <mmoli...@us.es> wrote:
> Thank you Matt. > > Okey, let me have a careful look to the DMSwarmMigrate_Push_Basic > implementation > to see if there is some workaround. > > The idea of adding new particles is interesting. However, in that case, we > need to initialize the new (ghost) particles using the fields of the > “real” particle, right? This can be done using something like: > > VecGhostUpdateBegin > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/VecGhostUpdateBegin/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgp0DqZlu$ > >(Vec > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/Vec/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgod4XH0M$ > > globalout,InsertMode > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Sys/InsertMode/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgo6Ycd6D$ > > ADD_VALUES > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Sys/ADD_VALUES/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgqRE6BHz$ > >, ScatterMode > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/ScatterMode/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNglNJk_18$ > > SCATTER_REVERSE > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/SCATTER_REVERSE/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgvURZcIx$ > >);VecGhostUpdateEnd > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/VecGhostUpdateEnd/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgnpOD3Mg$ > >(Vec > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/Vec/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgod4XH0M$ > > globalout,InsertMode > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Sys/InsertMode/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgo6Ycd6D$ > > ADD_VALUES > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Sys/ADD_VALUES/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgqRE6BHz$ > >, ScatterMode > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/ScatterMode/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNglNJk_18$ > > SCATTER_REVERSE > <https://urldefense.us/v3/__https://petsc.org/release/manualpages/Vec/SCATTER_REVERSE/__;!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgvURZcIx$ > >); > > for the particle fields (?). > I think we can just copy from the local particle. For example, suppose I decide that particle 1 should go to rank 5, 12, and 27. Then I first set p1.rank = 5, then I add two new particles with the same values as particle 1, but with rank = 12 and 27. Then when I call migrate, it will move these three particles to the correct processes, and delete the original particles and the copies from the local set. Thanks, Matt > Thanks, > Miguel > > > On Sep 26, 2024, at 3:53 PM, Matthew Knepley <knep...@gmail.com> wrote: > > On Thu, Sep 26, 2024 at 6:31 AM MIGUEL MOLINOS PEREZ <mmoli...@us.es> > wrote: > >> Hi Matt et al, >> >> I’ve been working on the scheme that you proposed to create ghost >> particles (atoms in my case), and it works! With a couple of caveats: >> -1º In general the overlap particles will be migrate from their own rank >> to more than one neighbor rank, this is specially relevant for those >> located close to the corners. Therefore, you'll need to call DMSwarmMigrate >> several times (27 times for 3D cells), during the migration process. >> > > That is terrible. Let's just fix DMSwarmMigrate to have a mode that sends > the particle to all overlapping neighbors at once. It can't be that hard. > > >> -2º You need to set DMSWARM_MIGRATE_BASIC. Otherwise the proposed >> algorithm will not work at all! >> > > Oh, I should have thought of that. Sorry. > > I can help code up that extension. Can you take a quick look at the BASIC > code? Right now, we just use the rank attached to the particle > to send it. We could have an arrays of ranks, but that seems crazy, and > would blow up particle storage. How about just adding new particles > with the other ranks right before migration? > > Thanks, > > Matt > > >> Hope this helps to other folks! >> >> I have a follow-up question about periodic bcc on this context, should I >> open a new thread of keep posting here? >> >> Thanks, >> Miguel >> >> On Aug 7, 2024, at 4:22 AM, MIGUEL MOLINOS PEREZ <mmoli...@us.es> wrote: >> >> Thanks Matt, I think I'll start by making a small program as a proof of >> concept. Then, if it works I'll implement it in my code and I'll be happy >> to share it too :-) >> >> Miguel >> >> On Aug 4, 2024, at 3:30 AM, Matthew Knepley <knep...@gmail.com> wrote: >> >> On Fri, Aug 2, 2024 at 7:15 PM MIGUEL MOLINOS PEREZ <mmoli...@us.es> >> wrote: >> >>> Thanks again Matt, that makes a lot more sense !! >>> >>> Just to check that we are on the same page. You are saying: >>> >>> 1. create a field define a field called "owner rank" for each particle. >>> >>> 2. Identify the phantom particles and modify the internal variable >>> defined by the DMSwarmField_rank variable. >>> >>> 3. Call DMSwarmMigrate(*,PETSC_FALSE), do the calculations using the new >>> local vector including the ghost particles. >>> >>> 4. Then, once the calculations are done, rename the DMSwarmField_rank >>> variable using the "owner rank" variable and call >>> DMSwarmMigrate(*,PETSC_FALSE) once again. >>> >> >> I don't think we need this last step. We can just remove those ghost >> particles for the next step I think. >> >> Thanks, >> >> Matt >> >> >>> Thank you, >>> Miguel >>> >>> >>> On Aug 2, 2024, at 5:33 PM, Matthew Knepley <knep...@gmail.com> wrote: >>> >>> On Fri, Aug 2, 2024 at 11:15 AM MIGUEL MOLINOS PEREZ <mmoli...@us.es> >>> wrote: >>> >>>> Thank you Matt for your time, >>>> >>>> What you describe seems to me the ideal approach. >>>> >>>> 1) Add a particle field 'ghost' that identifies ghost vs owned >>>> particles. I think it needs options OWNED, OVERLAP, and GHOST >>>> >>>> This means, locally, I need to allocate Nlocal + ghost particles >>>> (duplicated) for my model? >>>> >>> >>> I would do it another way. I would allocate the particles with no >>> overlap and set them up. Then I would identify the halo particles, mark >>> them as OVERLAP, call DMSwarmMigrate(), and mark the migrated particles as >>> GHOST, then unmark the OVERLAP particles. Shoot! That marking will not work >>> since we cannot tell the difference between particles we received and >>> particles we sent. Okay, instead of the `ghost` field we need an `owner >>> rank` field. So then we >>> >>> 1) Setup the non-overlapping particles >>> >>> 2) Identify the halo particles >>> >>> 3) Change the `rank`, but not the `owner rank` >>> >>> 4) Call DMSwarmMigrate() >>> >>> Now we can identify ghost particles by the `owner rank` >>> >>> >>>> If that so, how to do the communication between the ghost particles >>>> living in the rank i and their “real” counterpart in the rank j. >>>> >>>> Algo, as an alternative, what about: >>>> 1) Use an IS tag which contains, for each rank, a list of the global >>>> index of the neighbors particles outside of the rank. >>>> 2) Use VecCreateGhost to create a new vector which contains extra >>>> local space for the ghost components of the vector. >>>> 3) Use VecScatterCreate, VecScatterBegin, and VecScatterEnd to do the >>>> transference of data between a vector obtained with >>>> DMSwarmCreateGlobalVectorFromField >>>> 4) Do necessary computations using the vectors created with >>>> VecCreateGhost. >>>> >>> >>> This is essentially what Migrate() does. I was trying to reuse the code. >>> >>> Thanks, >>> >>> Matt >>> >>> >>>> Thanks, >>>> Miguel >>>> >>>> On Aug 2, 2024, at 8:58 AM, Matthew Knepley <knep...@gmail.com> wrote: >>>> >>>> On Thu, Aug 1, 2024 at 4:40 PM MIGUEL MOLINOS PEREZ <mmoli...@us.es> >>>> wrote: >>>> >>>>> This Message Is From an External Sender >>>>> This message came from outside your organization. >>>>> >>>>> >>>>> Dear all, >>>>> >>>>> I am implementing a Molecular Dynamics (MD) code using the DMSWARM >>>>> interface. In the MD simulations we evaluate on each particle (atoms) >>>>> some kind of scalar functional using data from the neighbouring atoms. My >>>>> problem lies in the parallel implementation of the model, because >>>>> sometimes, some of these neighbours lie on a different processor. >>>>> >>>>> This is usually solved by using ghost particles. A similar approach >>>>> (with nodes instead) is already implemented for other PETSc mesh >>>>> structures like DMPlexConstructGhostCells. Unfortunately, I don't see >>>>> this kind of constructs for DMSWARM. Am I missing something? >>>>> >>>>> I this could be done by applying a buffer region by exploiting the >>>>> background DMDA mesh that I already use to do domain decomposition. Then >>>>> using the buffer region of each cell to locate the ghost particles and >>>>> finally using VecCreateGhost. Is this feasible? Or is there an easier >>>>> approach using other PETSc functions. >>>>> >>>>> >>>> This is feasible, but it would be good to develop a set of best >>>> practices, since we have been mainly focused on the case of non-redundant >>>> particles. Here is how I think I would do what you want. >>>> >>>> 1) Add a particle field 'ghost' that identifies ghost vs owned >>>> particles. I think it needs options OWNED, OVERLAP, and GHOST >>>> >>>> 2) At some interval identify particles that should be sent to other >>>> processes as ghosts. I would call these "overlap particles". The >>>> determination >>>> seems application specific, so I would leave this determination to >>>> the user right now. We do two things to these particles >>>> >>>> a) Mark chosen particles as OVERLAP >>>> >>>> b) Change rank to process we are sending to >>>> >>>> 3) Call DMSwarmMigrate with PETSC_FALSE for the particle deletion flag >>>> >>>> 4) Mark OVERLAP particles as GHOST when they arrive >>>> >>>> There is one problem in the above algorithm. It does not allow sending >>>> particles to multiple ranks. We would have to do this >>>> in phases right now, or make a small adjustment to the interface >>>> allowing replication of particles when a set of ranks is specified. >>>> >>>> THanks, >>>> >>>> Matt >>>> >>>> >>>>> Thank you, >>>>> Miguel >>>>> >>>>> >>>>> >>>> >>>> -- >>>> 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 >>>> >>>> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgtTo5Ip8$ >>>> >>>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgjAy34J0$ >>>> > >>>> >>>> >>>> >>> >>> -- >>> 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 >>> >>> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgtTo5Ip8$ >>> >>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgjAy34J0$ >>> > >>> >>> >>> >> >> -- >> 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 >> >> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgtTo5Ip8$ >> >> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgjAy34J0$ >> > >> >> >> >> > > -- > 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 > > https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgtTo5Ip8$ > > <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgjAy34J0$ > > > > > -- 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 https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgtTo5Ip8$ <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aikPEw2N9TJ1IX4nFiTcOEsUOqcmEW2AwEUjS3Pw-WhS71aoiH_YonU7jU5aHVRNC-CqA7OIsJSNgjAy34J0$ >