1 #include "createspecialmapping.h"
5 #include <vtkCharArray.h>
7 #include "smoothingutilities.h"
9 #include "swaptriangles.h"
10 #include "laplacesmoother.h"
11 #include "guimainwindow.h"
16 CreateSpecialMapping::CreateSpecialMapping()
21 int CreateSpecialMapping::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 if(DoSwap
) SwapFunction();
66 if(DoLaplaceSmoothing
) SmoothFunction();
70 UpdateDesiredMeshDensity();
72 if(DoSwap
) SwapFunction();
73 if(DoLaplaceSmoothing
) SmoothFunction();
77 UpdateDesiredMeshDensity();
79 if(DoSwap
) SwapFunction();
80 if(DoLaplaceSmoothing
) SmoothFunction();
84 UpdateDesiredMeshDensity();
86 if(DoSwap
) SwapFunction();
87 if(DoLaplaceSmoothing
) SmoothFunction();
90 /* if(DoSwap) SwapFunction();
91 if(DoLaplaceSmoothing) SmoothFunction();*/
93 cout
<<"===Summary==="<<endl
;
94 cout
<<"N_inserted_FP="<<N_inserted_FP
<<endl
;
95 cout
<<"N_inserted_EP="<<N_inserted_EP
<<endl
;
96 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
97 cout
<<"N_removed_EP="<<N_removed_EP
<<endl
;
99 cout
<<"N_points="<<N_points
<<endl
;
100 cout
<<"N_cells="<<N_cells
<<endl
;
101 cout
<<"m_total_N_newpoints="<<m_total_N_newpoints
<<endl
;
102 cout
<<"m_total_N_newcells="<<m_total_N_newcells
<<endl
;
103 cout
<<"============"<<endl
;
105 // if(m_total_N_newpoints==0 && m_total_N_newcells==0) break;
106 if(N_inserted_FP
==0 && N_inserted_EP
==0 && N_removed_FP
==0 && N_removed_EP
==0) break;
109 cout
<<"i_iter/NumberOfIterations="<<i_iter
<<"/"<<NumberOfIterations
<<endl
;
110 UpdateDesiredMeshDensity();
112 if(i_iter
<NumberOfIterations
) cout
<<"WARNING: Exited before finishing all iterations."<<endl
;
117 int CreateSpecialMapping::UpdateDesiredMeshDensity()
119 //Phase B : define desired mesh density
120 cout
<<"=== UpdateDesiredMeshDensity ==="<<endl
;
122 getAllSurfaceCells(m_AllCells
,m_grid
);
123 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
124 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
126 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
128 m_SelectedNodes
.clear();
129 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
130 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
131 getNodesFromCells(m_AllCells
, m_AllNodes
, m_grid
);
134 setCells(m_AllCells
);
136 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
138 UpdateNodeType_all();
139 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
140 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
141 EG_VTKDCN(vtkIntArray
, node_specified_density
, m_grid
, "node_specified_density");
143 /* //Phase A : Calculate current mesh density
144 cout<<"===Phase A==="<<endl;
146 foreach(vtkIdType node,m_SelectedNodes)
148 VertexMeshDensity nodeVMD = getVMD(node,node_type->GetValue(node));
149 int idx=VMDvector.indexOf(nodeVMD);
150 if(DebugLevel>3) cout<<"idx="<<idx<<endl;
151 if(idx!=-1)//specified
153 node_meshdensity->SetValue(node, VMDvector[idx].density);
157 double L=CurrentVertexAvgDist(node,n2n,m_grid);
159 node_meshdensity->SetValue(node, D);
163 double diff
=Convergence_meshdensity
+1;
164 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
168 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
170 foreach(vtkIdType node
,m_AllNodes
)
172 if(DebugLevel
>2) cout
<<"======>"<<endl
;
173 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
174 int idx
=VMDvector
.indexOf(nodeVMD
);
175 node_specified_density
->SetValue(node
, idx
);
176 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
177 if(idx
!=-1)//specified
179 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
183 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
186 cout
<<"------>FIRST:"<<endl
;
187 cout
<<"------>D="<<D
<<endl
;
188 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
189 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
190 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
192 diff
=abs(D
-node_meshdensity
->GetValue(node
));
197 cout
<<"------>NOT FIRST:"<<endl
;
198 cout
<<"------>D="<<D
<<endl
;
199 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
200 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
201 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
202 cout
<<"------>diff="<<diff
<<endl
;
203 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
205 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
207 node_meshdensity
->SetValue(node
, D
);
209 if(DebugLevel
>2) cout
<<"======>"<<endl
;
212 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter_density
);// if first=true, it means no new mesh density has been defined (all densities specified)
213 cout
<<"iter="<<iter
<<endl
;
214 if(iter
>=maxiter_density
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
218 int CreateSpecialMapping::SwapFunction()
220 //Phase E : Delaunay swap
221 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
222 cout
<<"m_bcs="<<m_bcs
<<endl
;
223 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
226 swap
.setGrid(m_grid
);
227 swap
.setBoundaryCodes(bcs_complement
);
232 int CreateSpecialMapping::SmoothFunction()
234 cout
<<"=== SmoothFunction ==="<<endl
;
235 //Phase F : translate points to smooth grid
239 //laplacian smoothing with projection
240 //Roland smoothing with projection
242 //laplacian smoothing with projection
244 Lap
.SetInput(m_bcs
,m_grid
);
245 Lap
.SetNumberOfIterations(N_SmoothIterations
);
250 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
252 VertexMeshDensity VMD
;
255 VMD
.CurrentNode
=node
;
256 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
257 /* createNodeMapping(nodes, _nodes, m_grid);
258 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
261 foreach(vtkIdType C
, n2c
[node
])
263 bc
.insert(cell_code
->GetValue(C
));
264 VMD
.BCmap
[cell_code
->GetValue(C
)]=2;
266 VMD
.BClist
.resize(bc
.size());
267 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
268 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
272 int CreateSpecialMapping::insert_FP_counter()
274 cout
<<"===insert_FP_counter() START==="<<endl
;
275 foreach(vtkIdType id_cell
, m_SelectedCells
)
277 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
279 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
281 marked_cells
[id_cell
]=true;
286 cout
<<"===insert_FP_counter() END==="<<endl
;
290 int CreateSpecialMapping::insert_EP_counter()
292 cout
<<"===insert_EP_counter() START==="<<endl
;
294 //Phase C: Prepare edge_map
295 cout
<<"===Phase C==="<<endl
;
298 foreach(vtkIdType node1
,m_SelectedNodes
)
300 // cout<<"node1="<<node1<<endl;
301 foreach(vtkIdType node2
,n2n
[node1
])
303 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
304 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
308 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
310 StencilVector
.clear();
311 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
312 //rewind the iterator
313 edge_map_iter
.toFront ();
315 while (edge_map_iter
.hasNext()) {
316 edge_map_iter
.next();
317 vtkIdType node1
=edge_map_iter
.key().first
;
318 vtkIdType node2
=edge_map_iter
.key().second
;
319 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
320 QSet
<int> stencil_cells_set
;
321 QVector
<int> stencil_cells_vector
;
322 stencil_cells_set
=n2c
[node1
];
323 stencil_cells_set
.intersect(n2c
[node2
]);
324 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
326 stencil_cells_vector
.resize(stencil_cells_set
.size());
327 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
328 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
330 vtkIdType id_cell
=stencil_cells_vector
[0];
331 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
332 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
333 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
334 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
335 stencil_t S
=getStencil(id_cell
,SideToSplit
);
337 bool stencil_marked
=false;
338 foreach(vtkIdType C
,stencil_cells_vector
)
340 if(marked_cells
[C
]) stencil_marked
=true;
342 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
343 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
345 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
347 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
349 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
350 StencilVector
.push_back(S
);
352 if(stencil_cells_vector
.size()==2)//2 cells around the edge
357 else//1 cell around the edge
363 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
365 cout
<<"===insert_EP_counter() END==="<<endl
;
369 int CreateSpecialMapping::remove_FP_counter()
371 cout
<<"===remove_FP_counter() START==="<<endl
;
372 cout
<<"marked_cells="<<marked_cells
<<endl
;
373 // cout<<"hitlist="<<hitlist<<endl;
374 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
375 cout
<<"N_newcells="<<N_newcells
<<endl
;
376 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
377 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
379 UpdateNodeType_all();
380 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
381 foreach(vtkIdType node
,m_SelectedNodes
)
383 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
386 foreach(vtkIdType C
,n2c
[node
])
388 if(marked_cells
[C
]) marked
=true;
391 QSet
<vtkIdType
> DeadCells
;
392 QSet
<vtkIdType
> MutatedCells
;
393 QSet
<vtkIdType
> MutilatedCells
;
394 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
396 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
399 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
405 cout
<<"===remove_FP_counter() END==="<<endl
;
409 int CreateSpecialMapping::remove_EP_counter()
411 cout
<<"===remove_EP_counter() START==="<<endl
;
412 UpdateNodeType_all();
413 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
414 foreach(vtkIdType node
,m_SelectedNodes
)
416 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
419 foreach(vtkIdType C
,n2c
[node
])
421 if(marked_cells
[C
]) marked
=true;
423 QSet
<vtkIdType
> DeadCells
;
424 QSet
<vtkIdType
> MutatedCells
;
425 QSet
<vtkIdType
> MutilatedCells
;
426 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
428 cout
<<"removing edge point "<<node
<<endl
;
431 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
432 if(n2n
[node
].size()==4)//4 cells around the edge
437 else//2 cells around the edge
445 cout
<<"===remove_EP_counter() END==="<<endl
;
449 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
451 cout
<<"===insert_FP_actor START==="<<endl
;
453 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
454 foreach(vtkIdType id_cell
, m_SelectedCells
)
456 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
457 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
459 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
461 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
462 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
463 if(DebugLevel
>42) cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
465 vtkIdType N_pts
, *pts
;
466 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
469 int N_neighbours
=N_pts
;
470 if(DebugLevel
>42) cout
<<"N_neighbours="<<N_neighbours
<<endl
;
472 vtkIdType pts_triangle
[4][3];
473 for(int i
=0;i
<N_neighbours
;i
++)
475 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
478 C
=(1/(double)N_neighbours
)*C
;
479 addPoint(grid_tmp
,m_newNodeId
,C
.data());
480 vtkIdType intmidpoint
=m_newNodeId
;
483 for(int i
=0;i
<N_neighbours
;i
++)
485 pts_triangle
[i
][0]=pts
[i
];
486 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
487 pts_triangle
[i
][2]=intmidpoint
;
490 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
491 cell_code_tmp
->SetValue(id_cell
, newBC
);
495 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
496 cell_code_tmp
->SetValue(newCellId
, newBC
);
502 cout
<<"===insert_FP_actor END==="<<endl
;
506 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
508 cout
<<"===insert_EP_actor START==="<<endl
;
510 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
511 foreach(stencil_t S
,StencilVector
)
513 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
515 grid_tmp
->GetPoint(S
.p
[1],A
.data());
516 grid_tmp
->GetPoint(S
.p
[3],B
.data());
518 addPoint(grid_tmp
,m_newNodeId
,M
.data());
519 if(DebugLevel
>0) cout
<<"NEW EDGE POINT: "<<m_newNodeId
<<endl
;
521 vtkIdType pts_triangle
[4][3];
523 if(S
.valid
){//there is a neighbour cell
524 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
525 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
526 marked_cells
[S
.id_cell1
]=true;
527 marked_cells
[S
.id_cell2
]=true;
531 pts_triangle
[i
][0]=S
.p
[i
];
532 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
533 pts_triangle
[i
][2]=m_newNodeId
;
536 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
537 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
539 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
540 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
542 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
543 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
546 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
547 cell_code_tmp
->SetValue(newCellId
, bc2
);
548 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
549 cell_code_tmp
->SetValue(newCellId
, bc1
);
551 else{//there is no neighbour cell
552 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
553 marked_cells
[S
.id_cell1
]=true;
555 pts_triangle
[0][0]=S
.p
[0];
556 pts_triangle
[0][1]=S
.p
[1];
557 pts_triangle
[0][2]=m_newNodeId
;
558 pts_triangle
[3][0]=S
.p
[3];
559 pts_triangle
[3][1]=S
.p
[0];
560 pts_triangle
[3][2]=m_newNodeId
;
562 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
564 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
565 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
568 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
569 cell_code_tmp
->SetValue(newCellId
, bc1
);
574 cout
<<"===insert_EP_actor END==="<<endl
;
578 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
580 cout
<<"===remove_FP_actor START==="<<endl
;
583 foreach(vtkIdType node
,m_SelectedNodes
)
590 foreach(vtkIdType C
,n2c
[node
])
592 if(marked_cells
[C
]) marked
=true;
594 if( !marked
&& remove_fieldpoint(node
) )
596 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
597 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
598 //TODO: Special copy function, leaving out nodes to remove
601 cout
<<"===remove_FP_actor END==="<<endl
;
605 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
607 cout
<<"===remove_EP_actor START==="<<endl
;
610 foreach(vtkIdType node
,m_SelectedNodes
)
613 foreach(vtkIdType C
,n2c
[node
])
615 if(marked_cells
[C
]) marked
=true;
617 if( !marked
&& remove_edgepoint(node
) )
619 if(DebugLevel
>1) cout
<<"removing edge point "<<node
<<endl
;
620 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
621 if(n2n
[node
].size()==4)//4 cells around the edge
625 else//2 cells around the edge
631 cout
<<"===remove_EP_actor END==="<<endl
;
635 int CreateSpecialMapping::insert_FP_all()
637 cout
<<"===insert_FP_all START==="<<endl
;
639 getAllSurfaceCells(m_AllCells
,m_grid
);
640 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
641 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
642 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
643 m_SelectedNodes
.clear();
644 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
645 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
647 setCells(m_AllCells
);
648 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
652 N_points
=m_grid
->GetNumberOfPoints();
653 N_cells
=m_grid
->GetNumberOfCells();
657 marked_cells
.clear();
658 marked_nodes
.clear();
662 //unmark cells (TODO: optimize)
663 marked_cells
.clear();
665 N_points
=m_grid
->GetNumberOfPoints();
666 N_cells
=m_grid
->GetNumberOfCells();
667 cout
<<"N_points="<<N_points
<<endl
;
668 cout
<<"N_cells="<<N_cells
<<endl
;
669 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
670 cout
<<"N_newcells="<<N_newcells
<<endl
;
671 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
672 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
673 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
675 makeCopyNoAlloc(m_grid
, grid_tmp
);
676 //initialize new node counter
677 m_newNodeId
=N_points
;
679 insert_FP_actor(grid_tmp
);
681 makeCopy(grid_tmp
,m_grid
);
682 cout
<<"===insert_FP_all END==="<<endl
;
686 int CreateSpecialMapping::insert_EP_all()
688 cout
<<"===insert_EP_all START==="<<endl
;
690 getAllSurfaceCells(m_AllCells
,m_grid
);
691 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
692 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
693 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
694 m_SelectedNodes
.clear();
695 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
696 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
698 setCells(m_AllCells
);
699 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
703 N_points
=m_grid
->GetNumberOfPoints();
704 N_cells
=m_grid
->GetNumberOfCells();
708 marked_cells
.clear();
709 marked_nodes
.clear();
713 //unmark cells (TODO: optimize)
714 marked_cells
.clear();
716 N_points
=m_grid
->GetNumberOfPoints();
717 N_cells
=m_grid
->GetNumberOfCells();
718 cout
<<"N_points="<<N_points
<<endl
;
719 cout
<<"N_cells="<<N_cells
<<endl
;
720 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
721 cout
<<"N_newcells="<<N_newcells
<<endl
;
722 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
723 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
724 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
726 makeCopyNoAlloc(m_grid
, grid_tmp
);
727 //initialize new node counter
728 m_newNodeId
=N_points
;
730 insert_EP_actor(grid_tmp
);
732 makeCopy(grid_tmp
,m_grid
);
734 cout
<<"===insert_EP_all END==="<<endl
;
738 int CreateSpecialMapping::remove_FP_all()
740 cout
<<"===remove_FP_all START==="<<endl
;
742 getAllSurfaceCells(m_AllCells
,m_grid
);
743 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
744 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
745 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
746 m_SelectedNodes
.clear();
747 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
748 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
750 setCells(m_AllCells
);
751 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
755 N_points
=m_grid
->GetNumberOfPoints();
756 N_cells
=m_grid
->GetNumberOfCells();
760 hitlist
.resize(N_points
);
761 offset
.resize(N_points
);
763 marked_cells
.clear();
764 marked_nodes
.clear();
768 //unmark cells (TODO: optimize)
769 marked_cells
.clear();
771 N_points
=m_grid
->GetNumberOfPoints();
772 N_cells
=m_grid
->GetNumberOfCells();
773 cout
<<"N_points="<<N_points
<<endl
;
774 cout
<<"N_cells="<<N_cells
<<endl
;
775 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
776 cout
<<"N_newcells="<<N_newcells
<<endl
;
777 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
778 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
779 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
781 makeCopyNoAlloc(m_grid
, grid_tmp
);
782 //initialize new node counter
783 m_newNodeId
=N_points
;
785 remove_FP_actor(grid_tmp
);
787 makeCopy(grid_tmp
,m_grid
);
789 cout
<<"===remove_FP_all END==="<<endl
;
793 int CreateSpecialMapping::remove_EP_all()
795 cout
<<"===remove_EP_all START==="<<endl
;
797 getAllSurfaceCells(m_AllCells
,m_grid
);
798 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
799 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
800 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
801 m_SelectedNodes
.clear();
802 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
803 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
805 setCells(m_AllCells
);
806 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
810 N_points
=m_grid
->GetNumberOfPoints();
811 N_cells
=m_grid
->GetNumberOfCells();
815 hitlist
.resize(N_points
);
816 offset
.resize(N_points
);
818 marked_cells
.clear();
819 marked_nodes
.clear();
823 //unmark cells (TODO: optimize)
824 marked_cells
.clear();
826 N_points
=m_grid
->GetNumberOfPoints();
827 N_cells
=m_grid
->GetNumberOfCells();
828 cout
<<"N_points="<<N_points
<<endl
;
829 cout
<<"N_cells="<<N_cells
<<endl
;
830 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
831 cout
<<"N_newcells="<<N_newcells
<<endl
;
832 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
833 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
834 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
836 makeCopyNoAlloc(m_grid
, grid_tmp
);
837 //initialize new node counter
838 m_newNodeId
=N_points
;
840 remove_EP_actor(grid_tmp
);
842 makeCopy(grid_tmp
,m_grid
);
844 cout
<<"===remove_EP_all END==="<<endl
;
848 int CreateSpecialMapping::FullEdit()
850 cout
<<"===FullEdit START==="<<endl
;
857 N_points
=m_grid
->GetNumberOfPoints();
858 N_cells
=m_grid
->GetNumberOfCells();
862 hitlist
.resize(N_points
);
863 offset
.resize(N_points
);
865 marked_cells
.clear();
866 marked_nodes
.clear();
868 if(insert_FP
) insert_FP_counter();
869 if(insert_EP
) insert_EP_counter();
870 if(remove_FP
) remove_FP_counter();
871 if(remove_EP
) remove_EP_counter();
873 cout
<<"================="<<endl
;
874 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
875 // cout<<"hitlist="<<hitlist<<endl;
876 cout
<<"================="<<endl
;
878 //unmark cells (TODO: optimize)
879 marked_cells
.clear();
881 N_points
=m_grid
->GetNumberOfPoints();
882 N_cells
=m_grid
->GetNumberOfCells();
883 cout
<<"N_points="<<N_points
<<endl
;
884 cout
<<"N_cells="<<N_cells
<<endl
;
885 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
886 cout
<<"N_newcells="<<N_newcells
<<endl
;
887 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
888 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
889 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
891 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
892 //initialize new node counter
893 m_newNodeId
=N_points
;
895 if(insert_FP
) insert_FP_actor(grid_tmp
);
896 if(insert_EP
) insert_EP_actor(grid_tmp
);
898 cout
<<"================="<<endl
;
899 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
900 // cout<<"hitlist="<<hitlist<<endl;
901 cout
<<"================="<<endl
;
902 if(remove_FP
) remove_FP_actor(grid_tmp
);
903 if(remove_EP
) remove_EP_actor(grid_tmp
);
905 makeCopy(grid_tmp
,m_grid
);
907 cout
<<"===FullEdit END==="<<endl
;
911 int CreateSpecialMapping::remove_EP_all_2()
913 cout
<<"===remove_EP_all_2 START==="<<endl
;
914 getAllSurfaceCells(m_AllCells
,m_grid
);
915 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
916 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
917 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
918 m_SelectedNodes
.clear();
919 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
920 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
922 setCells(m_AllCells
);
923 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
927 N_points
=m_grid
->GetNumberOfPoints();
928 N_cells
=m_grid
->GetNumberOfCells();
934 hitlist
.resize(N_points
);
935 offset
.resize(N_points
);
937 marked_cells
.clear();
938 marked_nodes
.clear();
941 cout
<<"================="<<endl
;
942 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
943 // cout<<"hitlist="<<hitlist<<endl;
944 cout
<<"================="<<endl
;
948 for(int i
=0;i
<hitlist
.size();i
++)
952 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
954 QString num1
;num1
.setNum(i
);
955 QString num2
;num2
.setNum(i
-kills
);
956 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
958 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
959 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
964 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
968 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
972 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
976 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
977 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
978 cout
<<"===remove_EP_all_2 END==="<<endl
;
983 //count all to remove, then remove them one by one
984 int CreateSpecialMapping::remove_FP_all_2()
986 cout
<<"===remove_FP_all_2 START==="<<endl
;
987 /* cout<<"+++++++"<<endl;
988 cout_grid(cout,m_grid,true,true,true,true);
989 cout<<"+++++++"<<endl;*/
991 getAllSurfaceCells(m_AllCells
,m_grid
);
992 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
993 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
994 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
995 m_SelectedNodes
.clear();
996 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
997 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
999 setCells(m_AllCells
);
1000 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1004 N_points
=m_grid
->GetNumberOfPoints();
1005 N_cells
=m_grid
->GetNumberOfCells();
1011 hitlist
.resize(N_points
);
1012 offset
.resize(N_points
);
1014 marked_cells
.clear();
1015 marked_nodes
.clear();
1017 // DualSave("pre-counter");
1018 remove_FP_counter();
1019 // DualSave("post-counter");
1021 // cout_grid(cout,m_grid);
1022 cout
<<"================="<<endl
;
1023 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1024 // cout<<"hitlist="<<hitlist<<endl;
1025 cout
<<"================="<<endl
;
1029 for(int i
=0;i
<hitlist
.size();i
++)
1033 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1035 QString num1
;num1
.setNum(i
);
1036 QString num2
;num2
.setNum(i
-kills
);
1037 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1039 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1040 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1045 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
1049 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
1053 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1057 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1058 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1059 cout
<<"===remove_FP_all_2 END==="<<endl
;
1063 //count all to remove, then remove them all at once
1064 int CreateSpecialMapping::remove_FP_all_3()
1066 cout
<<"===remove_FP_all_3 START==="<<endl
;
1068 getAllSurfaceCells(m_AllCells
,m_grid
);
1069 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1070 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1071 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1072 m_SelectedNodes
.clear();
1073 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1074 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1076 setCells(m_AllCells
);
1077 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1081 N_points
=m_grid
->GetNumberOfPoints();
1082 N_cells
=m_grid
->GetNumberOfCells();
1088 hitlist
.resize(N_points
);
1089 offset
.resize(N_points
);
1091 marked_cells
.clear();
1092 marked_nodes
.clear();
1094 remove_FP_counter();
1095 cout
<<"================="<<endl
;
1096 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1097 cout
<<"================="<<endl
;
1099 QSet
<vtkIdType
> DeadNodes
;
1100 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1102 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1106 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1107 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1108 cout
<<"N_newcells="<<N_newcells
<<endl
;
1110 int kills
=-N_newpoints
;
1111 int contracts
=DeadNodes
.size();
1112 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1113 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1114 cout
<<"===remove_FP_all_3 END==="<<endl
;
1118 //count all to remove, then remove them all at once
1119 int CreateSpecialMapping::remove_EP_all_3()
1121 cout
<<"===remove_EP_all_3 START==="<<endl
;
1123 getAllSurfaceCells(m_AllCells
,m_grid
);
1124 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1125 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1126 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1127 m_SelectedNodes
.clear();
1128 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1129 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1131 setCells(m_AllCells
);
1132 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1136 N_points
=m_grid
->GetNumberOfPoints();
1137 N_cells
=m_grid
->GetNumberOfCells();
1143 hitlist
.resize(N_points
);
1144 offset
.resize(N_points
);
1146 marked_cells
.clear();
1147 marked_nodes
.clear();
1149 remove_EP_counter();
1150 cout
<<"================="<<endl
;
1151 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1152 cout
<<"================="<<endl
;
1154 QSet
<vtkIdType
> DeadNodes
;
1155 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1157 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1161 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1162 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1163 cout
<<"N_newcells="<<N_newcells
<<endl
;
1165 int kills
=-N_newpoints
;
1166 int contracts
=DeadNodes
.size();
1167 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1168 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1169 cout
<<"===remove_EP_all_3 END==="<<endl
;