MRMD 0.4.0
Multi Resolution Molecular Dynamics
Loading...
Searching...
No Matches
MultiHistogram.hpp
Go to the documentation of this file.
1// Copyright 2024 Sebastian Eibl
2// Copyright 2026 Julian Friedrich Hille
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// https://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#pragma once
17
18#include <string>
19
20#include "assert/assert.hpp"
21#include "datatypes.hpp"
22#include "functional.hpp"
23
24namespace mrmd
25{
26namespace data
27{
28
30{
48
49 MultiHistogram(const std::string& label, const MultiHistogram& histogram)
52 {
53 Kokkos::deep_copy(data, histogram.data);
54 }
55
61 {
62 auto bin = idx_c(std::floor((val - min) * inverseBinSize));
63 if (bin < 0) bin = -1;
64 if (bin >= numBins) bin = -1;
65 return bin;
66 }
67
75
76 const real_t min;
77 const real_t max;
83
88
89 void scale(const real_t& scalingFactor);
90 void scale(const ScalarView& scalingFactor);
91 void makeSymmetric();
92};
93
103 const real_t movingAverageFactor = 10_r);
104
115
126 const real_t& sigma,
127 const real_t& range,
128 const bool periodic = false);
129
131
145template <class BinaryOp>
147 const MultiHistogram& input2,
149 const BinaryOp& binary_op)
150{
151 MRMD_HOST_CHECK_EQUAL(input1.numHistograms, input2.numHistograms);
152 MRMD_HOST_CHECK_EQUAL(input1.numHistograms, output.numHistograms);
153 MRMD_HOST_CHECK_EQUAL(input1.numBins, input2.numBins);
154 MRMD_HOST_CHECK_EQUAL(input1.numBins, output.numBins);
155
156 auto input1Data = input1.data;
157 auto input2Data = input2.data;
158 auto outputData = output.data;
159
160 auto policy =
161 Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {input1.numBins, input1.numHistograms});
162 auto kernel = KOKKOS_LAMBDA(const idx_t idx, const idx_t jdx)
163 {
164 outputData(idx, jdx) = binary_op(input1Data(idx, jdx), input2Data(idx, jdx));
165 };
166 Kokkos::parallel_for("MultiHistogram::transform", policy, kernel);
167 Kokkos::fence();
168}
169
180template <OneCoordinatePredicate Pred>
182{
183 auto policy =
184 Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {hist.numBins, hist.numHistograms});
185 auto kernel = KOKKOS_LAMBDA(const idx_t binIdx, const idx_t histIdx)
186 {
187 if (pred(hist.getBinPosition(binIdx)))
188 {
189 hist.data(binIdx, histIdx) = newValue;
190 }
191 };
192 Kokkos::parallel_for("replace_if_bin_position", policy, kernel);
193 Kokkos::fence();
194}
195
196} // namespace data
197} // namespace mrmd
#define MRMD_HOST_CHECK_GREATER(...)
Definition host.hpp:116
#define MRMD_HOST_CHECK_EQUAL(...)
Definition host.hpp:113
#define MRMD_HOST_CHECK_GREATEREQUAL(...)
Definition host.hpp:118
data::MultiHistogram smoothen(data::MultiHistogram &input, const real_t &sigma, const real_t &range, const bool periodic)
Smoothen a histogram using gaussian convolution.
Definition MultiHistogram.cpp:163
void transform(const MultiHistogram &input1, const MultiHistogram &input2, MultiHistogram &output, const BinaryOp &binary_op)
Applies a binary operation to corresponding elements of two input MultiHistograms and stores the resu...
Definition MultiHistogram.hpp:146
data::Histogram gradient(const data::Histogram &input)
Definition Histogram.cpp:37
void cumulativeMovingAverage(data::MultiHistogram &average, const data::MultiHistogram &current, const real_t movingAverageFactor)
Add new item to the comulative moving average.
Definition MultiHistogram.cpp:92
ScalarView createGrid(const MultiHistogram &input)
Definition MultiHistogram.cpp:214
void replace_if_bin_position(MultiHistogram &hist, const Pred &pred, real_t newValue)
Replaces histogram values with a new value if the bin position satisfies a predicate.
Definition MultiHistogram.hpp:181
Definition BerendsenBarostat.cpp:18
Kokkos::View< real_t * > ScalarView
Definition datatypes.hpp:159
KOKKOS_INLINE_FUNCTION constexpr idx_t idx_c(const T &val)
Definition datatypes.hpp:93
Kokkos::View< real_t ** > MultiView
Definition datatypes.hpp:161
int64_t idx_t
Definition datatypes.hpp:91
double real_t
Definition datatypes.hpp:99
KOKKOS_INLINE_FUNCTION constexpr real_t real_c(T t)
Definition datatypes.hpp:114
Definition Array.hpp:21
Definition MultiHistogram.hpp:30
MultiHistogram & operator/=(const MultiHistogram &rhs)
Definition MultiHistogram.cpp:42
KOKKOS_INLINE_FUNCTION real_t getBinPosition(idx_t binIdx) const
Definition MultiHistogram.hpp:68
MultiHistogram(const std::string &label, const real_t minArg, const real_t maxArg, idx_t numBinsArg, idx_t numHistogramsArg)
Definition MultiHistogram.hpp:31
const idx_t numHistograms
Definition MultiHistogram.hpp:79
const real_t max
Definition MultiHistogram.hpp:77
const idx_t numBins
Definition MultiHistogram.hpp:78
MultiHistogram & operator+=(const MultiHistogram &rhs)
Definition MultiHistogram.cpp:27
MultiHistogram(const std::string &label, const MultiHistogram &histogram)
Definition MultiHistogram.hpp:49
const real_t inverseBinSize
Definition MultiHistogram.hpp:81
const real_t min
Definition MultiHistogram.hpp:76
KOKKOS_INLINE_FUNCTION idx_t getBin(const real_t &val) const
Definition MultiHistogram.hpp:60
const real_t binSize
Definition MultiHistogram.hpp:80
MultiView data
Definition MultiHistogram.hpp:82
void makeSymmetric()
Definition MultiHistogram.cpp:76
MultiHistogram & operator-=(const MultiHistogram &rhs)
Definition MultiHistogram.cpp:32
void scale(const real_t &scalingFactor)
Definition MultiHistogram.cpp:48
MultiHistogram & operator*=(const MultiHistogram &rhs)
Definition MultiHistogram.cpp:37