computing surface air density from surface diagnostic variables in balbi_atm.m
[wrf-fire-matlab.git] / netcdf / ncdiff.m
blob6bf8fd7aa186618a7c55a66cfb11d50c61b254b2
1 function [relerr,ssq,p,name]=ncdiff(file1,file2,var)
2 % [relerr,ssq,p,name]=ncdiff(file1,file2,var)
3 % compare variable var in 2 netcdf files
4 % if var is missing, compare all variables
5 % return structure s with fiels:
6 % relerr = max relative difference
7 % ssq = square mean relative difference
8 % p = p-value, close to +1 -1 means errors significantly in one direction
9 % for rounding errors expect relerr=const*eps, p small
10 % name = variable name
11 if ~exist('var','var'),
12     v=ncdump(file1,'-q');
13     for i=1:length(v),
14         var=v(i).varname;
15         try
16             [relerr(i),ssq(i),p(i),name{i}]=ncdiff(file1,file2,var);
17         catch exc
18              disp(exc)
19              relerr(i)=inf;
20              p(i)=1;
21         end
22     end
23     disp('Finished comparing files')
24     disp(file1)
25     disp(file2)
26     for i=1:length(p),
27        fprintf('%s relative diff %g p-value %g\n',name{i},relerr(i),p(i))
28     end
29     return
30 end
31 v1=ncread(file1,var);
32 v2=ncread(file2,var);
33 s1=size(v1);
34 s2=size(v2);
35 if length(s1) ~=  length(s2),
36     error([var,' must be same numer of dimensions 1: ',num2str(s1),' 2: ',num2str(s2)]) 
37 end 
38 if any(s1 ~= s2)
39     warning(['using minimum size of 1:', num2str(s1),' 2: ',num2str(s2)])
40     s=ones(1,4);
41     s(1:length(s1))=min(s1,s2);
42     v1=v1(1:s(1),1:s(2),1:s(3),1:s(4));
43     v2=v2(1:s(1),1:s(2),1:s(3),1:s(4));
44     s1=size(v1);
45     s2=size(v2);
46 end
47 [relerr,ssq,p]=ncdiffvars('total',v1,v2);
48 if relerr>0,
49     for i=1:s1(end)    
50         s=['slice ',num2str(i)];
51         switch length(s1)
52             case 4
53                 ncdiffvars(s,v1(:,:,:,i),v2(:,:,:,i));
54             case 3
55                 ncdiffvars(s,v1(:,:,i),v2(:,:,i));
56         end
57     end
58 end
59 name=var;
60 end