From 4bddc68ec809bc3410f122240bf8d1bb45034594 Mon Sep 17 00:00:00 2001
From: Luca Tornatore <gattoclochard@gmail.com>
Date: Fri, 4 Mar 2022 15:40:53 +0100
Subject: [PATCH] just maquillage

---
 gridding.c | 112 +++++++++++++++++++++++++----------------------------
 1 file changed, 53 insertions(+), 59 deletions(-)

diff --git a/gridding.c b/gridding.c
index f4769f9..f59bc44 100644
--- a/gridding.c
+++ b/gridding.c
@@ -130,31 +130,23 @@ void gridding_data(){
     double resolution_asec = (3600.0*180.0)/MAX(abs(metaData.uvmin),abs(metaData.uvmax))/PI;
     printf("RESOLUTION = %f rad, %f arcsec\n", resolution, resolution_asec);
 
-    // Declare temporary arrays for the masking
-    double * uus;
-    double * vvs;
-    double * wws;
-    float * visreals;
-    float * visimgs;
-    float * weightss;
-    long isector;
-    for (long isector_count=0; isector_count<nsectors; isector_count++)
+    for (long isector = 0; isector < nsectors; isector++)
     {
         clock_gettime(CLOCK_MONOTONIC, &begink);
         startk = clock();
         // define local destination sector
-        //isector = (isector_count+rank)%size;
-        isector = isector_count;
+        //isector = (isector_count+rank)%size;  // this line must be wrong! [LT]
+
         // allocate sector arrays 
-        long Nsec = histo_send[isector];
-        uus = (double*) malloc(Nsec*sizeof(double));
-        vvs = (double*) malloc(Nsec*sizeof(double));
-        wws = (double*) malloc(Nsec*sizeof(double));
-        long Nweightss = Nsec*metaData.polarisations;
-        long Nvissec = Nweightss*metaData.freq_per_chan;
-        weightss = (float*) malloc(Nweightss*sizeof(float));
-        visreals = (float*) malloc(Nvissec*sizeof(float));
-        visimgs = (float*) malloc(Nvissec*sizeof(float));
+        long    Nsec       = histo_send[isector];
+        double *uus        = (double*) malloc(Nsec*sizeof(double));
+        double *vvs        = (double*) malloc(Nsec*sizeof(double));
+        double *wws        = (double*) malloc(Nsec*sizeof(double));
+        long    Nweightss  = Nsec*metaData.polarisations;
+        long    Nvissec    = Nweightss*metaData.freq_per_chan;
+        float *weightss    = (float*) malloc(Nweightss*sizeof(float));
+        float *visreals    = (float*) malloc(Nvissec*sizeof(float));
+        float *visimgs     = (float*) malloc(Nvissec*sizeof(float));
        
         // select data for this sector
         long icount = 0;
@@ -173,17 +165,17 @@ void gridding_data(){
               vvs[icount] = data.vv[ilocal]-isector*shift;
               wws[icount] = data.ww[ilocal];
               for (long ipol=0; ipol<metaData.polarisations; ipol++)
-              {
-                     weightss[ip] = data.weights[ilocal*metaData.polarisations+ipol];
-                     ip++;
-              }
+		{
+		  weightss[ip] = data.weights[ilocal*metaData.polarisations+ipol];
+		  ip++;
+		}
               for (long ifreq=0; ifreq<metaData.polarisations*metaData.freq_per_chan; ifreq++)
-              {
-                     visreals[inu] = data.visreal[ilocal*metaData.polarisations*metaData.freq_per_chan+ifreq];
-                     visimgs[inu] = data.visimg[ilocal*metaData.polarisations*metaData.freq_per_chan+ifreq];
+		{
+		  visreals[inu] = data.visreal[ilocal*metaData.polarisations*metaData.freq_per_chan+ifreq];
+		  visimgs[inu] = data.visimg[ilocal*metaData.polarisations*metaData.freq_per_chan+ifreq];
                     //if(visimgs[inu]>1e10 || visimgs[inu]<-1e10)printf("%f %f %ld %ld %d %ld %ld\n",visreals[inu],visimgs[inu],inu,Nvissec,rank,ilocal*metaData.polarisations*metaData.freq_per_chan+ifreq,metaData.Nvis);
                      inu++;
-              }
+		}
               icount++;
               current = current->next;
          }
@@ -195,22 +187,22 @@ void gridding_data(){
          timing.compose_time1 += (finishk.tv_sec - begink.tv_sec);
          timing.compose_time1 += (finishk.tv_nsec - begink.tv_nsec) / 1000000000.0;
 
-         #ifndef USE_MPI
-               double vvmin = 1e20;
-               double uumax = -1e20;
-               double vvmax = -1e20;
-
-               for (long ipart=0; ipart<Nsec; ipart++)
-               {
-                     uumin = MIN(uumin,uus[ipart]);
-                     uumax = MAX(uumax,uus[ipart]);
-                     vvmin = MIN(vvmin,vvs[ipart]);
-                     vvmax = MAX(vvmax,vvs[ipart]);
-
-                    if(ipart%10 == 0)fprintf (file.pFile, "%ld %f %f %f\n",isector,uus[ipart],vvs[ipart]+isector*shift,wws[ipart]);
-              }
-
-              printf("UU, VV, min, max = %f %f %f %f\n", uumin, uumax, vvmin, vvmax);
+	#ifndef USE_MPI
+	 double vvmin = 1e20;
+	 double uumax = -1e20;
+	 double vvmax = -1e20;
+	 
+	 for (long ipart=0; ipart<Nsec; ipart++)
+	   {
+	     uumin = MIN(uumin,uus[ipart]);
+	     uumax = MAX(uumax,uus[ipart]);
+	     vvmin = MIN(vvmin,vvs[ipart]);
+	     vvmax = MAX(vvmax,vvs[ipart]);
+	     
+	     if(ipart%10 == 0)fprintf (file.pFile, "%ld %f %f %f\n",isector,uus[ipart],vvs[ipart]+isector*shift,wws[ipart]);
+	   }
+	 
+	 printf("UU, VV, min, max = %f %f %f %f\n", uumin, uumax, vvmin, vvmax);
         #endif
 
        // Make convolution on the grid
@@ -261,25 +253,27 @@ void gridding_data(){
        //for (long iii=0; iii<2*xaxis*yaxis*num_w_planes; iii++)printf("--> %f\n",gridss[iii]);
     
        #ifndef USE_MPI
-          long stride = isector*2*xaxis*yaxis*num_w_planes;
-          for (long iii=0; iii<2*xaxis*yaxis*num_w_planes; iii++)gridtot[stride+iii] = gridss[iii];
+       long stride = isector*2*xaxis*yaxis*num_w_planes;
+       for (long iii=0; iii<2*xaxis*yaxis*num_w_planes; iii++)
+	 gridtot[stride+iii] = gridss[iii];
        #endif
 
        // Write grid in the corresponding remote slab
-       #ifdef USE_MPI
-          int target_rank = (int)isector;
-          //int target_rank = (int)(size-isector-1);
-          #ifdef ONE_SIDE
-               printf("One Side communication active\n");
-               MPI_Win_lock(MPI_LOCK_SHARED,target_rank,0,slabwin);
-               MPI_Accumulate(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,MPI_SUM,slabwin);
-               MPI_Win_unlock(target_rank,slabwin);
-               //MPI_Put(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,slabwin);
-          #else
-               MPI_Reduce(gridss,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,MPI_COMM_WORLD);
-          #endif //ONE_SIDE
-       #endif //USE_MPI
+      #ifdef USE_MPI
+       // int target_rank = (int)isector;    it implied that size >= nsectors
+       int target_rank = (int)(isector % size);
        
+      #ifdef ONE_SIDE
+       printf("One Side communication active\n");
+       MPI_Win_lock(MPI_LOCK_SHARED,target_rank,0,slabwin);
+       MPI_Accumulate(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,MPI_SUM,slabwin);
+       MPI_Win_unlock(target_rank,slabwin);
+               //MPI_Put(gridss,size_of_grid,MPI_DOUBLE,target_rank,0,size_of_grid,MPI_DOUBLE,slabwin);
+      #else
+       MPI_Reduce(gridss,grid,size_of_grid,MPI_DOUBLE,MPI_SUM,target_rank,MPI_COMM_WORLD);
+      #endif //ONE_SIDE
+      #endif //USE_MPI
+	       
        clock_gettime(CLOCK_MONOTONIC, &finishk);
        endk = clock();
        timing.reduce_time += ((double) (endk - startk)) / CLOCKS_PER_SEC;
-- 
GitLab