2D框中的粒子 - 计算能量时的舍入误差

时间:2018-01-22 00:20:31

标签: c++ double rounding

我正在尝试计算盒子中粒子之间的距离。如果计算的距离大于预设的截止距离,则势能为0.否则,为1.

我认为有一些舍入问题,我不熟悉变量类型,并通过函数传递变量以了解下一步该做什么。

错误

  1. 当我手动计算d0时,我得到d0 = 0.070 - 这不是计算机得到的!计算机获得的数量为e-310。

  2. 所有计算出的距离(dij)都不小于1/14,远远大于e-310。根据我的if语句,如果dij> d0,那么U = 0,所以我应该得到总能量0,但这就是我得到的:

  3.   

    d0是6.95322e-310

         

    我是0 j是1 dij是0.0714286 d0是6.95322e-310 Uij是1

         

    .....

         

    系统能量为24976

    如果我能提供更多信息,请告诉我。我没有包含我的全部代码,但另一部分不涉及d0的操作。

    我复制了下面的相关代码

    第1部分:相关的框数据     class Vector {     上市:         双x;         双y;         Vector(){

        }
        Vector (double x_, double y_) {
            x = x_;
            y = y_;
        }
        double len() {
            return sqrt(x*x + y*y);
        }
        double lenSqr() {
            return x*x + y*y;
        }
    };
    class Atom 
    {
        public:
            Vector pos;
            Vector vel;
            Vector force;
            Atom (double x_, double y_) {
            pos = Vector(x_, y_);
            }
    
    };
    
    class BoxData
    {
        public:
            const double Len = 1.;
            const double LenHalf = 0.5 * Len;
            long double d = 1. / 14; // d is the distance between each atom 
            in the initial trigonal lattice
            int nu = 7; // auxillary parameter - will be varied
            long double d0 = d * (1 - 2^(nu - 8)); // cutoff distance
            double alpha = d - d0; // maximum allowed displacement
    };
    int main() {
    
    // Initialize box
    LoadBox();
    
    // Institute a for loop here
    SystemEnergy();
    MonteCarloMove();
    
    return 0;
    
    }
    
    //Putting atoms into box
    void LoadBox()
    {
    ofstream myfile("init.dat", ios::out);
    
    //Load atoms in box in triangular offset lattice
    const double x_shift  = 1. / 14;
    const double y_shift  = 1. / 16;
    double x = 0;
    double y = 0;
    double x_offset = 0;
    
    for (y = 0; y <= 1. - y_shift; y += y_shift) {
        for (x = x_offset; x < 0.99; x += x_shift) {
            // create atom in position (x, y)
            // and store it in array of atoms
            atoms.push_back(Atom(x, y));
        }
        // every new row flip offset 0 -> 1/28 -> 0 -> 1/28...
        if (x_offset < x_shift / 4) {
            x_offset = x_shift / 2;
        } else {
            x_offset = 0.0;
        }   
    }
    
    const int numAtoms = atoms.size();
    //print the position of each atom in the file init.dat
    for (int i = 0; i < numAtoms; i++) {
        myfile << "x is " << atoms[i].pos.x << " y is " << atoms[i].pos.y << endl;
    }
    
    myfile.close();
    }
    

    第2部分:能源计算

    vector<Atom> atoms;
    BoxData box_;
    
    void SystemEnergy()
    {
    ofstream myfile("energy.dat", ios::out);
    
    double box_Len, box_LenHalf, box_d0;
    double dij; // distance between two atoms
    double Uij; // energy between two particles
    double UTotal = 0;
    double pbcx, pbcy; // pbc -> periodic boundary condition
    double dx, dy;
    
    myfile << "d0 is " << box_d0 << endl;
    
    // define the number of atoms as the size of the array of atoms
    const int numAtoms = atoms.size();
    
    //pick atoms
    for (int i=0; i<numAtoms-1; i++) { // pick one atom -> "Atom a"
        Atom &a = atoms[i];
        for (int j=i+1; j<numAtoms; j++) { // pick another atom -> "Atom b"
            Atom &b = atoms[j];
    
            dx = a.pos.x - b.pos.x;
            dy = a.pos.y - b.pos.y;
            pbcx = 0.0;
            pbcy = 0.0;
    
            // enforce periodic boundary conditions
            if(dx >  box_LenHalf) pbcx =- box_Len; 
            if(dx < -box_LenHalf) pbcx =+ box_Len;
            if(dy >  box_LenHalf) pbcy =- box_Len;
            if(dy < -box_LenHalf) pbcy =+ box_Len;
            dx += pbcx;
            dy += pbcy;
    
            // calculate distance between atoms
            dij = sqrt(dx*dx + dy*dy);
    
            // compare dij to the cutoff distance to determine energy           
            if (dij > box_d0) {
                Uij = 0;
            } else {
                Uij = 1;
            }
            myfile << "i is " << i << " j is " << j << " dij is " << dij << " d0 is " << box_d0 << " Uij is " << Uij << endl;
            UTotal += Uij;  // sum the energies
        }
    }
    myfile << "Energy of the system is " << UTotal << endl;
    myfile.close();
    

    }

    对于格式化问题感到抱歉 - 将复制/粘贴挂起到论坛。

0 个答案:

没有答案