| /*************************************************************************/ |
| /* */ |
| /* 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 */ |