QMCPACK
e2iphi.h
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Ken Esler, kpesler@gmail.com, University of Illinois at Urbana-Champaign
8 // Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
9 // Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
10 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
11 // Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
12 // Paul R. C. Kent, kentpr@ornl.gov, Oak Ridge National Laboratory
13 //
14 // File created by: Ken Esler, kpesler@gmail.com, University of Illinois at Urbana-Champaign
15 //////////////////////////////////////////////////////////////////////////////////////
16 
17 
18 // Supported libraries and defines:
19 //
20 // HAVE_MKL_VML : Intel MKL VML, include with MKL
21 // HAVE_MASSV : IBM MASSV library
22 
23 #ifndef QMCPLUSPLUS_E2IPHI_H
24 #define QMCPLUSPLUS_E2IPHI_H
25 
26 #include <config.h>
27 #include <vector>
28 #include <complex>
29 #include "CPU/math.hpp"
30 
31 #if defined(HAVE_MASSV)
32 #include <massv.h>
33 inline void eval_e2iphi(int n, double* restrict phi, double* restrict c, double* restrict s) { vsincos(s, c, phi, &n); }
34 inline void eval_e2iphi(int n, float* restrict phi, float* restrict c, float* restrict s) { vssincos(s, c, phi, &n); }
35 
36 inline void eval_e2iphi(int n, double* restrict phi, std::complex<double>* restrict z)
37 {
38  vcosisin((double _Complex*)z, phi, &n);
39 }
40 
41 inline void eval_e2iphi(int n, float* restrict phi, std::complex<float>* restrict z)
42 {
43  vscosisin((float _Complex*)z, phi, &n);
44 }
45 #elif defined(HAVE_MKL_VML)
46 #include <mkl_vml_functions.h>
47 inline void eval_e2iphi(int n, double* restrict phi, double* restrict c, double* restrict s) { vdSinCos(n, phi, s, c); }
48 
49 inline void eval_e2iphi(int n, float* restrict phi, float* restrict c, float* restrict s) { vsSinCos(n, phi, s, c); }
50 inline void eval_e2iphi(int n, const double* restrict phi, std::complex<double>* restrict z)
51 {
52  vzCIS(n, phi, (MKL_Complex16*)(z));
53 }
54 
55 inline void eval_e2iphi(int n, const float* restrict phi, std::complex<float>* restrict z)
56 {
57  vcCIS(n, phi, (MKL_Complex8*)(z));
58 }
59 #else /* generic case */
60 template<typename T>
61 inline void eval_e2iphi(int n, const T* restrict phi, T* restrict phase_r, T* restrict phase_i)
62 {
63  for (int i = 0; i < n; i++)
64  qmcplusplus::sincos(phi[i], phase_i + i, phase_r + i);
65 }
66 template<typename T>
67 inline void eval_e2iphi(int n, const T* restrict phi, std::complex<T>* restrict z)
68 {
69  T s, c;
70  for (int i = 0; i < n; i++)
71  {
72  qmcplusplus::sincos(phi[i], &s, &c);
73  z[i] = std::complex<T>(c, s);
74  }
75 }
76 #endif
77 
78 template<typename T>
79 inline void eval_e2iphi(std::vector<T>& phi, std::vector<std::complex<T>>& z)
80 {
81  eval_e2iphi(phi.size(), &phi[0], &z[0]);
82 }
83 
84 #endif
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62
void eval_e2iphi(int n, const T *restrict phi, T *restrict phase_r, T *restrict phase_i)
Definition: e2iphi.h:61