void nbnxn_kernel_simd_2xnn(nbnxn_pairlist_set_t gmx_unused *nbl_list, const nbnxn_atomdata_t gmx_unused *nbat, const interaction_const_t gmx_unused *ic, int gmx_unused ewald_excl, rvec gmx_unused *shift_vec, int gmx_unused force_flags, int gmx_unused clearF, real gmx_unused *fshift, real gmx_unused *Vc, real gmx_unused *Vvdw) #ifdef GMX_NBNXN_SIMD_2XNN { int nnbl; nbnxn_pairlist_t **nbl; int coulkt, vdwkt = 0; int nb; int nthreads gmx_unused; nnbl = nbl_list->nnbl; nbl = nbl_list->nbl; if (EEL_RF(ic->eeltype) || ic->eeltype == eelCUT) { coulkt = coulktRF; } else { if (ewald_excl == ewaldexclTable) { if (ic->rcoulomb == ic->rvdw) { coulkt = coulktTAB; } else { coulkt = coulktTAB_TWIN; } } else { if (ic->rcoulomb == ic->rvdw) { coulkt = coulktEWALD; } else { coulkt = coulktEWALD_TWIN; } } } if (ic->vdwtype == evdwCUT) { switch (ic->vdw_modifier) { case eintmodNONE: case eintmodPOTSHIFT: switch (nbat->comb_rule) { case ljcrGEOM: vdwkt = vdwktLJCUT_COMBGEOM; break; case ljcrLB: vdwkt = vdwktLJCUT_COMBLB; break; case ljcrNONE: vdwkt = vdwktLJCUT_COMBNONE; break; default: gmx_incons("Unknown combination rule"); } break; case eintmodFORCESWITCH: vdwkt = vdwktLJFORCESWITCH; break; case eintmodPOTSWITCH: vdwkt = vdwktLJPOTSWITCH; break; default: gmx_incons("Unsupported VdW interaction modifier"); } } else if (ic->vdwtype == evdwPME) { if (ic->ljpme_comb_rule == eljpmeLB) { gmx_incons("The nbnxn SIMD kernels don't suport LJ-PME with LB"); } vdwkt = vdwktLJEWALDCOMBGEOM; } else { gmx_incons("Unsupported VdW interaction type"); } nthreads = gmx_omp_nthreads_get(emntNonbonded); #pragma omp parallel for schedule(static) num_threads(nthreads) for (nb = 0; nb < nnbl; nb++) { nbnxn_atomdata_output_t *out; real *fshift_p; out = &nbat->out[nb]; if (clearF == enbvClearFYes) { clear_f(nbat, nb, out->f); } if ((force_flags & GMX_FORCE_VIRIAL) && nnbl == 1) { fshift_p = fshift; } else { fshift_p = out->fshift; if (clearF == enbvClearFYes) { clear_fshift(fshift_p); } } if (!(force_flags & GMX_FORCE_ENERGY)) { /* Don't calculate energies */ p_nbk_noener[coulkt][vdwkt](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p); } else if (out->nV == 1) { /* No energy groups */ out->Vvdw[0] = 0; out->Vc[0] = 0; p_nbk_ener[coulkt][vdwkt](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p, out->Vvdw, out->Vc); } else { /* Calculate energy group contributions */ int i; for (i = 0; i < out->nVS; i++) { out->VSvdw[i] = 0; } for (i = 0; i < out->nVS; i++) { out->VSc[i] = 0; } p_nbk_energrp[coulkt][vdwkt](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p, out->VSvdw, out->VSc); reduce_group_energies(nbat->nenergrp, nbat->neg_2log, out->VSvdw, out->VSc, out->Vvdw, out->Vc); } } if (force_flags & GMX_FORCE_ENERGY) { reduce_energies_over_lists(nbat, nnbl, Vvdw, Vc); } }
void nbnxn_kernel_simd_2xnn(nbnxn_pairlist_set_t *nbl_list, const nbnxn_atomdata_t *nbat, const interaction_const_t *ic, int ewald_excl, rvec *shift_vec, int force_flags, int clearF, real *fshift, real *Vc, real *Vvdw) #ifdef GMX_NBNXN_SIMD_2XNN { int nnbl; nbnxn_pairlist_t **nbl; int coult; int nb; nnbl = nbl_list->nnbl; nbl = nbl_list->nbl; if (EEL_RF(ic->eeltype) || ic->eeltype == eelCUT) { coult = coultRF; } else { if (ewald_excl == ewaldexclTable) { if (ic->rcoulomb == ic->rvdw) { coult = coultTAB; } else { coult = coultTAB_TWIN; } } else { if (ic->rcoulomb == ic->rvdw) { coult = coultEWALD; } else { coult = coultEWALD_TWIN; } } } #pragma omp parallel for schedule(static) num_threads(gmx_omp_nthreads_get(emntNonbonded)) for (nb = 0; nb < nnbl; nb++) { nbnxn_atomdata_output_t *out; real *fshift_p; out = &nbat->out[nb]; if (clearF == enbvClearFYes) { clear_f(nbat, nb, out->f); } if ((force_flags & GMX_FORCE_VIRIAL) && nnbl == 1) { fshift_p = fshift; } else { fshift_p = out->fshift; if (clearF == enbvClearFYes) { clear_fshift(fshift_p); } } /* With Ewald type electrostatics we the forces for excluded atom pairs * should not contribute to the virial sum. The exclusion forces * are not calculate in the energy kernels, but are in _noener. */ if (!((force_flags & GMX_FORCE_ENERGY) || (EEL_FULL(ic->eeltype) && (force_flags & GMX_FORCE_VIRIAL)))) { /* Don't calculate energies */ p_nbk_noener[coult][nbat->comb_rule](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p); } else if (out->nV == 1 || !(force_flags & GMX_FORCE_ENERGY)) { /* No energy groups */ out->Vvdw[0] = 0; out->Vc[0] = 0; p_nbk_ener[coult][nbat->comb_rule](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p, out->Vvdw, out->Vc); } else { /* Calculate energy group contributions */ int i; for (i = 0; i < out->nVS; i++) { out->VSvdw[i] = 0; } for (i = 0; i < out->nVS; i++) { out->VSc[i] = 0; } p_nbk_energrp[coult][nbat->comb_rule](nbl[nb], nbat, ic, shift_vec, out->f, fshift_p, out->VSvdw, out->VSc); reduce_group_energies(nbat->nenergrp, nbat->neg_2log, out->VSvdw, out->VSc, out->Vvdw, out->Vc); } } if (force_flags & GMX_FORCE_ENERGY) { reduce_energies_over_lists(nbat, nnbl, Vvdw, Vc); } }