1 | function md2=regionaltransient2d(md1,area,hmin,hmax,err,stepres)
|
---|
2 | %regionaltransient2d - extract a model according to an Argus contour or flag list and remesh
|
---|
3 | % at new resolution res
|
---|
4 | %
|
---|
5 | % This routine extracts a submodel from a bigger model with respect to a given contour
|
---|
6 | % md must be followed by the corresponding exp domain file (argus type, .exp extension).
|
---|
7 | % The model will be remeshed at high rsolution hmin and low resolution hmax. The ice
|
---|
8 | % boundary velocities will be spc'd to the transient velocities at saved transient steps
|
---|
9 | % at the resolution optionally provided for stepres. A stepres of 2 means that you wish
|
---|
10 | % to skip every other saved transient step. This is useful when extracting a long transient.
|
---|
11 | %
|
---|
12 | % Usage:
|
---|
13 | % md2=regionaltransient2d(md1,area,hmin,hmax,err);
|
---|
14 | %
|
---|
15 | % Examples:
|
---|
16 | % md2=regionaltransient2d(md,'Domain.exp',500,10000,[15 250]);
|
---|
17 | % md2=regionaltransient2d(md,'Domain.exp',3000,15000,[10 300],2);
|
---|
18 | %
|
---|
19 | % See also: MODELEXTRACT, EXTRUDE, COLLAPSE
|
---|
20 |
|
---|
21 | %some checks
|
---|
22 | if ((nargin~=5) & (nargin~=6)),
|
---|
23 | help regionaltransient2d
|
---|
24 | error('regionaltransient2d error message: bad usage');
|
---|
25 | end
|
---|
26 |
|
---|
27 | %get check option
|
---|
28 | if (nargin==5),
|
---|
29 | stepres=1;
|
---|
30 | end
|
---|
31 |
|
---|
32 | %take every fields from model
|
---|
33 | mde=modelextract(md1,area);
|
---|
34 | mde.private.bamg=[];
|
---|
35 | mde.mesh.extractedvertices=nan;
|
---|
36 | mde.mesh.extractedelements=nan;
|
---|
37 |
|
---|
38 | %remesh
|
---|
39 | md2=bamg(mde,'hmin',hmin,'hmax',hmax,'field',[mde.inversion.vel_obs mde.geometry.surface],'splitcorner',1,'KeepVertices',0,'err',err);
|
---|
40 | md2=setmask(md2,'','');
|
---|
41 |
|
---|
42 | %automatically modify fields
|
---|
43 |
|
---|
44 | %loop over model fields
|
---|
45 | model_fields=fields(md1);
|
---|
46 | for i=1:length(model_fields),
|
---|
47 |
|
---|
48 | %get field
|
---|
49 | field=md1.(model_fields{i});
|
---|
50 | fieldsize=size(field);
|
---|
51 |
|
---|
52 | %copy field, interpolated to new mesh
|
---|
53 | if isobject(field), %recursive call
|
---|
54 | object_fields=fields(md1.(model_fields{i}));
|
---|
55 | fname=['(model_fields{i}).(object_fields{j})'];
|
---|
56 | else
|
---|
57 | object_fields=field;
|
---|
58 | fname=['(model_fields{i})'];
|
---|
59 | end
|
---|
60 | for j=1:length(object_fields),
|
---|
61 | %get field
|
---|
62 | field=eval(['md2.' fname]);
|
---|
63 | fieldsize=size(field);
|
---|
64 |
|
---|
65 | %size = number of nodes * n
|
---|
66 | for n=1:fieldsize(2)
|
---|
67 | if fieldsize(1)==mde.mesh.numberofvertices
|
---|
68 | if(sum(field(:,n) ~= field(1,n)) == 0)
|
---|
69 | eval(['md2.' fname '(1:md2.mesh.numberofvertices,n)=field(1,n)*ones(md2.mesh.numberofvertices,1);']);
|
---|
70 | else
|
---|
71 | eval(['md2.' fname '(1:md2.mesh.numberofvertices,n)=InterpFromMeshToMesh2d(mde.mesh.elements,mde.mesh.x,mde.mesh.y,field(:,n),md2.mesh.x,md2.mesh.y);']);
|
---|
72 | end
|
---|
73 | eval(['md2.' fname '(:,n)=md2.' fname '(1:md2.mesh.numberofvertices,n);']);
|
---|
74 | elseif fieldsize(1)==mde.mesh.numberofvertices+1
|
---|
75 | if(sum(field(1:end-1,n) ~= field(1,n)) == 0)
|
---|
76 | eval(['md2.' fname '(1:md2.mesh.numberofvertices+1,n)=[field(1,n)*ones(md2.mesh.numberofvertices,1); field(end,n)];']);
|
---|
77 | else
|
---|
78 | eval(['md2.' fname '(1:md2.mesh.numberofvertices+1,n)=[InterpFromMeshToMesh2d(mde.mesh.elements,mde.mesh.x,mde.mesh.y,field(1:end-1,n),md2.mesh.x,md2.mesh.y); field(end,n)];']);
|
---|
79 | end
|
---|
80 | eval(['md2.' fname '(:,n)=md2.' fname '(1:md2.mesh.numberofvertices+1,n)']);
|
---|
81 | %size = number of elements * n
|
---|
82 | elseif fieldsize(1)==mde.mesh.numberofelements
|
---|
83 | if(sum(field(1:end-1,n) ~= field(1,n)) == 0)
|
---|
84 | eval(['md2.' fname '(1:md2.mesh.numberofelements,n)=field(1,n)*ones(md2.mesh.numberofelements,1);']);
|
---|
85 | else
|
---|
86 | eval(['md2.' fname '(1:md2.mesh.numberofelements,n)=InterpFromMeshToMesh2d(mde.mesh.elements,mde.mesh.x,mde.mesh.y,field(:,n),md2.mesh.x,md2.mesh.y);']);
|
---|
87 | end
|
---|
88 | eval(['md2.' fname '(:,n)=md2.' fname '(1:md2.mesh.numberofelements,n);']);
|
---|
89 | end
|
---|
90 | end
|
---|
91 | end
|
---|
92 | end
|
---|
93 |
|
---|
94 | %Read transient velocities and thickness, looping through only the populated times
|
---|
95 | spcx=[];
|
---|
96 | spcy=[];
|
---|
97 | spct=[];
|
---|
98 | steps=[];
|
---|
99 | nsteps=length(md1.results.TransientSolution);
|
---|
100 | count=0;
|
---|
101 | numElements=arrayfun(@(x) numel(x.step), md1.results.TransientSolution);
|
---|
102 | for t=find(numElements==1)
|
---|
103 | if ~isempty(md1.results.TransientSolution(t).Vel) & mod(count,stepres)==0,
|
---|
104 | vx=PatchToVec(md1.results.TransientSolution(t).Vx);
|
---|
105 | vy=PatchToVec(md1.results.TransientSolution(t).Vy);
|
---|
106 | thickness=PatchToVec(md1.results.TransientSolution(t).Thickness);
|
---|
107 | spcx=[spcx InterpFromMeshToMesh2d(md1.mesh.elements,md1.mesh.x,md1.mesh.y,vx,md2.mesh.x,md2.mesh.y)];
|
---|
108 | spcy=[spcy InterpFromMeshToMesh2d(md1.mesh.elements,md1.mesh.x,md1.mesh.y,vy,md2.mesh.x,md2.mesh.y)];
|
---|
109 | spct=[spct InterpFromMeshToMesh2d(md1.mesh.elements,md1.mesh.x,md1.mesh.y,thickness,md2.mesh.x,md2.mesh.y)];
|
---|
110 | steps=[steps t*md1.timestepping.time_step];
|
---|
111 | end
|
---|
112 | count=count+1;
|
---|
113 | end
|
---|
114 |
|
---|
115 | %As long as there are recorded time steps, spc the boundaries with velocities
|
---|
116 | if nsteps > 0
|
---|
117 | md2.diagnostic.spcvx=md2.diagnostic.spcvx*ones(1,size(spcx,2));
|
---|
118 | md2.diagnostic.spcvy=md2.diagnostic.spcvy*ones(1,size(spcy,2));
|
---|
119 | md2.diagnostic.spcvz=md2.diagnostic.spcvz*ones(1,size(spcx,2));
|
---|
120 | md2.prognostic.spcthickness=md2.prognostic.spcthickness*ones(1,size(spct,2));
|
---|
121 | md2.diagnostic.spcvx(find(md2.mesh.vertexonboundary),:)=spcx(find(md2.mesh.vertexonboundary),:);
|
---|
122 | md2.diagnostic.spcvy(find(md2.mesh.vertexonboundary),:)=spcy(find(md2.mesh.vertexonboundary),:);
|
---|
123 | md2.diagnostic.spcvz(find(md2.mesh.vertexonboundary),:)=0;
|
---|
124 | md2.prognostic.spcthickness(find(md2.mesh.vertexonboundary),:)=spct(find(md2.mesh.vertexonboundary),:);
|
---|
125 | md2.diagnostic.spcvx=[md2.diagnostic.spcvx; steps];
|
---|
126 | md2.diagnostic.spcvy=[md2.diagnostic.spcvy; steps];
|
---|
127 | md2.diagnostic.spcvz=[md2.diagnostic.spcvz; steps];
|
---|
128 | md2.prognostic.spcthickness=[md2.prognostic.spcthickness; steps];
|
---|
129 | end
|
---|
130 |
|
---|
131 | %Diagnostic. Don't spc the icefront vertices.
|
---|
132 | if ~isnan(md2.diagnostic.icefront)
|
---|
133 | md1s=modelextract(md1,area);
|
---|
134 | %md2.diagnostic.icefront=[md2.mesh.segments 2];
|
---|
135 | e2=md2.mesh.segments(:,end);
|
---|
136 | e1=md1s.mesh.segments(:,end);
|
---|
137 |
|
---|
138 | pload = nan*ones(size(md1s.mesh.elements,1),1);
|
---|
139 | pload(md1s.diagnostic.icefront(:,end-1))=md1s.diagnostic.icefront(:,end);
|
---|
140 |
|
---|
141 | x2=mean(md2.mesh.x(md2.mesh.elements(e2,:)),2);
|
---|
142 | y2=mean(md2.mesh.y(md2.mesh.elements(e2,:)),2);
|
---|
143 | x1=mean(md1s.mesh.x(md1s.mesh.elements),2);
|
---|
144 | y1=mean(md1s.mesh.y(md1s.mesh.elements),2);
|
---|
145 |
|
---|
146 | pload2=griddata(x1,y1,pload,x2,y2,'nearest');
|
---|
147 | md2.diagnostic.icefront=[md2.mesh.segments(~isnan(pload2),:) pload2(~isnan(pload2))];
|
---|
148 | md2.diagnostic.spcvx(unique(md2.diagnostic.icefront(:,1:2)),:)=nan;
|
---|
149 | md2.diagnostic.spcvy(unique(md2.diagnostic.icefront(:,1:2)),:)=nan;
|
---|
150 | md2.diagnostic.spcvz(unique(md2.diagnostic.icefront(:,1:2)),:)=nan;
|
---|
151 | md2.prognostic.spcthickness(unique(md2.diagnostic.icefront(:,1:2)),:)=nan;
|
---|
152 | end
|
---|
153 |
|
---|
154 | %Clear results fields
|
---|
155 | if isstruct(md1.results),
|
---|
156 | md2.results=[];
|
---|
157 | end
|
---|
158 |
|
---|