~ubuntu-branches/ubuntu/quantal/rheolef/quantal

« back to all changes in this revision

Viewing changes to nfem/ptst/geo_specs_tst.cc

  • Committer: Bazaar Package Importer
  • Author(s): Pierre Saramito
  • Date: 2011-03-26 08:10:11 UTC
  • mfrom: (4.1.4 sid)
  • Revision ID: james.westby@ubuntu.com-20110326081011-378s3slxnhwhn1da
Tags: 5.93-2
* debian/control:
  - "vtk-tcl" dependency changed to "tcl-vtk|vtk-tcl" (closes: #619917)
  - "doxygen" dependency removed                      (closes: #616276)
* debian/rheolef-doc.install : add refman in .info format
* debian/rheolef-doc.doc-base.refman: created for .pdf .html & .info
* debian/rules:
  - clean some obsolete Makefile commandes

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
  un domaine sera un masque (vue partielle) d'un mailage via
37
37
  un ensemble reduit d'elements definis par une renumerotation "num" :
38
38
*/
39
 
struct geo_mask_rep {
 
39
struct domain_indirect_rep {
40
40
  vector<size_t>             _num;
41
41
  vector<bool>               _orient;
42
42
  size_t                     _dim;
43
43
  string                     _name;
44
44
};
45
 
struct geo_mask : smart_pointer<geo_mask_rep> {};
 
45
struct domain_indirect : smart_pointer<domain_indirect_rep> {};
46
46
 
47
47
/*
48
48
  geo: niveau abstraction :
67
67
  virtual string name () const = 0;
68
68
  virtual const point& vertex (size_t iv) const = 0;
69
69
  virtual const geo_element& subgeo (size_t d,size_t ie) const = 0;
70
 
  virtual geo_mask operator[] (string dom_name) const = 0; 
 
70
  virtual domain_indirect operator[] (string dom_name) const = 0; 
71
71
};
72
72
/*
73
73
  geo : conteneur
80
80
  string                     _name;
81
81
  vector<geo_element>        _subgeo[4];
82
82
  vector<point>              _vertex;
83
 
  vector<geo_mask>           _domains;
 
83
  vector<domain_indirect>        _domains;
84
84
// allocator:
85
85
  geo_rep () {}
86
86
  geo_rep (string file_name) { /* code a developper */ }
87
 
  geo_rep (const struct domain_rep& dom); // defini + loin
 
87
  geo_rep (const struct geo_domain_rep& dom); // defini + loin
88
88
  ~geo_rep () {}
89
89
// interface "geo" concret :
90
90
  virtual string name () const { return _name; }
91
91
  const point& vertex (size_t iv) const { return _vertex[iv]; }
92
92
  const geo_element& subgeo (size_t d,size_t ie) const { return _subgeo[d][ie]; }
93
 
  geo_mask operator[] (string dom_name) const;
 
93
  domain_indirect operator[] (string dom_name) const;
94
94
};
95
 
geo_mask
 
95
domain_indirect
96
96
geo_rep::operator[] (string dom_name) const
97
97
{
98
98
   for (size_t i = 0; i < _domains.size(); i++) 
99
99
    if (_domains[i].data()._name == dom_name) return _domains[i];
100
 
   return geo_mask(); // erreur
 
100
   return domain_indirect(); // erreur
101
101
}
102
102
 
103
103
/*
110
110
// allocator:
111
111
  geo () : smart_pointer<geo_abs_rep>(new geo_rep) {}
112
112
  geo (string filename) : smart_pointer<geo_abs_rep>(new geo_rep(filename)) {}
113
 
  geo (const geo_mask& mask); // defini + loin
 
113
  geo (const domain_indirect& indirect); // defini + loin
114
114
// interface "geo" concret :
115
115
  const point& vertex (size_t iv) const { return data().vertex(iv); }
116
116
  const geo_element& subgeo (size_t d,size_t ie) const { return data().subgeo(d,ie);}
118
118
};
119
119
/*
120
120
  domain:
121
 
  la classe "geo_mask" ne contient que les numeros des elements :
 
121
  la classe "domain_indirect" ne contient que les numeros des elements :
122
122
  pour acceder aux elements et aux coords des sommets,
123
123
  il faut disposer de la classe "geo_abs_rep" associee, appellee alors
124
 
  "background geo" (concretement : geo_rep ou domain_rep) :
 
124
  "background geo" (concretement : geo_rep ou geo_domain_rep) :
125
125
*/
126
 
struct domain_rep : geo_abs_rep {
 
126
struct geo_domain_rep : geo_abs_rep {
127
127
// data:
128
 
  geo_mask  _mask;
129
 
  geo       _bg; // background geo
 
128
  domain_indirect  _indirect;
 
129
  geo          _bg; // background geo
130
130
// allocator:
131
 
  domain_rep (const geo_mask& mask, const geo& bg) :
132
 
        _mask(mask), _bg(bg) {}
 
131
  geo_domain_rep (const domain_indirect& indirect, const geo& bg) :
 
132
        _indirect(indirect), _bg(bg) {}
133
133
// interface "geo" concret :
134
 
  virtual string name () const { return _mask.data()._name; }
 
134
  virtual string name () const { return _indirect.data()._name; }
135
135
  const point& vertex (size_t iv) const { return _bg.vertex(iv); }
136
136
  const geo_element& subgeo (size_t d,size_t ie) const {
137
 
        if (d == _mask.data()._dim) return _bg.subgeo(d,_mask.data()._num[ie]);
 
137
        if (d == _indirect.data()._dim) return _bg.subgeo(d,_indirect.data()._num[ie]);
138
138
        else                        return _bg.subgeo(d,ie); }
139
 
  geo_mask operator[] (string dom_name) const; // impl + loin
 
139
  domain_indirect operator[] (string dom_name) const; // impl + loin
140
140
};
141
141
// constructeur d'un domaine avec l'interface "geo" :
142
 
geo::geo (const geo_mask& mask)
143
 
: smart_pointer<geo_abs_rep>(new domain_rep(mask, *this)) {}
 
142
geo::geo (const domain_indirect& indirect)
 
143
: smart_pointer<geo_abs_rep>(new geo_domain_rep(indirect, *this)) {}
144
144
 
145
145
/*
146
146
  point delicat :
147
147
  les domaines conduisent a deux types de "geo" :
148
148
   1) le plus simple est 
149
149
        geo gamma = omega["gamma"];
150
 
      qui est represente' par un domain_rep : la numerotation
 
150
      qui est represente' par un geo_domain_rep : la numerotation
151
151
      des sommets suit celle du maillage "background".
152
152
      Ce type de "geo" peut construire des espace pour assembler
153
153
      des matrices de masse pour la condition de robin, par ex.
154
 
      Ce cas est traite' par le constructeur de domain_rep precedent :
 
154
      Ce cas est traite' par le constructeur de geo_domain_rep precedent :
155
155
 
156
 
        domain_rep (const geo_mask& mask, const geo& bg);
 
156
        geo_domain_rep (const domain_indirect& indirect, const geo& bg);
157
157
 
158
158
   2) lorsqu'on veut une matrice de masse avec une numerotation
159
159
      compactee, ou` seuls les sommets intervenant dans le domaine
163
163
      Dans ce cas, le domain_tst construit precedement 
164
164
      est convertis en geo_tst :
165
165
 
166
 
        geo_rep (const domain_rep& dom);
 
166
        geo_rep (const geo_domain_rep& dom);
167
167
 
168
168
      c'est l'implementation qui suit :
169
169
*/
170
 
geo_rep::geo_rep (const domain_rep& dom)
171
 
: _dim  (dom._mask.data()._dim),
172
 
  _name (dom._mask.data()._name + "@" + dom._bg.data().name()),
 
170
geo_rep::geo_rep (const geo_domain_rep& dom)
 
171
: _dim  (dom._indirect.data()._dim),
 
172
  _name (dom._indirect.data()._name + "@" + dom._bg.data().name()),
173
173
  _subgeo(),
174
174
  _vertex(),
175
175
  _domains()
177
177
  // a faire ici:
178
178
  // 1) _vertex : copie paresseuse de la table des sommets
179
179
  // 2) _subgeo : renum compactee de ts les elements, y compris sommets
180
 
  // 3) _domains : intersection des domaines de _bg avec le dom._mask :
 
180
  // 3) _domains : intersection des domaines de _bg avec le dom._indirect :
181
181
  //     on ne garde que les
182
182
}
183
183
/*
184
184
  Enfin, un domaine d'un maillage peut avoir des sous-domaines,
185
185
  par exemple les bords du bord. Il s'agit de faire l'intersection
186
 
  du domaine designe' par _mask avec celui donne' par dom_name
 
186
  du domaine designe' par _indirect avec celui donne' par dom_name
187
187
  et qui designe un domain dans _bg, le maillage de fond.
188
188
  Le resultat est un nouveau masque de _bg.
189
189
*/
190
 
geo_mask 
191
 
domain_rep::operator[] (string dom_name) const { 
 
190
domain_indirect 
 
191
geo_domain_rep::operator[] (string dom_name) const { 
192
192
  // ici, extraction de sous-sous-domaines.
193
 
  return geo_mask();
 
193
  return domain_indirect();
194
194
}
195
195
 
196
196
int main() {