Changeset 681
- Timestamp:
- 06/01/09 16:41:17 (16 years ago)
- Location:
- issm/trunk/src/m/classes/public
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/classes/public/ismodelselfconsistent.m
r632 r681 67 67 'tolx','np','eps_rel','exclusive','n','gridonbed','gridonsurface','elementonbed','elementonsurface','deltaH','DeltaH','timeacc','timedec'}; 68 68 for i=1:length(fields), 69 if ~isempty(eval(['md.' char(fields(i))])),70 if find(isnan(eval(['md.' char(fields(i))]))),71 disp(['model ' md.name ' has an NaN value in field ' char(fields(i))'!']);69 if ~isempty(eval(['md.' fields{i}])), 70 if any(isnan(eval(['md.' fields{i}]))), 71 disp(['model ' md.name ' has an NaN value in field ' fields{i} '!']); 72 72 bool=0; return; 73 73 end … … 80 80 'sparsity','lowmem','n','gridonbed','gridonsurface','elementonbed','elementonsurface','deltaH','DeltaH','timeacc','timedec'}; 81 81 for i=1:length(fields), 82 if ~isempty(eval(['md.' char(fields(i))])),83 if find((eval(['md.' char(fields(i))]))<0),84 disp(['model ' md.name ' has a <0 value in field ' char(fields(i))'!']);82 if ~isempty(eval(['md.' fields{i}])), 83 if any((eval(['md.' fields{i}]))<0), 84 disp(['model ' md.name ' has a <0 value in field ' fields{i} '!']); 85 85 bool=0; return; 86 86 end … … 97 97 'sparsity','deltaH','DeltaH','timeacc','timedec'}; 98 98 for i=1:length(fields), 99 if ~isempty(eval(['md.' char(fields(i))])),100 if find((eval(['md.' char(fields(i))]))==0),101 disp(['model ' md.name ' has a =0 value in field ' char(fields(i))'!']);99 if ~isempty(eval(['md.' fields{i}])), 100 if any((eval(['md.' fields{i}]))==0), 101 disp(['model ' md.name ' has a =0 value in field ' fields{i} '!']); 102 102 bool=0; return; 103 103 end … … 108 108 fields={'elements','p','q','elementoniceshelf','n','elementonbed'}; 109 109 for i=1:size(fields,2), 110 if (size(eval(['md.' char(fields(i))]),1)~=md.numberofelements),111 disp(['model ' md.name ' field ' char(fields(i))' should be of size ' num2str(md.numberofelements) '!']);110 if (size(eval(['md.' fields{i}]),1)~=md.numberofelements), 111 disp(['model ' md.name ' field ' fields{i} ' should be of size ' num2str(md.numberofelements) '!']); 112 112 bool=0; return; 113 113 end … … 117 117 fields={'x','y','z','B','drag','gridondirichlet_diag','melting','accumulation','surface','thickness','bed','gridonbed','gridonsurface'}; 118 118 for i=1:length(fields), 119 if find(length(eval(['md.' char(fields(i))]))~=md.numberofgrids),120 disp(['model ' md.name ' field ' char(fields(i))' should be of size ' num2str(md.numberofgrids) '!']);119 if length(eval(['md.' fields{i}]))~=md.numberofgrids, 120 disp(['model ' md.name ' field ' fields{i} ' should be of size ' num2str(md.numberofgrids) '!']); 121 121 bool=0; return; 122 122 end … … 124 124 125 125 %THICKNESS = SURFACE - BED 126 if find((md.thickness-md.surface+md.bed)>tolerance),126 if any((md.thickness-md.surface+md.bed)>tolerance), 127 127 disp(['model ' md.name ' violates the equality thickness=surface-bed!']); 128 128 bool=0; return; … … 179 179 180 180 %DIRICHLET IF THICKNESS <= 0 181 if ~isempty(find(md.thickness<=0)),181 if any(md.thickness<=0), 182 182 pos=find(md.thickness<=0); 183 183 if ~isempty(find(md.gridondirichlet_diag(pos)==0)), … … 249 249 fields={'dt','ndt'}; 250 250 for i=1:length(fields), 251 if find((eval(['md.' char(fields(i))]))<0),252 disp(['model ' md.name ' has a <0 value in field ' char(fields(i))'!']);251 if any((eval(['md.' fields{i}]))<0), 252 disp(['model ' md.name ' has a <0 value in field ' fields{i} '!']); 253 253 bool=0; return; 254 254 end … … 320 320 fields={'vx_obs','vy_obs'}; 321 321 for i=1:length(fields), 322 if find(length(eval(['md.' char(fields(i))]))~=md.numberofgrids),323 disp(['model ' md.name ' field ' char(fields(i))' should be of size ' num2str(md.numberofgrids) '!']);322 if any(length(eval(['md.' fields{i}]))~=md.numberofgrids), 323 disp(['model ' md.name ' field ' fields{i} ' should be of size ' num2str(md.numberofgrids) '!']); 324 324 bool=0; return; 325 325 end … … 362 362 fields={'sparsity'}; 363 363 for i=1:length(fields), 364 if ~isempty(eval(['md.' char(fields(i))])),365 if find(isnan(eval(['md.' char(fields(i))]))),366 disp(['model ' md.name ' has an NaN value in field ' char(fields(i))'!']);364 if ~isempty(eval(['md.' fields{i}])), 365 if any(isnan(eval(['md.' fields{i}]))), 366 disp(['model ' md.name ' has an NaN value in field ' fields{i} '!']); 367 367 bool=0; return; 368 368 end … … 373 373 fields={'sparsity'}; 374 374 for i=1:length(fields), 375 if ~isempty(eval(['md.' char(fields(i))])),376 if find((eval(['md.' char(fields(i))]))<0),377 disp(['model ' md.name ' has a <0 value in field ' char(fields(i))'!']);375 if ~isempty(eval(['md.' fields{i}])), 376 if any((eval(['md.' fields{i}]))<0), 377 disp(['model ' md.name ' has a <0 value in field ' fields{i} '!']); 378 378 bool=0; return; 379 379 end … … 384 384 fields={'sparsity'}; 385 385 for i=1:length(fields), 386 if ~isempty(eval(['md.' char(fields(i))])),387 if find((eval(['md.' char(fields(i))]))==0),388 disp(['model ' md.name ' has a =0 value in field ' char(fields(i))'!']);386 if ~isempty(eval(['md.' fields{i}])), 387 if any((eval(['md.' fields{i}]))==0), 388 disp(['model ' md.name ' has a =0 value in field ' fields{i} '!']); 389 389 bool=0; return; 390 390 end … … 435 435 fields={'time','np'}; 436 436 for i=1:length(fields), 437 if ~isempty(eval(['md.' char(fields(i))])),438 if find(isnan(eval(['md.' char(fields(i))]))),439 disp(['model ' md.name ' has an NaN value in field ' char(fields(i))'!']);437 if ~isempty(eval(['md.' fields{i}])), 438 if any(isnan(eval(['md.' fields{i}]))), 439 disp(['model ' md.name ' has an NaN value in field ' fields{i} '!']); 440 440 bool=0; return; 441 441 end … … 446 446 fields={'time','np'}; 447 447 for i=1:length(fields), 448 if ~isempty(eval(['md.' char(fields(i))])),449 if find((eval(['md.' char(fields(i))]))<0),450 disp(['model ' md.name ' has a <0 value in field ' char(fields(i))'!']);448 if ~isempty(eval(['md.' fields{i}])), 449 if any((eval(['md.' fields{i}]))<0), 450 disp(['model ' md.name ' has a <0 value in field ' fields{i} '!']); 451 451 bool=0; return; 452 452 end … … 457 457 fields={'time','np'}; 458 458 for i=1:length(fields), 459 if ~isempty(eval(['md.' char(fields(i))])),460 if find((eval(['md.' char(fields(i))]))==0),461 disp(['model ' md.name ' has a =0 value in field ' char(fields(i))'!']);459 if ~isempty(eval(['md.' fields{i}])), 460 if any((eval(['md.' fields{i}]))==0), 461 disp(['model ' md.name ' has a =0 value in field ' fields{i} '!']); 462 462 bool=0; return; 463 463 end -
issm/trunk/src/m/classes/public/isresultconsistent.m
r465 r681 1 function bool=isresultconsistent(md )1 function bool=isresultconsistent(md,solution) 2 2 %ISRESULTCONSISTENT: check that results are consistent 3 3 % … … 6 6 % 7 7 % Usage: 8 % bool=IsModelSelfConsistent(model )8 % bool=IsModelSelfConsistent(model,solution) 9 9 10 10 %tolerance we use in litmus tests for the consistency of the model 11 11 tolerance=10^-2; 12 12 13 if (nargin~=1 ) 14 IsResultConsistentUsage(); 13 %some checks 14 if (nargin~=2 | nargout~=1) 15 help isresultconsistent 15 16 error(' '); 16 17 end 17 %Check velocities i(no penalties for 2d meshes) 18 if strcmp(md.analysis_type,'diagnostic'), 19 20 if strcmpi(md.type,'3d'), 21 if ~isnan(md.penalties), 22 for i=1:size(md.penalties,1) 23 for n=2:size(md.penalties,2) 24 relativex=(md.vx(md.penalties(i,1))-md.vx(md.penalties(i,n)))./(md.vx(md.penalties(i,1))); 25 if md.vx(md.penalties(i,1))==md.vx(md.penalties(i,n)), relativex=0; end 26 relativey=(md.vy(md.penalties(i,1))-md.vy(md.penalties(i,n)))./(md.vy(md.penalties(i,1))); 27 if md.vy(md.penalties(i,1))==md.vy(md.penalties(i,n)), relativey=0; end 28 if abs(relativex)>tolerance | abs(relativey)>tolerance 29 disp(['''diagnostic'' result not consistent: increase penalty_offset (discontinuous horizontal velocity)']); 30 bool=0; return; 31 end 32 33 end 34 end 35 end 36 end 37 end 38 39 if strcmp(md.analysis_type,'thermal') 40 41 %check melting 42 if any(abs(md.melting(md.numberofgrids2d+1:end))>tolerance) 43 disp(['''thermal'' result not consistent: increase penalty_melting (negative melting)']); 18 19 %initialize output as 1 -> success 20 bool=1; 21 22 %DIAGNOSTIC 23 if strcmp(solution,'diagnostic'), 24 25 if strcmpi(md.type,'3d') 26 fields1={'results.diagnostic.vx','results.diagnostic.vy','results.diagnostic.vz','results.diagnostic.vel','results.diagnostic.pressure'}; 27 fields2={'results.diagnostic.vel','results.diagnostic.pressure'}; 28 else 29 fields1={'results.diagnostic.vx','results.diagnostic.vy','results.diagnostic.vel'}; 30 fields2={'results.diagnostic.vel'}; 31 end 32 33 %check size 34 if ~testsize(md,fields1,md.numberofgrids), 35 bool=0; return 36 end 37 38 %no NAN 39 if ~testnan(md,fields1), 40 bool=0; return 41 end 42 43 %check value is real 44 if ~testreal(md,fields1), 45 bool=0; return 46 end 47 48 %check value>=0 49 if ~testpositive(md,fields2), 50 bool=0; return 51 end 52 53 end 54 55 %CONTROL 56 if strcmp(solution,'control'), 57 58 fields1={'results.control.vx','results.control.vy','results.control.vel','results.control.parameter'}; 59 fields2={'results.control.vel','results.control.J'}; 60 61 %check size 62 if ~testsize(md,fields1,md.numberofgrids), 63 bool=0; return 64 end 65 66 %no NAN 67 if ~testnan(md,fields1), 68 bool=0; return 69 end 70 71 %check value is real 72 if ~testreal(md,fields1), 73 bool=0; return 74 end 75 76 %check value>=0 77 if ~testpositive(md,fields2), 78 bool=0; return 79 end 80 81 %check inversed parameter 82 if any(md.control.parameter<md.mincontrolconstraint | md.control.parameter>md.maxcontrolconstraint) 83 disp(['''control'' result not consistent: inverse parameter out of range [' md.mincontrolconstraint ' ' md.maxcontrolconstraint ']']); 44 84 bool=0; return; 45 85 end … … 47 87 end 48 88 49 if strcmp(md.analysis_type,'thermaltransient') 50 51 for iter=1:length(md.thermaltransient_results) 52 53 %check melting 54 if any(abs(md.thermaltransient_results(iter).melting(md.numberofgrids2d+1:end))>tolerance) 55 disp(['''thermaltransient'' result not consistent: increase penalty_melting (negative melting)']); 56 bool=0; return; 57 end 58 59 end 60 end 61 62 63 if (strcmp(md.analysis_type,'transient') & strcmpi(md.type,'3d')), 64 for iter=1:length(md.transient_results) 65 66 %check melting 67 if any(abs(md.transient_results(iter).melting(md.numberofgrids2d+1:end))>tolerance) 68 disp(['''thermaltransient'' result not consistent: increase penalty_melting (negative melting)']); 69 bool=0; return; 70 end 71 72 73 %check velocities 74 if ~isnan(md.penalties), 75 for i=1:size(md.penalties,1) 76 for n=2:size(md.penalties,2) 77 relativex=(md.transient_results(iter).vx(md.penalties(i,1))-md.transient_results(iter).vx(md.penalties(i,n)))./(md.transient_results(iter).vx(md.penalties(i,1))); 78 if md.transient_results(iter).vx(md.penalties(i,1))==md.transient_results(iter).vx(md.penalties(i,n)), relativex=0; end 79 relativey=(md.transient_results(iter).vy(md.penalties(i,1))-md.transient_results(iter).vy(md.penalties(i,n)))./(md.transient_results(iter).vy(md.penalties(i,1))); 80 if md.transient_results(iter).vy(md.penalties(i,1))==md.transient_results(iter).vy(md.penalties(i,n)), relativey=0; end 81 if abs(relativex)>tolerance | abs(relativey)>tolerance 82 disp(['''transient'' result not consistent: increase penalty_offset (discontinuous horizontal velocity)']); 83 bool=0; return; 84 end 85 86 end 87 end 88 end 89 90 end 91 92 end 93 94 95 %No problems, just return 1; 96 bool=1; 97 return; 98 99 function IsResultConsistentUsage() 100 disp(' '); 101 disp(' IsResultConsistent usage: flag=IsResultConsistent(model)'); 102 disp(' where model is an instance of the @model class, and flag a boolean'); 89 %THERMAL 90 if strcmp(solution,'thermal') 91 92 for iter=1:length(md.results.thermal) 93 94 fields1={['results.thermal(' num2str(iter) ').temperature'],['results.thermal(' num2str(iter) ').melting']}; 95 fields2={['results.thermal(' num2str(iter) ').temperature']}; 96 97 %check size 98 if ~testsize(md,fields1,md.numberofgrids), 99 bool=0; return 100 end 101 102 %no NAN 103 if ~testnan(md,fields1,md.numberofgrids), 104 bool=0; return 105 end 106 107 %check value is real 108 if ~testreal(md,fields1,md.numberofgrids), 109 bool=0; return 110 end 111 112 %check value>=0 113 if ~testpositive(md,fields2,md.numberofgrids), 114 bool=0; return 115 end 116 117 %check melting (<=0 via penalties) 118 if any(abs(md.results.thermal(iter).melting(md.numberofgrids2d+1:end))>tolerance) 119 disp(['''thermal'' result not consistent: increase penalty_melting (negative melting)']); 120 bool=0; return; 121 end 122 end 123 124 end 125 126 if strcmp(solution,'transient') 127 128 for iter=1:length(md.results.transient) 129 130 if strcmpi(md.type,'3d'), 131 fields1={['results.transient(' num2str(iter) ').vx'],['results.transient(' num2str(iter) ').vy'],... 132 ['results.transient(' num2str(iter) ').vz'],['results.transient(' num2str(iter) ').vel'],... 133 ['results.transient(' num2str(iter) ').bed'],['results.transient(' num2str(iter) ').surface'],... 134 ['results.transient(' num2str(iter) ').thickness'],... 135 ['results.transient(' num2str(iter) ').temperature'],['results.transient(' num2str(iter) ').melting']}; 136 fields2={['results.transient(' num2str(iter) ').vel'],['results.transient(' num2str(iter) ').thickness'],... 137 ['results.transient(' num2str(iter) ').temperature']}; 138 else 139 fields1={['results.transient(' num2str(iter) ').vx'],['results.transient(' num2str(iter) ').vy'],... 140 ['results.transient(' num2str(iter) ').vz'],['results.transient(' num2str(iter) ').vel'],... 141 ['results.transient(' num2str(iter) ').bed'],['results.transient(' num2str(iter) ').surface'],... 142 ['results.transient(' num2str(iter) ').thickness']}; 143 fields2={['results.transient(' num2str(iter) ').vel'],['results.transient(' num2str(iter) ').thickness']}; 144 end 145 146 %check size 147 if ~testsize(md,fields1,md.numberofgrids), 148 bool=0; return 149 end 150 151 %no NAN 152 if ~testnan(md,fields1,md.numberofgrids), 153 bool=0; return 154 end 155 156 %check value is real 157 if ~testreal(md,fields1,md.numberofgrids), 158 bool=0; return 159 end 160 161 %check value>=0 162 if ~testpositive(md,fields2,md.numberofgrids), 163 bool=0; return 164 end 165 166 %check melting (<=0 via penalties) 167 if any(abs(md.results.transient(iter).melting(md.numberofgrids2d+1:end))>tolerance) 168 disp(['''thermal'' result not consistent: increase penalty_melting (negative melting)']); 169 bool=0; return; 170 end 171 end 172 end 173 end % end function 174 175 function bool=testsize(md,fields,sizefield) 176 %TESTSIZE - test size of a field 177 bool=1; 178 for i=1:length(fields), 179 if length(eval(['md.' fields{i}]))~=sizefield 180 disp(['results not consistent: field ' fields{i} ' size should be ' num2str(md.numberofgrids)]); 181 bool=0; return; 182 end 183 end 184 end 185 186 function bool=testnan(md,fields,nanfield) 187 %TESTNAN - test nan values of a field 188 bool=1; 189 for i=1:length(fields), 190 if any(isnan(eval(['md.' fields{i}]))), 191 disp(['results not consistent: NaN values in field ' fields{i}]); 192 bool=0; return; 193 end 194 end 195 end 196 197 function bool=testreal(md,fields,realfield) 198 %TESTREAL - test real values of a field 199 bool=1; 200 for i=1:length(fields), 201 if any(eval(['~isreal(md.' fields{i} ')'])), 202 disp(['results not consistent: complex values in field ' fields{i}]); 203 bool=0; return; 204 end 205 end 206 end 207 208 function bool=testpositive(md,fields,positivefield) 209 %TESTPOSITIVE - test positive values of a field 210 bool=1; 211 for i=1:length(fields), 212 if any(eval(['md.' fields{i} '<0'])), 213 disp(['results not consistent: negative values in field ' fields{i}]); 214 bool=0; return; 215 end 216 end 217 end -
issm/trunk/src/m/classes/public/loadresultsfromdisk.m
r673 r681 16 16 %Check result is consistent 17 17 disp(sprintf('%s\n','checking result consistency')); 18 if ~isresultconsistent(md ),18 if ~isresultconsistent(md,md.analysis_type), 19 19 %it would be very cruel to put an error, it would kill the computed results (even if not consistent...) 20 20 disp('!! results not consistent correct the model !!') -
issm/trunk/src/m/classes/public/solve.m
r629 r681 82 82 %Check result is consistent 83 83 displaystring(md.debug,'%s\n','checking result consistency'); 84 if ~isresultconsistent(md ),84 if ~isresultconsistent(md,options.analysis_type), 85 85 disp('!! results not consistent correct the model !!') %it would be very cruel to put an error, it would kill the computed results (even if not consistent...) 86 86 end
Note:
See TracChangeset
for help on using the changeset viewer.