Ignore:
Timestamp:
12/08/20 08:45:53 (4 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 25834

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/m/classes/sealevelmodel.m

    r24313 r25836  
    1212        properties (SetAccess=public) %Model fields
    1313                % {{{
    14                 icecaps          = {}; % list of ice cap models
     14                icecaps          = {}; % list of land/ice models, name should  be change longer term.
    1515                earth            = 0;  % model for the whole earth
    1616                basins           = {}; % list  of basins, matching icecaps, where shapefile info is held.
     
    1919                settings         = 0;
    2020                private          = 0;
    21                 range            = 0;
    2221                mergedcaps       = 0;
    2322                transitions      = {};
    24                 eltransitions      = {};
     23                eltransitions    = {};
     24                planet           = '';
    2525                %}}}
    2626        end
    2727        methods
    2828                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
    3735                                %recover all the icecap models:
    3836                                slm.icecaps=getfieldvalues(options,'ice_cap',{});
    3937                               
    4038                                %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
    4244                        end
    4345                end
     
    8991                        slm.private           = private();
    9092                        slm.cluster           = generic();
    91                         slm.range             = {};
    9293                        slm.transitions       = {};
    93                         slm.eltransitions       = {};
     94                        slm.eltransitions     = {};
     95                        slm.planet            = 'earth';
    9496                end
    9597                %}}}
     
    100102                        disp(sprintf('%19s: %-22s -- %s','cluster'         ,['[1x1 ' class(self.cluster) ']'],'cluster parameters (number of cpus...)'));
    101103                        disp(sprintf('%19s: %-22s -- %s','miscellaneous'   ,['[1x1 ' class(self.miscellaneous) ']'],'miscellaneous fields'));
    102                         disp(sprintf('%19s: %-22s -- %s','range'   ,['[1x1 ' class(self.range) ']'],'ranges'));
    103104                end % }}}
    104105                function self=mergeresults(self) % {{{
    105                         champs=fields(self.icecaps{1}.results.TransientSolution);
     106                        champs=fieldnames(self.icecaps{1}.results.TransientSolution);
    106107                        for i=1:length(self.mergedcaps)/2,
    107108                                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});
    109110                                for j=1:length(self.icecaps{1}.results.TransientSolution),
    110111                                        for k=1:length(champs),
     
    143144                        end
    144145                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 % }}}
    145165                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
    150197                end % }}}
    151198                function intersections(self,varargin) % {{{
    152199
    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);
    171215               
    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
    177227                end % }}}
    178228                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
    184240
    185241                end % }}}
     
    192248                        if iscell(continent),
    193249                                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
    202260                                else
    203                                         %nothing to do, we have a list of continents
     261                                        %nothing to do: assume we have a list of continents
    204262                                end
    205263                        else
     
    208266                                        continent={};
    209267                                        for i=1:length(self.basins),
    210                                                  continent{end+1}=self.basins{i}.continent;
     268                                                continent{end+1}=self.basins{i}.continent;
    211269                                        end
    212270                                        continent=unique(continent);
     
    219277                        if iscell(bas),
    220278                                if length(bas)==1,
    221                                          if strcmpi(bas{1},'all'),
    222                                                  %need to transform this into a list of basins:
    223                                                  baslist=[];
    224                                                  for i=1:length(self.basins),
    225                                                          if self.basins{i}.iscontinentany(continent{:}),
    226                                                                  baslist(end+1)=i;
    227                                                          end
    228                                                  end
    229                                                  baslist=unique(baslist);
    230                                          else
    231                                                  bas=bas{1};
    232                                                  baslist=[];
    233                                                  for i=1:length(self.basins),
    234                                                          if self.basins{i}.iscontinentany(continent{:}),
    235                                                                  if self.basins{i}.isnameany(bas),
    236                                                                          baslist(end+1)=i;
    237                                                                  end
    238                                                          end
    239                                                  end
    240 
    241                                          end
     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
    242300                                else
    243301                                        %we have a list of basin names:
     
    280338                end % }}}
    281339                function addicecap(self,md) % {{{
    282                 if ~strcmpi(class(md),'model')
    283                         error('addicecap method only takes a ''model'' class object as input');
    284                 end
    285                 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;
    286344                end % }}}
    287345                function basinsplot3d(self,varargin) % {{{
    288                 for i=1:length(self.basins),
    289                         self.basins{i}.plot3d(varargin{:});
    290                 end
     346                        for i=1:length(self.basins),
     347                                self.basins{i}.plot3d(varargin{:});
     348                        end
    291349                end % }}}
    292350                function caticecaps(self,varargin) % {{{
     
    300358                        models=self.icecaps;
    301359                        for i=1:length(models),
    302                                 models{i}=TwoDToThreeD(models{i});
     360                                models{i}=TwoDToThreeD(models{i},self.planet);
    303361                        end
    304362                       
     
    326384                        self.earth=md;
    327385
     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
    328418                end % }}}
    329419                function viscousiterations(self) % {{{
    330420                        for  i=1:length(self.icecaps),
    331                                 ic=self.icecaps{i}; 
     421                                ic=self.icecaps{i};
    332422                                mvi=ic.results.TransientSolution(1).StressbalanceConvergenceNumSteps;
    333423                                for j=2:length(ic.results.TransientSolution)-1,
     
    339429                function maxtimestep(self) % {{{
    340430                        for  i=1:length(self.icecaps),
    341                                 ic=self.icecaps{i}; 
     431                                ic=self.icecaps{i};
    342432                                mvi=length(ic.results.TransientSolution);
    343433                                timei=ic.results.TransientSolution(end).time;
     
    350440                function transfer(self,string) % {{{
    351441                        %Recover field size in one icecap:
    352                         eval(['n=length(self.icecaps{1}.' string ');']);
     442                        eval(['n=size(self.icecaps{1}.' string ',1);']);
    353443                        if n==self.icecaps{1}.mesh.numberofvertices,
    354444                                eval(['self.earth.' string '=zeros(self.earth.mesh.numberofvertices,1);']);
     
    356446                                        eval(['self.earth.' string '(self.transitions{' num2str(i) '})=self.icecaps{' num2str(i) '}.' string ';']);
    357447                                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,
    359478                                eval(['self.earth.' string '=zeros(self.earth.mesh.numberofelements,1);']);
    360479                                for i=1:length(self.icecaps),
     
    389508                        self.earth=ic;
    390509                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 % }}}
    391518        end
    392519end
Note: See TracChangeset for help on using the changeset viewer.