double getCostBetweenCells(unsigned int c1, unsigned int c2) const { double sum = 0; auto c1Vec = getGridCoordinates(c1); auto c2Vec = getGridCoordinates(c2); for(unsigned int i = 0; i < discretizationSizes.size(); ++i) { double delta = fabs((double)c1Vec[i] - (double)c2Vec[i]) * (double)discretizationSizes[i]; sum += delta * delta; } return sqrt(sum); }
void DipoleGeometry::dump (bool verbose, const Core::OStream& out) const { if (verbose) for (uint32_t i = 0; i < nvCount (); i++) out << i << " " << getGridCoordinates (i) << " " << (int) getMaterialIndex (i) << std::endl; out << "box = " << box () << std::endl; out << "matCount = " << matCount () << std::endl; out << "nvCount = " << nvCount () << std::endl; check (); }
void DipoleGeometry::normalize () { if (nvCount () == 0) return; Math::Vector3<uint32_t> min = Math::Vector3<uint32_t> (std::numeric_limits<uint32_t>::max (), std::numeric_limits<uint32_t>::max (), std::numeric_limits<uint32_t>::max ()); for (uint32_t i = 0; i < nvCount (); i++) { Math::Vector3<uint32_t> coords = getGridCoordinates (i); if (coords.x () < min.x ()) min.x () = coords.x (); if (coords.y () < min.y ()) min.y () = coords.y (); if (coords.z () < min.z ()) min.z () = coords.z (); } if (min != Math::Vector3<uint32_t> (0, 0, 0)) { for (uint32_t i = 0; i < nvCount (); i++) { positions_[i] -= min; } box_ -= min; origin () += min * gridUnit (); } }
std::vector<unsigned int> getNeighbors(unsigned int n) const { std::vector<unsigned int> neighbors; auto coordinate = getGridCoordinates(n); for(const std::vector<int>& offsets : gridNeighborOffsets) { std::vector<unsigned int> neighbor(offsets.size()); bool valid = true; for(unsigned int i = 0; i < neighbor.size(); ++i) { int coord = (int)coordinate[i] + offsets[i]; if(coord < 0 || coord >= dimensions[i]) { valid = false; } neighbor[i] = coord; } unsigned int index = getIndex(neighbor); if(valid && grid[index]) { neighbors.push_back(index); } } return neighbors; }