-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Core: add input and features for generating large, inhomogenous systems #421
Comments
One way in which I solved this in the The idea is the following
|
The options are:
The main issue with impurity clusters is to add one or more additional atoms, which are not a part of the lattice. Issues with adding it to the list of spins and positions:
Issues with creating a separate list:
This is my current draft for the documentation description, after which the implementation should be modeled: Impurity ClustersThis describes how to embed impurity clusters in a host medium. Geometrically, a cluster is defined by the structure of the host lattice. # The clusters are repeated along translation vectors
n_clusters 3 1 1
# The position of the "first" cluster in host lattice translations
cluster_position 50 50 0
# The translation vectors for the cluster "lattice"
# Note: in units of the host bravais vectors
cluster_bravais_vectors
20 0 0
0 1 0
0 0 1 The interactions inside each cluster are specified analogous to # i, j, relative position i, relative position j, Jij, ...
# translations are relative to the cluster_position
n_cluster_interaction_pairs 2
i j dai dbi dci daj dbj dcj Jij
0 0 1 0 0 1 0 0 1.0
0 0 0 1 0 1 0 0 1.0 In order to physically describe impurity clusters correctly, it may be # dx dy dz mu_s
# the position can be anywhere (also non-integer translations)
# and is specified relative to cluster_position
cluster_additional_atoms 1
0 0 0.5 2.0 How to specify interactions with this additional atom # note that i here means something different:
# it is the index of the adatom
n_cluster_interaction_pairs 2
i j da db dc Jij
0 0 1 0 0 1.0
0 0 0 1 0 1.0 |
Did some work towards this on However, I am currently not sure that it wouldn't be better to simply write a Python script, which generates the input, creating a single large basis cell for the whole system. To get a performant parallelisation, #420 would have to be implemented (parallelisation over all atoms, not just over basis cells. The input described above is so complex that generating it requires some scripting anayways, at which point the only advantage of the above would be that the host lattice and its interactions could be changed at runtime. |
Another idea to simplify the creation of a large, inhomogeneous system might be to allow some scripting in the input file(s). https://github.com/ChaiScript/ChaiScript seems a very good candidate for a lightweight scripting language, which is additionally typesafe and well-integrated with C++. |
The config-parser could read in a number of different files/sections, one being the "host" lattice and the others being defects etc.
When a large system is used, but only a few defects are placed on the surface, the desired workflow would be:
Note: the "corresponding atoms" include the atoms of the "host", with which a "defect" interacts, as their interactions (also among "host" atoms) may be modulated.
Thereby, long-range modulations in interaction parameters could be efficiently input into the code, without the need to generate a file containing the list of all pairs (which may become very large, depending on system size, while in this case the list size remains constant).
It would probably be best to implement #420 first, as having one list of pairs per basis cell atom would greatly simplify this procedure.
Also, #340 (see PR #416) is related to this and should probably be implemented first.
The text was updated successfully, but these errors were encountered: