ParallelDomainBase.h 22.1 KB
 Thomas Witkowski committed Apr 03, 2009 1 2 3 4 5 6 // ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == ==  Thomas Witkowski committed Sep 28, 2009 7 // == TU Dresden ==  Thomas Witkowski committed Apr 03, 2009 8 // == ==  Thomas Witkowski committed Sep 28, 2009 9 10 11 // == Institut fr Wissenschaftliches Rechnen == // == Zellescher Weg 12-14 == // == 01069 Dresden ==  Thomas Witkowski committed Apr 03, 2009 12 13 14 15 // == germany == // == == // ============================================================================ // == ==  Thomas Witkowski committed Sep 28, 2009 16 // == https://gforge.zih.tu-dresden.de/projects/amdis/ ==  Thomas Witkowski committed Apr 03, 2009 17 18 19 // == == // ============================================================================  Thomas Witkowski committed Jul 09, 2009 20 21 22 23 /** \file ParallelDomainBase.h */ #ifndef AMDIS_PARALLELDOMAINBASE_H #define AMDIS_PARALLELDOMAINBASE_H  Thomas Witkowski committed Apr 03, 2009 24 25 26  #include  Thomas Witkowski committed Jun 11, 2009 27 #include  Thomas Witkowski committed Apr 03, 2009 28 29 30 31 #include #include "ProblemTimeInterface.h" #include "ProblemIterationInterface.h"  Thomas Witkowski committed Apr 15, 2009 32 #include "FiniteElemSpace.h"  Thomas Witkowski committed Apr 03, 2009 33 #include "AdaptInfo.h"  Thomas Witkowski committed Apr 27, 2009 34 #include "InteriorBoundary.h"  Thomas Witkowski committed Sep 29, 2009 35 #include "Serializer.h"  Thomas Witkowski committed Jun 12, 2009 36 37 #include "AMDiS_fwd.h"  Thomas Witkowski committed Jun 09, 2009 38 39 #include "petsc.h" #include "petscsys.h"  Thomas Witkowski committed Apr 07, 2009 40 #include "petscao.h"  Thomas Witkowski committed Apr 03, 2009 41 42 #include "mpi.h"  Thomas Witkowski committed Jul 09, 2009 43 44 #include "Global.h"  Thomas Witkowski committed Apr 03, 2009 45 46 namespace AMDiS {  Thomas Witkowski committed Dec 01, 2009 47 48 49 50 51 52 53  struct DofPtrSortFct { bool operator() (const DegreeOfFreedom *dof0, const DegreeOfFreedom *dof1) { return (*dof0 < *dof1); } };  Thomas Witkowski committed Apr 03, 2009 54 55  class ParMetisPartitioner;  Thomas Witkowski committed Jun 26, 2009 56  class ParallelDomainBase : public ProblemIterationInterface,  Thomas Witkowski committed Jul 09, 2009 57  public ProblemTimeInterface  Thomas Witkowski committed Apr 03, 2009 58  {  Thomas Witkowski committed Jun 29, 2009 59 60 61 62 63 64 65 66 67 68 69 70 71  private: /// Defines a mapping type from DOFs to rank numbers. typedef std::map DofToRank; /// Defines a mapping type from DOFs to a set of rank numbers. typedef std::map > DofToPartitions; /// Defines a mapping type from rank numbers to sets of DOFs. typedef std::map RankToDofContainer; /// Defines a mapping type from DOF indices to DOF indices. typedef std::map DofMapping;  Thomas Witkowski committed Aug 13, 2009 72 73 74  /// Defines a mapping type from DOFs to boolean values. typedef std::map DofToBool;  Thomas Witkowski committed Jun 29, 2009 75  /// Defines a mapping type from DOF indices to boolean values.  Thomas Witkowski committed Aug 13, 2009 76  typedef std::map DofIndexToBool;  Thomas Witkowski committed Jun 29, 2009 77   Thomas Witkowski committed Jul 01, 2009 78 79 80 81 82 83  /// Defines a mapping type from rank numbers to sets of coordinates. typedef std::map > > RankToCoords; /// Forward type (it maps rank numbers to the interior boundary objects). typedef InteriorBoundary::RankToBoundMap RankToBoundMap;  Thomas Witkowski committed Jul 01, 2009 84 85  typedef std::map ElementIdxToDofs;  Thomas Witkowski committed Jul 07, 2009 86 87  typedef std::map DofIndexMap;  Thomas Witkowski committed Oct 14, 2009 88  typedef std::map > PeriodicDofMap;  Thomas Witkowski committed Jan 19, 2010 89 90  typedef std::vector MeshCodeVec;  Thomas Witkowski committed Oct 14, 2009 91   Thomas Witkowski committed Apr 03, 2009 92  public:  Thomas Witkowski committed Sep 29, 2009 93  ParallelDomainBase(ProblemIterationInterface *iterationIF,  Thomas Witkowski committed Jun 29, 2009 94 95 96  ProblemTimeInterface *timeIF, FiniteElemSpace *feSpace, RefinementManager *refineManager);  Thomas Witkowski committed Apr 03, 2009 97   Thomas Witkowski committed Jun 26, 2009 98  virtual ~ParallelDomainBase() {}  Thomas Witkowski committed Apr 03, 2009 99   Thomas Witkowski committed Jun 11, 2009 100  virtual void initParallelization(AdaptInfo *adaptInfo);  Thomas Witkowski committed Apr 03, 2009 101   Thomas Witkowski committed Oct 19, 2009 102  virtual void exitParallelization(AdaptInfo *adaptInfo);  Thomas Witkowski committed Jun 26, 2009 103   Thomas Witkowski committed Oct 14, 2009 104  void updateDofAdmins();  Thomas Witkowski committed Jul 08, 2009 105   Thomas Witkowski committed Jun 26, 2009 106 107 108 109 110 111 112  /** \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 113 114 115 116 117 118  /// Set for each element on the partitioning level the number of leaf elements. double setElemWeights(AdaptInfo *adaptInfo); void partitionMesh(AdaptInfo *adaptInfo);  Thomas Witkowski committed Jul 10, 2009 119 120 121 122 123  virtual void setTime(AdaptInfo *adaptInfo) { if (timeIF) timeIF->setTime(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 124   Thomas Witkowski committed Jul 10, 2009 125 126 127 128 129  virtual void initTimestep(AdaptInfo *adaptInfo) { if (timeIF) timeIF->initTimestep(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 130   Thomas Witkowski committed Jul 10, 2009 131 132 133 134 135  virtual void closeTimestep(AdaptInfo *adaptInfo) { if (timeIF) timeIF->closeTimestep(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 136   Thomas Witkowski committed Jul 10, 2009 137  virtual void solveInitialProblem(AdaptInfo *adaptInfo)  Thomas Witkowski committed Aug 31, 2009 138  {  Thomas Witkowski committed Jul 10, 2009 139 140 141  if (timeIF) timeIF->solveInitialProblem(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 142   Thomas Witkowski committed Jul 10, 2009 143 144 145 146 147  virtual void transferInitialSolution(AdaptInfo *adaptInfo) { if (timeIF) timeIF->transferInitialSolution(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 148   Thomas Witkowski committed Jun 10, 2009 149 150  virtual void beginIteration(AdaptInfo *adaptInfo) {  Thomas Witkowski committed Apr 07, 2009 151 152 153  iterationIF->beginIteration(adaptInfo); }  Thomas Witkowski committed Jul 09, 2009 154  virtual Flag oneIteration(AdaptInfo *adaptInfo, Flag toDo = FULL_ITERATION);  Thomas Witkowski committed Apr 07, 2009 155   Thomas Witkowski committed Dec 08, 2009 156 157  virtual Flag buildAndAdapt(AdaptInfo *adaptInfo, Flag toDo);  Thomas Witkowski committed Jun 10, 2009 158 159  virtual void endIteration(AdaptInfo *adaptInfo) {  Thomas Witkowski committed Apr 07, 2009 160 161  iterationIF->endIteration(adaptInfo); }  Thomas Witkowski committed Apr 03, 2009 162   Thomas Witkowski committed Jul 09, 2009 163 164  virtual void solve() {}  Thomas Witkowski committed Jun 11, 2009 165 166 167 168  virtual int getNumProblems() { return 0; }  Thomas Witkowski committed Apr 03, 2009 169   Thomas Witkowski committed Jul 20, 2009 170  inline virtual std::string getName()  Thomas Witkowski committed Jun 10, 2009 171  {  Thomas Witkowski committed Apr 03, 2009 172 173 174  return name; }  Thomas Witkowski committed Apr 07, 2009 175  /// Returns \ref nRankDOFs, the number of DOFs in the rank mesh.  Thomas Witkowski committed Sep 25, 2009 176  int getNumberRankDofs()  Thomas Witkowski committed Jun 10, 2009 177  {  Thomas Witkowski committed Sep 25, 2009 178  return nRankDofs;  Thomas Witkowski committed Apr 07, 2009 179 180  }  Thomas Witkowski committed Aug 31, 2009 181  void solvePetscMatrix(SystemVector &vec);  Thomas Witkowski committed Jul 09, 2009 182   Thomas Witkowski committed Jun 11, 2009 183 184 185 186  virtual ProblemStatBase *getProblem(int number = 0) { return NULL; }  Thomas Witkowski committed Apr 03, 2009 187   Thomas Witkowski committed Sep 28, 2009 188  // Writes all data of this object to an output stream.  Thomas Witkowski committed Sep 25, 2009 189  virtual void serialize(std::ostream &out);  Thomas Witkowski committed Jun 11, 2009 190   Thomas Witkowski committed Sep 28, 2009 191  // Reads the object data from an input stream.  Thomas Witkowski committed Sep 25, 2009 192  virtual void deserialize(std::istream &in);  Thomas Witkowski committed Jun 11, 2009 193 194  protected:  Thomas Witkowski committed Jun 11, 2009 195  /** \brief  Thomas Witkowski committed Jan 26, 2010 196  * Determines the interior boundaries, i.e. boundaries between ranks, and stores  Thomas Witkowski committed Jun 11, 2009 197 198  * all information about them in \ref interiorBoundary. */  Thomas Witkowski committed Oct 19, 2009 199  void createInteriorBoundaryInfo();  Thomas Witkowski committed Jun 11, 2009 200   Thomas Witkowski committed Jan 26, 2010 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216  /** \brief * Deterimes the interior boundaries between ranks, that are based on the * neighbourhood information of the macro elements. That means that in 2d the * function search for all edge based interior boundaries and in 3d for all face * based interior boundaries. This function cannot find boundaries of substructure * elements, i.e. vertex boundaries in 2d and vertex and edge boundaries in 3d. */ void createMacroElementInteriorBoundaryInfo(); /** \brief * Determines all interior boundaries between rank that consist of element's * substructures. In 2d these may be only vertices. In 3d there may be also * interior boundaries consisting of either a whole edge or of a single vertex. */ void createSubstructureInteriorBoundaryInfo();  Thomas Witkowski committed Jun 11, 2009 217 218 219  /// Removes all macro elements from the mesh that are not part of ranks partition. void removeMacroElements();  220 221  /// Creates from a macro mesh a correct local and global DOF index numbering. void createLocalGlobalNumbering();  Thomas Witkowski committed Jun 16, 2009 222   223 224  /// Updates the local and global DOF numbering after the mesh has been changed. void updateLocalGlobalNumbering();  Thomas Witkowski committed Jun 11, 2009 225   226 227 228 229 230  /** \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 231 232  void createPeriodicMap();  Thomas Witkowski committed Jul 09, 2009 233 234  /** \brief * This function create new mappings from local to global indices,  Thomas Witkowski committed Jan 19, 2010 235  * \ref mapLocalGlobalDofs, and from local to dof indices, \ref mapLocalToDofIndex.  Thomas Witkowski committed Jul 09, 2009 236 237 238 239 240 241 242 243 244 245 246 247 248 249  * Furthermore, using the first argument the dof indices in ranks partition are * changed. * * \param[in] rankDofsNewLocalIndex Map from dof pointers of all dofs in rank * to new dof indices. * \param[in] rankOwnedDofsNewLocalIndex Map from dof pointers of dofs owned by * the rank to the new local index. * \param[in] rankDofsNewGlobalIndex Map from dof pointers of all dofs in rank * to the new global index. */ void createLocalMappings(DofIndexMap &rankDofsNewLocalIndex, DofIndexMap &rankOwnedDofsNewLocalIndex, DofIndexMap &rankDofsNewGlobalIndex);  Thomas Witkowski committed Jun 11, 2009 250 251  /** \brief * This function traverses the whole mesh, i.e. before it is really partitioned,  Thomas Witkowski committed Jun 15, 2009 252 253 254  * and collects information about which DOF corresponds to which rank. Can only * be used, if \ref partitionVec is set correctly. This is only the case, when * the macro mesh is partitioned.  Thomas Witkowski committed Jun 11, 2009 255  *  Thomas Witkowski committed Jan 19, 2010 256 257 258 259 260  * \param[out] partitionDOFs Stores to each DOF pointer the set of ranks the DOF * is part of. * \param[out] rankDOFs Stores all rank DOFs. * \param[out] boundaryDOFs Stores all DOFs in ranks partition that are on an * interior boundary but correspond to another rank.  Thomas Witkowski committed Jun 11, 2009 261  */  Thomas Witkowski committed Oct 02, 2009 262  void createDofMemberInfo(DofToPartitions& partitionDofs,  Thomas Witkowski committed Jul 03, 2009 263 264  DofContainer& rankOwnedDofs, DofContainer& rankAllDofs,  Thomas Witkowski committed Aug 13, 2009 265 266  DofToRank& boundaryDofs, DofToBool& vertexDof);  Thomas Witkowski committed Jun 22, 2009 267   Thomas Witkowski committed Jan 19, 2010 268 269 270 271 272 273 274 275 276 277  /** \brief * Create a PETSc matrix and PETSc vectors. The given DOF matrices are used to * create the nnz structure of the PETSc matrix and the values are transfered to it. * The given DOF vectors are used to the the values of the PETSc rhs vector. * * \param[in] mat * \param[in] vec */ void fillPetscMatrix(Matrix *mat, SystemVector *vec);  Thomas Witkowski committed Dec 08, 2009 278  /// Takes a dof matrix and sends the values to the global petsc matrix.  Thomas Witkowski committed Jul 09, 2009 279 280 281  void setDofMatrix(DOFMatrix* mat, int dispMult = 1, int dispAddRow = 0, int dispAddCol = 0);  Thomas Witkowski committed Dec 08, 2009 282  /// Takes a dof vector and sends its values to a given petsc vector.  Thomas Witkowski committed Oct 05, 2009 283 284  void setDofVector(Vec& petscVec, DOFVector* vec, int disMult = 1, int dispAdd = 0);  Thomas Witkowski committed Jul 09, 2009 285   Thomas Witkowski committed Jan 19, 2010 286 287 288 289 290 291 292  /** \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 * to update the dof numberings and mappings on all rank due to the new mesh * structure. */  Thomas Witkowski committed Dec 08, 2009 293 294  void checkMeshChange();  Thomas Witkowski committed Jan 19, 2010 295 296 297 298 299 300 301 302 303 304 305 306 307 308  /** \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. * 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. * * \param[in] allBound Defines a map from rank to interior boundaries which * should be checked. */ bool checkAndAdaptBoundary(RankToBoundMap &allBound);  Thomas Witkowski committed Dec 01, 2009 309  void dbgCreateElementMap(ElementIdxToDofs &elMap);  Thomas Witkowski committed Jul 01, 2009 310   Thomas Witkowski committed Dec 01, 2009 311  void dbgTestElementMap(ElementIdxToDofs &elMap);  Thomas Witkowski committed Jul 01, 2009 312   Thomas Witkowski committed Dec 01, 2009 313  void dbgTestInteriorBoundary();  Thomas Witkowski committed Jun 11, 2009 314   Thomas Witkowski committed Jun 22, 2009 315 316 317  /** \brief * This function is used for debugging only. It traverses all interior boundaries * and compares the dof indices on them with the dof indices of the boundarys  Thomas Witkowski committed Jan 19, 2010 318  * neighbours. The function fails, when dof indices on an interior boundary do  Thomas Witkowski committed Jun 22, 2009 319  * not fit together.  Thomas Witkowski committed Jul 08, 2009 320 321 322  * * \param printCoords If true, the coords of all common dofs are printed to * the screen.  Thomas Witkowski committed Jun 22, 2009 323  */  Thomas Witkowski committed Dec 01, 2009 324  void dbgTestCommonDofs(bool printCoords = false);  Thomas Witkowski committed Jun 11, 2009 325   Thomas Witkowski committed Oct 19, 2009 326 327  /** \brief * This function is used for debugging only. It prints all information from  Thomas Witkowski committed Jan 19, 2010 328  * the local to global dof mapping, see \ref mapLocalGlobalDofs.  Thomas Witkowski committed Oct 19, 2009 329 330 331  * * \param rank If specified, only the information from the given rank is printed. */  332  void printMapLocalGlobal(int rank = -1);  Thomas Witkowski committed Oct 19, 2009 333 334 335 336 337 338 339  /** \brief * This function is used for debugging only. It prints all information about * the periodic mapping of dofs, that are on periodic boundaries. * * \param rank If specified, only the information from the given rank is printed. */  340 341 342 343 344 345 346 347 348 349 350 351  void printMapPeriodic(int rank = -1); /** \brief * This function is used for debugging only. It prints information about dofs * in rank's partition. * * \param rank If specified, only the information from the given * rank is printed. * \param rankDofs List of all dofs in ranks partition that are owned by rank. * \param rankAllDofs List of all dofs in ranks partition. */ void printRankDofs(int rank, DofContainer& rankDofs, DofContainer& rankAllDofs);  Thomas Witkowski committed Oct 19, 2009 352   Thomas Witkowski committed Aug 17, 2009 353 354 355 356 357 358 359  /** \brief * This functions create a Paraview file with the macro mesh where the elements * are colored by the partition they are part of. This function can be used for * debugging. */ void writePartitioningMesh(std::string filename);  Thomas Witkowski committed Aug 31, 2009 360  /** \brief  Thomas Witkowski committed Jan 26, 2010 361  * This function must be used if the values of a DOFVector must be synchronised  Thomas Witkowski committed Aug 31, 2009 362 363  * 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  Thomas Witkowski committed Jan 26, 2010 364  * having these DOFs.  Thomas Witkowski committed Aug 31, 2009 365 366  * * This function must be used, for example, after the lineary system is solved, or  Thomas Witkowski committed Jan 26, 2010 367  * after the DOFVector is set by some user defined functions, e.g., initial  Thomas Witkowski committed Aug 31, 2009 368  * solution functions.  Thomas Witkowski committed Jan 26, 2010 369 370 371 372 373 374 375  */ 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.  Thomas Witkowski committed Aug 31, 2009 376  */  Thomas Witkowski committed Jan 26, 2010 377  void synchVector(SystemVector &vec);  Thomas Witkowski committed Aug 31, 2009 378   Thomas Witkowski committed Sep 28, 2009 379 380 381 382 383 384 385 386 387 388 389 390 391  /// Writes a vector of dof pointers to an output stream. void serialize(std::ostream &out, DofContainer &data); /// Reads a vector of dof pointers from an input stream. void deserialize(std::istream &in, DofContainer &data, std::map &dofMap); /// Writes a \ref RankToDofContainer to an output stream. void serialize(std::ostream &out, RankToDofContainer &data); /// Reads a \ref RankToDofContainer from an input stream. void deserialize(std::istream &in, RankToDofContainer &data, std::map &dofMap);  Thomas Witkowski committed Sep 29, 2009 392   Thomas Witkowski committed Oct 26, 2009 393 394 395 396 397 398  /// Writes a periodic dof mapping to an output stream. void serialize(std::ostream &out, PeriodicDofMap &data); /// Reads a periodic dof mapping from an input stream. void deserialize(std::istream &in, PeriodicDofMap &data);  Thomas Witkowski committed Sep 29, 2009 399 400 401 402 403  /// Writes a mapping from dof pointers to some values to an output stream. template void serialize(std::ostream &out, std::map &data) { int mapSize = data.size();  404  SerUtil::serialize(out, mapSize);  Thomas Witkowski committed Sep 29, 2009 405 406 407 408  for (typename std::map::iterator it = data.begin(); it != data.end(); ++it) { int v1 = (*(it->first)); T v2 = it->second;  409 410  SerUtil::serialize(out, v1); SerUtil::serialize(out, v2);  Thomas Witkowski committed Sep 29, 2009 411 412 413 414 415 416 417 418  } } /// Reads a mapping from dof pointer to some values from an input stream. template void deserialize(std::istream &in, std::map &data, std::map &dofMap) {  Thomas Witkowski committed Oct 02, 2009 419 420  FUNCNAME("ParallelDomainBase::deserialize()");  Thomas Witkowski committed Sep 29, 2009 421  int mapSize = 0;  422  SerUtil::deserialize(in, mapSize);  Thomas Witkowski committed Sep 29, 2009 423 424 425  for (int i = 0; i < mapSize; i++) { int v1 = 0; T v2;  426 427  SerUtil::deserialize(in, v1); SerUtil::deserialize(in, v2);  Thomas Witkowski committed Oct 02, 2009 428 429 430  TEST_EXIT_DBG(dofMap.count(v1) != 0)("Cannot find DOF %d in map!\n", v1);  Thomas Witkowski committed Sep 29, 2009 431 432 433 434  data[dofMap[v1]] = v2; } }  Thomas Witkowski committed Dec 01, 2009 435 436  inline void orderDofs(const DegreeOfFreedom* dof0, const DegreeOfFreedom* dof1,  Thomas Witkowski committed Jul 01, 2009 437 438 439  const DegreeOfFreedom* dof2, DofContainer &vec) {  Thomas Witkowski committed Dec 01, 2009 440  DofPtrSortFct dofPtrSort;  Thomas Witkowski committed Jul 01, 2009 441  vec.resize(3);  Thomas Witkowski committed Dec 01, 2009 442 443 444 445 446  vec[0] = dof0; vec[1] = dof1; vec[2] = dof2; sort(vec.begin(), vec.end(), dofPtrSort); }  Thomas Witkowski committed Jul 01, 2009 447   Thomas Witkowski committed Dec 01, 2009 448 449 450 451 452 453 454 455 456 457 458 459 460  inline void orderDofs(const DegreeOfFreedom* dof0, const DegreeOfFreedom* dof1, const DegreeOfFreedom* dof2, const DegreeOfFreedom* dof3, DofContainer &vec) { DofPtrSortFct dofPtrSort; vec.resize(4); vec[0] = dof0; vec[1] = dof1; vec[2] = dof2; vec[3] = dof3; sort(vec.begin(), vec.end(), dofPtrSort);  Thomas Witkowski committed Jul 01, 2009 461 462  }  Thomas Witkowski committed Oct 19, 2009 463 464 465 466 467 468 469 470  inline void printColValues(int row, std::vector& cols, std::vector& values) { for (int i = 0; i < static_cast(cols.size()); i++) std::cout << "Mat[" << row << "][" << cols[i] << "] = " << values[i] << "\n"; }  Thomas Witkowski committed Apr 03, 2009 471  protected:  Thomas Witkowski committed Apr 07, 2009 472 473 474 475 476 477  /// ProblemIterationInterface *iterationIF; /// ProblemTimeInterface *timeIF;  Thomas Witkowski committed Apr 03, 2009 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493  /// 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) std::string name;  Thomas Witkowski committed Apr 15, 2009 494 495 496  /// Finite element space of the problem. FiniteElemSpace *feSpace;  Thomas Witkowski committed Apr 03, 2009 497 498 499  /// Mesh of the problem. Mesh *mesh;  500 501 502 503 504 505 506  /** \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 507 508 509  /// Info level. int info;  Thomas Witkowski committed Apr 03, 2009 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529  /// Pointer to the paritioner which is used to devide a mesh into partitions. ParMetisPartitioner *partitioner; /// Weights for the elements, i.e., the number of leaf elements within this element. std::map elemWeights; /// Is true, if the mesh was not partitioned before, otherwise it's false. bool initialPartitionMesh; /** \brief * Stores to every coarse element index the number of the partition it * corresponds to. */ std::map partitionVec; /** \brief * Stores an old partitioning of elements. To every element index the number * of the parition it corresponds to is stored. */ std::map oldPartitionVec;  Thomas Witkowski committed Apr 07, 2009 530   Thomas Witkowski committed Sep 25, 2009 531  /// Petsc's matrix structure.  Thomas Witkowski committed Jun 09, 2009 532 533  Mat petscMatrix;  Thomas Witkowski committed Sep 25, 2009 534 535 536 537 538  /** \brief * Petsc's vector structures for the rhs vector, the solution vector and a * temporary vector for calculating the final residuum. */ Vec petscRhsVec, petscSolVec, petscTmpVec;  Thomas Witkowski committed Jun 09, 2009 539   Thomas Witkowski committed Apr 07, 2009 540  /// Number of DOFs in the rank mesh.  Thomas Witkowski committed Sep 25, 2009 541  int nRankDofs;  Thomas Witkowski committed Apr 27, 2009 542 543  /** \brief  Thomas Witkowski committed Jun 15, 2009 544 545 546 547 548 549 550 551 552 553 554 555  * 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 556  */  Thomas Witkowski committed Jun 15, 2009 557  InteriorBoundary otherIntBoundary;  Thomas Witkowski committed Apr 27, 2009 558   Thomas Witkowski committed Oct 14, 2009 559 560 561 562 563  /** \brief * */ InteriorBoundary periodicBoundary;  Thomas Witkowski committed Jun 10, 2009 564 565 566 567  /** \brief * 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 29, 2009 568  RankToDofContainer sendDofs;  Thomas Witkowski committed Jun 10, 2009 569 570  /** \brief  Thomas Witkowski committed Jan 19, 2010 571 572 573  * This map contains for each rank the list of DOFs from which the current rank * 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 574  */  Thomas Witkowski committed Jun 29, 2009 575  RankToDofContainer recvDofs;  Thomas Witkowski committed Jun 11, 2009 576 577  /// Maps local to global dof indices.  Thomas Witkowski committed Jan 19, 2010 578  DofMapping mapLocalGlobalDofs;  Thomas Witkowski committed Jun 11, 2009 579   Thomas Witkowski committed Jul 20, 2009 580  /// Maps local dof indices to real dof indices.  Thomas Witkowski committed Jul 08, 2009 581  DofMapping mapLocalToDofIndex;  Thomas Witkowski committed Jun 11, 2009 582 583 584 585 586 587  /** \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 588 589  DofIndexToBool isRankDof;  Thomas Witkowski committed Oct 02, 2009 590 591 592 593  /** \brief * Maps every dof pointer in ranks macro mesh to a boolean variable indicating * wheather this dof is a vertex dof (true) or not (false). */  Thomas Witkowski committed Aug 13, 2009 594  DofToBool vertexDof;  Thomas Witkowski committed Jul 03, 2009 595   596 597 598 599 600  /** \brief * If periodic boundaries are used, this map stores to each dof in rank's * partition, that is on periodic boundaries, the corresponding periodic dofs. * The mapping is defined by using global dof indices. */  Thomas Witkowski committed Oct 14, 2009 601 602  PeriodicDofMap periodicDof;  Thomas Witkowski committed Sep 25, 2009 603  /// Is the index of the first row of the linear system, which is owned by the rank.  Thomas Witkowski committed Jul 03, 2009 604  int rstart;  Thomas Witkowski committed Jul 09, 2009 605   Thomas Witkowski committed Sep 25, 2009 606 607 608 609  /** \brief * Number of components of the equation. Is used to calculate the exact number * of rows in the the overall linear system. */  Thomas Witkowski committed Jul 09, 2009 610  int nComponents;  Thomas Witkowski committed Jul 23, 2009 611   Thomas Witkowski committed Sep 25, 2009 612  /// Number of rows of the whole linear system that are stored on this rank.  Thomas Witkowski committed Jul 23, 2009 613 614  int nRankRows;  Thomas Witkowski committed Sep 25, 2009 615  /// Overall number of the rows in the lineary system.  Thomas Witkowski committed Jul 23, 2009 616  int nOverallRows;  617 618 619 620 621 622 623 624  /** \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 625 626 627 628 629 630  /** \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;  Thomas Witkowski committed Apr 03, 2009 631 632 633  }; }  Thomas Witkowski committed Jul 09, 2009 634 #endif // AMDIS_PARALLELDOMAINBASE_H