/usr/share/octave/packages/secs2d-0.0.8/Utilities/Ujoinmeshes.m is in octave-secs2d 0.0.8-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | function mesh=Ujoinmeshes(mesh1,mesh2,s1,s2)
% mesh=Ujoinmeshes(mesh1,mesh2,side1,side2)
% This file is part of
%
% SECS2D - A 2-D Drift--Diffusion Semiconductor Device Simulator
% -------------------------------------------------------------------
% Copyright (C) 2004-2006 Carlo de Falco
%
%
%
% SECS2D is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% SECS2D is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with SECS2D; If not, see <http://www.gnu.org/licenses/>.
% make sure that the outside world is always
% on the same side of the boundary of mesh1
[mesh1.e(6:7,:),I] = sort(mesh1.e(6:7,:));
for ic=1:size(mesh1.e,2)
mesh1.e(1:2,ic) = mesh1.e(I(:,ic),ic);
end
intnodes1=[];
intnodes2=[];
j1=[];j2=[];
for is=1:length(s1)
side1 = s1(is);side2 = s2(is);
[i,j] = find(mesh1.e(5,:)==side1);
j1=[j1 j];
[i,j] = find(mesh2.e(5,:)==side2);
oldregion(side1) = max(max(mesh2.e(6:7,j)));
j2=[j2 j];
end
intnodes1=[mesh1.e(1,j1),mesh1.e(2,j1)];
intnodes2=[mesh2.e(1,j2),mesh2.e(2,j2)];
intnodes1 = unique(intnodes1);
[tmp,I] = sort(mesh1.p(1,intnodes1));
intnodes1 = intnodes1(I);
[tmp,I] = sort(mesh1.p(2,intnodes1));
intnodes1 = intnodes1(I);
intnodes2 = unique(intnodes2);
[tmp,I] = sort(mesh2.p(1,intnodes2));
intnodes2 = intnodes2(I);
[tmp,I] = sort(mesh2.p(2,intnodes2));
intnodes2 = intnodes2(I);
% delete redundant edges
mesh2.e(:,j2) = [];
% change edge numbers
indici=[];consecutivi=[];
indici = unique(mesh2.e(5,:));
consecutivi (indici) = [1:length(indici)]+max(mesh1.e(5,:));
mesh2.e(5,:)=consecutivi(mesh2.e(5,:));
% change node indices in connectivity matrix
% and edge list
indici=[];consecutivi=[];
indici = 1:size(mesh2.p,2);
offint = setdiff(indici,intnodes2);
consecutivi (offint) = [1:length(offint)]+size(mesh1.p,2);
consecutivi (intnodes2) = intnodes1;
mesh2.e(1:2,:)=consecutivi(mesh2.e(1:2,:));
mesh2.t(1:3,:)=consecutivi(mesh2.t(1:3,:));
% delete redundant points
mesh2.p(:,intnodes2) = [];
% set region numbers
regions = unique(mesh1.t(4,:));
newregions(regions) = 1:length(regions);
mesh1.t(4,:) = newregions(mesh1.t(4,:));
% set region numbers
regions = unique(mesh2.t(4,:));
newregions(regions) = [1:length(regions)]+max(mesh1.t(4,:));
mesh2.t(4,:) = newregions(mesh2.t(4,:));
% set adjacent region numbers in edge structure 2
[i,j] = find(mesh2.e(6:7,:));
i = i+5;
mesh2.e(i,j) = newregions(mesh2.e(i,j));
% set adjacent region numbers in edge structure 1
mesh1.e(6,j1) = newregions(oldregion(mesh1.e(5,j1)));
% make the new p structure
mesh.p = [mesh1.p mesh2.p];
mesh.e = [mesh1.e mesh2.e];
mesh.t = [mesh1.t mesh2.t];
%
% %double check to avoid degenerate triangles
% [p,ii,jj]=unique(mesh.p(1:2,:)','rows');
% mesh.p =p';
% mesh.e(1:2,:)=jj(mesh.e(1:2,:));
% mesh.t(1:3,:)=jj(mesh.t(1:3,:));
%
% [ii,jj] = find (mesh.e(1,:)==mesh.e(2,:));
% mesh.e(:,jj) = [];
% [ii,jj] = find ((mesh.t(1,:)==mesh.t(2,:))|(mesh.t(1,:)==mesh.t(3,:))|(mesh.t(3,:)==mesh.t(2,:)));
% mesh.t(:,jj) = [];
|