Changeset 5442


Ignore:
Timestamp:
08/20/10 09:05:55 (15 years ago)
Author:
Mathieu Morlighem
Message:

Better checks in ismodelselfconsistent (problem with matrices) and fixed edges extraction

Location:
issm/trunk/src/m/classes/public
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/classes/public/ismodelselfconsistent.m

    r5433 r5442  
    8484        fields={'edges'};
    8585        checksize(md,fields,[NaN 4]);
    86         checknan(md,fields);
     86        fields={'edges(:,1:3)'};
     87        checknan(md,fields);
     88        checkgreaterstrict(md,fields,0);
    8789end
    8890%}}}
     
    429431        %CHECKSIZE - check length of a field
    430432        for i=1:length(fields),
    431                 if length(eval(['md.' fields{i}]))~=fieldlength,
     433                eval(['field=md.' fields{i} ';']);
     434                if length(field)~=fieldlength,
    432435                        error(['model not consistent: field ' fields{i} ' length should be ' num2str(fieldlength)]);
    433436                end
     
    439442        %CHECKSIZE - check size of a field
    440443        for i=1:length(fields),
     444                eval(['field=md.' fields{i} ';']);
    441445                if isnan(fieldsize(1)),
    442                         if (size(eval(['md.' fields{i}]),2)~=fieldsize(2)),
    443                                 %LOG warnings:
    444                                 if strcmpi(fields{i},'pressureload'),
    445                                         disp(' ');
    446                                         disp('   If pressureload does not have the right size (one column missing), this is due to a change in md.pressure.');
    447                                         disp('      To update your model, use the following line');
    448                                         disp('      md.pressureload=[md.pressureload WaterEnum*md.elementoniceshelf(md.pressureload(:,end))+AirEnum*md.elementonicesheet(md.pressureload(:,end))];');
    449                                         disp(' ');
    450                                 end
     446                        if (size(field,2)~=fieldsize(2)),
    451447                                error(['model not consistent: field ' fields{i} ' should have ' num2str(fieldsize(2)) ' columns']);
    452448                        end
    453449                elseif isnan(fieldsize(2)),
    454                         if (size(eval(['md.' fields{i}]),1)~=fieldsize(1)),
     450                        if (size(field,1)~=fieldsize(1)),
    455451                                error(['model not consistent: field ' fields{i} ' should have ' num2str(fieldsize(1)) ' rows']);
    456452                        end
    457453                else
    458                         if ((size(eval(['md.' fields{i}]),1)~=fieldsize(1)) |  (size(eval(['md.' fields{i}]),2)~=fieldsize(2)))
    459                                 %LOG warnings:
    460                                 if strcmpi(fields{i},'weights'),
    461                                         disp(' ');
    462                                         disp('   ''weights'' is a new field that should be of length numberofgrids.');
    463                                         disp('      To update your model, use the following line');
    464                                         disp('      md.weights=ones(md.numberofgrids,1)');
    465                                         disp(' ');
    466                                 end
     454                        if ((size(field)~=fieldsize(1)) |  (size(field,2)~=fieldsize(2)))
    467455                                error(['model not consistent: field ' fields{i} ' size should be ' num2str(fieldsize(1)) ' x ' num2str(fieldsize(2))]);
    468456                        end
     
    475463        %CHECKNAN - check nan values of a field
    476464        for i=1:length(fields),
    477                 if any(isnan(eval(['md.' fields{i}]))),
    478                         error(['model not consistent: NaN values in field ' fields{i}]);
     465                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     466                if any(isnan(field)),
     467                        error(['model not consistent: NaN values found in field ' fields{i}]);
    479468                end
    480469        end
     
    485474        %CHECKREAL - check real values of a field
    486475        for i=1:length(fields),
    487                 if any(eval(['~isreal(md.' fields{i} ')'])),
    488                         error(['model not consistent: complex values in field ' fields{i}]);
     476                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     477                if any(~isreal(field)),
     478                        error(['model not consistent: complex values found in field ' fields{i}]);
    489479                end
    490480        end
     
    495485        %CHECKGREATERSTRICT - check values of a field
    496486        for i=1:length(fields),
    497                 if any(eval(['md.' fields{i} '<=' num2str(lowerbound) ])),
     487                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     488                if any(field<=lowerbound),
    498489                        error(['model not consistent: field ' fields{i} ' should have values stricly above ' num2str(lowerbound)]);
    499490                end
     
    505496        %CHECKGREATER - check values of a field
    506497        for i=1:length(fields),
    507                 if any(eval(['md.' fields{i} '<' num2str(lowerbound) ])),
     498                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     499                if any(field<lowerbound),
    508500                        error(['model not consistent: field ' fields{i} ' should have values above ' num2str(lowerbound)]);
    509501                end
     
    515507        %CHECKLESSSTRICT - check values of a field
    516508        for i=1:length(fields),
    517                 if any(eval(['md.' fields{i} '>=' num2str(upperbound) ])),
     509                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     510                if any(field>=upperbound),
    518511                        error(['model not consistent: field ' fields{i} ' should have values stricly below ' num2str(upperbound)]);
    519512                end
     
    525518        %CHECKLESS - check values of a field
    526519        for i=1:length(fields),
    527                 if any(eval(['md.' fields{i} '>' num2str(upperbound) ])),
     520                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     521                if any(field>upperbound),
    528522                        error(['model not consistent: field ' fields{i} ' should have values below ' num2str(upperbound)]);
    529523                end
     
    535529        %CHECKVALUE - check that a field has specified values
    536530        for i=1:length(fields),
    537                 if eval(['any(~ismember( md.' fields{i} ',values))']),
     531                eval(['field=reshape(md.' fields{i} ',[prod(size(md.' fields{i} ')) 1]);']);
     532                if any(~ismember(field,values)),
    538533                        error(['model not consistent: field ' fields{i} ' should have values in ' num2str(values)]);
    539534                end
  • issm/trunk/src/m/classes/public/modelextract.m

    r5433 r5442  
    148148        if size(md2.edges,2)>1, %do not use ~isnan because there are some NaNs...
    149149                %renumber first two columns
    150                 md2.edges(:,1)=Pgrid(md2.edges(:,1));
    151                 md2.edges(:,2)=Pgrid(md2.edges(:,2));
    152                 md2.edges(:,3)=Pelem(md2.edges(:,3));
    153                 %remove column where the first element is not in the domain
    154                 md2.edges=md2.edges(find(md2.edges(:,1) & md2.edges(:,2) & md2.edges(:,3)),:);
    155                 %now we must renumber the second column and put NaN if the element is not in the domain
    156                 A=md2.edges(:,4);
    157                 A(find(~isnan(A)))=Pelem(A(find(~isnan(A))));
    158                 A(find(A==0))=NaN;
    159                 md2.edges(:,4)=A; clear A;
    160         end
    161 
     150                pos=find(~isnan(md2.edges(:,4)));
     151                md2.edges(:  ,1)=Pgrid(md2.edges(:,1));
     152                md2.edges(:  ,2)=Pgrid(md2.edges(:,2));
     153                md2.edges(:  ,3)=Pelem(md2.edges(:,3));
     154                md2.edges(pos,4)=Pelem(md2.edges(pos,4));
     155                %remove edges when the 2 vertices are not in the domain.
     156                md2.edges=md2.edges(find(md2.edges(:,1) & md2.edges(:,2)),:);
     157                %Replace all zeros by NaN in the last two columns;
     158                pos=find(md2.edges(:,3)==0);
     159                md2.edges(pos,3)=NaN;
     160                pos=find(md2.edges(:,4)==0);
     161                md2.edges(pos,4)=NaN;
     162                %Invert NaN of the third column with last column
     163                pos=find(isnan(md2.edges(:,3)));
     164                md2.edges(pos,3)=md2.edges(pos,4);
     165                md2.edges(pos,4)=NaN;
     166                %Finally remove edges that do not belong to any element
     167                pos=find(isnan(md2.edges(:,3)) & isnan(md2.edges(:,4)));
     168                md2.edges(pos,:)=[];
     169        end
    162170
    163171        %Penalties
Note: See TracChangeset for help on using the changeset viewer.