32 #ifndef PLANCK_SHARP_CXX_H 33 #define PLANCK_SHARP_CXX_H 43 sharp_alm_info *ainfo;
44 sharp_geom_info *ginfo;
48 : ainfo(0), ginfo(0) {}
55 void set_general_geometry (
int nrings,
const int *nph,
const ptrdiff_t *ofs,
56 const int *stride,
const double *phi0,
const double *theta,
63 void set_ECP_geometry (
int nrings,
int nphi)
66 sharp_make_ecp_geom_info (nrings, nphi, 0., 1, nphi, &ginfo);
69 void set_Gauss_geometry (
int nrings,
int nphi)
75 void set_Healpix_geometry (
int nside)
78 sharp_make_healpix_geom_info (nside, 1, &ginfo);
81 void set_weighted_Healpix_geometry (
int nside,
const double *weight)
87 void set_triangular_alm_info (
int lmax,
int mmax)
93 const sharp_geom_info* get_geom_info()
const {
return ginfo; }
94 const sharp_alm_info* get_alm_info()
const {
return ainfo; }
97 template<
typename T>
struct cxxjobhelper__ {};
99 template<>
struct cxxjobhelper__<double>
102 template<>
struct cxxjobhelper__<float>
106 template<
typename T>
class sharp_cxxjob:
public sharp_base
109 static void *conv (T *ptr)
110 {
return reinterpret_cast<void *
>(ptr); }
111 static void *conv (std::complex<T> *ptr)
112 {
return reinterpret_cast<void *
>(ptr); }
113 static void *conv (
const T *ptr)
114 {
return const_cast<void *
>(
reinterpret_cast<const void *
>(ptr)); }
115 static void *conv (
const std::complex<T> *ptr)
116 {
return const_cast<void *
>(
reinterpret_cast<const void *
>(ptr)); }
119 void alm2map (
const T *alm, T *map,
bool add)
const 121 void *aptr=conv(alm), *mptr=conv(map);
122 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
126 void alm2map (
const std::complex<T> *alm, T *map,
bool add)
const 128 void *aptr=conv(alm), *mptr=conv(map);
129 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
133 void alm2map_spin (
const T *alm1,
const T *alm2,
134 T *map1, T *map2,
int spin,
bool add)
const 136 void *aptr[2], *mptr[2];
137 aptr[0]=conv(alm1); aptr[1]=conv(alm2);
138 mptr[0]=conv(map1); mptr[1]=conv(map2);
139 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
142 void alm2map_spin (
const std::complex<T> *alm1,
const std::complex<T> *alm2,
143 T *map1, T *map2,
int spin,
bool add)
const 145 void *aptr[2], *mptr[2];
146 aptr[0]=conv(alm1); aptr[1]=conv(alm2);
147 mptr[0]=conv(map1); mptr[1]=conv(map2);
148 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
151 void alm2map_der1 (
const T *alm, T *map1, T *map2,
bool add)
const 153 void *aptr=conv(alm), *mptr[2];
154 mptr[0]=conv(map1); mptr[1]=conv(map2);
155 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
158 void alm2map_der1 (
const std::complex<T> *alm, T *map1, T *map2,
bool add)
161 void *aptr=conv(alm), *mptr[2];
162 mptr[0]=conv(map1); mptr[1]=conv(map2);
163 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
166 void alm2map_adjoint (
const T *map, T *alm,
bool add)
const 168 void *aptr=conv(alm), *mptr=conv(map);
169 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
172 void alm2map_adjoint (
const T *map, std::complex<T> *alm,
bool add)
const 174 void *aptr=conv(alm), *mptr=conv(map);
175 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
178 void alm2map_spin_adjoint (
const T *map1,
const T *map2, T *alm1, T *alm2,
179 int spin,
bool add)
const 181 void *aptr[2], *mptr[2];
182 aptr[0]=conv(alm1); aptr[1]=conv(alm2);
183 mptr[0]=conv(map1); mptr[1]=conv(map2);
184 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
187 void alm2map_spin_adjoint (
const T *map1,
const T *map2,
188 std::complex<T> *alm1, std::complex<T> *alm2,
int spin,
bool add)
const 190 alm2map_spin_adjoint (map1, map2, reinterpret_cast<T *>(alm1),
191 reinterpret_cast<T *>(alm2), spin, add);
193 void map2alm (
const T *map, T *alm,
bool add)
const 195 void *aptr=conv(alm), *mptr=conv(map);
196 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
199 void map2alm (
const T *map, std::complex<T> *alm,
bool add)
const 201 void *aptr=conv(alm), *mptr=conv(map);
202 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
205 void map2alm_spin (
const T *map1,
const T *map2, T *alm1, T *alm2,
206 int spin,
bool add)
const 208 void *aptr[2], *mptr[2];
209 aptr[0]=conv(alm1); aptr[1]=conv(alm2);
210 mptr[0]=conv(map1); mptr[1]=conv(map2);
211 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
214 void map2alm_spin (
const T *map1,
const T *map2, std::complex<T> *alm1,
215 std::complex<T> *alm2,
int spin,
bool add)
const 217 void *aptr[2], *mptr[2];
218 aptr[0]=conv(alm1); aptr[1]=conv(alm2);
219 mptr[0]=conv(map1); mptr[1]=conv(map2);
220 int flags=cxxjobhelper__<T>::val | (add ?
SHARP_ADD : 0);
void sharp_execute(sharp_jobtype type, int spin, void *alm, void *map, const sharp_geom_info *geom_info, const sharp_alm_info *alm_info, int ntrans, int flags, double *time, unsigned long long *opcnt)
void sharp_destroy_geom_info(sharp_geom_info *geom_info)
void sharp_make_triangular_alm_info(int lmax, int mmax, int stride, sharp_alm_info **alm_info)
void sharp_destroy_alm_info(sharp_alm_info *info)
void sharp_make_geom_info(int nrings, const int *nph, const ptrdiff_t *ofs, const int *stride, const double *phi0, const double *theta, const double *wgt, sharp_geom_info **geom_info)
void sharp_make_gauss_geom_info(int nrings, int nphi, double phi0, int stride_lon, int stride_lat, sharp_geom_info **geom_info)
void sharp_make_weighted_healpix_geom_info(int nside, int stride, const double *weight, sharp_geom_info **geom_info)