Commit e57dc298 authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Implement overlap violation test in CLUSTER and INCLUSION

parent 8c561a1e
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -234,6 +234,39 @@ void cluster(const string& config_file, const string& data_file, const string& o
      sprintf(virtual_line, "%.5lg.\n", sconf->get_particle_radius(gconf));
      sprintf(virtual_line, "%.5lg.\n", sconf->get_particle_radius(gconf));
      message = "INFO: particle radius is " + (string)virtual_line;
      message = "INFO: particle radius is " + (string)virtual_line;
      logger->log(message);
      logger->log(message);
      // Overlapping spheres test
      double tolerance = gconf->tolerance;
      if (tolerance < 0.0) {
	tolerance = 0.01 * sconf->get_min_radius();
      }
      int *overlaps = check_overlaps(sconf, gconf, tolerance);
      if (overlaps[0] != 0) {
	message = "WARNING: detected limiting separation between spheres!\n";
	logger->log(message, LOG_WARN);
	for (int oi = 0; oi < overlaps[0]; oi++) {
	  int index_0 = overlaps[1 + 2 * oi];
	  int index_1 = overlaps[2 + 2 * oi];
	  double overlap = get_overlap(sconf, gconf, index_0 - 1, index_1 - 1);
	  if (overlap > 0.0) {
	    message = "INFO: sphere " + to_string(overlaps[index_0]) +
	      " overlaps with sphere " + to_string(overlaps[index_1]) +
	      "\n";
	    logger->log(message);
	    sprintf(
	      virtual_line, "INFO: overlap is %.5lg (tolerance is %.5lg)\n",
	      overlap, tolerance
	    );
	    message = (string)virtual_line;
	    logger->log(message);
	    if (tolerance == 0.0 || overlap > tolerance) {
	      message = "ERROR: sphere overlap above tolerance limit!\n";
	      logger->err(message);
	      throw(UnrecognizedConfigurationException(message));
	    } // tolerance == 0 || overlap > tolerance
	  } // ovelrap > 0
	} // oi loop
      } // overlaps[0] != 0
      delete[] overlaps;
      // Memory requirements test
      // Memory requirements test
      long cid_size_bytes = ClusterIterationData::get_size(gconf, sconf);
      long cid_size_bytes = ClusterIterationData::get_size(gconf, sconf);
      double cid_size_gb = cid_size_bytes / 1024.0 / 1024.0 / 1024.0;
      double cid_size_gb = cid_size_bytes / 1024.0 / 1024.0 / 1024.0;
+33 −0
Original line number Original line Diff line number Diff line
@@ -234,6 +234,39 @@ void inclusion(const string& config_file, const string& data_file, const string&
      sprintf(virtual_line, "%.5lg.\n", sconf->get_particle_radius(gconf));
      sprintf(virtual_line, "%.5lg.\n", sconf->get_particle_radius(gconf));
      message = "INFO: particle radius is " + (string)virtual_line;
      message = "INFO: particle radius is " + (string)virtual_line;
      logger->log(message);
      logger->log(message);
      // Overlapping spheres test
      double tolerance = gconf->tolerance;
      if (tolerance < 0.0) {
	tolerance = 0.01 * sconf->get_min_radius();
      }
      int *overlaps = check_overlaps(sconf, gconf, tolerance);
      if (overlaps[0] != 0) {
	message = "WARNING: detected limiting separation between spheres!\n";
	logger->log(message, LOG_WARN);
	for (int oi = 0; oi < overlaps[0]; oi++) {
	  int index_0 = overlaps[1 + 2 * oi];
	  int index_1 = overlaps[2 + 2 * oi];
	  double overlap = get_overlap(sconf, gconf, index_0 - 1, index_1 - 1);
	  if (overlap > 0.0) {
	    message = "INFO: sphere " + to_string(overlaps[index_0]) +
	      " overlaps with sphere " + to_string(overlaps[index_1]) +
	      "\n";
	    logger->log(message);
	    sprintf(
	      virtual_line, "INFO: overlap is %.5lg (tolerance is %.5lg)\n",
	      overlap, tolerance
	    );
	    message = (string)virtual_line;
	    logger->log(message);
	    if (tolerance == 0.0 || overlap > tolerance) {
	      message = "ERROR: sphere overlap above tolerance limit!\n";
	      logger->err(message);
	      throw(UnrecognizedConfigurationException(message));
	    } // tolerance == 0 || overlap > tolerance
	  } // ovelrap > 0
	} // oi loop
      } // overlaps[0] != 0
      delete[] overlaps;
      // Memory requirements test
      // Memory requirements test
      long cid_size_bytes = InclusionIterationData::get_size(gconf, sconf);
      long cid_size_bytes = InclusionIterationData::get_size(gconf, sconf);
      double cid_size_gb = cid_size_bytes / 1024.0 / 1024.0 / 1024.0;
      double cid_size_gb = cid_size_bytes / 1024.0 / 1024.0 / 1024.0;