29#ifndef MOLECULARDYNAMICS_H
30#define MOLECULARDYNAMICS_H
39 uvec interaction_tags;
40 std::vector<shared_ptr<Interaction>> interactions;
47 for(
auto&& interaction : interactions) interaction->apply(full, element);
51 pair->set_dimension(DIM);
52 pair->set_inertial(ROTATION);
53 for(
auto&& interaction : interactions) interaction->apply(full, pair);
56 [[nodiscard]]
virtual int process_impl(
const shared_ptr<DomainBase>&,
bool) = 0;
59 suanpan::for_all(D->get_element_pool(), [&](
const shared_ptr<Element>& element) { apply_interaction(full, element); });
66 , interaction_tags(std::move(IT)) {}
68 int initialize(
const shared_ptr<DomainBase>& D)
override {
70 suanpan_warning(
"The full or sparse matrix storage scheme is required.\n");
75 for(
auto&& item : D->get<
Interaction>(interaction_tags))
76 if(item && item->is_active()) interactions.emplace_back(item);
79 for(
auto&& item : D->get_element_pool())
82 space = 2. * std::transform_reduce(
elements.cbegin(),
elements.cend(), 0., [](
const double a,
const double b) { return std::max(a, b); }, [](
const std::shared_ptr<Element>& element) { return element->get(Element::Parameter::RADIUS); });
101 CellList(
const int in_x,
const int in_y,
const unsigned in_tag)
107 int process_impl(
const shared_ptr<DomainBase>& D,
const bool full)
override {
108 auto& W = D->get_factory();
114 if(norm(element->get_trial_velocity().head(2)) * W->get_incre_time() >
space)
suanpan_warning(
"The nodal speed seems to be too large.\n");
115 const vec new_pos = element->get_coordinate(2).t() + element->get_trial_displacement().head(2);
116 list.emplace_back(
static_cast<int>(floor(new_pos(0) /
space)),
static_cast<int>(floor(new_pos(1) /
space)), element->get_tag());
119 suanpan_sort(list.begin(), list.end(), [](
const CellList& a,
const CellList& b) { return a.x < b.x || a.x == b.x && a.y < b.y; });
122 for(auto J = I + 1; J < list.size(); ++J) {
123 const auto diff_x = list[J].x - list[I].x;
124 if(diff_x > 1) break;
125 const auto diff_y = list[J].y - list[I].y;
126 if(diff_x == 1 && diff_y > 1) break;
127 if(std::abs(diff_y) > 1) continue;
128 apply_interaction(full, std::make_unique<InteractionPair>(D->get<Element>(list[I].tag), D->get<Element>(list[J].tag)));
141 int x = 0, y = 0, z = 0;
144 CellList(
const int in_x,
const int in_y,
const int in_z,
const unsigned in_tag)
151 int process_impl(
const shared_ptr<DomainBase>& D,
const bool full)
override {
152 auto& W = D->get_factory();
158 if(norm(element->get_trial_velocity().head(3)) * W->get_incre_time() >
space)
suanpan_warning(
"The nodal speed seems to be too large.\n");
159 const vec new_pos = element->get_coordinate(3).t() + element->get_trial_displacement().head(3);
160 list.emplace_back(
static_cast<int>(floor(new_pos(0) /
space)),
static_cast<int>(floor(new_pos(1) /
space)),
static_cast<int>(floor(new_pos(2) /
space)), element->get_tag());
163 suanpan_sort(list.begin(), list.end(), [](
const CellList& a,
const CellList& b) { return a.x < b.x || a.x == b.x && a.y < b.y || a.x == b.x && a.y == b.y && a.z < b.z; });
166 for(auto J = I + 1; J < list.size(); ++J) {
167 const auto diff_x = list[J].x - list[I].x;
168 if(diff_x > 1) break;
169 const auto diff_y = list[J].y - list[I].y;
170 const auto diff_z = list[J].z - list[I].z;
171 if(diff_x == 1 && (diff_y > 1 || diff_z > 1)) break;
172 if(std::abs(diff_y) > 1 || std::abs(diff_z) > 1) continue;
173 apply_interaction(full, std::make_unique<InteractionPair>(D->get<Element>(list[I].tag), D->get<Element>(list[J].tag)));
virtual int initialize(const shared_ptr< DomainBase > &)
Definition ConditionalModifier.cpp:85
bool validate_node(const shared_ptr< DomainBase > &) const
Definition ConditionalModifier.cpp:25
A Constraint class.
Definition Constraint.h:36
Definition Interaction.h:65
Definition MolecularDynamics.h:96
Definition MolecularDynamics.h:139
A MolecularDynamics class.
Definition MolecularDynamics.h:38
int initialize(const shared_ptr< DomainBase > &D) override
Definition MolecularDynamics.h:68
double space
Definition MolecularDynamics.h:44
int process_resistance(const shared_ptr< DomainBase > &D) override
Process and update resistance.
Definition MolecularDynamics.h:93
int process_entrypoint(const shared_ptr< DomainBase > &D, const bool full)
Definition MolecularDynamics.h:58
void apply_interaction(const bool full, const shared_ptr< Element > &element) const
Definition MolecularDynamics.h:46
std::vector< shared_ptr< Element > > elements
Definition MolecularDynamics.h:43
int process(const shared_ptr< DomainBase > &D) override
Process and update both stiffness and resistance.
Definition MolecularDynamics.h:91
virtual int process_impl(const shared_ptr< DomainBase > &, bool)=0
MolecularDynamics(const unsigned T, uvec &&IT)
Definition MolecularDynamics.h:64
void apply_interaction(const bool full, const shared_ptr< InteractionPair > &pair) const
Definition MolecularDynamics.h:50
Definition SparseMatMAGMA.hpp:43
std::vector< T > vector
Definition container.h:53
void for_all(Container &target, Handler &&func)
Definition suanPan.h:363
void for_each(const IT start, const IT end, F &&FN)
Definition utility.h:31
constexpr auto SUANPAN_SUCCESS
Definition suanPan.h:166
#define suanpan_warning(...)
Definition suanPan.h:348
#define suanpan_sort
Definition suanPan.h:180
constexpr auto SUANPAN_FAIL
Definition suanPan.h:167