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::UpdateDesiredMeshDensity()
23 getAllSurfaceCells(m_AllCells
,m_grid
);
24 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
25 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
27 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
29 m_SelectedNodes
.clear();
30 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
31 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
35 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
38 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
39 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
41 //Phase A : Calculate current mesh density
42 cout
<<"===Phase A==="<<endl
;
44 foreach(vtkIdType node
,m_SelectedNodes
)
46 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
47 int idx
=VMDvector
.indexOf(nodeVMD
);
48 if(DebugLevel
>3) cout
<<"idx="<<idx
<<endl
;
49 if(idx
!=-1)//specified
51 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
55 double L
=CurrentVertexAvgDist(node
,n2n
,m_grid
);
57 node_meshdensity
->SetValue(node
, D
);
61 //Phase B : define desired mesh density
62 cout
<<"===Phase B==="<<endl
;
63 double diff
=Convergence_meshdensity
+1;
64 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
69 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
71 foreach(vtkIdType node
,m_SelectedNodes
)
73 if(DebugLevel
>2) cout
<<"======>"<<endl
;
74 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
75 int idx
=VMDvector
.indexOf(nodeVMD
);
76 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
77 if(idx
!=-1)//specified
79 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
83 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
86 cout
<<"------>FIRST:"<<endl
;
87 cout
<<"------>D="<<D
<<endl
;
88 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
89 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
90 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
92 diff
=abs(D
-node_meshdensity
->GetValue(node
));
97 cout
<<"------>NOT FIRST:"<<endl
;
98 cout
<<"------>D="<<D
<<endl
;
99 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
100 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
101 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
102 cout
<<"------>diff="<<diff
<<endl
;
103 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
105 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
107 node_meshdensity
->SetValue(node
, D
);
109 if(DebugLevel
>2) cout
<<"======>"<<endl
;
112 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter
);// if first=true, it means no new mesh density has been defined (all densities specified)
113 cout
<<"iter="<<iter
<<endl
;
114 if(iter
>=maxiter
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
117 int CreateSpecialMapping::Process()
120 for(i_iter
=0;i_iter
<NumberOfIterations
;i_iter
++)//TODO:Optimize this loop
122 cout
<<"===ITERATION NB "<<i_iter
<<"/"<<NumberOfIterations
<<"==="<<endl
;
124 m_total_N_newpoints
=0;
125 m_total_N_newcells
=0;
127 getAllSurfaceCells(m_AllCells
,m_grid
);
128 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
129 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
131 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
133 m_SelectedNodes
.clear();
134 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
135 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
137 setCells(m_AllCells
);
139 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
141 //Phase C: Prepare edge_map
142 cout
<<"===Phase C==="<<endl
;
145 foreach(vtkIdType node1
,m_SelectedNodes
)
147 // cout<<"node1="<<node1<<endl;
148 foreach(vtkIdType node2
,n2n
[node1
])
150 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
151 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
155 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
157 //Phase D: edit points
158 cout
<<"===Phase D==="<<endl
;
168 /* if(insert_FP) insert_FP_all();
169 if(insert_EP) insert_EP_all();
170 if(remove_FP) remove_FP_all();
171 if(remove_EP) remove_EP_all();*/
175 UpdateDesiredMeshDensity();
181 UpdateDesiredMeshDensity();
187 UpdateDesiredMeshDensity();
193 UpdateDesiredMeshDensity();
198 //Phase E : Delaunay swap
200 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
201 cout
<<"m_bcs="<<m_bcs
<<endl
;
202 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
205 swap
.setGrid(m_grid
);
206 swap
.setBoundaryCodes(bcs_complement
);
210 //Phase F : translate points to smooth grid
214 //laplacian smoothing with projection
215 //Roland smoothing with projection
217 //laplacian smoothing with projection
218 if(DoLaplaceSmoothing
) {
220 Lap
.SetInput(m_bcs
,m_grid
);
221 Lap
.SetNumberOfIterations(N_SmoothIterations
);
225 cout
<<"===Summary==="<<endl
;
226 cout
<<"N_inserted_FP="<<N_inserted_FP
<<endl
;
227 cout
<<"N_inserted_EP="<<N_inserted_EP
<<endl
;
228 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
229 cout
<<"N_removed_EP="<<N_removed_EP
<<endl
;
231 cout
<<"N_points="<<N_points
<<endl
;
232 cout
<<"N_cells="<<N_cells
<<endl
;
233 cout
<<"m_total_N_newpoints="<<m_total_N_newpoints
<<endl
;
234 cout
<<"m_total_N_newcells="<<m_total_N_newcells
<<endl
;
235 cout
<<"============"<<endl
;
237 if(m_total_N_newpoints
==0 && m_total_N_newcells
==0) break;
241 cout
<<"i_iter/NumberOfIterations="<<i_iter
<<"/"<<NumberOfIterations
<<endl
;
247 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
249 VertexMeshDensity VMD
;
252 VMD
.CurrentNode
=node
;
253 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
254 /* createNodeMapping(nodes, _nodes, m_grid);
255 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
258 foreach(vtkIdType C
, n2c
[node
])
260 bc
.insert(cell_code
->GetValue(C
));
262 VMD
.BClist
.resize(bc
.size());
263 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
264 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
268 int CreateSpecialMapping::insert_FP_counter()
270 cout
<<"===insert_FP_counter() START==="<<endl
;
271 foreach(vtkIdType id_cell
, m_SelectedCells
)
273 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
275 cout
<<"inserting a field point "<<id_cell
<<endl
;
277 marked_cells
[id_cell
]=true;
282 cout
<<"===insert_FP_counter() END==="<<endl
;
286 int CreateSpecialMapping::insert_EP_counter()
288 cout
<<"===insert_EP_counter() START==="<<endl
;
289 StencilVector
.clear();
290 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
291 //rewind the iterator
292 edge_map_iter
.toFront ();
294 while (edge_map_iter
.hasNext()) {
295 edge_map_iter
.next();
296 vtkIdType node1
=edge_map_iter
.key().first
;
297 vtkIdType node2
=edge_map_iter
.key().second
;
298 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
299 QSet
<int> stencil_cells_set
;
300 QVector
<int> stencil_cells_vector
;
301 stencil_cells_set
=n2c
[node1
];
302 stencil_cells_set
.intersect(n2c
[node2
]);
303 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
305 stencil_cells_vector
.resize(stencil_cells_set
.size());
306 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
307 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
309 vtkIdType id_cell
=stencil_cells_vector
[0];
310 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
311 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
312 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
313 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
314 stencil_t S
=getStencil(id_cell
,SideToSplit
);
316 bool stencil_marked
=false;
317 foreach(vtkIdType C
,stencil_cells_vector
)
319 if(marked_cells
[C
]) stencil_marked
=true;
321 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
322 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
324 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
326 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
328 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
329 StencilVector
.push_back(S
);
331 if(stencil_cells_vector
.size()==2)//2 cells around the edge
336 else//1 cell around the edge
342 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
344 cout
<<"===insert_EP_counter() END==="<<endl
;
348 int CreateSpecialMapping::remove_FP_counter()
350 cout
<<"===remove_FP_counter() START==="<<endl
;
351 cout
<<"marked_cells="<<marked_cells
<<endl
;
352 cout
<<"hitlist="<<hitlist
<<endl
;
353 cout
<<"N_newcells="<<N_newcells
<<endl
;
354 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
355 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
358 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
359 foreach(vtkIdType node
,m_SelectedNodes
)
361 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
364 foreach(vtkIdType C
,n2c
[node
])
366 if(marked_cells
[C
]) marked
=true;
369 QSet
<vtkIdType
> DeadCells
;
370 QSet
<vtkIdType
> MutatedCells
;
371 QSet
<vtkIdType
> MutilatedCells
;
372 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
374 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
377 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
383 cout
<<"===remove_FP_counter() END==="<<endl
;
387 int CreateSpecialMapping::remove_EP_counter()
389 cout
<<"===remove_EP_counter() START==="<<endl
;
391 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
392 foreach(vtkIdType node
,m_SelectedNodes
)
394 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
397 foreach(vtkIdType C
,n2c
[node
])
399 if(marked_cells
[C
]) marked
=true;
401 QSet
<vtkIdType
> DeadCells
;
402 QSet
<vtkIdType
> MutatedCells
;
403 QSet
<vtkIdType
> MutilatedCells
;
404 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
406 cout
<<"removing edge point "<<node
<<endl
;
409 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
410 if(n2n
[node
].size()==4)//4 cells around the edge
415 else//2 cells around the edge
423 cout
<<"===remove_EP_counter() END==="<<endl
;
427 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
429 cout
<<"===insert_FP_actor START==="<<endl
;
431 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
432 foreach(vtkIdType id_cell
, m_SelectedCells
)
434 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
435 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
437 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
439 cout
<<"inserting a field point "<<id_cell
<<endl
;
440 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
441 cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
443 vtkIdType N_pts
, *pts
;
444 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
447 int N_neighbours
=N_pts
;
448 cout
<<"N_neighbours="<<N_neighbours
<<endl
;
450 vtkIdType pts_triangle
[4][3];
451 for(int i
=0;i
<N_neighbours
;i
++)
453 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
456 C
=(1/(double)N_neighbours
)*C
;
457 addPoint(grid_tmp
,m_newNodeId
,C
.data());
458 vtkIdType intmidpoint
=m_newNodeId
;
461 for(int i
=0;i
<N_neighbours
;i
++)
463 pts_triangle
[i
][0]=pts
[i
];
464 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
465 pts_triangle
[i
][2]=intmidpoint
;
468 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
469 cell_code_tmp
->SetValue(id_cell
, newBC
);
473 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
474 cell_code_tmp
->SetValue(newCellId
, newBC
);
480 cout
<<"===insert_FP_actor END==="<<endl
;
484 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
486 cout
<<"===insert_EP_actor START==="<<endl
;
488 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
489 foreach(stencil_t S
,StencilVector
)
491 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
493 grid_tmp
->GetPoint(S
.p
[1],A
.data());
494 grid_tmp
->GetPoint(S
.p
[3],B
.data());
496 addPoint(grid_tmp
,m_newNodeId
,M
.data());
498 vtkIdType pts_triangle
[4][3];
500 if(S
.valid
){//there is a neighbour cell
501 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
502 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
503 marked_cells
[S
.id_cell1
]=true;
504 marked_cells
[S
.id_cell2
]=true;
508 pts_triangle
[i
][0]=S
.p
[i
];
509 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
510 pts_triangle
[i
][2]=m_newNodeId
;
513 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
514 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
516 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
517 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
519 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
520 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
523 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
524 cell_code_tmp
->SetValue(newCellId
, bc2
);
525 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
526 cell_code_tmp
->SetValue(newCellId
, bc1
);
528 else{//there is no neighbour cell
529 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
530 marked_cells
[S
.id_cell1
]=true;
532 pts_triangle
[0][0]=S
.p
[0];
533 pts_triangle
[0][1]=S
.p
[1];
534 pts_triangle
[0][2]=m_newNodeId
;
535 pts_triangle
[3][0]=S
.p
[3];
536 pts_triangle
[3][1]=S
.p
[0];
537 pts_triangle
[3][2]=m_newNodeId
;
539 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
541 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
542 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
545 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
546 cell_code_tmp
->SetValue(newCellId
, bc1
);
551 cout
<<"===insert_EP_actor END==="<<endl
;
555 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
557 cout
<<"===remove_FP_actor START==="<<endl
;
559 foreach(vtkIdType node
,m_SelectedNodes
)
566 foreach(vtkIdType C
,n2c
[node
])
568 if(marked_cells
[C
]) marked
=true;
570 if( !marked
&& remove_fieldpoint(node
) )
572 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
573 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
574 //TODO: Special copy function, leaving out nodes to remove
577 cout
<<"===remove_FP_actor END==="<<endl
;
581 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
583 cout
<<"===remove_EP_actor START==="<<endl
;
585 foreach(vtkIdType node
,m_SelectedNodes
)
588 foreach(vtkIdType C
,n2c
[node
])
590 if(marked_cells
[C
]) marked
=true;
592 if( !marked
&& remove_edgepoint(node
) )
594 cout
<<"removing edge point "<<node
<<endl
;
595 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
596 if(n2n
[node
].size()==4)//4 cells around the edge
600 else//2 cells around the edge
606 cout
<<"===remove_EP_actor END==="<<endl
;
610 int CreateSpecialMapping::insert_FP_all()
612 cout
<<"===insert_FP_all START==="<<endl
;
614 getAllSurfaceCells(m_AllCells
,m_grid
);
615 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
616 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
617 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
618 m_SelectedNodes
.clear();
619 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
620 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
622 setCells(m_AllCells
);
623 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
627 N_points
=m_grid
->GetNumberOfPoints();
628 N_cells
=m_grid
->GetNumberOfCells();
632 marked_cells
.clear();
633 marked_nodes
.clear();
637 //unmark cells (TODO: optimize)
638 marked_cells
.clear();
640 N_points
=m_grid
->GetNumberOfPoints();
641 N_cells
=m_grid
->GetNumberOfCells();
642 cout
<<"N_points="<<N_points
<<endl
;
643 cout
<<"N_cells="<<N_cells
<<endl
;
644 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
645 cout
<<"N_newcells="<<N_newcells
<<endl
;
646 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
647 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
648 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
650 makeCopyNoAlloc(m_grid
, grid_tmp
);
651 //initialize new node counter
652 m_newNodeId
=N_points
;
654 insert_FP_actor(grid_tmp
);
656 makeCopy(grid_tmp
,m_grid
);
657 cout
<<"===insert_FP_all END==="<<endl
;
661 int CreateSpecialMapping::insert_EP_all()
663 cout
<<"===insert_EP_all START==="<<endl
;
665 getAllSurfaceCells(m_AllCells
,m_grid
);
666 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
667 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
668 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
669 m_SelectedNodes
.clear();
670 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
671 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
673 setCells(m_AllCells
);
674 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
678 N_points
=m_grid
->GetNumberOfPoints();
679 N_cells
=m_grid
->GetNumberOfCells();
683 marked_cells
.clear();
684 marked_nodes
.clear();
688 //unmark cells (TODO: optimize)
689 marked_cells
.clear();
691 N_points
=m_grid
->GetNumberOfPoints();
692 N_cells
=m_grid
->GetNumberOfCells();
693 cout
<<"N_points="<<N_points
<<endl
;
694 cout
<<"N_cells="<<N_cells
<<endl
;
695 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
696 cout
<<"N_newcells="<<N_newcells
<<endl
;
697 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
698 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
699 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
701 makeCopyNoAlloc(m_grid
, grid_tmp
);
702 //initialize new node counter
703 m_newNodeId
=N_points
;
705 insert_EP_actor(grid_tmp
);
707 makeCopy(grid_tmp
,m_grid
);
709 cout
<<"===insert_EP_all END==="<<endl
;
713 int CreateSpecialMapping::remove_FP_all()
715 cout
<<"===remove_FP_all START==="<<endl
;
717 getAllSurfaceCells(m_AllCells
,m_grid
);
718 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
719 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
720 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
721 m_SelectedNodes
.clear();
722 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
723 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
725 setCells(m_AllCells
);
726 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
730 N_points
=m_grid
->GetNumberOfPoints();
731 N_cells
=m_grid
->GetNumberOfCells();
735 hitlist
.resize(N_points
);
736 offset
.resize(N_points
);
738 marked_cells
.clear();
739 marked_nodes
.clear();
743 //unmark cells (TODO: optimize)
744 marked_cells
.clear();
746 N_points
=m_grid
->GetNumberOfPoints();
747 N_cells
=m_grid
->GetNumberOfCells();
748 cout
<<"N_points="<<N_points
<<endl
;
749 cout
<<"N_cells="<<N_cells
<<endl
;
750 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
751 cout
<<"N_newcells="<<N_newcells
<<endl
;
752 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
753 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
754 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
756 makeCopyNoAlloc(m_grid
, grid_tmp
);
757 //initialize new node counter
758 m_newNodeId
=N_points
;
760 remove_FP_actor(grid_tmp
);
762 makeCopy(grid_tmp
,m_grid
);
764 cout
<<"===remove_FP_all END==="<<endl
;
768 int CreateSpecialMapping::remove_EP_all()
770 cout
<<"===remove_EP_all START==="<<endl
;
772 getAllSurfaceCells(m_AllCells
,m_grid
);
773 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
774 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
775 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
776 m_SelectedNodes
.clear();
777 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
778 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
780 setCells(m_AllCells
);
781 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
785 N_points
=m_grid
->GetNumberOfPoints();
786 N_cells
=m_grid
->GetNumberOfCells();
790 hitlist
.resize(N_points
);
791 offset
.resize(N_points
);
793 marked_cells
.clear();
794 marked_nodes
.clear();
798 //unmark cells (TODO: optimize)
799 marked_cells
.clear();
801 N_points
=m_grid
->GetNumberOfPoints();
802 N_cells
=m_grid
->GetNumberOfCells();
803 cout
<<"N_points="<<N_points
<<endl
;
804 cout
<<"N_cells="<<N_cells
<<endl
;
805 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
806 cout
<<"N_newcells="<<N_newcells
<<endl
;
807 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
808 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
809 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
811 makeCopyNoAlloc(m_grid
, grid_tmp
);
812 //initialize new node counter
813 m_newNodeId
=N_points
;
815 remove_EP_actor(grid_tmp
);
817 makeCopy(grid_tmp
,m_grid
);
819 cout
<<"===remove_EP_all END==="<<endl
;
823 int CreateSpecialMapping::FullEdit()
825 cout
<<"===FullEdit START==="<<endl
;
832 N_points
=m_grid
->GetNumberOfPoints();
833 N_cells
=m_grid
->GetNumberOfCells();
837 hitlist
.resize(N_points
);
838 offset
.resize(N_points
);
840 marked_cells
.clear();
841 marked_nodes
.clear();
843 if(insert_FP
) insert_FP_counter();
844 if(insert_EP
) insert_EP_counter();
845 if(remove_FP
) remove_FP_counter();
846 if(remove_EP
) remove_EP_counter();
848 cout
<<"================="<<endl
;
849 cout
<<"hitlist="<<hitlist
<<endl
;
850 cout
<<"================="<<endl
;
852 //unmark cells (TODO: optimize)
853 marked_cells
.clear();
855 N_points
=m_grid
->GetNumberOfPoints();
856 N_cells
=m_grid
->GetNumberOfCells();
857 cout
<<"N_points="<<N_points
<<endl
;
858 cout
<<"N_cells="<<N_cells
<<endl
;
859 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
860 cout
<<"N_newcells="<<N_newcells
<<endl
;
861 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
862 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
863 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
865 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
866 //initialize new node counter
867 m_newNodeId
=N_points
;
869 if(insert_FP
) insert_FP_actor(grid_tmp
);
870 if(insert_EP
) insert_EP_actor(grid_tmp
);
872 cout
<<"================="<<endl
;
873 cout
<<"hitlist="<<hitlist
<<endl
;
874 cout
<<"================="<<endl
;
875 if(remove_FP
) remove_FP_actor(grid_tmp
);
876 if(remove_EP
) remove_EP_actor(grid_tmp
);
878 makeCopy(grid_tmp
,m_grid
);
880 cout
<<"===FullEdit END==="<<endl
;
884 int CreateSpecialMapping::remove_EP_all_2()
886 cout
<<"===remove_EP_all_2 START==="<<endl
;
887 getAllSurfaceCells(m_AllCells
,m_grid
);
888 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
889 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
890 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
891 m_SelectedNodes
.clear();
892 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
893 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
895 setCells(m_AllCells
);
896 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
900 N_points
=m_grid
->GetNumberOfPoints();
901 N_cells
=m_grid
->GetNumberOfCells();
907 hitlist
.resize(N_points
);
908 offset
.resize(N_points
);
910 marked_cells
.clear();
911 marked_nodes
.clear();
914 cout
<<"================="<<endl
;
915 cout
<<"hitlist="<<hitlist
<<endl
;
916 cout
<<"================="<<endl
;
920 for(int i
=0;i
<hitlist
.size();i
++)
924 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
926 QString num1
;num1
.setNum(i
);
927 QString num2
;num2
.setNum(i
-kills
);
928 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
930 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
931 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
936 cout
<<"Kill successful"<<endl
;
940 cout
<<"Kill failed"<<endl
;
944 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
948 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
949 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
950 cout
<<"===remove_EP_all_2 END==="<<endl
;
954 int CreateSpecialMapping::remove_FP_all_2()
956 cout
<<"===remove_FP_all_2 START==="<<endl
;
957 cout
<<"+++++++"<<endl
;
958 cout_grid(cout
,m_grid
,true,true,true,true);
959 cout
<<"+++++++"<<endl
;
961 getAllSurfaceCells(m_AllCells
,m_grid
);
962 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
963 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
964 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
965 m_SelectedNodes
.clear();
966 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
967 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
969 setCells(m_AllCells
);
970 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
974 N_points
=m_grid
->GetNumberOfPoints();
975 N_cells
=m_grid
->GetNumberOfCells();
981 hitlist
.resize(N_points
);
982 offset
.resize(N_points
);
984 marked_cells
.clear();
985 marked_nodes
.clear();
987 DualSave("pre-counter");
989 DualSave("post-counter");
991 cout_grid(cout
,m_grid
);
992 cout
<<"================="<<endl
;
993 cout
<<"hitlist="<<hitlist
<<endl
;
994 cout
<<"================="<<endl
;
998 for(int i
=0;i
<hitlist
.size();i
++)
1002 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1004 QString num1
;num1
.setNum(i
);
1005 QString num2
;num2
.setNum(i
-kills
);
1006 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1008 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1009 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1014 cout
<<"Kill successful"<<endl
;
1018 cout
<<"Kill failed"<<endl
;
1022 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1026 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1027 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1028 cout
<<"===remove_FP_all_2 END==="<<endl
;