PlaneBoundaryCondition.hpp
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 #ifndef PLANEBOUNDARYCONDITION_HPP_
00030 #define PLANEBOUNDARYCONDITION_HPP_
00031
00032 #include "AbstractCellPopulationBoundaryCondition.hpp"
00033
00034 #include "ChasteSerialization.hpp"
00035 #include <boost/serialization/base_object.hpp>
00036 #include <boost/serialization/vector.hpp>
00037
00044 template<unsigned DIM>
00045 class PlaneBoundaryCondition : public AbstractCellPopulationBoundaryCondition<DIM>
00046 {
00047 private:
00048
00052 c_vector<double, DIM> mPointOnPlane;
00053
00057 c_vector<double, DIM> mNormalToPlane;
00058
00060 friend class boost::serialization::access;
00067 template<class Archive>
00068 void serialize(Archive & archive, const unsigned int version)
00069 {
00070 archive & boost::serialization::base_object<AbstractCellPopulationBoundaryCondition<DIM> >(*this);
00071 }
00072
00073 public:
00074
00082 PlaneBoundaryCondition(AbstractCellPopulation<DIM>* pCellPopulation,
00083 c_vector<double, DIM> point,
00084 c_vector<double, DIM> normal);
00085
00089 const c_vector<double, DIM>& rGetPointOnPlane() const;
00090
00094 const c_vector<double, DIM>& rGetNormalToPlane() const;
00095
00103 void ImposeBoundaryCondition(const std::vector< c_vector<double, DIM> >& rOldLocations);
00104
00112 bool VerifyBoundaryCondition();
00113
00120 void OutputCellPopulationBoundaryConditionParameters(out_stream& rParamsFile);
00121 };
00122
00123 #include "SerializationExportWrapper.hpp"
00124 EXPORT_TEMPLATE_CLASS_SAME_DIMS(PlaneBoundaryCondition)
00125
00126 namespace boost
00127 {
00128 namespace serialization
00129 {
00133 template<class Archive, unsigned DIM>
00134 inline void save_construct_data(
00135 Archive & ar, const PlaneBoundaryCondition<DIM>* t, const BOOST_PFTO unsigned int file_version)
00136 {
00137
00138 const AbstractCellPopulation<DIM>* const p_cell_population = t->GetCellPopulation();
00139 ar << p_cell_population;
00140
00141
00142 c_vector<double, DIM> point = t->rGetPointOnPlane();
00143 for (unsigned i=0; i<DIM; i++)
00144 {
00145 ar << point[i];
00146 }
00147 c_vector<double, DIM> normal = t->rGetNormalToPlane();
00148 for (unsigned i=0; i<DIM; i++)
00149 {
00150 ar << normal[i];
00151 }
00152 }
00153
00157 template<class Archive, unsigned DIM>
00158 inline void load_construct_data(
00159 Archive & ar, PlaneBoundaryCondition<DIM>* t, const unsigned int file_version)
00160 {
00161
00162 AbstractCellPopulation<DIM>* p_cell_population;
00163 ar >> p_cell_population;
00164
00165
00166 c_vector<double, DIM> point;
00167 for (unsigned i=0; i<DIM; i++)
00168 {
00169 ar >> point[i];
00170 }
00171 c_vector<double, DIM> normal;
00172 for (unsigned i=0; i<DIM; i++)
00173 {
00174 ar >> normal[i];
00175 }
00176
00177
00178 ::new(t)PlaneBoundaryCondition<DIM>(p_cell_population, point, normal);
00179 }
00180 }
00181 }
00182
00183 #endif