https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120996

--- Comment #8 from Dhruv Chawla <dhruvc at nvidia dot com> ---
Reduced further to:

===
#include <cstdint>
#include <cstddef>
#include <cmath>

#define PPWI 64

#define ZERO 0.0f
#define QUARTER 0.25f
#define HALF 0.5f
#define ONE 1.0f
#define TWO 2.0f
#define FOUR 4.0f

// Energy evaluation parameters
#define HBTYPE_F 70
#define HBTYPE_E 69

struct Atom
{
  float x, y, z;
  int32_t type;
};

struct FFParams
{
  int32_t hbtype;
  float radius;
  float elsc;
};

void use (float);

void
fasten_main (size_t natlig, size_t natpro, const Atom *protein,
             const Atom *ligand, const FFParams *forcefield, float
lpos_x[PPWI],
             float lpos_y[PPWI], float lpos_z[PPWI])
{
  for (size_t il = 0; il < natlig; il++)
    {
      const Atom l_atom = ligand[il];
      const FFParams l_params = forcefield[l_atom.type];
      for (size_t ip = 0; ip < natpro; ip++)
        {
          const Atom p_atom = protein[ip];
          const FFParams p_params = forcefield[p_atom.type];
          const float radij = p_params.radius + l_params.radius;

          const float elcdst
            = (p_params.hbtype == HBTYPE_F && l_params.hbtype == HBTYPE_F)
                ? FOUR
                : TWO;
          const float elcdst1
            = (p_params.hbtype == HBTYPE_F && l_params.hbtype == HBTYPE_F)
                ? QUARTER
                : HALF;

          const float chrg_init = l_params.elsc * p_params.elsc;

#pragma omp simd
          for (int l = 0; l < PPWI; l++)
            {
              // Calculate distance between atoms
              const float x = lpos_x[l] - p_atom.x;
              const float y = lpos_y[l] - p_atom.y;
              const float z = lpos_z[l] - p_atom.z;
              const float distij = sqrtf (x * x + y * y + z * z);
              const float distbb = distij - radij;
              float chrg_e = chrg_init
                             * ((distbb < ZERO ? ONE : (ONE - distbb *
elcdst1))
                                * (distbb < elcdst ? ONE : ZERO));
              use (chrg_e);
            }
        }
    }
}
===

Reply via email to