예제 #1
0
//**********************************************************
//forward computation: without epi
//*********************************************************
void FECG(char** filNamBEM, char** filNamMFree, char** filOutput,
		char** TransOutput)
{
	matEg engine(MAX_BUF);

	cout << "\n **construct BEM class**\n" << endl;
	BEM_source bem(filNamBEM, filNamMFree, Tri3);

	cout << "\n **BEM Computing**\n" << endl;
	bem.BEMCompute(filOutput);

	int numSur = bem.getNumSur();
	int numVol = bem.getNumVol();
	double* K = bem.getBEMK();
//	mwArray K(numSur,numSur,bem.getBEMK());
//	transpose(K,numSur,);
	double* Ka = bem.getBEMKa();
//	mwArray Ka(1,numSur,bem.getBEMKa());
	double* M = bem.getMFree();
//    transpose(M);

	engine.Open(NULL);
	engine.addData(K, "K", numSur, numSur);
	engine.addData(Ka, "Ka", 1, numSur);
	engine.evalString("K = K.'");
	engine.evalString("K = vertcat(K,Ka)");
	engine.addData(M, "M", numVol, numSur + 1);
	engine.evalString("M = M.'");
//	mwArray M(numVol,numSur+1,bem.getMFree());
//	mwArray Trans = inv(ctranspose(K)*K)*ctranspose(K)*M;
	engine.evalString(" Trans = inv(ctranspose(K)*K)*ctranspose(K)*M");

	/*	FILE* fid = fopen(TransOutput,"wb");
	 double* d = mxGetPr(Trans.GetData());
	 int row,col;
	 row = size(&col,Trans);
	 fwrite(d,sizeof(double),row*col,fid);
	 fclose(fid);
	 */
	cout << "writing Trans files \n" << endl;
	double* Trans = new double[numSur * numVol];
	engine.getData(Trans, "Trans");
	writeFile(TransOutput[0], Trans, sizeof(double), numSur * numVol, "wb");
	delete[] Trans;
	engine.Close();
}
int main( int argc, char** argv )
{
  Surface_mesh surface_mesh;

  if (argc!=2){
    std::cerr << "Usage: " << argv[0] << " input.off\n";
    return EXIT_FAILURE;
  }

  std::ifstream is(argv[1]);
  if(!is){
    std::cerr << "Filename provided is invalid\n";
    return EXIT_FAILURE;
  }

  is >> surface_mesh ;
  if (!CGAL::is_triangle_mesh(surface_mesh)){
    std::cerr << "Input geometry is not triangulated." << std::endl;
    return EXIT_FAILURE;
  }

  Surface_mesh::Property_map<halfedge_descriptor,std::pair<Point_3, Point_3> > constrained_halfedges;

  constrained_halfedges = surface_mesh.add_property_map<halfedge_descriptor,std::pair<Point_3, Point_3> >("h:vertices").first;

  std::size_t nb_border_edges=0;
  BOOST_FOREACH(halfedge_descriptor hd, halfedges(surface_mesh)){
    if(CGAL::is_border(hd,surface_mesh)){
      constrained_halfedges[hd] = std::make_pair(surface_mesh.point(source(hd,surface_mesh)),
                                                 surface_mesh.point(target(hd,surface_mesh)));
      ++nb_border_edges;
    }
  }

  // Contract the surface mesh as much as possible
  SMS::Count_stop_predicate<Surface_mesh> stop(0);

  Border_is_constrained_edge_map bem(surface_mesh);
  
  // This the actual call to the simplification algorithm.
  // The surface mesh and stop conditions are mandatory arguments.
  int r = SMS::edge_collapse
            (surface_mesh
            ,stop
             ,CGAL::parameters::edge_is_constrained_map(bem)
                               .get_placement(Placement(bem))
            );

  std::cout << "\nFinished...\n" << r << " edges removed.\n"
            << surface_mesh.number_of_edges() << " final edges.\n";

  std::ofstream os( argc > 2 ? argv[2] : "out.off" );
  os.precision(17);
  os << surface_mesh;

  // now check!
  BOOST_FOREACH(halfedge_descriptor hd, halfedges(surface_mesh)){
    if(CGAL::is_border(hd,surface_mesh)){
      --nb_border_edges;
      if(constrained_halfedges[hd] != std::make_pair(surface_mesh.point(source(hd,surface_mesh)),
                                                     surface_mesh.point(target(hd,surface_mesh)))){
        std::cerr << "oops. send us a bug report\n";
      }

    }
  }
  assert( nb_border_edges==0 );

  return EXIT_SUCCESS;
}
예제 #3
0
//**********************************************************
//foward computation: with epi
//**********************************************************
void FECG(char** filNamBEM, char** filNamMFree, char** filOutMFree,
		char** filOutBEM, char** TransOutput)
{
	matEg* engine = new matEg(MAX_BUF);
	//Laplacian part
	BEM_nosource bem2(filNamBEM, filNamMFree, Tri3);

	bem2.BEMCompute(filOutBEM);
	int numSur_t = bem2.getNumSur();
	double* Kt = bem2.getBEMK();
	double* Pt = bem2.getBEMP();
	for (int i = 0; i < numSur_t * numSur_t; i++)
		Pt[i] = DKe / DTe * Pt[i];

	//Possoin part
	BEM_source bem(filNamBEM, filNamMFree, Tri3);
	bem.BEMCompute(filOutMFree);
	int numSur_h = bem.getNumSur();
	int numVol = bem.getNumVol();
	double* Kh = bem.getBEMK();
	double* Ph = bem.getBEMP();
	double* Ma = bem.getMFree();

	//begin engine***********************
	engine->Open(NULL);
	engine->addData(Kt, "Kt", numSur_t, numSur_t);
	engine->evalString("Kt = transpose(Kt)");
	engine->addData(Pt, "Pt", numSur_t, numSur_t);
	engine->evalString("Pt = transpose(Pt)");
	engine->addData(Kh, "Kh", numSur_h, numSur_h);
	engine->evalString("Kh = transpose(Kh)");
	engine->addData(Ph, "Ph", numSur_h, numSur_h);
	engine->evalString("Ph = transpose(Ph)");
	engine->addData(Ma, "Ma", numVol, numSur_h + 1);
	engine->evalString("numSur_h = size(Kh,1)");
	engine->evalString("numSur_t = size(Kt,1)");
	engine->evalString("numVol = size(Ma,1)");
	engine->evalString("Ma = transpose(Ma)");
	engine->evalString("M = Ma(1:numSur_h,:)");

	//begin to couple
	engine->evalString("K = horzcat(Kh,zeros(numSur_h,numSur_t - numSur_h))");
	engine->evalString("K = vertcat(K,zeros(numSur_t - numSur_h,numSur_t))");

	engine->evalString("P = horzcat(Ph,zeros(numSur_h,numSur_t - numSur_h))");
	engine->evalString(
			"I = horzcat(zeros(numSur_t - numSur_h,numSur_h),eye(numSur_t - numSur_h))");
	engine->evalString("P = vertcat(P,I)");

	engine->evalString("P = P*inv(Pt)*Kt");

	engine->evalString(
			"Trans = inv(K+P)*vertcat(M,zeros(numSur_t - numSur_h,numVol))");

	double* Trans = new double[numSur_t * numVol];
	engine->getData(Trans, "Trans");
	writeFile(TransOutput[0], Trans, sizeof(double), numSur_t * numVol, "wb");
	delete[] Trans;

	engine->Close();
	delete engine;

}