def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' const double R0 = P(1,0) - P(0,0); const double R1 = P(1,1) - P(0,1); const double R2 = P(1,2) - P(0,2); const double r2 = R0*R0 + R1*R1 + R2*R2; if (r2 < rc2) { const double r = sqrt(r2); // \\exp{-B*r} const double exp_mbr = exp(_MB*r); // r^{-2, -4, -6} const double r_m1 = 1.0/r; const double r_m2 = r_m1*r_m1; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; // \\frac{C}{r^6} const double crm6 = _C*r_m6; // A \\exp{-Br} - \\frac{C}{r^6} u(0)+= _A*exp_mbr - crm6 + internalshift; // AB \\exp{-Br} - \\frac{C}{r^6}*\\frac{6}{r} const double term2 = crm6*(-6.0)*r_m1; const double f_tmp = _AB * exp_mbr + term2; A(0,0)+=f_tmp*R0; A(0,1)+=f_tmp*R1; A(0,2)+=f_tmp*R2; A(1,0)-=f_tmp*R0; A(1,1)-=f_tmp*R1; A(1,2)-=f_tmp*R2; } ''' constants = (kernel.Constant('_A', self.a), kernel.Constant('_AB', self.ab), kernel.Constant('_B', self.b), kernel.Constant('_MB', self.mb), kernel.Constant('_C', self.c), kernel.Constant('rc2', self.rc**2), kernel.Constant('internalshift', self._shift_internal)) return kernel.Kernel( 'BuckinghamV', kernel_code, constants, [kernel.Header('stdio.h'), kernel.Header('math.h')])
def _init_self_interaction_lib(self): if self.shared_memory in ('thread', 'omp'): PL = loop.ParticleLoopOMP else: PL = loop.ParticleLoop with open(str(_SRC_DIR) + '/EwaldOrthSource/SelfInteraction.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = (kernel.Header(block=_cont_header_src % self._subvars), ) with open(str(_SRC_DIR) + '/EwaldOrthSource/SelfInteraction.cpp', 'r') as fh: _cont_source = fh.read() _real_kernel = kernel.Kernel(name='self_interaction_part', code=_cont_source, headers=_cont_header) self._self_interaction_lib = PL( kernel=_real_kernel, dat_dict={ 'Q': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'u': self._vars['self_interaction_energy'](access.INC_ZERO) }) with open( str(_SRC_DIR) + '/EwaldOrthSource/SelfInteractionPot.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = (kernel.Header(block=_cont_header_src % self._subvars), ) with open( str(_SRC_DIR) + '/EwaldOrthSource/SelfInteractionPot.cpp', 'r') as fh: _cont_source = fh.read() _real_kernel = kernel.Kernel(name='self_interaction_part_pot', code=_cont_source, headers=_cont_header) self._self_interaction_pot_lib = PL( kernel=_real_kernel, dat_dict={ 'Q': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'UPP': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.INC), 'u': self._vars['self_interaction_energy'](access.INC_ZERO) })
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' const double R0 = P.j[0] - P.i[0]; const double R1 = P.j[1] - P.i[1]; const double R2 = P.j[2] - P.i[2]; const double r2 = R0*R0 + R1*R1 + R2*R2; const double r = sqrt(r2); // \\exp{-B*r} const double exp_mbr = exp(_MB*r); // r^{-2, -4, -6} const double r_m1 = 1.0/r; const double r_m2 = r_m1*r_m1; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; // \\frac{C}{r^6} const double crm6 = _C*r_m6; // A \\exp{-Br} - \\frac{C}{r^6} u[0]+= (r2 < rc2) ? 0.5*(_A*exp_mbr - crm6 + internalshift) : 0.0; // = AB \\exp{-Br} - \\frac{C}{r^6}*\\frac{6}{r} const double term2 = crm6*(-6.0)*r_m1; const double f_tmp = _AB * exp_mbr + term2; A.i[0]+= (r2 < rc2) ? f_tmp*R0 : 0.0; A.i[1]+= (r2 < rc2) ? f_tmp*R1 : 0.0; A.i[2]+= (r2 < rc2) ? f_tmp*R2 : 0.0; ''' constants = (kernel.Constant('_A', self.a), kernel.Constant('_AB', self.ab), kernel.Constant('_B', self.b), kernel.Constant('_MB', self.mb), kernel.Constant('_C', self.c), kernel.Constant('rc2', self.rc**2), kernel.Constant('internalshift', self._shift_internal)) return kernel.Kernel( 'BuckinghamV', kernel_code, constants, [kernel.Header('stdio.h'), kernel.Header('math.h')])
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' const double R0 = P(1, 0) - P(0, 0); const double R1 = P(1, 1) - P(0, 1); const double R2 = P(1, 2) - P(0, 2); const double r2 = R0*R0 + R1*R1 + R2*R2; const double r_m2 = sigma2/r2; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; u(0)+= (r2 < rc2) ? 0.5*CV*((r_m6-1.0)*r_m6 + internalshift) : 0.0; const double r_m8 = r_m4*r_m4; const double f_tmp = CF*(r_m6 - 0.5)*r_m8; A(0, 0)+= (r2 < rc2) ? f_tmp*R0 : 0.0; A(0, 1)+= (r2 < rc2) ? f_tmp*R1 : 0.0; A(0, 2)+= (r2 < rc2) ? f_tmp*R2 : 0.0; ''' constants = (kernel.Constant('sigma2', self._sigma**2), kernel.Constant('rc2', self._rc**2), kernel.Constant('internalshift', self._shift_internal), kernel.Constant('CF', self._C_F), kernel.Constant('CV', self._C_V)) return kernel.Kernel('LJ_accel_U', kernel_code, constants, [kernel.Header('stdio.h')])
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' const double R0 = P.j[0] - P.i[0]; const double R1 = P.j[1] - P.i[1]; const double R2 = P.j[2] - P.i[2]; const double r2 = R0*R0 + R1*R1 + R2*R2; const double r_m2 = sigma2/r2; const double r_m4 = r_m2*r_m2; const double f_tmp = CF*(r_m4*r_m2 - 0.5)*r_m4*r_m4; A.i[0]+= (r2 < rc2) ? f_tmp*R0 : 0.0; A.i[1]+= (r2 < rc2) ? f_tmp*R1 : 0.0; A.i[2]+= (r2 < rc2) ? f_tmp*R2 : 0.0; ''' constants = (kernel.Constant('sigma2', self._sigma**2), kernel.Constant('rc2', self._rc**2), kernel.Constant('internalshift', self._shift_internal), kernel.Constant('CF', self._C_F), kernel.Constant('CV', self._C_V)) return kernel.Kernel('LJ_accel', kernel_code, constants, [kernel.Header('stdio.h')])
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' OUTCOUNT(0)++; const double R0 = P(1, 0) - P(0, 0); const double R1 = P(1, 1) - P(0, 1); const double R2 = P(1, 2) - P(0, 2); //printf("Positions P(0) = %f, P(1) = %f |", P(0, 1), P(1, 1)); const double r2 = R0*R0 + R1*R1 + R2*R2; if (r2 < rc2){ COUNT(0)++; const double r_m2 = sigma2/r2; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; u(0)+= CV*((r_m6-1.0)*r_m6 + internalshift); const double r_m8 = r_m4*r_m4; const double f_tmp = CF*(r_m6 - 0.5)*r_m8; A(0, 0)+=f_tmp*R0; A(0, 1)+=f_tmp*R1; A(0, 2)+=f_tmp*R2; A(1, 0)-=f_tmp*R0; A(1, 1)-=f_tmp*R1; A(1, 2)-=f_tmp*R2; } ''' constants = (kernel.Constant('sigma2', self._sigma**2), kernel.Constant('rc2', self._rc**2), kernel.Constant('internalshift', self._shift_internal), kernel.Constant('CF', self._C_F), kernel.Constant('CV', self._C_V)) reductions = (kernel.Reduction('u', 'u[0]', '+'), ) return kernel.Kernel('LJ_accel_U', kernel_code, constants, [kernel.Header('stdio.h')], reductions)
def _init_near_potential_lib(self): # real space energy and force kernel with open( str(_SRC_DIR) + '/EwaldOrthSource/EvaluateNearPotentialField.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = (kernel.Header(block=_cont_header_src % self._subvars), ) with open( str(_SRC_DIR) + '/EwaldOrthSource/EvaluateNearPotentialField.cpp', 'r') as fh: _cont_source = fh.read() _real_kernel = kernel.Kernel(name='real_space_part', code=_cont_source, headers=_cont_header) if self.shell_width is None: rn = self.real_cutoff * 1.05 else: rn = self.real_cutoff + self.shell_width PPL = pairloop.CellByCellOMP self._near_potential_field = PPL( kernel=_real_kernel, dat_dict={ 'P': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.READ), 'Q': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'M': data.ParticleDat(ncomp=1, dtype=ctypes.c_int)(access.READ), 'u': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.INC), }, shell_cutoff=rn)
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' //N_f = 27 const double R0 = P.j[0] - P.i[0]; const double R1 = P.j[1] - P.i[1]; const double R2 = P.j[2] - P.i[2]; const double r2 = R0*R0 + R1*R1 + R2*R2; if (r2 < rc2){ const double r_m2 = sigma2/r2; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; u[0] += 0.5*CV*((r_m6-1.0)*r_m6 + internalshift); const double r_m8 = r_m4*r_m4; const double f_tmp = CF*(r_m6 - 0.5)*r_m8; A.i[0] += f_tmp*R0; A.i[1] += f_tmp*R1; A.i[2] += f_tmp*R2; } ''' constants = (kernel.Constant('sigma2', self._sigma**2), kernel.Constant('rc2', self._rc**2), kernel.Constant('internalshift', self._shift_internal), kernel.Constant('CF', self._C_F), kernel.Constant('CV', self._C_V)) return kernel.Kernel('LJ_accel_U', kernel_code, constants, [kernel.Header('stdio.h')])
def _init_real_space_lib(self): # real space energy and force kernel with open( str(_SRC_DIR) + '/EwaldOrthSource/RealSpaceForceEnergy.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = (kernel.Header(block=_cont_header_src % self._subvars), ) with open( str(_SRC_DIR) + '/EwaldOrthSource/RealSpaceForceEnergy.cpp', 'r') as fh: _cont_source = fh.read() _real_kernel = kernel.Kernel(name='real_space_part', code=_cont_source, headers=_cont_header) if self.shell_width is None: rn = self.real_cutoff * 1.05 else: rn = self.real_cutoff + self.shell_width if self.shared_memory in ('thread', 'omp'): PPL = pairloop.PairLoopNeighbourListNSOMP else: PPL = pairloop.PairLoopNeighbourListNS self._real_space_pairloop = PPL( kernel=_real_kernel, dat_dict={ 'P': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.READ), 'Q': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'F': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.INC), 'u': self._vars['real_space_energy'](access.INC_ZERO) }, shell_cutoff=rn) # real space energy and force kernel and per particle potential with open( str(_SRC_DIR) + '/EwaldOrthSource/RealSpaceForceEnergyPot.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = (kernel.Header(block=_cont_header_src % self._subvars), ) with open( str(_SRC_DIR) + '/EwaldOrthSource/RealSpaceForceEnergyPot.cpp', 'r') as fh: _cont_source = fh.read() _real_kernel = kernel.Kernel(name='real_space_part_pot', code=_cont_source, headers=_cont_header) self._real_space_pairloop_pot = PPL( kernel=_real_kernel, dat_dict={ 'P': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.READ), 'Q': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'UPP': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.INC), 'F': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.INC), 'u': self._vars['real_space_energy'](access.INC_ZERO) }, shell_cutoff=rn)
def _init_libs(self): # reciprocal contribution calculation with open(str(_SRC_DIR) + '/EwaldOrthSource/AccumulateRecip.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = kernel.Header(block=_cont_header_src % self._subvars) with open(str(_SRC_DIR) + '/EwaldOrthSource/AccumulateRecip.cpp', 'r') as fh: _cont_source = fh.read() _cont_kernel = kernel.Kernel(name='reciprocal_contributions', code=_cont_source, headers=_cont_header) if self.shared_memory in ('thread', 'omp'): PL = loop.ParticleLoopOMP else: PL = loop.ParticleLoop self._cont_lib = PL( kernel=_cont_kernel, dat_dict={ 'Positions': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.READ), 'Charges': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'RecipSpace': self._vars['recip_space_kernel'](access.INC_ZERO) }) # reciprocal extract forces plus energy with open( str(_SRC_DIR) + '/EwaldOrthSource/ExtractForceEnergy.h', 'r') as fh: _cont_header_src = fh.read() _cont_header = kernel.Header(block=_cont_header_src % self._subvars) with open( str(_SRC_DIR) + '/EwaldOrthSource/ExtractForceEnergy.cpp', 'r') as fh: _cont_source = fh.read() _cont_kernel = kernel.Kernel(name='reciprocal_force_energy', code=_cont_source, headers=_cont_header) self._extract_force_energy_lib = PL( kernel=_cont_kernel, dat_dict={ 'Positions': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.READ), 'Forces': data.ParticleDat(ncomp=3, dtype=ctypes.c_double)(access.INC), 'Energy': self._vars['recip_space_energy'](access.INC_ZERO), 'Charges': data.ParticleDat(ncomp=1, dtype=ctypes.c_double)(access.READ), 'RecipSpace': self._vars['recip_space_kernel'](access.READ), 'CoeffSpace': self._vars['coeff_space_kernel'](access.READ) }) self._extract_force_energy_pot_lib = None
def kernel(self): """ Returns a kernel class for the potential. """ kernel_code = ''' const double R0 = P[1][0] - P[0][0]; const double R1 = P[1][1] - P[0][1]; const double R2 = P[1][2] - P[0][2]; const double r2 = R0*R0 + R1*R1 + R2*R2; double xn = 0.01; for(int ix = 0; ix < 2; ix++){ xn = xn*(2.0 - r2*xn); } const double r_m2 = sigma2*xn; const double r_m4 = r_m2*r_m2; const double r_m6 = r_m4*r_m2; const double _ex = r_m6; double _et = 1.0, _ep = 1.0, _ef = 1.0, _epx = 1.0; /* #pragma novector for(int _etx = 1; _etx < 21; _etx++){ _epx *= _ex; _ef *= _ep; _ep++; xn = 0.01; #pragma novector for(int ix = 0; ix < 10; ix++){ xn = xn*(2.0 - _ef*xn); } _et += _epx*xn; } */ u[0]+=CV*((r_m6-1.0)*r_m6 + internalshift); const double r_m8 = r_m4*r_m4; const double f_tmp = CF*(r_m6 - 0.5)*r_m8; A[0][0]+=f_tmp*R0; A[0][1]+=f_tmp*R1; A[0][2]+=f_tmp*R2; A[1][0]-=f_tmp*R0; A[1][1]-=f_tmp*R1; A[1][2]-=f_tmp*R2; ''' constants = (kernel.Constant('sigma2', self._sigma**2), kernel.Constant('rc2', self._rc**2), kernel.Constant('internalshift', self._shift_internal), kernel.Constant('CF', self._C_F), kernel.Constant('CV', self._C_V)) reductions = (kernel.Reduction('u', 'u[0]', '+'), ) return kernel.Kernel('LJ_accel_U', kernel_code, constants, [kernel.Header('stdio.h')], reductions)