Open astatt opened 4 years ago
Commit dcb4b32534 has a first working draft of the bonding algorithm, both CPU and GPU. It's compiled against hoomd v2.9.2 and uses the hoomd/extern/neighbor for the tree neighbor list. It is passing the unit tests, e.g. no duplicate bonds are formed, and not too many.
To store a list of all possible bonds I used an array of Scalar3 (tag_1,tag_2,r_sq). This seems to result in fairly slow sorting/selecting with thrust::remove_if for removing "zero/empty" entries, thrust::sort and then thrust::unique to remove duplicates. This has to happen for every step this updater is called, so optimizing this seems worth it. A possible solution could be to remove the distance r_sq information and then use a paring function to map the two unsigned int tags to one new unsigned int and then do the sorting/selecting based on that one new int?
The second spot where the code is slow is for adding the bonds, as this happens on the CPU right now. How important that is strongly depends on how many bonds are actually formed.
Is this something that's still of interest to you, or should we close?
Still working on/with it. We can leave it for after migrating to v3, or I can try to do a mad dash to finish it before.
No rush, if you are still working on it, we will keep this open and keep the target as v1.1 (i.e., after the v3 migration). I was just looking to cleanup stale issues!
Is this something you are still interested in or want? Feel free to close if not.
Yes - our group is still working on ideas related to bond formation of various kinds, but we have been slow. Eventually I will pick this back up and either test extensively and port to azplugins-v1 or rework this entirely... So if you don't mind having this orphan around for a bit longer, I appreciate it.
That’s fine! I would advise you try merging up and making the minimum changes to get your branch to compile when we release v1, or this will get harder to do in future.
Implement dynamic bonds based on a distance criterion between two groups (which may either have no overlap or may be 100% identical).
The basic idea is to split this into roughly 3 steps:
While groups are very flexible, in MPI we will have to make sure that the buffer layer is large enough to be able to communicate all potential bond partners between ranks ( using particle types would be easier for this).
It might be interesting to keep track of the distance between possible bonding pairs as well to be able to have selection criteria based on this as well, e.g. closer bonds are formed first.