6 if (m_nx != src.size() || m_ny != src.size() || m_nz != src.size()) {
7 this->resize(src.nx(), src.ny(), src.nz());
10 cuSafeCall(cudaMemcpy2D(m_data.data(),
sizeof(
T) * m_nx, src.begin(), src.pitch(),
sizeof(
T) * src.nx(), src.ny() * src.nz(), cudaMemcpyDeviceToHost));
22 this->resize(nx, ny, nz);
30 void resize(
const uint nx,
const uint ny,
const uint nz);
36 inline T* begin()
const {
return m_data; }
38 DYN_FUNC
inline uint nx()
const {
return m_nx; }
39 DYN_FUNC
inline uint ny()
const {
return m_ny; }
40 DYN_FUNC
inline uint nz()
const {
return m_nz; }
41 DYN_FUNC
inline uint pitch()
const {
return m_pitch_x; }
43 DYN_FUNC
inline T operator () (
const int i,
const int j,
const int k)
const
45 char* addr = (
char*)m_data;
46 addr += (j * m_pitch_x + k * m_nxy);
50 DYN_FUNC
inline T& operator () (
const int i,
const int j,
const int k)
52 char* addr = (
char*)m_data;
53 addr += (j * m_pitch_x + k * m_nxy);
57 DYN_FUNC
inline T operator [] (
const int id)
const
62 DYN_FUNC
inline T& operator [] (
const int id)
67 DYN_FUNC
inline size_t index(
const uint i,
const uint j,
const uint k)
const
69 return i + j * m_nx + k * m_nx * m_ny;
72 DYN_FUNC
inline size_t size()
const {
return m_nx * m_ny * m_nz; }
73 DYN_FUNC
inline bool isCPU()
const {
return false; }
74 DYN_FUNC
inline bool isGPU()
const {
return true; }
76 void assign(
const Array3D<T, DeviceType::GPU>& src);
77 void assign(
const Array3D<T, DeviceType::CPU>& src);
100 if (NULL != m_data) clear();
102 cuSafeCall(cudaMallocPitch((
void**)&m_data, (
size_t*)&m_pitch_x, (
size_t)
sizeof(
T) * nx, (
size_t)ny*nz));
105 m_nx = nx; m_ny = ny; m_nz = nz;
106 m_nxy = m_pitch_x * m_ny;
110 void Array3D<T, DeviceType::GPU>::reset()
112 cuSafeCall(cudaMemset(m_data, 0, m_nxy * m_nz));
118 if(m_data !=
nullptr) cuSafeCall(cudaFree(m_data));
130 if (m_nx != src.nx() || m_ny != src.ny() || m_nz != src.nz()) {
131 this->resize(src.nx(), src.ny(), src.nz());
134 cuSafeCall(cudaMemcpy2D(m_data, m_pitch_x, src.begin(), src.pitch(),
sizeof(
T) *src.nx(), src.ny()*src.nz(), cudaMemcpyDeviceToDevice));
140 if (m_nx != src.nx() || m_ny != src.ny() || m_nz != src.nz()) {
141 this->resize(src.nx(), src.ny(), src.nz());
144 cuSafeCall(cudaMemcpy2D(m_data, m_pitch_x, src.begin(),
sizeof(
T) *src.nx(),
sizeof(
T) *src.nx(), src.ny()*src.nz(), cudaMemcpyHostToDevice));
This is an implementation of AdditiveCCD based on peridyno.
DArray3D< float3 > Grid3f
Array3D< T, DeviceType::GPU > DArray3D