source: issm/trunk/src/m/classes/public/extrude.m@ 5071

Last change on this file since 5071 was 5071, checked in by seroussi, 15 years ago

added vertices_type

File size: 8.5 KB
Line 
1function md=extrude(md,varargin)
2%EXTRUDE - vertically extrude a 2d mesh
3%
4% vertically extrude a 2d mesh and create corresponding 3d mesh.
5% The vertical distribution can:
6% - follow a polynomial law
7% - follow two polynomial laws, one for the lower part and one for the upper part of the mesh
8% - be discribed by a list of coefficients (between 0 and 1)
9%
10%
11% Usage:
12% md=extrude(md,numlayers,extrusionexponent);
13% md=extrude(md,numlayers,lowerexponent,upperexponent);
14% md=extrude(md,listofcoefficients);
15%
16% Example:
17% md=extrude(md,8,3);
18% md=extrude(md,8,3,2);
19% md=extrude(md,[0 0.2 0.5 0.7 0.9 0.95 1]);
20%
21% See also: MODELEXTRACT, COLLAPSE
22
23%some checks on list of arguments
24if ((nargin>4) | (nargin<2) | (nargout~=1)),
25 help extrude;
26 error('extrude error message');
27end
28
29if md.counter<3,
30 help extrude;
31 error('only fully parameterized 2d models can be extruded');
32end
33
34if md.counter>=4,
35 error('This model has already been extruded!','s');
36end
37
38%Extrude the mesh
39if nargin==2, %list of coefficients
40 list=varargin{1};
41 if any(list<0) | any(list>1),
42 error('extrusioncoefficients must be between 0 and 1');
43 end
44 extrusionlist=sort(unique([list(:);0;1]));
45 numlayers=length(extrusionlist);
46elseif nargin==3, %one polynomial law
47 if varargin{2}<=0,
48 help extrude;
49 error('extrusionexponent must be >=0');
50 end
51 numlayers=varargin{1};
52 extrusionlist=((0:1:numlayers-1)/(numlayers-1)).^varargin{2};
53elseif nargin==4, %two polynomial laws
54 numlayers=varargin{1};
55 lowerexp=varargin{2};
56 upperexp=varargin{3};
57
58 if varargin{2}<=0 | varargin{3}<=0,
59 help extrude;
60 error('lower and upper extrusionexponents must be >=0');
61 end
62
63 lowerextrusionlist=[(0:2/(numlayers-1):1).^lowerexp]/2;
64 upperextrusionlist=[(0:2/(numlayers-1):1).^upperexp]/2;
65 extrusionlist=sort(unique([lowerextrusionlist 1-upperextrusionlist]));
66
67end
68
69if numlayers<2,
70 disp('number of layers should be at least 2. returning initial model...');
71 return
72end
73
74%Initialize with the 2d mesh
75x3d=[];
76y3d=[];
77z3d=[]; %the lower grid is on the bed
78thickness3d=md.thickness; %thickness and bed for these grids
79bed3d=md.bed;
80
81%Create the new layers
82for i=1:numlayers,
83 x3d=[x3d; md.x];
84 y3d=[y3d; md.y];
85 %grids are distributed between bed and surface accordingly to the given exponent
86 z3d=[z3d; bed3d+thickness3d*extrusionlist(i)];
87end
88number_grids3d=size(x3d,1); %number of 3d grids for the non extruded part of the mesh
89
90%Extrude elements
91elements3d=[];
92for i=1:numlayers-1,
93 elements3d=[elements3d;[md.elements+(i-1)*md.numberofgrids md.elements+i*md.numberofgrids]]; %Create the elements of the 3d mesh for the non extruded part
94end
95number_el3d=size(elements3d,1); %number of 3d grids for the non extruded part of the mesh
96
97%Keep a trace of lower and upper grids
98lowergrids=NaN*ones(number_grids3d,1);
99uppergrids=NaN*ones(number_grids3d,1);
100lowergrids(md.numberofgrids+1:end)=1:(numlayers-1)*md.numberofgrids;
101uppergrids(1:(numlayers-1)*md.numberofgrids)=md.numberofgrids+1:number_grids3d;
102md.lowergrids=lowergrids;
103md.uppergrids=uppergrids;
104
105%same for lower and upper elements
106lowerelements=NaN*ones(number_el3d,1);
107upperelements=NaN*ones(number_el3d,1);
108lowerelements(md.numberofelements+1:end)=1:(numlayers-2)*md.numberofelements;
109upperelements(1:(numlayers-2)*md.numberofelements)=md.numberofelements+1:(numlayers-1)*md.numberofelements;
110md.lowerelements=lowerelements;
111md.upperelements=upperelements;
112
113
114
115%Save old mesh
116md.x2d=md.x;
117md.y2d=md.y;
118md.z2d=md.z;
119md.elements2d=md.elements;
120md.elements_type2d=md.elements_type;
121md.vertices_type2d=md.vertices_type;
122md.numberofelements2d=md.numberofelements;
123md.numberofgrids2d=md.numberofgrids;
124
125%Update mesh type
126md.dim=3;
127
128%Build global 3d mesh
129md.elements=elements3d;
130md.x=x3d;
131md.y=y3d;
132md.z=z3d;
133md.numberofelements=number_el3d;
134md.numberofgrids=number_grids3d;
135md.numlayers=numlayers;
136
137%Ok, now deal with the other fields from the 2d mesh:
138
139%drag_coefficient is limited to grids that are on the bedrock.
140md.drag_coefficient=project3d(md,md.drag_coefficient,'node',1);
141
142%p and q (same deal, except for element that are on the bedrock: )
143md.drag_p=project3d(md,md.drag_p,'element');
144md.drag_q=project3d(md,md.drag_q,'element');
145
146%observations
147md.vx_obs=project3d(md,md.vx_obs,'node');
148md.vy_obs=project3d(md,md.vy_obs,'node');
149md.vel_obs=project3d(md,md.vel_obs,'node');
150md.vx_bal=project3d(md,md.vx_bal,'node');
151md.vy_bal=project3d(md,md.vy_bal,'node');
152md.vel_bal=project3d(md,md.vel_bal,'node');
153md.vel_obs_raw=project3d(md,md.vel_obs_raw,'node');
154md.accumulation_rate=project3d(md,md.accumulation_rate,'node');
155md.dhdt=project3d(md,md.dhdt,'node');
156md.firn_layer=project3d(md,md.firn_layer,'node',md.numlayers);
157
158%results
159if ~isnan(md.vx),md.vx=project3d(md,md.vx,'node');end;
160if ~isnan(md.vy),md.vy=project3d(md,md.vy,'node');end;
161if ~isnan(md.vz),md.vz=project3d(md,md.vz,'node');end;
162if ~isnan(md.vel),md.vel=project3d(md,md.vel,'node');end;
163if ~isnan(md.temperature),md.temperature=project3d(md,md.temperature,'node');end;
164if ~isnan(md.surface_slopex),md.surface_slopex=project3d(md,md.surface_slopex,'node');end;
165if ~isnan(md.surface_slopey),md.surface_slopey=project3d(md,md.surface_slopey,'node');end;
166if ~isnan(md.bed_slopex),md.bed_slopex=project3d(md,md.bed_slopex,'node');end;
167if ~isnan(md.bed_slopey),md.bed_slopey=project3d(md,md.bed_slopey,'node');end;
168
169%bedinfo and surface info
170md.elementonbed=project3d(md,ones(md.numberofelements2d,1),'element',1);
171md.elementonsurface=project3d(md,ones(md.numberofelements2d,1),'element',md.numlayers-1);
172md.gridonbed=project3d(md,ones(md.numberofgrids2d,1),'node',1);
173md.gridonsurface=project3d(md,ones(md.numberofgrids2d,1),'node',md.numlayers);
174
175%elementstype
176if ~isnan(md.elements_type)
177 oldelements_type=md.elements_type2d;
178 md.elements_type=zeros(number_el3d,2);
179 md.elements_type(:,1)=project3d(md,oldelements_type(:,1),'element');
180 md.elements_type(:,2)=project3d(md,oldelements_type(:,2),'element');
181 md.gridonhutter=project3d(md,md.gridonhutter,'node');
182 md.gridonmacayeal=project3d(md,md.gridonmacayeal,'node');
183 md.gridonpattyn=project3d(md,md.gridonpattyn,'node');
184 md.gridonstokes=project3d(md,md.gridonstokes,'node');
185
186 %dead grids
187 md.deadgrids=ones(md.numberofgrids,1);
188 md.deadgrids(md.elements(md.elements_type(:,1)~=MacAyealFormulationEnum,:))=0;%non macayeal grids are not dead
189 md.deadgrids(find(md.gridonbed))=0;%grids from elements on bed are not dead
190end
191
192%verticestype
193if ~isnan(md.vertices_type)
194 oldvertices_type=md.vertices_type2d;
195 md.vertices_type=zeros(number_grids3d,2);
196 md.vertices_type(:,1)=project3d(md,oldvertices_type(:,1),'node');
197 md.vertices_type(:,2)=project3d(md,oldvertices_type(:,2),'node');
198end
199
200%boundary conditions
201md.spcvelocity=project3d(md,md.spcvelocity,'node');
202md.spctemperature=project3d(md,md.spctemperature,'node',md.numlayers);
203md.spcthickness=project3d(md,md.spcthickness,'node');
204
205%Extrusion of Neumann BC
206%in 3d, segmentonnumann is: [grid1 grid2 grid3 grid4 element]
207pressureload_layer1=[md.pressureload(:,1:2) md.pressureload(:,2)+md.numberofgrids2d md.pressureload(:,1)+md.numberofgrids2d md.pressureload(:,3:4)]; %Add two columns on the first layer
208pressureload=[];
209for i=1:numlayers-1,
210 pressureload=[pressureload ;pressureload_layer1(:,1:4)+(i-1)*md.numberofgrids2d pressureload_layer1(:,5)+(i-1)*md.numberofelements2d pressureload_layer1(:,6)];
211end
212
213%plug into md
214md.pressureload=pressureload;
215
216%materials
217md.rheology_B=project3d(md,md.rheology_B,'node');
218md.rheology_n=project3d(md,md.rheology_n,'element');
219
220%parameters
221md.surface=project3d(md,md.surface,'node');
222md.thickness=project3d(md,md.thickness,'node');
223md.bed=project3d(md,md.bed,'node');
224md.gridonboundary=project3d(md,md.gridonboundary,'node');
225md.elementoniceshelf=project3d(md,md.elementoniceshelf,'element');
226md.gridoniceshelf=project3d(md,md.gridoniceshelf,'node');
227md.elementonicesheet=project3d(md,md.elementonicesheet,'element');
228md.gridonicesheet=project3d(md,md.gridonicesheet,'node');
229md.elementonwater=project3d(md,md.elementonwater,'element');
230md.gridonwater=project3d(md,md.gridonwater,'node');
231if ~isnan(md.weights),md.weights=project3d(md,md.weights,'node');end;
232
233%Put lithostatic pressure is there is an existing pressure
234if ~isnan(md.pressure),
235 md.pressure=md.g*md.rho_ice*(md.surface-md.z);
236end
237
238%special for thermal modeling:
239md.melting_rate=project3d(md,md.melting_rate,'node',1);
240md.observed_temperature=project3d(md,md.observed_temperature,'node');
241md.geothermalflux=project3d(md,md.geothermalflux,'node',1); %bedrock only gets geothermal flux
242
243%increase connectivity if less than 25:
244if md.connectivity<=25,
245 md.connectivity=100;
246end
247
248%augment counter keeping track of what has been done to this model
249md.counter=4;
Note: See TracBrowser for help on using the repository browser.