Loading [MathJax]/extensions/TeX/AMSmath.js
ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
couplings.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010-2022 The ESPResSo project
3 *
4 * This file is part of ESPResSo.
5 *
6 * ESPResSo is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * ESPResSo is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22/**
23 * @file
24 * @brief ScriptInterface implementations for the
25 * various couplings provided.
26 *
27 * These are separated from the Constraints because
28 * they can be reused together with the couplings themselves.
29 */
30
36
38
39#include <unordered_map>
40#include <vector>
41
42namespace ScriptInterface {
43namespace Constraints {
44namespace detail {
45using namespace ::FieldCoupling::Coupling;
46
47/**
48 * Default version for parameterless couplings.
49 */
50template <typename Coupling> struct coupling_parameters_impl {
51 static Coupling make(const VariantMap &) { return Coupling{}; }
52 template <typename This>
53 static std::vector<AutoParameter> params(const This &) {
54 return {};
55 }
56};
57
58template <> struct coupling_parameters_impl<Viscous> {
59 template <typename This>
60 static std::vector<AutoParameter> params(const This &this_) {
61 return {{
62 "gamma",
64 [this_]() { return this_().gamma(); },
65 }};
66 }
67};
68
69template <> struct coupling_parameters_impl<Scaled> {
70 template <typename This>
71 static std::vector<AutoParameter> params(const This &this_) {
72 return {{
73 "default_scale",
75 [this_]() { return this_().default_scale(); },
76 },
77 {"particle_scales", AutoParameter::read_only, [this_]() {
78 return make_unordered_map_of_variants(this_().particle_scales());
79 }}};
80 }
81};
82
83template <typename Coupling, typename This>
84static std::vector<AutoParameter> coupling_parameters(const This &this_) {
85 return coupling_parameters_impl<Coupling>::params(this_);
86}
87
88template <typename T> T make_coupling(const VariantMap &) { return T{}; }
89template <> inline Viscous make_coupling<Viscous>(const VariantMap &params) {
90 return Viscous{get_value<double>(params, "gamma")};
91}
92
93template <> inline Scaled make_coupling<Scaled>(const VariantMap &params) {
94 return Scaled{get_value_or<std::unordered_map<int, double>>(
95 params, "particle_scales", {}),
96 get_value<double>(params, "default_scale")};
97}
98} // namespace detail
99} // namespace Constraints
100} // namespace ScriptInterface
T get_value(Variant const &v)
Extract value of specific type T from a Variant.
std::unordered_map< std::string, Variant > VariantMap
Definition Variant.hpp:69
auto make_unordered_map_of_variants(std::unordered_map< K, V > const &v)
Definition Variant.hpp:80
static SteepestDescentParameters params
Currently active steepest descent instance.
static constexpr const ReadOnly read_only