blob: 07e1720e482e3a852e00ce0fe6b9ff71fc53017f [file] [log] [blame]
/*************************************************************************/
/* */
/* Copyright (c) 1994 Stanford University */
/* */
/* All rights reserved. */
/* */
/* Permission is given to use, copy, and modify this software for any */
/* non-commercial purpose as long as this copyright notice is not */
/* removed. All other uses, including redistribution in whole or in */
/* part, are forbidden without prior written permission. */
/* */
/* This software is provided with absolutely no warranty and no */
/* support. */
/* */
/*************************************************************************/
EXTERN_ENV
#include <stdio.h>
#include "mdvar.h"
#include "parameters.h"
#include "mddata.h"
#include "split.h"
#include "global.h"
void BNDRY(long ProcID) /* this routine puts the molecules back inside the box if they are out */
{
long i, j, k, dir;
long X_INDEX, Y_INDEX, Z_INDEX;
struct link *curr_ptr, *last_ptr, *next_ptr, *temp_ptr;
struct list_of_boxes *curr_box;
double *extra_p;
/* for each box */
curr_box = my_boxes[ProcID];
while (curr_box) {
i = curr_box->coord[XDIR]; /* X coordinate of box */
j = curr_box->coord[YDIR]; /* Y coordinate of box */
k = curr_box->coord[ZDIR]; /* Z coordinate of box */
last_ptr = NULL;
curr_ptr = BOX[i][j][k].list;
/* Go through molecules in current box */
while (curr_ptr) {
next_ptr = curr_ptr->next_mol;
/* for each direction */
for ( dir = XDIR; dir <= ZDIR; dir++ ) {
extra_p = curr_ptr->mol.F[DISP][dir];
/* if the oxygen atom is out of the box */
while(extra_p[O] > BOXL || extra_p[O] < 0.00) {
if (extra_p[O] > BOXL ) {
/* move all three atoms back in the box */
extra_p[H1] -= BOXL;
extra_p[O] -= BOXL;
extra_p[H2] -= BOXL;
}
else if (extra_p[O] < 0.00) {
extra_p[H1] += BOXL;
extra_p[O] += BOXL;
extra_p[H2] += BOXL;
}
}
} /* for dir */
/* If O atom moves out of current box, put it in correct box */
X_INDEX = (long) (curr_ptr->mol.F[DISP][XDIR][O] / BOX_LENGTH);
Y_INDEX = (long) (curr_ptr->mol.F[DISP][YDIR][O] / BOX_LENGTH);
Z_INDEX = (long) (curr_ptr->mol.F[DISP][ZDIR][O] / BOX_LENGTH);
if ((X_INDEX != i) ||
(Y_INDEX != j) ||
(Z_INDEX != k)) {
/* Remove link from BOX[i][j][k] */
LOCK(BOX[i][j][k].boxlock);
if (last_ptr != NULL)
last_ptr->next_mol = curr_ptr->next_mol;
else
BOX[i][j][k].list = curr_ptr->next_mol;
UNLOCK(BOX[i][j][k].boxlock);
/* Add link to BOX[X_INDEX][Y_INDEX][Z_INDEX] */
LOCK(BOX[X_INDEX][Y_INDEX][Z_INDEX].boxlock);
temp_ptr = BOX[X_INDEX][Y_INDEX][Z_INDEX].list;
BOX[X_INDEX][Y_INDEX][Z_INDEX].list = curr_ptr;
curr_ptr->next_mol = temp_ptr;
UNLOCK(BOX[X_INDEX][Y_INDEX][Z_INDEX].boxlock);
}
else last_ptr = curr_ptr;
curr_ptr = next_ptr; /* Go to next molecule in current box */
} /* while curr_ptr */
curr_box = curr_box->next_box;
} /* for curr_box */
} /* end of subroutine BNDRY */