MeshDistributor.h 19.5 KB
Newer Older
 Thomas Witkowski committed Apr 03, 2009 1 2 3 4 // ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == Thomas Witkowski committed Dec 16, 2010 5 // == http://www.amdis-fem.org == Thomas Witkowski committed Apr 03, 2009 6 7 // == == // ============================================================================ Thomas Witkowski committed Dec 16, 2010 8 9 10 11 12 13 14 15 16 17 18 19 // // Software License for AMDiS // // Copyright (c) 2010 Dresden University of Technology // All rights reserved. // Authors: Simon Vey, Thomas Witkowski et al. // // This file is part of AMDiS // // See also license.opensource.txt in the distribution. Thomas Witkowski committed Apr 03, 2009 20 21 /** \file MeshDistributor.h */ Thomas Witkowski committed Jul 09, 2009 22 23 24 #ifndef AMDIS_MESHDISTRIBUTOR_H #define AMDIS_MESHDISTRIBUTOR_H Thomas Witkowski committed Apr 03, 2009 25 26 Thomas Witkowski committed Feb 08, 2010 27 #include Thomas Witkowski committed Apr 21, 2011 28 #include "parallel/ParallelTypes.h" Thomas Witkowski committed Jan 24, 2011 29 #include "parallel/MeshPartitioner.h" Thomas Witkowski committed Nov 29, 2010 30 #include "parallel/InteriorBoundary.h" Thomas Witkowski committed Jan 27, 2011 31 #include "AMDiS_fwd.h" Thomas Witkowski committed Feb 08, 2010 32 #include "Global.h" Thomas Witkowski committed Apr 03, 2009 33 34 #include "ProblemTimeInterface.h" #include "ProblemIterationInterface.h" Thomas Witkowski committed Apr 15, 2009 35 #include "FiniteElemSpace.h" Thomas Witkowski committed Sep 29, 2009 36 #include "Serializer.h" Thomas Witkowski committed Feb 08, 2010 37 #include "BoundaryManager.h" Thomas Witkowski committed Jul 29, 2010 38 #include "ElementObjectData.h" Thomas Witkowski committed Jan 27, 2011 39 #include "SystemVector.h" Thomas Witkowski committed Jun 12, 2009 40 Thomas Witkowski committed Apr 03, 2009 41 namespace AMDiS { Thomas Witkowski committed Jan 07, 2011 42 43 using namespace std; Thomas Witkowski committed Apr 08, 2011 44 45 46 47 struct BoundaryDofInfo { Thomas Witkowski committed Apr 08, 2011 48 map geoDofs; Thomas Witkowski committed Apr 08, 2011 49 }; 50 Thomas Witkowski committed Apr 08, 2011 51 Thomas Witkowski committed Jun 08, 2010 52 class MeshDistributor Thomas Witkowski committed Apr 03, 2009 53 54 { public: Thomas Witkowski committed Mar 18, 2011 55 MeshDistributor(); Thomas Witkowski committed Jun 08, 2010 56 57 virtual ~MeshDistributor() {} Thomas Witkowski committed Apr 03, 2009 58 59 void initParallelization(); Thomas Witkowski committed Apr 03, 2009 60 61 void exitParallelization(); Thomas Witkowski committed Jun 08, 2010 62 Thomas Witkowski committed Apr 21, 2011 63 void addProblemStat(ProblemStatSeq *probStat); Thomas Witkowski committed Jun 26, 2009 64 Thomas Witkowski committed Jan 19, 2011 65 66 67 68 69 70 71 /// Adds a DOFVector to the set of \ref interchangeVecs. Thus, this vector will /// be automatically interchanged between ranks when mesh is repartitioned. void addInterchangeVector(DOFVector *vec) { interchangeVectors.push_back(vec); } Thomas Witkowski committed Jan 27, 2011 72 73 74 75 76 77 78 /// Adds all DOFVectors of a SystemVector to \ref interchangeVecs. void addInterchangeVector(SystemVector *vec) { for (int i = 0; i < vec->getSize(); i++) interchangeVectors.push_back(vec->getDOFVector(i)); } Thomas Witkowski committed Jan 29, 2010 79 80 81 82 /** \brief * This function checks if the mesh has changed on at least on rank. In this case, * the interior boundaries are adapted on all ranks such that they fit together on * all ranks. Furthermore the function \ref updateLocalGlobalNumbering() is called Thomas Witkowski committed Mar 18, 2011 83 * to update the DOF numberings and mappings on all rank due to the new mesh Thomas Witkowski committed Jan 29, 2010 84 * structure. 85 86 87 88 89 * * \param[in] tryRepartition If this parameter is true, repartitioning may be * done. This depends on several other parameters. If * the parameter is false, the mesh is only checked * and adapted but never repartitioned. Thomas Witkowski committed Jan 29, 2010 90 */ 91 void checkMeshChange(bool tryRepartition = true); Thomas Witkowski committed Jan 29, 2010 92 Thomas Witkowski committed Jun 26, 2009 93 94 95 96 97 98 99 /** \brief * Test, if the mesh consists of macro elements only. The mesh partitioning of * the parallelization works for macro meshes only and would fail, if the mesh * is already refined in some way. Therefore, this function will exit the program * if it finds a non macro element in the mesh. */ void testForMacroMesh(); Thomas Witkowski committed Apr 03, 2009 100 101 /// Set for each element on the partitioning level the number of leaf elements. 102 void setInitialElementWeights(); Thomas Witkowski committed Apr 03, 2009 103 Thomas Witkowski committed Jan 07, 2011 104 inline virtual string getName() Thomas Witkowski committed Jun 08, 2010 105 106 107 { return name; } 108 Thomas Witkowski committed Jan 14, 2011 109 110 111 112 113 inline Mesh* getMesh() { return mesh; } 114 115 116 117 118 /// Returns \ref feSpace. inline const FiniteElemSpace* getFeSpace() { return feSpace; } Thomas Witkowski committed Jun 08, 2010 119 120 121 /// Returns \ref nRankDOFs, the number of DOFs in the rank mesh. inline int getNumberRankDofs() Thomas Witkowski committed Jul 10, 2009 122 { Thomas Witkowski committed Jun 08, 2010 123 return nRankDofs; Thomas Witkowski committed Jul 10, 2009 124 } Thomas Witkowski committed Apr 03, 2009 125 126 /// Returns \ref nOverallDofs, the global number of DOFs. Thomas Witkowski committed Jun 08, 2010 127 inline int getNumberOverallDofs() Thomas Witkowski committed Jul 10, 2009 128 { Thomas Witkowski committed Jun 08, 2010 129 return nOverallDofs; Thomas Witkowski committed Jul 10, 2009 130 } Thomas Witkowski committed Apr 03, 2009 131 Thomas Witkowski committed Jan 14, 2011 132 133 134 135 136 inline DofMapping& getMapLocalGlobalDofs() { return mapLocalGlobalDofs; } Thomas Witkowski committed Mar 18, 2011 137 /// Maps a local DOF to its global index. Thomas Witkowski committed Jun 08, 2010 138 inline DegreeOfFreedom mapLocalToGlobal(DegreeOfFreedom dof) Thomas Witkowski committed Jul 10, 2009 139 { Thomas Witkowski committed Jun 08, 2010 140 return mapLocalGlobalDofs[dof]; Thomas Witkowski committed Jul 10, 2009 141 } Thomas Witkowski committed Apr 03, 2009 142 Thomas Witkowski committed Jan 17, 2011 143 144 DegreeOfFreedom mapGlobalToLocal(DegreeOfFreedom dof); Thomas Witkowski committed Mar 18, 2011 145 /// Maps a local DOF to its local index. Thomas Witkowski committed Jun 09, 2010 146 147 148 149 150 inline DegreeOfFreedom mapLocalToDofIndex(DegreeOfFreedom dof) { return mapLocalDofIndex[dof]; } Thomas Witkowski committed Jan 14, 2011 151 152 153 154 155 156 /// Returns the periodic mapping for all boundary DOFs in rank. inline PeriodicDofMap& getPeriodicMapping() { return periodicDof; } 157 /// Returns for a global dof index its periodic mapping for a given boundary type. Thomas Witkowski committed Jan 17, 2011 158 inline int getPeriodicMapping(int globalDofIndex, BoundaryType type) Thomas Witkowski committed Jul 10, 2009 159 { Thomas Witkowski committed Jan 14, 2011 160 161 FUNCNAME("MeshDistributor::getPeriodicMapping()"); Thomas Witkowski committed Jul 08, 2010 162 TEST_EXIT_DBG(periodicDof[type].count(globalDofIndex) == 1) Thomas Witkowski committed Jan 14, 2011 163 164 ("There is no periodic association for global DOF %d for boundary type %d!\n", globalDofIndex, type); Thomas Witkowski committed Jul 08, 2010 165 166 167 168 return periodicDof[type][globalDofIndex]; } 169 170 171 /// For a given global DOF index, this function returns the set of periodic /// associations, i.e., the boundary types the DOF is associated to, for this DOF. inline std::set& getPerDofAssociations(int globalDofIndex) Thomas Witkowski committed Jul 08, 2010 172 { Thomas Witkowski committed Jan 17, 2011 173 174 175 TEST_EXIT_DBG(periodicDofAssociations.count(globalDofIndex)) ("Should not happen!\n"); 176 return periodicDofAssociations[globalDofIndex]; Thomas Witkowski committed Jul 10, 2009 177 } Thomas Witkowski committed Apr 03, 2009 178 179 /// Returns true, if the DOF (global index) is a periodic DOF. Thomas Witkowski committed Jul 08, 2010 180 inline bool isPeriodicDof(int globalDofIndex) Thomas Witkowski committed Jun 10, 2009 181 { Thomas Witkowski committed Jan 17, 2011 182 183 return (periodicDofAssociations.count(globalDofIndex) > 0 && periodicDofAssociations[globalDofIndex].size() > 0); Thomas Witkowski committed Jul 08, 2010 184 185 } 186 187 188 /// Returns true, if the DOF (global index) is a periodic DOF for the given /// boundary type. inline bool isPeriodicDof(int globalDofIndex, BoundaryType type) Thomas Witkowski committed Jul 08, 2010 189 190 { return (periodicDof[type].count(globalDofIndex) > 0); Thomas Witkowski committed Apr 07, 2009 191 192 } 193 194 /// Return true, if the given DOF is owned by the rank. If false, the DOF is in /// rank's partition, but is owned by some other rank. Thomas Witkowski committed Jun 08, 2010 195 196 inline bool getIsRankDof(DegreeOfFreedom dof) { Thomas Witkowski committed Jan 18, 2011 197 198 199 200 if (isRankDof.count(dof)) return isRankDof[dof]; return false; Thomas Witkowski committed Jun 08, 2010 201 } Thomas Witkowski committed Dec 08, 2009 202 Thomas Witkowski committed Mar 17, 2011 203 204 205 206 207 inline DofIndexToBool& getIsRankDof() { return isRankDof; } Thomas Witkowski committed Jun 08, 2010 208 inline long getLastMeshChangeIndex() Thomas Witkowski committed Jun 10, 2009 209 { Thomas Witkowski committed Jun 08, 2010 210 return lastMeshChangeIndex; Thomas Witkowski committed Apr 07, 2009 211 } Thomas Witkowski committed Apr 03, 2009 212 Thomas Witkowski committed Jun 08, 2010 213 214 215 216 inline int getRstart() { return rstart; } Thomas Witkowski committed Jul 09, 2009 217 Thomas Witkowski committed Jun 08, 2010 218 inline int getMpiRank() Thomas Witkowski committed Jun 11, 2009 219 { Thomas Witkowski committed Jun 08, 2010 220 return mpiRank; Thomas Witkowski committed Jun 11, 2009 221 } Thomas Witkowski committed Apr 03, 2009 222 Thomas Witkowski committed Jan 14, 2011 223 224 225 226 227 inline int getMpiSize() { return mpiSize; } Thomas Witkowski committed Jun 08, 2010 228 229 230 inline MPI::Intracomm& getMpiComm() { return mpiComm; Thomas Witkowski committed Apr 03, 2009 231 232 } Thomas Witkowski committed Jun 08, 2010 233 inline RankToDofContainer& getSendDofs() Thomas Witkowski committed Jun 10, 2009 234 { Thomas Witkowski committed Jun 08, 2010 235 return sendDofs; Thomas Witkowski committed Apr 07, 2009 236 237 } Thomas Witkowski committed Jun 08, 2010 238 inline RankToDofContainer& getRecvDofs() Thomas Witkowski committed Jun 11, 2009 239 { Thomas Witkowski committed Jun 08, 2010 240 return recvDofs; Thomas Witkowski committed Jun 11, 2009 241 } 242 Thomas Witkowski committed Sep 28, 2009 243 // Writes all data of this object to an output stream. Thomas Witkowski committed Jan 07, 2011 244 void serialize(ostream &out); Thomas Witkowski committed Jun 11, 2009 245 Thomas Witkowski committed Sep 28, 2009 246 // Reads the object data from an input stream. Thomas Witkowski committed Jan 07, 2011 247 void deserialize(istream &in); Thomas Witkowski committed Jun 08, 2010 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 /** \brief * This function must be used if the values of a DOFVector must be synchronised * over all ranks. That means, that each rank sends the values of the DOFs, which * are owned by the rank and lie on an interior bounday, to all other ranks also * having these DOFs. * * This function must be used, for example, after the lineary system is solved, or * after the DOFVector is set by some user defined functions, e.g., initial * solution functions. */ void synchVector(DOFVector &vec); /** \brief * Works in the same way as the function above defined for DOFVectors. Due to * performance, this function does not call \ref synchVector for each DOFVector, * but instead sends all values of all DOFVectors all at once. */ void synchVector(SystemVector &vec); Thomas Witkowski committed Jan 20, 2011 268 269 void check3dValidMesh(); Thomas Witkowski committed Apr 08, 2011 270 271 272 273 274 void setBoundaryDofRequirement(Flag flag) { createBoundaryDofFlag = flag; } Thomas Witkowski committed Apr 08, 2011 275 276 277 278 279 BoundaryDofInfo& getBoundaryDofInfo() { return boundaryDofInfo; } Thomas Witkowski committed Apr 21, 2011 280 281 void getAllBoundaryDofs(DofContainer& dofs); Thomas Witkowski committed Jun 11, 2009 282 protected: Thomas Witkowski committed Jun 11, 2009 283 /** \brief Thomas Witkowski committed Jan 26, 2010 284 * Determines the interior boundaries, i.e. boundaries between ranks, and stores Thomas Witkowski committed Jun 11, 2009 285 286 * all information about them in \ref interiorBoundary. */ Thomas Witkowski committed Oct 19, 2009 287 void createInteriorBoundaryInfo(); Thomas Witkowski committed Jun 11, 2009 288 Thomas Witkowski committed Nov 29, 2010 289 290 291 292 293 void updateInteriorBoundaryInfo(); void createMeshElementData(); void createBoundaryData(); Thomas Witkowski committed Jan 26, 2010 294 Thomas Witkowski committed Apr 08, 2011 295 296 void createBoundaryDofs(); Thomas Witkowski committed Jun 11, 2009 297 298 299 /// Removes all macro elements from the mesh that are not part of ranks partition. void removeMacroElements(); 300 /// Updates the local and global DOF numbering after the mesh has been changed. Thomas Witkowski committed Nov 30, 2010 301 void updateLocalGlobalNumbering(); Thomas Witkowski committed Jun 11, 2009 302 303 304 305 306 307 /** \brief * Creates to all dofs in rank's partition that are on a periodic boundary the * mapping from dof index to the other periodic dof indices. This information * is stored in \ref periodicDof. */ Thomas Witkowski committed Oct 14, 2009 308 309 void createPeriodicMap(); Thomas Witkowski committed Nov 25, 2010 310 311 void createMacroElementInfo(); 312 313 void updateMacroElementInfo(); Thomas Witkowski committed Jan 19, 2010 314 315 316 317 318 319 320 321 322 /** \brief * Checks for all given interior boundaries if the elements fit together on both * sides of the boundaries. If this is not the case, the mesh is adapted. Because * refinement of a certain element may forces the refinement of other elements, * it is not guaranteed that all rank's meshes fit together after this function * terminates. Hence, it must be called until a stable mesh refinement is reached. * * \param[in] allBound Defines a map from rank to interior boundaries which * should be checked. 323 324 325 326 * * \return If the mesh has been changed by this function, it returns true. * Otherwise, it returns false, i.e., the given interior boundaries * fit together on both sides. Thomas Witkowski committed Jan 19, 2010 327 328 */ bool checkAndAdaptBoundary(RankToBoundMap &allBound); Thomas Witkowski committed Nov 26, 2010 329 330 331 332 333 334 335 336 /** \brief * Checks if is required to repartition the mesh. If this is the case, a new * partition will be created and the mesh will be redistributed between the * ranks. */ void repartitionMesh(); Thomas Witkowski committed Mar 28, 2011 337 338 /// Sets \ref isRankDof to all matrices and rhs vectors in a given /// stationary problem. Thomas Witkowski committed Apr 21, 2011 339 void setRankDofs(ProblemStatSeq *probStat); Thomas Witkowski committed Mar 28, 2011 340 Thomas Witkowski committed Jul 18, 2010 341 342 343 /// Sets \ref isRankDof to all matrices and rhs vectors in all stationary problems. void setRankDofs(); Thomas Witkowski committed Jun 29, 2010 344 345 346 347 /// Removes all periodic boundary condition information from all matrices and /// vectors of all stationary problems and from the mesh itself. void removePeriodicBoundaryConditions(); Thomas Witkowski committed Feb 08, 2010 348 // Removes all periodic boundaries from a given boundary map. Thomas Witkowski committed Jun 29, 2010 349 void removePeriodicBoundaryConditions(BoundaryIndexMap& boundaryMap); Thomas Witkowski committed Feb 08, 2010 350 Thomas Witkowski committed Sep 28, 2009 351 /// Writes a vector of dof pointers to an output stream. Thomas Witkowski committed Jan 07, 2011 352 void serialize(ostream &out, DofContainer &data); Thomas Witkowski committed Sep 28, 2009 353 354 /// Reads a vector of dof pointers from an input stream. Thomas Witkowski committed Jan 07, 2011 355 356 void deserialize(istream &in, DofContainer &data, map &dofMap); Thomas Witkowski committed Sep 28, 2009 357 358 /// Writes a \ref RankToDofContainer to an output stream. Thomas Witkowski committed Jan 07, 2011 359 void serialize(ostream &out, RankToDofContainer &data); Thomas Witkowski committed Sep 28, 2009 360 361 /// Reads a \ref RankToDofContainer from an input stream. Thomas Witkowski committed Jan 07, 2011 362 363 void deserialize(istream &in, RankToDofContainer &data, map &dofMap); Thomas Witkowski committed Sep 29, 2009 364 Thomas Witkowski committed Oct 26, 2009 365 /// Writes a periodic dof mapping to an output stream. Thomas Witkowski committed Jan 07, 2011 366 void serialize(ostream &out, PeriodicDofMap &data); Thomas Witkowski committed Oct 26, 2009 367 Thomas Witkowski committed Jan 07, 2011 368 void serialize(ostream &out, map >& data); Thomas Witkowski committed Jul 08, 2010 369 Thomas Witkowski committed Oct 26, 2009 370 /// Reads a periodic dof mapping from an input stream. Thomas Witkowski committed Jan 07, 2011 371 void deserialize(istream &in, PeriodicDofMap &data); Thomas Witkowski committed Oct 26, 2009 372 Thomas Witkowski committed Jan 07, 2011 373 void deserialize(istream &in, map >& data); Thomas Witkowski committed Jul 08, 2010 374 Thomas Witkowski committed Sep 29, 2009 375 376 /// Writes a mapping from dof pointers to some values to an output stream. template Thomas Witkowski committed Jan 07, 2011 377 void serialize(ostream &out, map &data) Thomas Witkowski committed Sep 29, 2009 378 { 379 380 FUNCNAME("ParallelDomainBase::serialize()"); Thomas Witkowski committed Sep 29, 2009 381 int mapSize = data.size(); 382 SerUtil::serialize(out, mapSize); Thomas Witkowski committed Jan 07, 2011 383 for (typename map::iterator it = data.begin(); Thomas Witkowski committed Sep 29, 2009 384 385 386 it != data.end(); ++it) { int v1 = (*(it->first)); T v2 = it->second; 387 388 SerUtil::serialize(out, v1); SerUtil::serialize(out, v2); Thomas Witkowski committed Sep 29, 2009 389 390 391 392 393 } } /// Reads a mapping from dof pointer to some values from an input stream. template Thomas Witkowski committed Jan 07, 2011 394 395 void deserialize(istream &in, map &data, map &dofMap) Thomas Witkowski committed Sep 29, 2009 396 { Thomas Witkowski committed Oct 02, 2009 397 398 FUNCNAME("ParallelDomainBase::deserialize()"); Thomas Witkowski committed Sep 29, 2009 399 int mapSize = 0; 400 SerUtil::deserialize(in, mapSize); Thomas Witkowski committed Sep 29, 2009 401 402 403 for (int i = 0; i < mapSize; i++) { int v1 = 0; T v2; 404 405 SerUtil::deserialize(in, v1); SerUtil::deserialize(in, v2); Thomas Witkowski committed Oct 02, 2009 406 407 408 TEST_EXIT_DBG(dofMap.count(v1) != 0)("Cannot find DOF %d in map!\n", v1); Thomas Witkowski committed Sep 29, 2009 409 410 411 data[dofMap[v1]] = v2; } } Thomas Witkowski committed Nov 30, 2010 412 Thomas Witkowski committed Apr 03, 2009 413 protected: Thomas Witkowski committed Mar 28, 2011 414 /// List of all stationary problems that are managed by this mesh distributor. Thomas Witkowski committed Apr 21, 2011 415 vector problemStat; Thomas Witkowski committed Feb 08, 2010 416 Thomas Witkowski committed Mar 28, 2011 417 418 419 /// If true, the mesh distributor is already initialized; bool initialized; Thomas Witkowski committed Apr 03, 2009 420 421 422 423 424 425 426 427 428 429 430 431 432 433 /// The rank of the current process. int mpiRank; /// Overall number of processes. int mpiSize; /** \brief * MPI communicator collected all processes, which should * be used for calculation. The Debug procces is not included * in this communicator. */ MPI::Intracomm mpiComm; /// Name of the problem (as used in the init files) Thomas Witkowski committed Jan 07, 2011 434 string name; Thomas Witkowski committed Apr 03, 2009 435 Thomas Witkowski committed Apr 15, 2009 436 437 438 /// Finite element space of the problem. FiniteElemSpace *feSpace; Thomas Witkowski committed Apr 03, 2009 439 440 441 /// Mesh of the problem. Mesh *mesh; 442 443 444 445 446 447 448 /** \brief * A refinement manager that should be used on the mesh. It is used to refine * elements at interior boundaries in order to fit together with elements on the * other side of the interior boundary. */ RefinementManager *refineManager; Thomas Witkowski committed Jun 26, 2009 449 450 451 /// Info level. int info; Thomas Witkowski committed Jan 24, 2011 452 453 /// Pointer to a mesh partitioner that is used to partition the mesh to the ranks. MeshPartitioner *partitioner; Thomas Witkowski committed Apr 03, 2009 454 455 /// Weights for the elements, i.e., the number of leaf elements within this element. Thomas Witkowski committed Jan 07, 2011 456 map elemWeights; Thomas Witkowski committed Apr 03, 2009 457 458 /** \brief 459 460 * Stores to every macro element index the number of the rank that owns this * macro element. Thomas Witkowski committed Apr 03, 2009 461 */ Thomas Witkowski committed Jan 24, 2011 462 map partitionMap; Thomas Witkowski committed Apr 03, 2009 463 Thomas Witkowski committed Apr 07, 2009 464 /// Number of DOFs in the rank mesh. Thomas Witkowski committed Sep 25, 2009 465 int nRankDofs; Thomas Witkowski committed Apr 27, 2009 466 467 /// Number of DOFs in the whole domain. Thomas Witkowski committed Jun 08, 2010 468 469 int nOverallDofs; Thomas Witkowski committed Nov 29, 2010 470 471 472 473 // Data structure to store all sub-objects of all elements of the macro mesh. ElementObjects elObjects; // Maps to each macro element index a pointer to the corresponding element. Thomas Witkowski committed Jan 07, 2011 474 map macroElIndexMap; Thomas Witkowski committed Nov 29, 2010 475 476 // Maps to each macro element index the type of this element. Thomas Witkowski committed Jan 07, 2011 477 map macroElIndexTypeMap; Thomas Witkowski committed Nov 29, 2010 478 Thomas Witkowski committed Apr 27, 2009 479 /** \brief Thomas Witkowski committed Jun 15, 2009 480 481 482 483 484 485 486 487 488 489 490 491 * Defines the interior boundaries of the domain that result from partitioning * the whole mesh. Contains only the boundaries, which are owned by the rank, i.e., * the object gives for every neighbour rank i the boundaries this rank owns and * shares with rank i. */ InteriorBoundary myIntBoundary; /** \brief * Defines the interior boundaries of the domain that result from partitioning * the whole mesh. Contains only the boundaries, which are not owned by the rank, * i.e., the object gives for every neighbour rank i the boundaries that are * owned by rank i and are shared with this rank. Thomas Witkowski committed Apr 27, 2009 492 */ Thomas Witkowski committed Jun 15, 2009 493 InteriorBoundary otherIntBoundary; Thomas Witkowski committed Apr 27, 2009 494 Thomas Witkowski committed Oct 14, 2009 495 /** \brief 496 497 * Defines the periodic boundaries with other ranks. Periodic boundaries have * no owner, as it is the case of interior boundaries. Thomas Witkowski committed Oct 14, 2009 498 499 500 */ InteriorBoundary periodicBoundary; Thomas Witkowski committed Jun 10, 2009 501 /** \brief Thomas Witkowski committed Mar 17, 2011 502 503 * This map contains for each rank the list of DOFs the current rank must send * to exchange solution DOFs at the interior boundaries. Thomas Witkowski committed Jun 10, 2009 504 */ Thomas Witkowski committed Jun 29, 2009 505 RankToDofContainer sendDofs; Thomas Witkowski committed Jun 10, 2009 506 507 /** \brief Thomas Witkowski committed Mar 17, 2011 508 * This map contains on each rank the list of DOFs from which the current rank Thomas Witkowski committed Jan 19, 2010 509 510 * will receive DOF values (i.e., this are all DOFs at an interior boundary). The * DOF indices are given in rank's local numbering. Thomas Witkowski committed Jun 10, 2009 511 */ Thomas Witkowski committed Jun 29, 2009 512 RankToDofContainer recvDofs; Thomas Witkowski committed Jun 11, 2009 513 514 /// Maps local to global dof indices. Thomas Witkowski committed Jan 19, 2010 515 DofMapping mapLocalGlobalDofs; Thomas Witkowski committed Jun 11, 2009 516 Thomas Witkowski committed Jul 20, 2009 517 /// Maps local dof indices to real dof indices. Thomas Witkowski committed Jun 09, 2010 518 DofMapping mapLocalDofIndex; Thomas Witkowski committed Jun 11, 2009 519 520 521 522 523 524 /** \brief * Maps all DOFs in ranks partition to a bool value. If it is true, the DOF is * owned by the rank. Otherwise, its an interior boundary DOF that is owned by * another rank. */ Thomas Witkowski committed Aug 13, 2009 525 526 DofIndexToBool isRankDof; 527 /** \brief 528 529 530 531 * If periodic boundaries are used, this map stores, for each periodic boundary * type, for all DOFs in rank's partition (that are on periodic boundaries), the * corresponding mapped periodic DOFs. The mapping is defined by using global * dof indices. 532 */ Thomas Witkowski committed Oct 14, 2009 533 PeriodicDofMap periodicDof; 534 535 536 537 538 /** \brief * If periodic boundaries are used, this map stores to each periodic DOF in rank's * partition the set of periodic boundaries the DOF is associated to. In 2D, most * DOFs are only on one periodic boundary. Only, e.g., in a box with all boundaries Thomas Witkowski committed Jan 18, 2011 539 * being periodic, the four corners are associated by two different boundaries. 540 */ Thomas Witkowski committed Jan 07, 2011 541 map > periodicDofAssociations; Thomas Witkowski committed Jul 08, 2010 542 Thomas Witkowski committed Jan 19, 2011 543 544 545 546 547 /// This set of values must be interchanged between ranks when the mesh is /// repartitioned. vector*> interchangeVectors; Thomas Witkowski committed Sep 25, 2009 548 /// Is the index of the first row of the linear system, which is owned by the rank. Thomas Witkowski committed Jul 03, 2009 549 int rstart; Thomas Witkowski committed Jul 09, 2009 550 551 552 553 554 555 556 557 /** \brief * If the problem definition has been read from a serialization file, this * variable is true, otherwise it is false. This variable is used to stop the * initialization function, if the problem definition has already been read from * a serialization file. */ bool deserialized; Thomas Witkowski committed Dec 08, 2009 558 559 560 561 /// Denotes whether there exists a filewriter for this object. bool writeSerializationFile; Thomas Witkowski committed Nov 26, 2010 562 563 564 /// If true, it is possible to repartition the mesh during computations. bool repartitioningAllowed; 565 /// Stores the number of mesh changes that must lie in between to repartitionings. Thomas Witkowski committed Dec 20, 2010 566 567 int repartitionIthChange; 568 569 /// Counts the number of mesh changes after the last mesh repartitioning was done. int nMeshChangesAfterLastRepartitioning; Thomas Witkowski committed Dec 03, 2010 570 571 572 573 /// Countes the number of mesh repartitions that were done. Till now, this /// variable is used only for debug outputs. int repartitioningCounter; Thomas Witkowski committed Dec 03, 2010 574 Thomas Witkowski committed Dec 16, 2010 575 /// Directory name where all debug output files should be written to. Thomas Witkowski committed Jan 07, 2011 576 string debugOutputDir; Thomas Witkowski committed Dec 16, 2010 577 Thomas Witkowski committed Dec 08, 2009 578 579 580 581 582 /** \brief * Stores the mesh change index. This is used to recognize changes in the mesh * structure (e.g. through refinement or coarsening managers). */ long lastMeshChangeIndex; 583 Thomas Witkowski committed Jan 07, 2011 584 map > macroElementNeighbours; Thomas Witkowski committed Nov 25, 2010 585 586 587 /// Store all macro elements of the overall mesh, i.e., before the macro mesh is /// redistributed for the first time. Thomas Witkowski committed Jan 07, 2011 588 vector allMacroElements; 589 Thomas Witkowski committed Apr 08, 2011 590 591 592 593 Flag createBoundaryDofFlag; BoundaryDofInfo boundaryDofInfo; public: Thomas Witkowski committed Apr 21, 2011 594 595 596 /// The boundary DOFs are sorted by subobject entities, i.e., first all /// face DOFs, edge DOFs and to the last vertex DOFs will be set to /// communication structure vectors, \ref sendDofs and \ref recvDofs. Thomas Witkowski committed Apr 08, 2011 597 598 static const Flag BOUNDARY_SUBOBJ_SORTED; Thomas Witkowski committed Apr 21, 2011 599 600 601 602 603 604 605 606 607 /// When boundary DOFs are created, \ref boundaryDofInfo is filled for /// all DOFs that this rank will send to other ranks (thus, rank /// owned DOFs. static const Flag BOUNDARY_FILL_INFO_SEND_DOFS; /// When boundary DOFs are created, \ref boundaryDofInfo is filled for /// all DOFs that this rank will receive from other ranks (thus, DOFs /// that are owned by another rank). static const Flag BOUNDARY_FILL_INFO_RECV_DOFS; Thomas Witkowski committed Apr 08, 2011 608 609 friend class ParallelDebug; Thomas Witkowski committed Apr 03, 2009 610 611 612 }; } 613 #endif // AMDIS_MESHDISTRIBUTOR_H