void PMRoadGenerator::generateRoadNetwork() {
	//srand(12);

	// make roads along the boundary of the area
	generateRoadsAtBoundary();

	std::list<RoadVertexDesc> seeds;
	std::vector<std::pair<QVector2D, float>> regular_elements;

	// 1本の道路をとりあえず作成
	RoadVertexPtr v0 = RoadVertexPtr(new RoadVertex(QVector2D(0, 0)));
	RoadVertexDesc v0_desc = GraphUtil::addVertex(roads, v0);
	roads.graph[v0_desc]->eigenType = RoadVertex::EIGEN_TYPE_MAJOR;
	seeds.push_back(v0_desc);
	float segment_length = G::getFloat("avenueAvgSegmentLength");
	float base_orientation = G::getFloat("road_base_orientation") / 180.0 * M_PI;
	float curvature = G::getFloat("road_curvature");
	growRoads(base_orientation, v0_desc, curvature, segment_length, RoadVertex::EIGEN_TYPE_MAJOR, regular_elements, seeds);
	growRoads(base_orientation, v0_desc, curvature, -segment_length, RoadVertex::EIGEN_TYPE_MAJOR, regular_elements, seeds);
	
	// setup the tensor field
	cv::Mat tensor;
	setupTensor(targetArea, regular_elements, tensor);
	saveTensorImage(tensor, "tensor.png");

	// generate roads
	generateRoadsByTensor(tensor, segment_length, segment_length * 0.7, seeds);

	// remove dangling edges
	removeDanglingEdges();
}
Example #2
0
int edge::reproducers::local( unsigned int const i_nSteps, unsigned int const i_nElements ) {

  double                                  l_dT = 0.000001;
  unsigned int                            l_nSteps = i_nSteps;
  unsigned int                            l_nElements = i_nElements;
  t_elementChars                        * l_elChars; /* zero initialization */
  t_dg                                    l_dg;
  t_matStar                            (* l_starM)[N_DIM];
  t_fluxSolver                         (* l_fluxSolvers)[ C_ENT[T_SDISC.ELEMENT].N_FACES ];
  real_base                            (* l_dofs)[N_QUANTITIES][N_ELEMENT_MODES][N_CRUNS];
  real_base                            (* l_tInt)[N_QUANTITIES][N_ELEMENT_MODES][N_CRUNS];
  edge::io::Receivers                     l_recvs;
  edge::data::MmXsmmFused< real_base >    l_mm;
  unsigned int                            l_dummyUInt;
  double                                  l_dummyDouble;


  // 1. Set up structures
  setupDg( l_dg );
  setupKernel( l_mm );

  setupStarM( l_nElements, &l_starM );
  setupFluxSolv( l_nElements, &l_fluxSolvers );

  setupTensor( l_nElements, &l_dofs, &l_tInt );
#ifdef PP_USE_OMP
  #pragma omp parallel
  #pragma omp critical
#endif
  setupScratchMem( &(edge::parallel::g_scratchMem) );

  setupPseudoMesh( edge::reproducers::C_MODE_LOCAL, l_nElements,
                   &l_elChars,
                   nullptr, nullptr, nullptr, nullptr, nullptr );


  // 2. Run solvers
  std::cout << "Runing solvers" << std::endl;
  unsigned long long l_start = libxsmm_timer_tick();
#ifdef PP_USE_OMP
  #pragma omp parallel firstprivate( l_nSteps, l_nElements, l_dT )  \
                       firstprivate( l_elChars )                    \
                       firstprivate( l_dg, l_starM, l_fluxSolvers ) \
                       firstprivate( l_dofs, l_tInt  )              \
                       firstprivate( l_mm )                         \
                       private( l_recvs, l_dummyUInt, l_dummyDouble )
#endif
  {
    const unsigned int l_nThreads = omp_get_num_threads();
    const unsigned int l_tid = omp_get_thread_num();
    unsigned int l_firstEl = (unsigned int)((l_nElements + l_nThreads - 1) / l_nThreads) * l_tid;
    unsigned int l_lastEl = (unsigned int)((l_nElements + l_nThreads - 1) / l_nThreads) * (l_tid + 1);
    l_lastEl = std::min(l_lastEl, l_nElements);
    unsigned int l_numEl = l_lastEl - l_firstEl;

    for ( unsigned int l_step = 0; l_step < l_nSteps; l_step++ ) {
      edge::elastic::solvers::AderDg::local< unsigned int,
                                             real_base,
                                             edge::data::MmXsmmFused< real_base > >
                                           ( l_firstEl,
                                             l_numEl,
                                             l_dummyDouble,
                                             l_dT,
                                             l_dummyUInt,
                                             l_dummyUInt,
                                             nullptr,
                                             nullptr,
                                             l_elChars,
                                             l_dg,
                                             l_starM,
                                             l_fluxSolvers,
                                             l_dofs,
                                             l_tInt,
                                             nullptr,
                                             l_recvs,
                                             l_mm           );
#ifdef PP_USE_OMP
      #pragma omp barrier
#endif
    }
  }
  unsigned long long l_end = libxsmm_timer_tick();

  // 3. Print statistics
  double l_time = libxsmm_timer_duration(l_start, l_end);
  unsigned int l_local_flops[] =
  {
    792, 3564, 11412, 31500, 77184, 173538, 360522
  };
  unsigned long long l_flops = (unsigned long long)l_local_flops[ORDER-1] * PP_N_CRUNS * \
                               l_nElements * l_nSteps;
  double l_gflops = (double)l_flops / (l_time * 1000000000);
  std::cout << "Elapsed time: " << l_time << " s" << std::endl;
  std::cout << "Performance:  " << l_gflops << " GFLOPS" << std::endl;
  std::cout << std::endl;

#ifdef PP_REPRODUCER_DUMP
  std::string l_dumpFileName1 = "./local_o"+std::to_string(ORDER)+"_"
                                "f"+std::to_string(PP_PRECISION)+"_"
                                "el"+std::to_string(l_nElements)+"_"
                                "stp"+std::to_string(l_nSteps)+"_dofs.log";
  std::string l_dumpFileName2 = "./local_o"+std::to_string(ORDER)+"_"
                                "f"+std::to_string(PP_PRECISION)+"_"
                                "el"+std::to_string(l_nElements)+"_"
                                "stp"+std::to_string(l_nSteps)+"_tInt.log";
  std::ofstream l_fp1( l_dumpFileName1 );
  std::ofstream l_fp2( l_dumpFileName2 );
  for ( unsigned int l_el = 0; l_el < l_nElements; l_el++ ) {
    for ( unsigned int l_qt = 0; l_qt < N_QUANTITIES; l_qt++ ) {
      for ( unsigned int l_md = 0; l_md < N_ELEMENT_MODES; l_md++ ) {
        for ( unsigned int l_cfr = 0; l_cfr < N_CRUNS; l_cfr++ ) {
          l_fp1 << l_dofs[l_el][l_qt][l_md][l_cfr] << "\n";
          l_fp2 << l_tInt[l_el][l_qt][l_md][l_cfr] << "\n";
        }
      }
    }
  }
#endif


  // 4. Clean up
  cleanupDg( l_dg );
  cleanupStarM( l_starM );
  cleanupFluxSolv( l_fluxSolvers );
  cleanupTensor( l_dofs, l_tInt );

#ifdef PP_USE_OMP
  #pragma omp parallel
  #pragma omp critical
#endif
  cleanupScratchMem( edge::parallel::g_scratchMem );

  cleanupPseudoMesh( edge::reproducers::C_MODE_LOCAL,
                     l_elChars,
                     nullptr, nullptr, nullptr, nullptr, nullptr );

  return 0;
}