Пример #1
0
    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')])
Пример #2
0
    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)
            })
Пример #3
0
    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')])
Пример #4
0
    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')])
Пример #5
0
    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')])
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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')])
Пример #9
0
    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)
Пример #10
0
    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
Пример #11
0
    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)