Program Listing for File utilities.h

Return to documentation for file (source/lib/include/utilities.h)

// SPDX-License-Identifier: LGPL-3.0-or-later
#pragma once

#include <cmath>
#include <iostream>
#include <string>
#include <vector>

namespace deepmd {

void cum_sum(std::vector<int>& sec, const std::vector<int>& n_sel);

template <typename TYPE>
inline TYPE dot1(const TYPE* r0, const TYPE* r1) {
  return r0[0] * r1[0];
}

template <typename TYPE>
inline TYPE dot2(const TYPE* r0, const TYPE* r1) {
  return r0[0] * r1[0] + r0[1] * r1[1];
}

template <typename TYPE>
inline TYPE dot3(const TYPE* r0, const TYPE* r1) {
  return r0[0] * r1[0] + r0[1] * r1[1] + r0[2] * r1[2];
}

template <typename TYPE>
inline TYPE dot4(const TYPE* r0, const TYPE* r1) {
  return r0[0] * r1[0] + r0[1] * r1[1] + r0[2] * r1[2] + r0[3] * r1[3];
}

template <typename TYPE>
inline void dotmv3(TYPE* vec_o, const TYPE* tensor, const TYPE* vec_i) {
  vec_o[0] = dot3(tensor + 0, vec_i);
  vec_o[1] = dot3(tensor + 3, vec_i);
  vec_o[2] = dot3(tensor + 6, vec_i);
}

template <typename TYPE>
inline void cprod(const TYPE* r0, const TYPE* r1, TYPE* r2) {
  r2[0] = r0[1] * r1[2] - r0[2] * r1[1];
  r2[1] = r0[2] * r1[0] - r0[0] * r1[2];
  r2[2] = r0[0] * r1[1] - r0[1] * r1[0];
}

template <typename TYPE>
inline TYPE invsqrt(const TYPE x);

template <>
inline double invsqrt<double>(const double x) {
  return 1. / sqrt(x);
}

template <>
inline float invsqrt<float>(const float x) {
  return 1.f / sqrtf(x);
}

}  // namespace deepmd