glotzerlab / hoomd-examples

HOOMD-blue example scripts.
BSD 3-Clause "New" or "Revised" License
35 stars 15 forks source link

Patchy Particles example does not work with hooomd 4.6.0 #119

Open JonathanH12 opened 5 months ago

JonathanH12 commented 5 months ago

File name

02-Simulating-a-System-of-Patchy-Particles.ipynb

Description

Running this notebook, both within jupyter and as a python script, results in the following error

(base) Patron@Patrons-MacBook-Air ~ % python 02-Simulating-a-System-of-Patchy-Particles.py
/Users/Patron/02-Simulating-a-System-of-Patchy-Particles.py:237: FutureWarning: CPPPotential is deprecated since 4.6.0. Use a hpmc.pair.Pair potential.
  patch_potential = hoomd.hpmc.pair.user.CPPPotential(
/Users/Patron/02-Simulating-a-System-of-Patchy-Particles.py:247: FutureWarning: pair_potential is deprecated since 4.5.0. Use pair_potentials.
  mc.pair_potential = patch_potential
Traceback (most recent call last):
  File "/Users/Patron/02-Simulating-a-System-of-Patchy-Particles.py", line 256, in <module>
    simulation.run(0)
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/simulation.py", line 555, in run
    self.operations._schedule()
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/operations.py", line 211, in _schedule
    self.integrator._attach(sim)
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/operation.py", line 315, in _attach
    self._attach_hook()
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/hpmc/integrate.py", line 457, in _attach_hook
    self._pair_potential._attach(self._simulation)
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/operation.py", line 315, in _attach
    self._attach_hook()
  File "/opt/anaconda3/lib/python3.11/site-packages/hoomd/hpmc/pair/user.py", line 290, in _attach_hook
    self._cpp_obj = _jit.PatchEnergyJIT(
                    ^^^^^^^^^^^^^^^^^^^^
RuntimeError: Error compiling JIT code:

                        #include <stdio.h>
                        #include "hoomd/HOOMDMath.h"
                        #include "hoomd/VectorMath.h"

                        // param_array (singlet class) or param_array_isotropic
                        // and param_array_constituent (union class) are
                        // allocated by the library
                        float *param_array;

                        using namespace hoomd;

                        extern "C"
                        {
                        float eval(const vec3<float>& r_ij,
                            unsigned int type_i,
                            const quat<float>& q_i,
                            float d_i,
                            float charge_i,
                            unsigned int type_j,
                            const quat<float>& q_j,
                            float d_j,
                            float charge_j)
                            {

const float delta = 45 * M_PI / 180;  // delta in radians
const float epsilon = 1.000000;
const float lambda = 1.200000;
const float sigma = 1.000000;  // hard core diameter

const float kT = param_array[0];
const float beta_epsilon = epsilon/kT;

const vec3<float> ehat_particle_reference_frame(1, 0, 0);
vec3<float> ehat_i = rotate(q_i, ehat_particle_reference_frame);
vec3<float> ehat_j = rotate(q_j, ehat_particle_reference_frame);

vec3<float> r_hat_ij = r_ij / sqrtf(dot(r_ij, r_ij));
bool patch_on_i_is_aligned_with_r_ij = dot(ehat_i, r_hat_ij) >= cos(delta);
bool patch_on_j_is_aligned_with_r_ji = dot(ehat_j, -r_hat_ij) >= cos(delta);

float rsq = dot(r_ij, r_ij);
float r_ij_length = sqrtf(rsq);
if (patch_on_i_is_aligned_with_r_ij
    && patch_on_j_is_aligned_with_r_ji
    && r_ij_length < lambda*sigma)
    {
    return -beta_epsilon;
    }
else
    {
    return 0.0;
    }

                            }
                        }

Compilation arguments:
-cc1
-triple
x86_64-apple-macosx13.0.0
-Wundef-prefix=TARGET_OS_OSX
-Werror=undef-prefix
-Wdeprecated-objc-isa-usage
-Werror=deprecated-objc-isa-usage
-emit-llvm
-disable-free
-clear-ast-before-backend
-disable-llvm-verifier
-discard-value-names
-main-file-name
_hoomd_llvm_code.cc
-mrelocation-model
pic
-pic-level
2
-mframe-pointer=all
-ffp-contract=on
-fno-rounding-math
-funwind-tables=2
-fcompatibility-qualified-id-block-type-checking
-fvisibility-inlines-hidden-static-local-var
-target-cpu
penryn
-tune-cpu
generic
-mllvm
-treat-scalable-fixed-error-as-warning
-debugger-tuning=lldb
-target-linker-version
609
-fcoverage-compilation-dir=/Users/Patron
-resource-dir
/opt/anaconda3/lib/clang/14.0.6
-D
HOOMD_LLVMJIT_BUILD
-D
HOOMD_LONGREAL_SIZE=64
-D
HOOMD_SHORTREAL_SIZE=32
-I
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include
-stdlib=libc++
-internal-isystem
/opt/anaconda3/bin/../include/c++/v1
-internal-isystem
/usr/local/include
-internal-isystem
/opt/anaconda3/lib/clang/14.0.6/include
-internal-externc-isystem
/usr/include
-O3
--std=c++14
-fdeprecated-macro
-fdebug-compilation-dir=/Users/Patron
-ferror-limit
19
-stack-protector
1
-fblocks
-fencode-extended-block-signature
-fregister-global-dtors-with-atexit
-fgnuc-version=4.2.1
-fcxx-exceptions
-fexceptions
-fmax-type-align=16
-vectorize-loops
-vectorize-slp
-D__GCC_HAVE_DWARF2_CFI_ASM=1
-o
_hoomd_llvm_code.ll
-x
c++
_hoomd_llvm_code.cc

In file included from code.cc:3:
In file included from /opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:33:
In file included from /opt/anaconda3/bin/../include/c++/v1/cmath:317:
In file included from /opt/anaconda3/bin/../include/c++/v1/math.h:316:
/opt/anaconda3/bin/../include/c++/v1/stdlib.h:150:34: error: unknown type name 'ldiv_t'
inline _LIBCPP_INLINE_VISIBILITY ldiv_t div(long __x, long __y) _NOEXCEPT {
                                 ^
/opt/anaconda3/bin/../include/c++/v1/stdlib.h:151:12: error: no member named 'ldiv' in the global namespace
  return ::ldiv(__x, __y);
         ~~^
/opt/anaconda3/bin/../include/c++/v1/stdlib.h:154:34: error: unknown type name 'lldiv_t'
inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x,
                                 ^
/opt/anaconda3/bin/../include/c++/v1/stdlib.h:156:12: error: no member named 'lldiv' in the global namespace
  return ::lldiv(__x, __y);
         ~~^
In file included from code.cc:3:
In file included from /opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:33:
In file included from /opt/anaconda3/bin/../include/c++/v1/cmath:317:
/opt/anaconda3/bin/../include/c++/v1/math.h:388:31: error: use of undeclared identifier 'FP_NAN'
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
                              ^
/opt/anaconda3/bin/../include/c++/v1/math.h:388:39: error: use of undeclared identifier 'FP_INFINITE'
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
                                      ^
/opt/anaconda3/bin/../include/c++/v1/math.h:388:52: error: use of undeclared identifier 'FP_NORMAL'
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
                                                   ^
/opt/anaconda3/bin/../include/c++/v1/math.h:388:63: error: use of undeclared identifier 'FP_SUBNORMAL'
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
                                                              ^
/opt/anaconda3/bin/../include/c++/v1/math.h:388:77: error: use of undeclared identifier 'FP_ZERO'
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
                                                                            ^
/opt/anaconda3/bin/../include/c++/v1/math.h:393:21: error: use of undeclared identifier 'FP_ZERO'
  return __x == 0 ? FP_ZERO : FP_NORMAL;
                    ^
/opt/anaconda3/bin/../include/c++/v1/math.h:393:31: error: use of undeclared identifier 'FP_NORMAL'
  return __x == 0 ? FP_ZERO : FP_NORMAL;
                              ^
In file included from code.cc:3:
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:249:21: error: no member named 'sqrtf' in the global namespace; did you mean 'sqrt'?
    return 1.0f / ::sqrtf(x);
                  ~~^~~~~
                    sqrt
/opt/anaconda3/bin/../include/c++/v1/math.h:929:42: note: 'sqrt' declared here
inline _LIBCPP_HIDE_FROM_ABI float       sqrt(float __x) _NOEXCEPT       {return __builtin_sqrtf(__x);}
                                         ^
In file included from code.cc:3:
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:269:14: error: no member named 'sinf' in the global namespace
    return ::sinf(x);
           ~~^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:285:14: error: no member named 'cosf' in the global namespace
    return ::cosf(x);
           ~~^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:299:5: error: use of undeclared identifier '__sincosf'; did you mean 'sincos'?
    __sincosf(x, &s, &c);
    ^~~~~~~~~
    sincos
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:296:24: note: 'sincos' declared here
inline HOSTDEVICE void sincos(float x, float& s, float& c)
                       ^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:299:18: error: non-const lvalue reference to type 'float' cannot bind to a temporary of type 'float *'
    __sincosf(x, &s, &c);
                 ^~
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:296:47: note: passing argument to parameter 's' here
inline HOSTDEVICE void sincos(float x, float& s, float& c)
                                              ^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:311:7: error: no member named '__sincos' in the global namespace
    ::__sincos(x, &s, &c);
    ~~^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:323:5: error: use of undeclared identifier '__sincospif'; did you mean 'sincospi'?
    __sincospif(x, &s, &c);
    ^~~~~~~~~~~
    sincospi
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:318:24: note: 'sincospi' declared here
inline HOSTDEVICE void sincospi(float x, float& s, float& c)
                       ^
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:323:20: error: non-const lvalue reference to type 'float' cannot bind to a temporary of type 'float *'
    __sincospif(x, &s, &c);
                   ^~
/opt/anaconda3/lib/python3.11/site-packages/hoomd/include/hoomd/HOOMDMath.h:318:49: note: passing argument to parameter 's' here
inline HOSTDEVICE void sincospi(float x, float& s, float& c)
                                                ^
fatal error: too many errors emitted, stopping now
Error generating code.
20 errors generated.

Can you fix it?

We have been unable to fix it.

joaander commented 5 months ago

Yes, CPPPotential is very fragile and requires many things outside HOOMD-blue itself to function, including a compiler environment and standard library that work together. I am currently in the process of replacing all run time compiled potentials with built-in code. This process will be completed over the next few HOOMD-blue releases.

In 4.6.0 you can achieve the same simulation as this tutorial using hoomd.hpmc.pair.Step and hoomd.hpmc.pair.AngularStep as shown in their example code snippets. As an added bonus, these simulations will run much faster than with CPPPotential.

I will rewrite this tutorial soon.

JonathanH12 commented 5 months ago

Is there a version that would best support CPPPotential? Or is this an error that will effect all Hoomd versions?

joaander commented 5 months ago

These kinds of errors are often the results of system-level library and/or compiler updates.