void Context::validate() const { auto periodic = std::accumulate(periodicBoundaryConditions().begin(), periodicBoundaryConditions().end(), true, std::logical_and<>()); if(!periodic) { // check if there are box potentials for each particle type and that these box potentials are valid for(const auto &entry : particle_types().typeMapping()) { auto ptype = entry.second; auto potIt = potentials().potentialsOrder1().find(ptype); bool valid = true; if(potIt != potentials().potentialsOrder1().end()) { bool gotValidBoxPotential = false; for(const auto potPtr : potIt->second) { if(potPtr->type() == potentials::getPotentialName<potentials::Box>()) { gotValidBoxPotential |= boxPotentialValid(*this, dynamic_cast<potentials::Box*>(potPtr)); } } valid &= gotValidBoxPotential; } else { valid = false; } if(!valid) { throw std::logic_error(fmt::format("For particle type {} there was no valid box potential in direction " "of the non-periodic boundaries configured.", entry.first)); } } } }
const scalar Context::calculateMaxCutoff() const { scalar max_cutoff{0}; for (const auto &entry : potentials().potentialsOrder2()) { for (const auto &potential : entry.second) { max_cutoff = std::max(max_cutoff, potential->getCutoffRadius()); } } for (const auto &entry : reactions().order2()) { for (const auto &reaction : entry.second) { max_cutoff = std::max(max_cutoff, reaction->eductDistance()); } } for (const auto &entry : _topologyRegistry.spatialReactionRegistry()) { for (const auto &reaction : entry.second) { max_cutoff = std::max(max_cutoff, reaction.radius()); } } return max_cutoff; }
void ElectrostaticSystem::setPotentialK(long k, double potential) { if(k>kMax || k<0) throw std::out_of_range("Error: Trying to set element out of range!"); int* ij = k2ij(k); potentials(ij[0]-iMin, ij[1]-jMin) = potential; }
void ElectrostaticSystem::setPotentialIJ(int i, int j, double potential) { if(i>iMax || i<iMin || j>jMax || j<jMin) throw std::out_of_range( "Error: Trying to set element out of range!"); potentials(i-iMin, j-jMin) = potential; }
double ElectrostaticSystem::getPotentialK(long k) const { if(k>kMax || k<0) throw std::out_of_range("Error: Trying to get element out of range!"); int* ij = k2ij(k); return potentials(ij[0]-iMin, ij[1]-jMin); }
double ElectrostaticSystem::getPotentialIJ(int i, int j) const { if(i>iMax || i<iMin || j>jMax || j<jMin) throw std::out_of_range( "Error: Trying to get element out of range!"); return potentials(i-iMin, j-jMin); }