diff --git a/sPuReMD/src/geo_tools.c b/sPuReMD/src/geo_tools.c index 88f8799c27e783718ccb45f1fc93adea1a5070bb..4f929e9abf6762830697e166a1f265ec71837baf 100644 --- a/sPuReMD/src/geo_tools.c +++ b/sPuReMD/src/geo_tools.c @@ -624,6 +624,7 @@ void Read_BGF( const char * const bgf_file, reax_system* system, control_params char chain_id; char s_a[12], s_b[12], s_c[12], s_alpha[12], s_beta[12], s_gamma[12]; int i, n, atom_cnt, token_cnt, bgf_serial, ratom, crystx_found; + rvec x; ratom = 0; crystx_found = FALSE; @@ -729,9 +730,15 @@ void Read_BGF( const char * const bgf_file, reax_system* system, control_params workspace->orig_id[ atom_cnt ] = bgf_serial; /* copy atomic positions */ - system->atoms[atom_cnt].x[0] = sstrtod( s_x, __FILE__, __LINE__ ); - system->atoms[atom_cnt].x[1] = sstrtod( s_y, __FILE__, __LINE__ ); - system->atoms[atom_cnt].x[2] = sstrtod( s_z, __FILE__, __LINE__ ); + x[0] = sstrtod( s_x, __FILE__, __LINE__ ); + x[1] = sstrtod( s_y, __FILE__, __LINE__ ); + x[2] = sstrtod( s_z, __FILE__, __LINE__ ); + + Fit_to_Periodic_Box( &system->box, x ); + + system->atoms[atom_cnt].x[0] = x[0]; + system->atoms[atom_cnt].x[1] = x[1]; + system->atoms[atom_cnt].x[2] = x[2]; /* atom name and type */ strncpy( system->atoms[atom_cnt].name, atom_name, diff --git a/sPuReMD/src/list.c b/sPuReMD/src/list.c index 8f69ca35a0f8a75173a3a4273b6171dc2b21f282..4dd71e25922e02897ae59aba097684cfe93748f2 100644 --- a/sPuReMD/src/list.c +++ b/sPuReMD/src/list.c @@ -29,7 +29,7 @@ void Make_List( int n, int n_max, int total_intrs, int type, reax_list* l ) assert( n > 0 ); assert( n_max > 0 ); assert( n_max >= n ); - assert( total_intrs > 0 ); + assert( total_intrs >= 0 ); assert( l != NULL ); if ( l->allocated == TRUE ) @@ -50,48 +50,104 @@ void Make_List( int n, int n_max, int total_intrs, int type, reax_list* l ) switch ( type ) { case TYP_VOID: - l->v = smalloc( l->total_intrs * sizeof(void), - "Make_List::l->v" ); + if ( l->total_intrs > 0 ) + { + l->v = smalloc( l->total_intrs * sizeof(void), + "Make_List::l->v" ); + } + else + { + l->v = NULL; + } break; case TYP_THREE_BODY: - l->three_body_list = smalloc( l->total_intrs * sizeof(three_body_interaction_data), - "Make_List::l->three_body_list" ); + if ( l->total_intrs > 0 ) + { + l->three_body_list = smalloc( l->total_intrs * sizeof(three_body_interaction_data), + "Make_List::l->three_body_list" ); + } + else + { + l->three_body_list = NULL; + } break; case TYP_BOND: - l->bond_list = smalloc( l->total_intrs * sizeof(bond_data), - "Make_List::l->bond_list" ); + if ( l->total_intrs > 0 ) + { + l->bond_list = smalloc( l->total_intrs * sizeof(bond_data), + "Make_List::l->bond_list" ); + } + else + { + l->bond_list = NULL; + } break; case TYP_DBO: - l->dbo_list = smalloc( l->total_intrs * sizeof(dbond_data), - "Make_List::l->dbo_list" ); + if ( l->total_intrs > 0 ) + { + l->dbo_list = smalloc( l->total_intrs * sizeof(dbond_data), + "Make_List::l->dbo_list" ); + } + else + { + l->dbo_list = NULL; + } break; case TYP_DDELTA: - l->dDelta_list = smalloc( l->total_intrs * sizeof(dDelta_data), - "Make_List::l->dDelta_list" ); + if ( l->total_intrs > 0 ) + { + l->dDelta_list = smalloc( l->total_intrs * sizeof(dDelta_data), + "Make_List::l->dDelta_list" ); + } + else + { + l->dDelta_list = NULL; + } break; case TYP_FAR_NEIGHBOR: - l->far_nbr_list = smalloc( l->total_intrs * sizeof(far_neighbor_data), - "Make_List::l->far_nbr_list" ); + if ( l->total_intrs > 0 ) + { + l->far_nbr_list = smalloc( l->total_intrs * sizeof(far_neighbor_data), + "Make_List::l->far_nbr_list" ); + } + else + { + l->far_nbr_list = NULL; + } break; case TYP_NEAR_NEIGHBOR: - l->near_nbr_list = smalloc( l->total_intrs * sizeof(near_neighbor_data), - "Make_List::l->near_nbr_list" ); + if ( l->total_intrs > 0 ) + { + l->near_nbr_list = smalloc( l->total_intrs * sizeof(near_neighbor_data), + "Make_List::l->near_nbr_list" ); + } + else + { + l->near_nbr_list = NULL; + } break; case TYP_HBOND: - l->hbond_list = smalloc( l->total_intrs * sizeof(hbond_data), - "Make_List::l->hbond_list" ); + if ( l->total_intrs > 0 ) + { + l->hbond_list = smalloc( l->total_intrs * sizeof(hbond_data), + "Make_List::l->hbond_list" ); + } + else + { + l->hbond_list = NULL; + } break; default: - l->v = smalloc( l->total_intrs * sizeof(void), - "Make_List::l->v" ); + fprintf( stderr, "[ERROR] unknown list type. Terminating...\n" ); + exit( INVALID_INPUT ); break; } } @@ -119,35 +175,59 @@ void Delete_List( int type, reax_list* l ) switch ( type ) { case TYP_VOID: - sfree( l->v, "Delete_List::l->v" ); + if ( l->v != NULL ) + { + sfree( l->v, "Delete_List::l->v" ); + } break; case TYP_THREE_BODY: - sfree( l->three_body_list, "Delete_List::l->three_body_list" ); + if ( l->three_body_list != NULL ) + { + sfree( l->three_body_list, "Delete_List::l->three_body_list" ); + } break; case TYP_BOND: - sfree( l->bond_list, "Delete_List::l->bond_list" ); + if ( l->bond_list != NULL ) + { + sfree( l->bond_list, "Delete_List::l->bond_list" ); + } break; case TYP_DBO: - sfree( l->dbo_list, "Delete_List::l->dbo_list" ); + if ( l->dbo_list != NULL ) + { + sfree( l->dbo_list, "Delete_List::l->dbo_list" ); + } break; case TYP_DDELTA: - sfree( l->dDelta_list, "Delete_List::l->dDelta_list" ); + if ( l->dDelta_list != NULL ) + { + sfree( l->dDelta_list, "Delete_List::l->dDelta_list" ); + } break; case TYP_FAR_NEIGHBOR: - sfree( l->far_nbr_list, "Delete_List::l->far_nbr_list" ); + if ( l->far_nbr_list != NULL ) + { + sfree( l->far_nbr_list, "Delete_List::l->far_nbr_list" ); + } break; case TYP_NEAR_NEIGHBOR: - sfree( l->near_nbr_list, "Delete_List::l->near_nbr_list" ); + if ( l->near_nbr_list != NULL ) + { + sfree( l->near_nbr_list, "Delete_List::l->near_nbr_list" ); + } break; case TYP_HBOND: - sfree( l->hbond_list, "Delete_List::l->hbond_list" ); + if ( l->hbond_list != NULL ) + { + sfree( l->hbond_list, "Delete_List::l->hbond_list" ); + } break; default: @@ -155,5 +235,4 @@ void Delete_List( int type, reax_list* l ) exit( INVALID_INPUT ); break; } - }