00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SHELLMANAGERPARALLEL_H
00014 #define SHELLMANAGERPARALLEL_H
00015 #include <mpi.h>
00016 #include "MShellParallelizer.h"
00017
00018
00019 namespace shells {
00020
00021 template <typename SMTYPE>
00022 class ShellManagerParallel : public SMTYPE {
00023
00024
00025
00026
00027
00028
00029 public:
00030 ShellManagerParallel(const std::string& controlFileName, MPI_Comm comm);
00031 virtual ~ShellManagerParallel();
00032
00033
00034 virtual void computeMassPrepareAdvance();
00035
00036
00037 virtual void internalExternalForces();
00038
00039
00040 virtual void advance();
00041
00042
00043 virtual void printDataParallel(bool flush=false);
00044
00045
00046 virtual void printIFaceMeshPressureParallel();
00047
00048 virtual void checkPointingParallel(unsigned fileIDFirst=0);
00049 virtual void restartParallel(unsigned fileIDFirst=0);
00050
00051
00052 private:
00053 ShellManagerParallel(const ShellManagerParallel &);
00054 const ShellManagerParallel & operator=(const ShellManagerParallel &);
00055
00056 protected:
00057 int communicatorRank(){
00058 int rank;
00059 MPI_Comm_rank(_comm, &rank);
00060 return rank;
00061 }
00062
00063 private:
00064 MPI_Comm _comm;
00065 parallel::MShellParallelizer *_parallelizer;
00066 };
00067
00068
00069
00070
00071 template <typename SMTYPE>
00072 ShellManagerParallel<SMTYPE>::ShellManagerParallel(const std::string& controlFileName,
00073 MPI_Comm comm) :
00074 SMTYPE(controlFileName), _comm(comm)
00075 {
00076 assert(_comm != MPI_COMM_NULL);
00077
00078
00079 int size;
00080 MPI_Comm_size(_comm, &size);
00081 if (size>1) {
00082 _parallelizer = new parallel::MShellParallelizer(_comm, SMTYPE::mShell());
00083 assert(_parallelizer!=NULL);
00084 } else {
00085 assert(false);
00086 }
00087
00088 SMTYPE::mShell()->initializeComputation();
00089
00090
00091 _parallelizer->initializeCommunication();
00092 }
00093
00094
00095 template <typename SMTYPE>
00096 ShellManagerParallel<SMTYPE>::~ShellManagerParallel()
00097 {
00098 if (_parallelizer!=NULL) {
00099 delete _parallelizer;
00100 }
00101 }
00102
00103
00104 template <typename SMTYPE>
00105 void ShellManagerParallel<SMTYPE>::computeMassPrepareAdvance()
00106 {
00107 SMTYPE::computeMassPrepareAdvance();
00108
00109
00110 _parallelizer->exchange(parallel::MShellParallelizer::mass);
00111 }
00112
00113
00114 template <typename SMTYPE>
00115 void ShellManagerParallel<SMTYPE>::internalExternalForces()
00116 {
00117 SMTYPE::internalExternalForces();
00118
00119
00120 assert(_parallelizer!=NULL);
00121 _parallelizer->exchange(parallel::MShellParallelizer::residual);
00122 }
00123
00124
00125 template <typename SMTYPE>
00126 void ShellManagerParallel<SMTYPE>::advance()
00127 {
00128
00129 SMTYPE::predictAndEnforceBC();
00130
00131
00132 SMTYPE::internalExternalForces();
00133
00134
00135 _parallelizer->exchange(parallel::MShellParallelizer::residual);
00136
00137
00138 SMTYPE::correct();
00139
00140 SMTYPE::incrementCurrentTimeAndStep();
00141
00142 return;
00143 }
00144
00145
00146 template <typename SMTYPE>
00147 void ShellManagerParallel<SMTYPE>::printDataParallel(bool flush)
00148 {
00149 int myRank;
00150 MPI_Comm_rank(_comm, &myRank);
00151
00152
00153 SMTYPE::printData(flush, myRank);
00154
00155 return;
00156 }
00157
00158 template <typename SMTYPE>
00159 void ShellManagerParallel<SMTYPE>::printIFaceMeshPressureParallel()
00160 {
00161 int myRank;
00162 MPI_Comm_rank(_comm, &myRank);
00163
00164 SMTYPE::printIFaceMeshPressure(myRank);
00165 }
00166
00167
00168 template <typename SMTYPE>
00169 void ShellManagerParallel<SMTYPE>::checkPointingParallel(unsigned fileIDFirst)
00170 {
00171 int myRank;
00172 MPI_Comm_rank(_comm, &myRank);
00173
00174 SMTYPE::checkPointing(fileIDFirst, myRank);
00175
00176 return;
00177 }
00178
00179
00180 template <typename SMTYPE>
00181 void ShellManagerParallel<SMTYPE>::restartParallel(unsigned fileIDFirst)
00182 {
00183 int myRank;
00184 MPI_Comm_rank(_comm, &myRank);
00185
00186 SMTYPE::restart(fileIDFirst, myRank);
00187
00188 return;
00189 }
00190 }
00191
00192 #endif