Пример #1
0
Dart GMap1::newBoundaryCycle(unsigned int nbEdges)
{
	assert(nbEdges > 0 || !"Cannot create a face with no edge") ;

	Dart d0 =  GMap0::newEdge();	// create the first edge
	boundaryMark(d0);
	boundaryMark(beta0(d0));
	Dart dp = beta0(d0);			// store an extremity
	for (unsigned int i = 1; i < nbEdges; ++i)
	{
		Dart di = GMap0::newEdge();	// create the next edge
		boundaryMark(di);
		boundaryMark(beta0(di));
		beta1sew(dp,di);
		dp = beta0(di);	// change the preceding
	}
	beta1sew(dp,d0);	// sew the last with the first
	return d0;
}
Пример #2
0
void MovingMeshFB::getMoveDirection()
{
  int i, j, k, l, l0, l1;
  getMonitor();
  M.reinit(spM);
  N.reinit(spN);
  for (i = 0;i < n_geometry(2);i ++) {
    const Point<2>& x0 = point(geometry(2,i).vertex(0));
    const Point<2>& x1 = point(geometry(2,i).vertex(1)); 
    const Point<2>& x2 = point(geometry(2,i).vertex(2));
    double omega[2][3];
    double area = (x1[0] - x0[0])*(x2[1] - x0[1]) - (x2[0] - x0[0])*(x1[1] - x0[1]);
    omega[0][0] = x2[0] - x1[0]; omega[0][1] = x0[0] - x2[0];
    omega[0][2] = x1[0] - x0[0]; omega[1][0] = x2[1] - x1[1];
    omega[1][1] = x0[1] - x2[1]; omega[1][2] = x1[1] - x0[1];
    for (j = 0;j < 3;j ++) {
      l0 = geometry(2,i).vertex(j);
      if (boundaryMark(0,l0) == 0) {
	for (k = 0;k < 3;k ++) {
	  double d = monitor(i)*(omega[0][j]*omega[0][k] + omega[1][j]*omega[1][k])/area;
	  l1 = geometry(2,i).vertex(k);
	  if (boundaryMark(0,l1))
	    N.add(index[l0], index[l1], d);
	  else
	    M.add(index[l0], index[l1], d);
	}
      }
    }
  }
  solver.lazyReinit(M);

  Vector<double> b(n_boundary_node);
  Vector<double> r(n_interior_node);
  Vector<double> x(n_interior_node);
  for (k = 0;k < 2;++ k) {
    for (i = 0;i < n_boundary_node;i ++) {
      j = boundary_node_index[i];
      b(i) = -logical_node[j][k];
      logical_move_direction[j][k] = 0.0;
    }
    N.vmult(r, b);
    for (i = 0;i < n_interior_node;i ++)
      x(i) = logical_node[interior_node_index[i]][k];
    solver.solve(x, r);
    for (i = 0;i < n_interior_node;i ++) {
      j = interior_node_index[i];
      logical_move_direction[j][k] = logical_node[j][k] - x(i);
      move_direction[j] = 0.0;
    }
  }

  std::vector<double> mass_lumping(n_geometry(0), 0.);
  for (i = 0;i < n_geometry(2);i ++) {
    const int& v0 = geometry(2,i).vertex(0);
    const int& v1 = geometry(2,i).vertex(1);
    const int& v2 = geometry(2,i).vertex(2);
    const Point<2>& x0 = point(v0);
    const Point<2>& x1 = point(v1); 
    const Point<2>& x2 = point(v2);
    double jacobi[2][2];
    double area = ((logical_node[v1][0] - logical_node[v0][0])*(logical_node[v2][1] - logical_node[v0][1]) -
                   (logical_node[v1][1] - logical_node[v0][1])*(logical_node[v2][0] - logical_node[v0][0]));
    jacobi[0][0] = ((x1[0] - x0[0])*(logical_node[v2][1] - logical_node[v0][1]) -
                    (logical_node[v1][1] - logical_node[v0][1])*(x2[0] - x0[0]));
    jacobi[1][0] = ((x1[1] - x0[1])*(logical_node[v2][1] - logical_node[v0][1]) -
                    (logical_node[v1][1] - logical_node[v0][1])*(x2[1] - x0[1]));
    jacobi[0][1] = ((logical_node[v1][0] - logical_node[v0][0])*(x2[0] - x0[0]) -
                    (x1[0] - x0[0])*(logical_node[v2][0] - logical_node[v0][0]));
    jacobi[1][1] = ((logical_node[v1][0] - logical_node[v0][0])*(x2[1] - x0[1]) -
                    (x1[1] - x0[1]) * (logical_node[v2][0] - logical_node[v0][0]));
    for (j = 0;j < 3;j ++) {
      k = geometry(2,i).vertex(j);
      move_direction[k][0] += jacobi[0][0]*logical_move_direction[k][0] + jacobi[0][1]*logical_move_direction[k][1];
      move_direction[k][1] += jacobi[1][0]*logical_move_direction[k][0] + jacobi[1][1]*logical_move_direction[k][1];
      mass_lumping[k] += area;
    }
  }
  for (i = 0;i < n_geometry(0);i ++) {
    move_direction[i][0] /= mass_lumping[i];
    move_direction[i][1] /= mass_lumping[i];
  }

  for (i = 0;i < n_boundary_node;i ++) {
    j = boundary_node_index[i];
    move_direction[j][0] = 0.0;
    move_direction[j][1] = 0.0;
  }
}