wenyan4work / stkfmm Goto Github PK
View Code? Open in Web Editor NEWA C++ library for various Laplace/Stokes kernels
License: Apache License 2.0
A C++ library for various Laplace/Stokes kernels
License: Apache License 2.0
Hello, I am having trouble compiling the master branch of this repo.
I installed the develop branch of pvfmm using cmake as per the instructions. Then I ran:
mkdir build && cd build && cmake ..
which finishes without issue.
Running make, however, results in a lot of errors, the start of the output is:
[ 4%] Building CXX object Lib/CMakeFiles/STKFMM_STATIC.dir/src/FMMData.cpp.o
In file included from /usr/local/include/pvfmm/sctl/slender_element.hpp:224,
from /usr/local/include/pvfmm/sctl.hpp:25,
from /usr/local/include/pvfmm/pvfmm_common.hpp:66,
from /usr/local/include/pvfmm/pvfmm.hpp:13,
from /home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:4,
from /home/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:19,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:4,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /home/user/STKFMM/Lib/src/FMMData.cpp:1:
/usr/local/include/pvfmm/sctl/slender_element.txx: In member function ‘void sctl::ToroidalGreensFn<Real, Nm, Nr, Nt>::Setup(const Kernel&, Real)’:
/usr/local/include/pvfmm/sctl/slender_element.txx:146:29: error: ‘QuadReal’ was not declared in this scope
PrecompToroidalGreensFn<QuadReal>(ker, R0);
^~~~~~~~
/usr/local/include/pvfmm/sctl/slender_element.txx:146:29: note: suggested alternative: ‘Real’
PrecompToroidalGreensFn<QuadReal>(ker, R0);
^~~~~~~~
Real
In file included from /usr/local/include/pvfmm/sctl/slender_element.hpp:224,
from /usr/local/include/pvfmm/sctl.hpp:25,
from /usr/local/include/pvfmm/pvfmm_common.hpp:66,
from /usr/local/include/pvfmm/pvfmm.hpp:13,
from /home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:4,
from /home/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:19,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:4,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /home/user/STKFMM/Lib/src/FMMData.cpp:1:
/usr/local/include/pvfmm/sctl/slender_element.txx: In lambda function:
/usr/local/include/pvfmm/sctl/slender_element.txx:801:21: error: ‘QuadReal’ was not declared in this scope
Vector<Vector<QuadReal>> data;
^~~~~~~~
/usr/local/include/pvfmm/sctl/slender_element.txx:801:21: error: template argument 1 is invalid
/usr/local/include/pvfmm/sctl/slender_element.txx:801:29: error: template argument 1 is invalid
Vector<Vector<QuadReal>> data;
^~
/usr/local/include/pvfmm/sctl/slender_element.txx:802:47: error: no matching function for call to ‘ReadFile<QuadReal>(int&, const char [14])’
ReadFile<QuadReal>(data, "data/log_quad");
Defining SCTL_QUAD_T as double somewhere results in another bunch of different errors, starting with:
[ 4%] Building CXX object Lib/CMakeFiles/STKFMM_STATIC.dir/src/FMMData.cpp.o
In file included from /home/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:19,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:4,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /home/user/STKFMM/Lib/src/FMMData.cpp:1:
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp: In function ‘Vec_t pvfmm::rsqrt_wrapper(Vec_t)’:
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:61:23: error: ‘rsqrt_intrin0’ is not a member of ‘pvfmm’
return pvfmm::rsqrt_intrin0<Vec_t, Real_t>(r2);
^~~~~~~~~~~~~
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:61:42: error: expected primary-expression before ‘,’ token
return pvfmm::rsqrt_intrin0<Vec_t, Real_t>(r2);
^
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:61:50: error: expected primary-expression before ‘>’ token
return pvfmm::rsqrt_intrin0<Vec_t, Real_t>(r2);
^
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:63:23: error: ‘rsqrt_intrin1’ is not a member of ‘pvfmm’
return pvfmm::rsqrt_intrin1<Vec_t, Real_t>(r2);
^~~~~~~~~~~~~
/home/user/STKFMM/Lib/include/STKFMM/stkfmm_helpers.hpp:63:42: error: expected primary-expression before ‘,’ token
return pvfmm::rsqrt_intrin1<Vec_t, Real_t>(r2);
I was able to fix this by adding
#include<intrin_wrapper.hpp>
to the end of pvfmm_common.hpp.
This reduces the error to just this
[ 4%] Building CXX object Lib/CMakeFiles/STKFMM_STATIC.dir/src/FMMData.cpp.o
In file included from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:6,
from /home/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /home/user/STKFMM/Lib/src/FMMData.cpp:1:
/home/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function ‘static const pvfmm::Kernel<T>& pv
fmm::StokesLayerKernel<T>::Vel()’:
/home/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:48:43: error: ‘pvfmm::stokes_vel’ is not a template
static Kernel<T> ker = BuildKernel<T, stokes_vel<T, NEWTON_ITE>>("stokes_vel", 3, std::pair<int, int>(3, 3));
^~~~~~~~~~
make[2]: *** [Lib/CMakeFiles/STKFMM_STATIC.dir/src/FMMData.cpp.o] Error 1
make[1]: *** [Lib/CMakeFiles/STKFMM_STATIC.dir/all] Error 2
make: *** [all] Error 2
I gave up here because if I then go to the pvfmm include folder looking for stokes_vel I get:
$ grep -R stokes_vel *
kernel.txx:struct stokes_vel : public GenericKernel<stokes_vel> {
kernel.txx: static Kernel<T> ker=BuildKernel<T, stokes_vel::Eval<T>, stokes_sym_dip::Eval<T>>("stokes_vel" , 3, std::pair<int,int>(3,3),
Which looks quite different.
Would you help me with this? It seems to me that when the compilation instructions in the stkfmm readme refer to the pvfmm development branch, it must be the develop branch at some past moment in time and it has diverged since?
Maybe I am missing some instructions?
Thanks.
Hey!
When trying to compile the library, I get the following error(s). Any idea on how to fix that? This is with g++ 11.2.0
$ make
Consolidate compiler generated dependencies of target STKFMM_SHARED
[ 4%] Building CXX object Lib/CMakeFiles/STKFMM_SHARED.dir/src/FMMData.cpp.o
In file included from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:7,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:41:40: error: expected template-name before '<' token
41 | struct laplace_p : public GenericKernel<laplace_p> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:41:40: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:41:40: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:67:44: error: expected template-name before '<' token
67 | struct laplace_pgrad : public GenericKernel<laplace_pgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:67:44: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:67:44: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:98:46: error: expected template-name before '<' token
98 | struct laplace_dipolep : public GenericKernel<laplace_dipolep> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:98:46: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:98:46: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:115:50: error: expected template-name before '<' token
115 | struct laplace_dipolepgrad : public GenericKernel<laplace_dipolepgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:115:50: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:115:50: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:138:48: error: expected template-name before '<' token
138 | struct laplace_pgradgrad : public GenericKernel<laplace_pgradgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:138:48: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:138:48: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:168:54: error: expected template-name before '<' token
168 | struct laplace_dipolepgradgrad : public GenericKernel<laplace_dipolepgradgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:168:54: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:168:54: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:202:44: error: expected template-name before '<' token
202 | struct laplace_quadp : public GenericKernel<laplace_quadp> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:202:44: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:202:44: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:234:52: error: expected template-name before '<' token
234 | struct laplace_quadpgradgrad : public GenericKernel<laplace_quadpgradgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:234:52: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:234:52: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::LaplaceLayerKernel<T>::PGrad()':
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:317:35: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
317 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:317:35: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:317:9: error: parse error in template argument list
317 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:317:65: error: qualified-id in declaration before '<' token
317 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:320:64: error: incomplete type 'pvfmm::laplace_pgrad' used in nested name specifier
320 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgrad::Eval<T>, laplace_dipolepgrad::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:320:64: error: incomplete type 'pvfmm::laplace_pgrad' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:320:34: error: parse error in template argument list
320 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgrad::Eval<T>, laplace_dipolepgrad::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:320:98: error: qualified-id in declaration before '<' token
320 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgrad::Eval<T>, laplace_dipolepgrad::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::LaplaceLayerKernel<T>::PGradGrad()':
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:332:35: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
332 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:332:35: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:332:9: error: parse error in template argument list
332 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:332:65: error: qualified-id in declaration before '<' token
332 | BuildKernel<T, laplace_p::Eval<T>, laplace_dipolep::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:335:68: error: incomplete type 'pvfmm::laplace_pgradgrad' used in nested name specifier
335 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgradgrad::Eval<T>, laplace_dipolepgradgrad::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:335:68: error: incomplete type 'pvfmm::laplace_pgradgrad' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:335:34: error: parse error in template argument list
335 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgradgrad::Eval<T>, laplace_dipolepgradgrad::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:335:106: error: qualified-id in declaration before '<' token
335 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_pgradgrad::Eval<T>, laplace_dipolepgradgrad::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::LaplaceLayerKernel<T>::QPGradGrad()':
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:345:59: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
345 | static Kernel<T> lap_pker = BuildKernel<T, laplace_p::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:345:59: error: incomplete type 'pvfmm::laplace_p' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:345:33: error: parse error in template argument list
345 | static Kernel<T> lap_pker = BuildKernel<T, laplace_p::Eval<T>>("laplace", 3, std::pair<int, int>(1, 1));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:346:69: error: incomplete type 'pvfmm::laplace_pgradgrad' used in nested name specifier
346 | static Kernel<T> lap_pggker = BuildKernel<T, laplace_pgradgrad::Eval<T>>("laplace", 3, std::pair<int, int>(1, 10));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:346:69: error: incomplete type 'pvfmm::laplace_pgradgrad' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:346:35: error: parse error in template argument list
346 | static Kernel<T> lap_pggker = BuildKernel<T, laplace_pgradgrad::Eval<T>>("laplace", 3, std::pair<int, int>(1, 10));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:347:64: error: incomplete type 'pvfmm::laplace_quadp' used in nested name specifier
347 | static Kernel<T> lap_qpker = BuildKernel<T, laplace_quadp::Eval<T>>("laplace", 3, std::pair<int, int>(9, 1));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:347:64: error: incomplete type 'pvfmm::laplace_quadp' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:347:34: error: parse error in template argument list
347 | static Kernel<T> lap_qpker = BuildKernel<T, laplace_quadp::Eval<T>>("laplace", 3, std::pair<int, int>(9, 1));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:349:72: error: incomplete type 'pvfmm::laplace_quadpgradgrad' used in nested name specifier
349 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_quadpgradgrad::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:349:72: error: incomplete type 'pvfmm::laplace_quadpgradgrad' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/LaplaceLayerKernel.hpp:349:34: error: parse error in template argument list
349 | static Kernel<T> lap_pgker = BuildKernel<T, laplace_quadpgradgrad::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:8,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp: At global scope:
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:17:36: error: expected template-name before '<' token
17 | struct rpy_u : public GenericKernel<rpy_u> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:17:36: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:17:36: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:52:40: error: expected template-name before '<' token
52 | struct rpy_ulapu : public GenericKernel<rpy_ulapu> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:52:40: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:52:40: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:97:40: error: expected template-name before '<' token
97 | struct stk_ulapu : public GenericKernel<stk_ulapu> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:97:40: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:97:40: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::RPYKernel<T>::ulapu(':
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:139:53: error: incomplete type 'pvfmm::rpy_u' used in nested name specifier
139 | static Kernel<T> gr_ker = BuildKernel<T, rpy_u::Eval<T>>("rpy_u", 3, std::pair<int, int>(4, 3));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:139:53: error: incomplete type 'pvfmm::rpy_u' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:139:31: error: parse error in template argument list
139 | static Kernel<T> gr_ker = BuildKernel<T, rpy_u::Eval<T>>("rpy_u", 3, std::pair<int, int>(4, 3));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:141:60: error: incomplete type 'pvfmm::stk_ulapu' used in nested name specifier
141 | static Kernel<T> glapg_ker = BuildKernel<T, stk_ulapu::Eval<T>>("stk_ulapu", 3, std::pair<int, int>(3, 6));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:141:60: error: incomplete type 'pvfmm::stk_ulapu' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:141:34: error: parse error in template argument list
141 | static Kernel<T> glapg_ker = BuildKernel<T, stk_ulapu::Eval<T>>("stk_ulapu", 3, std::pair<int, int>(3, 6));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:143:62: error: incomplete type 'pvfmm::rpy_ulapu' used in nested name specifier
143 | static Kernel<T> grlapgr_ker = BuildKernel<T, rpy_ulapu::Eval<T>>("rpy_ulapu", 3, std::pair<int, int>(4, 6),
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:143:62: error: incomplete type 'pvfmm::rpy_ulapu' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/RPYKernel.hpp:143:36: error: parse error in template argument list
143 | static Kernel<T> grlapgr_ker = BuildKernel<T, rpy_ulapu::Eval<T>>("rpy_ulapu", 3, std::pair<int, int>(4, 6),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:14,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:9,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp: At global scope:
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:25:48: error: expected template-name before '<' token
25 | struct stokes_doublepvel : public GenericKernel<stokes_doublepvel> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:25:48: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:25:48: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:64:52: error: expected template-name before '<' token
64 | struct stokes_doublepvelgrad : public GenericKernel<stokes_doublepvelgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:64:52: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:64:52: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:150:53: error: expected template-name before '<' token
150 | struct stokes_doublelaplacian : public GenericKernel<stokes_doublelaplacian> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:150:53: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:150:53: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:213:52: error: expected template-name before '<' token
213 | struct stokes_doubletraction : public GenericKernel<stokes_doubletraction> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:213:52: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesDoubleLayerKernel.hpp:213:52: error: expected unqualified-id before '<' token
In file included from /Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:15,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:9,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:27:42: error: expected template-name before '<' token
27 | struct stokes_pvel : public GenericKernel<stokes_pvel> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:27:42: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:27:42: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:54:46: error: expected template-name before '<' token
54 | struct stokes_pvelgrad : public GenericKernel<stokes_pvelgrad> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:54:46: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:54:46: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:118:51: error: expected template-name before '<' token
118 | struct stokes_pvellaplacian : public GenericKernel<stokes_pvellaplacian> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:118:51: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:118:51: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:162:46: error: expected template-name before '<' token
162 | struct stokes_traction : public GenericKernel<stokes_traction> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:162:46: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesSingleLayerKernel.hpp:162:46: error: expected unqualified-id before '<' token
In file included from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:9,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesLayerKernel<T>::Vel()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:40:28: error: parse error in template argument list
40 | static Kernel<T> ker = BuildKernel<T, stokes_vel::Eval<T>>("stokes_vel", 3, std::pair<int, int>(3, 3));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesLayerKernel<T>::PVel()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:46:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
46 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:46:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:46:36: error: parse error in template argument list
46 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:46:96: error: qualified-id in declaration before '<' token
46 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesLayerKernel<T>::PVelGrad()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:54:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
54 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:54:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:54:36: error: parse error in template argument list
54 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:54:96: error: qualified-id in declaration before '<' token
54 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:57:69: error: incomplete type 'pvfmm::stokes_pvelgrad' used in nested name specifier
57 | static Kernel<T> stokes_pgker = BuildKernel<T, stokes_pvelgrad::Eval<T>, stokes_doublepvelgrad::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:57:69: error: incomplete type 'pvfmm::stokes_pvelgrad' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:57:37: error: parse error in template argument list
57 | static Kernel<T> stokes_pgker = BuildKernel<T, stokes_pvelgrad::Eval<T>, stokes_doublepvelgrad::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:57:105: error: qualified-id in declaration before '<' token
57 | static Kernel<T> stokes_pgker = BuildKernel<T, stokes_pvelgrad::Eval<T>, stokes_doublepvelgrad::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesLayerKernel<T>::PVelLaplacian()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:66:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
66 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:66:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:66:36: error: parse error in template argument list
66 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:66:96: error: qualified-id in declaration before '<' token
66 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:70:46: error: incomplete type 'pvfmm::stokes_pvellaplacian' used in nested name specifier
70 | BuildKernel<T, stokes_pvellaplacian::Eval<T>, stokes_doublelaplacian::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:70:46: error: incomplete type 'pvfmm::stokes_pvellaplacian' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:70:9: error: parse error in template argument list
70 | BuildKernel<T, stokes_pvellaplacian::Eval<T>, stokes_doublelaplacian::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:70:83: error: qualified-id in declaration before '<' token
70 | BuildKernel<T, stokes_pvellaplacian::Eval<T>, stokes_doublelaplacian::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesLayerKernel<T>::Traction()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:79:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
79 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:79:64: error: incomplete type 'pvfmm::stokes_pvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:79:36: error: parse error in template argument list
79 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:79:96: error: qualified-id in declaration before '<' token
79 | static Kernel<T> stokes_pker = BuildKernel<T, stokes_pvel::Eval<T>, stokes_doublepvel::Eval<T>>(
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:83:41: error: incomplete type 'pvfmm::stokes_traction' used in nested name specifier
83 | BuildKernel<T, stokes_traction::Eval<T>, stokes_doubletraction::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:83:41: error: incomplete type 'pvfmm::stokes_traction' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:83:9: error: parse error in template argument list
83 | BuildKernel<T, stokes_traction::Eval<T>, stokes_doubletraction::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesLayerKernel.hpp:83:77: error: qualified-id in declaration before '<' token
83 | BuildKernel<T, stokes_traction::Eval<T>, stokes_doubletraction::Eval<T>>(
| ^
In file included from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_common.hpp:10,
from /Users/user/STKFMM/Lib/include/STKFMM/STKFMM_impl.hpp:4,
from /Users/user/STKFMM/Lib/src/FMMData.cpp:1:
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp: At global scope:
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:17:44: error: expected template-name before '<' token
17 | struct stokes_regvel : public GenericKernel<stokes_regvel> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:17:44: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:17:44: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:48:46: error: expected template-name before '<' token
48 | struct stokes_regftvel : public GenericKernel<stokes_regftvel> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:48:46: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:48:46: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:96:51: error: expected template-name before '<' token
96 | struct stokes_regftvelomega : public GenericKernel<stokes_regftvelomega> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:96:51: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:96:51: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:158:46: error: expected template-name before '<' token
158 | struct stokes_velomega : public GenericKernel<stokes_velomega> {
| ^
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:158:46: error: expected '{' before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:158:46: error: expected unqualified-id before '<' token
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesRegKernel<T>::Vel()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:214:39: error: incomplete type 'pvfmm::stokes_regvel' used in nested name specifier
214 | BuildKernel<T, stokes_regvel::Eval<T>>("stokes_regvel", 3, std::pair<int, int>(4, 3), NULL, NULL, NULL,
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:214:39: error: incomplete type 'pvfmm::stokes_regvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:214:9: error: parse error in template argument list
214 | BuildKernel<T, stokes_regvel::Eval<T>>("stokes_regvel", 3, std::pair<int, int>(4, 3), NULL, NULL, NULL,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp: In static member function 'static const pvfmm::Kernel<T>& pvfmm::StokesRegKernel<T>::FTVelOmega()':
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:224:41: error: incomplete type 'pvfmm::stokes_velomega' used in nested name specifier
224 | BuildKernel<T, stokes_velomega::Eval<T>>("stokes_velomega", 3, std::pair<int, int>(3, 6));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:224:41: error: incomplete type 'pvfmm::stokes_velomega' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:224:9: error: parse error in template argument list
224 | BuildKernel<T, stokes_velomega::Eval<T>>("stokes_velomega", 3, std::pair<int, int>(3, 6));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:226:41: error: incomplete type 'pvfmm::stokes_regftvel' used in nested name specifier
226 | BuildKernel<T, stokes_regftvel::Eval<T>>("stokes_regftvel", 3, std::pair<int, int>(7, 3));
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:226:41: error: incomplete type 'pvfmm::stokes_regftvel' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:226:9: error: parse error in template argument list
226 | BuildKernel<T, stokes_regftvel::Eval<T>>("stokes_regftvel", 3, std::pair<int, int>(7, 3));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:227:69: error: incomplete type 'pvfmm::stokes_regftvelomega' used in nested name specifier
227 | static Kernel<T> s2t_ker = BuildKernel<T, stokes_regftvelomega::Eval<T>>(
| ^~~~
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:227:69: error: incomplete type 'pvfmm::stokes_regftvelomega' used in nested name specifier
/Users/user/STKFMM/Lib/include/STKFMM/StokesRegSingleLayerKernel.hpp:227:32: error: parse error in template argument list
227 | static Kernel<T> s2t_ker = BuildKernel<T, stokes_regftvelomega::Eval<T>>(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [Lib/CMakeFiles/STKFMM_SHARED.dir/src/FMMData.cpp.o] Error 1
make[1]: *** [Lib/CMakeFiles/STKFMM_SHARED.dir/all] Error 2
make: *** [all] Error 2
rpy_test.py
is calling member methods that don't exist. Some of these can be fixed by switching from camel case to snake case.
Line 86 in 53603c4
Some unnecessary copying is being done in StkWallFMM::setupTree
to an unused treeCoord
variable.
Line 90 in 53603c4
FMMData::readM2LMat
expects M2L data to be in a certain format. Mixing debug output in the M2L module (e.g., in the 3D-3D Laplace) and precomputed data can lead to unexpected bugs. I recommend either sending debug to std::cerr
or writing data files (rather than streaming). There is also some commented-out debug code that should be removed.
STKFMM/M2L/Laplace/Laplace3D3D.cpp
Line 368 in 53603c4
There are conditionals in Test.cpp
that determine the point distribution. Zero leads to one scenario. One, two, and four to another. This logic could use comments.
Line 186 in 53603c4
Please add usage notes and error messages to the SVD test program. When executed without any arguments, it segfaults.
Line 104 in 53603c4
See details here. I couldn't make an issue on your fork of PVFMM directly, so here seems like the next best place. Fix is small.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.