00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "Epetra_Export.h"
00032
00033 #include "FEApp_BlockDiscretization.hpp"
00034
00035 #ifdef HAVE_MPI
00036 #include "EpetraExt_MultiMpiComm.h"
00037 #endif
00038
00039 #if SG_ACTIVE
00040
00041 FEApp::BlockDiscretization::BlockDiscretization(
00042 const Teuchos::RCP<const Epetra_Comm>& comm,
00043 const Teuchos::RCP<const FEApp::AbstractDiscretization>& underlyingDisc_,
00044 const Teuchos::RCP<const Stokhos::OrthogPolyBasis<double> >& sg_basis_,
00045 bool makeJacobian) :
00046 underlyingDisc(underlyingDisc_),
00047 sg_basis(sg_basis_)
00048 {
00049
00050 #ifdef HAVE_MPI
00051
00052
00053 unsigned int num_sg_blocks = sg_basis->size();
00054 Teuchos::RCP<EpetraExt::MultiMpiComm> multiComm =
00055 Teuchos::rcp(new EpetraExt::MultiMpiComm(MPI_COMM_WORLD,
00056 comm->NumProc(),
00057 num_sg_blocks));
00058
00059
00060
00061
00062 int numBlockRows = multiComm->NumTimeSteps();
00063 int myBlockRows = multiComm->NumTimeStepsOnDomain();
00064 int myFirstBlockRow = multiComm->FirstTimeStepOnDomain();
00065 globalComm = multiComm;
00066 #else
00067 int numBlockRows = 1;
00068 int myBlockRows = 1;
00069 int myFirstBlockRow = 0;
00070 globalComm = comm;
00071 #endif
00072
00073
00074
00075
00076
00077
00078
00079
00080 std::vector< std::vector<int> > rowStencil(myBlockRows);
00081 std::vector<int> rowIndex(myBlockRows);
00082 for (int i=0; i < myBlockRows; i++) {
00083 for (int j=0; j < numBlockRows; j++)
00084 rowStencil[i].push_back(-myFirstBlockRow - i + j);
00085 rowIndex[i] = (i + myFirstBlockRow);
00086 }
00087
00088 if (makeJacobian) {
00089
00090 jac = Teuchos::rcp(new EpetraExt::BlockCrsMatrix(
00091 *(underlyingDisc->getJacobianGraph()),
00092 rowStencil, rowIndex, *globalComm));
00093 overlap_jac = Teuchos::rcp(new EpetraExt::BlockCrsMatrix(
00094 *(underlyingDisc->getOverlapJacobianGraph()),
00095 rowStencil, rowIndex, *globalComm));
00096 graph = Teuchos::rcp(&(jac->Graph()),false);
00097 overlap_graph = Teuchos::rcp(&(overlap_jac->Graph()),false);
00098 map = Teuchos::rcp(&(jac->RowMatrixRowMap()),false);
00099 overlap_map = Teuchos::rcp(&(overlap_jac->RowMatrixRowMap()),false);
00100 }
00101 else {
00102 map = Teuchos::rcp(EpetraExt::BlockUtility::GenerateBlockMap(
00103 *(underlyingDisc->getMap()),
00104 rowIndex,
00105 *globalComm));
00106 overlap_map = Teuchos::rcp(EpetraExt::BlockUtility::GenerateBlockMap(
00107 *(underlyingDisc->getOverlapMap()),
00108 rowIndex,
00109 *globalComm));
00110 }
00111 }
00112
00113 FEApp::BlockDiscretization::~BlockDiscretization()
00114 {
00115 }
00116
00117 void
00118 FEApp::BlockDiscretization::createMesh()
00119 {
00120
00121 }
00122
00123 void
00124 FEApp::BlockDiscretization::createMaps()
00125 {
00126
00127 }
00128
00129 void
00130 FEApp::BlockDiscretization::createJacobianGraphs()
00131 {
00132
00133 }
00134
00135 Teuchos::RCP<const FEApp::Mesh>
00136 FEApp::BlockDiscretization::getMesh() const
00137 {
00138 return underlyingDisc->getMesh();
00139 }
00140
00141 Teuchos::RCP<const Epetra_Map>
00142 FEApp::BlockDiscretization::getMap() const
00143 {
00144 return map;
00145 }
00146
00147 Teuchos::RCP<const Epetra_Map>
00148 FEApp::BlockDiscretization::getOverlapMap() const
00149 {
00150 return overlap_map;
00151 }
00152
00153 Teuchos::RCP<const Epetra_CrsGraph>
00154 FEApp::BlockDiscretization::getJacobianGraph() const
00155 {
00156 return graph;
00157 }
00158
00159 Teuchos::RCP<const Epetra_CrsGraph>
00160 FEApp::BlockDiscretization::getOverlapJacobianGraph() const
00161 {
00162 return overlap_graph;
00163 }
00164
00165 int
00166 FEApp::BlockDiscretization::getNumNodesPerElement() const
00167 {
00168 return underlyingDisc->getNumNodesPerElement();
00169 }
00170
00171 Teuchos::RCP<EpetraExt::BlockCrsMatrix>
00172 FEApp::BlockDiscretization::getJacobian()
00173 {
00174 return jac;
00175 }
00176
00177 Teuchos::RCP<EpetraExt::BlockCrsMatrix>
00178 FEApp::BlockDiscretization::getOverlapJacobian()
00179 {
00180 return overlap_jac;
00181 }
00182
00183 #endif // SG_ACTIVE