From 2857577dda866ad1ff91d3f492273c3edffef8ef Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Oct 2021 12:38:00 -0400 Subject: [PATCH] replace find_region_by_style() with get_region_by_style() with same semantics as find_fix_by_style() --- src/PLUGIN/plugin.cpp | 749 ++++++++++++++++++++---------------------- src/domain.cpp | 36 +- src/domain.h | 6 +- 3 files changed, 379 insertions(+), 412 deletions(-) diff --git a/src/PLUGIN/plugin.cpp b/src/PLUGIN/plugin.cpp index 7a47903946..44a8c61832 100644 --- a/src/PLUGIN/plugin.cpp +++ b/src/PLUGIN/plugin.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -19,459 +18,425 @@ #include "domain.h" #include "error.h" #include "fix.h" -#include "input.h" #include "force.h" +#include "input.h" #include "modify.h" +#include "region.h" #include -#include #include +#include -namespace LAMMPS_NS +namespace LAMMPS_NS { +// list of plugin information data for loaded styles +static std::list pluginlist; + +// map for counting references to dso handles +static std::map dso_refcounter; + +/* ---------------------------------------------------------------------- */ + +Plugin::Plugin(LAMMPS *lmp) : Command(lmp) {} + +/* ---------------------------------------------------------------------- */ + +void Plugin::command(int narg, char **arg) { - // list of plugin information data for loaded styles - static std::list pluginlist; + if (narg < 1) error->all(FLERR, "Illegal plugin command"); - // map for counting references to dso handles - static std::map dso_refcounter; + std::string cmd = arg[0]; + if (cmd == "load") { + if (narg < 2) error->all(FLERR, "Illegal plugin load command"); + for (int i = 1; i < narg; ++i) plugin_load(arg[i], lmp); + } else if (cmd == "unload") { + if (narg != 3) error->all(FLERR, "Illegal plugin unload command"); + plugin_unload(arg[1], arg[2], lmp); -/* ---------------------------------------------------------------------- */ + } else if (cmd == "clear") { + plugin_clear(lmp); - Plugin::Plugin(LAMMPS *lmp) : Command(lmp) {} - -/* ---------------------------------------------------------------------- */ - - void Plugin::command(int narg, char **arg) - { - if (narg < 1) error->all(FLERR,"Illegal plugin command"); - -#if defined(LMP_PLUGIN) - std::string cmd = arg[0]; - if (cmd == "load") { - if (narg < 2) error->all(FLERR,"Illegal plugin load command"); - for (int i=1; i < narg; ++i) - plugin_load(arg[i],lmp); - - } else if (cmd == "unload") { - if (narg != 3) error->all(FLERR,"Illegal plugin unload command"); - plugin_unload(arg[1],arg[2],lmp); - - } else if (cmd == "clear") { - plugin_clear(lmp); - - } else if (cmd == "list") { - if (comm->me == 0) { - int num = plugin_get_num_plugins(); - utils::logmesg(lmp,"Currently loaded plugins\n"); - for (int i=0; i < num; ++i) { - auto entry = plugin_get_info(i); - utils::logmesg(lmp,"{:4}: {} style plugin {}\n", - i+1,entry->style,entry->name); - } + } else if (cmd == "list") { + if (comm->me == 0) { + int num = plugin_get_num_plugins(); + utils::logmesg(lmp, "Currently loaded plugins\n"); + for (int i = 0; i < num; ++i) { + auto entry = plugin_get_info(i); + utils::logmesg(lmp, "{:4}: {} style plugin {}\n", i + 1, entry->style, entry->name); } - } else error->all(FLERR,"Illegal plugin command"); -#else - if (comm->me == 0) - error->warning(FLERR,"Ignoring plugin command. LAMMPS must be built as " - "a shared library for it to work."); + } + } else + error->all(FLERR, "Illegal plugin command"); +#if 0 + if (comm->me == 0) + error->warning( + FLERR, "LAMMPS must be built as a shared library for it to work."); #endif - } +} - // load DSO and call included registration function - void plugin_load(const char *file, LAMMPS *lmp) - { +// load DSO and call included registration function +void plugin_load(const char *file, LAMMPS *lmp) +{ #if defined(LMP_PLUGIN) - int me = lmp->comm->me; + int me = lmp->comm->me; - // open DSO file from given path; load symbols globally + // open DSO file from given path; load symbols globally - platform::dlerror(); - void *dso = platform::dlopen(file); - if (dso == nullptr) { - if (me == 0) - utils::logmesg(lmp,"Open of file {} failed: {}\n",file,platform::dlerror()); - return; - } - - // look up lammpsplugin_init() function in DSO - // function must have C bindings so there is no name mangling - - platform::dlerror(); - void *initfunc = platform::dlsym(dso,"lammpsplugin_init"); - if (initfunc == nullptr) { - platform::dlclose(dso); - - if (me == 0) - utils::logmesg(lmp,"Plugin symbol lookup failure in file {}: {}\n", - file,platform::dlerror()); - return; - } - - // call initializer function loaded from DSO and pass a pointer - // to the LAMMPS instance, the DSO handle (for reference counting) - // and plugin registration function pointer - - (*(lammpsplugin_initfunc)(initfunc))((void *)lmp, dso, - (void *)&plugin_register); -#endif + platform::dlerror(); + void *dso = platform::dlopen(file); + if (dso == nullptr) { + if (me == 0) utils::logmesg(lmp, "Open of file {} failed: {}\n", file, platform::dlerror()); + return; } - /* -------------------------------------------------------------------- + // look up lammpsplugin_init() function in DSO + // function must have C bindings so there is no name mangling + + platform::dlerror(); + void *initfunc = platform::dlsym(dso, "lammpsplugin_init"); + if (initfunc == nullptr) { + platform::dlclose(dso); + + if (me == 0) + utils::logmesg(lmp, "Plugin symbol lookup failure in file {}: {}\n", file, + platform::dlerror()); + return; + } + + // call initializer function loaded from DSO and pass a pointer + // to the LAMMPS instance, the DSO handle (for reference counting) + // and plugin registration function pointer + + (*(lammpsplugin_initfunc) (initfunc))((void *) lmp, dso, (void *) &plugin_register); +#endif +} + +/* -------------------------------------------------------------------- register a new style from a plugin with LAMMPS this is the callback function that is called from within the plugin initializer function. all plugin information is taken from the lammpsplugin_t struct. -------------------------------------------------------------------- */ - void plugin_register(lammpsplugin_t *plugin, void *ptr) - { +void plugin_register(lammpsplugin_t *plugin, void *ptr) +{ #if defined(LMP_PLUGIN) - LAMMPS *lmp = (LAMMPS *)ptr; - int me = lmp->comm->me; + LAMMPS *lmp = (LAMMPS *) ptr; + int me = lmp->comm->me; - if (plugin == nullptr) return; + if (plugin == nullptr) return; - // ignore load request if same plugin already loaded - int idx = plugin_find(plugin->style,plugin->name); - if (idx >= 0) { - if (me == 0) - utils::logmesg(lmp,"Ignoring load of {} style {}: must " - "unload existing {} plugin first\n", - plugin->style,plugin->name,plugin->name); - return; - } - - if (me == 0) { - utils::logmesg(lmp,"Loading plugin: {} by {}\n", - plugin->info,plugin->author); - // print version info only if the versions of host and plugin don't match - if ((plugin->version) && (strcmp(plugin->version,lmp->version) != 0)) - utils::logmesg(lmp," compiled for LAMMPS version {}, loaded into " - "LAMMPS version {}\n",plugin->version,lmp->version); - } - - pluginlist.push_back(*plugin); - - if (dso_refcounter.find(plugin->handle) != dso_refcounter.end()) { - ++ dso_refcounter[plugin->handle]; - } else { - dso_refcounter[plugin->handle] = 1; - } - - std::string pstyle = plugin->style; - if (pstyle == "pair") { - auto pair_map = lmp->force->pair_map; - if (pair_map->find(plugin->name) != pair_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in pair " - "style {} from plugin",plugin->name); - } - (*pair_map)[plugin->name] = (Force::PairCreator)plugin->creator.v1; - - } else if (pstyle == "bond") { - auto bond_map = lmp->force->bond_map; - if (bond_map->find(plugin->name) != bond_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in bond " - "style {} from plugin",plugin->name); - } - (*bond_map)[plugin->name] = (Force::BondCreator)plugin->creator.v1; - - } else if (pstyle == "angle") { - auto angle_map = lmp->force->angle_map; - if (angle_map->find(plugin->name) != angle_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in angle " - "style {} from plugin",plugin->name); - } - (*angle_map)[plugin->name] = (Force::AngleCreator)plugin->creator.v1; - - } else if (pstyle == "dihedral") { - auto dihedral_map = lmp->force->dihedral_map; - if (dihedral_map->find(plugin->name) != dihedral_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in dihedral " - "style {} from plugin",plugin->name); - } - (*dihedral_map)[plugin->name] = (Force::DihedralCreator)plugin->creator.v1; - - } else if (pstyle == "improper") { - auto improper_map = lmp->force->improper_map; - if (improper_map->find(plugin->name) != improper_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in improper " - "style {} from plugin",plugin->name); - } - (*improper_map)[plugin->name] = (Force::ImproperCreator)plugin->creator.v1; - - } else if (pstyle == "compute") { - auto compute_map = lmp->modify->compute_map; - if (compute_map->find(plugin->name) != compute_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in compute " - "style {} from plugin",plugin->name); - } - (*compute_map)[plugin->name] = (Modify::ComputeCreator)plugin->creator.v2; - - } else if (pstyle == "fix") { - auto fix_map = lmp->modify->fix_map; - if (fix_map->find(plugin->name) != fix_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in fix " - "style {} from plugin",plugin->name); - } - (*fix_map)[plugin->name] = (Modify::FixCreator)plugin->creator.v2; - - } else if (pstyle == "region") { - auto region_map = lmp->domain->region_map; - if (region_map->find(plugin->name) != region_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in region " - "style {} from plugin",plugin->name); - } - (*region_map)[plugin->name] = (Domain::RegionCreator)plugin->creator.v2; - - } else if (pstyle == "command") { - auto command_map = lmp->input->command_map; - if (command_map->find(plugin->name) != command_map->end()) { - if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Overriding built-in command " - "style {} from plugin",plugin->name); - } - (*command_map)[plugin->name] = (Input::CommandCreator)plugin->creator.v1; - - } else { - utils::logmesg(lmp,"Loading plugins for {} styles not " - "yet implemented\n",pstyle); - pluginlist.pop_back(); - } -#endif + // ignore load request if same plugin already loaded + int idx = plugin_find(plugin->style, plugin->name); + if (idx >= 0) { + if (me == 0) + utils::logmesg(lmp, "Ignoring load of {} style {}: must unload existing {} plugin first\n", + plugin->style, plugin->name, plugin->name); + return; } - /* -------------------------------------------------------------------- + if (me == 0) { + utils::logmesg(lmp, "Loading plugin: {} by {}\n", plugin->info, plugin->author); + // print version info only if the versions of host and plugin don't match + if ((plugin->version) && (strcmp(plugin->version, lmp->version) != 0)) + utils::logmesg(lmp, " compiled for LAMMPS version {}, loaded into LAMMPS version {}\n", + plugin->version, lmp->version); + } + + pluginlist.push_back(*plugin); + + if (dso_refcounter.find(plugin->handle) != dso_refcounter.end()) { + ++dso_refcounter[plugin->handle]; + } else { + dso_refcounter[plugin->handle] = 1; + } + + std::string pstyle = plugin->style; + if (pstyle == "pair") { + auto pair_map = lmp->force->pair_map; + if (pair_map->find(plugin->name) != pair_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in pair style {} from plugin", plugin->name); + } + (*pair_map)[plugin->name] = (Force::PairCreator) plugin->creator.v1; + + } else if (pstyle == "bond") { + auto bond_map = lmp->force->bond_map; + if (bond_map->find(plugin->name) != bond_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in bond style {} from plugin", plugin->name); + } + (*bond_map)[plugin->name] = (Force::BondCreator) plugin->creator.v1; + + } else if (pstyle == "angle") { + auto angle_map = lmp->force->angle_map; + if (angle_map->find(plugin->name) != angle_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in angle style {} from plugin", plugin->name); + } + (*angle_map)[plugin->name] = (Force::AngleCreator) plugin->creator.v1; + + } else if (pstyle == "dihedral") { + auto dihedral_map = lmp->force->dihedral_map; + if (dihedral_map->find(plugin->name) != dihedral_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in dihedral style {} from plugin", + plugin->name); + } + (*dihedral_map)[plugin->name] = (Force::DihedralCreator) plugin->creator.v1; + + } else if (pstyle == "improper") { + auto improper_map = lmp->force->improper_map; + if (improper_map->find(plugin->name) != improper_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in improper style {} from plugin", + plugin->name); + } + (*improper_map)[plugin->name] = (Force::ImproperCreator) plugin->creator.v1; + + } else if (pstyle == "compute") { + auto compute_map = lmp->modify->compute_map; + if (compute_map->find(plugin->name) != compute_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in compute style {} from plugin", + plugin->name); + } + (*compute_map)[plugin->name] = (Modify::ComputeCreator) plugin->creator.v2; + + } else if (pstyle == "fix") { + auto fix_map = lmp->modify->fix_map; + if (fix_map->find(plugin->name) != fix_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in fix style {} from plugin", plugin->name); + } + (*fix_map)[plugin->name] = (Modify::FixCreator) plugin->creator.v2; + + } else if (pstyle == "region") { + auto region_map = lmp->domain->region_map; + if (region_map->find(plugin->name) != region_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in region style {} from plugin", plugin->name); + } + (*region_map)[plugin->name] = (Domain::RegionCreator) plugin->creator.v2; + + } else if (pstyle == "command") { + auto command_map = lmp->input->command_map; + if (command_map->find(plugin->name) != command_map->end()) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR, "Overriding built-in command style {} from plugin", + plugin->name); + } + (*command_map)[plugin->name] = (Input::CommandCreator) plugin->creator.v1; + + } else { + utils::logmesg(lmp, "Loading plugins for {} styles not yet implemented\n", pstyle); + pluginlist.pop_back(); + } +#endif +} + +/* -------------------------------------------------------------------- remove plugin from given style table and plugin list optionally close the DSO handle if it is the last plugin from that DSO must also delete style instances if style is currently active -------------------------------------------------------------------- */ - void plugin_unload(const char *style, const char *name, LAMMPS *lmp) - { +void plugin_unload(const char *style, const char *name, LAMMPS *lmp) +{ #if defined(LMP_PLUGIN) - int me = lmp->comm->me; - - // ignore unload request from unsupported style categories - if ((strcmp(style,"pair") != 0) && (strcmp(style,"bond") != 0) - && (strcmp(style,"angle") != 0) && (strcmp(style,"dihedral") != 0) - && (strcmp(style,"improper") != 0) && (strcmp(style,"compute") != 0) - && (strcmp(style,"fix") != 0) && (strcmp(style,"region") != 0) - && (strcmp(style,"command") != 0)) { - if (me == 0) - utils::logmesg(lmp,"Ignoring unload: {} is not a " - "supported plugin style\n",style); - return; - } - - // ignore unload request if not loaded from a plugin - int idx = plugin_find(style,name); - if (idx < 0) { - if (me == 0) - utils::logmesg(lmp,"Ignoring unload of {} style {}: not " - "loaded from a plugin\n",style,name); - return; - } - - // make copy of DSO handle for later use - void *handle = plugin_get_info(idx)->handle; - - // remove selected plugin from list of plugins + int me = lmp->comm->me; + // ignore unload request from unsupported style categories + if ((strcmp(style, "pair") != 0) && (strcmp(style, "bond") != 0) && + (strcmp(style, "angle") != 0) && (strcmp(style, "dihedral") != 0) && + (strcmp(style, "improper") != 0) && (strcmp(style, "compute") != 0) && + (strcmp(style, "fix") != 0) && (strcmp(style, "region") != 0) && + (strcmp(style, "command") != 0)) { if (me == 0) - utils::logmesg(lmp,"Unloading {} style {}\n",style,name); - plugin_erase(style,name); - - // remove style of given name from corresponding map - // must delete style instance if currently active so - // we can close the DSO handle if the last reference is gone. - - std::string pstyle = style; - if (pstyle == "pair") { - - auto found = lmp->force->pair_map->find(name); - if (found != lmp->force->pair_map->end()) - lmp->force->pair_map->erase(found); - - // must delete pair style instance if in use - - if (lmp->force->pair_style) { - if (utils::strmatch(lmp->force->pair_style,"^hybrid")) { - if (lmp->force->pair_match(name,1,1) != nullptr) - lmp->force->create_pair("none",0); - } else { - if (strcmp(lmp->force->pair_style,name) == 0) - lmp->force->create_pair("none",0); - } - } - - } else if (pstyle == "bond") { - - auto found = lmp->force->bond_map->find(name); - if (found != lmp->force->bond_map->end()) - lmp->force->bond_map->erase(found); - - // must delete bond style instance if in use - - if ((lmp->force->bond_style != nullptr) - && (lmp->force->bond_match(name) != nullptr)) - lmp->force->create_bond("none",0); - - } else if (pstyle == "angle") { - - auto found = lmp->force->angle_map->find(name); - if (found != lmp->force->angle_map->end()) - lmp->force->angle_map->erase(found); - - // must delete angle style instance if in use - - if ((lmp->force->angle_style != nullptr) - && (lmp->force->angle_match(name) != nullptr)) - lmp->force->create_angle("none",0); - - } else if (pstyle == "dihedral") { - - auto found = lmp->force->dihedral_map->find(name); - if (found != lmp->force->dihedral_map->end()) - lmp->force->dihedral_map->erase(found); - - // must delete dihedral style instance if in use - - if ((lmp->force->dihedral_style) - && (lmp->force->dihedral_match(name) != nullptr)) - lmp->force->create_dihedral("none",0); - - } else if (pstyle == "improper") { - - auto found = lmp->force->improper_map->find(name); - if (found != lmp->force->improper_map->end()) - lmp->force->improper_map->erase(found); - - // must delete improper style instance if in use - - if ((lmp->force->improper_style != nullptr) - && (lmp->force->improper_match(name) != nullptr)) - lmp->force->create_improper("none",0); - - } else if (pstyle == "compute") { - - auto compute_map = lmp->modify->compute_map; - auto found = compute_map->find(name); - if (found != compute_map->end()) compute_map->erase(name); - - // must delete all compute instances using this compute style - - for (auto icompute : lmp->modify->get_compute_by_style(name)) - lmp->modify->delete_compute(icompute->id); - - } else if (pstyle == "fix") { - - auto fix_map = lmp->modify->fix_map; - auto found = fix_map->find(name); - if (found != fix_map->end()) fix_map->erase(name); - - // must delete all fix instances using this fix style - - for (auto ifix : lmp->modify->get_fix_by_style(name)) - lmp->modify->delete_fix(ifix->id); - - } else if (pstyle == "region") { - - auto region_map = lmp->domain->region_map; - auto found = region_map->find(name); - if (found != region_map->end()) region_map->erase(name); - - for (int iregion = lmp->domain->find_region_by_style(name); - iregion >= 0; iregion = lmp->domain->find_region_by_style(name)) - lmp->domain->delete_region(iregion); - - } else if (pstyle == "command") { - - auto command_map = lmp->input->command_map; - auto found = command_map->find(name); - if (found != command_map->end()) command_map->erase(name); - } - - // if reference count is down to zero, close DSO handle. - - -- dso_refcounter[handle]; - if (dso_refcounter[handle] == 0) { - platform::dlclose(handle); - } -#endif + utils::logmesg(lmp, "Ignoring unload: {} is not a supported plugin style\n", style); + return; } - /* -------------------------------------------------------------------- + // ignore unload request if not loaded from a plugin + int idx = plugin_find(style, name); + if (idx < 0) { + if (me == 0) + utils::logmesg(lmp, "Ignoring unload of {} style {}: not from a plugin\n", style, name); + return; + } + + // make copy of DSO handle for later use + void *handle = plugin_get_info(idx)->handle; + + // remove selected plugin from list of plugins + + if (me == 0) utils::logmesg(lmp, "Unloading {} style {}\n", style, name); + plugin_erase(style, name); + + // remove style of given name from corresponding map + // must delete style instance if currently active so + // we can close the DSO handle if the last reference is gone. + + std::string pstyle = style; + if (pstyle == "pair") { + + auto found = lmp->force->pair_map->find(name); + if (found != lmp->force->pair_map->end()) lmp->force->pair_map->erase(found); + + // must delete pair style instance if in use + + if (lmp->force->pair_style) { + if (utils::strmatch(lmp->force->pair_style, "^hybrid")) { + if (lmp->force->pair_match(name, 1, 1) != nullptr) lmp->force->create_pair("none", 0); + } else { + if (strcmp(lmp->force->pair_style, name) == 0) lmp->force->create_pair("none", 0); + } + } + + } else if (pstyle == "bond") { + + auto found = lmp->force->bond_map->find(name); + if (found != lmp->force->bond_map->end()) lmp->force->bond_map->erase(found); + + // must delete bond style instance if in use + + if ((lmp->force->bond_style != nullptr) && (lmp->force->bond_match(name) != nullptr)) + lmp->force->create_bond("none", 0); + + } else if (pstyle == "angle") { + + auto found = lmp->force->angle_map->find(name); + if (found != lmp->force->angle_map->end()) lmp->force->angle_map->erase(found); + + // must delete angle style instance if in use + + if ((lmp->force->angle_style != nullptr) && (lmp->force->angle_match(name) != nullptr)) + lmp->force->create_angle("none", 0); + + } else if (pstyle == "dihedral") { + + auto found = lmp->force->dihedral_map->find(name); + if (found != lmp->force->dihedral_map->end()) lmp->force->dihedral_map->erase(found); + + // must delete dihedral style instance if in use + + if ((lmp->force->dihedral_style) && (lmp->force->dihedral_match(name) != nullptr)) + lmp->force->create_dihedral("none", 0); + + } else if (pstyle == "improper") { + + auto found = lmp->force->improper_map->find(name); + if (found != lmp->force->improper_map->end()) lmp->force->improper_map->erase(found); + + // must delete improper style instance if in use + + if ((lmp->force->improper_style != nullptr) && (lmp->force->improper_match(name) != nullptr)) + lmp->force->create_improper("none", 0); + + } else if (pstyle == "compute") { + + auto compute_map = lmp->modify->compute_map; + auto found = compute_map->find(name); + if (found != compute_map->end()) compute_map->erase(name); + + // must delete all compute instances using this compute style + + for (auto icompute : lmp->modify->get_compute_by_style(name)) + lmp->modify->delete_compute(icompute->id); + + } else if (pstyle == "fix") { + + auto fix_map = lmp->modify->fix_map; + auto found = fix_map->find(name); + if (found != fix_map->end()) fix_map->erase(name); + + // must delete all fix instances using this fix style + + for (auto ifix : lmp->modify->get_fix_by_style(name)) lmp->modify->delete_fix(ifix->id); + + } else if (pstyle == "region") { + + auto region_map = lmp->domain->region_map; + auto found = region_map->find(name); + if (found != region_map->end()) region_map->erase(name); + + for (auto iregion : lmp->domain->get_region_by_style(name)) + lmp->domain->delete_region(iregion->id); + + } else if (pstyle == "command") { + + auto command_map = lmp->input->command_map; + auto found = command_map->find(name); + if (found != command_map->end()) command_map->erase(name); + } + + // if reference count is down to zero, close DSO handle. + + --dso_refcounter[handle]; + if (dso_refcounter[handle] == 0) { platform::dlclose(handle); } +#endif +} + +/* -------------------------------------------------------------------- unload all loaded plugins -------------------------------------------------------------------- */ - void plugin_clear(LAMMPS *lmp) - { - while (pluginlist.size() > 0) { - auto p = pluginlist.begin(); - plugin_unload(p->style,p->name,lmp); - } +void plugin_clear(LAMMPS *lmp) +{ + while (pluginlist.size() > 0) { + auto p = pluginlist.begin(); + plugin_unload(p->style, p->name, lmp); } +} - /* -------------------------------------------------------------------- +/* -------------------------------------------------------------------- remove plugin of given name and style from internal lists -------------------------------------------------------------------- */ - void plugin_erase(const char *style, const char *name) - { - for (auto p=pluginlist.begin(); p != pluginlist.end(); ++p) { - if ((strcmp(style,p->style) == 0) - && (strcmp(name,p->name) == 0)) { - pluginlist.erase(p); - return; - } +void plugin_erase(const char *style, const char *name) +{ + for (auto p = pluginlist.begin(); p != pluginlist.end(); ++p) { + if ((strcmp(style, p->style) == 0) && (strcmp(name, p->name) == 0)) { + pluginlist.erase(p); + return; } } +} - /* -------------------------------------------------------------------- +/* -------------------------------------------------------------------- number of styles loaded from plugin files -------------------------------------------------------------------- */ - int plugin_get_num_plugins() - { - return pluginlist.size(); - } +int plugin_get_num_plugins() +{ + return pluginlist.size(); +} - /* -------------------------------------------------------------------- +/* -------------------------------------------------------------------- return position index in list of given plugin of given style -------------------------------------------------------------------- */ - int plugin_find(const char *style, const char *name) - { - int i=0; - for (auto entry : pluginlist) { - if ((strcmp(style,entry.style) == 0) - && (strcmp(name,entry.name) == 0)) - return i; - ++i; - } - return -1; +int plugin_find(const char *style, const char *name) +{ + int i = 0; + for (auto entry : pluginlist) { + if ((strcmp(style, entry.style) == 0) && (strcmp(name, entry.name) == 0)) return i; + ++i; } + return -1; +} - /* -------------------------------------------------------------------- +/* -------------------------------------------------------------------- get pointer to plugin initializer struct at position idx -------------------------------------------------------------------- */ - const lammpsplugin_t *plugin_get_info(int idx) - { - int i=0; - for (auto p=pluginlist.begin(); p != pluginlist.end(); ++p) { - if (i == idx) return &(*p); - ++i; - } - return nullptr; +const lammpsplugin_t *plugin_get_info(int idx) +{ + int i = 0; + for (auto p = pluginlist.begin(); p != pluginlist.end(); ++p) { + if (i == idx) return &(*p); + ++i; } + return nullptr; } +} // namespace LAMMPS_NS diff --git a/src/domain.cpp b/src/domain.cpp index 4759490ae8..71fb27a4e6 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -1742,7 +1742,7 @@ void Domain::add_region(int narg, char **arg) if (narg < 2) error->all(FLERR,"Illegal region command"); if (strcmp(arg[1],"delete") == 0) { - delete_region(narg,arg); + delete_region(arg[2]); return; } @@ -1811,16 +1811,6 @@ Region *Domain::region_creator(LAMMPS *lmp, int narg, char ** arg) delete a region ------------------------------------------------------------------------- */ -void Domain::delete_region(int narg, char **arg) -{ - if (narg != 2) error->all(FLERR,"Illegal region command"); - - int iregion = find_region(arg[0]); - if (iregion == -1) error->all(FLERR,"Delete region ID does not exist"); - - delete_region(iregion); -} - void Domain::delete_region(int iregion) { if ((iregion < 0) || (iregion >= nregion)) return; @@ -1833,12 +1823,20 @@ void Domain::delete_region(int iregion) nregion--; } +void Domain::delete_region(const std::string &id) +{ + int iregion = find_region(id); + if (iregion == -1) error->all(FLERR,"Delete region ID does not exist"); + + delete_region(iregion); +} + /* ---------------------------------------------------------------------- return region index if name matches existing region ID return -1 if no such region ------------------------------------------------------------------------- */ -int Domain::find_region(const std::string &name) +int Domain::find_region(const std::string &name) const { for (int iregion = 0; iregion < nregion; iregion++) if (name == regions[iregion]->id) return iregion; @@ -1846,15 +1844,19 @@ int Domain::find_region(const std::string &name) } /* ---------------------------------------------------------------------- - return region index if name matches existing region style - return -1 if no such region + look up pointers to regions by region style name + return vector with matching pointers ------------------------------------------------------------------------- */ -int Domain::find_region_by_style(const std::string &name) +const std::vector Domain::get_region_by_style(const std::string &name) const { + std::vector matches; + if (name.empty()) return matches; + for (int iregion = 0; iregion < nregion; iregion++) - if (name == regions[iregion]->style) return iregion; - return -1; + if (name == regions[iregion]->style) matches.push_back(regions[iregion]); + + return matches; } /* ---------------------------------------------------------------------- diff --git a/src/domain.h b/src/domain.h index 711bab0fb2..361979b887 100644 --- a/src/domain.h +++ b/src/domain.h @@ -137,10 +137,10 @@ class Domain : protected Pointers { void set_lattice(int, char **); void add_region(int, char **); - void delete_region(int, char **); void delete_region(int); - int find_region(const std::string &); - int find_region_by_style(const std::string &); + void delete_region(const std::string &); + int find_region(const std::string &) const; + const std::vector get_region_by_style(const std::string &) const; void set_boundary(int, char **, int); void set_box(int, char **); void print_box(const std::string &);