【问题标题】:Initializing a box with N particles arranged in a specific pattern初始化一个有 N 个粒子以特定模式排列的盒子
【发布时间】:2018-01-19 01:15:51
【问题描述】:

我是 C++ 新手,作为练习,我试图重现 Metropolis 等人所做的事情。 (大都会蒙特卡洛)。

到目前为止我所做的 - 做了 2 个类:Vector 和 Atom

class Vector {
public:
    double x;
    double 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_);
        vel = Vector(0, 0);
        force = Vector(0, 0);
    }
    double KE() {
        return .5 * vel.lenSqr();
    }
 };

我不确定我定义 Atom 类的方式是......最好的处理方式,因为我不会使用随机数生成器将原子放入盒子中。

我的问题: 我需要初始化一个长度为 L 的盒子(在我的情况下 L=1),并在偏移晶格中加载 224 个原子/粒子(我已经包含了一张图片)。我做了一些阅读,我想知道这里是否适合使用数组。

让我感到困惑的一件事是如何标准化阵列以获得粒子之间的适当距离以及一旦粒子开始移动阵列会发生什么。我也不确定数组如何为我提供盒子中每个原子的 x 和 y 位置。

Metropolis offset (hexagonal) lattice

【问题讨论】:

  • 欢迎来到 Stack Overflow,请查看:stackoverflow.com/help/how-to-ask
  • @Daniel - 我希望我编辑的问题更清楚一点。
  • 您是指box of length L 的立方体吗?是3维实体吗?
  • @MrPisarik - 这是一个 2D 盒子,我匆忙复制了一些代码,忘记删除 z 组件!我现在对其进行了更改以反映这一点。

标签: c++ montecarlo


【解决方案1】:

嗯,看来,一般你不需要用数组来表示格子。在实践中,通常只有当您的 atoms 只能在单元格上自然移动(例如国际象棋中的数字)时,才可以将晶格表示为数组。但似乎你的原子可以在任何方向上移动(使用像数组这样的刚性结构已经不切实际,因为它自然有 4 或 8 个方向在 2D 中移动)(这对数组也很不利,因为在这种情况下您需要数组中几乎无数的单元格来表示最小距离步长)。

所以基本上你只需要使用数组作为 224 个原子的存储空间,并通过 pos 参数设置晶格中的特定位置。

std::vector<Atom> atoms;

// initialize atoms to be in trigonal lattice
const double x_shift  = 1. / 14;
const double y_shift  = 1. / 16;

double x_offset = 0;
for (double y = 0; y < 1; y += y_shift){
    for (double x = x_offset; x < 1; 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 == 0){
        x_offset = x_shift / 2;
    }
    else{
        x_offset = 0;
    }
}

之后你只需要处理这个原子数组并根据算法改变它们的位置、速度和你需要的其他东西。

【讨论】:

  • 谢谢。我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多