00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef REGION_LAYOUT_H
00012 #define REGION_LAYOUT_H
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "Region/Rnode.h"
00036 #include "Index/NDIndex.h"
00037 #include "DomainMap/DomainMap.h"
00038 #include "FieldLayout/FieldLayoutUser.h"
00039 #include "Utility/Unique.h"
00040 #include "Utility/UserList.h"
00041 #include "Utility/vmap.h"
00042
00043 #ifdef IPPL_USE_STANDARD_HEADERS
00044 #include <iostream>
00045 using namespace std;
00046 #else
00047 #include <iostream.h>
00048 #endif
00049
00050
00051
00052 template <unsigned Dim> class FieldLayout;
00053 template <unsigned Dim, class T> class UniformCartesian;
00054 template <class T, unsigned Dim, class MeshType> class RegionLayout;
00055 template <class T, unsigned Dim, class MeshType>
00056 ostream& operator<<(ostream&, const RegionLayout<T,Dim,MeshType>&);
00057
00058
00059
00060 template < class T, unsigned Dim, class MeshType=UniformCartesian<Dim,T> >
00061 class RegionLayout : public FieldLayoutUser, private UserList {
00062
00063 public:
00064
00065 typedef vmap<Unique::type, Rnode<T,Dim> *> ac_id_vnodes;
00066 typedef DomainMap<NDRegion<T,Dim>, Rnode<T,Dim> *,
00067 TouchesRegion<T,Dim>,
00068 ContainsRegion<T,Dim>,
00069 SplitRegion<T,Dim> > ac_domain_vnodes;
00070
00071
00072 typedef typename ac_id_vnodes::iterator iterator_iv;
00073 typedef typename ac_id_vnodes::const_iterator const_iterator_iv;
00074 typedef typename ac_domain_vnodes::iterator iterator_dv;
00075 typedef typename ac_domain_vnodes::const_iterator const_iterator_dv;
00076 typedef typename ac_domain_vnodes::touch_iterator touch_iterator_dv;
00077 typedef pair<touch_iterator_dv,touch_iterator_dv> touch_range_dv;
00078
00079 public:
00080
00081
00082
00083 RegionLayout();
00084
00085
00086 RegionLayout(const RegionLayout<T,Dim,MeshType>&);
00087
00088
00089 RegionLayout(const NDRegion<T,Dim>& domain, MeshType& mesh, int vnodes=-1);
00090 RegionLayout(const PRegion<T>& i1, MeshType& mesh, int vnodes=-1);
00091 RegionLayout(const PRegion<T>& i1, const PRegion<T>& i2, MeshType& mesh,
00092 int vnodes=-1);
00093 RegionLayout(const PRegion<T>& i1, const PRegion<T>& i2,
00094 const PRegion<T>& i3, MeshType& mesh, int vnodes=-1);
00095
00096
00097
00098
00099
00100
00101 RegionLayout(FieldLayout<Dim>&);
00102
00103
00104
00105
00106 RegionLayout(FieldLayout<Dim>&, MeshType&);
00107
00108
00109
00110
00111
00112 RegionLayout(const NDIndex<Dim>& domain, int vnodes=-1);
00113 RegionLayout(const Index& i1,int vnodes=-1);
00114 RegionLayout(const Index& i1,const Index& i2,int vnodes=-1);
00115 RegionLayout(const Index& i1,const Index& i2,const Index& i3,int vnodes=-1);
00116
00117
00118
00119
00120 RegionLayout(const NDIndex<Dim>& domain, MeshType& mesh, int vnodes=-1);
00121 RegionLayout(const Index& i1, MeshType& mesh, int vnodes=-1);
00122 RegionLayout(const Index& i1, const Index& i2,MeshType& mesh,int vnodes=-1);
00123 RegionLayout(const Index& i1, const Index& i2, const Index& i3,
00124 MeshType& mesh, int vnodes=-1);
00125
00126
00127 virtual ~RegionLayout();
00128
00129
00130
00131
00132
00133
00134 bool initialized() const { return (FLayout != 0); }
00135
00136
00137 const NDRegion<T,Dim>& getDomain() const { return Domain; }
00138
00139
00140
00141
00142
00143 FieldLayout<Dim>& getFieldLayout() { return *FLayout; }
00144 const FieldLayout<Dim>& getFieldLayout() const { return *FLayout; }
00145
00146
00147 MeshType& getMesh() { return *theMesh; }
00148 const MeshType& getMesh() const { return *theMesh; }
00149
00150
00151 typename ac_id_vnodes::size_type size_iv() const { return Local_ac.size(); }
00152 iterator_iv begin_iv() { return Local_ac.begin(); }
00153 iterator_iv end_iv() { return Local_ac.end(); }
00154 const_iterator_iv begin_iv() const { return Local_ac.begin(); }
00155 const_iterator_iv end_iv() const { return Local_ac.end(); }
00156
00157
00158 typename ac_domain_vnodes::size_type size_rdv() const {
00159 return (Remote_ac != 0 ? Remote_ac->size() : 0);
00160 }
00161 iterator_dv begin_rdv() { return Remote_ac->begin(); }
00162 iterator_dv end_rdv() { return Remote_ac->end(); }
00163 const_iterator_dv begin_rdv() const { return Remote_ac->begin(); }
00164 const_iterator_dv end_rdv() const { return Remote_ac->end(); }
00165 touch_range_dv touch_range_rdv(const NDRegion<T,Dim>& domain) {
00166 return Remote_ac->touch_range(domain);
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176 void changeDomain(FieldLayout<Dim>&);
00177 void changeDomain(const NDIndex<Dim>&, int vnodes=-1);
00178 void changeDomain(const NDRegion<T,Dim>&, int vnodes=-1);
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 void RepartitionLayout(NDIndex<Dim>*, NDIndex<Dim>*);
00190 void RepartitionLayout(NDIndex<Dim>& domain) {
00191 RepartitionLayout(&domain, (&domain) + 1);
00192 }
00193
00194
00195
00196
00197
00198 NDRegion<T,Dim> convert_index(const NDIndex<Dim>&) const;
00199
00200
00201
00202
00203
00204 NDIndex<Dim> convert_region(const NDRegion<T,Dim>&) const;
00205
00206 #ifdef IPPL_USE_MEMBER_TEMPLATES
00207
00208
00209 template < unsigned D >
00210 NDRegion<T,Dim>
00211 convert_index(const NDIndex<D>& ni) const {
00212 NDRegion<T,Dim> new_pregion;
00213 TAU_TYPE_STRING(taustr, CT(new_pregion) + " (" + CT(ni) + " )");
00214 TAU_PROFILE("RegionLayout::convert_index()", taustr, TAU_REGION);
00215
00216 PInsist(D==Dim,"Dimension of input NDIndex does not match RegionLayout!!");
00217 return new_pregion;
00218 }
00219
00220
00221
00222 template < unsigned D >
00223 NDIndex<Dim>
00224 convert_region(const NDRegion<T,D>& nr) const {
00225 NDIndex<Dim> index;
00226 TAU_TYPE_STRING(taustr, CT(index) + " (" + CT(nr) + " )");
00227 TAU_PROFILE("RegionLayout::convert_region()", taustr, TAU_REGION);
00228
00229 PInsist(D==Dim,"Dimension of input NDRegion does not match RegionLayout!!");
00230 return index;
00231 }
00232 #endif
00233
00234
00235 bool operator==(const RegionLayout<T,Dim,MeshType>& x) {
00236 return Domain == x.Domain;
00237 }
00238
00239
00240
00241
00242
00243
00244 virtual void Repartition(UserList *);
00245
00246
00247 virtual void notifyUserOfDelete(UserList *);
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 UserList::ID_t get_Id() const { return getUserListID(); }
00261
00262
00263
00264
00265 void checkin(FieldLayoutUser& f) { checkinUser(f); }
00266
00267
00268
00269
00270
00271 void checkout(FieldLayoutUser& f) { checkoutUser(f); }
00272
00273 private:
00274
00275 ac_id_vnodes Local_ac;
00276 ac_domain_vnodes *Remote_ac;
00277
00278
00279 NDRegion<T,Dim> Domain;
00280
00281
00282 FieldLayout<Dim> *FLayout;
00283 bool WeOwnFieldLayout;
00284
00285
00286 MeshType *theMesh;
00287 bool WeOwnMesh;
00288
00289
00290 NDIndex<Dim> MeshVertices;
00291
00292
00293 int IndexOffset[Dim];
00294
00295
00296 bool CenterOffset[Dim];
00297
00298
00299 void setup(const NDRegion<T,Dim>&, int);
00300
00301
00302
00303
00304 void make_rnodes(const NDRegion<T,Dim>&, FieldLayout<Dim>&);
00305
00306
00307
00308 void delete_rnodes();
00309
00310
00311
00312
00313 void store_flayout(FieldLayout<Dim>*, bool WeOwn);
00314 void delete_flayout();
00315
00316
00317
00318
00319 void store_mesh(MeshType*, bool WeOwn);
00320 void delete_mesh();
00321
00322
00323
00324 #if defined(__MWERKS__)
00325 #if __MWERKS__ < 0x2300
00326 const NDRegion<T,Dim> getMeshDomain(MeshType *);
00327 #else
00328 NDRegion<T,Dim> getMeshDomain(MeshType *);
00329 #endif
00330 #else
00331
00332 NDRegion<T,Dim> getMeshDomain(MeshType *);
00333 #endif // __MWERKS__
00334 NDIndex<Dim> getMeshVertices(MeshType *);
00335
00336
00337
00338
00339
00340 class RnodePool : public vector<Rnode<T,Dim> *> {
00341 public:
00342
00343
00344 RnodePool() { }
00345 ~RnodePool() {
00346 while (this->size() > 0) {
00347 delete this->back();
00348 this->pop_back();
00349 }
00350 }
00351
00352
00353 Rnode<T,Dim>* create_rnode(const NDRegion<T,Dim>& nr, int node) {
00354 if (this->empty()) {
00355 return new Rnode<T,Dim>(nr, node);
00356 }
00357 else {
00358 Rnode<T,Dim>* rnode = this->back();
00359 this->pop_back();
00360 *rnode = Rnode<T,Dim>(nr, node);
00361 return rnode;
00362 }
00363 }
00364
00365
00366 Rnode<T,Dim>* create_rnode(const NDRegion<T,Dim>& nr,
00367 const Vektor<T,Dim>& v,
00368 int node) {
00369 if (this->empty()) {
00370 return new Rnode<T,Dim>(nr, v, node);
00371 }
00372 else {
00373 Rnode<T,Dim>* rnode = this->back();
00374 this->pop_back();
00375 *rnode = Rnode<T,Dim>(nr, v, node);
00376 return rnode;
00377 }
00378 }
00379 };
00380
00381
00382 static RnodePool StaticRnodePool;
00383
00384 };
00385
00386 #include "Region/RegionLayout.cpp"
00387
00388 #endif // REGION_LAYOUT_H
00389
00390
00391
00392
00393
00394