source: issm/trunk/src/m/classes/public/BasinConstrain.m@ 5024

Last change on this file since 5024 was 5024, checked in by Mathieu Morlighem, 15 years ago

No more expread required to call ContourToNodes

File size: 2.2 KB
Line 
1function md=BasinConstrain(md,domain);
2%BASINCONSTRAIN - constrain basin
3%
4% Constrain basin using a constraint domain outline,
5% to dirichlet boundary conditions.
6% constraindomain is an Argus domain outline file enclosing
7% the geographical area of interest.
8%
9% Usage:
10% md=BasinConstrain(md,constraindomain)
11%
12% Example:
13% md=BasinConstrain(md,'DomainOutline.exp');
14% md=BasinConstrain(md,'~Iceshelves.exp');
15
16%now, flag grids and elements outside the domain outline.
17if ischar(domain),
18 if isempty(domain),
19 elementondomain=zeros(md.numberofelements,1);
20 gridondomain=zeros(md.numberofgrids,1);
21 invert=0;
22 elseif strcmpi(domain,'all')
23 elementondomain=ones(md.numberofelements,1);
24 gridondomain=ones(md.numberofgrids,1);
25 invert=0;
26 else
27 %make sure that we actually don't want the elements outside the domain outline!
28 if strcmpi(domain(1),'~'),
29 domain=domain(2:end);
30 invert=1;
31 else
32 invert=0;
33 end
34 %ok, flag elements and nodes
35 [gridondomain elementondomain]=ContourToMesh(md.elements(:,1:3),md.x,md.y,domain,'element and node',2);
36 end
37 if invert,
38 gridondomain=~gridondomain;
39 elementondomain=~elementondomain;
40 end
41else
42 error('BasinConstrain error message: domain type not supported yet');
43end
44
45%list of elements and nodes not on domain
46gridnotondomain=find(~gridondomain);
47elementnotondomain=find(~elementondomain);
48
49%all elements outside the constraint domain are equivalent to water. all grids outside are spc'd.
50md.spcvelocity(gridnotondomain,1:2)=1;
51md.spcvelocity(gridnotondomain,4)=md.vx_obs(gridnotondomain);
52md.spcvelocity(gridnotondomain,5)=md.vy_obs(gridnotondomain);
53md.elementonwater(elementnotondomain)=1;
54
55%now, make sure all elements on water have grids that are spc'd, otherwise, we'll get a singular problem.
56pos=find(~md.elementonwater);
57numpos=unique(md.elements(pos,:));
58grids=setdiff(1:1:md.numberofgrids,numpos);
59md.spcvelocity(grids,1:2)=1;
60md.spcvelocity(grids,4)=md.vx_obs(grids);
61md.spcvelocity(grids,5)=md.vy_obs(grids);
62
63%make sure icefronts that are completely spc'd are taken out:
64free_segments=find(sum(md.spcvelocity(md.pressureload(:,1:2),1:2),2)~=2);
65md.pressureload=md.pressureload(free_segments,:);
Note: See TracBrowser for help on using the repository browser.