23 #include "rheolef/form_concat.h"
24 #include "rheolef/space_mult.h"
25 #include "rheolef/csr_concat.h"
27 namespace rheolef {
namespace details {
34 template <
class T,
class M>
44 typename std::vector<std::pair<bool,space_basic<T,M> > >::iterator xh_iter = l_Xh.begin();
45 for (
typename std::list<value_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter, xh_iter++, j_comp++) {
49 check_macro (x.
s == 0,
"unsupported non-nul scalar `"<<x.
s<<
"' in form concatenation"
50 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
54 if (!(*xh_iter).first) {
55 (*xh_iter).first =
true;
56 (*xh_iter).second = IR;
58 check_macro (IR == (*xh_iter).second,
"form initializer: invalid field:"
59 <<
" expect a form with its second space `" << (*xh_iter).second.name() <<
"'"
60 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
66 check_macro (x.
v.get_space() == Yh,
"form initializer: invalid field space `"
67 << x.
v.get_space().name() <<
"': expect `" << Yh.name() <<
"'"
68 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
73 if (!(*xh_iter).first) {
74 (*xh_iter).first =
true;
75 (*xh_iter).second = x.
v.get_space();
77 check_macro (x.
v.get_space() == (*xh_iter).second,
"form initializer: invalid trans(field) space `"
78 << x.
v.get_space().name() <<
"': expect `" << (*xh_iter).second.name() <<
"'"
79 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
85 check_macro (IR == Yh,
"form initializer: invalid trans(field): "
86 <<
" expect a form with its second space `"
87 << Yh.name() <<
"'" <<
" at ("<<i_comp<<
","<<j_comp<<
")");
92 size_t n = x.
vv.size();
93 check_macro (
n != 0,
"form initializer: invalid vector<field> with zero-size");
95 if (!(*xh_iter).first) {
96 (*xh_iter).first =
true;
97 (*xh_iter).second = x.
vv[0].get_space();
99 check_macro (x.
vv[0].get_space() == (*xh_iter).second,
"form initializer: invalid 0-th vector<field> space `"
100 << x.
vv[0].get_space().name() <<
"': expect `" << (*xh_iter).second.name() <<
"'"
101 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
103 for (
size_t i = 1; i <
n; ++i) {
104 check_macro (x.
vv[i].get_space() == x.
vv[0].get_space(),
"form initializer: invalid "<<i<<
"-th vector<field> space `"
105 << x.
vv[i].get_space().name() <<
"': expect `" << (*xh_iter).second.name() <<
"'"
106 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
112 check_macro (IRn == Yh,
"form initializer: invalid vector<field>: "
113 <<
" expect a form with its second space `"
114 << Yh.name() <<
"'" <<
" at ("<<i_comp<<
","<<j_comp<<
")");
119 size_t n = x.
vv.size();
120 check_macro (
n != 0,
"form initializer: invalid trans(vector<field>) with zero-size");
122 if (!(*xh_iter).first) {
123 (*xh_iter).first =
true;
124 (*xh_iter).second = IRn;
126 check_macro (IRn == (*xh_iter).second,
"form initializer: invalid trans(vector<field>):"
127 <<
" expect a form with its second space `" << (*xh_iter).second.name() <<
"'"
128 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
132 Yh = x.
vv[0].get_space();
134 check_macro (x.
vv[0].get_space() == Yh,
"form initializer: invalid 0-th trans(vector<field>) space `"
135 << x.
vv[0].get_space().name() <<
"': expect `" << Yh.name() <<
"'"
136 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
138 for (
size_t i = 1; i <
n; ++i) {
139 check_macro (x.
vv[i].get_space() == x.
vv[0].get_space(),
"form initializer: invalid "<<i<<
"-th trans(vector<field>) space `"
140 << x.
vv[i].get_space().name() <<
"': expect `" << (*xh_iter).second.name() <<
"'"
141 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
146 if (!(*xh_iter).first) {
147 (*xh_iter).first =
true;
148 (*xh_iter).second = x.
m.get_first_space();
150 check_macro (x.
m.get_first_space() == (*xh_iter).second,
"form initializer: invalid second space `"
151 << x.
m.get_first_space().name() <<
"': expect `" << (*xh_iter).second.name() <<
"'"
152 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
156 Yh = x.
m.get_second_space();
158 check_macro (x.
m.get_second_space() == Yh,
"form initializer: invalid second space `"
159 << x.
m.get_second_space().name() <<
"': expect `" << Yh.name() <<
"'"
160 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
164 default:
error_macro (
"concatenation not yet supported"
165 <<
" at ("<<i_comp<<
","<<j_comp<<
")");
168 check_macro (have_Yh,
"form concatenation: "<<i_comp<<
"th row space remains undefined");
170 template <
class T,
class M>
180 xh_iter = l_Xh.begin(),
181 xh_last = l_Xh.end(); xh_iter != xh_last; xh_iter++, j_comp++) {
182 check_macro ((*xh_iter).first,
"form concatenation: "<<j_comp<<
"th column space remains undefined");
183 sml_X *= (*xh_iter).second;
187 template <
class T,
class M>
194 std::vector<std::pair<bool,space_basic<T,M> > > l_Xh (_l.size(), std::pair<bool,space_basic<T,M> >(
false,
space_basic<T,M>()));
195 build_form_pass0 (l_Xh, Yh);
196 build_first_space (l_Xh, Xh);
198 template <
class T,
class M>
207 for(
typename std::list<value_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter) {
217 default:
error_macro (
"non-form concatenation not yet supported");
226 template <
class T,
class M>
231 build_form_pass1 (Xh, Yh);
240 template <
class T,
class M>
249 std::vector<std::pair<bool,space_basic<T,M> > > l_Xh (_l.size(), std::pair<bool,space_basic<T,M> >(
false,
space_basic<T,M>()));
250 for (
typename std::list<line_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter, i_comp++) {
266 for (
typename std::list<line_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter) {
269 for (
typename std::list<value_type>::const_iterator jter = line.
begin(); jter != line.
end(); ++jter) {
273 check_macro (x.
s == 0,
"unsupported non-nul scalar `"<<x.
s<<
"' in form concatenation");
283 sizes_type u_sizes (x.
v.u().size(), x.
v.u().dis_size());
284 sizes_type b_sizes (x.
v.b().size(), x.
v.b().dis_size());
293 sizes_type u_sizes (x.
v.u().size(), x.
v.u().dis_size());
294 sizes_type b_sizes (x.
v.b().size(), x.
v.b().dis_size());
303 size_t n = x.
vv.size();
307 std::vector<vec<T,M>> x_vv_u(
n), x_vv_b(
n);
308 for (
size_t i = 0; i <
n; ++i) {
309 x_vv_u[i] = x.
vv[i].u();
310 x_vv_b[i] = x.
vv[i].b();
311 u_sizes.first += x.
vv[i].u().size();
312 u_sizes.second += x.
vv[i].u().dis_size();
313 b_sizes.first += x.
vv[i].b().size();
314 b_sizes.second += x.
vv[i].b().dis_size();
322 u_sizes.first = x.
vv[0].u().size();
323 u_sizes.second = x.
vv[0].u().dis_size();
324 b_sizes.first = x.
vv[0].b().size();
325 b_sizes.second = x.
vv[0].b().dis_size();
326 for (
size_t i = 0; i <
n; ++i) {
328 u_sizes.second == x.
vv[i].u().dis_size(),
329 "trans(vector<field>): "<<i<<
"-th vector.u size [0:"<<x.
vv[i].u().size()<<
"|"<<x.
vv[i].u().dis_size()<<
"]"
330 " is incompatible with 0-th one [" <<x.
vv[0].u().size()<<
"|"<<x.
vv[0].u().dis_size()<<
"]");
332 b_sizes.second == x.
vv[i].b().dis_size(),
333 "trans(vector<field>): "<<i<<
"-th vector.b size [0:"<<x.
vv[i].b().size()<<
"|"<<x.
vv[i].b().dis_size()<<
"]"
334 " is incompatible with 0-th one [" <<x.
vv[0].b().size()<<
"|"<<x.
vv[0].b().dis_size()<<
"]");
337 std::vector<vec<T,M>> x_vv_u(
n), x_vv_b(
n);
338 for (
size_t i = 0; i <
n; ++i) {
339 x_vv_u[i] = x.
vv[i].u();
340 x_vv_b[i] = x.
vv[i].b();
350 size_t n = x.
vv.size();
356 u_sizes.first = x.
vv[0].u().size();
357 u_sizes.second = x.
vv[0].u().dis_size();
358 b_sizes.first = x.
vv[0].b().size();
359 b_sizes.second = x.
vv[0].b().dis_size();
360 for (
size_t i = 0; i <
n; ++i) {
362 u_sizes.second == x.
vv[i].u().dis_size(),
363 "trans(vector<field>): "<<i<<
"-th vector.u size [0:"<<x.
vv[i].u().size()<<
"|"<<x.
vv[i].u().dis_size()<<
"]"
364 " is incompatible with 0-th one [" <<x.
vv[0].u().size()<<
"|"<<x.
vv[0].u().dis_size()<<
"]");
366 b_sizes.second == x.
vv[i].b().dis_size(),
367 "trans(vector<field>): "<<i<<
"-th vector.b size [0:"<<x.
vv[i].b().size()<<
"|"<<x.
vv[i].b().dis_size()<<
"]"
368 " is incompatible with 0-th one [" <<x.
vv[0].b().size()<<
"|"<<x.
vv[0].b().dis_size()<<
"]");
371 std::vector<vec<T,M>> x_vv_u(
n), x_vv_b(
n);
372 for (
size_t i = 0; i <
n; ++i) {
373 x_vv_u[i] = x.
vv[i].u();
374 x_vv_b[i] = x.
vv[i].b();
389 default:
error_macro (
"non-form or scalar concatenation not yet supported");
407 #define _RHEOLEF_instanciation(T,M) \
408 template class form_concat_line<T,M>; \
409 template class form_concat<T,M>;
412 #ifdef _RHEOLEF_HAVE_MPI
414 #endif // _RHEOLEF_HAVE_MPI