1 | function [elements,x,y,z,numberofelements,numberofnodes,elconv,nodeconv,elconv2,nodeconv2]=meshplug(elements,x,y,z,elements2,x2,y2,z2,extractednodes,extractedelements,domain);
|
---|
2 | %MESHPLUG - embed mesh into another one
|
---|
3 | % See also meshaddrifts
|
---|
4 |
|
---|
5 |
|
---|
6 | %initialize elconv,nodeconv conversion tables from md mesh to new md mesh
|
---|
7 | elconv=1:size(elements,1); elconv=elconv';
|
---|
8 | nodeconv=1:size(x,1); nodeconv=nodeconv';
|
---|
9 |
|
---|
10 | %take away old elements in area of interest:
|
---|
11 | elements(extractedelements,:)=[];
|
---|
12 | element_offset=size(elements,1);
|
---|
13 |
|
---|
14 | %update elconv after having extracted the area of interest elements
|
---|
15 | temp_elconv=elconv; temp_elconv(extractedelements)=[];
|
---|
16 | temp_elconvnum=1:length(temp_elconv);
|
---|
17 | elconv(temp_elconv)=temp_elconvnum;
|
---|
18 | elconv(extractedelements)=NaN;
|
---|
19 |
|
---|
20 | %initialize elconv2 and nodeconv2, conversion tables from md2 mesh to new md mesh
|
---|
21 | elconv2=1:size(elements2,1);elconv2=elconv2'+element_offset;
|
---|
22 | nodeconv2=(size(x,1)+1):(size(x,1)+size(x2,1)); nodeconv2=nodeconv2';
|
---|
23 |
|
---|
24 | extractednodes_minusborder=extractednodes;
|
---|
25 | extractednodes_minusborder(domain)=[];
|
---|
26 |
|
---|
27 | x(extractednodes_minusborder)=NaN;
|
---|
28 | y(extractednodes_minusborder)=NaN;
|
---|
29 |
|
---|
30 | %now, plug md2 mesh:
|
---|
31 |
|
---|
32 | %first, offset all ids of md2 mesh
|
---|
33 | elements2=elements2+length(x);
|
---|
34 |
|
---|
35 | %NaN border nodes in second mesh
|
---|
36 | x2(1:length(domain))=NaN;
|
---|
37 | y2(1:length(domain))=NaN;
|
---|
38 |
|
---|
39 | %redirect border nodes in elements2 to elements
|
---|
40 | for i=1:length(domain),
|
---|
41 | pos=find(elements2==(i+length(x)));
|
---|
42 | elements2(pos)=extractednodes(domain(i));
|
---|
43 | end
|
---|
44 |
|
---|
45 | %same deal for nodeconv2:
|
---|
46 | for i=1:length(domain),
|
---|
47 | nodeconv2(i)=extractednodes(domain(i));
|
---|
48 | end
|
---|
49 |
|
---|
50 |
|
---|
51 | %plug elements
|
---|
52 | elements=[elements;elements2];
|
---|
53 |
|
---|
54 |
|
---|
55 | %now, increase number of nodes
|
---|
56 | x=[x; x2];
|
---|
57 | y=[y; y2];
|
---|
58 | z=[z; z2];
|
---|
59 |
|
---|
60 | %now, get rid of NaN in x:
|
---|
61 | while ~isempty(find(isnan(x))),
|
---|
62 |
|
---|
63 | pos=find(isnan(x));
|
---|
64 | node=pos(1);
|
---|
65 |
|
---|
66 | %collapse node
|
---|
67 | x(node)=[];
|
---|
68 | y(node)=[];
|
---|
69 | z(node)=[];
|
---|
70 |
|
---|
71 | %renumber all nodes > node in elements
|
---|
72 | pos=find(elements>node);
|
---|
73 | elements(pos)=elements(pos)-1;
|
---|
74 |
|
---|
75 | %same deal for nodeconv2:
|
---|
76 | pos=find(nodeconv2>node);
|
---|
77 | nodeconv2(pos)=nodeconv2(pos)-1;
|
---|
78 |
|
---|
79 | end
|
---|
80 |
|
---|
81 | numberofnodes=length(x);
|
---|
82 | numberofelements=length(elements);
|
---|
83 |
|
---|
84 | %finish nodeconv:
|
---|
85 | temp_nodeconv=nodeconv; temp_nodeconv(extractednodes_minusborder)=[];
|
---|
86 | temp_nodeconvnum=1:length(temp_nodeconv);
|
---|
87 | nodeconv(temp_nodeconv)=temp_nodeconvnum;
|
---|
88 | nodeconv(extractednodes_minusborder)=NaN;
|
---|
89 |
|
---|