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

Last change on this file since 2252 was 2252, checked in by Eric.Larour, 15 years ago

Missing extrusion for vel_obs_raw.

File size: 6.5 KB
Line 
1function md=extrude(md,numlayers,extrusionexponent)
2%EXTRUDE - vertically extrude a 2d mesh
3%
4% vertically extrude a 2d mesh and create corresponding 3d mesh following the extrusionexponent,
5% the vertical distribution follows a polynomial law:');
6% extrusionexponent>1 refinement at the base');
7% 0<extrusionexponent<1 refinement at the surface');
8% extrusionexponent=1 linear extrusion');
9%
10% Usage:
11% md=extrude(md,numlayers,extrusionexponent);
12%
13% Example:
14% md=extrude(md,8,3);
15%
16% See also: MODELEXTRACT, COLLAPSE
17
18%some checks on list of arguments
19if ((nargin~=3) | (nargout~=1)),
20 help extrude;
21 error('extrude error message');
22end
23
24if md.counter<3,
25 help extrude;
26 error('only fully parameterized 2d models can be extruded');
27end
28
29if md.counter>=4,
30 error('This model has already been extruded!','s');
31end
32
33if numlayers<2,
34 disp('number of layers should be at least 2. returning initial model...');
35 return
36end
37
38if extrusionexponent<=0,
39 help extrude;
40 error('extrusionexponent must be >=0');
41end
42
43%Extrude the mesh
44%Initialize with the 2d mesh
45x3d=md.x;
46y3d=md.y;
47z3d=md.bed; %the lower grid is on the bed
48thickness3d=md.thickness; %thickness and bed for these grids
49bed3d=md.bed;
50
51%Create the new layers
52for i=1:numlayers-1,
53 x3d=[x3d; md.x];
54 y3d=[y3d; md.y];
55 %grids are distributed between bed and surface accordingly to the given exponent
56 z3d=[z3d; bed3d+thickness3d*(i/(numlayers-1))^extrusionexponent];
57end
58number_grids3d=size(x3d,1); %number of 3d grids for the non extruded part of the mesh
59
60%Extrude elements
61elements3d=[];
62for i=1:numlayers-1,
63 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
64end
65number_el3d=size(elements3d,1); %number of 3d grids for the non extruded part of the mesh
66
67%Keep a trace of lower and upper grids
68lowergrids=NaN*ones(number_grids3d,1);
69uppergrids=NaN*ones(number_grids3d,1);
70lowergrids(md.numberofgrids+1:end)=1:(numlayers-1)*md.numberofgrids;
71uppergrids(1:(numlayers-1)*md.numberofgrids)=md.numberofgrids+1:number_grids3d;
72md.lowergrids=lowergrids;
73md.uppergrids=uppergrids;
74
75%Save old mesh
76md.x2d=md.x;
77md.y2d=md.y;
78md.z2d=md.z;
79md.elements2d=md.elements;
80md.elements_type2d=md.elements_type;
81md.numberofelements2d=md.numberofelements;
82md.numberofgrids2d=md.numberofgrids;
83
84%Update mesh type
85md.type='3d';
86
87%Build global 3d mesh
88md.elements=elements3d;
89md.x=x3d;
90md.y=y3d;
91md.z=z3d;
92md.numberofelements=number_el3d;
93md.numberofgrids=number_grids3d;
94md.numlayers=numlayers;
95
96%Ok, now deal with the other fields from the 2d mesh:
97
98%drag is limited to grids that are on the bedrock.
99md.drag=project3d(md,md.drag,'node',1);
100
101%p and q (same deal, except for element that are on the bedrock: )
102md.p=project3d(md,md.p,'element');
103md.q=project3d(md,md.q,'element');
104
105%observations
106md.vx_obs=project3d(md,md.vx_obs,'node');
107md.vy_obs=project3d(md,md.vy_obs,'node');
108md.vel_obs=project3d(md,md.vel_obs,'node');
109md.vel_obs_raw=project3d(md,md.vel_obs_raw,'node');
110md.accumulation=project3d(md,md.accumulation,'node');
111md.firn_layer=project3d(md,md.firn_layer,'node',md.numlayers);
112
113%results
114if ~isnan(md.vx),md.vx=project3d(md,md.vx,'node');end;
115if ~isnan(md.vy),md.vy=project3d(md,md.vy,'node');end;
116if ~isnan(md.vz),md.vz=project3d(md,md.vz,'node');end;
117if ~isnan(md.vel),md.vel=project3d(md,md.vel,'node');end;
118if ~isnan(md.temperature),md.temperature=project3d(md,md.temperature,'node');end;
119if ~isnan(md.surface_slopex),md.surface_slopex=project3d(md,md.surface_slopex,'node');end;
120if ~isnan(md.surface_slopey),md.surface_slopey=project3d(md,md.surface_slopey,'node');end;
121if ~isnan(md.bed_slopex),md.bed_slopex=project3d(md,md.bed_slopex,'node');end;
122if ~isnan(md.bed_slopey),md.bed_slopey=project3d(md,md.bed_slopey,'node');end;
123
124%bedinfo and surface info
125md.elementonbed=project3d(md,ones(md.numberofelements2d,1),'element',1);
126md.elementonsurface=project3d(md,ones(md.numberofelements2d,1),'element',md.numlayers-1);
127md.gridonbed=project3d(md,ones(md.numberofgrids2d,1),'node',1);
128md.gridonsurface=project3d(md,ones(md.numberofgrids2d,1),'node',md.numlayers);
129
130%elementstype
131if ~isnan(md.elements_type)
132 oldelements_type=md.elements_type2d;
133 md.elements_type=zeros(number_el3d,2);
134 md.elements_type(:,1)=project3d(md,oldelements_type(:,1),'element');
135 md.elements_type(:,2)=project3d(md,oldelements_type(:,2),'element');
136 md.gridonhutter=project3d(md,md.gridonhutter,'node');
137 md.gridonmacayeal=project3d(md,md.gridonmacayeal,'node');
138 md.gridonpattyn=project3d(md,md.gridonpattyn,'node');
139 md.gridonstokes=project3d(md,md.gridonstokes,'node');
140
141 %dead grids
142 md.deadgrids=ones(md.numberofgrids,1);
143 md.deadgrids(md.elements(md.elements_type(:,1)~=MacAyealFormulationEnum,:))=0;%non macayeal grids are not dead
144 md.deadgrids(find(md.gridonbed))=0;%grids from elements on bed are not dead
145end
146
147%boundary conditions
148md.spcvelocity=project3d(md,md.spcvelocity,'node');
149md.spctemperature=project3d(md,md.spctemperature,'node',md.numlayers);
150md.spcthickness=project3d(md,md.spcthickness,'node');
151
152%Extrusion of Neumann BC
153%in 3d, segmentonnumann is: [grid1 grid2 grid3 grid4 element]
154oldpressureload=md.pressureload;
155pressureload_layer1=[oldpressureload(:,1:2) oldpressureload(:,2)+md.numberofgrids2d oldpressureload(:,1)+md.numberofgrids2d oldpressureload(:,3)]; %Add two columns on the first layer
156pressureload=[];
157for i=1:numlayers-1,
158 pressureload=[pressureload ;pressureload_layer1(:,1:4)+(i-1)*md.numberofgrids2d pressureload_layer1(:,5)+(i-1)*md.numberofelements2d ];
159end
160
161%plug into md
162md.pressureload=pressureload;
163
164%materials
165md.B=project3d(md,md.B,'node');
166md.n=project3d(md,md.n,'element');
167
168%parameters
169md.surface=project3d(md,md.surface,'node');
170md.thickness=project3d(md,md.thickness,'node');
171md.bed=project3d(md,md.bed,'node');
172md.gridonboundary=project3d(md,md.gridonboundary,'node');
173md.elementoniceshelf=project3d(md,md.elementoniceshelf,'element');
174md.gridoniceshelf=project3d(md,md.gridoniceshelf,'node');
175md.elementonicesheet=project3d(md,md.elementonicesheet,'element');
176md.gridonicesheet=project3d(md,md.gridonicesheet,'node');
177md.elementonwater=project3d(md,md.elementonwater,'element');
178md.gridonwater=project3d(md,md.gridonwater,'node');
179
180%special for thermal modeling:
181md.melting=project3d(md,md.melting,'node',1);
182md.observed_temperature=project3d(md,md.observed_temperature,'node');
183md.geothermalflux=project3d(md,md.geothermalflux,'node',1); %bedrock only gets geothermal flux
184
185%increase connectivity if less than 25:
186if md.connectivity<=25,
187 md.connectivity=100;
188end
189
190%augment counter keeping track of what has been done to this model
191md.counter=4;
Note: See TracBrowser for help on using the repository browser.