diff --git a/src/chi_computation.cpp b/src/chi_computation.cpp
index 617b325..9ec9701 100644
--- a/src/chi_computation.cpp
+++ b/src/chi_computation.cpp
@@ -1,195 +1,209 @@
 //
 #include <string.h>
 #include "structure_hpc.hpp"
 #include "delense_CPU_utils.hpp"
 #ifdef __WITH_MPI
 #include <mpi.h>
 #include "mpi_check.h"
 #endif
+#define MAX(a,b) (((a)>(b))?(a):(b))
 
 void
-chi_computation(double* chi, int* images_found, int* numimagesfound, struct point* imagesposition, const int *nimages_strongLensing, const galaxy* images, const int nsets)
+chi_computation(double* chi, int* images_found, int* numimagesfound, struct point* imagesposition, const int MAXIMPERSOURCE, const int *nimages_strongLensing, const galaxy* images, const int nsets)
 {
+        /*
+	int MAXIMPERSOURCE;
+        int numImages = 0;
+        int maxImagesPerSource = 0;
+        for( int source_id = 0; source_id < nsets; source_id ++)
+        {
+                numImages += nimages_strongLensing[source_id];
+                maxImagesPerSource = MAX(nimages_strongLensing[source_id], maxImagesPerSource);
+        }
+        MAXIMPERSOURCE = maxImagesPerSource;
+	*/
 	int    nimagesfound  [nsets][MAXIMPERSOURCE]; // number of images found from the theoretical sources
 	struct point tim     [MAXIMPERSOURCE]; // theoretical images (computed from sources)
 	int    index = 0;
 	//
 	for( int  source_id = 0; source_id < nsets; source_id ++)
 	{
 		unsigned short int nimages = nimages_strongLensing[source_id];
 		//
 		//______________________Initialisation______________________
 		//
 		//for (unsigned short int i = 0; i < nimages; ++i)
 		//	nimagesfound[source_id][i] = 0;
 		memset(&nimagesfound[source_id][0], 0, nimages*sizeof(int));  
 		//
 		//for( unsigned short int image_id = 0; image_id < nimages; image_id++)
 		//{
 		//#endif //collapsing
 		//
 		double image_dist[MAXIMPERSOURCE];
 		//
 		//printf("      Source %d, number of images found %d\n", source_id, numimagesfound[source_id]);
 		//
 		struct point image_position;
 		int          image_index;
 		//
 		for (int ii = 0; ii < /*loc*/numimagesfound[source_id]; ++ii)
 		{
 			//
 			//
 			int image_index = 0;
 			//
 			image_position = imagesposition[source_id*MAXIMPERSOURCE + ii];
-			image_dist[0] = mychi_dist(image_position, images[index + 0].center);  // get the distance to the real image
+			image_dist[0]  = mychi_dist(image_position, images[index + 0].center);  // get the distance to the real image
+			//@@printf("\nsource = %d n images found = %d, n images = %d,\n  --> pos x y = %f %f\n", source_id, numimagesfound[source_id], nimages_strongLensing[source_id], image_position.x, image_position.y); fflush(stdout);
+			//@@	printf("	ix iy = %f %f, dist = %f\n",  images[index].center.x, images[index].center.y, mychi_dist(image_position, images[index].center));
 			for(int i = 1; i < nimages_strongLensing[source_id]; i++)
-			{  // get the distance to each real image and keep the index of the closest real image
-
+			{  
+				// get the distance to each real image and keep the index of the closest real image
 				image_dist[i] = mychi_dist(image_position, images[index + i].center);
+				//@@printf("	ix iy = %f %f, dist = %f\n",  images[index+i].center.x, images[index+i].center.y, image_dist[i]);
 				if (image_dist[i] < image_dist[image_index])
 				{
 					image_index = i;
 				}
 			}
+			//@@printf("	--> image_index = %d\n", image_index); fflush(stdout);
 			//
 			// we should exit loops here
 			//
 			// p1_time += myseconds();
 			//
 			int skip_image = 0;
 			// Sometimes due to the numerical errors at the centerpoint,
 			// for SIE potentials an additional image will appear at the center of the Potential.
 			// This is due to the fact that it is not possible to simulate an infinity value
 			// at the center correctly, Check that sis correspond to Nlens[0]
 			/*
-			   for (int iterator = 0; iterator < runmode->Nlens[0]; ++iterator)
-			   {
-			   if ( fabs(image_position.x - lens[0].position_x[iterator]) <= dx/2. and fabs(image_position.y  - lens[0].position_y[iterator]) <= dx/2.)
-			   {
-			   skip_image = 1;
-			   printf("WARNING: You are using SIE potentials. An image to close to one of the potential centers has been classified as numerical error and removed \n");
-			   }
-			   }*/
+			for (int iterator = 0; iterator < runmode->Nlens[0]; ++iterator)
+			{
+				if ( fabs(image_position.x - lens[0].position_x[iterator]) <= dx/2. and fabs(image_position.y  - lens[0].position_y[iterator]) <= dx/2.)
+				{
+					skip_image = 1;
+					printf("WARNING: You are using SIE potentials. An image to close to one of the potential centers has been classified as numerical error and removed \n");
+				}
+			}*/
 			//printf("%d %d %d %d\n", x_id, y_id,thread_found_image, skip_image);
 			if (!skip_image)
 			{
 				//#pragma omp atomic
 				(*images_found)++;
 				struct point temp;
 				//printf("                        source %d, image %d, index %d, Images found: %d\n", source_id, image_id, image_index, nimagesfound[source_id][image_id][image_index]);
 				//checking whether a closest image has already been found
 				if (nimagesfound[source_id][image_index] == 0)
 				{ // if no image found up to now
 
 					//image position is allocated to theoretical image
 					//#pragma omp critical
 					tim[image_index] = image_position;
 					//#pragma omp atomic
 					nimagesfound[source_id][image_index]++;
 				}
 				else if (nimagesfound[source_id][image_index] > 0)
 				{ // if we have already found an image
 					// If the new image we found is closer than the previous image
-					//printf("      tim2: %f %f\n", image_dist[image_index], mychi_dist(images[index + image_index].center, tim[image_id][image_index]));
+					//printf("      tim2: %f %f\n", image_dist[image_index], mychi_dist(images[index + image_index].center, tim[image_index]));
 					if (image_dist[image_index] < mychi_dist(images[index + image_index].center, tim[image_index]))
 					{
 						temp = tim[image_index]; // we store the position of the old image in temp
 						//#pragma omp critical
 						tim[image_index] = image_position; // we link the observed image with the image we just found
 						//printf("tim2 %d %d = %f %f\n", image_id, image_index, image_position.x, image_position.y);
 					}
 					else
 					{
 						temp = image_position; // we store the position of the image we just found in temp
 					}
 					// initialising second_closest_id to the highest value
 					// Loop over all images in the set except the closest one
 					// and initialize to the furthest away image
 					int second_closest_id = 0;
 					for (int i = 1; i < nimages_strongLensing[source_id] && (i != image_index); i++)
 					{
 						if(image_dist[i] > image_dist[second_closest_id]) second_closest_id=i;
 					}
 					///////////////////////////////////////////////////////////////
 					// Loop over all images in the set that are not yet allocated to a theoretical image
 					// and allocate the closest one
 					// we search for an observed image not already linked (nimagesfound=0)
 					for(int i = 0; i < nimages_strongLensing[source_id] && nimagesfound[source_id][i] == 0; i++)
 					{
 						if(image_dist[i] < image_dist[second_closest_id])
 						{
 							second_closest_id = i;
 							// im_index value changes only if we found a not linked yet image
 							image_index = i;
-							//printf("tim3 %d %d = %f %f\n", image_id, image_index, temp.x, temp.y);
 							//#pragma omp critical
 							tim[image_index] = temp; // if we found an observed and not already linked image, we allocate the theoretical image temp
 						}
 					}
 					// increasing the total number of images found (If we find more than 1 theoretical image linked to 1 real image,
 					// these theoretical
 					//#pragma omp atomic
 					nimagesfound[source_id][image_index]++;
 					// images are included in this number)
 				}
 			}
 			//#pragma omp atomic
 			//loc_images_found++;
 			//thread_found_image  = 0; // for next iteration
 		}
 		//
 		//}
 		//#pragma omp barrier
 		//____________________________ end of image loop
 		//
 		//____________________________ computing the local chi square
 		//
 		double chiimage;
 		//
 		int _nimages = nimages_strongLensing[source_id];
 		//
 		for( int iter = 0; iter < _nimages; iter++)
 		{
 			int i = iter;
 			//int i=iter/nimages_strongLensing[source_id];
 			//int j=iter%nimages_strongLensing[source_id];
 
-			//printf("nimagesfound %d %d = %d\n", i, j, nimagesfound[i][j]);
 			//if(i != j)
 			//{
 			if(nimagesfound[source_id][i] > 0)
 			{
 				double pow1 = images[index + i].center.x - tim[i].x;
 				double pow2 = images[index + i].center.y - tim[i].y;
 				//
 				//chiimage = pow(images[index + j].center.x - tim[i][j].x, 2) + pow(images[index + j].center.y - tim[i][j].y, 2);  // compute the chi2
 				chiimage = pow1*pow1 + pow2*pow2;  // compute the chi2
 				//printf("%d %d = %.15f\n", i, j, chiimage);
 				(*chi)    += chiimage;
 			}
 			else
-				if(nimagesfound[source_id][i] == 0)
+				//if(nimagesfound[source_id][i] == 0)
 				{
 					// If we do not find a correpsonding image, we add a big value to the chi2 to disfavor the model
 					(*chi) += 1000.*nimages_strongLensing[source_id];
-					//printf("        source_id = %d, image number = %d has not found an image, chi = %f\n", source_id, i, *chi);
+					printf("		source_id = %d, image number = %d has not found an image, chi = %f\n", source_id, i, *chi);
 				}
 			//}
 		}
 		//
 		//____________________________ end of computing the local chi square
 		//
 		//printf("%d: chi = %.15f\n", source_id, *chi);
 		/*
 		   for (int i=0; i < nimages_strongLensing[source_id]; ++i){
 		   for (int j=0; j < nimages_strongLensing[source_id]; ++j){
 		   printf(" %d",nimagesfound[i][j]);
 		   }
 		   printf("\n");
 		   }*/
 
 		//Incrementing Index: Images already treated by previous source_id
 		index += nimages_strongLensing[source_id];
 	}
 }
diff --git a/src/chi_computation.hpp b/src/chi_computation.hpp
index a341987..a318f2b 100644
--- a/src/chi_computation.hpp
+++ b/src/chi_computation.hpp
@@ -1,4 +1,4 @@
 #pragma once
 
 void
-chi_computation(double* chi, int* images_found, int* numimagesfound, struct point* imagesposition, const int *nimages_strongLensing, const galaxy* images, const int nsets);
+chi_computation(double* chi, int* images_found, int* numimagesfound, struct point* imagesposition, const int MAXIMPERSOURCE, const int *nimages_strongLensing, const galaxy* images, const int nsets);