Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-10 07:50:27

0001 #pragma once
0002 /**
0003 tcomplex.h
0004 =============
0005 
0006 Based on Yuxiangs implementation following ROOT TComplex.h
0007 https://root.cern.ch/doc/master/TComplex_8h_source.html
0008 
0009 **/
0010 
0011 #if defined(__CUDACC__) || defined(__CUDABE__)
0012    #define TCOMPLEX_METHOD __host__ __device__
0013 #else
0014    #define TCOMPLEX_METHOD 
0015 #endif 
0016 
0017 
0018 #include <cuComplex.h>
0019 
0020 struct tcomplex
0021 {
0022     static TCOMPLEX_METHOD cuFloatComplex cuSqrtf( const cuFloatComplex& a) ; 
0023     static TCOMPLEX_METHOD cuFloatComplex make_cuFloatComplex_polar(float radius , float theta) ; 
0024     static TCOMPLEX_METHOD float          cuRhof(  const cuFloatComplex& a) ; 
0025     static TCOMPLEX_METHOD float          cuThetaf(const cuFloatComplex& a) ; 
0026 };
0027 
0028 inline TCOMPLEX_METHOD cuFloatComplex tcomplex::make_cuFloatComplex_polar(float radius , float theta)
0029 {
0030     return make_cuFloatComplex(fabsf(radius)*cosf(theta), fabsf(radius)*sinf(theta));
0031 }
0032 inline TCOMPLEX_METHOD float tcomplex::cuRhof(const cuFloatComplex& a)
0033 {
0034     return sqrtf( a.x*a.x + a.y*a.y ) ;
0035 }
0036 inline TCOMPLEX_METHOD float tcomplex::cuThetaf(const cuFloatComplex& a)
0037 {
0038     return (a.x||a.y) ? atan2f(a.y,a.x):0.f ;
0039 }
0040 inline TCOMPLEX_METHOD cuFloatComplex tcomplex::cuSqrtf(const cuFloatComplex& a)
0041 {
0042     return make_cuFloatComplex_polar( sqrtf(cuRhof(a)) , 0.5f*cuThetaf(a) ); 
0043 }
0044 
0045