• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

QCAD_CoupledPoissonSchrodinger.hpp

Go to the documentation of this file.
00001 //*****************************************************************//
00002 //    Albany 2.0:  Copyright 2012 Sandia Corporation               //
00003 //    This Software is released under the BSD license detailed     //
00004 //    in the file "license.txt" in the top-level Albany directory  //
00005 //*****************************************************************//
00006 
00007 #ifndef QCAD_COUPLEDPOISSONSCHRODINGER_H
00008 #define QCAD_COUPLEDPOISSONSCHRODINGER_H
00009 
00010 #include <iostream>
00011 
00012 #include "LOCA.H"
00013 #include "LOCA_Epetra.H"
00014 #include "Epetra_Vector.h"
00015 #include "Epetra_LocalMap.h"
00016 #include "LOCA_Epetra_ModelEvaluatorInterface.H"
00017 #include <NOX_Epetra_MultiVector.H>
00018 
00019 #include "Albany_ModelEvaluator.hpp"
00020 #include "Albany_AbstractDiscretization.hpp"
00021 #include "Albany_Utils.hpp"
00022 #include "Piro_Epetra_StokhosNOXObserver.hpp"
00023 
00024 #include "QCAD_MaterialDatabase.hpp"
00025 
00026 // Utility functions
00027 namespace QCAD {
00028   std::string strdim(const std::string s, const int dim);
00029 }
00030 
00031 
00032 namespace QCAD {
00033 
00038   class CoupledPoissonSchrodinger : public EpetraExt::ModelEvaluator {
00039   public:
00040 
00043 
00044       CoupledPoissonSchrodinger(const Teuchos::RCP<Teuchos::ParameterList>& appParams,
00045         const Teuchos::RCP<const Epetra_Comm>& comm, 
00046         const Teuchos::RCP<const Epetra_Vector>& initial_guess);
00048 
00049     ~CoupledPoissonSchrodinger();
00050 
00051     Teuchos::RCP<const Epetra_Map> get_x_map() const;
00052     Teuchos::RCP<const Epetra_Map> get_f_map() const;
00053     Teuchos::RCP<const Epetra_Map> get_p_map(int l) const;
00054     Teuchos::RCP<const Epetra_Map> get_g_map(int j) const;
00055 
00056     Teuchos::RCP<const Teuchos::Array<std::string> > get_p_names(int l) const;
00057 
00058     Teuchos::RCP<const Epetra_Vector> get_x_init() const;
00059     Teuchos::RCP<const Epetra_Vector> get_x_dot_init() const;
00060     Teuchos::RCP<const Epetra_Vector> get_p_init(int l) const;
00061 
00062     Teuchos::RCP<Epetra_Operator> create_W() const;
00063     Teuchos::RCP<EpetraExt::ModelEvaluator::Preconditioner> create_WPrec() const;
00064 
00065     Teuchos::RCP<Epetra_Operator> create_DgDx_op(int j) const;
00066     Teuchos::RCP<Epetra_Operator> create_DgDx_dot_op(int j) const;
00067 
00068     EpetraExt::ModelEvaluator::InArgs createInArgs() const;
00069     EpetraExt::ModelEvaluator::OutArgs createOutArgs() const;
00070 
00071     void evalModel( const InArgs& inArgs, const OutArgs& outArgs ) const;    
00072 
00073     Teuchos::RCP<Albany::Application> getPoissonApp() const;
00074     Teuchos::RCP<Albany::Application> getSchrodingerApp() const;
00075 
00076     Teuchos::RCP<Albany::AbstractDiscretization> getDiscretization() const { return disc; }
00077 
00078   public:  //as public for QCAD::Solver and QCAD::CoupledPSObserver to use -- maybe make these friends and declare private?
00079     void separateCombinedVector(const Teuchos::RCP<Epetra_Vector>& combinedVector,
00080         Teuchos::RCP<Epetra_Vector>& poisson_part,
00081         Teuchos::RCP<Epetra_MultiVector>& schrodinger_part) const;
00082 
00083     void separateCombinedVector(const Teuchos::RCP<Epetra_Vector>& combinedVector,
00084         Teuchos::RCP<Epetra_Vector>& poisson_part,
00085         Teuchos::RCP<Epetra_MultiVector>& schrodinger_part,
00086         Teuchos::RCP<Epetra_Vector>& eigenvalue_part) const;
00087 
00088     void separateCombinedVector(const Teuchos::RCP<const Epetra_Vector>& combinedVector,
00089         Teuchos::RCP<const Epetra_Vector>& poisson_part,
00090         Teuchos::RCP<const Epetra_MultiVector>& schrodinger_part) const;
00091 
00092     void separateCombinedVector(const Teuchos::RCP<const Epetra_Vector>& combinedVector,
00093         Teuchos::RCP<const Epetra_Vector>& poisson_part,
00094         Teuchos::RCP<const Epetra_MultiVector>& schrodinger_part,
00095         Teuchos::RCP<const Epetra_Vector>& eigenvalue_part) const;
00096     
00097 
00098   private:
00099     Teuchos::RCP<const Teuchos::ParameterList> getValidAppParameters() const;
00100     Teuchos::RCP<const Teuchos::ParameterList> getValidProblemParameters() const;
00101 
00102 
00103     //Solely for testing Jacobian
00104     //void computeResidual(const Teuchos::RCP<const Epetra_Vector>& x,
00105     //       Teuchos::RCP<Epetra_Vector>& f,
00106     //       Teuchos::RCP<Epetra_CrsMatrix>& massMx) const;
00107 
00108 
00109   private:
00110     Teuchos::RCP<const Epetra_Map> disc_map, disc_overlap_map;
00111     Teuchos::RCP<Epetra_Map> combined_SP_map;
00112     Teuchos::RCP<const Epetra_Vector> saved_initial_guess;
00113 
00114     Teuchos::RCP<Albany::Application> poissonApp, schrodingerApp;
00115     Teuchos::RCP<EpetraExt::ModelEvaluator> poissonModel, schrodingerModel;
00116 
00117     Teuchos::RCP<const Epetra_Comm> myComm;
00118 
00119     int nEigenvals;
00120     int num_param_vecs, num_response_vecs;
00121     int num_poisson_param_vecs, num_schrodinger_param_vecs;
00122 
00123     double offset_to_CB; // conduction band = offset_to_CB - poisson_solution
00124 
00126     Teuchos::RCP<QCAD::MaterialDatabase> materialDB;
00127 
00129     int numDims;
00130     double temperature;
00131     double length_unit_in_m;
00132     double energy_unit_in_eV;
00133 
00135     mutable Teuchos::Array<ParamVec> poisson_sacado_param_vec, schrodinger_sacado_param_vec;
00136 
00138     Teuchos::RCP<Albany::AbstractDiscretization> disc;
00139 
00140     bool bVerbose;
00141   };
00142 }
00143 #endif

Generated on Wed Mar 26 2014 18:36:43 for Albany: a Trilinos-based PDE code by  doxygen 1.7.1