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
);
129 setCells(m_AllCells
);
131 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
134 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
135 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
137 /* //Phase A : Calculate current mesh density
138 cout<<"===Phase A==="<<endl;
140 foreach(vtkIdType node,m_SelectedNodes)
142 VertexMeshDensity nodeVMD = getVMD(node,node_type->GetValue(node));
143 int idx=VMDvector.indexOf(nodeVMD);
144 if(DebugLevel>3) cout<<"idx="<<idx<<endl;
145 if(idx!=-1)//specified
147 node_meshdensity->SetValue(node, VMDvector[idx].density);
151 double L=CurrentVertexAvgDist(node,n2n,m_grid);
153 node_meshdensity->SetValue(node, D);
157 //Phase B : define desired mesh density
158 cout
<<"===Phase B==="<<endl
;
159 double diff
=Convergence_meshdensity
+1;
160 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
164 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
166 foreach(vtkIdType node
,m_SelectedNodes
)
168 if(DebugLevel
>2) cout
<<"======>"<<endl
;
169 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
170 int idx
=VMDvector
.indexOf(nodeVMD
);
171 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
172 if(idx
!=-1)//specified
174 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
178 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
181 cout
<<"------>FIRST:"<<endl
;
182 cout
<<"------>D="<<D
<<endl
;
183 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
184 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
185 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
187 diff
=abs(D
-node_meshdensity
->GetValue(node
));
192 cout
<<"------>NOT FIRST:"<<endl
;
193 cout
<<"------>D="<<D
<<endl
;
194 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
195 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
196 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
197 cout
<<"------>diff="<<diff
<<endl
;
198 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
200 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
202 node_meshdensity
->SetValue(node
, D
);
204 if(DebugLevel
>2) cout
<<"======>"<<endl
;
207 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter_density
);// if first=true, it means no new mesh density has been defined (all densities specified)
208 cout
<<"iter="<<iter
<<endl
;
209 if(iter
>=maxiter_density
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
213 int CreateSpecialMapping::SwapFunction()
215 //Phase E : Delaunay swap
216 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
217 cout
<<"m_bcs="<<m_bcs
<<endl
;
218 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
221 swap
.setGrid(m_grid
);
222 swap
.setBoundaryCodes(bcs_complement
);
227 int CreateSpecialMapping::SmoothFunction()
229 //Phase F : translate points to smooth grid
233 //laplacian smoothing with projection
234 //Roland smoothing with projection
236 //laplacian smoothing with projection
238 Lap
.SetInput(m_bcs
,m_grid
);
239 Lap
.SetNumberOfIterations(N_SmoothIterations
);
244 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
246 VertexMeshDensity VMD
;
249 VMD
.CurrentNode
=node
;
250 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
251 /* createNodeMapping(nodes, _nodes, m_grid);
252 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
255 foreach(vtkIdType C
, n2c
[node
])
257 bc
.insert(cell_code
->GetValue(C
));
259 VMD
.BClist
.resize(bc
.size());
260 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
261 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
265 int CreateSpecialMapping::insert_FP_counter()
267 cout
<<"===insert_FP_counter() START==="<<endl
;
268 foreach(vtkIdType id_cell
, m_SelectedCells
)
270 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
272 cout
<<"inserting a field point "<<id_cell
<<endl
;
274 marked_cells
[id_cell
]=true;
279 cout
<<"===insert_FP_counter() END==="<<endl
;
283 int CreateSpecialMapping::insert_EP_counter()
285 cout
<<"===insert_EP_counter() START==="<<endl
;
287 //Phase C: Prepare edge_map
288 cout
<<"===Phase C==="<<endl
;
291 foreach(vtkIdType node1
,m_SelectedNodes
)
293 // cout<<"node1="<<node1<<endl;
294 foreach(vtkIdType node2
,n2n
[node1
])
296 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
297 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
301 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
303 StencilVector
.clear();
304 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
305 //rewind the iterator
306 edge_map_iter
.toFront ();
308 while (edge_map_iter
.hasNext()) {
309 edge_map_iter
.next();
310 vtkIdType node1
=edge_map_iter
.key().first
;
311 vtkIdType node2
=edge_map_iter
.key().second
;
312 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
313 QSet
<int> stencil_cells_set
;
314 QVector
<int> stencil_cells_vector
;
315 stencil_cells_set
=n2c
[node1
];
316 stencil_cells_set
.intersect(n2c
[node2
]);
317 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
319 stencil_cells_vector
.resize(stencil_cells_set
.size());
320 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
321 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
323 vtkIdType id_cell
=stencil_cells_vector
[0];
324 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
325 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
326 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
327 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
328 stencil_t S
=getStencil(id_cell
,SideToSplit
);
330 bool stencil_marked
=false;
331 foreach(vtkIdType C
,stencil_cells_vector
)
333 if(marked_cells
[C
]) stencil_marked
=true;
335 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
336 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
338 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
340 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
342 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
343 StencilVector
.push_back(S
);
345 if(stencil_cells_vector
.size()==2)//2 cells around the edge
350 else//1 cell around the edge
356 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
358 cout
<<"===insert_EP_counter() END==="<<endl
;
362 int CreateSpecialMapping::remove_FP_counter()
364 cout
<<"===remove_FP_counter() START==="<<endl
;
365 cout
<<"marked_cells="<<marked_cells
<<endl
;
366 cout
<<"hitlist="<<hitlist
<<endl
;
367 cout
<<"N_newcells="<<N_newcells
<<endl
;
368 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
369 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
372 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
373 foreach(vtkIdType node
,m_SelectedNodes
)
375 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
378 foreach(vtkIdType C
,n2c
[node
])
380 if(marked_cells
[C
]) marked
=true;
383 QSet
<vtkIdType
> DeadCells
;
384 QSet
<vtkIdType
> MutatedCells
;
385 QSet
<vtkIdType
> MutilatedCells
;
386 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
388 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
391 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
397 cout
<<"===remove_FP_counter() END==="<<endl
;
401 int CreateSpecialMapping::remove_EP_counter()
403 cout
<<"===remove_EP_counter() START==="<<endl
;
405 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
406 foreach(vtkIdType node
,m_SelectedNodes
)
408 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
411 foreach(vtkIdType C
,n2c
[node
])
413 if(marked_cells
[C
]) marked
=true;
415 QSet
<vtkIdType
> DeadCells
;
416 QSet
<vtkIdType
> MutatedCells
;
417 QSet
<vtkIdType
> MutilatedCells
;
418 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
420 cout
<<"removing edge point "<<node
<<endl
;
423 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
424 if(n2n
[node
].size()==4)//4 cells around the edge
429 else//2 cells around the edge
437 cout
<<"===remove_EP_counter() END==="<<endl
;
441 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
443 cout
<<"===insert_FP_actor START==="<<endl
;
445 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
446 foreach(vtkIdType id_cell
, m_SelectedCells
)
448 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
449 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
451 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
453 cout
<<"inserting a field point "<<id_cell
<<endl
;
454 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
455 cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
457 vtkIdType N_pts
, *pts
;
458 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
461 int N_neighbours
=N_pts
;
462 cout
<<"N_neighbours="<<N_neighbours
<<endl
;
464 vtkIdType pts_triangle
[4][3];
465 for(int i
=0;i
<N_neighbours
;i
++)
467 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
470 C
=(1/(double)N_neighbours
)*C
;
471 addPoint(grid_tmp
,m_newNodeId
,C
.data());
472 vtkIdType intmidpoint
=m_newNodeId
;
475 for(int i
=0;i
<N_neighbours
;i
++)
477 pts_triangle
[i
][0]=pts
[i
];
478 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
479 pts_triangle
[i
][2]=intmidpoint
;
482 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
483 cell_code_tmp
->SetValue(id_cell
, newBC
);
487 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
488 cell_code_tmp
->SetValue(newCellId
, newBC
);
494 cout
<<"===insert_FP_actor END==="<<endl
;
498 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
500 cout
<<"===insert_EP_actor START==="<<endl
;
502 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
503 foreach(stencil_t S
,StencilVector
)
505 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
507 grid_tmp
->GetPoint(S
.p
[1],A
.data());
508 grid_tmp
->GetPoint(S
.p
[3],B
.data());
510 addPoint(grid_tmp
,m_newNodeId
,M
.data());
512 vtkIdType pts_triangle
[4][3];
514 if(S
.valid
){//there is a neighbour cell
515 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
516 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
517 marked_cells
[S
.id_cell1
]=true;
518 marked_cells
[S
.id_cell2
]=true;
522 pts_triangle
[i
][0]=S
.p
[i
];
523 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
524 pts_triangle
[i
][2]=m_newNodeId
;
527 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
528 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
530 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
531 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
533 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
534 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
537 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
538 cell_code_tmp
->SetValue(newCellId
, bc2
);
539 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
540 cell_code_tmp
->SetValue(newCellId
, bc1
);
542 else{//there is no neighbour cell
543 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
544 marked_cells
[S
.id_cell1
]=true;
546 pts_triangle
[0][0]=S
.p
[0];
547 pts_triangle
[0][1]=S
.p
[1];
548 pts_triangle
[0][2]=m_newNodeId
;
549 pts_triangle
[3][0]=S
.p
[3];
550 pts_triangle
[3][1]=S
.p
[0];
551 pts_triangle
[3][2]=m_newNodeId
;
553 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
555 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
556 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
559 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
560 cell_code_tmp
->SetValue(newCellId
, bc1
);
565 cout
<<"===insert_EP_actor END==="<<endl
;
569 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
571 cout
<<"===remove_FP_actor START==="<<endl
;
573 foreach(vtkIdType node
,m_SelectedNodes
)
580 foreach(vtkIdType C
,n2c
[node
])
582 if(marked_cells
[C
]) marked
=true;
584 if( !marked
&& remove_fieldpoint(node
) )
586 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
587 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
588 //TODO: Special copy function, leaving out nodes to remove
591 cout
<<"===remove_FP_actor END==="<<endl
;
595 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
597 cout
<<"===remove_EP_actor START==="<<endl
;
599 foreach(vtkIdType node
,m_SelectedNodes
)
602 foreach(vtkIdType C
,n2c
[node
])
604 if(marked_cells
[C
]) marked
=true;
606 if( !marked
&& remove_edgepoint(node
) )
608 cout
<<"removing edge point "<<node
<<endl
;
609 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
610 if(n2n
[node
].size()==4)//4 cells around the edge
614 else//2 cells around the edge
620 cout
<<"===remove_EP_actor END==="<<endl
;
624 int CreateSpecialMapping::insert_FP_all()
626 cout
<<"===insert_FP_all START==="<<endl
;
628 getAllSurfaceCells(m_AllCells
,m_grid
);
629 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
630 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
631 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
632 m_SelectedNodes
.clear();
633 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
634 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
636 setCells(m_AllCells
);
637 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
641 N_points
=m_grid
->GetNumberOfPoints();
642 N_cells
=m_grid
->GetNumberOfCells();
646 marked_cells
.clear();
647 marked_nodes
.clear();
651 //unmark cells (TODO: optimize)
652 marked_cells
.clear();
654 N_points
=m_grid
->GetNumberOfPoints();
655 N_cells
=m_grid
->GetNumberOfCells();
656 cout
<<"N_points="<<N_points
<<endl
;
657 cout
<<"N_cells="<<N_cells
<<endl
;
658 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
659 cout
<<"N_newcells="<<N_newcells
<<endl
;
660 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
661 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
662 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
664 makeCopyNoAlloc(m_grid
, grid_tmp
);
665 //initialize new node counter
666 m_newNodeId
=N_points
;
668 insert_FP_actor(grid_tmp
);
670 makeCopy(grid_tmp
,m_grid
);
671 cout
<<"===insert_FP_all END==="<<endl
;
675 int CreateSpecialMapping::insert_EP_all()
677 cout
<<"===insert_EP_all START==="<<endl
;
679 getAllSurfaceCells(m_AllCells
,m_grid
);
680 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
681 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
682 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
683 m_SelectedNodes
.clear();
684 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
685 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
687 setCells(m_AllCells
);
688 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
692 N_points
=m_grid
->GetNumberOfPoints();
693 N_cells
=m_grid
->GetNumberOfCells();
697 marked_cells
.clear();
698 marked_nodes
.clear();
702 //unmark cells (TODO: optimize)
703 marked_cells
.clear();
705 N_points
=m_grid
->GetNumberOfPoints();
706 N_cells
=m_grid
->GetNumberOfCells();
707 cout
<<"N_points="<<N_points
<<endl
;
708 cout
<<"N_cells="<<N_cells
<<endl
;
709 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
710 cout
<<"N_newcells="<<N_newcells
<<endl
;
711 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
712 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
713 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
715 makeCopyNoAlloc(m_grid
, grid_tmp
);
716 //initialize new node counter
717 m_newNodeId
=N_points
;
719 insert_EP_actor(grid_tmp
);
721 makeCopy(grid_tmp
,m_grid
);
723 cout
<<"===insert_EP_all END==="<<endl
;
727 int CreateSpecialMapping::remove_FP_all()
729 cout
<<"===remove_FP_all START==="<<endl
;
731 getAllSurfaceCells(m_AllCells
,m_grid
);
732 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
733 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
734 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
735 m_SelectedNodes
.clear();
736 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
737 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
739 setCells(m_AllCells
);
740 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
744 N_points
=m_grid
->GetNumberOfPoints();
745 N_cells
=m_grid
->GetNumberOfCells();
749 hitlist
.resize(N_points
);
750 offset
.resize(N_points
);
752 marked_cells
.clear();
753 marked_nodes
.clear();
757 //unmark cells (TODO: optimize)
758 marked_cells
.clear();
760 N_points
=m_grid
->GetNumberOfPoints();
761 N_cells
=m_grid
->GetNumberOfCells();
762 cout
<<"N_points="<<N_points
<<endl
;
763 cout
<<"N_cells="<<N_cells
<<endl
;
764 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
765 cout
<<"N_newcells="<<N_newcells
<<endl
;
766 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
767 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
768 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
770 makeCopyNoAlloc(m_grid
, grid_tmp
);
771 //initialize new node counter
772 m_newNodeId
=N_points
;
774 remove_FP_actor(grid_tmp
);
776 makeCopy(grid_tmp
,m_grid
);
778 cout
<<"===remove_FP_all END==="<<endl
;
782 int CreateSpecialMapping::remove_EP_all()
784 cout
<<"===remove_EP_all START==="<<endl
;
786 getAllSurfaceCells(m_AllCells
,m_grid
);
787 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
788 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
789 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
790 m_SelectedNodes
.clear();
791 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
792 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
794 setCells(m_AllCells
);
795 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
799 N_points
=m_grid
->GetNumberOfPoints();
800 N_cells
=m_grid
->GetNumberOfCells();
804 hitlist
.resize(N_points
);
805 offset
.resize(N_points
);
807 marked_cells
.clear();
808 marked_nodes
.clear();
812 //unmark cells (TODO: optimize)
813 marked_cells
.clear();
815 N_points
=m_grid
->GetNumberOfPoints();
816 N_cells
=m_grid
->GetNumberOfCells();
817 cout
<<"N_points="<<N_points
<<endl
;
818 cout
<<"N_cells="<<N_cells
<<endl
;
819 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
820 cout
<<"N_newcells="<<N_newcells
<<endl
;
821 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
822 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
823 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
825 makeCopyNoAlloc(m_grid
, grid_tmp
);
826 //initialize new node counter
827 m_newNodeId
=N_points
;
829 remove_EP_actor(grid_tmp
);
831 makeCopy(grid_tmp
,m_grid
);
833 cout
<<"===remove_EP_all END==="<<endl
;
837 int CreateSpecialMapping::FullEdit()
839 cout
<<"===FullEdit START==="<<endl
;
846 N_points
=m_grid
->GetNumberOfPoints();
847 N_cells
=m_grid
->GetNumberOfCells();
851 hitlist
.resize(N_points
);
852 offset
.resize(N_points
);
854 marked_cells
.clear();
855 marked_nodes
.clear();
857 if(insert_FP
) insert_FP_counter();
858 if(insert_EP
) insert_EP_counter();
859 if(remove_FP
) remove_FP_counter();
860 if(remove_EP
) remove_EP_counter();
862 cout
<<"================="<<endl
;
863 cout
<<"hitlist="<<hitlist
<<endl
;
864 cout
<<"================="<<endl
;
866 //unmark cells (TODO: optimize)
867 marked_cells
.clear();
869 N_points
=m_grid
->GetNumberOfPoints();
870 N_cells
=m_grid
->GetNumberOfCells();
871 cout
<<"N_points="<<N_points
<<endl
;
872 cout
<<"N_cells="<<N_cells
<<endl
;
873 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
874 cout
<<"N_newcells="<<N_newcells
<<endl
;
875 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
876 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
877 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
879 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
880 //initialize new node counter
881 m_newNodeId
=N_points
;
883 if(insert_FP
) insert_FP_actor(grid_tmp
);
884 if(insert_EP
) insert_EP_actor(grid_tmp
);
886 cout
<<"================="<<endl
;
887 cout
<<"hitlist="<<hitlist
<<endl
;
888 cout
<<"================="<<endl
;
889 if(remove_FP
) remove_FP_actor(grid_tmp
);
890 if(remove_EP
) remove_EP_actor(grid_tmp
);
892 makeCopy(grid_tmp
,m_grid
);
894 cout
<<"===FullEdit END==="<<endl
;
898 int CreateSpecialMapping::remove_EP_all_2()
900 cout
<<"===remove_EP_all_2 START==="<<endl
;
901 getAllSurfaceCells(m_AllCells
,m_grid
);
902 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
903 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
904 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
905 m_SelectedNodes
.clear();
906 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
907 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
909 setCells(m_AllCells
);
910 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
914 N_points
=m_grid
->GetNumberOfPoints();
915 N_cells
=m_grid
->GetNumberOfCells();
921 hitlist
.resize(N_points
);
922 offset
.resize(N_points
);
924 marked_cells
.clear();
925 marked_nodes
.clear();
928 cout
<<"================="<<endl
;
929 cout
<<"hitlist="<<hitlist
<<endl
;
930 cout
<<"================="<<endl
;
934 for(int i
=0;i
<hitlist
.size();i
++)
938 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
940 QString num1
;num1
.setNum(i
);
941 QString num2
;num2
.setNum(i
-kills
);
942 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
944 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
945 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
950 cout
<<"Kill successful"<<endl
;
954 cout
<<"Kill failed"<<endl
;
958 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
962 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
963 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
964 cout
<<"===remove_EP_all_2 END==="<<endl
;
968 int CreateSpecialMapping::remove_FP_all_2()
970 cout
<<"===remove_FP_all_2 START==="<<endl
;
971 /* cout<<"+++++++"<<endl;
972 cout_grid(cout,m_grid,true,true,true,true);
973 cout<<"+++++++"<<endl;*/
975 getAllSurfaceCells(m_AllCells
,m_grid
);
976 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
977 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
978 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
979 m_SelectedNodes
.clear();
980 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
981 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
983 setCells(m_AllCells
);
984 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
988 N_points
=m_grid
->GetNumberOfPoints();
989 N_cells
=m_grid
->GetNumberOfCells();
995 hitlist
.resize(N_points
);
996 offset
.resize(N_points
);
998 marked_cells
.clear();
999 marked_nodes
.clear();
1001 // DualSave("pre-counter");
1002 remove_FP_counter();
1003 // DualSave("post-counter");
1005 // cout_grid(cout,m_grid);
1006 cout
<<"================="<<endl
;
1007 cout
<<"hitlist="<<hitlist
<<endl
;
1008 cout
<<"================="<<endl
;
1012 for(int i
=0;i
<hitlist
.size();i
++)
1016 cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1018 QString num1
;num1
.setNum(i
);
1019 QString num2
;num2
.setNum(i
-kills
);
1020 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1022 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1023 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1028 cout
<<"Kill successful"<<endl
;
1032 cout
<<"Kill failed"<<endl
;
1036 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1040 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1041 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1042 cout
<<"===remove_FP_all_2 END==="<<endl
;