1 #include "surfacesmoother.h"
5 #include <vtkCharArray.h>
7 #include "smoothingutilities.h"
9 #include "swaptriangles.h"
10 #include "laplacesmoother.h"
11 #include "guimainwindow.h"
16 SurfaceSmoother::SurfaceSmoother()
21 int SurfaceSmoother::Process()
24 for(i_iter
=0;i_iter
<NumberOfIterations
;i_iter
++)//TODO:Optimize this loop
26 cout
<<"===ITERATION NB "<<i_iter
<<"/"<<NumberOfIterations
<<"==="<<endl
;
28 m_total_N_newpoints
=0;
31 getAllSurfaceCells(m_AllCells
,m_grid
);
32 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
33 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
35 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
37 m_SelectedNodes
.clear();
38 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
39 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
43 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
45 //Phase D: edit points
46 cout
<<"===Phase D==="<<endl
;
56 /* if(insert_FP) insert_FP_all();
57 if(insert_EP) insert_EP_all();
58 if(remove_FP) remove_FP_all();
59 if(remove_EP) remove_EP_all();*/
63 UpdateDesiredMeshDensity();
65 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_FP-post-insert");
66 if(DoSwap
) SwapFunction();
67 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_FP-post-swap-1");
68 if(DoLaplaceSmoothing
) SmoothFunction();
69 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_FP-post-laplace");
70 if(DoSwap
) SwapFunction();
71 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_FP-post-swap-2");
73 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/post-insert_FP");
76 UpdateDesiredMeshDensity();
78 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_EP-post-insert");
79 if(DoSwap
) SwapFunction();
80 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_EP-post-swap");
81 if(DoLaplaceSmoothing
) SmoothFunction();
82 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/insert_EP-post-laplace");
84 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/post-insert_EP");
87 UpdateDesiredMeshDensity();
89 if(DoSwap
) SwapFunction();
90 if(DoLaplaceSmoothing
) SmoothFunction();
92 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/post-remove_FP");
95 UpdateDesiredMeshDensity();
97 if(DoSwap
) SwapFunction();
98 if(DoLaplaceSmoothing
) SmoothFunction();
100 DualSave("/data1/home/mtaverne/Geometries/simulations/SurfaceTests/post-remove_EP");
102 /* if(DoSwap) SwapFunction();
103 if(DoLaplaceSmoothing) SmoothFunction();*/
105 cout
<<"===Summary==="<<endl
;
106 cout
<<"N_inserted_FP="<<N_inserted_FP
<<endl
;
107 cout
<<"N_inserted_EP="<<N_inserted_EP
<<endl
;
108 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
109 cout
<<"N_removed_EP="<<N_removed_EP
<<endl
;
111 cout
<<"N_points="<<N_points
<<endl
;
112 cout
<<"N_cells="<<N_cells
<<endl
;
113 cout
<<"m_total_N_newpoints="<<m_total_N_newpoints
<<endl
;
114 cout
<<"m_total_N_newcells="<<m_total_N_newcells
<<endl
;
115 cout
<<"============"<<endl
;
117 // if(m_total_N_newpoints==0 && m_total_N_newcells==0) break;
118 if(N_inserted_FP
==0 && N_inserted_EP
==0 && N_removed_FP
==0 && N_removed_EP
==0) break;
121 cout
<<"i_iter/NumberOfIterations="<<i_iter
<<"/"<<NumberOfIterations
<<endl
;
122 UpdateDesiredMeshDensity();
124 if(i_iter
<NumberOfIterations
) cout
<<"WARNING: Exited before finishing all iterations."<<endl
;
129 int SurfaceSmoother::UpdateDesiredMeshDensity()
131 //Phase B : define desired mesh density
132 cout
<<"=== UpdateDesiredMeshDensity ==="<<endl
;
134 getAllSurfaceCells(m_AllCells
,m_grid
);
135 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
136 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
138 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
140 m_SelectedNodes
.clear();
141 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
142 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
143 getNodesFromCells(m_AllCells
, m_AllNodes
, m_grid
);
146 setCells(m_AllCells
);
148 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
150 UpdateNodeType_all();
151 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
152 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
153 EG_VTKDCN(vtkIntArray
, node_specified_density
, m_grid
, "node_specified_density");
155 /* //Phase A : Calculate current mesh density
156 cout<<"===Phase A==="<<endl;
158 foreach(vtkIdType node,m_SelectedNodes)
160 VertexMeshDensity nodeVMD = getVMD(node,node_type->GetValue(node));
161 int idx=VMDvector.indexOf(nodeVMD);
162 if(DebugLevel>3) cout<<"idx="<<idx<<endl;
163 if(idx!=-1)//specified
165 node_meshdensity->SetValue(node, VMDvector[idx].density);
169 double L=CurrentVertexAvgDist(node,n2n,m_grid);
171 node_meshdensity->SetValue(node, D);
175 double diff
=Convergence_meshdensity
+1;
176 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
180 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
182 foreach(vtkIdType node
,m_AllNodes
)
184 if(DebugLevel
>2) cout
<<"======>"<<endl
;
185 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
186 int idx
=VMDvector
.indexOf(nodeVMD
);
187 node_specified_density
->SetValue(node
, idx
);
188 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
189 if(idx
!=-1)//specified
191 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
195 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
198 cout
<<"------>FIRST:"<<endl
;
199 cout
<<"------>D="<<D
<<endl
;
200 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
201 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
202 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
204 diff
=abs(D
-node_meshdensity
->GetValue(node
));
209 cout
<<"------>NOT FIRST:"<<endl
;
210 cout
<<"------>D="<<D
<<endl
;
211 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
212 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
213 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
214 cout
<<"------>diff="<<diff
<<endl
;
215 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
217 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
219 node_meshdensity
->SetValue(node
, D
);
221 if(DebugLevel
>2) cout
<<"======>"<<endl
;
224 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter_density
);// if first=true, it means no new mesh density has been defined (all densities specified)
225 cout
<<"iter="<<iter
<<endl
;
226 if(iter
>=maxiter_density
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
230 int SurfaceSmoother::SwapFunction()
232 //Phase E : Delaunay swap
233 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
234 cout
<<"m_bcs="<<m_bcs
<<endl
;
235 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
238 swap
.setGrid(m_grid
);
239 swap
.setBoundaryCodes(bcs_complement
);
244 int SurfaceSmoother::SmoothFunction()
246 cout
<<"=== SmoothFunction START ==="<<endl
;
247 //Phase F : translate points to smooth grid
251 //laplacian smoothing with projection
252 //Roland smoothing with projection
254 //laplacian smoothing with projection
256 Lap
.SetInput(m_bcs
,m_grid
);
257 Lap
.SetNumberOfIterations(N_SmoothIterations
);
259 cout
<<"=== SmoothFunction END ==="<<endl
;
263 VertexMeshDensity
SurfaceSmoother::getVMD(vtkIdType node
, char VertexType
)
265 VertexMeshDensity VMD
;
268 VMD
.CurrentNode
=node
;
269 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
270 /* createNodeMapping(nodes, _nodes, m_grid);
271 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
274 foreach(vtkIdType C
, n2c
[node
])
276 bc
.insert(cell_code
->GetValue(C
));
277 VMD
.BCmap
[cell_code
->GetValue(C
)]=2;
279 VMD
.BClist
.resize(bc
.size());
280 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
281 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
285 int SurfaceSmoother::insert_FP_counter()
287 cout
<<"===insert_FP_counter() START==="<<endl
;
288 foreach(vtkIdType id_cell
, m_SelectedCells
)
290 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
292 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
294 marked_cells
[id_cell
]=true;
299 cout
<<"===insert_FP_counter() END==="<<endl
;
303 int SurfaceSmoother::insert_EP_counter()
305 cout
<<"===insert_EP_counter() START==="<<endl
;
307 //Phase C: Prepare edge_map
308 cout
<<"===Phase C==="<<endl
;
311 foreach(vtkIdType node1
,m_SelectedNodes
)
313 // cout<<"node1="<<node1<<endl;
314 foreach(vtkIdType node2
,n2n
[node1
])
316 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
317 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
321 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
323 StencilVector
.clear();
324 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
325 //rewind the iterator
326 edge_map_iter
.toFront ();
328 while (edge_map_iter
.hasNext()) {
329 edge_map_iter
.next();
330 vtkIdType node1
=edge_map_iter
.key().first
;
331 vtkIdType node2
=edge_map_iter
.key().second
;
332 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
333 QSet
<int> stencil_cells_set
;
334 QVector
<int> stencil_cells_vector
;
335 stencil_cells_set
=n2c
[node1
];
336 stencil_cells_set
.intersect(n2c
[node2
]);
337 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
339 stencil_cells_vector
.resize(stencil_cells_set
.size());
340 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
341 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
343 vtkIdType id_cell
=stencil_cells_vector
[0];
344 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
345 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
346 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
347 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
348 stencil_t S
=getStencil(id_cell
,SideToSplit
);
350 bool stencil_marked
=false;
351 foreach(vtkIdType C
,stencil_cells_vector
)
353 if(marked_cells
[C
]) stencil_marked
=true;
355 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
356 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
358 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
360 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
362 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
363 StencilVector
.push_back(S
);
365 if(stencil_cells_vector
.size()==2)//2 cells around the edge
370 else//1 cell around the edge
376 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
378 cout
<<"===insert_EP_counter() END==="<<endl
;
382 int SurfaceSmoother::remove_FP_counter()
384 cout
<<"===remove_FP_counter() START==="<<endl
;
385 cout
<<"marked_cells="<<marked_cells
<<endl
;
386 // cout<<"hitlist="<<hitlist<<endl;
387 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
388 cout
<<"N_newcells="<<N_newcells
<<endl
;
389 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
390 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
392 UpdateNodeType_all();
393 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
394 foreach(vtkIdType node
,m_SelectedNodes
)
396 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
399 foreach(vtkIdType C
,n2c
[node
])
401 if(marked_cells
[C
]) marked
=true;
404 QSet
<vtkIdType
> DeadCells
;
405 QSet
<vtkIdType
> MutatedCells
;
406 QSet
<vtkIdType
> MutilatedCells
;
407 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
409 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
412 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
418 cout
<<"===remove_FP_counter() END==="<<endl
;
422 int SurfaceSmoother::remove_EP_counter()
424 cout
<<"===remove_EP_counter() START==="<<endl
;
425 UpdateNodeType_all();
426 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
427 foreach(vtkIdType node
,m_SelectedNodes
)
429 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
432 foreach(vtkIdType C
,n2c
[node
])
434 if(marked_cells
[C
]) marked
=true;
436 QSet
<vtkIdType
> DeadCells
;
437 QSet
<vtkIdType
> MutatedCells
;
438 QSet
<vtkIdType
> MutilatedCells
;
439 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
441 cout
<<"removing edge point "<<node
<<endl
;
444 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
445 if(n2n
[node
].size()==4)//4 cells around the edge
450 else//2 cells around the edge
458 cout
<<"===remove_EP_counter() END==="<<endl
;
462 int SurfaceSmoother::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
464 cout
<<"===insert_FP_actor START==="<<endl
;
466 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
467 foreach(vtkIdType id_cell
, m_SelectedCells
)
469 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
470 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
472 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
474 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
475 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
476 if(DebugLevel
>42) cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
478 vtkIdType N_pts
, *pts
;
479 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
482 int N_neighbours
=N_pts
;
483 if(DebugLevel
>42) cout
<<"N_neighbours="<<N_neighbours
<<endl
;
485 vtkIdType pts_triangle
[4][3];
486 for(int i
=0;i
<N_neighbours
;i
++)
488 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
491 C
=(1/(double)N_neighbours
)*C
;
492 addPoint(grid_tmp
,m_newNodeId
,C
.data());
493 vtkIdType intmidpoint
=m_newNodeId
;
496 for(int i
=0;i
<N_neighbours
;i
++)
498 pts_triangle
[i
][0]=pts
[i
];
499 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
500 pts_triangle
[i
][2]=intmidpoint
;
503 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
504 cell_code_tmp
->SetValue(id_cell
, newBC
);
508 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
509 cell_code_tmp
->SetValue(newCellId
, newBC
);
515 cout
<<"===insert_FP_actor END==="<<endl
;
519 int SurfaceSmoother::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
521 cout
<<"===insert_EP_actor START==="<<endl
;
523 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
524 foreach(stencil_t S
,StencilVector
)
526 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
528 grid_tmp
->GetPoint(S
.p
[1],A
.data());
529 grid_tmp
->GetPoint(S
.p
[3],B
.data());
531 addPoint(grid_tmp
,m_newNodeId
,M
.data());
532 if(DebugLevel
>0) cout
<<"NEW EDGE POINT: "<<m_newNodeId
<<endl
;
534 vtkIdType pts_triangle
[4][3];
536 if(S
.valid
){//there is a neighbour cell
537 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
538 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
539 marked_cells
[S
.id_cell1
]=true;
540 marked_cells
[S
.id_cell2
]=true;
544 pts_triangle
[i
][0]=S
.p
[i
];
545 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
546 pts_triangle
[i
][2]=m_newNodeId
;
549 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
550 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
552 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
553 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
555 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
556 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
559 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
560 cell_code_tmp
->SetValue(newCellId
, bc2
);
561 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
562 cell_code_tmp
->SetValue(newCellId
, bc1
);
564 else{//there is no neighbour cell
565 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
566 marked_cells
[S
.id_cell1
]=true;
568 pts_triangle
[0][0]=S
.p
[0];
569 pts_triangle
[0][1]=S
.p
[1];
570 pts_triangle
[0][2]=m_newNodeId
;
571 pts_triangle
[3][0]=S
.p
[3];
572 pts_triangle
[3][1]=S
.p
[0];
573 pts_triangle
[3][2]=m_newNodeId
;
575 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
577 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
578 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
581 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
582 cell_code_tmp
->SetValue(newCellId
, bc1
);
587 cout
<<"===insert_EP_actor END==="<<endl
;
591 int SurfaceSmoother::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
593 cout
<<"===remove_FP_actor START==="<<endl
;
596 foreach(vtkIdType node
,m_SelectedNodes
)
603 foreach(vtkIdType C
,n2c
[node
])
605 if(marked_cells
[C
]) marked
=true;
607 if( !marked
&& remove_fieldpoint(node
) )
609 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
610 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
611 //TODO: Special copy function, leaving out nodes to remove
614 cout
<<"===remove_FP_actor END==="<<endl
;
618 int SurfaceSmoother::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
620 cout
<<"===remove_EP_actor START==="<<endl
;
623 foreach(vtkIdType node
,m_SelectedNodes
)
626 foreach(vtkIdType C
,n2c
[node
])
628 if(marked_cells
[C
]) marked
=true;
630 if( !marked
&& remove_edgepoint(node
) )
632 if(DebugLevel
>1) cout
<<"removing edge point "<<node
<<endl
;
633 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
634 if(n2n
[node
].size()==4)//4 cells around the edge
638 else//2 cells around the edge
644 cout
<<"===remove_EP_actor END==="<<endl
;
648 int SurfaceSmoother::insert_FP_all()
650 cout
<<"===insert_FP_all START==="<<endl
;
652 getAllSurfaceCells(m_AllCells
,m_grid
);
653 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
654 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
655 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
656 m_SelectedNodes
.clear();
657 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
658 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
660 setCells(m_AllCells
);
661 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
665 N_points
=m_grid
->GetNumberOfPoints();
666 N_cells
=m_grid
->GetNumberOfCells();
670 marked_cells
.clear();
671 marked_nodes
.clear();
675 //unmark cells (TODO: optimize)
676 marked_cells
.clear();
678 N_points
=m_grid
->GetNumberOfPoints();
679 N_cells
=m_grid
->GetNumberOfCells();
680 cout
<<"N_points="<<N_points
<<endl
;
681 cout
<<"N_cells="<<N_cells
<<endl
;
682 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
683 cout
<<"N_newcells="<<N_newcells
<<endl
;
684 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
685 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
686 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
688 makeCopyNoAlloc(m_grid
, grid_tmp
);
689 //initialize new node counter
690 m_newNodeId
=N_points
;
692 insert_FP_actor(grid_tmp
);
694 makeCopy(grid_tmp
,m_grid
);
695 cout
<<"===insert_FP_all END==="<<endl
;
699 int SurfaceSmoother::insert_EP_all()
701 cout
<<"===insert_EP_all START==="<<endl
;
703 getAllSurfaceCells(m_AllCells
,m_grid
);
704 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
705 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
706 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
707 m_SelectedNodes
.clear();
708 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
709 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
711 setCells(m_AllCells
);
712 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
716 N_points
=m_grid
->GetNumberOfPoints();
717 N_cells
=m_grid
->GetNumberOfCells();
721 marked_cells
.clear();
722 marked_nodes
.clear();
726 //unmark cells (TODO: optimize)
727 marked_cells
.clear();
729 N_points
=m_grid
->GetNumberOfPoints();
730 N_cells
=m_grid
->GetNumberOfCells();
731 cout
<<"N_points="<<N_points
<<endl
;
732 cout
<<"N_cells="<<N_cells
<<endl
;
733 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
734 cout
<<"N_newcells="<<N_newcells
<<endl
;
735 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
736 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
737 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
739 makeCopyNoAlloc(m_grid
, grid_tmp
);
740 //initialize new node counter
741 m_newNodeId
=N_points
;
743 insert_EP_actor(grid_tmp
);
745 makeCopy(grid_tmp
,m_grid
);
747 cout
<<"===insert_EP_all END==="<<endl
;
751 int SurfaceSmoother::remove_FP_all()
753 cout
<<"===remove_FP_all START==="<<endl
;
755 getAllSurfaceCells(m_AllCells
,m_grid
);
756 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
757 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
758 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
759 m_SelectedNodes
.clear();
760 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
761 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
763 setCells(m_AllCells
);
764 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
768 N_points
=m_grid
->GetNumberOfPoints();
769 N_cells
=m_grid
->GetNumberOfCells();
773 hitlist
.resize(N_points
);
774 offset
.resize(N_points
);
776 marked_cells
.clear();
777 marked_nodes
.clear();
781 //unmark cells (TODO: optimize)
782 marked_cells
.clear();
784 N_points
=m_grid
->GetNumberOfPoints();
785 N_cells
=m_grid
->GetNumberOfCells();
786 cout
<<"N_points="<<N_points
<<endl
;
787 cout
<<"N_cells="<<N_cells
<<endl
;
788 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
789 cout
<<"N_newcells="<<N_newcells
<<endl
;
790 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
791 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
792 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
794 makeCopyNoAlloc(m_grid
, grid_tmp
);
795 //initialize new node counter
796 m_newNodeId
=N_points
;
798 remove_FP_actor(grid_tmp
);
800 makeCopy(grid_tmp
,m_grid
);
802 cout
<<"===remove_FP_all END==="<<endl
;
806 int SurfaceSmoother::remove_EP_all()
808 cout
<<"===remove_EP_all START==="<<endl
;
810 getAllSurfaceCells(m_AllCells
,m_grid
);
811 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
812 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
813 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
814 m_SelectedNodes
.clear();
815 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
816 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
818 setCells(m_AllCells
);
819 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
823 N_points
=m_grid
->GetNumberOfPoints();
824 N_cells
=m_grid
->GetNumberOfCells();
828 hitlist
.resize(N_points
);
829 offset
.resize(N_points
);
831 marked_cells
.clear();
832 marked_nodes
.clear();
836 //unmark cells (TODO: optimize)
837 marked_cells
.clear();
839 N_points
=m_grid
->GetNumberOfPoints();
840 N_cells
=m_grid
->GetNumberOfCells();
841 cout
<<"N_points="<<N_points
<<endl
;
842 cout
<<"N_cells="<<N_cells
<<endl
;
843 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
844 cout
<<"N_newcells="<<N_newcells
<<endl
;
845 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
846 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
847 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
849 makeCopyNoAlloc(m_grid
, grid_tmp
);
850 //initialize new node counter
851 m_newNodeId
=N_points
;
853 remove_EP_actor(grid_tmp
);
855 makeCopy(grid_tmp
,m_grid
);
857 cout
<<"===remove_EP_all END==="<<endl
;
861 int SurfaceSmoother::FullEdit()
863 cout
<<"===FullEdit START==="<<endl
;
870 N_points
=m_grid
->GetNumberOfPoints();
871 N_cells
=m_grid
->GetNumberOfCells();
875 hitlist
.resize(N_points
);
876 offset
.resize(N_points
);
878 marked_cells
.clear();
879 marked_nodes
.clear();
881 if(insert_FP
) insert_FP_counter();
882 if(insert_EP
) insert_EP_counter();
883 if(remove_FP
) remove_FP_counter();
884 if(remove_EP
) remove_EP_counter();
886 cout
<<"================="<<endl
;
887 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
888 // cout<<"hitlist="<<hitlist<<endl;
889 cout
<<"================="<<endl
;
891 //unmark cells (TODO: optimize)
892 marked_cells
.clear();
894 N_points
=m_grid
->GetNumberOfPoints();
895 N_cells
=m_grid
->GetNumberOfCells();
896 cout
<<"N_points="<<N_points
<<endl
;
897 cout
<<"N_cells="<<N_cells
<<endl
;
898 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
899 cout
<<"N_newcells="<<N_newcells
<<endl
;
900 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
901 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
902 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
904 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
905 //initialize new node counter
906 m_newNodeId
=N_points
;
908 if(insert_FP
) insert_FP_actor(grid_tmp
);
909 if(insert_EP
) insert_EP_actor(grid_tmp
);
911 cout
<<"================="<<endl
;
912 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
913 // cout<<"hitlist="<<hitlist<<endl;
914 cout
<<"================="<<endl
;
915 if(remove_FP
) remove_FP_actor(grid_tmp
);
916 if(remove_EP
) remove_EP_actor(grid_tmp
);
918 makeCopy(grid_tmp
,m_grid
);
920 cout
<<"===FullEdit END==="<<endl
;
924 int SurfaceSmoother::remove_EP_all_2()
926 cout
<<"===remove_EP_all_2 START==="<<endl
;
927 getAllSurfaceCells(m_AllCells
,m_grid
);
928 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
929 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
930 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
931 m_SelectedNodes
.clear();
932 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
933 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
935 setCells(m_AllCells
);
936 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
940 N_points
=m_grid
->GetNumberOfPoints();
941 N_cells
=m_grid
->GetNumberOfCells();
947 hitlist
.resize(N_points
);
948 offset
.resize(N_points
);
950 marked_cells
.clear();
951 marked_nodes
.clear();
954 cout
<<"================="<<endl
;
955 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
956 // cout<<"hitlist="<<hitlist<<endl;
957 cout
<<"================="<<endl
;
961 for(int i
=0;i
<hitlist
.size();i
++)
965 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
967 QString num1
;num1
.setNum(i
);
968 QString num2
;num2
.setNum(i
-kills
);
969 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
971 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
972 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
977 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
981 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
985 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
989 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
990 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
991 cout
<<"===remove_EP_all_2 END==="<<endl
;
996 //count all to remove, then remove them one by one
997 int SurfaceSmoother::remove_FP_all_2()
999 cout
<<"===remove_FP_all_2 START==="<<endl
;
1000 /* cout<<"+++++++"<<endl;
1001 cout_grid(cout,m_grid,true,true,true,true);
1002 cout<<"+++++++"<<endl;*/
1004 getAllSurfaceCells(m_AllCells
,m_grid
);
1005 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1006 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1007 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1008 m_SelectedNodes
.clear();
1009 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1010 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1012 setCells(m_AllCells
);
1013 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1017 N_points
=m_grid
->GetNumberOfPoints();
1018 N_cells
=m_grid
->GetNumberOfCells();
1024 hitlist
.resize(N_points
);
1025 offset
.resize(N_points
);
1027 marked_cells
.clear();
1028 marked_nodes
.clear();
1030 // DualSave("pre-counter");
1031 remove_FP_counter();
1032 // DualSave("post-counter");
1034 // cout_grid(cout,m_grid);
1035 cout
<<"================="<<endl
;
1036 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1037 // cout<<"hitlist="<<hitlist<<endl;
1038 cout
<<"================="<<endl
;
1042 for(int i
=0;i
<hitlist
.size();i
++)
1046 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1048 QString num1
;num1
.setNum(i
);
1049 QString num2
;num2
.setNum(i
-kills
);
1050 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1052 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1053 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1058 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
1062 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
1066 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1070 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1071 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1072 cout
<<"===remove_FP_all_2 END==="<<endl
;
1076 //count all to remove, then remove them all at once
1077 int SurfaceSmoother::remove_FP_all_3()
1079 cout
<<"===remove_FP_all_3 START==="<<endl
;
1081 getAllSurfaceCells(m_AllCells
,m_grid
);
1082 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1083 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1084 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1085 m_SelectedNodes
.clear();
1086 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1087 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1089 setCells(m_AllCells
);
1090 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1094 N_points
=m_grid
->GetNumberOfPoints();
1095 N_cells
=m_grid
->GetNumberOfCells();
1101 hitlist
.resize(N_points
);
1102 offset
.resize(N_points
);
1104 marked_cells
.clear();
1105 marked_nodes
.clear();
1107 remove_FP_counter();
1108 cout
<<"================="<<endl
;
1109 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1110 cout
<<"================="<<endl
;
1112 QSet
<vtkIdType
> DeadNodes
;
1113 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1115 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1119 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1120 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1121 cout
<<"N_newcells="<<N_newcells
<<endl
;
1123 int kills
=-N_newpoints
;
1124 int contracts
=DeadNodes
.size();
1125 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1126 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1127 cout
<<"===remove_FP_all_3 END==="<<endl
;
1131 //count all to remove, then remove them all at once
1132 int SurfaceSmoother::remove_EP_all_3()
1134 cout
<<"===remove_EP_all_3 START==="<<endl
;
1136 getAllSurfaceCells(m_AllCells
,m_grid
);
1137 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1138 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1139 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1140 m_SelectedNodes
.clear();
1141 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1142 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1144 setCells(m_AllCells
);
1145 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1149 N_points
=m_grid
->GetNumberOfPoints();
1150 N_cells
=m_grid
->GetNumberOfCells();
1156 hitlist
.resize(N_points
);
1157 offset
.resize(N_points
);
1159 marked_cells
.clear();
1160 marked_nodes
.clear();
1162 remove_EP_counter();
1163 cout
<<"================="<<endl
;
1164 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1165 cout
<<"================="<<endl
;
1167 QSet
<vtkIdType
> DeadNodes
;
1168 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1170 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1174 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1175 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1176 cout
<<"N_newcells="<<N_newcells
<<endl
;
1178 int kills
=-N_newpoints
;
1179 int contracts
=DeadNodes
.size();
1180 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1181 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1182 cout
<<"===remove_EP_all_3 END==="<<endl
;