/home/kcamus/qaas_runs/169-443-9681/intel/AMG/build/AMG/AMG/parcsr_ls/par_coarsen.c: 1980 - 2624
--------------------------------------------------------------------------------

1980: {
1981: #ifdef HYPRE_PROFILE
1982:    hypre_profile_times[HYPRE_TIMER_ID_PMIS] -= hypre_MPI_Wtime();
1983: #endif
1984: 
1985:    MPI_Comm 	       comm            = hypre_ParCSRMatrixComm(S);
1986:    hypre_ParCSRCommPkg      *comm_pkg        = hypre_ParCSRMatrixCommPkg(S);
1987:    hypre_ParCSRCommHandle   *comm_handle;
1988: 
1989:    hypre_CSRMatrix    *S_diag          = hypre_ParCSRMatrixDiag(S);
1990:    HYPRE_Int                *S_diag_i        = hypre_CSRMatrixI(S_diag);
1991:    HYPRE_Int                *S_diag_j        = hypre_CSRMatrixJ(S_diag);
1992: 
1993:    hypre_CSRMatrix    *S_offd          = hypre_ParCSRMatrixOffd(S);
1994:    HYPRE_Int                *S_offd_i        = hypre_CSRMatrixI(S_offd);
1995:    HYPRE_Int                *S_offd_j;
1996: 
1997:    HYPRE_Int                 num_variables   = hypre_CSRMatrixNumRows(S_diag);
[...]
2058:    if (debug_flag == 3) wall_time = time_getWallclockSeconds();
2059:    hypre_MPI_Comm_size(comm,&num_procs);
2060:    hypre_MPI_Comm_rank(comm,&my_id);
2061: 
2062:    if (!comm_pkg)
2063:    {
2064:         comm_pkg = hypre_ParCSRMatrixCommPkg(A); 
2065:    }
2066: 
2067:    if (!comm_pkg)
2068:    {
2069:         hypre_MatvecCommPkgCreate(A);
2070:         comm_pkg = hypre_ParCSRMatrixCommPkg(A); 
2071:    }
2072: 
2073:    num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg);
2074: 
2075:    int_buf_data = hypre_CTAlloc(HYPRE_Int, hypre_ParCSRCommPkgSendMapStart(comm_pkg,
2076:                                                 num_sends));
2077:    buf_data = hypre_CTAlloc(HYPRE_Real, hypre_ParCSRCommPkgSendMapStart(comm_pkg,
2078:                                                 num_sends));
2079:  
2080:    num_cols_offd = hypre_CSRMatrixNumCols(S_offd);
2081: 
2082:    S_diag_j = hypre_CSRMatrixJ(S_diag);
2083: 
2084:    if (num_cols_offd)
2085:    {
2086:       S_offd_j = hypre_CSRMatrixJ(S_offd);
[...]
2100:    measure_array = hypre_CTAlloc(HYPRE_Real, num_variables+num_cols_offd);
2101: 
2102:    /* first calculate the local part of the sums for the external nodes */
2103: #ifdef HYPRE_USING_OPENMP
2104:    HYPRE_Int *measure_array_temp = hypre_CTAlloc(HYPRE_Int, num_variables+num_cols_offd);
2105: 
2106: #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE
2107:    for (i=0; i < S_offd_i[num_variables]; i++)
[...]
2113: #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE
2114:    for (i=0; i < num_cols_offd; i++)
[...]
2126:    if (num_procs > 1)
2127:    comm_handle = hypre_ParCSRCommHandleCreate(2, comm_pkg, 
2128:                         &measure_array[num_variables], buf_data);
2129: 
2130:    /* calculate the local part for the local nodes */
2131: #ifdef HYPRE_USING_OPENMP
2132: #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE
2133:    for (i=0; i < S_diag_i[num_variables]; i++)
[...]
2139: #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE
2140:    for (i=0; i < num_variables; i++)
2141:    {
2142:      measure_array[i] = measure_array_temp[i];
2143:    }
2144: 
2145:    hypre_TFree(measure_array_temp);
[...]
2154:    if (num_procs > 1)
2155:    hypre_ParCSRCommHandleDestroy(comm_handle);
2156:       
2157:    /* now add the externally calculated part of the local nodes to the local nodes */
2158:    index = 0;
2159:    for (i=0; i < num_sends; i++)
2160:    {
2161:       start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
2162:       for (j=start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++)
2163:             measure_array[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]
2164:                         += buf_data[index++];
2165:    }
2166: 
2167:    /* set the measures of the external nodes to zero */
2168:    for (i=num_variables; i < num_variables+num_cols_offd; i++)
2169:    { 
2170:       measure_array[i] = 0;
[...]
2176:    if (CF_init == 2 || CF_init == 4)
[...]
2186:    if (num_cols_offd) 
2187:       graph_array_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd);
2188:    else
2189:       graph_array_offd = NULL;
2190: 
2191:    for (ig = 0; ig < num_cols_offd; ig++)
2192:       graph_array_offd[ig] = ig;
2193: 
2194:    graph_offd_size = num_cols_offd;
2195: 
2196:    /* now the local part of the graph array, and the local CF_marker array */
2197:    graph_array = hypre_CTAlloc(HYPRE_Int, num_variables);
2198: 
2199:    if (CF_init==1)
2200:    { 
2201:       CF_marker = *CF_marker_ptr;
2202:       cnt = 0;
2203:       for (i=0; i < num_variables; i++)
2204:       {
2205:          if ( (S_offd_i[i+1]-S_offd_i[i]) > 0 || CF_marker[i] == -1)
[...]
2211:             if (measure_array[i] >= 1.0 ||
2212:                 (S_diag_i[i+1]-S_diag_i[i]) > 0)
[...]
2219:                CF_marker[i] = F_PT;
2220:             }
2221:          }
2222:          else if (CF_marker[i] == SF_PT)
2223:             measure_array[i] = 0;
[...]
2230:       CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables);
2231:       cnt = 0;
2232:       for (i=0; i < num_variables; i++)
2233:       {
2234:          CF_marker[i] = 0;
2235:          if ( (S_diag_i[i+1]-S_diag_i[i]) == 0
2236:                 && (S_offd_i[i+1]-S_offd_i[i]) == 0)
2237:          {
2238:             CF_marker[i] = SF_PT; /* an isolated fine grid */
2239:             if (CF_init == 3 || CF_init == 4) CF_marker[i] = C_PT; 
2240:             measure_array[i] = 0;
2241:          }
2242:          else
2243:             graph_array[cnt++] = i;
2244:       }
2245:    }
2246:    graph_size = cnt;
2247: 
2248:    /* now the off-diagonal part of CF_marker */
2249:    if (num_cols_offd)
2250:      CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_offd);
2251:    else
2252:      CF_marker_offd = NULL;
2253: 
2254:    for (i=0; i < num_cols_offd; i++)
2255: 	CF_marker_offd[i] = 0;
[...]
2262:    for (i = 0; i < num_sends; i++)
2263:      {
2264:        start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
2265:        for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++)
2266: 	 {
2267: 	   jrow = hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j);
2268: 	   buf_data[index++] = measure_array[jrow];
2269:          }
2270:      }
2271:    
2272:    if (num_procs > 1)
2273:      { 
2274:        comm_handle = hypre_ParCSRCommHandleCreate(1, comm_pkg, buf_data, 
2275: 						  &measure_array[num_variables]);
2276:        
2277:        hypre_ParCSRCommHandleDestroy(comm_handle);   
2278:        
2279:      } 
2280:       
2281:    if (debug_flag == 3)
2282:    {
2283:       wall_time = time_getWallclockSeconds() - wall_time;
2284:       hypre_printf("Proc = %d    Initialize CLJP phase = %f\n",
2285:                      my_id, wall_time); 
2286:    }
2287: 
2288:    HYPRE_Int                *graph_array2 = hypre_CTAlloc(HYPRE_Int, num_variables);
2289:    HYPRE_Int *graph_array_offd2 = NULL;
2290:    if (num_cols_offd)
2291:      graph_array_offd2 = hypre_CTAlloc(HYPRE_Int, num_cols_offd);
[...]
2305:      hypre_MPI_Allreduce(&graph_size,&global_graph_size,1,HYPRE_MPI_INT,hypre_MPI_SUM,comm);
2306: 
2307:      if (global_graph_size == 0)
[...]
2320:       if (!CF_init || iter)
[...]
2327: #pragma omp parallel for private(ig, i) HYPRE_SMP_SCHEDULE
2328: #endif
2329:         for (ig = 0; ig < graph_size; ig++)
[...]
2338: #pragma omp parallel for private(ig, i) HYPRE_SMP_SCHEDULE
2339: #endif
2340:         for (ig = 0; ig < graph_offd_size; ig++)
[...]
2354: #pragma omp parallel for private(ig, i, jS, j, jj) HYPRE_SMP_SCHEDULE
2355: #endif
2356:         for (ig = 0; ig < graph_size; ig++)
[...]
2393:       if (num_procs > 1)
2394:       {
2395:          comm_handle = hypre_ParCSRCommHandleCreate(12, comm_pkg, 
2396: 		CF_marker_offd, int_buf_data);
2397:  
2398:          hypre_ParCSRCommHandleDestroy(comm_handle);   
2399:       }
2400: 
2401:       index = 0;
2402:       for (i = 0; i < num_sends; i++)
2403:       {
2404:          start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
2405:          for (j=start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++)
2406:          {
2407:             elmt = hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j);
2408:             if (!int_buf_data[index] && CF_marker[elmt] > 0)
2409:             {
2410:                CF_marker[elmt] = 0; 
2411:                index++;
2412:             }
2413:             else
2414:             {
2415:                int_buf_data[index++] = CF_marker[elmt];
2416:             }
2417:          }
2418:       }
2419:  
2420:       if (num_procs > 1)
2421:       {
2422:          comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, 
2423:         	CF_marker_offd);
2424:  
2425:          hypre_ParCSRCommHandleDestroy(comm_handle);   
2426:       }
2427:       }
2428: 
2429:       iter++;
[...]
2435: #pragma omp parallel for private(ig, i, jS, j) HYPRE_SMP_SCHEDULE
2436: #endif
2437:      for (ig = 0; ig < graph_size; ig++) {
[...]
2492:       for (i = 0; i < num_sends; i++)
2493:       {
2494:         start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
2495:         for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg, i+1); j++)
2496:                 int_buf_data[index++] 
2497:                  = CF_marker[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)];
2498:       }
2499:  
2500:       if (num_procs > 1)
2501:       {
2502:       comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, 
2503:         CF_marker_offd);
2504:  
2505:       hypre_ParCSRCommHandleDestroy(comm_handle);   
[...]
2513:     prefix_sum_workspace = hypre_TAlloc(HYPRE_Int, 2*(hypre_NumThreads() + 1));
2514: 
2515: #ifdef HYPRE_USING_OPENMP
2516: #pragma omp parallel private(ig,i)
[...]
2589:      hypre_TFree(prefix_sum_workspace);
[...]
2608:    hypre_TFree(measure_array);
2609:    hypre_TFree(graph_array);
2610:    hypre_TFree(graph_array2);
2611:    hypre_TFree(graph_array_offd2);
2612:    if (num_cols_offd) hypre_TFree(graph_array_offd);
2613:    hypre_TFree(buf_data);
2614:    hypre_TFree(int_buf_data);
2615:    hypre_TFree(CF_marker_offd);
2616:    /*if (num_procs > 1) hypre_CSRMatrixDestroy(S_ext);*/
2617: 
2618:    *CF_marker_ptr   = CF_marker;
[...]
2624:    return (ierr);
