您的位置:首页 > 其它

RDF

2016-08-06 09:54 225 查看
//
// rdf.C
//
// Calculate radial distribution functions (RDF).
//
// Written by: Yanting Wang             December 12, 2009
//

#include <iostream>
#include <string>
using namespace std;

#include <stdlib.h>
#include <libgen.h>
#include <string.h>
#include <math.h>

#include "vector.h"

const double PI = 2.0 * acos(0.0);

//
// Periodic boundary condition (PBC)
//

Vector pbc( Vector r, double L )
{
//
// PBC correction
//

double hL = L / 2.0;

if( r.x > hL )  r.x -= L;
if( r.x < -hL ) r.x += L;

if( r.y > hL )  r.y -= L;
if( r.y < -hL ) r.y += L;

if( r.z > hL )  r.z -= L;
if( r.z < -hL ) r.z += L;

//
// Check if the vector is now inside the box
//

if( r.x > hL || r.x < -hL )
{
cerr << "r.x = " << r.x << " is out of simulation box." << endl;

exit( -1 );
}

if( r.y > hL || r.y < -hL )
{
cerr << "r.y = " << r.y << " is out of simulation box." << endl;

exit( -1 );
}

if( r.z > hL || r.z < -hL )
{
cerr << "r.z = " << r.z << " is out of simulation box." << endl;

exit( -1 );
}

return r;
}

int main( int argc, char *argv[] )
{
//
// Parse input arguments
//

if( argc != 3 )
{
cerr << "Usage: " << basename( argv[0] ) << " MC/MD ng" << endl;
return -1;
}

bool md = false;
if( !strcmp( argv[1], "MD" ) ) md = true;

const int ng = atoi( argv[2] );         // number of bins for RDF

int g[ng];    // array of RDF

int natom;       // number of atoms

double L;        // simulation box size
double width;    // bin size of RDF

int nconf = 0;   // number of configurations.

for( int i=0; i< ng; ++i ) g[i] = 0;

while( cin >> natom )
{
++ nconf;

//
// Read in the configuration
//

cin >> L;

width = L / 2.0 / ng;

Vector r[natom], v, a, pa;

string name;

for( int i=0; i<natom; ++i )
{
cin >> name >> r[i];

if( md ) cin >> v >> a >> pa;
}

//
// Count pairs
//

for( int i=0; i<natom-1; ++i )
{
for( int j=i+1; j<natom; ++j )
{
double d = pbc( r[i]-r[j], L ).r();

int index = d / width;

if( index < ng ) g[ index ] += 2;      // one pair contributes twice
}
}
}

//
// Normalize
//

const double rho = natom / L / L / L;       // density

const double c = nconf * natom * rho * 4.0 / 3.0 * PI * pow( width, 3.0 );

for( int i=0; i<ng; ++i )
{
cout << width * (i+0.5) << " "
<< g[i] / ( c * ( pow( i+1, 3.0) - pow( i, 3.0 ) ) )
<< endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: