comparison src/assemble.cc @ 247:8ca45824938e

Add factories hierarchy for matrices' and vectors' assembly
author Eugenio Gianniti <eugenio.gianniti@mail.polimi.it>
date Sat, 12 Jul 2014 12:30:13 +0200
parents 66071811eef8
children 5e9b5bbdc56b
comparison
equal deleted inserted replaced
246:a2991e2a085b 247:8ca45824938e
15 this program; if not, see <http://www.gnu.org/licenses/>. 15 this program; if not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #include "form.h" 18 #include "form.h"
19 #include "boundarycondition.h" 19 #include "boundarycondition.h"
20 #include "femfenics_factory.h"
20 21
21 DEFUN_DLD (assemble, args, nargout, 22 DEFUN_DLD (assemble, args, nargout,
22 "-*- texinfo -*-\n\ 23 "-*- texinfo -*-\n\
23 @deftypefn {Function File} {[@var{A}], [@var{x}(Optional)]} = \ 24 @deftypefn {Function File} {[@var{A}], [@var{x}(Optional)]} = \
24 assemble (@var{form_a}, @var{DirichletBC}) \n\ 25 assemble (@var{form_a}, @var{DirichletBC}) \n\
77 const dolfin::Form & a = frm.get_form (); 78 const dolfin::Form & a = frm.get_form ();
78 a.check (); 79 a.check ();
79 80
80 if (a.rank () == 2) 81 if (a.rank () == 2)
81 { 82 {
82 dolfin::parameters["linear_algebra_backend"] = "uBLAS"; 83 femfenics_factory factory;
84
83 dolfin::Matrix A; 85 dolfin::Matrix A;
84 dolfin::assemble (A, a); 86 dolfin::assemble (A, a);
85 87
86 for (std::size_t i = 1; i < nargin; ++i) 88 for (std::size_t i = 1; i < nargin; ++i)
87 { 89 {
102 } 104 }
103 else 105 else
104 error ("assemble: unknown argument type"); 106 error ("assemble: unknown argument type");
105 } 107 }
106 108
107 // Get capacity of the dolfin sparse matrix 109 retval(0) = factory.matrix (A);
108 boost::tuples::tuple<const std::size_t*,
109 const std::size_t*,
110 const double*, int>
111 aa = A.data ();
112
113 int nnz = aa.get<3> ();
114 std::size_t nr = A.size (0), nc = A.size (1);
115 std::vector<double> data_tmp;
116 std::vector<std::size_t> cidx_tmp;
117
118 dim_vector dims (nnz, 1);
119 octave_idx_type nz = 0, ii = 0;
120 Array<octave_idx_type>
121 ridx (dims, 0),
122 cidx (dims, 0);
123 Array<double> data (dims, 0);
124
125 octave_idx_type* orow = ridx.fortran_vec ();
126 octave_idx_type* oc = cidx.fortran_vec ();
127 double* ov = data.fortran_vec ();
128
129 for (std::size_t i = 0; i < nr; ++i)
130 {
131 A.getrow (i, cidx_tmp, data_tmp);
132 nz += cidx_tmp.size ();
133
134 for (octave_idx_type j = 0;
135 j < cidx_tmp.size (); ++j)
136 {
137 orow [ii + j] = i;
138 oc [ii + j] = cidx_tmp [j];
139 ov [ii + j] = data_tmp [j];
140 }
141
142 ii = nz;
143 }
144
145 dims(0) = ii;
146 ridx.resize (dims);
147 cidx.resize (dims);
148 data.resize (dims);
149
150 SparseMatrix sm (data, ridx, cidx, nr, nc);
151 retval(0) = sm;
152 } 110 }
153 111
154 else if (a.rank () == 1) 112 else if (a.rank () == 1)
155 { 113 {
114 femfenics_factory factory;
115
156 dolfin::Vector A; 116 dolfin::Vector A;
157 dolfin::assemble (A, a); 117 dolfin::assemble (A, a);
158 118
159 for (std::size_t i = 1; i < nargin; ++i) 119 for (std::size_t i = 1; i < nargin; ++i)
160 { 120 {
174 } 134 }
175 else 135 else
176 error ("assemble: unknown argument type"); 136 error ("assemble: unknown argument type");
177 } 137 }
178 138
179 dim_vector dims; 139 retval(0) = factory.vector (A);
180 dims.resize (2);
181 dims(0) = A.size ();
182 dims(1) = 1;
183 Array<double> myb (dims);
184
185 for (std::size_t i = 0; i < A.size (); ++i)
186 myb.xelem (i) = A[i];
187
188 retval(0) = myb;
189 } 140 }
190 141
191 else if (a.rank () == 0) 142 else if (a.rank () == 0)
192 { 143 {
193 double b = dolfin::assemble (a); 144 double b = dolfin::assemble (a);
217 const dolfin::Form & a = frm.get_form (); 168 const dolfin::Form & a = frm.get_form ();
218 a.check (); 169 a.check ();
219 170
220 if (a.rank () == 1) 171 if (a.rank () == 1)
221 { 172 {
173 femfenics_factory factory;
174
222 dolfin::Vector A; 175 dolfin::Vector A;
223 dolfin::assemble (A, a); 176 dolfin::assemble (A, a);
224 177
225 dolfin::Vector x (myx.length ()); 178 dolfin::Vector x (myx.length ());
226 for (std::size_t i = 0; i < myx.length (); ++i) 179 for (std::size_t i = 0; i < myx.length (); ++i)
245 } 198 }
246 else 199 else
247 error ("assemble: unknown argument type"); 200 error ("assemble: unknown argument type");
248 } 201 }
249 202
250 dim_vector dims; 203 retval(0) = factory.vector (A);
251 dims.resize (2); 204 retval(1) = factory.vector (x);
252 dims(0) = A.size ();
253 dims(1) = 1;
254 Array<double> myb (dims), myc (dims);
255
256 for (std::size_t i = 0; i < A.size (); ++i)
257 {
258 myb.xelem (i) = A[i];
259 myc.xelem (i) = x[i];
260 }
261
262 retval(0) = myb;
263 retval(1) = myc;
264 } 205 }
265 206
266 else 207 else
267 error ("assemble: unknown size"); 208 error ("assemble: unknown size");
268 } 209 }