Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/casm/configuration/occ_events/OccEventCounter.hh
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ struct OccEventCounterParameters {
std::optional<int> required_cluster_size;
std::optional<std::set<int>> excluded_sublattices;
std::optional<std::set<int>> required_sublattices;
std::optional<int> n_required_sublattices;

/// \brief Optional customizeable filter to skip or allow events
/// based on the cluster. Return true to allow,
Expand Down
11 changes: 9 additions & 2 deletions python/libcasm/occ_events/_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,15 @@ def make_canonical_prim_periodic_occevents(

Filter by sublattice, using sublattice indices:

- "excluded_sublattices": Optional[list[int]] = None
- "required_sublattices": Optional[list[int]] = None
- "excluded_sublattices": Optional[list[int]] = None, Do not include
events that contain any of these sublattices.
- "required_sublattices": Optional[list[int]] = None, Only include
events that contain these sublattices. Events may contain additional
sublattices not specified in `required_sublattices`.
- "n_required_sublattices": Optional[int] = None, Set how many
sublattices from `required_sublattices` the event must contain.
The default is that the event must contain every sublattice in
`required_sublattices`.

Filter by occupation, using occupation variable on each cluster site:

Expand Down
16 changes: 13 additions & 3 deletions src/casm/configuration/occ_events/OccEventCounter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class PrototypeClusterCounter : public SingleStepBase<OccEventCounterData> {
return false;
}

/// \brief Check if cluster does not include any
/// \brief Check if cluster includes sufficient number of
/// required sublattice (required_sublattices)
bool fails_required_sublattices() const {
if (!data()->params.required_sublattices.has_value()) {
Expand All @@ -137,10 +137,20 @@ class PrototypeClusterCounter : public SingleStepBase<OccEventCounterData> {
if (it != has_sublattice.end()) {
it->second = true;
}
}
// require at least n_required_sublattices matches
// of sublattices in required_sublattices
int misses_remaining = 0; // default must match all (no misses)
if (data()->params.n_required_sublattices.has_value()) {
int n_required_sublattices = *data()->params.n_required_sublattices;
misses_remaining =
static_cast<int>(has_sublattice.size()) - n_required_sublattices;
}
for (auto const &pair : has_sublattice) {
if (pair.second == false) {
return true;
if (--misses_remaining < 0) {
return true;
}
}
}
return false;
Expand Down Expand Up @@ -254,7 +264,7 @@ class OccInitCounter : public SingleStepBase<OccEventCounterData> {
/// \brief Check if initial occupation satisifies
/// required occupation (required_occ_init)
bool fails_required_occ_init() const {
if (!data()->params.required_init_atom_count.has_value()) {
if (!data()->params.required_occ_init.has_value()) {
return false;
}
std::vector<int> const &occ_init = data()->occ_init_counter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ jsonParser &to_json(occ_events::OccEventCounterParameters const &params,
_to_json(params.required_cluster_size, "required_cluster_size");
_to_json(params.excluded_sublattices, "excluded_sublattices");
_to_json(params.required_sublattices, "required_sublattices");
_to_json(params.n_required_sublattices, "n_required_sublattices");

_to_json(params.required_occ_init, "required_occ_init");

Expand Down Expand Up @@ -141,6 +142,7 @@ void parse(InputParser<occ_events::OccEventCounterParameters> &parser) {
parser.optional(params.required_cluster_size, "required_cluster_size");
parser.optional(params.excluded_sublattices, "excluded_sublattices");
parser.optional(params.required_sublattices, "required_sublattices");
parser.optional(params.n_required_sublattices, "n_required_sublattices");

parser.optional(params.required_occ_init, "required_occ_init");

Expand Down
Loading