Changeset 25836 for issm/trunk/src/m/classes/sealevelmodel.m
- Timestamp:
- 12/08/20 08:45:53 (4 years ago)
- Location:
- issm/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
- Property svn:mergeinfo changed
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/m/classes/sealevelmodel.m
r24313 r25836 12 12 properties (SetAccess=public) %Model fields 13 13 % {{{ 14 icecaps = {}; % list of ice cap models14 icecaps = {}; % list of land/ice models, name should be change longer term. 15 15 earth = 0; % model for the whole earth 16 16 basins = {}; % list of basins, matching icecaps, where shapefile info is held. … … 19 19 settings = 0; 20 20 private = 0; 21 range = 0;22 21 mergedcaps = 0; 23 22 transitions = {}; 24 eltransitions = {}; 23 eltransitions = {}; 24 planet = ''; 25 25 %}}} 26 26 end 27 27 methods 28 28 function slm = sealevelmodel(varargin) % {{{ 29 30 if nargin==0, 31 slm=setdefaultparameters(slm); 32 else 33 slm=setdefaultparameters(slm); 34 35 options=pairoptions(varargin{:}); 36 29 slm=setdefaultparameters(slm); 30 31 if nargin==1, 32 33 options=pairoptions(varargin{:}); 34 37 35 %recover all the icecap models: 38 36 slm.icecaps=getfieldvalues(options,'ice_cap',{}); 39 37 40 38 %recover the earth model: 41 slm.earth = getfieldvalue(options,'earth'); 39 slm.earth = getfieldvalue(options,'earth',0); 40 41 %set planet type: 42 slm.planet=getfieldvalue(options,'planet','earth'); 43 42 44 end 43 45 end … … 89 91 slm.private = private(); 90 92 slm.cluster = generic(); 91 slm.range = {};92 93 slm.transitions = {}; 93 slm.eltransitions = {}; 94 slm.eltransitions = {}; 95 slm.planet = 'earth'; 94 96 end 95 97 %}}} … … 100 102 disp(sprintf('%19s: %-22s -- %s','cluster' ,['[1x1 ' class(self.cluster) ']'],'cluster parameters (number of cpus...)')); 101 103 disp(sprintf('%19s: %-22s -- %s','miscellaneous' ,['[1x1 ' class(self.miscellaneous) ']'],'miscellaneous fields')); 102 disp(sprintf('%19s: %-22s -- %s','range' ,['[1x1 ' class(self.range) ']'],'ranges'));103 104 end % }}} 104 105 function self=mergeresults(self) % {{{ 105 champs=field s(self.icecaps{1}.results.TransientSolution);106 champs=fieldnames(self.icecaps{1}.results.TransientSolution); 106 107 for i=1:length(self.mergedcaps)/2, 107 108 md=self.mergedcaps{2*(i-1)+1}; trans=self.mergedcaps{2*(i-1)+2}; 108 icecaps=self.icecaps(self.range{2*(i-1)+2});109 %icecaps=self.icecaps(self.range{2*(i-1)+2}); 109 110 for j=1:length(self.icecaps{1}.results.TransientSolution), 110 111 for k=1:length(champs), … … 143 144 end 144 145 end % }}} 146 function n=ncaps(self) % {{{ 147 n=length(self.icecaps); 148 end % }}} 149 function list=continents(self) % {{{ 150 list={}; 151 for i=1:length(self.basins), 152 list{end+1}=self.basins{i}.continent; 153 end 154 list=unique(list); 155 end % }}} 156 function list=basinsfromcontinent(self,continent) % {{{ 157 list={}; 158 for i=1:length(self.icecaps), 159 if strcmpi(self.basins{i}.continent,continent), 160 list{end+1}=self.basins{i}.name; 161 end 162 end 163 list=unique(list); 164 end % }}} 145 165 function addbasin(self,bas) % {{{ 146 if ~strcmpi(class(bas),'basin') 147 error('addbasin method only takes a ''basin'' class object as input'); 148 end; 149 self.basins{end+1}=bas; 166 if ~strcmpi(class(bas),'basin') 167 error('addbasin method only takes a ''basin'' class object as input'); 168 end; 169 self.basins{end+1}=bas; 170 end % }}} 171 function intersections2d(self,varargin) % {{{ 172 173 options=pairoptions(varargin{:}); 174 force=getfieldvalue(options,'force',0); 175 176 %initialize, to avoid issues of having more transitions than meshes. 177 self.transitions={}; 178 self.eltransitions={}; 179 180 %for elements: 181 xe=self.earth.mesh.x(self.earth.mesh.elements)*[1;1;1]/3; 182 ye=self.earth.mesh.y(self.earth.mesh.elements)*[1;1;1]/3; 183 184 for i=1:length(self.icecaps), 185 mdi=self.icecaps{i}; 186 187 %for elements: 188 xei=mdi.mesh.x(mdi.mesh.elements)*[1;1;1]/3; 189 yei=mdi.mesh.y(mdi.mesh.elements)*[1;1;1]/3; 190 191 disp(sprintf('Computing vertex intersections for basin %s',self.basins{i}.name)); 192 193 self.transitions{end+1}=meshintersect2d(self.earth.mesh.x,self.earth.mesh.y,mdi.mesh.x,mdi.mesh.y,'force',force); 194 195 self.eltransitions{end+1}=meshintersect2d(xe,ye,xei,yei,'force',force); 196 end 150 197 end % }}} 151 198 function intersections(self,varargin) % {{{ 152 199 153 options=pairoptions(varargin{:}); 154 force=getfieldvalue(options,'force',0); 155 156 %for elements: 157 xe=self.earth.mesh.x(self.earth.mesh.elements)*[1;1;1]/3; 158 ye=self.earth.mesh.y(self.earth.mesh.elements)*[1;1;1]/3; 159 ze=self.earth.mesh.z(self.earth.mesh.elements)*[1;1;1]/3; 160 161 for i=1:length(self.icecaps), 162 mdi=self.icecaps{i}; 163 mdi=TwoDToThreeD(mdi); 164 165 %for elements: 166 xei=mdi.mesh.x(mdi.mesh.elements)*[1;1;1]/3; 167 yei=mdi.mesh.y(mdi.mesh.elements)*[1;1;1]/3; 168 zei=mdi.mesh.z(mdi.mesh.elements)*[1;1;1]/3; 169 170 disp(sprintf('Computing vertex intersections for basin %s',self.basins{i}.name)); 200 options=pairoptions(varargin{:}); 201 force=getfieldvalue(options,'force',0); 202 203 %initialize, to avoid issues of having more transitions than meshes. 204 self.transitions={}; 205 self.eltransitions={}; 206 207 %for elements: 208 xe=self.earth.mesh.x(self.earth.mesh.elements)*[1;1;1]/3; 209 ye=self.earth.mesh.y(self.earth.mesh.elements)*[1;1;1]/3; 210 ze=self.earth.mesh.z(self.earth.mesh.elements)*[1;1;1]/3; 211 212 for i=1:length(self.icecaps), 213 mdi=self.icecaps{i}; 214 mdi=TwoDToThreeD(mdi,self.planet); 171 215 172 self.transitions{end+1}=meshintersect3d(self.earth.mesh.x,self.earth.mesh.y,self.earth.mesh.z,mdi.mesh.x,mdi.mesh.y,mdi.mesh.z,'force',force); 173 174 self.eltransitions{end+1}=meshintersect3d(xe,ye,ze,xei,yei,zei,'force',force); 175 end 176 216 %for elements: 217 xei=mdi.mesh.x(mdi.mesh.elements)*[1;1;1]/3; 218 yei=mdi.mesh.y(mdi.mesh.elements)*[1;1;1]/3; 219 zei=mdi.mesh.z(mdi.mesh.elements)*[1;1;1]/3; 220 221 disp(sprintf('Computing vertex intersections for basin %s',self.basins{i}.name)); 222 223 self.transitions{end+1}=meshintersect3d(self.earth.mesh.x,self.earth.mesh.y,self.earth.mesh.z,mdi.mesh.x,mdi.mesh.y,mdi.mesh.z,'force',force); 224 225 self.eltransitions{end+1}=meshintersect3d(xe,ye,ze,xei,yei,zei,'force',force); 226 end 177 227 end % }}} 178 228 function checkintersections(self) % {{{ 179 flags=zeros(self.earth.mesh.numberofvertices,1); 180 for i=1:length(self.basins), 181 flags(self.transitions{i})=i; 182 end 183 plotmodel(self.earth,'data',flags,'coastline','on'); 229 flags=zeros(self.earth.mesh.numberofvertices,1); 230 for i=1:length(self.basins), 231 flags(self.transitions{i})=i; 232 end 233 plotmodel(self.earth,'data',flags,'coastline','on'); 234 235 end % }}} 236 function checkbasinconsistency(self) % {{{ 237 for i=1:length(self.basins), 238 self.basins{i}.checkconsistency(); 239 end 184 240 185 241 end % }}} … … 192 248 if iscell(continent), 193 249 if length(continent)==1, 194 if strcmpi(continent{1},'all'), 195 %need to transform this into a list of continents: 196 continent={}; 197 for i=1:length(self.basins), 198 continent{end+1}=self.basins{i}.continent; 199 end 200 continent=unique(continent); 201 end 250 if strcmpi(continent{1},'all'), 251 %need to transform this into a list of continents: 252 continent={}; 253 for i=1:length(self.basins), 254 continent{end+1}=self.basins{i}.continent; 255 end 256 continent=unique(continent); 257 else 258 %nothing to do: assume we have a list of continents 259 end 202 260 else 203 %nothing to do ,we have a list of continents261 %nothing to do: assume we have a list of continents 204 262 end 205 263 else … … 208 266 continent={}; 209 267 for i=1:length(self.basins), 210 268 continent{end+1}=self.basins{i}.continent; 211 269 end 212 270 continent=unique(continent); … … 219 277 if iscell(bas), 220 278 if length(bas)==1, 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 279 if strcmpi(bas{1},'all'), 280 %need to transform this into a list of basins: 281 baslist=[]; 282 for i=1:length(self.basins), 283 if self.basins{i}.iscontinentany(continent{:}), 284 baslist(end+1)=i; 285 end 286 end 287 baslist=unique(baslist); 288 else 289 bas=bas{1}; 290 baslist=[]; 291 for i=1:length(self.basins), 292 if self.basins{i}.iscontinentany(continent{:}), 293 if self.basins{i}.isnameany(bas), 294 baslist(end+1)=i; 295 end 296 end 297 end 298 299 end 242 300 else 243 301 %we have a list of basin names: … … 280 338 end % }}} 281 339 function addicecap(self,md) % {{{ 282 if ~strcmpi(class(md),'model')283 error('addicecap method only takes a ''model'' class object as input');284 end285 self.icecaps{end+1}=md;340 if ~strcmpi(class(md),'model') 341 error('addicecap method only takes a ''model'' class object as input'); 342 end 343 self.icecaps{end+1}=md; 286 344 end % }}} 287 345 function basinsplot3d(self,varargin) % {{{ 288 for i=1:length(self.basins),289 self.basins{i}.plot3d(varargin{:});290 end346 for i=1:length(self.basins), 347 self.basins{i}.plot3d(varargin{:}); 348 end 291 349 end % }}} 292 350 function caticecaps(self,varargin) % {{{ … … 300 358 models=self.icecaps; 301 359 for i=1:length(models), 302 models{i}=TwoDToThreeD(models{i} );360 models{i}=TwoDToThreeD(models{i},self.planet); 303 361 end 304 362 … … 326 384 self.earth=md; 327 385 386 %Create mesh radius: 387 self.earth.mesh.r=planetradius('earth')*ones(md.mesh.numberofvertices,1); 388 389 end % }}} 390 function caticecaps2d(self,varargin) % {{{ 391 392 %recover options: 393 options=pairoptions(varargin{:}); 394 tolerance=getfieldvalue(options,'tolerance',1e-5); 395 loneedgesdetect=getfieldvalue(options,'loneedgesdetect',0); 396 models=self.icecaps; 397 398 %Plug all models together: 399 md=models{1}; 400 for i=2:length(models), 401 md=modelmerge2d(md,models{i},'tolerance',tolerance); 402 end 403 404 %Look for lone edges if asked for it: {{{ 405 if loneedgesdetect, 406 edges=loneedges(md); 407 hold on; 408 for i=1:length(edges), 409 ind1=edges(i,1); 410 ind2=edges(i,2); 411 plot([md.mesh.x(ind1),md.mesh.x(ind2)],[md.mesh.y(ind1),md.mesh.y(ind2)],'g*-'); 412 end 413 end %}}} 414 415 %Plug into earth: 416 self.earth=md; 417 328 418 end % }}} 329 419 function viscousiterations(self) % {{{ 330 420 for i=1:length(self.icecaps), 331 ic=self.icecaps{i}; 421 ic=self.icecaps{i}; 332 422 mvi=ic.results.TransientSolution(1).StressbalanceConvergenceNumSteps; 333 423 for j=2:length(ic.results.TransientSolution)-1, … … 339 429 function maxtimestep(self) % {{{ 340 430 for i=1:length(self.icecaps), 341 ic=self.icecaps{i}; 431 ic=self.icecaps{i}; 342 432 mvi=length(ic.results.TransientSolution); 343 433 timei=ic.results.TransientSolution(end).time; … … 350 440 function transfer(self,string) % {{{ 351 441 %Recover field size in one icecap: 352 eval(['n= length(self.icecaps{1}.' string ');']);442 eval(['n=size(self.icecaps{1}.' string ',1);']); 353 443 if n==self.icecaps{1}.mesh.numberofvertices, 354 444 eval(['self.earth.' string '=zeros(self.earth.mesh.numberofvertices,1);']); … … 356 446 eval(['self.earth.' string '(self.transitions{' num2str(i) '})=self.icecaps{' num2str(i) '}.' string ';']); 357 447 end 358 elseif n==self.icecaps{1} .mesh.numberofelements, 448 elseif n==(self.icecaps{1}.mesh.numberofvertices+1), 449 %dealing with a transient dataset. 450 %check that all timetags are similar between all icecaps: %{{{ 451 for i=1:length(self.icecaps), 452 eval(['capfieldi= self.icecaps{' num2str(i) '}.' string ';']); 453 for j=(i+1):length(self.icecaps), 454 eval(['capfieldj= self.icecaps{' num2str(j) '}.' string ';']); 455 if ~isequal(capfieldi(end,:),capfieldj(end,:)), 456 error(['Time stamps for ' string ' field are different between icecaps ' num2str(i) ' and ' num2str(j)]); 457 end 458 end 459 end 460 eval(['capfield1= self.icecaps{1}.' string ';']); 461 times=capfield1(end,:); 462 nsteps=length(times); 463 %}}} 464 %initialize: %{{{ 465 eval(['field=zeros(self.earth.mesh.numberofvertices+1,' num2str(nsteps) ');']); 466 eval(['field(end,:)=times;']); %transfer the times only, not the values 467 %}}} 468 %transfer all time fields: {{{ 469 for i=1:length(self.icecaps), 470 eval(['capfieldi= self.icecaps{' num2str(i) '}.' string ';']); 471 for j=1:nsteps, 472 eval(['field(self.transitions{' num2str(i) '},' num2str(j) ')=capfieldi(1:end-1,' num2str(j) ');']); %transfer only the values, not the time. 473 end 474 end 475 eval(['self.earth.' string '=field;']); %do not forget to plug the field variable into its final location 476 %}}} 477 elseif n==self.icecaps{1}.mesh.numberofelements, 359 478 eval(['self.earth.' string '=zeros(self.earth.mesh.numberofelements,1);']); 360 479 for i=1:length(self.icecaps), … … 389 508 self.earth=ic; 390 509 end % }}} 510 function self=initializemodels(self) % {{{ 511 512 for i=1:length(self.basins), 513 md=model(); 514 md.miscellaneous.name=self.basins{i}.name; 515 self.addicecap(md); 516 end 517 end % }}} 391 518 end 392 519 end
Note:
See TracChangeset
for help on using the changeset viewer.