source: issm/trunk-jpl/src/m/model/regionaltransient2d.m@ 12618

Last change on this file since 12618 was 12618, checked in by schlegel, 13 years ago

debug regional extract routine

File size: 6.4 KB
Line 
1function 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
22if ((nargin~=5) & (nargin~=6)),
23 help regionaltransient2d
24 error('regionaltransient2d error message: bad usage');
25end
26
27%get check option
28if (nargin==5),
29 stepres=1;
30end
31
32%take every fields from model
33mde=modelextract(md1,area);
34mde.private.bamg=[];
35mde.mesh.extractedvertices=nan;
36mde.mesh.extractedelements=nan;
37
38%remesh
39md2=bamg(mde,'hmin',hmin,'hmax',hmax,'field',[mde.inversion.vel_obs mde.geometry.surface],'splitcorner',1,'KeepVertices',0,'err',err);
40md2=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
Note: See TracBrowser for help on using the repository browser.