baoabmd 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BaoabMD.js +928 -0
- package/CL/cl.h +1979 -0
- package/CL/cl_d3d10.h +268 -0
- package/CL/cl_d3d11.h +270 -0
- package/CL/cl_dx9_media_sharing.h +386 -0
- package/CL/cl_dx9_media_sharing_intel.h +18 -0
- package/CL/cl_egl.h +187 -0
- package/CL/cl_ext.h +4738 -0
- package/CL/cl_ext_intel.h +19 -0
- package/CL/cl_function_types.h +1199 -0
- package/CL/cl_gl.h +421 -0
- package/CL/cl_gl_ext.h +18 -0
- package/CL/cl_half.h +440 -0
- package/CL/cl_icd.h +349 -0
- package/CL/cl_layer.h +163 -0
- package/CL/cl_platform.h +1414 -0
- package/CL/cl_va_api_media_sharing_intel.h +220 -0
- package/CL/cl_version.h +85 -0
- package/CL/opencl.h +32 -0
- package/INSTRUCTIONS.txt +13 -0
- package/OpenCL.lib +0 -0
- package/binding.gyp +24 -0
- package/build/Release/forces.exp +0 -0
- package/build/Release/forces.iobj +0 -0
- package/build/Release/forces.ipdb +0 -0
- package/build/Release/forces.lib +0 -0
- package/build/Release/forces.node +0 -0
- package/build/Release/forces.pdb +0 -0
- package/build/Release/nothing.lib +0 -0
- package/build/Release/obj/forces/forces.node.recipe +11 -0
- package/build/Release/obj/forces/forces.obj +0 -0
- package/build/Release/obj/forces/forces.tlog/CL.command.1.tlog +0 -0
- package/build/Release/obj/forces/forces.tlog/CL.read.1.tlog +0 -0
- package/build/Release/obj/forces/forces.tlog/CL.write.1.tlog +0 -0
- package/build/Release/obj/forces/forces.tlog/Cl.items.tlog +2 -0
- package/build/Release/obj/forces/forces.tlog/forces.lastbuildstate +2 -0
- package/build/Release/obj/forces/forces.tlog/link.command.1.tlog +0 -0
- package/build/Release/obj/forces/forces.tlog/link.read.1.tlog +0 -0
- package/build/Release/obj/forces/forces.tlog/link.secondary.1.tlog +5 -0
- package/build/Release/obj/forces/forces.tlog/link.write.1.tlog +0 -0
- package/build/Release/obj/forces/win_delay_load_hook.obj +0 -0
- package/build/binding.sln +39 -0
- package/build/forces.vcxproj +156 -0
- package/build/forces.vcxproj.filters +46 -0
- package/extra xyz files/traj_GB1-10000s.xyz +451900 -0
- package/forces.cpp +194 -0
- package/package.json +26 -0
- package/pdb/1UBQ.pdb +970 -0
- package/pdb/1YRF.pdb +1467 -0
- package/pdb/input.pdb +4521 -0
package/forces.cpp
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#include <napi.h>
|
|
2
|
+
#include <CL/cl.h>
|
|
3
|
+
#include <cmath>
|
|
4
|
+
#include <vector>
|
|
5
|
+
|
|
6
|
+
static cl_platform_id platform = NULL;
|
|
7
|
+
static cl_device_id device = NULL;
|
|
8
|
+
static cl_context context = NULL;
|
|
9
|
+
static cl_command_queue queue = NULL;
|
|
10
|
+
static cl_program program = NULL;
|
|
11
|
+
static cl_kernel kernel = NULL;
|
|
12
|
+
static bool initialized = false;
|
|
13
|
+
|
|
14
|
+
static int current_N = 0;
|
|
15
|
+
static cl_mem d_p = NULL, d_f = NULL, d_q = NULL, d_sig = NULL, d_eps = NULL, d_excl = NULL, d_lj = NULL, d_coul = NULL;
|
|
16
|
+
static std::vector<float> lj_out;
|
|
17
|
+
static std::vector<float> coul_out;
|
|
18
|
+
|
|
19
|
+
const char* kernelSource = R"CL(
|
|
20
|
+
__kernel void compute_forces(
|
|
21
|
+
__global const float* p,
|
|
22
|
+
__global float* f,
|
|
23
|
+
__global const float* q,
|
|
24
|
+
__global const float* sig,
|
|
25
|
+
__global const float* eps,
|
|
26
|
+
__global const unsigned char* excl,
|
|
27
|
+
const float coulombConst,
|
|
28
|
+
const int N,
|
|
29
|
+
__global float* lj_out,
|
|
30
|
+
__global float* coul_out
|
|
31
|
+
) {
|
|
32
|
+
int i = get_global_id(0);
|
|
33
|
+
if (i >= N) return;
|
|
34
|
+
|
|
35
|
+
int i3 = i * 3;
|
|
36
|
+
float p1x = p[i3]; float p1y = p[i3 + 1]; float p1z = p[i3 + 2];
|
|
37
|
+
float q1 = q[i]; float sig1 = sig[i]; float eps1 = eps[i];
|
|
38
|
+
|
|
39
|
+
float fx = 0.0f, fy = 0.0f, fz = 0.0f;
|
|
40
|
+
float local_lj = 0.0f, local_coul = 0.0f;
|
|
41
|
+
|
|
42
|
+
const float cutoff2 = 100.0f;
|
|
43
|
+
|
|
44
|
+
for (int j = 0; j < N; j++) {
|
|
45
|
+
if (i == j) continue;
|
|
46
|
+
|
|
47
|
+
unsigned char ex = excl[i * N + j];
|
|
48
|
+
if (ex == 1) continue;
|
|
49
|
+
|
|
50
|
+
int j3 = j * 3;
|
|
51
|
+
float dx = p1x - p[j3];
|
|
52
|
+
float dy = p1y - p[j3 + 1];
|
|
53
|
+
float dz = p1z - p[j3 + 2];
|
|
54
|
+
float r2 = dx * dx + dy * dy + dz * dz + 1e-6f;
|
|
55
|
+
|
|
56
|
+
if (r2 > cutoff2) continue;
|
|
57
|
+
|
|
58
|
+
float r = sqrt(r2);
|
|
59
|
+
float sig_mix = 0.5f * (sig1 + sig[j]);
|
|
60
|
+
float eps_mix = sqrt(eps1 * eps[j]);
|
|
61
|
+
|
|
62
|
+
float sr = sig_mix / r;
|
|
63
|
+
float sr2 = sr * sr;
|
|
64
|
+
float sr6 = sr2 * sr2 * sr2;
|
|
65
|
+
float sr12 = sr6 * sr6;
|
|
66
|
+
|
|
67
|
+
float ljScale = (ex == 2) ? 0.5f : 1.0f;
|
|
68
|
+
float coulScale = (ex == 2) ? 0.833333f : 1.0f;
|
|
69
|
+
|
|
70
|
+
float fLJ = ljScale * (24.0f * eps_mix * (2.0f * sr12 - sr6)) / r2;
|
|
71
|
+
local_lj += ljScale * 0.5f * (4.0f * eps_mix * (sr12 - sr6));
|
|
72
|
+
|
|
73
|
+
float fCoul = 0.0f;
|
|
74
|
+
if (q1 != 0.0f && q[j] != 0.0f) {
|
|
75
|
+
fCoul = coulScale * (coulombConst * q1 * q[j]) / (r2 * r);
|
|
76
|
+
local_coul += coulScale * 0.5f * ((coulombConst * q1 * q[j]) / r);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
float fNet = fLJ + fCoul;
|
|
80
|
+
fx += dx * fNet;
|
|
81
|
+
fy += dy * fNet;
|
|
82
|
+
fz += dz * fNet;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
f[i3] = fx;
|
|
86
|
+
f[i3 + 1] = fy;
|
|
87
|
+
f[i3 + 2] = fz;
|
|
88
|
+
lj_out[i] = local_lj;
|
|
89
|
+
coul_out[i] = local_coul;
|
|
90
|
+
}
|
|
91
|
+
)CL";
|
|
92
|
+
|
|
93
|
+
void CleanBuffers() {
|
|
94
|
+
if (d_p) { clReleaseMemObject(d_p); d_p = NULL; }
|
|
95
|
+
if (d_f) { clReleaseMemObject(d_f); d_f = NULL; }
|
|
96
|
+
if (d_q) { clReleaseMemObject(d_q); d_q = NULL; }
|
|
97
|
+
if (d_sig) { clReleaseMemObject(d_sig); d_sig = NULL; }
|
|
98
|
+
if (d_eps) { clReleaseMemObject(d_eps); d_eps = NULL; }
|
|
99
|
+
if (d_excl) { clReleaseMemObject(d_excl); d_excl = NULL; }
|
|
100
|
+
if (d_lj) { clReleaseMemObject(d_lj); d_lj = NULL; }
|
|
101
|
+
if (d_coul) { clReleaseMemObject(d_coul); d_coul = NULL; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
void InitOpenCL() {
|
|
105
|
+
if (initialized) return;
|
|
106
|
+
cl_int err;
|
|
107
|
+
err = clGetPlatformIDs(1, &platform, NULL);
|
|
108
|
+
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
|
|
109
|
+
context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);
|
|
110
|
+
queue = clCreateCommandQueue(context, device, 0, &err);
|
|
111
|
+
program = clCreateProgramWithSource(context, 1, &kernelSource, NULL, &err);
|
|
112
|
+
clBuildProgram(program, 1, &device, NULL, NULL, NULL);
|
|
113
|
+
kernel = clCreateKernel(program, "compute_forces", &err);
|
|
114
|
+
initialized = true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
Napi::Value InitStaticData(const Napi::CallbackInfo& info) {
|
|
118
|
+
Napi::Env env = info.Env();
|
|
119
|
+
InitOpenCL();
|
|
120
|
+
|
|
121
|
+
float* q = info[0].As<Napi::Float32Array>().Data();
|
|
122
|
+
float* sig = info[1].As<Napi::Float32Array>().Data();
|
|
123
|
+
float* eps = info[2].As<Napi::Float32Array>().Data();
|
|
124
|
+
uint8_t* excl = info[3].As<Napi::Uint8Array>().Data();
|
|
125
|
+
size_t N = info[0].As<Napi::Float32Array>().ElementLength();
|
|
126
|
+
int N_int = static_cast<int>(N);
|
|
127
|
+
|
|
128
|
+
CleanBuffers();
|
|
129
|
+
current_N = N_int;
|
|
130
|
+
lj_out.resize(N);
|
|
131
|
+
coul_out.resize(N);
|
|
132
|
+
|
|
133
|
+
cl_int err;
|
|
134
|
+
d_p = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * N * 3, NULL, &err);
|
|
135
|
+
d_f = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * N * 3, NULL, &err);
|
|
136
|
+
d_q = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * N, q, &err);
|
|
137
|
+
d_sig = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * N, sig, &err);
|
|
138
|
+
d_eps = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * N, eps, &err);
|
|
139
|
+
d_excl = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(unsigned char) * N * N, excl, &err);
|
|
140
|
+
d_lj = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * N, NULL, &err);
|
|
141
|
+
d_coul = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * N, NULL, &err);
|
|
142
|
+
|
|
143
|
+
return env.Null();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Napi::Value ComputeForces(const Napi::CallbackInfo& info) {
|
|
147
|
+
Napi::Env env = info.Env();
|
|
148
|
+
|
|
149
|
+
float* p = info[0].As<Napi::Float32Array>().Data();
|
|
150
|
+
float* f = info[1].As<Napi::Float32Array>().Data();
|
|
151
|
+
float coulombConst = static_cast<float>(info[2].As<Napi::Number>().DoubleValue());
|
|
152
|
+
|
|
153
|
+
int N = current_N;
|
|
154
|
+
if (N == 0 || !d_p) return env.Null();
|
|
155
|
+
|
|
156
|
+
clEnqueueWriteBuffer(queue, d_p, CL_FALSE, 0, sizeof(float) * N * 3, p, 0, NULL, NULL);
|
|
157
|
+
|
|
158
|
+
clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_p);
|
|
159
|
+
clSetKernelArg(kernel, 1, sizeof(cl_mem), &d_f);
|
|
160
|
+
clSetKernelArg(kernel, 2, sizeof(cl_mem), &d_q);
|
|
161
|
+
clSetKernelArg(kernel, 3, sizeof(cl_mem), &d_sig);
|
|
162
|
+
clSetKernelArg(kernel, 4, sizeof(cl_mem), &d_eps);
|
|
163
|
+
clSetKernelArg(kernel, 5, sizeof(cl_mem), &d_excl);
|
|
164
|
+
clSetKernelArg(kernel, 6, sizeof(float), &coulombConst);
|
|
165
|
+
clSetKernelArg(kernel, 7, sizeof(int), &N);
|
|
166
|
+
clSetKernelArg(kernel, 8, sizeof(cl_mem), &d_lj);
|
|
167
|
+
clSetKernelArg(kernel, 9, sizeof(cl_mem), &d_coul);
|
|
168
|
+
|
|
169
|
+
size_t globalSize = N;
|
|
170
|
+
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, NULL, 0, NULL, NULL);
|
|
171
|
+
|
|
172
|
+
clEnqueueReadBuffer(queue, d_f, CL_FALSE, 0, sizeof(float) * N * 3, f, 0, NULL, NULL);
|
|
173
|
+
clEnqueueReadBuffer(queue, d_lj, CL_FALSE, 0, sizeof(float) * N, lj_out.data(), 0, NULL, NULL);
|
|
174
|
+
clEnqueueReadBuffer(queue, d_coul, CL_TRUE, 0, sizeof(float) * N, coul_out.data(), 0, NULL, NULL);
|
|
175
|
+
|
|
176
|
+
double totalLj = 0.0, totalCoulomb = 0.0;
|
|
177
|
+
for (int i = 0; i < N; i++) {
|
|
178
|
+
totalLj += lj_out[i];
|
|
179
|
+
totalCoulomb += coul_out[i];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Napi::Object result = Napi::Object::New(env);
|
|
183
|
+
result.Set("lj", Napi::Number::New(env, totalLj));
|
|
184
|
+
result.Set("coulomb", Napi::Number::New(env, totalCoulomb));
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
|
189
|
+
exports.Set(Napi::String::New(env, "initStaticData"), Napi::Function::New(env, InitStaticData));
|
|
190
|
+
exports.Set(Napi::String::New(env, "computeForces"), Napi::Function::New(env, ComputeForces));
|
|
191
|
+
return exports;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
NODE_API_MODULE(forces, Init)
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "baoabmd",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A Molecular Dynamics simulator for Protein written in js",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"MD"
|
|
7
|
+
],
|
|
8
|
+
"homepage": "https://github.com/ZanderChampion/BaoabMD#readme",
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/ZanderChampion/BaoabMD/issues"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/ZanderChampion/BaoabMD.git"
|
|
15
|
+
},
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"author": "Zander Champion",
|
|
18
|
+
"type": "commonjs",
|
|
19
|
+
"main": "BaoabMD.js",
|
|
20
|
+
"scripts": {
|
|
21
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
22
|
+
"install": "node-gyp rebuild"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {},
|
|
25
|
+
"gypfile": true
|
|
26
|
+
}
|