static void get_weight_factor(struct efp *efp, double *mass_fact, mat_t *inertia_fact) { size_t n_frags; check_fail(efp_get_frag_count(efp, &n_frags)); double xyzabc[6 * n_frags]; check_fail(efp_get_coordinates(efp, xyzabc)); for (size_t i = 0; i < n_frags; i++) { double mass; check_fail(efp_get_frag_mass(efp, i, &mass)); double inertia[3]; check_fail(efp_get_frag_inertia(efp, i, inertia)); double a = xyzabc[6 * i + 3]; double b = xyzabc[6 * i + 4]; double c = xyzabc[6 * i + 5]; mat_t rotmat; euler_to_matrix(a, b, c, &rotmat); mass_fact[i] = 1.0 / sqrt(mass); get_inertia_factor(inertia, &rotmat, inertia_fact + i); } }
static enum efp_result set_coord_xyzabc(struct frag *frag, const double *coord) { frag->x = coord[0]; frag->y = coord[1]; frag->z = coord[2]; euler_to_matrix(coord[3], coord[4], coord[5], &frag->rotmat); update_fragment(frag); return EFP_RESULT_SUCCESS; }
static struct md *md_create(struct state *state) { struct md *md = xcalloc(1, sizeof(struct md)); md->state = state; md->box = box_from_str(cfg_get_string(state->cfg, "periodic_box")); switch (cfg_get_enum(state->cfg, "ensemble")) { case ENSEMBLE_TYPE_NVE: md->get_invariant = get_invariant_nve; md->update_step = update_step_nve; break; case ENSEMBLE_TYPE_NVT: md->get_invariant = get_invariant_nvt; md->update_step = update_step_nvt; md->data = xcalloc(1, sizeof(struct nvt_data)); break; case ENSEMBLE_TYPE_NPT: md->get_invariant = get_invariant_npt; md->update_step = update_step_npt; md->data = xcalloc(1, sizeof(struct npt_data)); break; default: assert(0); } md->n_bodies = state->sys->n_frags; md->bodies = xcalloc(md->n_bodies, sizeof(struct body)); double coord[6 * md->n_bodies]; check_fail(efp_get_coordinates(state->efp, coord)); for (size_t i = 0; i < md->n_bodies; i++) { struct body *body = md->bodies + i; body->pos.x = coord[6 * i + 0]; body->pos.y = coord[6 * i + 1]; body->pos.z = coord[6 * i + 2]; double a = coord[6 * i + 3]; double b = coord[6 * i + 4]; double c = coord[6 * i + 5]; euler_to_matrix(a, b, c, &body->rotmat); body->vel.x = md->state->sys->frags[i].vel[0]; body->vel.y = md->state->sys->frags[i].vel[1]; body->vel.z = md->state->sys->frags[i].vel[2]; set_body_mass_and_inertia(state->efp, i, body); body->angmom.x = md->state->sys->frags[i].vel[3] * body->inertia.x; body->angmom.y = md->state->sys->frags[i].vel[4] * body->inertia.y; body->angmom.z = md->state->sys->frags[i].vel[5] * body->inertia.z; md->n_freedom += 3; if (body->inertia.x > EPSILON) md->n_freedom++; if (body->inertia.y > EPSILON) md->n_freedom++; if (body->inertia.z > EPSILON) md->n_freedom++; } return (md); }