void ExtendedBidomainTissue<SPACE_DIM>::CreateExtracellularConductivityTensors() { if (this->mpConfig->IsMeshProvided() && this->mpConfig->GetLoadMesh()) { assert(this->mFibreFilePathNoExtension != ""); switch (this->mpConfig->GetConductivityMedia()) { case cp::media_type::Orthotropic: { mpExtracellularConductivityTensors = new OrthotropicConductivityTensors<SPACE_DIM,SPACE_DIM>; FileFinder ortho_file(this->mFibreFilePathNoExtension + ".ortho", RelativeTo::AbsoluteOrCwd); assert(ortho_file.Exists()); mpExtracellularConductivityTensors->SetFibreOrientationFile(ortho_file); break; } case cp::media_type::Axisymmetric: { mpExtracellularConductivityTensors = new AxisymmetricConductivityTensors<SPACE_DIM,SPACE_DIM>; FileFinder axi_file(this->mFibreFilePathNoExtension + ".axi", RelativeTo::AbsoluteOrCwd); assert(axi_file.Exists()); mpExtracellularConductivityTensors->SetFibreOrientationFile(axi_file); break; } case cp::media_type::NoFibreOrientation: mpExtracellularConductivityTensors = new OrthotropicConductivityTensors<SPACE_DIM,SPACE_DIM>; break; default : NEVER_REACHED; } } else // no fibre orientation assumed { mpExtracellularConductivityTensors = new OrthotropicConductivityTensors<SPACE_DIM,SPACE_DIM>; } c_vector<double, SPACE_DIM> extra_conductivities; this->mpConfig->GetExtracellularConductivities(extra_conductivities); // this definition must be here (and not inside the if statement) because SetNonConstantConductivities() will keep // a pointer to it and we don't want it to go out of scope before Init() is called unsigned num_elements = this->mpMesh->GetNumElements(); std::vector<c_vector<double, SPACE_DIM> > hetero_extra_conductivities; if (this->mpConfig->GetConductivityHeterogeneitiesProvided()) { try { assert(hetero_extra_conductivities.size()==0); //initialise with the values of teh default conductivity tensor hetero_extra_conductivities.resize(num_elements, extra_conductivities); } catch(std::bad_alloc &badAlloc) { #define COVERAGE_IGNORE std::cout << "Failed to allocate std::vector of size " << num_elements << std::endl; PetscTools::ReplicateException(true); throw badAlloc; #undef COVERAGE_IGNORE } PetscTools::ReplicateException(false); std::vector<boost::shared_ptr<AbstractChasteRegion<SPACE_DIM> > > conductivities_heterogeneity_areas; std::vector< c_vector<double,3> > intra_h_conductivities; std::vector< c_vector<double,3> > extra_h_conductivities; HeartConfig::Instance()->GetConductivityHeterogeneities(conductivities_heterogeneity_areas, intra_h_conductivities, extra_h_conductivities); unsigned local_element_index = 0; for (typename AbstractTetrahedralMesh<SPACE_DIM,SPACE_DIM>::ElementIterator iter = (this->mpMesh)->GetElementIteratorBegin(); iter != (this->mpMesh)->GetElementIteratorEnd(); ++iter) { //unsigned element_index = iter->GetIndex(); // if element centroid is contained in the region ChastePoint<SPACE_DIM> element_centroid(iter->CalculateCentroid()); for (unsigned region_index=0; region_index< conductivities_heterogeneity_areas.size(); region_index++) { // if element centroid is contained in the region if ( conductivities_heterogeneity_areas[region_index]->DoesContain( element_centroid ) ) { //We don't use ublas vector assignment here, because we might be getting a subvector of a 3-vector for (unsigned i=0; i<SPACE_DIM; i++) { hetero_extra_conductivities[local_element_index][i] = extra_h_conductivities[region_index][i]; } } } local_element_index++; } mpExtracellularConductivityTensors->SetNonConstantConductivities(&hetero_extra_conductivities); } else { mpExtracellularConductivityTensors->SetConstantConductivities(extra_conductivities); } mpExtracellularConductivityTensors->Init(this->mpMesh); }
void ExtendedBidomainTissue<SPACE_DIM>::CreateIntracellularConductivityTensorSecondCell() { HeartEventHandler::BeginEvent(HeartEventHandler::READ_MESH); this->mpConfig = HeartConfig::Instance(); mpIntracellularConductivityTensorsSecondCell = new OrthotropicConductivityTensors<SPACE_DIM,SPACE_DIM>; // this definition must be here (and not inside the if statement) because SetNonConstantConductivities() will keep // a pointer to it and we don't want it to go out of scope before Init() is called unsigned num_elements = this->mpMesh->GetNumElements(); std::vector<c_vector<double, SPACE_DIM> > hetero_intra_conductivities; c_vector<double, SPACE_DIM> intra_conductivities; this->mpConfig->GetIntracellularConductivities(intra_conductivities);//this one is used just for resizing if (this->mpConfig->GetConductivityHeterogeneitiesProvided()) { try { assert(hetero_intra_conductivities.size()==0); hetero_intra_conductivities.resize(num_elements, intra_conductivities); } catch(std::bad_alloc &badAlloc) { #define COVERAGE_IGNORE std::cout << "Failed to allocate std::vector of size " << num_elements << std::endl; PetscTools::ReplicateException(true); throw badAlloc; #undef COVERAGE_IGNORE } PetscTools::ReplicateException(false); std::vector<boost::shared_ptr<AbstractChasteRegion<SPACE_DIM> > > conductivities_heterogeneity_areas; std::vector< c_vector<double,3> > intra_h_conductivities; std::vector< c_vector<double,3> > extra_h_conductivities; HeartConfig::Instance()->GetConductivityHeterogeneities(conductivities_heterogeneity_areas, intra_h_conductivities, extra_h_conductivities); unsigned local_element_index = 0; for (typename AbstractTetrahedralMesh<SPACE_DIM,SPACE_DIM>::ElementIterator it = this->mpMesh->GetElementIteratorBegin(); it != this->mpMesh->GetElementIteratorEnd(); ++it) { //unsigned element_index = it->GetIndex(); // if element centroid is contained in the region ChastePoint<SPACE_DIM> element_centroid(it->CalculateCentroid()); for (unsigned region_index=0; region_index< conductivities_heterogeneity_areas.size(); region_index++) { if ( conductivities_heterogeneity_areas[region_index]->DoesContain(element_centroid) ) { //We don't use ublas vector assignment here, because we might be getting a subvector of a 3-vector for (unsigned i=0; i<SPACE_DIM; i++) { hetero_intra_conductivities[local_element_index][i] = intra_h_conductivities[region_index][i]; } } } local_element_index++; } mpIntracellularConductivityTensorsSecondCell->SetNonConstantConductivities(&hetero_intra_conductivities); } else { mpIntracellularConductivityTensorsSecondCell->SetConstantConductivities(mIntracellularConductivitiesSecondCell); } mpIntracellularConductivityTensorsSecondCell->Init(this->mpMesh); HeartEventHandler::EndEvent(HeartEventHandler::READ_MESH); }