1 | function md=meshprocessrifts(md,domainoutline)
|
---|
2 | %MESHPROCESSRIFTS - process mesh when rifts are present
|
---|
3 | %
|
---|
4 | % split rifts inside mesh (rifts are defined by presence of
|
---|
5 | % segments inside the domain outline)
|
---|
6 | % if domain outline is provided, check for rifts that could touch it, and open them up.
|
---|
7 | %
|
---|
8 | % Usage:
|
---|
9 | % md=meshprocessrifts(md,domainoutline)
|
---|
10 | %
|
---|
11 | % Ex:
|
---|
12 | % md=meshprocessrifts(md,'DomainOutline.exp');
|
---|
13 | %
|
---|
14 |
|
---|
15 | %some checks on arguments:
|
---|
16 | if nargout~=1,
|
---|
17 | help meshprocessrifts
|
---|
18 | error('meshprocessrifts usage error:');
|
---|
19 | end
|
---|
20 |
|
---|
21 | if nargin~=2,
|
---|
22 | help meshprocessrifts
|
---|
23 | error('meshprocessrifts usage error:');
|
---|
24 | end
|
---|
25 |
|
---|
26 | %Call MEX file
|
---|
27 | [md.elements,md.x,md.y,md.mesh.segments,md.mesh.segmentmarkers,md.rifts.riftstruct]=TriMeshProcessRifts(md.elements,md.x,md.y,md.mesh.segments,md.mesh.segmentmarkers);
|
---|
28 | if ~isstruct(md.rifts.riftstruct),
|
---|
29 | error('TriMeshProcessRifts did not find any rift');
|
---|
30 | end
|
---|
31 |
|
---|
32 | %Fill in rest of fields:
|
---|
33 | md.numberofelements=length(md.elements);
|
---|
34 | md.numberofnodes=length(md.x);
|
---|
35 | md.z=zeros(md.numberofnodes,1);
|
---|
36 | md.mesh.vertexonboundary=zeros(length(md.x),1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
|
---|
37 | md.rifts.numrifts=length(md.rifts.riftstruct);
|
---|
38 | md.flowequation.element_equation=3*ones(md.numberofelements,1);
|
---|
39 | md.nodeonbed=ones(md.numberofnodes,1);
|
---|
40 | md.nodeonsurface=ones(md.numberofnodes,1);
|
---|
41 | md.elementonbed=ones(md.numberofelements,1);
|
---|
42 | md.elementonsurface=ones(md.numberofelements,1);
|
---|
43 |
|
---|
44 | %get coordinates of rift tips
|
---|
45 | for i=1:md.rifts.numrifts,
|
---|
46 | md.rifts.riftstruct(i).tip1coordinates=[md.x(md.rifts.riftstruct(i).tips(1)) md.y(md.rifts.riftstruct(i).tips(1))];
|
---|
47 | md.rifts.riftstruct(i).tip2coordinates=[md.x(md.rifts.riftstruct(i).tips(2)) md.y(md.rifts.riftstruct(i).tips(2))];
|
---|
48 | end
|
---|
49 |
|
---|
50 | %In case we have rifts that open up the domain outline, we need to open them:
|
---|
51 | flags=ContourToMesh(md.elements,md.x,md.y,domainoutline,'node',0);
|
---|
52 | found=0;
|
---|
53 | for i=1:md.rifts.numrifts,
|
---|
54 | if flags(md.rifts.riftstruct(i).tips(1))==0,
|
---|
55 | found=1;
|
---|
56 | break;
|
---|
57 | end
|
---|
58 | if flags(md.rifts.riftstruct(i).tips(2))==0,
|
---|
59 | found=1;
|
---|
60 | break;
|
---|
61 | end
|
---|
62 | end
|
---|
63 | if found,
|
---|
64 | md=meshprocessoutsiderifts(md,domainoutline);
|
---|
65 | end
|
---|
66 |
|
---|
67 | %get elements that are not correctly oriented in the correct direction:
|
---|
68 | aires=GetAreas(md.elements,md.x,md.y);
|
---|
69 | pos=find(aires<0);
|
---|
70 | md.elements(pos,:)=[md.elements(pos,2) md.elements(pos,1) md.elements(pos,3)];
|
---|