00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _MERGESOLVER_H_
00014 #define _MERGESOLVER_H_
00015
00016 #include "LinearSolver.H"
00017 #include "parstream.H"
00018 #include "BiCGStabSolver.H"
00019 #include "LevelData.H"
00020 #include "SPMD.H"
00021 #include "NamespaceHeader.H"
00022
00023
00024
00025
00026
00027
00028 template <class T>
00029 class MergeSolver : public BiCGStabSolver<LevelData<T> >
00030 {
00031 public:
00032
00033 MergeSolver();
00034
00035 virtual ~MergeSolver()
00036 {
00037 }
00038
00039
00040
00041
00042
00043 virtual void setHomogeneous(bool a_homogeneous)
00044 {
00045 BiCGStabSolver<LevelData<T> >::setHomogeneous(a_homogeneous);
00046 }
00047
00048 virtual void define(LinearOp<LevelData<T> >* a_operator, bool a_homogeneous = false)
00049 {
00050 BiCGStabSolver<LevelData<T> >::define(a_operator, a_homogeneous);
00051 }
00052
00053 virtual void setConvergenceMetrics(Real a_metric, Real a_tolerance)
00054 {
00055 BiCGStabSolver<LevelData<T> >::setConvergenceMetrics(a_metric, a_tolerance);
00056 }
00057
00058
00059 virtual void solve(LevelData<T>& a_phi, const LevelData<T>& a_rhs);
00060
00061 protected:
00062
00063 #ifdef CH_MPI
00064 MPI_Comm m_comm;
00065 #endif
00066 };
00067
00068
00069 template <class T>
00070 MergeSolver<T>::MergeSolver()
00071 {
00072 #ifdef CH_MPI
00073 MPI_Group proc0, cworld;
00074 int members[1] =
00075 {
00076 0
00077 };
00078 int err;
00079 err = MPI_Comm_group(Chombo_MPI::comm, &cworld);
00080 err = MPI_Group_incl(cworld , 1, members, &proc0);
00081 err = MPI_Comm_create(Chombo_MPI::comm, proc0, &m_comm);
00082 #endif
00083 }
00084
00085
00086 template <class T>
00087 void MergeSolver<T>::solve(LevelData<T>& a_phi, const LevelData<T>& a_rhs)
00088 {
00089 CH_TIME("MergeSolver::solve");
00090 DisjointBoxLayout dbl = a_phi.disjointBoxLayout();
00091 Box region;
00092 int numPts=0;
00093 for (LayoutIterator lit = dbl.layoutIterator(); lit.ok(); ++lit)
00094 {
00095 region.minBox(dbl[lit]);
00096 numPts+=dbl[lit].numPts();
00097 }
00098 if (region.numPts() == numPts)
00099 {
00100
00101 Vector<Box> newBoxes(1, region);
00102 Vector<int> newProc(1,0);
00103 DisjointBoxLayout newDBL(newBoxes, newProc, dbl.physDomain());
00104 LevelData<T> phi(newDBL, a_phi.nComp(), a_phi.ghostVect());
00105 LevelData<T> rhs(newDBL, a_rhs.nComp(), a_rhs.ghostVect());
00106 a_phi.copyTo(phi);
00107 a_rhs.copyTo(rhs);
00108 #ifdef CH_MPI
00109 MPI_Comm save=Chombo_MPI::comm;
00110 Chombo_MPI::comm = m_comm;
00111 #endif
00112 if (procID() == 0)
00113 BiCGStabSolver<LevelData<T> >::solve(phi, rhs);
00114 #ifdef CH_MPI
00115 Chombo_MPI::comm = save;
00116 #endif
00117 phi.copyTo(a_phi);
00118 }
00119 else
00120 {
00121 BiCGStabSolver<LevelData<T> >::solve(a_phi, a_rhs);
00122 }
00123 }
00124
00125
00126
00127 #include "NamespaceFooter.H"
00128 #endif