void Reset_Pressures( simulation_data *data ) { data->flex_bar.P_scalar = 0; rtensor_MakeZero( data->flex_bar.P ); data->iso_bar.P = 0; rvec_MakeZero( data->int_press ); rvec_MakeZero( data->my_ext_press ); rvec_MakeZero( data->ext_press ); }
void Compute_Center_of_Mass( reax_system *system, simulation_data *data, mpi_datatypes *mpi_data, MPI_Comm comm ) { int i; double m, det; //xx, xy, xz, yy, yz, zz; double tmp_mat[6], tot_mat[6]; rvec my_xcm, my_vcm, my_amcm, my_avcm; rvec tvec, diff; rtensor mat, inv; rvec_MakeZero( my_xcm ); // position of CoM rvec_MakeZero( my_vcm ); // velocity of CoM rvec_MakeZero( my_amcm ); // angular momentum of CoM rvec_MakeZero( my_avcm ); // angular velocity of CoM /* Compute the position, vel. and ang. momentum about the centre of mass */ for( i = 0; i < system->n; ++i ) { m = system->reax_param.sbp[ system->my_atoms[i].type ].mass; rvec_ScaledAdd( my_xcm, m, system->my_atoms[i].x ); rvec_ScaledAdd( my_vcm, m, system->my_atoms[i].v ); rvec_Cross( tvec, system->my_atoms[i].x, system->my_atoms[i].v ); rvec_ScaledAdd( my_amcm, m, tvec ); } MPI_Allreduce( my_xcm, data->xcm, 3, MPI_DOUBLE, MPI_SUM, comm ); MPI_Allreduce( my_vcm, data->vcm, 3, MPI_DOUBLE, MPI_SUM, comm ); MPI_Allreduce( my_amcm, data->amcm, 3, MPI_DOUBLE, MPI_SUM, comm ); rvec_Scale( data->xcm, data->inv_M, data->xcm ); rvec_Scale( data->vcm, data->inv_M, data->vcm ); rvec_Cross( tvec, data->xcm, data->vcm ); rvec_ScaledAdd( data->amcm, -data->M, tvec ); data->etran_cm = 0.5 * data->M * rvec_Norm_Sqr( data->vcm ); /* Calculate and then invert the inertial tensor */ for( i = 0; i < 6; ++i ) tmp_mat[i] = 0; //my_xx = my_xy = my_xz = my_yy = my_yz = my_zz = 0; for( i = 0; i < system->n; ++i ){ m = system->reax_param.sbp[ system->my_atoms[i].type ].mass; rvec_ScaledSum( diff, 1., system->my_atoms[i].x, -1., data->xcm ); tmp_mat[0]/*my_xx*/ += diff[0] * diff[0] * m; tmp_mat[1]/*my_xy*/ += diff[0] * diff[1] * m; tmp_mat[2]/*my_xz*/ += diff[0] * diff[2] * m; tmp_mat[3]/*my_yy*/ += diff[1] * diff[1] * m; tmp_mat[4]/*my_yz*/ += diff[1] * diff[2] * m; tmp_mat[5]/*my_zz*/ += diff[2] * diff[2] * m; } MPI_Reduce( tmp_mat, tot_mat, 6, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); if( system->my_rank == MASTER_NODE ) { mat[0][0] = tot_mat[3] + tot_mat[5]; // yy + zz; mat[0][1] = mat[1][0] = -tot_mat[1]; // -xy; mat[0][2] = mat[2][0] = -tot_mat[2]; // -xz; mat[1][1] = tot_mat[0] + tot_mat[5]; // xx + zz; mat[2][1] = mat[1][2] = -tot_mat[4]; // -yz; mat[2][2] = tot_mat[0] + tot_mat[3]; // xx + yy; /* invert the inertial tensor */ det = ( mat[0][0] * mat[1][1] * mat[2][2] + mat[0][1] * mat[1][2] * mat[2][0] + mat[0][2] * mat[1][0] * mat[2][1] ) - ( mat[0][0] * mat[1][2] * mat[2][1] + mat[0][1] * mat[1][0] * mat[2][2] + mat[0][2] * mat[1][1] * mat[2][0] ); inv[0][0] = mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]; inv[0][1] = mat[0][2] * mat[2][1] - mat[0][1] * mat[2][2]; inv[0][2] = mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]; inv[1][0] = mat[1][2] * mat[2][0] - mat[1][0] * mat[2][2]; inv[1][1] = mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]; inv[1][2] = mat[0][2] * mat[1][0] - mat[0][0] * mat[1][2]; inv[2][0] = mat[1][0] * mat[2][1] - mat[2][0] * mat[1][1]; inv[2][1] = mat[2][0] * mat[0][1] - mat[0][0] * mat[2][1]; inv[2][2] = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1]; if( det > ALMOST_ZERO ) rtensor_Scale( inv, 1./det, inv ); else rtensor_MakeZero( inv ); /* Compute the angular velocity about the centre of mass */ rtensor_MatVec( data->avcm, inv, data->amcm ); } MPI_Bcast( data->avcm, 3, MPI_DOUBLE, MASTER_NODE, comm ); /* Compute the rotational energy */ data->erot_cm = 0.5 * E_CONV * rvec_Dot( data->avcm, data->amcm ); }