/** applet No. 1138
*
* NaCl in Ar - molecular dynamics 3D
* - Ionic potential(SX1S) + rare gas atom potential
* - multi thread IonMD3D :: display - asynchronous
*
* Created by Ikeuchi Mitsuru on March 17 2007.
* Copyright (c) 2007 Ikeuchi Mitsuru. All rights reserved.
*
* ver 0.0.1 2007.03.17 created
* ver 0.0.2 2007.06.17 improved code
* ver 0.0.3 2007.07.08 change Particles class
*
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class NaClinArSXRGMtMD3D extends Applet
implements MouseListener, MouseMotionListener,
ItemListener, ActionListener, AdjustmentListener, Runnable {
// ------------------------------------ preset field -----------
Thread th = null; // for run()-paint() thread
Particles ma = new Particles();
MolecularDynamics3D md = null;
DisplayMD3D dsp = new DisplayMD3D();
// for event
Choice ch_initMode, ch_tempControl, ch_view;
Button bt_reset, bt_startStop, bt_step;
Scrollbar sc_temp, sc_scale;
// for off-paint buffer
Dimension dim;
Image imgOff;
Graphics gOff;
int dgX,dgY, dgXb,dgYb;
int sleepTime = 100;
int dispMode = 2;
int thCount = 0;
// ------------------------------ applet main thread -----------
public void init() {
resize(630,460);
setBackground(Color.white);
dim = getSize();
imgOff = createImage(dim.width,dim.height);
gOff = imgOff.getGraphics();
ch_initMode = new Choice();
ch_initMode.add("melt");
ch_initMode.add("crystal");
ch_initMode.addItemListener(this);
ch_initMode.select("crystal");
ch_tempControl = new Choice();
ch_tempControl.add("adiabatic");
ch_tempControl.add("t scaling");
ch_tempControl.add("wall cont.");
ch_tempControl.addItemListener(this);
ch_tempControl.select("wall cont.");
ch_view = new Choice();
ch_view.add("ball");
ch_view.add("line");
ch_view.add("ball+line");
ch_view.add("real size");
ch_view.add("temperature");
ch_view.add("velocity");
ch_view.add("vSpace");
ch_view.add("line+rdf");
ch_view.add("v+vdf");
ch_view.addItemListener(this);
ch_view.select("ball+line");
bt_reset = new Button("reset");
bt_reset.addActionListener(this);
bt_startStop = new Button("start/stop");
bt_startStop.addActionListener(this);
bt_step = new Button("step");
bt_step.addActionListener(this);
sc_temp = new Scrollbar(Scrollbar.HORIZONTAL,30,10,1,210);
sc_temp.addAdjustmentListener(this);
sc_scale = new Scrollbar(Scrollbar.HORIZONTAL,100,10,50,210);
sc_scale.addAdjustmentListener(this);
addMouseListener(this);
addMouseMotionListener(this);
setLayout(new BorderLayout());
Panel pnl = new Panel();
pnl.setLayout(new GridLayout(2,6,5,0));
//pnl.add(new Label(" "));
pnl.add(bt_reset);
pnl.add(bt_startStop);
pnl.add(bt_step);
pnl.add(ch_tempControl);
pnl.add(new Label(" "));
pnl.add(new Label(" "));
pnl.add(ch_initMode);
pnl.add(new Label(" "));
pnl.add(new Label(" "));
pnl.add(sc_temp);
pnl.add(sc_scale);
pnl.add(ch_view);
add(pnl,"North");
}
public void start() {
if (md == null) {
md = new MolecularDynamics3D(ma);
md.start();
}
if (th == null) {
th = new Thread(this);
th.start();
}
}
public void stop() {
if (th != null) th = null;
if (md != null) md = null;
}
// ---------------------------------- event listener -----------
public void itemStateChanged(ItemEvent ev){
if (ev.getSource() == ch_initMode){
md.setInitMode( ch_initMode.getSelectedIndex() );
thCount = 0;
} else if (ev.getSource() == ch_tempControl) {
md.setTempMode( ch_tempControl.getSelectedIndex() );
} else if (ev.getSource() == ch_view){
dispMode = ch_view.getSelectedIndex();
}
}
public void actionPerformed(ActionEvent ev){
if(ev.getSource() == bt_reset){
md.reset();
thCount = 0;
} else if (ev.getSource() == bt_startStop){
if (md.getStartSW()==0) {
md.setStartSW(1);
} else {
md.setStartSW(0);
}
} else if (ev.getSource() == bt_step){
if (md.getStartSW()==0) {
md.setStepSW();
}
}
}
public void adjustmentValueChanged(AdjustmentEvent ev){
if (ev.getSource() == sc_temp) {
md.setContTemp( 10.0*(double)(sc_temp.getValue()) );
} else if(ev.getSource() == sc_scale) {
dsp.setViewScale( 0.01*(double)(sc_scale.getValue()) );
}
}
public void mousePressed(MouseEvent ev){ }
public void mouseReleased(MouseEvent ev){
dgXb = 0; dgYb = 0;
dgX = 0; dgY = 0;
}
public void mouseClicked(MouseEvent ev){ }
public void mouseEntered(MouseEvent ev){ }
public void mouseExited (MouseEvent ev){ }
public void mouseMoved (MouseEvent ev){ }
public void mouseDragged(MouseEvent ev){
dgXb = dgX; dgYb = dgY;
dgX=ev.getX();
dgY=ev.getY();
if (dgXb==0 && dgYb==0) {
dgXb = dgX; dgYb = dgY;
}
dsp.setViewDelta((dgX-dgXb), (dgY-dgYb));
}
// ========================= run() - paint() loop ==============
public void run() {
while (th != null) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) { }
thCount += 1;
offPaint();
repaint();
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g.drawImage(imgOff,0,0,this);
}
private void offPaint() {
if (md != null) {
dsp.plotGraph(gOff, md, dispMode, thCount);
}
}
}
// ================================ display MD3D class ===========
class DisplayMD3D {
Graphics gOff;
MolecularDynamics3D md;
private int Nmt;
private double dt = md.getdt();
private double xMax = md.getxMax();
private double yMax = md.getyMax();
private double zMax = md.getzMax();
private double zDepth = xMax;
private double dispWidth = 250.0;
private double dispScale = (dispWidth/xMax);
private double viewScale = 1.0;
private double cx = 0.5*xMax;
private double cy = 0.5*yMax;
private double cz = 0.5*zMax;
private double theta = -20.0*3.14/180.0;
private double fai = 10.0*3.14/180.0;
private double cosTh = Math.cos(theta);
private double sinTh = Math.sin(theta);
private double cosFi = Math.cos(fai);
private double sinFi = Math.sin(fai);
private int NN = 10000;
private int srtz[][] = new int[2][NN];
private double px[] = new double[NN];
private double py[] = new double[NN];
private double pz[] = new double[NN];
private double pxx[] = new double[NN];
private double pyy[] = new double[NN];
private double pzz[] = new double[NN];
private double wkx[] = new double[8];
private double wky[] = new double[8];
private double wkz[] = new double[8];
private double pwkx[] = new double[8];
private double pwky[] = new double[8];
private double pwkz[] = new double[8];
private int boxp[][] = {
{0,1},{0,2},{0,4},{1,3},{1,5},{2,3},{2,6},{4,5},{4,6},{3,7},{5,7},{6,7}
};
private int rdf[] = new int[120];
private int vdf[][] = new int[4][220];
private double meanvdf[][] = new double[4][220];
private double ffvMaxwell[] = new double[220];
private int drawnCount = 0;
// ------------------------------- class constructor -----------
DisplayMD3D() {
setWaku();
}
// ----------------------------------- class methods -----------
public void plotGraph(Graphics gg, MolecularDynamics3D md3d, int dispMode, int thCount) {
int mdCount, gbx, gby;
double tmp;
gOff = gg;
md = md3d;
if (md==null) return;
mdCount = md.getCount();
if (mdCount==drawnCount) return;
drawnCount = mdCount;
Nmt = md.getNmt();
gOff.setColor(Color.white);
gOff.fillRect(0,0,630,460);
gbx = 70;
gby = 130;
if (dispMode==0) { // ball
ballPlot(gbx,gby, 0.7, 0);
} else if (dispMode==1) { // line
ballPlot(gbx,gby, 0.5, 1);
} else if (dispMode==2) { // ball + line
ballPlot(gbx,gby, 0.5, 2);
} else if (dispMode==3) { // real
ballPlot(gbx,gby, 1.0, 0);
} else if (dispMode==4) { // temperature
ballPlot(gbx,gby, 0.7, 3);
} else if (dispMode==5) { // velocity
velocityPlot(gbx, gby, 10.0);
} else if (dispMode==6) { // velocity
vSpacePlot(gbx, gby, 500.0);
} else if (dispMode==7) {
ballPlot(gbx,gby, 0.5, 1);
rdfPlot(400,180, 0.1);
} else if (dispMode==8) {
velocityPlot(gbx, gby, 10.0);
vdfPlot(400,180, 1.0);
}
tmp = md.temperature();
gOff.setColor(Color.blue);
gOff.drawString("t="+(int)(md.getTime()*1.0e14+0.5)/100.0+" ps",630/6*0+10,70);
gOff.setColor(Color.getHSBColor((float)md.getColorOf(3),0.8f,0.8f));
gOff.drawString("Na+",630/6*1+10,70);
gOff.setColor(Color.getHSBColor((float)md.getColorOf(7),0.8f,0.8f));
gOff.drawString("Cl-",630/6*1+50,70);
gOff.setColor(Color.getHSBColor((float)md.getColorOf(15),0.8f,0.8f));
gOff.drawString("Ar",630/6*1+90,70);
gOff.setColor(Color.black);
gOff.drawString("Tc="+md.getContTemp()+"K",630/6*3+10,70);
gOff.drawString("scale="+(int)(viewScale*100.0+0.499)+"%",630/6*4+10,70);
gOff.drawString("view",630/6*5+10,70);
gOff.setColor(Color.blue);
gOff.drawString("T="+(int)(tmp*10+0.5)/10.0+" K",630/6*3+10,90);
gOff.drawString("L="+(int)(xMax*1.0e10+0.5)/10.0+" nm",630/6*4+10,90);
//gOff.drawString("P="+(int)(md.pressure()/1.0e4+0.5)/100.0+"MPa",630/6*5+0,90);
//gOff.drawString("
="+(int)(md.meanPressure()/1.0e4+0.5)/100.0+"MPa",630/6*5+0,110);
//gOff.drawString("nkT="+(int)((Nmt/(xMax*yMax*zMax)*1.38e-23*tmp)/1.0e4+0.5)/100.0+"MPa",630/6*4+0,110);
gOff.setColor(Color.black);
gOff.drawString("regMax="+md.regMax()+"",630/6*5+10,130);
gOff.drawString("secMax="+md.secMax()+"",630/6*5+10,150);
gOff.setColor(Color.black);
gOff.drawString("thread MD = "+md.getCount()+" ",20,440);
gOff.drawString("thread disp = "+thCount+" ",220,440);
}
// ------------------------------------ plot methods -----------
private void ballPlot(int gbx, int gby, double size, int imode) {
int i,j,k,jj,gx,gy,g2x,g2y,gr;
double sz,sc,tm;
setPos();
rotate();
zSort();
drawWaku(gbx,gby,0);
sc = dispScale*viewScale;
sz = size*sc;
for (i=0; i0.99) tm = 0.99;
gOff.setColor(Color.getHSBColor(
(float)md.getColor(j),0.8f,(float)(0.8*tm+0.2)));
gOff.fillOval(gx-gr/2,gy-gr/2, gr, gr);
}
}
drawWaku(gbx,gby,1);
}
private double distance(int i,int j) {
double x,y,z;
x = px[i]-px[j];
y = py[i]-py[j];
z = pz[i]-pz[j];
return Math.sqrt(x*x+y*y+z*z);
}
private void velocityPlot(int gbx, int gby, double mag) {
int i,j,gx,gy,g2x,g2y;
double sc,m, p2x,p2y,p2z,rotp2x,rotp2y,rotp2z;
setPos();
rotate();
zSort();
drawWaku(gbx,gby,0);
sc = dispScale*viewScale;
for (i=0; i=xMax/2.0) {
gOff.setColor(Color.getHSBColor((float)md.getColor(j),0.8f,(float)(0.2*pz[j]/zDepth+0.5)));
} else {
gOff.setColor(Color.getHSBColor((float)md.getColor(j),0.4f,(float)(0.2*pz[j]/zDepth+0.5)));
}
gOff.drawOval(gx-gr/2,gy-gr/2, gr, gr);
}
drawWaku(gbx,gby,1);
}
// plot utility
private void drawWaku(int gbx, int gby, int imode) {
int i,gx,gy,g2x,g2y,farPoint;
double sc,tmp;
sc = dispScale*viewScale;
farPoint = findMin();
for (i=0; i<12; i++) {
gx = (int)(sc*pwkx[boxp[i][0]])+gbx;
gy = (int)(sc*pwky[boxp[i][0]])+gby;
g2x = (int)(sc*pwkx[boxp[i][1]])+gbx;
g2y = (int)(sc*pwky[boxp[i][1]])+gby;
if (imode==0) {
if (boxp[i][0]==farPoint || boxp[i][1]==farPoint) {
gOff.setColor(Color.lightGray);
gOff.drawLine(gx,gy, g2x, g2y);
}
} else if (imode==1) {
if (boxp[i][0]!=farPoint && boxp[i][1]!=farPoint) {
gOff.setColor(Color.gray);
if (md.getTempMode()==2) {
tmp = md.temperature();
if (tmp>md.getContTemp()) {
gOff.setColor(Color.black);
} else {
gOff.setColor(Color.red);
}
}
gOff.drawLine(gx,gy, g2x, g2y);
}
}
}
}
private int findMin() {
int i,im;
double m;
im = 0; m = pwkz[im];
for (i=0; i<8; i++) {
if (pwkz[i]=srtz[1][p]) p = i;
k = qSortPartition(i,j,srtz[1][p]);
qSort(i,k-1);
qSort(k,j);
}
}
private int qSortPartition(int i,int j, int x) {
int l,r,w;
l = i; r = j;
while (l<=r) {
while (l<=j && srtz[1][l]=i && srtz[1][r]>=x) r--;
if (l>r) break;
w = srtz[0][l]; srtz[0][l] = srtz[0][r]; srtz[0][r] = w;
w = srtz[1][l]; srtz[1][l] = srtz[1][r]; srtz[1][r] = w;
l++; r--;
}
return ( l );
}
// rotate
private void rotate() {
int i;
for (i=0; i0) {
gOff.fillRect(gx+i*2,gy+hoganHight-iy,2,iy);
}
}
drawHogan(gx, gy, hoganWidth, hoganHight, xDiv, yDiv);
gOff.setColor(Color.black);
gOff.drawString("0",gx-5,gy+hoganHight+20);
gOff.drawString("1 (nm)",gx+hoganWidth-20,gy+hoganHight+20);
gOff.drawString("radial distribution",gx+40,gy+hoganHight+40);
}
private void drawHogan(int gx, int gy, int hoganWidth, int hoganHight, int xDiv, int yDiv) {
int i;
gOff.setColor(Color.gray);
for (i=0; i0) {
gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200);
}
}
/*
// Maxwell
setMaxwell( md.getContTemp(), mat );
gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.6f));
for (i=0; i<200-1; i++) {
iy = (int)(ascale*ffvMaxwell[i]);
iy2 = (int)(ascale*ffvMaxwell[i+1]);
if (iy>0) {
gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2);
}
}
*/
// MAT1
gOff.setColor(Color.getHSBColor(md.getColorOf(mat),0.8f,0.6f));
for (i=0; i<200-1; i++) {
iy = (int)(ascale*meanvdf[1][i]);
iy2 = (int)(ascale*meanvdf[1][i+1]);
if (iy>0) {
gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2);
}
}
// MAT2
gOff.setColor(Color.getHSBColor(md.getColorOf(mat2),0.8f,0.6f));
for (i=0; i<200-1; i++) {
iy = (int)(ascale*meanvdf[2][i]);
iy2 = (int)(ascale*meanvdf[2][i+1]);
if (iy>0) {
gOff.drawLine(gx+i,gy+200-iy,gx+i,gy+200-iy2);
}
}
// grid
gOff.setColor(Color.gray);
for (i=0; i<200; i+=50) {
gOff.drawLine(gx+i,gy, gx+i, gy+200);
}
for (i=0; i<200; i+=100) {
gOff.drawLine(gx,gy+200-i, gx+200, gy+200-i);
}
gOff.setColor(Color.black);
gOff.drawRect(gx,gy,200,200);
gOff.setColor(Color.black);
gOff.drawString("0",gx-5,gy+hoganHight+20);
gOff.drawString("2000 m/s",gx+hoganWidth-30,gy+hoganHight+20);
gOff.drawString("velocity distribution",gx+30,gy+hoganHight+40);
gOff.setColor(Color.lightGray);
gOff.drawString("count",gx+120,gy+20);
if (mat<21) {
gOff.setColor(Color.getHSBColor(md.getColorOf(mat),0.8f,0.6f));
gOff.drawString("mean distr.",gx+120,gy+40);
gOff.setColor(Color.getHSBColor(md.getColorOf(mat2),0.8f,0.6f));
gOff.drawString("mean distr.",gx+120,gy+60);
//gOff.setColor(Color.getHSBColor(0.01f,0.8f,0.6f));
//gOff.drawString("Maxwell(Tc)",gx+120,gy+80);
}
}
private void setVelocityDistribution(int MAT1,int MAT2) {
int i,iv,knd;
double vv;
for (i=0; i<220; i++) {
vdf[0][i]=0; vdf[1][i]=0; vdf[2][i]=0;
}
for (i=0; i=0.8*rCutoff && r=0.8*rCutoff && r=600 && ir<1000) {
rt = 0.5+0.5*Math.cos(3.1415926536*(((double)ir)/1000.0-0.6)/0.4);
} else {
rt = 0.0;
}
return( rt );
}
// ----------------------------------- class methods -----------
public double force(double r, int ki, int kj) {
int i;
double a;
i = (int)(r/hh);
a = r - i*hh;
return ( ((hh-a)*forceTable[ki][kj][i] + a*forceTable[ki][kj][i+1])/hh );
}
// ------------------------------------- I/O methods -----------
public static int getKindMax() { return kindMax; }
public static String getMatStr(int knd) { return matStr[knd]; }
public static double getMassOf(int knd) { return ion[knd][0]; }
public static double getDiaOf(int knd) { return 2.0*ion[knd][5]; }
public static float getColorOf(int knd) { return (float)ion[knd][6]; }
public static double getrCutoff() { return rCutoff; }
public static double getdt() { return dt; }
}
// ============================= molecular dynamics 3D ===========
class MolecularDynamics3D extends Thread {
private Particles ma;
private double t = 0.0;
private static double dt = 1.0*1.0e-15;
private static double xMax = 2.7*1.0e-9;
private static double yMax = 2.7*1.0e-9;
private static double zMax = 2.7*1.0e-9;
private static int Nmt = 6*7*6;
private int Nsx = 20;
private int Nsy = 20;
private int Nsz = 20;
private int MAT1 = 3; // Na+
private int MAT2 = 7; // Cl-
private int mat2content = 50; // 0-100
private double rc = ma.getrCutoff();
private double rc2 = rc*rc;
private int tempMode = 2;
private double contTemp = 300.0;
private int initMode = 1;
private int NN = 10000;
private int kind[] = new int[NN];
private double xx[] = new double[NN];
private double yy[] = new double[NN];
private double zz[] = new double[NN];
private double vx[] = new double[NN];
private double vy[] = new double[NN];
private double vz[] = new double[NN];
private double ffx[] = new double[NN];
private double ffy[] = new double[NN];
private double ffz[] = new double[NN];
private int reg[][] = new int[NN][500];
private int section[][][][] = new int[Nsx][Nsy][Nsz][100];
private double virial[][] = new double[3][256];
private double memTemp[] = new double[256];
private int virialp = 0;
private int resetSW = 0;
private int startSW = 1;
private int stepSW = 0;
private int sleepTime = 1;
private int stopSleepTime = 100;
private int count = 0;
// ------------------------------- class constructor -----------
MolecularDynamics3D(Particles ma2d) {
ma = ma2d;
setInitialCondition();
}
// -------------------------------------- thread run -----------
public void run() {
while (true) {
count += 1;
timeEvolution();
if (sleepTime>0) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) { }
}
}
}
// --------------------------- set initial condition -----------
private void setInitialCondition() {
int ip,ix,iy,iz;
double a,d,mr;
count = 0;
t = 0.0;
a = xMax/7.0;
d = 0.5*a;
if (initMode==1) {
a = 2.82e-10;
d = (xMax-5*a)/2.0;
}
ip = 0;
for (ix=0; ix<6; ix++) {
for (iy=0; iy<6; iy++) {
for (iz=0; iz<6; iz++) {
kind[ip] = 3; // Na+
if ((ix+iy+iz)%2==1 ) {
kind[ip] = 7; // Cl-
}
xx[ip] = a*(double)ix+d;
yy[ip] = a*(double)iy+d;
zz[ip] = a*(double)iz+d;
mr = Math.sqrt(ma.getMassOf(kind[0])/ma.getMassOf(kind[ip]));
vx[ip] = 800.0*mr*(Math.random()-0.5);
vy[ip] = 800.0*mr*(Math.random()-0.5);
vz[ip] = 800.0*mr*(Math.random()-0.5);
ffx[ip] = 0.0;
ffy[ip] = 0.0;
ffz[ip] = 0.0;
ip += 1;
}
}
}
for (ix=0; ix<6; ix++) {
for (iy=6; iy<7; iy++) {
for (iz=0; iz<6; iz++) {
kind[ip] = 15; // Ar
xx[ip] = a*(double)ix+d;
yy[ip] = a*(double)iy+d + 0.2*a;
zz[ip] = a*(double)iz+d;
mr = Math.sqrt(ma.getMassOf(kind[0])/ma.getMassOf(kind[ip]));
vx[ip] = 800.0*mr*(Math.random()-0.5);
vy[ip] = 800.0*mr*(Math.random()-0.5);
vz[ip] = 800.0*mr*(Math.random()-0.5);
ffx[ip] = 0.0;
ffy[ip] = 0.0;
ffz[ip] = 0.0;
ip += 1;
}
}
}
vAjustment();
initVirial();
}
// ---------------------------------- time evolution -----------
private void timeEvolution(){
if (resetSW==1) {
setInitialCondition();
resetSW = 0;
}
if (startSW==1) {
timeStep();
} else {
if (stepSW==1) {
timeStep();
stepSW = 0;
}
try {
Thread.sleep(stopSleepTime);
} catch (InterruptedException e) { }
}
}
private void timeStep() {
int i;
if (tempMode==1) {
vAjustment();
}
registration();
for (i=0; i<20; i++) {
time1Step();
}
setVirial();
}
private void time1Step() {
int i;
double dtv2, a2;
dtv2 = dt/2.0;
t = t + dt;
for (i=0; i1.2){ rr=1.2; };
}
for (i=0; i xMax) {
xx[i] = xMax; vx[i] = -rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = rr*vz[i];
}
if (yy[i] < 0.0) {
yy[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; vz[i] = rr*vz[i];
}
if (yy[i] > yMax) {
yy[i] = yMax; vx[i] = rr*vx[i]; vy[i] = -rr*vy[i]; vz[i] = rr*vz[i];
}
if (zz[i] < 0.0) {
zz[i] = 0.0; vx[i] = rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = -rr*vz[i];
}
if (zz[i] > zMax) {
zz[i] = zMax; vx[i] = rr*vx[i]; vy[i] = rr*vy[i]; vz[i] = -rr*vz[i];
}
}
}
//registration
private void registration() {
int i,j,k,ip,jp,kp,i0,i1,j0,j1,k0,k1,iq;
double r2,rreg,rreg2;
double x,y,z;
preRegistration();
rreg = rc + 3000.0*20*dt;
rreg2 = rreg*rreg;
for(ip=0;ip=Nsx) i1 = Nsx-1;
j0 = (int)(Nsy*(yy[ip]-rreg)/yMax); if (j0<0) j0 = 0;
j1 = (int)(Nsy*(yy[ip]+rreg)/yMax); if (j1>=Nsy) j1 = Nsy-1;
k0 = (int)(Nsz*(zz[ip]-rreg)/zMax); if (k0<0) k0 = 0;
k1 = (int)(Nsz*(zz[ip]+rreg)/zMax); if (k1>=Nsz) k1 = Nsz-1;
for(i=i0;i<=i1;i++) {
for(j=j0;j<=j1;j++) {
for(k=k0;k<=k1;k++) {
for(iq=1;iq<=section[i][j][k][0];iq++) {
jp = section[i][j][k][iq];
if (jp>ip) {
r2=(xx[ip]-xx[jp])*(xx[ip]-xx[jp])+(yy[ip]-yy[jp])*(yy[ip]-yy[jp])+(zz[ip]-zz[jp])*(zz[ip]-zz[jp]);
if (r2=Nsx) i = Nsx-1;
j = (int)(Nsy*yy[ip]/yMax); if (j>=Nsy) j = Nsy-1;
k = (int)(Nsz*zz[ip]/zMax); if (k>=Nsz) k = Nsz-1;
iq = section[i][j][k][0]+1;
section[i][j][k][0] = iq;
section[i][j][k][iq] = ip;
}
}
// ----------------------------------------- utility -----------
private void vAjustment() {
int i;
double tmp, r;
tmp = temperature();
r = Math.sqrt(contTemp/tmp);
for (i=0; im) {
m = reg[i][0];
}
}
return(m);
}
public int secMax() {
int i,j,k,m;
m = 0;
for(i=0;im) {
m = section[i][j][k][0];
}
}
}
}
return(m);
}
// pressure
private void initVirial() {
int i;
for (i=0; i<256; i++) {
virial[0][i] = 0.0;
virial[1][i] = 0.0;
virial[2][i] = 0.0;
memTemp[i] = 0.0;
}
virialp = 0;
}
private void setVirial() {
int i;
double xVir,yVir,zVir;
xVir = 0.0; yVir = 0.0; zVir = 0.0;
for (i=0; i