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 getAllSurfaceCells(m_AllCells
,m_grid
);
120 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
121 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
123 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
125 m_SelectedNodes
.clear();
126 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
127 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
128 getNodesFromCells(m_AllCells
, m_AllNodes
, m_grid
);
131 setCells(m_AllCells
);
133 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
136 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
137 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
138 EG_VTKDCN(vtkIntArray
, node_specified_density
, m_grid
, "node_specified_density");
140 /* //Phase A : Calculate current mesh density
141 cout<<"===Phase A==="<<endl;
143 foreach(vtkIdType node,m_SelectedNodes)
145 VertexMeshDensity nodeVMD = getVMD(node,node_type->GetValue(node));
146 int idx=VMDvector.indexOf(nodeVMD);
147 if(DebugLevel>3) cout<<"idx="<<idx<<endl;
148 if(idx!=-1)//specified
150 node_meshdensity->SetValue(node, VMDvector[idx].density);
154 double L=CurrentVertexAvgDist(node,n2n,m_grid);
156 node_meshdensity->SetValue(node, D);
160 //Phase B : define desired mesh density
161 cout
<<"===Phase B==="<<endl
;
162 double diff
=Convergence_meshdensity
+1;
163 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
167 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
169 foreach(vtkIdType node
,m_AllNodes
)
171 if(DebugLevel
>2) cout
<<"======>"<<endl
;
172 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
173 int idx
=VMDvector
.indexOf(nodeVMD
);
174 node_specified_density
->SetValue(node
, idx
);
175 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
176 if(idx
!=-1)//specified
178 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
182 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
185 cout
<<"------>FIRST:"<<endl
;
186 cout
<<"------>D="<<D
<<endl
;
187 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
188 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
189 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
191 diff
=abs(D
-node_meshdensity
->GetValue(node
));
196 cout
<<"------>NOT FIRST:"<<endl
;
197 cout
<<"------>D="<<D
<<endl
;
198 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
199 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
200 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
201 cout
<<"------>diff="<<diff
<<endl
;
202 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
204 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
206 node_meshdensity
->SetValue(node
, D
);
208 if(DebugLevel
>2) cout
<<"======>"<<endl
;
211 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter_density
);// if first=true, it means no new mesh density has been defined (all densities specified)
212 cout
<<"iter="<<iter
<<endl
;
213 if(iter
>=maxiter_density
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
217 int CreateSpecialMapping::SwapFunction()
219 //Phase E : Delaunay swap
220 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
221 cout
<<"m_bcs="<<m_bcs
<<endl
;
222 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
225 swap
.setGrid(m_grid
);
226 swap
.setBoundaryCodes(bcs_complement
);
231 int CreateSpecialMapping::SmoothFunction()
233 cout
<<"=== SmoothFunction ==="<<endl
;
234 //Phase F : translate points to smooth grid
238 //laplacian smoothing with projection
239 //Roland smoothing with projection
241 //laplacian smoothing with projection
243 Lap
.SetInput(m_bcs
,m_grid
);
244 Lap
.SetNumberOfIterations(N_SmoothIterations
);
249 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
251 VertexMeshDensity VMD
;
254 VMD
.CurrentNode
=node
;
255 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
256 /* createNodeMapping(nodes, _nodes, m_grid);
257 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
260 foreach(vtkIdType C
, n2c
[node
])
262 bc
.insert(cell_code
->GetValue(C
));
263 VMD
.BCmap
[cell_code
->GetValue(C
)]=2;
265 VMD
.BClist
.resize(bc
.size());
266 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
267 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
271 int CreateSpecialMapping::insert_FP_counter()
273 cout
<<"===insert_FP_counter() START==="<<endl
;
274 foreach(vtkIdType id_cell
, m_SelectedCells
)
276 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
278 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
280 marked_cells
[id_cell
]=true;
285 cout
<<"===insert_FP_counter() END==="<<endl
;
289 int CreateSpecialMapping::insert_EP_counter()
291 cout
<<"===insert_EP_counter() START==="<<endl
;
293 //Phase C: Prepare edge_map
294 cout
<<"===Phase C==="<<endl
;
297 foreach(vtkIdType node1
,m_SelectedNodes
)
299 // cout<<"node1="<<node1<<endl;
300 foreach(vtkIdType node2
,n2n
[node1
])
302 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
303 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
307 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
309 StencilVector
.clear();
310 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
311 //rewind the iterator
312 edge_map_iter
.toFront ();
314 while (edge_map_iter
.hasNext()) {
315 edge_map_iter
.next();
316 vtkIdType node1
=edge_map_iter
.key().first
;
317 vtkIdType node2
=edge_map_iter
.key().second
;
318 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
319 QSet
<int> stencil_cells_set
;
320 QVector
<int> stencil_cells_vector
;
321 stencil_cells_set
=n2c
[node1
];
322 stencil_cells_set
.intersect(n2c
[node2
]);
323 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
325 stencil_cells_vector
.resize(stencil_cells_set
.size());
326 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
327 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
329 vtkIdType id_cell
=stencil_cells_vector
[0];
330 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
331 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
332 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
333 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
334 stencil_t S
=getStencil(id_cell
,SideToSplit
);
336 bool stencil_marked
=false;
337 foreach(vtkIdType C
,stencil_cells_vector
)
339 if(marked_cells
[C
]) stencil_marked
=true;
341 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
342 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
344 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
346 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
348 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
349 StencilVector
.push_back(S
);
351 if(stencil_cells_vector
.size()==2)//2 cells around the edge
356 else//1 cell around the edge
362 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
364 cout
<<"===insert_EP_counter() END==="<<endl
;
368 int CreateSpecialMapping::remove_FP_counter()
370 cout
<<"===remove_FP_counter() START==="<<endl
;
371 cout
<<"marked_cells="<<marked_cells
<<endl
;
372 // cout<<"hitlist="<<hitlist<<endl;
373 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
374 cout
<<"N_newcells="<<N_newcells
<<endl
;
375 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
376 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
379 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
380 foreach(vtkIdType node
,m_SelectedNodes
)
382 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
385 foreach(vtkIdType C
,n2c
[node
])
387 if(marked_cells
[C
]) marked
=true;
390 QSet
<vtkIdType
> DeadCells
;
391 QSet
<vtkIdType
> MutatedCells
;
392 QSet
<vtkIdType
> MutilatedCells
;
393 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
395 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
398 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
404 cout
<<"===remove_FP_counter() END==="<<endl
;
408 int CreateSpecialMapping::remove_EP_counter()
410 cout
<<"===remove_EP_counter() START==="<<endl
;
412 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
413 foreach(vtkIdType node
,m_SelectedNodes
)
415 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
418 foreach(vtkIdType C
,n2c
[node
])
420 if(marked_cells
[C
]) marked
=true;
422 QSet
<vtkIdType
> DeadCells
;
423 QSet
<vtkIdType
> MutatedCells
;
424 QSet
<vtkIdType
> MutilatedCells
;
425 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
427 cout
<<"removing edge point "<<node
<<endl
;
430 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
431 if(n2n
[node
].size()==4)//4 cells around the edge
436 else//2 cells around the edge
444 cout
<<"===remove_EP_counter() END==="<<endl
;
448 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
450 cout
<<"===insert_FP_actor START==="<<endl
;
452 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
453 foreach(vtkIdType id_cell
, m_SelectedCells
)
455 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
456 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
458 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
460 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
461 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
462 if(DebugLevel
>42) cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
464 vtkIdType N_pts
, *pts
;
465 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
468 int N_neighbours
=N_pts
;
469 if(DebugLevel
>42) cout
<<"N_neighbours="<<N_neighbours
<<endl
;
471 vtkIdType pts_triangle
[4][3];
472 for(int i
=0;i
<N_neighbours
;i
++)
474 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
477 C
=(1/(double)N_neighbours
)*C
;
478 addPoint(grid_tmp
,m_newNodeId
,C
.data());
479 vtkIdType intmidpoint
=m_newNodeId
;
482 for(int i
=0;i
<N_neighbours
;i
++)
484 pts_triangle
[i
][0]=pts
[i
];
485 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
486 pts_triangle
[i
][2]=intmidpoint
;
489 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
490 cell_code_tmp
->SetValue(id_cell
, newBC
);
494 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
495 cell_code_tmp
->SetValue(newCellId
, newBC
);
501 cout
<<"===insert_FP_actor END==="<<endl
;
505 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
507 cout
<<"===insert_EP_actor START==="<<endl
;
509 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
510 foreach(stencil_t S
,StencilVector
)
512 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
514 grid_tmp
->GetPoint(S
.p
[1],A
.data());
515 grid_tmp
->GetPoint(S
.p
[3],B
.data());
517 addPoint(grid_tmp
,m_newNodeId
,M
.data());
518 if(DebugLevel
>0) cout
<<"NEW EDGE POINT: "<<m_newNodeId
<<endl
;
520 vtkIdType pts_triangle
[4][3];
522 if(S
.valid
){//there is a neighbour cell
523 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
524 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
525 marked_cells
[S
.id_cell1
]=true;
526 marked_cells
[S
.id_cell2
]=true;
530 pts_triangle
[i
][0]=S
.p
[i
];
531 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
532 pts_triangle
[i
][2]=m_newNodeId
;
535 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
536 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
538 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
539 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
541 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
542 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
545 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
546 cell_code_tmp
->SetValue(newCellId
, bc2
);
547 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
548 cell_code_tmp
->SetValue(newCellId
, bc1
);
550 else{//there is no neighbour cell
551 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
552 marked_cells
[S
.id_cell1
]=true;
554 pts_triangle
[0][0]=S
.p
[0];
555 pts_triangle
[0][1]=S
.p
[1];
556 pts_triangle
[0][2]=m_newNodeId
;
557 pts_triangle
[3][0]=S
.p
[3];
558 pts_triangle
[3][1]=S
.p
[0];
559 pts_triangle
[3][2]=m_newNodeId
;
561 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
563 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
564 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
567 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
568 cell_code_tmp
->SetValue(newCellId
, bc1
);
573 cout
<<"===insert_EP_actor END==="<<endl
;
577 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
579 cout
<<"===remove_FP_actor START==="<<endl
;
582 foreach(vtkIdType node
,m_SelectedNodes
)
589 foreach(vtkIdType C
,n2c
[node
])
591 if(marked_cells
[C
]) marked
=true;
593 if( !marked
&& remove_fieldpoint(node
) )
595 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
596 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
597 //TODO: Special copy function, leaving out nodes to remove
600 cout
<<"===remove_FP_actor END==="<<endl
;
604 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
606 cout
<<"===remove_EP_actor START==="<<endl
;
609 foreach(vtkIdType node
,m_SelectedNodes
)
612 foreach(vtkIdType C
,n2c
[node
])
614 if(marked_cells
[C
]) marked
=true;
616 if( !marked
&& remove_edgepoint(node
) )
618 if(DebugLevel
>1) cout
<<"removing edge point "<<node
<<endl
;
619 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
620 if(n2n
[node
].size()==4)//4 cells around the edge
624 else//2 cells around the edge
630 cout
<<"===remove_EP_actor END==="<<endl
;
634 int CreateSpecialMapping::insert_FP_all()
636 cout
<<"===insert_FP_all START==="<<endl
;
638 getAllSurfaceCells(m_AllCells
,m_grid
);
639 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
640 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
641 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
642 m_SelectedNodes
.clear();
643 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
644 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
646 setCells(m_AllCells
);
647 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
651 N_points
=m_grid
->GetNumberOfPoints();
652 N_cells
=m_grid
->GetNumberOfCells();
656 marked_cells
.clear();
657 marked_nodes
.clear();
661 //unmark cells (TODO: optimize)
662 marked_cells
.clear();
664 N_points
=m_grid
->GetNumberOfPoints();
665 N_cells
=m_grid
->GetNumberOfCells();
666 cout
<<"N_points="<<N_points
<<endl
;
667 cout
<<"N_cells="<<N_cells
<<endl
;
668 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
669 cout
<<"N_newcells="<<N_newcells
<<endl
;
670 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
671 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
672 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
674 makeCopyNoAlloc(m_grid
, grid_tmp
);
675 //initialize new node counter
676 m_newNodeId
=N_points
;
678 insert_FP_actor(grid_tmp
);
680 makeCopy(grid_tmp
,m_grid
);
681 cout
<<"===insert_FP_all END==="<<endl
;
685 int CreateSpecialMapping::insert_EP_all()
687 cout
<<"===insert_EP_all START==="<<endl
;
689 getAllSurfaceCells(m_AllCells
,m_grid
);
690 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
691 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
692 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
693 m_SelectedNodes
.clear();
694 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
695 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
697 setCells(m_AllCells
);
698 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
702 N_points
=m_grid
->GetNumberOfPoints();
703 N_cells
=m_grid
->GetNumberOfCells();
707 marked_cells
.clear();
708 marked_nodes
.clear();
712 //unmark cells (TODO: optimize)
713 marked_cells
.clear();
715 N_points
=m_grid
->GetNumberOfPoints();
716 N_cells
=m_grid
->GetNumberOfCells();
717 cout
<<"N_points="<<N_points
<<endl
;
718 cout
<<"N_cells="<<N_cells
<<endl
;
719 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
720 cout
<<"N_newcells="<<N_newcells
<<endl
;
721 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
722 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
723 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
725 makeCopyNoAlloc(m_grid
, grid_tmp
);
726 //initialize new node counter
727 m_newNodeId
=N_points
;
729 insert_EP_actor(grid_tmp
);
731 makeCopy(grid_tmp
,m_grid
);
733 cout
<<"===insert_EP_all END==="<<endl
;
737 int CreateSpecialMapping::remove_FP_all()
739 cout
<<"===remove_FP_all START==="<<endl
;
741 getAllSurfaceCells(m_AllCells
,m_grid
);
742 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
743 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
744 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
745 m_SelectedNodes
.clear();
746 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
747 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
749 setCells(m_AllCells
);
750 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
754 N_points
=m_grid
->GetNumberOfPoints();
755 N_cells
=m_grid
->GetNumberOfCells();
759 hitlist
.resize(N_points
);
760 offset
.resize(N_points
);
762 marked_cells
.clear();
763 marked_nodes
.clear();
767 //unmark cells (TODO: optimize)
768 marked_cells
.clear();
770 N_points
=m_grid
->GetNumberOfPoints();
771 N_cells
=m_grid
->GetNumberOfCells();
772 cout
<<"N_points="<<N_points
<<endl
;
773 cout
<<"N_cells="<<N_cells
<<endl
;
774 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
775 cout
<<"N_newcells="<<N_newcells
<<endl
;
776 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
777 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
778 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
780 makeCopyNoAlloc(m_grid
, grid_tmp
);
781 //initialize new node counter
782 m_newNodeId
=N_points
;
784 remove_FP_actor(grid_tmp
);
786 makeCopy(grid_tmp
,m_grid
);
788 cout
<<"===remove_FP_all END==="<<endl
;
792 int CreateSpecialMapping::remove_EP_all()
794 cout
<<"===remove_EP_all START==="<<endl
;
796 getAllSurfaceCells(m_AllCells
,m_grid
);
797 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
798 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
799 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
800 m_SelectedNodes
.clear();
801 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
802 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
804 setCells(m_AllCells
);
805 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
809 N_points
=m_grid
->GetNumberOfPoints();
810 N_cells
=m_grid
->GetNumberOfCells();
814 hitlist
.resize(N_points
);
815 offset
.resize(N_points
);
817 marked_cells
.clear();
818 marked_nodes
.clear();
822 //unmark cells (TODO: optimize)
823 marked_cells
.clear();
825 N_points
=m_grid
->GetNumberOfPoints();
826 N_cells
=m_grid
->GetNumberOfCells();
827 cout
<<"N_points="<<N_points
<<endl
;
828 cout
<<"N_cells="<<N_cells
<<endl
;
829 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
830 cout
<<"N_newcells="<<N_newcells
<<endl
;
831 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
832 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
833 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
835 makeCopyNoAlloc(m_grid
, grid_tmp
);
836 //initialize new node counter
837 m_newNodeId
=N_points
;
839 remove_EP_actor(grid_tmp
);
841 makeCopy(grid_tmp
,m_grid
);
843 cout
<<"===remove_EP_all END==="<<endl
;
847 int CreateSpecialMapping::FullEdit()
849 cout
<<"===FullEdit START==="<<endl
;
856 N_points
=m_grid
->GetNumberOfPoints();
857 N_cells
=m_grid
->GetNumberOfCells();
861 hitlist
.resize(N_points
);
862 offset
.resize(N_points
);
864 marked_cells
.clear();
865 marked_nodes
.clear();
867 if(insert_FP
) insert_FP_counter();
868 if(insert_EP
) insert_EP_counter();
869 if(remove_FP
) remove_FP_counter();
870 if(remove_EP
) remove_EP_counter();
872 cout
<<"================="<<endl
;
873 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
874 // cout<<"hitlist="<<hitlist<<endl;
875 cout
<<"================="<<endl
;
877 //unmark cells (TODO: optimize)
878 marked_cells
.clear();
880 N_points
=m_grid
->GetNumberOfPoints();
881 N_cells
=m_grid
->GetNumberOfCells();
882 cout
<<"N_points="<<N_points
<<endl
;
883 cout
<<"N_cells="<<N_cells
<<endl
;
884 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
885 cout
<<"N_newcells="<<N_newcells
<<endl
;
886 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
887 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
888 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
890 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
891 //initialize new node counter
892 m_newNodeId
=N_points
;
894 if(insert_FP
) insert_FP_actor(grid_tmp
);
895 if(insert_EP
) insert_EP_actor(grid_tmp
);
897 cout
<<"================="<<endl
;
898 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
899 // cout<<"hitlist="<<hitlist<<endl;
900 cout
<<"================="<<endl
;
901 if(remove_FP
) remove_FP_actor(grid_tmp
);
902 if(remove_EP
) remove_EP_actor(grid_tmp
);
904 makeCopy(grid_tmp
,m_grid
);
906 cout
<<"===FullEdit END==="<<endl
;
910 int CreateSpecialMapping::remove_EP_all_2()
912 cout
<<"===remove_EP_all_2 START==="<<endl
;
913 getAllSurfaceCells(m_AllCells
,m_grid
);
914 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
915 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
916 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
917 m_SelectedNodes
.clear();
918 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
919 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
921 setCells(m_AllCells
);
922 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
926 N_points
=m_grid
->GetNumberOfPoints();
927 N_cells
=m_grid
->GetNumberOfCells();
933 hitlist
.resize(N_points
);
934 offset
.resize(N_points
);
936 marked_cells
.clear();
937 marked_nodes
.clear();
940 cout
<<"================="<<endl
;
941 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
942 // cout<<"hitlist="<<hitlist<<endl;
943 cout
<<"================="<<endl
;
947 for(int i
=0;i
<hitlist
.size();i
++)
951 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
953 QString num1
;num1
.setNum(i
);
954 QString num2
;num2
.setNum(i
-kills
);
955 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
957 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
958 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
963 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
967 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
971 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
975 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
976 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
977 cout
<<"===remove_EP_all_2 END==="<<endl
;
982 //count all to remove, then remove them one by one
983 int CreateSpecialMapping::remove_FP_all_2()
985 cout
<<"===remove_FP_all_2 START==="<<endl
;
986 /* cout<<"+++++++"<<endl;
987 cout_grid(cout,m_grid,true,true,true,true);
988 cout<<"+++++++"<<endl;*/
990 getAllSurfaceCells(m_AllCells
,m_grid
);
991 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
992 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
993 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
994 m_SelectedNodes
.clear();
995 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
996 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
998 setCells(m_AllCells
);
999 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1003 N_points
=m_grid
->GetNumberOfPoints();
1004 N_cells
=m_grid
->GetNumberOfCells();
1010 hitlist
.resize(N_points
);
1011 offset
.resize(N_points
);
1013 marked_cells
.clear();
1014 marked_nodes
.clear();
1016 // DualSave("pre-counter");
1017 remove_FP_counter();
1018 // DualSave("post-counter");
1020 // cout_grid(cout,m_grid);
1021 cout
<<"================="<<endl
;
1022 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1023 // cout<<"hitlist="<<hitlist<<endl;
1024 cout
<<"================="<<endl
;
1028 for(int i
=0;i
<hitlist
.size();i
++)
1032 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1034 QString num1
;num1
.setNum(i
);
1035 QString num2
;num2
.setNum(i
-kills
);
1036 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1038 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1039 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1044 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
1048 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
1052 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1056 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1057 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1058 cout
<<"===remove_FP_all_2 END==="<<endl
;
1062 //count all to remove, then remove them all at once
1063 int CreateSpecialMapping::remove_FP_all_3()
1065 cout
<<"===remove_FP_all_3 START==="<<endl
;
1067 getAllSurfaceCells(m_AllCells
,m_grid
);
1068 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1069 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1070 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1071 m_SelectedNodes
.clear();
1072 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1073 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1075 setCells(m_AllCells
);
1076 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1080 N_points
=m_grid
->GetNumberOfPoints();
1081 N_cells
=m_grid
->GetNumberOfCells();
1087 hitlist
.resize(N_points
);
1088 offset
.resize(N_points
);
1090 marked_cells
.clear();
1091 marked_nodes
.clear();
1093 remove_FP_counter();
1094 cout
<<"================="<<endl
;
1095 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1096 cout
<<"================="<<endl
;
1098 QSet
<vtkIdType
> DeadNodes
;
1099 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1101 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1105 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1106 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1107 cout
<<"N_newcells="<<N_newcells
<<endl
;
1109 int kills
=-N_newpoints
;
1110 int contracts
=DeadNodes
.size();
1111 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1112 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1113 cout
<<"===remove_FP_all_3 END==="<<endl
;
1117 //count all to remove, then remove them all at once
1118 int CreateSpecialMapping::remove_EP_all_3()
1120 cout
<<"===remove_EP_all_3 START==="<<endl
;
1122 getAllSurfaceCells(m_AllCells
,m_grid
);
1123 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
1124 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
1125 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
1126 m_SelectedNodes
.clear();
1127 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
1128 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
1130 setCells(m_AllCells
);
1131 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1135 N_points
=m_grid
->GetNumberOfPoints();
1136 N_cells
=m_grid
->GetNumberOfCells();
1142 hitlist
.resize(N_points
);
1143 offset
.resize(N_points
);
1145 marked_cells
.clear();
1146 marked_nodes
.clear();
1148 remove_EP_counter();
1149 cout
<<"================="<<endl
;
1150 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1151 cout
<<"================="<<endl
;
1153 QSet
<vtkIdType
> DeadNodes
;
1154 for(vtkIdType i
=0;i
<hitlist
.size();i
++)
1156 if(hitlist
[i
]==1) DeadNodes
.insert(i
);
1160 DeleteSetOfPoints(m_grid
, DeadNodes
, N_newpoints
, N_newcells
);
1161 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
1162 cout
<<"N_newcells="<<N_newcells
<<endl
;
1164 int kills
=-N_newpoints
;
1165 int contracts
=DeadNodes
.size();
1166 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1167 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1168 cout
<<"===remove_EP_all_3 END==="<<endl
;