/home/kcamus/qaas_runs/169-443-9681/intel/AMG/build/AMG/AMG/seq_mv/csr_matop.c: 185 - 302
--------------------------------------------------------------------------------

185: #pragma omp parallel private(ia, ib, ic, ja, jb, num_nonzeros, row_start, counter, a_entry, b_entry)
[...]
192:     ii = hypre_GetThreadNum();
193:     num_threads = hypre_NumActiveThreads();
194: 
195:    size = nrows_A/num_threads;
196:    rest = nrows_A - size*num_threads;
197:     if (ii < rest)
[...]
208:     B_marker = hypre_CTAlloc(HYPRE_Int, ncols_B);
209: 
210:     for (ib = 0; ib < ncols_B; ib++)
211:       B_marker[ib] = -1;
212: 
213:     num_nonzeros = 0;
214:     for (ic = ns; ic < ne; ic++)
215:     {
216:         C_i[ic] = num_nonzeros;
217: 	if (allsquare) 
218:         {
219:            B_marker[ic] = ic;
220:            num_nonzeros++;
221:         }
222: 	for (ia = A_i[ic]; ia < A_i[ic+1]; ia++)
223: 	{
224: 	   ja = A_j[ia];
225: 	   for (ib = B_i[ja]; ib < B_i[ja+1]; ib++)
226: 	   {
227: 	      jb = B_j[ib];
228: 	      if (B_marker[jb] != ic)
229: 	      {
230: 	 	 B_marker[jb] = ic;
231: 		 num_nonzeros++;
232: 	      }
233: 	   }
234:    	}
235:    }
236:    jj_count[ii] = num_nonzeros;
[...]
242:     if (ii)
243:     {
244:        jj = jj_count[0];
245:        for (i1 = 1; i1 < ii; i1++)
246:           jj += jj_count[i1];
247: 
248:        for (i1 = ns; i1 < ne; i1++)
249:           C_i[i1] += jj;
250:     }
251:     else
252:     {
253:        C_i[nrows_A] = 0;
254:        for (i1 = 0; i1 < num_threads; i1++)
255:           C_i[nrows_A] += jj_count[i1];
256: 
257:        C = hypre_CSRMatrixCreate(nrows_A, ncols_B, C_i[nrows_A]);
258:        hypre_CSRMatrixI(C) = C_i;
259:        hypre_CSRMatrixInitialize(C);
260:        C_j = hypre_CSRMatrixJ(C);
261:        C_data = hypre_CSRMatrixData(C);
[...]
268:    for (ib = 0; ib < ncols_B; ib++)
269:       B_marker[ib] = -1;
270: 
271:    counter = C_i[ns];
272:    for (ic = ns; ic < ne; ic++)
273:    {
274:       row_start = C_i[ic];
275:       if (allsquare) 
276:       {
277:          B_marker[ic] = counter;
278:          C_data[counter] = 0;
279:          C_j[counter] = ic;
280:          counter++;
281:       }
282:       for (ia = A_i[ic]; ia < A_i[ic+1]; ia++)
283:       {
284: 	 ja = A_j[ia];
285: 	 a_entry = A_data[ia];
286: 	 for (ib = B_i[ja]; ib < B_i[ja+1]; ib++)
287: 	 {
288: 	    jb = B_j[ib];
289: 	    b_entry = B_data[ib];
290: 	    if (B_marker[jb] < row_start)
291: 	    {
292: 		B_marker[jb] = counter;
293: 		C_j[B_marker[jb]] = jb;
294: 		C_data[B_marker[jb]] = a_entry*b_entry;
295: 		counter++;
296: 	    }
297: 	    else
298: 		C_data[B_marker[jb]] += a_entry*b_entry;
299: 	}
300:       }
301:    }
302:    hypre_TFree(B_marker);
