OpenFCST: The open-source Fuel Cell Simulation Toolbox
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
app_pemfc_nonisothermal.h
Go to the documentation of this file.
1 //---------------------------------------------------------------------------
2 //
3 // FCST: Fuel Cell Simulation Toolbox
4 //
5 // Copyright (C) 2013 by Energy Systems Design Laboratory, University of Alberta
6 //
7 // This software is distributed under the MIT License.
8 // For more information, see the README file in /doc/LICENSE
9 //
10 // - Class: app_pemfc_nonisothermal.h 21-05-2013
11 // - Description: Class designed to solve a non-isothermal PEMFC model.
12 // - Developers: Madhur Bhaiya
13 // - Id: $Id: app_pemfc_nonisothermal.h 2605 2014-08-15 03:36:44Z secanell $
14 //
15 //---------------------------------------------------------------------------
16 
17 #ifndef _FUELCELL__APP_PEMFC_NONISOTHERMAL__H
18 #define _FUELCELL__APP_PEMFC_NONISOTHERMAL__H
19 
20 //-- OpenFCST
23 
26 #include <layers/catalyst_layer.h>
27 #include <layers/membrane_layer.h>
28 #include <materials/PureGas.h>
29 
37 
44 
45 namespace FuelCell
46 {
47  namespace InitialSolution
48  {
54  template <int dim>
56  :
57  public Function<dim>
58  {
59  public:
64  boost::shared_ptr< FuelCellShop::Geometry::GridBase<dim> > grid,
65  FuelCell::SystemManagement* system_mgmt);
70 
75  void vector_value (const Point<dim> &p,
76  Vector<double> &v) const;
77 
78  private:
81 
83  boost::shared_ptr< FuelCellShop::Geometry::GridBase<dim> > grid;
84 
86  };
87  } //end namespace InitialSolution
88 
89 
90  namespace Application
91  {
92  //---------------------------------------------------------------------------
93  //---------------------------------------------------------------------------
94  //---------------------------------------------------------------------------
114  template <int dim>
116  :
118  {
119  public:
120 
122 
123 
130  AppPemfcNIThermal (boost::shared_ptr<FuelCell::ApplicationCore::ApplicationData> data =
131  boost::shared_ptr<FuelCell::ApplicationCore::ApplicationData> ());
132 
143  virtual void declare_parameters(ParameterHandler& param);
144 
151  virtual void set_parameters(const std::vector<std::string>& name_dvar,
152  const std::vector<double>& value_dvar,
153  ParameterHandler& param) {};
154 
159  void _initialize(ParameterHandler& param);
160 
164  virtual void initialize(ParameterHandler& param);
165 
169  virtual void initialize_solution (FEVector& initial_guess,
170  std::shared_ptr<Function<dim> > initial_function = std::shared_ptr<Function<dim> >());
172 
174 
175 
181  virtual void cell_matrix(FuelCell::ApplicationCore::MatrixVector& cell_matrices,
182  const typename DoFApplication<dim>::CellInfo& cell);
192  virtual void cell_residual(FuelCell::ApplicationCore::FEVector& cell_vector,
193  const typename DoFApplication<dim>::CellInfo& cell);
194 
198  virtual void bdry_matrix(FuelCell::ApplicationCore::MatrixVector& bdry_matrices,
199  const typename DoFApplication<dim>::FaceInfo& bdry_info);
200 
204  virtual void bdry_residual(FuelCell::ApplicationCore::FEVector& bdry_vector,
205  const typename DoFApplication<dim>::FaceInfo& bdry_info);
207 
214  virtual void dirichlet_bc(std::map<unsigned int, double>& boundary_values) const;
215 
222  virtual void check_responses();
223 
227  virtual void cell_responses (std::vector<double>& resp,
228  const typename DoFApplication<dim>::CellInfo& info,
234  virtual void global_responses (std::vector<double>& resp,
236 
242  virtual void cell_dresponses_dl(std::vector<std::vector<double> >& /*cell_df_dl*/,
243  const typename DoFApplication<dim>::CellInfo& /*info*/,
244  const FuelCell::ApplicationCore::FEVector& /*sol*/) {};
245 
251  virtual void global_dresponses_dl(std::vector<std::vector<double> >& df_dl,
258  virtual void cell_dresponses_du(std::vector<FuelCell::ApplicationCore::FEVector >& /*cell_df_du*/,
259  const typename DoFApplication<dim>::CellInfo& /*info*/,
260  std::vector<std::vector<double> >& /*src*/) {};
261 
267  virtual void global_dresponses_du(std::vector<FuelCell::ApplicationCore::FEVector >& df_du,
269 
270 
275  virtual double evaluate (const FuelCell::ApplicationCore::FEVectors& src);
276 
281  virtual void data_out(const std::string& filename,
283 
284  protected:
285 
287 
288 
292 
294 
295 
300 
305 
310 
316 
318 
319  boost::shared_ptr< FuelCellShop::Layer::GasDiffusionLayer<dim> > AGDL;
320  boost::shared_ptr< FuelCellShop::Layer::GasDiffusionLayer<dim> > CGDL;
321  boost::shared_ptr< FuelCellShop::Layer::MicroPorousLayer<dim> > AMPL;
322  boost::shared_ptr< FuelCellShop::Layer::MicroPorousLayer<dim> > CMPL;
323  boost::shared_ptr< FuelCellShop::Layer::CatalystLayer<dim> > ACL;
324  boost::shared_ptr< FuelCellShop::Layer::CatalystLayer<dim> > CCL;
325  boost::shared_ptr< FuelCellShop::Layer::MembraneLayer<dim> > ML;
326 
327 
329 
330 
334 
339 
344 
349 
354 
359 
361 
363 
366 
368 
370 
372 
374 
376 
378 
380 
382 
385 
387  std::vector<std::string> design_var;
388 
390  std::vector<double> design_var_value;
391 
392  private:
393 
394  double l_channel;
395 
396  double l_land;
397 
401  double time_k;
402 
408  void set_default_parameters_for_application(ParameterHandler &param)
409  {
410  param.enter_subsection("System management");
411  {
412  param.set("Number of solution variables","5");
413  param.enter_subsection("Solution variables");
414  {
415  param.set("Solution variable 1","oxygen_molar_fraction");
416  param.set("Solution variable 2","water_molar_fraction");
417  param.set("Solution variable 3","protonic_electrical_potential");
418  param.set("Solution variable 4","electronic_electrical_potential");
419  param.set("Solution variable 5","membrane_water_content");
420  param.set("Solution variable 6","temperature_of_REV");
421  }
422  param.leave_subsection();
423 
424  param.enter_subsection("Equations");
425  {
426  param.set("Equation 1","Ficks Transport Equation - oxygen");
427  param.set("Equation 2","Ficks Transport Equation - water");
428  param.set("Equation 3","Proton Transport Equation");
429  param.set("Equation 4","Electron Transport Equation");
430  param.set("Equation 5","Membrane Water Content Transport Equation");
431  param.set("Equation 6","Thermal Transport Equation");
432  }
433  param.leave_subsection();
434  }
435  param.leave_subsection();
436  param.enter_subsection("Discretization");
437  {
438  param.set("Element","FESystem[FE_Q(1)^6]");
439  }
440  param.leave_subsection();
441  }
442  };
443  }
444 }
445 
446 #endif //_FUELCELL__AppPemfcNIThermal_H
This class is used to solve the physical pheonoma on a complete membrane electrode assembly...
Definition: app_pemfc_nonisothermal.h:115
virtual void declare_parameters(ParameterHandler &param)
Declare all parameters that are needed for:
virtual void cell_matrix(FuelCell::ApplicationCore::MatrixVector &cell_matrices, const typename DoFApplication< dim >::CellInfo &cell)
Integration of local bilinear form.
Class used to store, read from file and define the operating conditions for a fuel cell...
Definition: operating_conditions.h:118
FuelCellShop::Material::Oxygen oxygen
The cathode contains oxygen, so we need to create an object oxygen in order to compute viscosity...
Definition: app_pemfc_nonisothermal.h:304
FuelCellShop::Equation::ReactionSourceTerms< dim > reaction_source_terms
ReactionSourceTerms object.
Definition: app_pemfc_nonisothermal.h:353
FuelCellShop::Material::Hydrogen hydrogen
The anode contains hydrogen, so we need to create an object hydrogen in order to compute viscosity...
Definition: app_pemfc_nonisothermal.h:314
std::vector< double > design_var_value
Stores the values of the design variables so that the number can be appended to the ...
Definition: app_pemfc_nonisothermal.h:390
FuelCellShop::PostProcessing::SorptionHeatResponse< dim > sorptionHeat
Definition: app_pemfc_nonisothermal.h:377
FuelCell::OperatingConditions * OC
Operating conditions class object.
Definition: app_pemfc_nonisothermal.h:80
This class assembles source terms corresponding to sorption/desorption of water inside the catalyst l...
Definition: sorption_source_terms.h:101
virtual void dirichlet_bc(std::map< unsigned int, double > &boundary_values) const
Member function used to set dirichlet boundary conditions.
FuelCellShop::Equation::FicksTransportEquation< dim > ficks_water_nitrogen
Definition: app_pemfc_nonisothermal.h:362
double l_channel
Width of the channel.
Definition: app_pemfc_nonisothermal.h:394
FuelCellShop::PostProcessing::ProtonOhmicHeatResponse< dim > protonOhmicHeat
Definition: app_pemfc_nonisothermal.h:373
virtual void global_dresponses_du(std::vector< FuelCell::ApplicationCore::FEVector > &df_du, const FuelCell::ApplicationCore::FEVector &src)
This class is used to evaluate the sensitivities of all responses that do not require looping over ce...
This class deals with Proton Transport Equation.
Definition: proton_transport_equation.h:132
Class used to calculate the current density at the anode catalyst layer.
Definition: response_current_density.h:180
boost::shared_ptr< FuelCellShop::Layer::MicroPorousLayer< dim > > CMPL
Cathode MPL Layer.
Definition: app_pemfc_nonisothermal.h:322
virtual void check_responses()
This class is called by responses to make sure that all responses requested are implemented in either...
boost::shared_ptr< FuelCellShop::Layer::CatalystLayer< dim > > ACL
Anode Catalyst Layer.
Definition: app_pemfc_nonisothermal.h:323
Class used to calculate the heat generated due to HOR inside the anode catalyst layer.
Definition: response_reaction_heat.h:284
virtual void data_out(const std::string &filename, const FuelCell::ApplicationCore::FEVectors &src)
Reimplementation of the routine in the base class BaseApplication in namespace AppFrame so that the r...
virtual void cell_residual(FuelCell::ApplicationCore::FEVector &cell_vector, const typename DoFApplication< dim >::CellInfo &cell)
Integration of the rhs of the equations.
virtual double evaluate(const FuelCell::ApplicationCore::FEVectors &src)
Post-processing.
virtual void global_dresponses_dl(std::vector< std::vector< double > > &df_dl, const FuelCell::ApplicationCore::FEVector &sol)
This class is used to evaluate the sensitivities of all responses that do not require looping over ce...
Class used to calculate the protonic ohmic heat generated in the proton conducting layers...
Definition: response_ohmic_heat.h:258
AppPemfcNIThermal(boost::shared_ptr< FuelCell::ApplicationCore::ApplicationData > data=boost::shared_ptr< FuelCell::ApplicationCore::ApplicationData >())
Constructor.
This class deals with Electron Transport Equation.
Definition: electron_transport_equation.h:128
This class deals with Thermal Transport Equation.
Definition: thermal_transport_equation.h:187
boost::shared_ptr< FuelCellShop::Layer::GasDiffusionLayer< dim > > CGDL
Cathhode GDL Layer.
Definition: app_pemfc_nonisothermal.h:320
This class deals with Membrane Water Content Transport Equation.
Definition: lambda_transport_equation.h:128
boost::shared_ptr< FuelCellShop::Layer::MicroPorousLayer< dim > > AMPL
Anode MPL Layer.
Definition: app_pemfc_nonisothermal.h:321
FuelCellShop::PostProcessing::ElectronOhmicHeatResponse< dim > electronOhmicHeat
Definition: app_pemfc_nonisothermal.h:375
FuelCellShop::PostProcessing::ORRReactionHeatResponse< dim > catReactionHeat
Definition: app_pemfc_nonisothermal.h:379
FuelCell::OperatingConditions OC
Operating conditions.
Definition: app_pemfc_nonisothermal.h:290
FuelCellShop::Equation::SorptionSourceTerms< dim > sorption_source_terms
SorptionSourceTerms object.
Definition: app_pemfc_nonisothermal.h:358
Class used to calculate the amount of water sorbed inside the catalyst layer.
Definition: response_water_sorption.h:106
virtual void cell_dresponses_du(std::vector< FuelCell::ApplicationCore::FEVector > &, const typename DoFApplication< dim >::CellInfo &, std::vector< std::vector< double > > &)
This class is used to evaluate the derivative of all the functionals that require looping over cells ...
Definition: app_pemfc_nonisothermal.h:258
virtual void bdry_residual(FuelCell::ApplicationCore::FEVector &bdry_vector, const typename DoFApplication< dim >::FaceInfo &bdry_info)
Assemble local boundary residual.
void set_default_parameters_for_application(ParameterHandler &param)
Function to modify the default values of the data file in order to make sure that the equations match...
Definition: app_pemfc_nonisothermal.h:408
This class is created for the objects handed to the mesh loops.
Definition: mesh_loop_info_objects.h:544
boost::shared_ptr< FuelCellShop::Layer::GasDiffusionLayer< dim > > AGDL
Anode GDL Layer.
Definition: app_pemfc_nonisothermal.h:319
virtual void cell_responses(std::vector< double > &resp, const typename DoFApplication< dim >::CellInfo &info, const FuelCell::ApplicationCore::FEVector &sol)
Compute the value of all objective function and constraints.
This class describes properties of pure oxygen.
Definition: PureGas.h:974
FuelCellShop::Equation::FicksTransportEquation< dim > ficks_oxygen_nitrogen
Definition: app_pemfc_nonisothermal.h:360
FuelCellShop::PostProcessing::WaterSorptionResponse< dim > waterSorption
Definition: app_pemfc_nonisothermal.h:383
boost::shared_ptr< FuelCellShop::Layer::CatalystLayer< dim > > CCL
Cathode Catalyst Layer.
Definition: app_pemfc_nonisothermal.h:324
std::vector< MatrixBlock< FullMatrix< double > > > MatrixVector
The matrix vector used in the mesh loops.
Definition: matrix_block.h:102
std::vector< std::string > design_var
Stores the design variable names so that the name can be appended to the .vtk file name...
Definition: app_pemfc_nonisothermal.h:387
FuelCellShop::Material::WaterVapor water
The cathode/anode contains water vapour, so we need to create an object water in order to compute vis...
Definition: app_pemfc_nonisothermal.h:299
This class describes properties of pure nitrogen.
Definition: PureGas.h:1027
double l_land
Width of the landing.
Definition: app_pemfc_nonisothermal.h:396
Class used to calculate the heat generated due to ORR inside the cathode catalyst layer...
Definition: response_reaction_heat.h:103
virtual void bdry_matrix(FuelCell::ApplicationCore::MatrixVector &bdry_matrices, const typename DoFApplication< dim >::FaceInfo &bdry_info)
Assemble local boundary matrix.
FuelCellShop::Equation::ElectronTransportEquation< dim > electron_transport
ElectronTransportEquation object.
Definition: app_pemfc_nonisothermal.h:348
std::map< unsigned int, double > boundary_values
Variable to store boundary values, so they only need to be computed once per mesh refinement...
Definition: block_matrix_application.h:321
FuelCellShop::Equation::FicksTransportEquation< dim > ficks_water_hydrogen
Definition: app_pemfc_nonisothermal.h:364
boost::shared_ptr< FuelCellShop::Geometry::GridBase< dim > > grid
Geometry class object.
Definition: app_pemfc_nonisothermal.h:83
virtual void initialize_solution(FEVector &initial_guess, std::shared_ptr< Function< dim > > initial_function=std::shared_ptr< Function< dim > >())
Initialize nonlinear solution.
virtual void cell_dresponses_dl(std::vector< std::vector< double > > &, const typename DoFApplication< dim >::CellInfo &, const FuelCell::ApplicationCore::FEVector &)
This class is used to evaluate the derivative of all the functionals that require looping over cells ...
Definition: app_pemfc_nonisothermal.h:242
This class assembles the reaction source terms for all other transport equations, if there&#39;s any...
Definition: reaction_source_terms.h:37
FuelCellShop::Equation::ProtonTransportEquation< dim > proton_transport
ProtonTransportEquation object.
Definition: app_pemfc_nonisothermal.h:338
IMPORTANT: Add all new solution variables and equations here !
Definition: system_management.h:300
double time_k
Time constant for sorption isotherm [1/s].
Definition: app_pemfc_nonisothermal.h:401
void _initialize(ParameterHandler &param)
Set up how many equations are needed and read in parameters for the parameter handler in order to ini...
FuelCell Geometry information class.
Definition: geometry.h:92
FuelCellShop::Equation::LambdaTransportEquation< dim > lambda_transport
LambdaTransportEquation object.
Definition: app_pemfc_nonisothermal.h:343
Class used to calculate the electronic ohmic heat generated in the electron conducting layers...
Definition: response_ohmic_heat.h:102
AppPemfcNIThermalIC(FuelCell::OperatingConditions *OC, boost::shared_ptr< FuelCellShop::Geometry::GridBase< dim > > grid, FuelCell::SystemManagement *system_mgmt)
Constructor.
Class used to calculate the heat generated due to sorption of water inside the catalyst layer...
Definition: response_sorption_heat.h:102
virtual void set_parameters(const std::vector< std::string > &name_dvar, const std::vector< double > &value_dvar, ParameterHandler &param)
Function called by optimization loop in order to set the values in the ParameterHandler to the new de...
Definition: app_pemfc_nonisothermal.h:151
void vector_value(const Point< dim > &p, Vector< double > &v) const
This is the member function that computes the value of the initial solution for a given point...
FuelCellShop::PostProcessing::ORRCurrentDensityResponse< dim > ORRCurrent
Definition: app_pemfc_nonisothermal.h:369
BlockVector< double > FEVector
The vector class used by applications.
Definition: application_data.h:46
The data type used in function calls of Application.
Definition: fe_vectors.h:59
Application handling matrices and assembling the linear system to solve the sensitivity equations...
Definition: optimization_block_matrix_application.h:49
This class deals with Fick&#39;s Transport Equation.
Definition: ficks_transport_equation.h:132
FuelCellShop::PostProcessing::HORReactionHeatResponse< dim > anReactionHeat
Definition: app_pemfc_nonisothermal.h:381
This class describes properties of pure hydrogen.
Definition: PureGas.h:1081
virtual void global_responses(std::vector< double > &resp, const FuelCell::ApplicationCore::FEVector &sol)
This class is used to evaluate all responses that do not require looping over cells.
FuelCellShop::Equation::ThermalTransportEquation< dim > thermal_transport
ThermalTransportEquation object.
Definition: app_pemfc_nonisothermal.h:333
boost::shared_ptr< FuelCellShop::Layer::MembraneLayer< dim > > ML
Membrane Layer.
Definition: app_pemfc_nonisothermal.h:325
boost::shared_ptr< ApplicationData > data
Object for auxiliary data.
Definition: application_base.h:348
This class is used when solving the problem using Newton&#39;s method to provide an initial solution...
Definition: app_pemfc_nonisothermal.h:55
FuelCellShop::Material::Nitrogen nitrogen
The cathode contains nitrogen as solvent, so we need to create an object nitrogen in order to compute...
Definition: app_pemfc_nonisothermal.h:309
virtual void initialize(ParameterHandler &param)
Call the other initialize routines from the inherited classes.
Class used to calculate the ORR current density and coverages (if provided in the kinetic model) by t...
Definition: response_current_density.h:59
FuelCell::SystemManagement * system
Definition: app_pemfc_nonisothermal.h:85
FuelCellShop::PostProcessing::HORCurrentDensityResponse< dim > HORCurrent
Definition: app_pemfc_nonisothermal.h:371
This class describes properties of pure WaterVapor.
Definition: PureGas.h:1134