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 "SundanceFieldWriterBase.hpp"
00032 #include "PlayaExceptions.hpp"
00033 #include "SundanceOut.hpp"
00034 #include "PlayaTabs.hpp"
00035 
00036 
00037 using namespace Sundance;
00038 using namespace Sundance;
00039 using namespace Sundance;
00040 using namespace Teuchos;
00041 
00042 
00043 FieldWriterBase::FieldWriterBase(const std::string& filename) 
00044   : filename_(filename),
00045     mesh_(),
00046     nProc_(0), 
00047     myRank_(-1),
00048     meshID_(-1),
00049     comments_(),
00050     pointScalarFields_(),
00051     cellScalarFields_(),
00052     pointVectorFields_(),
00053     cellVectorFields_(),
00054     pointScalarNames_(),
00055     cellScalarNames_(),
00056     pointVectorNames_(),
00057     cellVectorNames_(),
00058     undefinedValue_(0.0)
00059 {;}
00060 
00061 
00062 void FieldWriterBase::impersonateParallelProc(int nProc, int rank)
00063 {
00064   nProc_ = nProc;
00065   myRank_ = rank;
00066 }
00067 
00068 int FieldWriterBase::nProc() const
00069 {
00070   if (nProc_ < 1) return mesh().comm().getNProc(); 
00071   return nProc_;
00072 }
00073 
00074 int FieldWriterBase::myRank() const
00075 {
00076   if (myRank_ < 0) return mesh().comm().getRank(); 
00077   return myRank_;
00078 }
00079 
00080 
00081 
00082 
00083 void FieldWriterBase::addMesh(const Mesh& mesh) 
00084 {
00085   if (meshID_ < 0)
00086     {
00087       mesh_ = mesh;
00088       meshID_ = mesh.id();
00089     }
00090                      
00091   TEUCHOS_TEST_FOR_EXCEPTION(meshID_ != mesh.id(), std::runtime_error,
00092                      "FieldWriterBase::setMesh(): inconsistent meshes: "
00093                      "existing mesh has meshID=" << meshID_ << ", newly "
00094                      "added mesh has meshID=" << mesh.id());
00095 }
00096 
00097 void FieldWriterBase::addField(const std::string& name, 
00098                                const RCP<FieldBase>& expr) 
00099 {
00100 
00101   std::string fieldName = name;
00102 
00103   if (expr->numElems() > 1)
00104     {
00105       
00106       
00107 
00108     std::cout << "WARNING! : expr->numElems() > 1 , FieldWriterBase::addField only VTK can plot vector field " << std::endl;
00109     std::cout << "WARNING! : All expressions(in the list of the expressions) must be of the same kind!!! " << std::endl;
00110     
00111     
00112     if (expr->isPointData()){
00113       pointVectorFields_.append(expr);
00114       pointVectorNames_.append(fieldName);
00115     }else{
00116       cellVectorFields_.append(expr);
00117       cellVectorNames_.append(fieldName);
00118     }
00119 
00120     } 
00121   else if (expr->isPointData()) 
00122     {
00123       
00124       pointScalarFields_.append(expr);
00125       pointScalarNames_.append(fieldName);
00126     }
00127   else if (expr->isCellData())
00128     {
00129       
00130       cellScalarFields_.append(expr);
00131       cellScalarNames_.append(fieldName);
00132     }
00133 }
00134 
00135 void FieldWriterBase::addCommentLine(const std::string& line) 
00136 {
00137   comments_.append(line);
00138 }
00139 
00140 
00141 
00142 
00143 
00144