36 #include "PlaneBoundaryCondition.hpp"
37 #include "AbstractCentreBasedCellPopulation.hpp"
38 #include "VertexBasedCellPopulation.hpp"
40 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
42 c_vector<double, SPACE_DIM> point,
43 c_vector<double, SPACE_DIM> normal)
46 mUseJiggledNodesOnPlane(false)
48 assert(norm_2(normal) > 0.0);
52 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
58 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
61 return mNormalToPlane;
65 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
68 mUseJiggledNodesOnPlane = useJiggledNodesOnPlane;
71 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
74 return mUseJiggledNodesOnPlane;
77 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
83 EXCEPTION(
"PlaneBoundaryCondition requires a subclass of AbstractOffLatticeCellPopulation.");
90 double max_jiggle = 1e-4;
97 cell_iter != this->mpCellPopulation->End();
100 unsigned node_index = this->mpCellPopulation->GetLocationIndexUsingCell(*cell_iter);
103 c_vector<double, SPACE_DIM> node_location = p_node->
rGetLocation();
105 double signed_distance = inner_prod(node_location - mPointOnPlane, mNormalToPlane);
106 if (signed_distance > 0.0)
109 c_vector<double, SPACE_DIM> nearest_point;
110 if (mUseJiggledNodesOnPlane)
116 nearest_point = node_location - signed_distance*mNormalToPlane;
124 assert(SPACE_DIM == ELEMENT_DIM);
128 unsigned num_nodes = this->mpCellPopulation->GetNumNodes();
129 for (
unsigned node_index=0; node_index<num_nodes; node_index++)
132 c_vector<double, SPACE_DIM> node_location = p_node->
rGetLocation();
134 double signed_distance = inner_prod(node_location - mPointOnPlane, mNormalToPlane);
135 if (signed_distance > 0.0)
138 c_vector<double, SPACE_DIM> nearest_point;
139 if (mUseJiggledNodesOnPlane)
145 nearest_point = node_location - signed_distance*mNormalToPlane;
160 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
163 bool condition_satisfied =
true;
167 EXCEPTION(
"PlaneBoundaryCondition is not implemented in 1D");
172 cell_iter != this->mpCellPopulation->End();
175 c_vector<double, SPACE_DIM> cell_location = this->mpCellPopulation->GetLocationOfCellCentre(*cell_iter);
177 if (inner_prod(cell_location - mPointOnPlane, mNormalToPlane) > 0.0)
179 condition_satisfied =
false;
185 return condition_satisfied;
188 template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
191 *rParamsFile <<
"\t\t\t<PointOnPlane>";
192 for (
unsigned index=0; index != SPACE_DIM-1U; index++)
194 *rParamsFile << mPointOnPlane[index] <<
",";
196 *rParamsFile << mPointOnPlane[SPACE_DIM-1] <<
"</PointOnPlane>\n";
198 *rParamsFile <<
"\t\t\t<NormalToPlane>";
199 for (
unsigned index=0; index != SPACE_DIM-1U; index++)
201 *rParamsFile << mNormalToPlane[index] <<
",";
203 *rParamsFile << mNormalToPlane[SPACE_DIM-1] <<
"</NormalToPlane>\n";
204 *rParamsFile <<
"\t\t\t<UseJiggledNodesOnPlane>" << mUseJiggledNodesOnPlane <<
"</UseJiggledNodesOnPlane>\n";
#define EXCEPTION(message)
void ImposeBoundaryCondition(const std::map< Node< SPACE_DIM > *, c_vector< double, SPACE_DIM > > &rOldLocations)
static RandomNumberGenerator * Instance()
#define EXPORT_TEMPLATE_CLASS_ALL_DIMS(CLASS)
void OutputCellPopulationBoundaryConditionParameters(out_stream &rParamsFile)
const c_vector< double, SPACE_DIM > & rGetLocation() const
bool VerifyBoundaryCondition()
c_vector< double, SPACE_DIM > mNormalToPlane
PlaneBoundaryCondition(AbstractCellPopulation< ELEMENT_DIM, SPACE_DIM > *pCellPopulation, c_vector< double, SPACE_DIM > point, c_vector< double, SPACE_DIM > normal)
void SetUseJiggledNodesOnPlane(bool useJiggledNodesOnPlane)
const c_vector< double, SPACE_DIM > & rGetNormalToPlane() const
c_vector< double, SPACE_DIM > & rGetModifiableLocation()
virtual void OutputCellPopulationBoundaryConditionParameters(out_stream &rParamsFile)=0
bool GetUseJiggledNodesOnPlane()
const c_vector< double, SPACE_DIM > & rGetPointOnPlane() const