2
/// This file is part of Rheolef.
4
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
6
/// Rheolef is free software; you can redistribute it and/or modify
7
/// it under the terms of the GNU General Public License as published by
8
/// the Free Software Foundation; either version 2 of the License, or
9
/// (at your option) any later version.
11
/// Rheolef is distributed in the hope that it will be useful,
12
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
/// GNU General Public License for more details.
16
/// You should have received a copy of the GNU General Public License
17
/// along with Rheolef; if not, write to the Free Software
18
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
/// =========================================================================
21
#include "rheolef/form_manip.h"
24
form_manip::form_manip()
33
form_manip::nform() const
38
form_manip::nrowbloc() const
43
form_manip::ncolbloc() const
48
form_manip::bloc(size_type i, size_type j)
50
return _a[_ncolbloc*i+j];
53
form_manip::bloc (size_type i, size_type j) const
55
return _a[_ncolbloc*i+j];
58
form_manip::operator << (const form& a)
60
_a.insert (_a.end(),a);
65
form_manip::operator >> (form& a)
67
if (_nform != _nrowbloc*_ncolbloc) {
68
error_macro("bad bloc number: " << _nform << ", expect " << _nrowbloc*_ncolbloc);
70
check_macro (_ncolbloc >0 && _nrowbloc > 0, "size(n,m) may be non-zero in form_manip");
72
// initialize (X,Y) spaces as product spaces
75
for (size_t j = 1; j < _ncolbloc; j++) {
76
a.X_ = a.X_ * bloc(0,j).X_;
79
for (size_t i = 1; i < _nrowbloc; i++) {
80
a.Y_ = a.Y_ * bloc(i,0).Y_;
83
// big switch: there is not yet a general case !!!
89
case 1: // scalaire -> scalaire
90
a.uu = bloc(0,0).uu ; a.ub = bloc(0,0).ub ;
91
a.bu = bloc(0,0).bu ; a.bb = bloc(0,0).bb ;
93
case 2: // vecteur(2D) -> scalaire
94
a.uu = hcat(bloc(0,0).uu,bloc(0,1).uu) ; a.ub = hcat(bloc(0,0).ub,bloc(0,1).ub) ;
95
a.bu = hcat(bloc(0,0).bu,bloc(0,1).bu) ; a.bb = hcat(bloc(0,0).bb,bloc(0,1).bb) ;
97
case 3: // vecteur(3D) -> scalaire ou tenseur sym(2D) -> scalaire
98
trace_macro("3D not yet: 2d sym. tenseur sym -> scalar");
99
a.uu = hcat(bloc(0,0).uu,hcat(bloc(0,1).uu,bloc(0,2).uu)) ;
100
a.ub = hcat(bloc(0,0).ub,hcat(bloc(0,1).ub,bloc(0,2).ub)) ;
101
a.bu = hcat(bloc(0,0).bu,hcat(bloc(0,1).bu,bloc(0,2).bu)) ;
102
a.bb = hcat(bloc(0,0).bb,hcat(bloc(0,1).bb,bloc(0,2).bb)) ;
105
error_macro("vector(" << _ncolbloc << "D) is scalar");
111
case 1: // scalaire -> vecteur(2D)
112
a.uu = vcat(bloc(0,0).uu,bloc(1,0).uu) ; a.ub = vcat(bloc(0,0).ub,bloc(1,0).ub) ;
113
a.bu = vcat(bloc(0,0).bu,bloc(1,0).bu) ; a.bb = vcat(bloc(0,0).bb,bloc(1,0).bb) ;
115
case 2: // vecteur(2D) -> vecteur(2D)
116
a.uu = vcat( hcat(bloc(0,0).uu,bloc(0,1).uu) , hcat(bloc(1,0).uu,bloc(1,1).uu) ) ;
117
a.ub = vcat( hcat(bloc(0,0).ub,bloc(0,1).ub) , hcat(bloc(1,0).ub,bloc(1,1).ub) ) ;
118
a.bu = vcat( hcat(bloc(0,0).bu,bloc(0,1).bu) , hcat(bloc(1,0).bu,bloc(1,1).bu) ) ;
119
a.bb = vcat( hcat(bloc(0,0).bb,bloc(0,1).bb) , hcat(bloc(1,0).bb,bloc(1,1).bb) ) ;
121
case 3: // tenseur(2D) -> vecteur(2D)
122
a.uu = vcat( hcat( hcat(bloc(0,0).uu,bloc(0,1).uu) , bloc(0,2).uu ) ,
123
hcat( hcat(bloc(1,0).uu,bloc(1,1).uu) , bloc(1,2).uu ) );
124
a.ub = vcat( hcat( hcat(bloc(0,0).ub,bloc(0,1).ub) , bloc(0,2).ub ) ,
125
hcat( hcat(bloc(1,0).ub,bloc(1,1).ub) , bloc(1,2).ub ) ) ;
126
a.bu = vcat( hcat( hcat(bloc(0,0).bu,bloc(0,1).bu) , bloc(0,2).bu ) ,
127
hcat( hcat(bloc(1,0).bu,bloc(1,1).bu) , bloc(1,2).bu ) ) ;
128
a.bb = vcat( hcat( hcat(bloc(0,0).bb,bloc(0,1).bb) , bloc(0,2).bb ) ,
129
hcat( hcat(bloc(1,0).bb,bloc(1,1).bb) , bloc(1,2).bb ) ) ;
131
case 4: // tenseur(2Daxi) -> vecteur(2D)
132
a.uu = vcat( hcat( hcat(bloc(0,0).uu,bloc(0,1).uu) , hcat(bloc(0,2).uu,bloc(0,3).uu) ) ,
133
hcat( hcat(bloc(1,0).uu,bloc(1,1).uu) , hcat(bloc(1,2).uu,bloc(1,3).uu) ) );
134
a.ub = vcat( hcat( hcat(bloc(0,0).ub,bloc(0,1).ub) , hcat(bloc(0,2).ub,bloc(0,3).ub) ) ,
135
hcat( hcat(bloc(1,0).ub,bloc(1,1).ub) , hcat(bloc(1,2).ub,bloc(1,3).ub) ) ) ;
136
a.bu = vcat( hcat( hcat(bloc(0,0).bu,bloc(0,1).bu) , hcat(bloc(0,2).bu,bloc(0,3).bu) ) ,
137
hcat( hcat(bloc(1,0).bu,bloc(1,1).bu) , hcat(bloc(1,2).bu,bloc(1,3).bu) ) ) ;
138
a.bb = vcat( hcat( hcat(bloc(0,0).bb,bloc(0,1).bb) , hcat(bloc(0,2).bb,bloc(0,3).bb) ) ,
139
hcat( hcat(bloc(1,0).bb,bloc(1,1).bb) , hcat(bloc(1,2).bb,bloc(1,3).bb) ) ) ;
142
error_macro("vector (" << _ncolbloc << "D) is vecteur(2D)");
148
case 1: // scalaire -> vecteur(3D) ou scalaire -> tenseur sym(2D)
149
trace_macro("3D not yet: scalaire -> tenseur sym(2D)");
150
a.uu = vcat(bloc(0,0).uu,vcat(bloc(1,0).uu,bloc(2,0).uu)) ;
151
a.ub = vcat(bloc(0,0).ub,vcat(bloc(1,0).ub,bloc(2,0).ub)) ;
152
a.bu = vcat(bloc(0,0).bu,vcat(bloc(1,0).bu,bloc(2,0).bu)) ;
153
a.bb = vcat(bloc(0,0).bb,vcat(bloc(1,0).bb,bloc(2,0).bb)) ;
155
case 2: // vecteur(2D) -> tenseur(2D)
156
a.uu = hcat( vcat( vcat(bloc(0,0).uu,bloc(1,0).uu) , bloc(2,0).uu ) ,
157
vcat( vcat(bloc(0,1).uu,bloc(1,1).uu) , bloc(2,1).uu ) ) ;
158
a.ub = hcat( vcat( vcat(bloc(0,0).ub,bloc(1,0).ub) , bloc(2,0).ub ) ,
159
vcat( vcat(bloc(0,1).ub,bloc(1,1).ub) , bloc(2,1).ub ) ) ;
160
a.bu = hcat( vcat( vcat(bloc(0,0).bu,bloc(1,0).bu) , bloc(2,0).bu ) ,
161
vcat( vcat(bloc(0,1).bu,bloc(1,1).bu) , bloc(2,1).bu ) ) ;
162
a.bb = hcat( vcat( vcat(bloc(0,0).bb,bloc(1,0).bb) , bloc(2,0).bb ) ,
163
vcat( vcat(bloc(0,1).bb,bloc(1,1).bb) , bloc(2,1).bb ) ) ;
165
case 3: // tenseur(2D) -> tenseur(2D) et vecteur(3D) -> vecteur(3D)
166
trace_macro("3D in test...");
167
a.uu = hcat( hcat(bloc(0,0).uu,bloc(0,1).uu) , bloc(0,2).uu ) ;
168
a.ub = hcat( hcat(bloc(0,0).ub,bloc(0,1).ub) , bloc(0,2).ub ) ;
169
a.bu = hcat( hcat(bloc(0,0).bu,bloc(0,1).bu) , bloc(0,2).bu ) ;
170
a.bb = hcat( hcat(bloc(0,0).bb,bloc(0,1).bb) , bloc(0,2).bb ) ;
171
a.uu = vcat( a.uu , hcat( hcat(bloc(1,0).uu,bloc(1,1).uu) , bloc(1,2).uu ) ) ;
172
a.ub = vcat( a.ub , hcat( hcat(bloc(1,0).ub,bloc(1,1).ub) , bloc(1,2).ub ) ) ;
173
a.bu = vcat( a.bu , hcat( hcat(bloc(1,0).bu,bloc(1,1).bu) , bloc(1,2).bu ) ) ;
174
a.bb = vcat( a.bb , hcat( hcat(bloc(1,0).bb,bloc(1,1).bb) , bloc(1,2).bb ) ) ;
175
a.uu = vcat( a.uu , hcat( hcat(bloc(2,0).uu,bloc(2,1).uu) , bloc(2,2).uu ) ) ;
176
a.ub = vcat( a.ub , hcat( hcat(bloc(2,0).ub,bloc(2,1).ub) , bloc(2,2).ub ) ) ;
177
a.bu = vcat( a.bu , hcat( hcat(bloc(2,0).bu,bloc(2,1).bu) , bloc(2,2).bu ) ) ;
178
a.bb = vcat( a.bb , hcat( hcat(bloc(2,0).bb,bloc(2,1).bb) , bloc(2,2).bb ) ) ;
181
// tenseur(3D) -> vecteur(3D)
184
error_macro("vecteur (" << _ncolbloc << "D) -> tenseur (2D)");
189
trace_macro("3D not yet");
191
case 3: break ;// vecteur(3D) -> tenseur(3D)
192
case 6: break ;// tenseur(3D) -> tenseur(3D)
194
error_macro("vecteur (" << _ncolbloc << "D) -> tenseur (3D)");
199
error_macro("vector (" << _ncolbloc << "D) -> vector (" << _nrowbloc << "D)");
200
} // fin du switch(_nrowbloc)
204
form_manip::operator << (form_manip& (*pf)(form_manip&))
209
verbose (form_manip &fm)
215
noverbose (form_manip &fm)
220
size::size (size_type nrowbloc1, size_type ncolbloc1)
221
: _nrowbloc(nrowbloc1),
226
operator << (form_manip &fm, const size& s)
228
fm._nrowbloc = s._nrowbloc;
229
fm._ncolbloc = s._ncolbloc;