
94,97c124,134
<     init_vars();
<     pg2g6_openMC(devid);
< 
<     if (!setup_done[devid]) {
---
>     if (setup_done[devid]) { 
>         if (Backend == BACKEND_G6) {
>             pg2g6_openMC(devid);
>         }
>         else {
>             pg2g6nb_openMC(devid);
>         }
>     }
>     else {
>         // open for the 1st time. 
>         // at this point, we don't know whether the backend is G6 or G6nb.
102a140
>         pg2g6_openMC(devid);    // for the 1st time, open as a G6PIPE anyway.
123a162,167
>             Backend = backendid;
>             compatible = 1;
>             break;
>           case BACKEND_G6nb:
>             WARN(2, "G6nbPIPE\n");
>             Backend = backendid;
128a173,175
>           case BACKEND_G5nb:
>             WARN(2, "G5nbPIPE\n");
>             break;
140c187
<     }
---
>         pg2g6_closeMC(devid); // close anyway.
142c189,198
<     set_xunitMC(devid, XUNIT); // user app is not permitted to change scaling.
---
>         init_vars();
>         set_xunitMC(devid, XSHIFT); // user app is not permitted to change scaling.
>         if (Backend == BACKEND_G6) { // open G6PIPE again.
>             pg2g6_openMC(devid);
>         }
>         else {
>             pg2g6nb_openMC(devid); // open again, but as G6nbPIPE this time.
>             g6_set_eta(devid, 1e100); // large enough value will do.
>         }
>     }
148c204,209
<     pg2g6_closeMC(devid);
---
>     if (Backend == BACKEND_G6) {
>         pg2g6_closeMC(devid);
>     }
>     else {
>         pg2g6nb_closeMC(devid);
>     }
157c218,223
<     pg2g6_set_range_tiMC(devid, -tmax, tmax);
---
>     if (Backend == BACKEND_G6) {
>         pg2g6_set_range_tiMC(devid, -tmax, tmax);
>     }
>     else {
>         pg2g6nb_set_range_tiMC(devid, -tmax, tmax);
>     }
173a240
>     double h2scale = xscale * xscale;
175a243
>     double pscale = xscale / mscale;
176a245
>     double nnbr2scale = 1.0;
178,190c247,280
<     pg2g6_set_scale_tiMC(devid, 1.0);
<     pg2g6_set_scale_mjMC(devid, mscale);
<     pg2g6_set_range_xjMC(devid, xmin, xmax);
<     pg2g6_set_scale_vjMC(devid, vscale);
<     pg2g6_set_scale_tjMC(devid, 1.0);
<     pg2g6_set_scale_acc0by2MC(devid, 1.0);
<     pg2g6_set_scale_jerk0by6MC(devid, 1.0);
< 
<     pg2g6_set_range_xiMC(devid, xmin, xmax);
<     pg2g6_set_scale_viMC(devid, vscale);
<     pg2g6_set_scale_epsi2MC(devid, eps2scale);
<     pg2g6_set_scale_accMC(devid, ascale);
<     pg2g6_set_scale_jerkMC(devid, jscale);
---
>     if (Backend == BACKEND_G6) {
>         pg2g6_set_scale_tiMC(devid, 1.0);
>         pg2g6_set_scale_mjMC(devid, mscale);
>         pg2g6_set_range_xjMC(devid, xmin, xmax);
>         pg2g6_set_scale_vjMC(devid, vscale);
>         pg2g6_set_scale_tjMC(devid, 1.0);
>         pg2g6_set_scale_acc0by2MC(devid, 1.0);
>         pg2g6_set_scale_jerk0by6MC(devid, 1.0);
> 
>         pg2g6_set_range_xiMC(devid, xmin, xmax);
>         pg2g6_set_scale_viMC(devid, vscale);
>         pg2g6_set_scale_epsi2MC(devid, eps2scale);
>         pg2g6_set_scale_accMC(devid, ascale);
>         pg2g6_set_scale_jerkMC(devid, jscale);
>     }
>     else {
>         pg2g6nb_set_scale_tiMC(devid, 1.0);
>         pg2g6nb_set_scale_mjMC(devid, mscale);
>         pg2g6nb_set_range_xjMC(devid, xmin, xmax);
>         pg2g6nb_set_scale_vjMC(devid, vscale);
>         pg2g6nb_set_scale_tjMC(devid, 1.0);
>         pg2g6nb_set_scale_acc0by2MC(devid, 1.0);
>         pg2g6nb_set_scale_jerk0by6MC(devid, 1.0);
> 
>         pg2g6nb_set_range_xiMC(devid, xmin, xmax);
>         pg2g6nb_set_scale_viMC(devid, vscale);
>         pg2g6nb_set_scale_epsi2MC(devid, eps2scale);
>         pg2g6nb_set_scale_hi2MC(devid, h2scale);
>         pg2g6nb_set_scale_etainvMC(devid, 1.0);
>         pg2g6nb_set_scale_accMC(devid, ascale);
>         pg2g6nb_set_scale_potMC(devid, pscale);
>         pg2g6nb_set_scale_jerkMC(devid, jscale);
>         pg2g6nb_set_scale_nnbr2MC(devid, nnbr2scale);
>     }
196a287,293
> #if 0
>     xunit = newxunit;
>     xunit2 = 2*xunit;
>     xscale = pow(2.0,(double)xunit);
>     xscaleinv = 1.0/xscale;
>     xscale2 = xscale * xscale;
> #endif
211,213c308,320
<     pg2g6_set_jpMC(devid, address, 1,
<                    &mass, (double (*)[3])x, (double (*)[3])v,
<                    &tj, (double (*)[3])aby2, (double (*)[3])a1by6, &index);
---
>     // offset by one in order to distinguish null entry in the neighbour list.
>     int index1 = index + 1;
> 
>     if (Backend == BACKEND_G6) {
>         pg2g6_set_jpMC(devid, address, 1,
>                        &mass, (double (*)[3])x, (double (*)[3])v,
>                        &tj, (double (*)[3])aby2, (double (*)[3])a1by6, &index1);
>     }
>     else {
>         pg2g6nb_set_jpMC(devid, address, 1,
>                          &mass, (double (*)[3])x, (double (*)[3])v,
>                          &tj, (double (*)[3])aby2, (double (*)[3])a1by6, &index1);
>     }
246a354,360
> g6_set_eta(int devid, double eta)
> {
>     die_not_implemented_in_g6pipe("g6_set_eta()");
>     Cin[devid].etainv = 1.0 / eta;
> }
> 
> void
354c468,481
<     // to be written.
---
>     int i, overflown = 0;
> 
>     die_not_implemented_in_g6pipe("g6_read_neighbour_list()");
> 
>     get_fout(devid);
> 
>     for (i = 0; i < Nip[devid]; i++) {
>         if (Nbovflw[devid][i]) {
>             overflown = 1;
>             break;
>         }
>     }
> 
>     return overflown; // return 1 if & only if any of Nblist[devid][i] are overflown.
364c491,540
<     // to be written.
---
>     int i, ovflw, len;
>     int imax = maxlength < NBMEMSIZE ? maxlength : NBMEMSIZE;
>     int indexi, indexj;
> 
>     die_not_implemented_in_g6pipe("g6_get_neighbour_list()");
> 
>     for (i = 0, len = 0; i < imax; i++) {
>         nbl[i] = -2; // initial dummy value. just for debugging purpose.
>     }
> 
> 
>     indexi = Ipin[devid].index[ipipe] - 1;
>     for (i = 0, len = 0; i < imax; i++) {
>         indexj = Nblist[devid][ipipe][i] - 1; // values stored in Nblist are offset by one.
>         if (indexj == -1) break; // the value -1 indicates the end of the list.
>         if (indexi == indexj) continue; // remove self.
>         nbl[len] = indexj;
>         len++;
>     }
>     *nblen = len;
> 
>     if (NbSortMode) {
>         qsort(nbl, len, sizeof(int), nbindex_a_lt_b);
>     }
> 
>     if (imax < NBMEMSIZE && i == imax && Nblist[devid][ipipe][i] != 0) {
>         ovflw = 1; // the list is not overflown, but 'nbl[maxlength]'
>                    // is too small to store the entire list.
>     }
>     else {
>         //        fprintf(stderr, "Nbovflw[%d][%d]:%x   len:%d\n", devid, ipipe, Nbovflw[devid][ipipe], len);
>         ovflw = Nbovflw[devid][ipipe] ? 1 : 0; // Nbovflw is not 1 but 0xffffffff when overflown.
>     }
>     return ovflw;
> }
> 
> static int
> nbindex_a_lt_b(const void *arg0, const void *arg1)
> {
>     int a = *(int *)arg0;
>     int b = *(int *)arg1;
>     if (a < b) {
>         return -1;
>     }
>     else if (a > b) {
>         return +1;
>     }
>     else {
>         return 0;
>     }
370c546,547
<     // nop.
---
>     die_not_implemented_in_g6pipe("g6_set_neighbour_list_sort_mode()");
>     NbSortMode = mode;
376c553,554
<     // nop.
---
>     die_not_implemented_in_g6pipe("g6_get_neighbour_list_sort_mode()");
>     return NbSortMode;
378a557,560
> 
> /*
>  * return the size of the neighbour list buffer per pipe.
>  */
380c562
< g6_npipesMC(int devid)
---
> g6_get_nbmax(devid)
382c564,601
<     int npipe = pg2g6_get_number_of_pipelinesMC(devid);
---
>     die_not_implemented_in_g6pipe("g6_get_nbmemsize()");
> 
>     // Nblist[] always includes indice of the particle itself,
>     // which is removed from the list passed on to the user.
>     // Thus, the max size of the list is smaller than NBMEMSIZE by one.
>     return (NBMEMSIZE - 1);
> }
> 

393,398d611
< int
< g6_npipes(void)
< {
<     return NFOMAX;
< }
< 
