source: issm/branches/trunk-dlcheng-ASE/src/m/boundaryconditions/SetMarineIceSheetBC.m@ 27956

Last change on this file since 27956 was 27956, checked in by dlcheng, 18 months ago

CHG: Collecting dlcheng-ASE branch changes to misfit calculation. Changes work with r27296 and not from the current revision r27954.

File size: 4.9 KB
Line 
1function md=SetMarineIceSheetBC(md,varargin)
2%SETICEMARINESHEETBC - Create the boundary conditions for stressbalance and thermal models for a Marine Ice Sheet with Ice Front
3%
4% Neumann BC are used on the ice front (an ARGUS contour around the ice front
5% can be given in input, or it will be deduced as onfloatingice & onboundary)
6% Dirichlet BC are used elsewhere for stressbalance
7%
8% Usage:
9% md=SetMarineIceSheetBC(md,icefrontfile)
10% md=SetMarineIceSheetBC(md)
11%
12% Example:
13% md=SetMarineIceSheetBC(md,'Front.exp')
14% md=SetMarineIceSheetBC(md)
15%
16% See also: SETICESHELFBC, SETMARINEICESHEETBC
17
18%node on Dirichlet (boundary and ~icefront)
19if nargin==2,
20 %User provided Front.exp, use it
21 icefrontfile=varargin{1};
22 if ~exist(icefrontfile)
23 error(['SetMarineIceSheetBC error message: ice front file ' icefrontfile ' not found']);
24 end
25 [path,name,ext]=fileparts(icefrontfile);
26 if strcmp(ext,'.shp'),
27 contours=shpread(icefrontfile);
28 elseif strcmp(ext,'.exp'),
29 contours=expread(icefrontfile);
30 end
31 incontour=ContourToMesh(md.mesh.elements,md.mesh.x,md.mesh.y,contours,'node',2);
32 vertexonicefront=double(md.mesh.vertexonboundary & incontour);
33else
34 %Guess where the ice front is
35 %pos=find(sum(md.mask.ocean_levelset(md.mesh.elements)<0.,2) >0.);
36 %vertexonfloatingice=zeros(md.mesh.numberofvertices,1);
37 %vertexonfloatingice(md.mesh.elements(pos,:))=1.;
38 %vertexonicefront=double(md.mesh.vertexonboundary & vertexonfloatingice);
39
40 only_ocean_levelset=-double(md.mask.ocean_levelset<=0. & md.mask.ice_levelset>=0.);
41 only_ocean_levelset_sum=sum(only_ocean_levelset(md.mesh.elements)<0.,2);
42 pos=find(only_ocean_levelset_sum >0. & only_ocean_levelset_sum < 3.);
43 vertexonicefront=zeros(md.mesh.numberofvertices,1);
44 vertexonicefront(md.mesh.elements(pos,:))=1.;
45end
46pos=find(md.mesh.vertexonboundary & ~vertexonicefront);
47if isempty(pos),
48 disp('Warning: SetMarineIceSheetBC.m: ice front all around the glacier, no dirichlet applied')
49end
50md.stressbalance.spcvx=NaN*ones(md.mesh.numberofvertices,1);
51md.stressbalance.spcvy=NaN*ones(md.mesh.numberofvertices,1);
52md.stressbalance.spcvz=NaN*ones(md.mesh.numberofvertices,1);
53md.stressbalance.referential=NaN*ones(md.mesh.numberofvertices,6);
54md.stressbalance.loadingforce=0*ones(md.mesh.numberofvertices,3);
55
56%Position of ice front
57md.mask.ice_levelset(find(vertexonicefront))=0;
58
59%First find segments that are not completely on the front
60if strcmp(elementtype(md.mesh),'Penta'),
61 numbernodesfront=4;
62elseif strcmp(elementtype(md.mesh),'Tria'),
63 numbernodesfront=2;
64else
65 error('mesh type not supported yet');
66end
67%segmentsfront=md.mask.ice_levelset(md.mesh.segments(:,1:numbernodesfront))==0;
68%segments=find(sum(segmentsfront,2)~=numbernodesfront);
69%Find all nodes for these segments and spc them
70%pos=md.mesh.segments(segments,1:numbernodesfront);
71
72numbernodesfront=3;
73elementsfront=md.mask.ice_levelset(md.mesh.elements(:,1:numbernodesfront))==0;
74elements=find(sum(elementsfront,2)>0);
75pos=md.mesh.elements(elements,1:numbernodesfront);
76
77md.stressbalance.spcvx(pos(:))=0;
78md.stressbalance.spcvy(pos(:))=0;
79md.stressbalance.spcvz(pos(:))=0; % FIXME probably shouldn't spc vertical velocity here
80
81%Dirichlet Values
82if (length(md.inversion.vx_obs)==md.mesh.numberofvertices & length(md.inversion.vy_obs)==md.mesh.numberofvertices)
83 disp(' boundary conditions for stressbalance model: spc set as observed velocities');
84 md.stressbalance.spcvx(pos)=md.inversion.vx_obs(pos);
85 md.stressbalance.spcvy(pos)=md.inversion.vy_obs(pos);
86else
87 disp(' boundary conditions for stressbalance model: spc set as zero');
88end
89
90md.hydrology.spcwatercolumn=zeros(md.mesh.numberofvertices,2);
91pos=find(md.mesh.vertexonboundary);
92md.hydrology.spcwatercolumn(pos,1)=1;
93
94%Initialize surface and basal forcings
95md.smb = initialize(md.smb,md);
96md.basalforcings = initialize(md.basalforcings,md);
97
98%Deal with other boundary conditions
99if isnan(md.balancethickness.thickening_rate),
100 md.balancethickness.thickening_rate=zeros(md.mesh.numberofvertices,1);
101 disp(' no balancethickness.thickening_rate specified: values set as zero');
102end
103
104md.masstransport.spcthickness=NaN*ones(md.mesh.numberofvertices,1);
105md.balancethickness.spcthickness=NaN*ones(md.mesh.numberofvertices,1);
106md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
107
108if (length(md.initialization.temperature)==md.mesh.numberofvertices),
109 md.thermal.spctemperature=NaN*ones(md.mesh.numberofvertices,1);
110 if isprop(md.mesh,'vertexonsurface'),
111 pos=find(md.mesh.vertexonsurface);
112 md.thermal.spctemperature(pos)=md.initialization.temperature(pos); %impose observed temperature on surface
113 end
114 if (length(md.basalforcings.geothermalflux)~=md.mesh.numberofvertices),
115 md.basalforcings.geothermalflux=zeros(md.mesh.numberofvertices,1);
116 md.basalforcings.geothermalflux(find(md.mask.ocean_levelset>0.))=50.*10.^-3; %50mW/m2
117 end
118else
119 disp(' no thermal boundary conditions created: no observed temperature found');
120end
Note: See TracBrowser for help on using the repository browser.