sharp_make_subset_healpix_geom_info
This commit is contained in:
parent
cf7de6ba70
commit
c3b6277545
2 changed files with 33 additions and 7 deletions
|
@ -34,14 +34,14 @@
|
||||||
#include "sharp_geomhelpers.h"
|
#include "sharp_geomhelpers.h"
|
||||||
#include "c_utils.h"
|
#include "c_utils.h"
|
||||||
#include "ls_fft.h"
|
#include "ls_fft.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
void sharp_make_subset_healpix_geom_info (int nside, int stride, int nrings,
|
||||||
const double *weight, sharp_geom_info **geom_info)
|
const int *rings, const double *weight, sharp_geom_info **geom_info)
|
||||||
{
|
{
|
||||||
const double pi=3.141592653589793238462643383279502884197;
|
const double pi=3.141592653589793238462643383279502884197;
|
||||||
ptrdiff_t npix=(ptrdiff_t)nside*nside*12;
|
ptrdiff_t npix=(ptrdiff_t)nside*nside*12;
|
||||||
ptrdiff_t ncap=2*(ptrdiff_t)nside*(nside-1);
|
ptrdiff_t ncap=2*(ptrdiff_t)nside*(nside-1);
|
||||||
int nrings=4*nside-1;
|
|
||||||
|
|
||||||
double *theta=RALLOC(double,nrings);
|
double *theta=RALLOC(double,nrings);
|
||||||
double *weight_=RALLOC(double,nrings);
|
double *weight_=RALLOC(double,nrings);
|
||||||
|
@ -49,9 +49,10 @@ void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
||||||
double *phi0=RALLOC(double,nrings);
|
double *phi0=RALLOC(double,nrings);
|
||||||
ptrdiff_t *ofs=RALLOC(ptrdiff_t,nrings);
|
ptrdiff_t *ofs=RALLOC(ptrdiff_t,nrings);
|
||||||
int *stride_=RALLOC(int,nrings);
|
int *stride_=RALLOC(int,nrings);
|
||||||
|
ptrdiff_t curofs=0, checkofs; /* checkofs used for assertion introduced when adding rings arg */
|
||||||
for (int m=0; m<nrings; ++m)
|
for (int m=0; m<nrings; ++m)
|
||||||
{
|
{
|
||||||
int ring=m+1;
|
int ring = (rings==NULL)? (m+1) : rings[m];
|
||||||
ptrdiff_t northring = (ring>2*nside) ? 4*nside-ring : ring;
|
ptrdiff_t northring = (ring>2*nside) ? 4*nside-ring : ring;
|
||||||
stride_[m] = stride;
|
stride_[m] = stride;
|
||||||
if (northring < nside)
|
if (northring < nside)
|
||||||
|
@ -59,7 +60,7 @@ void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
||||||
theta[m] = 2*asin(northring/(sqrt(6.)*nside));
|
theta[m] = 2*asin(northring/(sqrt(6.)*nside));
|
||||||
nph[m] = 4*northring;
|
nph[m] = 4*northring;
|
||||||
phi0[m] = pi/nph[m];
|
phi0[m] = pi/nph[m];
|
||||||
ofs[m] = 2*northring*(northring-1)*stride;
|
checkofs = 2*northring*(northring-1)*stride;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -71,14 +72,21 @@ void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
||||||
phi0[m] = 0;
|
phi0[m] = 0;
|
||||||
else
|
else
|
||||||
phi0[m] = pi/nph[m];
|
phi0[m] = pi/nph[m];
|
||||||
ofs[m] = (ncap + (northring-nside)*nph[m])*stride;
|
checkofs = (ncap + (northring-nside)*nph[m])*stride;
|
||||||
|
ofs[m] = curofs;
|
||||||
}
|
}
|
||||||
if (northring != ring) /* southern hemisphere */
|
if (northring != ring) /* southern hemisphere */
|
||||||
{
|
{
|
||||||
theta[m] = pi-theta[m];
|
theta[m] = pi-theta[m];
|
||||||
ofs[m] = (npix - nph[m])*stride - ofs[m];
|
checkofs = (npix - nph[m])*stride - checkofs;
|
||||||
|
ofs[m] = curofs;
|
||||||
}
|
}
|
||||||
weight_[m]=4.*pi/npix*((weight==NULL) ? 1. : weight[northring-1]);
|
weight_[m]=4.*pi/npix*((weight==NULL) ? 1. : weight[northring-1]);
|
||||||
|
if (rings==NULL) {
|
||||||
|
UTIL_ASSERT(curofs==checkofs, "Bug in computing ofs[m]");
|
||||||
|
}
|
||||||
|
ofs[m] = curofs;
|
||||||
|
curofs+=nph[m];
|
||||||
}
|
}
|
||||||
|
|
||||||
sharp_make_geom_info (nrings, nph, ofs, stride_, phi0, theta, weight_,
|
sharp_make_geom_info (nrings, nph, ofs, stride_, phi0, theta, weight_,
|
||||||
|
@ -92,6 +100,12 @@ void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
||||||
DEALLOC(stride_);
|
DEALLOC(stride_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sharp_make_weighted_healpix_geom_info (int nside, int stride,
|
||||||
|
const double *weight, sharp_geom_info **geom_info)
|
||||||
|
{
|
||||||
|
sharp_make_subset_healpix_geom_info(nside, stride, 4 * nside - 1, NULL, weight, geom_info);
|
||||||
|
}
|
||||||
|
|
||||||
static inline double one_minus_x2 (double x)
|
static inline double one_minus_x2 (double x)
|
||||||
{ return (fabs(x)>0.1) ? (1.+x)*(1.-x) : 1.-x*x; }
|
{ return (fabs(x)>0.1) ? (1.+x)*(1.-x) : 1.-x*x; }
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,18 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*! Creates a geometry information describing a HEALPix map with an
|
||||||
|
Nside parameter \a nside. \a weight contains the relative ring
|
||||||
|
weights and must have \a 2*nside entries. The rings array contains
|
||||||
|
the indices of the rings, with 1 being the first ring at the north
|
||||||
|
pole; if NULL then we take them to be sequential. Pass 4 * nside - 1
|
||||||
|
as nrings and NULL to rings to get the full HEALPix grid.
|
||||||
|
\note if \a weight is a null pointer, all weights are assumed to be 1.
|
||||||
|
\note if \a rings is a null pointer, take all rings
|
||||||
|
\ingroup geominfogroup */
|
||||||
|
void sharp_make_subset_healpix_geom_info (int nside, int stride, int nrings,
|
||||||
|
const int *rings, const double *weight, sharp_geom_info **geom_info);
|
||||||
|
|
||||||
/*! Creates a geometry information describing a HEALPix map with an
|
/*! Creates a geometry information describing a HEALPix map with an
|
||||||
Nside parameter \a nside. \a weight contains the relative ring
|
Nside parameter \a nside. \a weight contains the relative ring
|
||||||
weights and must have \a 2*nside entries.
|
weights and must have \a 2*nside entries.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue