[gmx-developers] oddity in code - intentional?

Berk Hess hess at kth.se
Thu May 7 15:19:14 CEST 2020


Hi,

This is due to an optimization where only the first two i particles have 
LJ interactions and the last two not.

Cheers,

Berk

On 2020-05-07 14:58, jan wrote:
> Hi all,
> I've been diverted by some other things, plus had a lot of learning to
> do. Still at it.
>
> Anyway, trying to understand how the gromacs code works in the hot
> loops. I'm looking at how kernel_ElecEwTwinCut_VdwLJCombGeom_F.cpp
> gets built up.
>
> I noticed what I'd describe as a syntactic discrepancy (which is not
> to say it's wrong, just visually aberrant).
>
>  From 2 different parts of the expansion (the # stuff is the
> preprocessor line-syncing stuff. Ignore it).
>
> --- (A) ---
>      fscal_S1 = rinvsq_S1 * (frcoul_S1 + frLJ_S1);
> # 1179 "kernel_inner.h"
>      fscal_S2 = rinvsq_S2 * (frcoul_S2 + frLJ_S2);
>      fscal_S3 = rinvsq_S3 * (frcoul_S3 + frLJ_S3);
> ---
>
> --- (B) ---
>      fscal_S1 = rinvsq_S1 * (frcoul_S1 + frLJ_S1);
> # 1187 "kernel_inner.h"
>      fscal_S2 = rinvsq_S2 * frcoul_S2;
>      fscal_S3 = rinvsq_S3 * frcoul_S3;
> ---
>
>
> The top one A all have the same form, the bottom B is mixed. Dunno if
> bug, just looked odd.
>
> Relevant piece of source code seems to be this from kernel_inner.h
>
> ---
> #    ifdef CALC_LJ
> #        ifdef CALC_COULOMB
>      fscal_S0 = rinvsq_S0 * (frcoul_S0 + frLJ_S0);
> #        else
>      fscal_S0 = rinvsq_S0 * frLJ_S0;
> #        endif
> #        ifdef CALC_COULOMB
>      fscal_S1 = rinvsq_S1 * (frcoul_S1 + frLJ_S1);
> #        else
>      fscal_S1 = rinvsq_S1 * frLJ_S1;
> #        endif
> #    else
>      fscal_S0 = rinvsq_S0 * frcoul_S0;
>      fscal_S1 = rinvsq_S1 * frcoul_S1;
> #    endif /* CALC_LJ */
> #    if defined CALC_LJ && !defined HALF_LJ
> #        ifdef CALC_COULOMB
>      fscal_S2 = rinvsq_S2 * (frcoul_S2 + frLJ_S2);
>      fscal_S3 = rinvsq_S3 * (frcoul_S3 + frLJ_S3);
> #        else
>      fscal_S2 = rinvsq_S2 * frLJ_S2;
>      fscal_S3 = rinvsq_S3 * frLJ_S3;
> #        endif
> #    else
>      /* Atom 2 and 3 don't have LJ, so only add Coulomb forces */
>      fscal_S2 = rinvsq_S2 * frcoul_S2;
>      fscal_S3 = rinvsq_S3 * frcoul_S3;
> #    endif
> ---
>
> thanks
>
> jan



More information about the gromacs.org_gmx-developers mailing list