Program Listing for File neighbor_list.h

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

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

#include <algorithm>
#include <cassert>
#include <iterator>
#include <vector>

#include "SimulationRegion.h"
#include "region.h"
#include "utilities.h"

namespace deepmd {

struct InputNlist {
  int inum;
  int* ilist;
  int* numneigh;
  int** firstneigh;
  InputNlist() : inum(0), ilist(NULL), numneigh(NULL), firstneigh(NULL){};
  InputNlist(int inum_, int* ilist_, int* numneigh_, int** firstneigh_)
      : inum(inum_),
        ilist(ilist_),
        numneigh(numneigh_),
        firstneigh(firstneigh_){};
  ~InputNlist(){};
};

void convert_nlist(InputNlist& to_nlist,
                   std::vector<std::vector<int> >& from_nlist);

int max_numneigh(const InputNlist& to_nlist);

// build neighbor list.
// outputs
//  nlist, max_list_size
//  max_list_size is the maximal size of jlist.
// inputs
//  c_cpy, nloc, nall, mem_size, rcut, region
//  mem_size is the size of allocated memory for jlist.
// returns
//  0: succssful
//  1: the memory is not large enough to hold all neighbors.
//     i.e. max_list_size > mem_nall
template <typename FPTYPE>
int build_nlist_cpu(InputNlist& nlist,
                    int* max_list_size,
                    const FPTYPE* c_cpy,
                    const int& nloc,
                    const int& nall,
                    const int& mem_size,
                    const float& rcut);

void use_nei_info_cpu(int* nlist,
                      int* ntype,
                      bool* nmask,
                      const int* type,
                      const int* nlist_map,
                      const int nloc,
                      const int nnei,
                      const int ntypes,
                      const bool b_nlist_map);

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM
void convert_nlist_gpu_device(InputNlist& gpu_nlist,
                              InputNlist& cpu_nlist,
                              int*& gpu_memory,
                              const int& max_nbor_size);

void free_nlist_gpu_device(InputNlist& gpu_nlist);

void use_nlist_map(int* nlist,
                   const int* nlist_map,
                   const int nloc,
                   const int nnei);

#endif  // GOOGLE_CUDA || TENSORFLOW_USE_ROCM

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM
// build neighbor list.
// outputs
//  nlist, max_list_size
//  max_list_size is the maximal size of jlist.
// inputs
//  c_cpy, nloc, nall, mem_size, rcut, region
//  mem_size is the size of allocated memory for jlist.
// returns
//  0: succssful
//  1: the memory is not large enough to hold all neighbors.
//     i.e. max_list_size > mem_nall
template <typename FPTYPE>
int build_nlist_gpu(InputNlist& nlist,
                    int* max_list_size,
                    int* nlist_data,
                    const FPTYPE* c_cpy,
                    const int& nloc,
                    const int& nall,
                    const int& mem_size,
                    const float& rcut);

void filter_ftype_gpu(int* ftype_out, const int* ftype_in, const int nloc);

void use_nei_info_gpu(int* nlist,
                      int* ntype,
                      bool* nmask,
                      const int* type,
                      const int* nlist_map,
                      const int nloc,
                      const int nnei,
                      const int ntypes,
                      const bool b_nlist_map);

#endif  // GOOGLE_CUDA || TENSORFLOW_USE_ROCM

}  // namespace deepmd

// legacy code

// build nlist by an extended grid
void build_nlist(std::vector<std::vector<int> >& nlist0,
                 std::vector<std::vector<int> >& nlist1,
                 const std::vector<double>& coord,
                 const int& nloc,
                 const double& rc0,
                 const double& rc1,
                 const std::vector<int>& nat_stt_,
                 const std::vector<int>& nat_end_,
                 const std::vector<int>& ext_stt_,
                 const std::vector<int>& ext_end_,
                 const SimulationRegion<double>& region,
                 const std::vector<int>& global_grid);

// build nlist by a grid for a periodic region
void build_nlist(std::vector<std::vector<int> >& nlist0,
                 std::vector<std::vector<int> >& nlist1,
                 const std::vector<double>& coord,
                 const double& rc0,
                 const double& rc1,
                 const std::vector<int>& grid,
                 const SimulationRegion<double>& region);

// build nlist by a grid for a periodic region, atoms selected by sel0 and sel1
void build_nlist(std::vector<std::vector<int> >& nlist0,
                 std::vector<std::vector<int> >& nlist1,
                 const std::vector<double>& coord,
                 const std::vector<int>& sel0,
                 const std::vector<int>& sel1,
                 const double& rc0,
                 const double& rc1,
                 const std::vector<int>& grid,
                 const SimulationRegion<double>& region);

// brute force (all-to-all distance computation) neighbor list building
// if region is NULL, open boundary is assumed,
// otherwise, periodic boundary condition is defined by region
void build_nlist(std::vector<std::vector<int> >& nlist0,
                 std::vector<std::vector<int> >& nlist1,
                 const std::vector<double>& coord,
                 const double& rc0_,
                 const double& rc1_,
                 const SimulationRegion<double>* region = NULL);

// copy periodic images for the system
void copy_coord(std::vector<double>& out_c,
                std::vector<int>& out_t,
                std::vector<int>& mapping,
                std::vector<int>& ncell,
                std::vector<int>& ngcell,
                const std::vector<double>& in_c,
                const std::vector<int>& in_t,
                const double& rc,
                const SimulationRegion<double>& region);