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; }
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; } }