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");
36 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
38 m_SelectedNodes
.clear();
39 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
40 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
44 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
47 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
49 //Phase A : Calculate current mesh density
50 cout
<<"===Phase A==="<<endl
;
52 foreach(vtkIdType node
,m_SelectedNodes
)
54 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
55 int idx
=VMDvector
.indexOf(nodeVMD
);
56 if(DebugLevel
>3) cout
<<"idx="<<idx
<<endl
;
57 if(idx
!=-1)//specified
59 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
63 double L
=CurrentVertexAvgDist(node
,n2n
,m_grid
);
65 node_meshdensity
->SetValue(node
, D
);
69 //Phase B : define desired mesh density
70 cout
<<"===Phase B==="<<endl
;
71 double diff
=Convergence_meshdensity
+1;
72 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
77 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
79 foreach(vtkIdType node
,m_SelectedNodes
)
81 if(DebugLevel
>2) cout
<<"======>"<<endl
;
82 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
83 int idx
=VMDvector
.indexOf(nodeVMD
);
84 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
85 if(idx
!=-1)//specified
87 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
91 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
94 cout
<<"------>FIRST:"<<endl
;
95 cout
<<"------>D="<<D
<<endl
;
96 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
97 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
98 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
100 diff
=abs(D
-node_meshdensity
->GetValue(node
));
105 cout
<<"------>NOT FIRST:"<<endl
;
106 cout
<<"------>D="<<D
<<endl
;
107 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
108 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
109 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
110 cout
<<"------>diff="<<diff
<<endl
;
111 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
113 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
115 node_meshdensity
->SetValue(node
, D
);
117 if(DebugLevel
>2) cout
<<"======>"<<endl
;
120 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter
);// if first=true, it means no new mesh density has been defined (all densities specified)
121 cout
<<"iter="<<iter
<<endl
;
122 if(iter
>=maxiter
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
124 //Phase C: Prepare edge_map
125 cout
<<"===Phase C==="<<endl
;
128 foreach(vtkIdType node1
,m_SelectedNodes
)
130 // cout<<"node1="<<node1<<endl;
131 foreach(vtkIdType node2
,n2n
[node1
])
133 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
134 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
138 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
140 //Phase D: edit points
141 cout
<<"===Phase D==="<<endl
;
151 /* if(insert_FP) insert_FP_all();
152 if(insert_EP) insert_EP_all();
153 if(remove_FP) remove_FP_all();
154 if(remove_EP) remove_EP_all();*/
177 //Phase E : Delaunay swap
179 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
180 cout
<<"m_bcs="<<m_bcs
<<endl
;
181 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
184 swap
.setGrid(m_grid
);
185 swap
.setBoundaryCodes(bcs_complement
);
189 //Phase F : translate points to smooth grid
193 //laplacian smoothing with projection
194 //Roland smoothing with projection
196 //laplacian smoothing with projection
197 if(DoLaplaceSmoothing
) {
199 Lap
.SetInput(m_bcs
,m_grid
);
200 Lap
.SetNumberOfIterations(N_SmoothIterations
);
204 cout
<<"===Summary==="<<endl
;
205 cout
<<"N_inserted_FP="<<N_inserted_FP
<<endl
;
206 cout
<<"N_inserted_EP="<<N_inserted_EP
<<endl
;
207 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
208 cout
<<"N_removed_EP="<<N_removed_EP
<<endl
;
210 cout
<<"N_points="<<N_points
<<endl
;
211 cout
<<"N_cells="<<N_cells
<<endl
;
212 cout
<<"m_total_N_newpoints="<<m_total_N_newpoints
<<endl
;
213 cout
<<"m_total_N_newcells="<<m_total_N_newcells
<<endl
;
214 cout
<<"============"<<endl
;
216 if(m_total_N_newpoints
==0 && m_total_N_newcells
==0) break;
220 cout
<<"i_iter/NumberOfIterations="<<i_iter
<<"/"<<NumberOfIterations
<<endl
;
226 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
228 VertexMeshDensity VMD
;
231 VMD
.CurrentNode
=node
;
232 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
233 /* createNodeMapping(nodes, _nodes, m_grid);
234 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
237 foreach(vtkIdType C
, n2c
[node
])
239 bc
.insert(cell_code
->GetValue(C
));
241 VMD
.BClist
.resize(bc
.size());
242 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
243 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
247 int CreateSpecialMapping::insert_FP_counter()
249 cout
<<"===insert_FP_counter() START==="<<endl
;
250 foreach(vtkIdType id_cell
, m_SelectedCells
)
252 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
254 cout
<<"inserting a field point "<<id_cell
<<endl
;
256 marked_cells
[id_cell
]=true;
261 cout
<<"===insert_FP_counter() END==="<<endl
;
265 int CreateSpecialMapping::insert_EP_counter()
267 cout
<<"===insert_EP_counter() START==="<<endl
;
268 StencilVector
.clear();
269 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
270 //rewind the iterator
271 edge_map_iter
.toFront ();
273 while (edge_map_iter
.hasNext()) {
274 edge_map_iter
.next();
275 vtkIdType node1
=edge_map_iter
.key().first
;
276 vtkIdType node2
=edge_map_iter
.key().second
;
277 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
278 QSet
<int> stencil_cells_set
;
279 QVector
<int> stencil_cells_vector
;
280 stencil_cells_set
=n2c
[node1
];
281 stencil_cells_set
.intersect(n2c
[node2
]);
282 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
284 stencil_cells_vector
.resize(stencil_cells_set
.size());
285 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
286 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
288 vtkIdType id_cell
=stencil_cells_vector
[0];
289 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
290 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
291 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
292 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
293 stencil_t S
=getStencil(id_cell
,SideToSplit
);
295 bool stencil_marked
=false;
296 foreach(vtkIdType C
,stencil_cells_vector
)
298 if(marked_cells
[C
]) stencil_marked
=true;
300 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
301 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
303 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
305 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
307 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
308 StencilVector
.push_back(S
);
310 if(stencil_cells_vector
.size()==2)//2 cells around the edge
315 else//1 cell around the edge
321 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
323 cout
<<"===insert_EP_counter() END==="<<endl
;
327 int CreateSpecialMapping::remove_FP_counter()
329 cout
<<"===remove_FP_counter() START==="<<endl
;
331 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
332 foreach(vtkIdType node
,m_SelectedNodes
)
334 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
337 foreach(vtkIdType C
,n2c
[node
])
339 if(marked_cells
[C
]) marked
=true;
342 QSet
<vtkIdType
> DeadCells
;
343 QSet
<vtkIdType
> MutatedCells
;
344 QSet
<vtkIdType
> MutilatedCells
;
345 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
347 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
350 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
356 cout
<<"===remove_FP_counter() END==="<<endl
;
360 int CreateSpecialMapping::remove_EP_counter()
362 cout
<<"===remove_EP_counter() START==="<<endl
;
364 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
365 foreach(vtkIdType node
,m_SelectedNodes
)
367 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
370 foreach(vtkIdType C
,n2c
[node
])
372 if(marked_cells
[C
]) marked
=true;
374 QSet
<vtkIdType
> DeadCells
;
375 QSet
<vtkIdType
> MutatedCells
;
376 QSet
<vtkIdType
> MutilatedCells
;
377 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
379 cout
<<"removing edge point "<<node
<<endl
;
382 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
383 if(n2n
[node
].size()==4)//4 cells around the edge
388 else//2 cells around the edge
396 cout
<<"===remove_EP_counter() END==="<<endl
;
400 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
402 cout
<<"===insert_FP_actor START==="<<endl
;
404 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
405 foreach(vtkIdType id_cell
, m_SelectedCells
)
407 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
408 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
410 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
412 cout
<<"inserting a field point "<<id_cell
<<endl
;
413 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
414 cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
416 vtkIdType N_pts
, *pts
;
417 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
420 int N_neighbours
=N_pts
;
421 cout
<<"N_neighbours="<<N_neighbours
<<endl
;
423 vtkIdType pts_triangle
[4][3];
424 for(int i
=0;i
<N_neighbours
;i
++)
426 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
429 C
=(1/(double)N_neighbours
)*C
;
430 addPoint(grid_tmp
,m_newNodeId
,C
.data());
431 vtkIdType intmidpoint
=m_newNodeId
;
434 for(int i
=0;i
<N_neighbours
;i
++)
436 pts_triangle
[i
][0]=pts
[i
];
437 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
438 pts_triangle
[i
][2]=intmidpoint
;
441 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
442 cell_code_tmp
->SetValue(id_cell
, newBC
);
446 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
447 cell_code_tmp
->SetValue(newCellId
, newBC
);
453 cout
<<"===insert_FP_actor END==="<<endl
;
457 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
459 cout
<<"===insert_EP_actor START==="<<endl
;
461 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
462 foreach(stencil_t S
,StencilVector
)
464 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
466 grid_tmp
->GetPoint(S
.p
[1],A
.data());
467 grid_tmp
->GetPoint(S
.p
[3],B
.data());
469 addPoint(grid_tmp
,m_newNodeId
,M
.data());
471 vtkIdType pts_triangle
[4][3];
473 if(S
.valid
){//there is a neighbour cell
474 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
475 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
476 marked_cells
[S
.id_cell1
]=true;
477 marked_cells
[S
.id_cell2
]=true;
481 pts_triangle
[i
][0]=S
.p
[i
];
482 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
483 pts_triangle
[i
][2]=m_newNodeId
;
486 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
487 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
489 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
490 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
492 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
493 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
496 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
497 cell_code_tmp
->SetValue(newCellId
, bc2
);
498 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
499 cell_code_tmp
->SetValue(newCellId
, bc1
);
501 else{//there is no neighbour cell
502 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
503 marked_cells
[S
.id_cell1
]=true;
505 pts_triangle
[0][0]=S
.p
[0];
506 pts_triangle
[0][1]=S
.p
[1];
507 pts_triangle
[0][2]=m_newNodeId
;
508 pts_triangle
[3][0]=S
.p
[3];
509 pts_triangle
[3][1]=S
.p
[0];
510 pts_triangle
[3][2]=m_newNodeId
;
512 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
514 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
515 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
518 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
519 cell_code_tmp
->SetValue(newCellId
, bc1
);
524 cout
<<"===insert_EP_actor END==="<<endl
;
528 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
530 cout
<<"===remove_FP_actor START==="<<endl
;
532 foreach(vtkIdType node
,m_SelectedNodes
)
539 foreach(vtkIdType C
,n2c
[node
])
541 if(marked_cells
[C
]) marked
=true;
543 if( !marked
&& remove_fieldpoint(node
) )
545 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
546 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
547 //TODO: Special copy function, leaving out nodes to remove
550 cout
<<"===remove_FP_actor END==="<<endl
;
554 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
556 cout
<<"===remove_EP_actor START==="<<endl
;
558 foreach(vtkIdType node
,m_SelectedNodes
)
561 foreach(vtkIdType C
,n2c
[node
])
563 if(marked_cells
[C
]) marked
=true;
565 if( !marked
&& remove_edgepoint(node
) )
567 cout
<<"removing edge point "<<node
<<endl
;
568 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
569 if(n2n
[node
].size()==4)//4 cells around the edge
573 else//2 cells around the edge
579 cout
<<"===remove_EP_actor END==="<<endl
;
583 int CreateSpecialMapping::insert_FP_all()
585 cout
<<"===insert_FP_all START==="<<endl
;
587 getAllSurfaceCells(m_AllCells
,m_grid
);
588 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
589 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
590 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
591 m_SelectedNodes
.clear();
592 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
593 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
595 setCells(m_AllCells
);
596 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
600 N_points
=m_grid
->GetNumberOfPoints();
601 N_cells
=m_grid
->GetNumberOfCells();
605 marked_cells
.clear();
606 marked_nodes
.clear();
610 //unmark cells (TODO: optimize)
611 marked_cells
.clear();
613 N_points
=m_grid
->GetNumberOfPoints();
614 N_cells
=m_grid
->GetNumberOfCells();
615 cout
<<"N_points="<<N_points
<<endl
;
616 cout
<<"N_cells="<<N_cells
<<endl
;
617 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
618 cout
<<"N_newcells="<<N_newcells
<<endl
;
619 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
620 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
621 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
623 makeCopyNoAlloc(m_grid
, grid_tmp
);
624 //initialize new node counter
625 m_newNodeId
=N_points
;
627 insert_FP_actor(grid_tmp
);
629 makeCopy(grid_tmp
,m_grid
);
630 cout
<<"===insert_FP_all END==="<<endl
;
634 int CreateSpecialMapping::insert_EP_all()
636 cout
<<"===insert_EP_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_EP_actor(grid_tmp
);
680 makeCopy(grid_tmp
,m_grid
);
682 cout
<<"===insert_EP_all END==="<<endl
;
686 int CreateSpecialMapping::remove_FP_all()
688 cout
<<"===remove_FP_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 hitlist
.resize(N_points
);
709 offset
.resize(N_points
);
711 marked_cells
.clear();
712 marked_nodes
.clear();
716 //unmark cells (TODO: optimize)
717 marked_cells
.clear();
719 N_points
=m_grid
->GetNumberOfPoints();
720 N_cells
=m_grid
->GetNumberOfCells();
721 cout
<<"N_points="<<N_points
<<endl
;
722 cout
<<"N_cells="<<N_cells
<<endl
;
723 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
724 cout
<<"N_newcells="<<N_newcells
<<endl
;
725 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
726 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
727 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
729 makeCopyNoAlloc(m_grid
, grid_tmp
);
730 //initialize new node counter
731 m_newNodeId
=N_points
;
733 remove_FP_actor(grid_tmp
);
735 makeCopy(grid_tmp
,m_grid
);
737 cout
<<"===remove_FP_all END==="<<endl
;
741 int CreateSpecialMapping::remove_EP_all()
743 cout
<<"===remove_EP_all START==="<<endl
;
745 getAllSurfaceCells(m_AllCells
,m_grid
);
746 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
747 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
748 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
749 m_SelectedNodes
.clear();
750 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
751 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
753 setCells(m_AllCells
);
754 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
758 N_points
=m_grid
->GetNumberOfPoints();
759 N_cells
=m_grid
->GetNumberOfCells();
763 hitlist
.resize(N_points
);
764 offset
.resize(N_points
);
766 marked_cells
.clear();
767 marked_nodes
.clear();
771 //unmark cells (TODO: optimize)
772 marked_cells
.clear();
774 N_points
=m_grid
->GetNumberOfPoints();
775 N_cells
=m_grid
->GetNumberOfCells();
776 cout
<<"N_points="<<N_points
<<endl
;
777 cout
<<"N_cells="<<N_cells
<<endl
;
778 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
779 cout
<<"N_newcells="<<N_newcells
<<endl
;
780 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
781 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
782 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
784 makeCopyNoAlloc(m_grid
, grid_tmp
);
785 //initialize new node counter
786 m_newNodeId
=N_points
;
788 remove_EP_actor(grid_tmp
);
790 makeCopy(grid_tmp
,m_grid
);
792 cout
<<"===remove_EP_all END==="<<endl
;
796 int CreateSpecialMapping::FullEdit()
798 cout
<<"===FullEdit START==="<<endl
;
805 N_points
=m_grid
->GetNumberOfPoints();
806 N_cells
=m_grid
->GetNumberOfCells();
810 hitlist
.resize(N_points
);
811 offset
.resize(N_points
);
813 marked_cells
.clear();
814 marked_nodes
.clear();
816 if(insert_FP
) insert_FP_counter();
817 if(insert_EP
) insert_EP_counter();
818 if(remove_FP
) remove_FP_counter();
819 if(remove_EP
) remove_EP_counter();
821 cout
<<"================="<<endl
;
822 cout
<<"hitlist="<<hitlist
<<endl
;
823 cout
<<"================="<<endl
;
825 //unmark cells (TODO: optimize)
826 marked_cells
.clear();
828 N_points
=m_grid
->GetNumberOfPoints();
829 N_cells
=m_grid
->GetNumberOfCells();
830 cout
<<"N_points="<<N_points
<<endl
;
831 cout
<<"N_cells="<<N_cells
<<endl
;
832 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
833 cout
<<"N_newcells="<<N_newcells
<<endl
;
834 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
835 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
836 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
838 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
839 //initialize new node counter
840 m_newNodeId
=N_points
;
842 if(insert_FP
) insert_FP_actor(grid_tmp
);
843 if(insert_EP
) insert_EP_actor(grid_tmp
);
845 cout
<<"================="<<endl
;
846 cout
<<"hitlist="<<hitlist
<<endl
;
847 cout
<<"================="<<endl
;
848 if(remove_FP
) remove_FP_actor(grid_tmp
);
849 if(remove_EP
) remove_EP_actor(grid_tmp
);
851 makeCopy(grid_tmp
,m_grid
);
853 cout
<<"===FullEdit END==="<<endl
;
857 int CreateSpecialMapping::remove_EP_all_2()
859 cout
<<"===remove_EP_all_2 START==="<<endl
;
860 getAllSurfaceCells(m_AllCells
,m_grid
);
861 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
862 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
863 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
864 m_SelectedNodes
.clear();
865 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
866 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
868 setCells(m_AllCells
);
869 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
873 N_points
=m_grid
->GetNumberOfPoints();
874 N_cells
=m_grid
->GetNumberOfCells();
880 hitlist
.resize(N_points
);
881 offset
.resize(N_points
);
883 marked_cells
.clear();
884 marked_nodes
.clear();
887 cout
<<"================="<<endl
;
888 cout
<<"hitlist="<<hitlist
<<endl
;
889 cout
<<"================="<<endl
;
893 for(int i
=0;i
<hitlist
.size();i
++)
897 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
899 QString num1
;num1
.setNum(i
);
900 QString num2
;num2
.setNum(i
-kills
);
901 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
903 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
904 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
909 cout
<<"Kill successful"<<endl
;
913 cout
<<"Kill failed"<<endl
;
917 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
921 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
922 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
923 cout
<<"===remove_EP_all_2 END==="<<endl
;
927 int CreateSpecialMapping::remove_FP_all_2()
929 cout
<<"===remove_FP_all_2 START==="<<endl
;
930 cout
<<"+++++++"<<endl
;
931 cout_grid(cout
,m_grid
,true,true,true,true);
932 cout
<<"+++++++"<<endl
;
934 getAllSurfaceCells(m_AllCells
,m_grid
);
935 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
936 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
937 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
938 m_SelectedNodes
.clear();
939 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
940 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
942 setCells(m_AllCells
);
943 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
947 N_points
=m_grid
->GetNumberOfPoints();
948 N_cells
=m_grid
->GetNumberOfCells();
954 hitlist
.resize(N_points
);
955 offset
.resize(N_points
);
957 marked_cells
.clear();
958 marked_nodes
.clear();
960 DualSave("pre-counter");
962 DualSave("post-counter");
964 cout_grid(cout
,m_grid
);
965 cout
<<"================="<<endl
;
966 cout
<<"hitlist="<<hitlist
<<endl
;
967 cout
<<"================="<<endl
;
971 for(int i
=0;i
<hitlist
.size();i
++)
975 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
977 QString num1
;num1
.setNum(i
);
978 QString num2
;num2
.setNum(i
-kills
);
979 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
981 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
982 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
987 cout
<<"Kill successful"<<endl
;
991 cout
<<"Kill failed"<<endl
;
995 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
999 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1000 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1001 cout
<<"===remove_FP_all_2 END==="<<endl
;