vtf-logo

shells/parallel/ShellManagerParallel.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00004 // 
00005 //                                   Fehmi Cirak
00006 //                        California Institute of Technology
00007 //                           (C) 2004 All Rights Reserved
00008 //
00009 // <LicenseText>
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         // Facet class for parallelized shells 
00025         // Provides a basic interface (with limited functionality) for shells library
00026         // SMTYPE is ShellManagerBasic or ShellManagerFragmented    
00027         // 
00028 
00029     public:
00030         ShellManagerParallel(const std::string& controlFileName, MPI_Comm comm);
00031         virtual ~ShellManagerParallel();
00032     
00033         // initialization
00034         virtual void computeMassPrepareAdvance();
00035 
00036         // time integration primitives
00037         virtual void internalExternalForces();
00038 
00039         // combined time integration primitives
00040         virtual void advance();
00041 
00042         // print the shell mesh and data
00043         virtual void printDataParallel(bool flush=false);    
00044         
00045         // print interface mesh and pressure for debugging purposes
00046         virtual void printIFaceMeshPressureParallel();
00047         
00048         virtual void checkPointingParallel(unsigned fileIDFirst=0);
00049         virtual void restartParallel(unsigned fileIDFirst=0);
00050 
00051         // copy and assignment constructors - not implemented
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     // implementation
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         // instantiate a parallelizer
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         // prepare the communication
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         // exchange mass
00110         _parallelizer->exchange(parallel::MShellParallelizer::mass);
00111     }
00112     
00113 
00114     template <typename SMTYPE>
00115     void ShellManagerParallel<SMTYPE>::internalExternalForces() 
00116     {
00117         SMTYPE::internalExternalForces();
00118         
00119         // exchange residual
00120         assert(_parallelizer!=NULL);
00121         _parallelizer->exchange(parallel::MShellParallelizer::residual);
00122     }
00123     
00124     
00125     template <typename SMTYPE>
00126     void ShellManagerParallel<SMTYPE>::advance()
00127     {
00128         // newmark predictor 
00129         SMTYPE::predictAndEnforceBC();
00130         
00131         // compute residuals
00132         SMTYPE::internalExternalForces();
00133         
00134         // exchange residual
00135         _parallelizer->exchange(parallel::MShellParallelizer::residual);
00136         
00137         // newmark corrector
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         // data is printed in dependence of the input control parameter 
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

Generated on Fri Aug 24 13:00:24 2007 for SFC Thin-Shell Finite Element Solver by  doxygen 1.4.7