/[escript]/trunk/paso/src/Pattern.h
ViewVC logotype

Contents of /trunk/paso/src/Pattern.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5104 - (show annotations)
Mon Jul 21 07:47:55 2014 UTC (5 years, 2 months ago) by caltinay
File MIME type: text/plain
File size: 3568 byte(s)
Fixed a threading performance issue in finley/dudley by preallocating
chunk in vector and using dynamic arrays directly for parallel region.

1
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2014 by University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Open Software License version 3.0
9 * http://www.opensource.org/licenses/osl-3.0.php
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16
17
18 /****************************************************************************/
19
20 /* Paso: CSC/CSR sparse matrix pattern */
21
22 /****************************************************************************/
23
24 /* Author: Lutz Gross, l.gross@uq.edu.au */
25
26 /****************************************************************************/
27
28 #ifndef __PASO_PATTERN_H__
29 #define __PASO_PATTERN_H__
30
31 #include "Paso.h"
32 #include "esysUtils/IndexList.h"
33
34 namespace paso {
35
36 struct Pattern;
37 typedef boost::shared_ptr<Pattern> Pattern_ptr;
38 typedef boost::shared_ptr<const Pattern> const_Pattern_ptr;
39
40 PASO_DLL_API
41 struct Pattern : boost::enable_shared_from_this<Pattern>
42 {
43 Pattern(int type, dim_t numOutput, dim_t numInput, index_t* ptr,
44 index_t* index);
45
46 ~Pattern();
47
48 Pattern_ptr unrollBlocks(int newType, dim_t outputBlockSize,
49 dim_t inputBlockSize);
50
51 Pattern_ptr getSubpattern(dim_t newNumRows, dim_t newNumCols,
52 const index_t* rowList,
53 const index_t* newColIndex) const;
54
55 /// Searches for a maximal independent set MIS in the matrix pattern
56 void mis(index_t* mis_marker) const;
57
58 void reduceBandwidth(index_t* oldToNew);
59
60 Pattern_ptr multiply(int type, const_Pattern_ptr other) const;
61
62 Pattern_ptr binop(int type, const_Pattern_ptr other) const;
63
64 index_t* borrowMainDiagonalPointer();
65
66 static Pattern_ptr fromIndexListArray(dim_t n0, dim_t n,
67 const esysUtils::IndexList* index_list_array,
68 index_t range_min, index_t range_max, index_t index_offset);
69
70 index_t* borrowColoringPointer();
71
72 dim_t getBandwidth(index_t* label) const;
73
74 inline bool isEmpty() const
75 {
76 return (!ptr && !index);
77 }
78
79 inline dim_t getNumColors()
80 {
81 // make sure numColors is defined
82 borrowColoringPointer();
83 return numColors;
84 }
85
86 inline dim_t maxDeg() const
87 {
88 dim_t deg = 0;
89 #pragma omp parallel
90 {
91 dim_t loc_deg=0;
92 #pragma omp for
93 for (dim_t i = 0; i < numInput; ++i) {
94 loc_deg=std::max(loc_deg, ptr[i+1]-ptr[i]);
95 }
96 #pragma omp critical
97 {
98 deg = std::max(deg, loc_deg);
99 }
100 }
101 return deg;
102 }
103
104
105 int type;
106 // Number of rows in the ptr array [CSR] / number of cols for CSC
107 dim_t numOutput;
108 // Number of cols [CSR]
109 dim_t numInput;
110 // number of non-zeros
111 dim_t len;
112 // ptr[n] to ptr[n+1] lists indices (in index) of non-zeros in row n
113 index_t* ptr;
114 // Non-major indices of non-zeros (in CSR this will be col numbers)
115 index_t* index;
116 // pointer to main diagonal entry
117 index_t* main_iptr;
118 // number of colors
119 dim_t numColors;
120 // coloring index: inputs with the same color are not connected
121 index_t* coloring;
122 };
123
124
125 } // namespace paso
126
127 #endif // __PASO_PATTERN_H__
128

  ViewVC Help
Powered by ViewVC 1.1.26