9 #ifndef __GLAMER__gridmap__
10 #define __GLAMER__gridmap__
16 #include "concave_hull.h"
35 GridMap(
LensHndl lens,
unsigned long N1d,
const double center[2],
double range);
36 GridMap(
LensHndl lens ,
unsigned long Nx ,
const PosType center[2] ,PosType rangeX ,PosType rangeY);
38 GridMap(
unsigned long N1d,
const double center[2],
double range);
76 RAY ray(
size_t index){
return i_points[index];}
78 void ClearSurfaceBrightnesses();
80 size_t getNumberOfPoints()
const {
return Ngrid_init*Ngrid_init2;}
86 double getYRange()
const {
return x_range*axisratio;}
101 ,std::string filename,
bool flipX =
false);
109 ,std::string filename
137 Point_2d getCenter()
const {
return center;}
139 Point * operator[](
size_t i){
return i_points.data() + i;};
143 Ngrid_init = grid.Ngrid_init;
144 Ngrid_init2 = grid.Ngrid_init2;
145 pointID = grid.pointID;
146 axisratio = grid.axisratio;
147 x_range = grid.x_range;
149 std::swap(i_points,grid.i_points);
150 std::swap(s_points,grid.s_points);
152 center = grid.center;
157 Ngrid_init = grid.Ngrid_init;
158 Ngrid_init2 = grid.Ngrid_init2;
159 pointID = grid.pointID;
160 axisratio = grid.axisratio;
161 x_range = grid.x_range;
163 i_points = grid.i_points;
164 s_points = grid.s_points;
166 center = grid.center;
170 Ngrid_init = grid.Ngrid_init;
171 Ngrid_init2 = grid.Ngrid_init2;
172 pointID = grid.pointID;
173 axisratio = grid.axisratio;
174 x_range = grid.x_range;
176 std::swap(i_points,grid.i_points);
177 std::swap(s_points,grid.s_points);
179 center = grid.center;
185 Triangle(
size_t i,
size_t j,
size_t k){
195 Triangle(
const Triangle &tri){
200 Triangle & operator=(
const Triangle &tri){
207 std::vector<long> index = {0,0,0};
208 long & operator[](
int i){
return index[i];}
209 long operator[](
int i)
const {
return index[i];}
212 Rectangle(
size_t i,
size_t j){
220 Rectangle(
const Rectangle &rec){
224 Rectangle & operator=(Rectangle &rec){
230 std::vector<long> index = {0,0};
231 long & operator[](
int i){
return index[i];}
232 long operator[](
int i)
const {
return index[i];}
236 inline bool touch(
const Rectangle &tr1,
const Rectangle &tr2)
const;
239 std::vector<Rectangle> merge_boxes(
240 std::list<Triangle> &triangles
242 std::vector<Rectangle> merge_boxes(
243 std::vector<Triangle> &triangles
256 std::list<RAY>
find_images(std::vector<Point_2d> &ys
257 ,std::vector<int> &multiplicity
267 ,std::vector<Point_2d> &image_points
268 ,std::vector<Triangle> &triangles
281 ,std::vector<bool> &hits_edge
284 size_t N=Ngrid_init*Ngrid_init2;
285 std::vector<Point_2d> source_points(N);
286 for(
size_t i=0 ; i<N ; ++i) source_points[i] = i_points[i];
288 std::vector<int> multiplicities(N);
291 std::vector<bool> bitmap(N,
false);
292 for(
size_t i=0 ; i<N ; ++i){
293 if(multiplicities[i] > 1) bitmap[i] =
true;
296 Utilities::find_boundaries<Point_2d>(bitmap,Ngrid_init,boundaries,hits_edge);
374 void find_crit(std::vector<std::vector<Point_2d> > &points
375 ,std::vector<bool> &hits_boundary
376 ,std::vector<CritType> &crit_type
383 std::vector<std::vector<Point_2d> > &curves
384 ,std::vector<bool> &hits_boundary
395 void border_area(
double &source_area,
double &image_area)
const;
397 int getNx(){
return Ngrid_init;}
398 int getNy(){
return Ngrid_init2;}
403 bool incurve(
long k,std::vector<Point_2d> &curve)
const;
406 std::vector<Point> NewPointArray(
size_t N){
407 std::vector<Point> p(N);
412 void xygridpoints(
Point *points,
double range,
const double *center,
long Ngrid
413 ,
short remove_center);
419 unsigned long pointID;
425 std::vector<Point> i_points;
426 std::vector<Point> s_points;
429 bool to_refine(
long i,
long j,
double total,
double f)
const ;
430 static std::mutex grid_mutex;
432 void _find_images_(
Point_2d *ys,
int *multiplicity,
long Nys,std::list<RAY> &rays)
const;
433 void _find_images2_(
size_t j1
435 ,std::list<Point_2d> &image_points
436 ,std::list<Triangle> &triangles
440 void _magnificationFlux_parallel(
443 ,
double &magnified_flux
444 ,
double &unmagnified_flux
449 void _AddSurfaceBrightnesses_parallel(
457 void limited_image_search(
Point_2d &y
458 ,std::vector<size_t> &cell_numbers
459 ,std::vector<Triangle> &triangles
474 ,x_range/(Ngrid_init-1));
476 size_t n = Ngrid_init*Ngrid_init2;
477 for(
size_t i=0 ; i<n ; ++i){
478 map.data()[map.
find_index(i_points[i].x)] = i_points[i].surface_brightness;
488 map.
Renormalize(map.getResolution()*map.getResolution());
499 if(map.getNx() != Ngrid_init)
throw std::invalid_argument(
"PixelMap does not match GripMap! Use the other GridMap::getPixelMapFlux() to contruct a PixelMap.");
500 if(map.getNy() != Ngrid_init2)
throw std::invalid_argument(
"PixelMap does not match GripMap! Use the other GridMap::getPixelMapFlux() to contruct a PixelMap.");
503 if(map.getCenter()[0] != center[0])
throw std::invalid_argument(
"PixelMap does not match GripMap!");
504 if(map.getCenter()[1] != center[1])
throw std::invalid_argument(
"PixelMap does not match GripMap!");
507 if((map.getResolution()-res) < 1.0e-6*res )
throw std::invalid_argument(
"PixelMap resolution does not match GripMap!");
520 size_t n = Ngrid_init*Ngrid_init2;
521 for(
size_t i=0 ; i<n ; ++i){
523 map.data()[index] = i_points[i].surface_brightness;
527 map.
Renormalize(map.getResolution()*map.getResolution());
539 const PosType center[]
545 if(getNumberOfPoints() == 0 )
return PixelMap<T>();
558 ,std::string filename
569 size_t Nx = Ngrid_init;
570 size_t Ny = Ngrid_init2;
572 PixelMap<T> map( center.x, Nx, Ny,x_range/(Nx-1) );
574 size_t N = map.size();
581 for(
size_t i=0 ; i<N ; ++i){
582 tmp2[0] = i_points[i].x[0] - i_points[i].image->x[0];
583 tmp2[1] = i_points[i].x[1] - i_points[i].image->x[1];
584 map[i] = sqrt(tmp2[0]*tmp2[0] + tmp2[1]*tmp2[1]);
588 for(
size_t i=0 ; i<N ; ++i)
589 map[i] = (i_points[i].x[0] - i_points[i].image->x[0]);
592 for(
size_t i=0 ; i<N ; ++i)
593 map[i] = (i_points[i].x[1] - i_points[i].image->x[1]);
596 for(
size_t i=0 ; i<N ; ++i)
597 map[i] = i_points[i].kappa();
600 for(
size_t i=0 ; i<N ; ++i){
601 tmp2[0] = i_points[i].gamma1();
602 tmp2[1] = i_points[i].gamma2();
603 map[i] = sqrt(tmp2[0]*tmp2[0] + tmp2[1]*tmp2[1]);
607 for(
size_t i=0 ; i<N ; ++i)
608 map[i] = i_points[i].gamma1();
611 for(
size_t i=0 ; i<N ; ++i)
612 map[i] = i_points[i].gamma2();
615 for(
size_t i=0 ; i<N ; ++i)
616 map[i] = i_points[i].gamma3();
619 for(
size_t i=0 ; i<N ; ++i)
620 map[i] = i_points[i].invmag();
623 for(
size_t i=0 ; i<N ; ++i)
624 map[i] = i_points[i].dt;
627 for(
size_t i=0 ; i<N ; ++i)
628 map[i] = i_points[i].surface_brightness;
631 for(
size_t i=0 ; i<N ; ++i){
632 i_points[i].A.eigen_vec(p1,p2,tmp2);
633 if(abs(tmp2[0]) > abs(tmp2[1])){
634 map[i] = atan(p2[1]/p2[0]);
636 map[i] = atan(p1[1]/p1[0]);
642 std::cerr <<
"GridMap::writePixelMapUniform() does not work for the input LensingVariable" << std::endl;
643 throw std::runtime_error(
"GridMap::writePixelMapUniform() does not work for the input LensingVariable");
649 template <
typename T>
656 if(getNumberOfPoints() ==0 )
return;
663 std::vector<std::thread> thr;
666 size_t Npoints = getNumberOfPoints();
667 if(nthreads >= Npoints) nthreads = 1;
668 size_t chunk_size = (Npoints + nthreads - 1) / nthreads;
670 size_t size = chunk_size;
671 for(
int ii = 0; ii < nthreads ;++ii){
672 long start = ii*chunk_size;
673 long end = start + chunk_size;
674 if(end > Npoints) end = Npoints;
675 thr.push_back(std::thread(&GridMap::writePixelMapUniform_<T>,
this,&(i_points[start])
676 ,end-start,&map,lensvar));
678 for(
auto &t : thr) t.join();
681 template <
typename T>
688 for(
size_t i = 0; i< size; ++i){
691 tmp2[0] = points[i].x[0] - points[i].image->x[0];
692 tmp2[1] = points[i].x[1] - points[i].image->x[1];
693 tmp = sqrt(tmp2[0]*tmp2[0] + tmp2[1]*tmp2[1]);
696 tmp = (points[i].x[0] - points[i].image->x[0]);
699 tmp = (points[i].x[1] - points[i].image->x[1]);
702 tmp = points[i].kappa();
705 tmp2[0] = points[i].gamma1();
706 tmp2[1] = points[i].gamma2();
707 tmp = sqrt(tmp2[0]*tmp2[0] + tmp2[1]*tmp2[1]);
710 tmp = points[i].gamma1();
713 tmp = points[i].gamma2();
716 tmp = points[i].gamma3();
719 tmp = points[i].invmag();
725 tmp = points[i].surface_brightness;
728 points[i].A.eigen_vec(p1,p2,tmp2);
729 if(abs(tmp2[0]) > abs(tmp2[1])){
730 tmp = atan(p2[1]/p2[0]);
732 tmp = atan(p1[1]/p1[0]);
737 std::cerr <<
"PixelMap<T>::AddGrid() does not work for the input LensingVariable" << std::endl;
738 throw std::runtime_error(
"PixelMap<T>::AddGrid() does not work for the input LensingVariable");
744 if(index != -1)(*map)[index] = tmp;
748 template <
typename T>
750 const PosType center[]
754 ,std::string filename
764 tag =
".alpha1.fits";
767 tag =
".alpha2.fits";
776 tag =
".gamma1.fits";
779 tag =
".gamma2.fits";
782 tag =
".gamma3.fits";
788 tag =
".invmag.fits";
791 tag =
".surfbright.fits";
794 tag =
".eignangle.fits";
800 PixelMap<T> map = writePixelMapUniform<T>(center,Nx,Ny,lensvar);
804 #endif // defined(__GLAMER__gridmap__)