source: altifloat/matlab_toolbox/make_filter.m @ 160

Last change on this file since 160 was 146, checked in by jbrlod, 9 years ago

correcting bug in interpolation

File size: 8.2 KB
Line 
1%clear all;
2%close all;
3function [Yao_CC,Yao_DD,Yao_mask,Yao_nu,Yao_nv]=make_filter(meshfile,maskfile,lfil,outdir)
4
5  if exist('outdir')
6    write_coefs=1;%if you want to write the filters coefs
7  end
8%outdir='../exp_forw_dan/';
9%------------GRID-------------------------------------------------------%
10%The grid in degrees
11%meshgrid2=load('../exp_forw_dan/meshgrid_dan.dat');
12%mask=load('../exp_forw_dan/mask_dan.dat');
13meshgrid2=load(meshfile);
14mask=load(maskfile);
15%for plotting
16
17Nlat=length(unique(meshgrid2(:,2))); %Phi
18Nlong=length(unique(meshgrid2(:,1))); %Lambda
19
20GR_long=reshape(meshgrid2(:,1),Nlong,Nlat); %will give a Nlong by Nlat matrix
21%containing the long of the points
22
23GR_lat=reshape(meshgrid2(:,2),Nlong,Nlat); %will give a Nlong by Nlat matrix
24%containing the lat of the points
25
26
27R_earth=6371229; %in meters
28delta_x=zeros(Nlong,Nlat);
29delta_y=zeros(Nlong,Nlat);
30
31for ilon=1:Nlong-1;
32    for jlat=1:Nlat-1;
33       
34    delta_x(ilon,jlat)=R_earth*(2*pi/360)*(GR_long(ilon+1,jlat)-GR_long(ilon,jlat))...
35        .*cos(2*pi*GR_lat(ilon,jlat)/360);
36    delta_y(ilon,jlat)=R_earth*(2*pi/360)*(GR_lat(ilon,jlat+1)-GR_lat(ilon,jlat)); 
37   
38   
39end
40end
41
42
43
44delta_x(Nlong,1:Nlat)=delta_x(Nlong-1,1:Nlat);
45delta_y(Nlong,1:Nlat)=delta_y(Nlong-1,1:Nlat);
46
47
48delta_x(1:Nlong,Nlat)=delta_x(1:Nlong,Nlat-1);
49delta_y(1:Nlong,Nlat)=delta_y(1:Nlong,Nlat-1);
50
51
52
53
54%---------------------FILTER--------------------------------------------%
55
56%%%%%%%%%%%Get filter coeff%%%%%%%%%
57
58
59%length of filter in m, you can change this to 25 000 or 15 000, etc..
60%WHEN you change this, 2 important numbers for the YAO code change, the
61%filter order and the filter's time step.
62if ~exist('lfil')
63lfil=20000;
64end
65
66
67mask2=reshape(mask,Nlong,Nlat);
68
69umask=zeros(Nlong,Nlat); vmask=umask;
70for i=1:Nlong-1
71    for j=1:Nlat-1
72        umask(i,j)=mask2(i,j).*mask2(i+1,j);
73        vmask(i,j)=mask2(i,j).*mask2(i,j+1);
74    end
75end
76
77[minx gg1]=min(min(delta_x));
78[miny gg2]=min(min(delta_y));
79itxmin=floor(2*lfil*lfil./minx.^2);
80itymin=floor(2*lfil*lfil./miny.^2);
81
82
83filter_order=ceil((max(itxmin,itymin)+1)./2)
84%THIS IS AN IMPORTANT NUMBER, when you change the filterlength it will
85%change. IN YAO, this variable is 
86%defval OFIL 4 //order of the filter
87%in the floater_delta.d file. SO just copy th evalue from here
88
89
90nbitfil=filter_order*2;%nb of filter passes
91%nb of filter passes
92
93
94dtfil=0.5*lfil*lfil./nbitfil %filter time step
95%%%%%%THIS NUMBER IS ALSO IMPORTANT AS IT GOES IN THE floater.h code in the
96%%%%%%variable YREAL dtfil=...; As you change the filter length it will
97%%%%%%change
98
99
100%%%%%%filter normalization coefs%%%%%%%%%%%%%%%%
101
102
103%%Version Leila :
104% fileu=umask./sqrt(delta_x.*delta_y);
105% filev=vmask./sqrt(delta_x.*delta_y);
106
107%%Test 29/07/2014
108fileu=1./sqrt(delta_x.*delta_y);
109filev=1./sqrt(delta_x.*delta_y);
110
111dx=delta_x;
112dy=delta_y;
113c1=zeros(Nlong,Nlat); c2=c1; c3=c1; c4=c1; c5=c1; c6=c1; c7=c1; c8=c1; c9=c1;
114%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
115%ucoefs
116for i=2:Nlong-1
117    for j=2:Nlat-1;
118c1(i,j) = -1/dx(i,j)^2-dy(i,j)/(dx(i,j)*dx(i+1,j)*dy(i+1,j))-mask2(i,j-1)*mask2(i,j)*mask2(i+1,j-1)*mask2(i+1,j)*dx(i,j)/(dy(i,j)*dx(i,j-1)*dy(i,j-1))-mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)/dy(i,j)^2;
119c2(i,j) = 1/(dx(i,j)*dx(i+1,j));
120c3(i,j) = mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)*dx(i,j+1)/(dy(i,j)^2*dx(i,j));
121c4(i,j) = mask2(i,j-1)*mask2(i,j)*mask2(i+1,j-1)*mask2(i+1,j)/(dy(i,j)*dy(i,j-1));
122c5(i,j) = dy(i-1,j)/(dx(i,j)^2*dy(i,j));
123c6(i,j) = -1/(dx(i,j)*dy(i,j))+mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)/(dx(i,j)*dy(i,j));
124c7(i,j) = mask2(i,j-1)*mask2(i,j)*mask2(i+1,j-1)*mask2(i+1,j)*dy(i+1,j-1)/(dy(i,j)*dx(i,j-1)*dy(i,j-1))-dx(i+1,j-1)/(dx(i,j)*dx(i+1,j)*dy(i+1,j));
125c8(i,j) = -mask2(i,j-1)*mask2(i,j)*mask2(i+1,j-1)*mask2(i+1,j)/(dy(i,j)*dx(i,j-1))+dx(i,j-1)/(dx(i,j)^2*dy(i,j));
126c9(i,j) = -mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)*dy(i+1,j)/(dy(i,j)^2*dx(i,j))+1/(dx(i,j)*dy(i+1,j));
127    end
128end
129c1=c1.*umask; c2=c2.*umask; c3=c3.*umask;
130c4=c4.*umask; c5=c5.*umask; c6=c6.*umask;
131c7=c7.*umask; c8=c8.*umask; c9=c9.*umask;
132
133
134
135
136
137
138
139%vcoefs
140d1=zeros(Nlong,Nlat); d2=d1; d3=d1; d4=d1; d5=d1; d6=d1; d7=d1; d8=d1; d9=d1;
141for i=2:Nlong-1
142    for j=2:Nlat-1;
143d1(i,j) = -mask2(i-1,j)*mask2(i-1,j+1)*mask2(i,j)*mask2(i,j+1)*dy(i,j)/(dx(i,j)*dx(i-1,j)*dy(i-1,j))-mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)/dx(i,j)^2-1/dy(i,j)^2-dx(i,j)/(dy(i,j)*dx(i,j+1)*dy(i,j+1));
144d2(i,j) = mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)*dy(i+1,j)/(dx(i,j)^2*dy(i,j));
145d3(i,j) = 1/(dy(i,j)*dy(i,j+1));
146d4(i,j) = dx(i,j-1)/(dy(i,j)^2*dx(i,j));
147d5(i,j) = mask2(i-1,j)*mask2(i-1,j+1)*mask2(i,j)*mask2(i,j+1)/(dx(i,j)*dx(i-1,j));
148d6(i,j) = -1/(dx(i,j)*dy(i,j))+mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)/(dx(i,j)*dy(i,j));
149d7(i,j) = -mask2(i,j)*mask2(i,j+1)*mask2(i+1,j)*mask2(i+1,j+1)*dx(i,j+1)/(dx(i,j)^2*dy(i,j))+1/(dy(i,j)*dx(i,j+1));
150d8(i,j) = dy(i-1,j)/(dy(i,j)^2*dx(i,j))-mask2(i-1,j)*mask2(i-1,j+1)*mask2(i,j)*mask2(i,j+1)/(dx(i,j)*dy(i-1,j));
151d9(i,j) = -dy(i-1,j+1)/(dy(i,j)*dx(i,j+1)*dy(i,j+1))+mask2(i-1,j)*mask2(i-1,j+1)*mask2(i,j)*mask2(i,j+1)*dx(i-1,j+1)/(dx(i,j)*dx(i-1,j)*dy(i-1,j));
152    end
153end
154
155
156d1=d1.*vmask; d2=d2.*vmask; d3=d3.*vmask;
157d4=d4.*vmask; d5=d5.*vmask; d6=d6.*vmask;
158d7=d7.*vmask; d8=d8.*vmask; d9=d9.*vmask;
159
160
161%save into yao format
162%get dt value and order of filter
163%put mask as ones in yao put a fake mask
164%load the fileu /v as the norm
165
166
167%%%%%%%%%%%%%%%%%SAVE THESE COEF INTO YAO FORMAT%%%%%%%%%%%%%%%%%%
168
169%1------------------PUT U in YAO format-------------------------------------%
170%1-CC
171c1_yao=reshape(c1.', Nlong*Nlat,1);
172c2_yao=reshape(c2.', Nlong*Nlat,1);
173c3_yao=reshape(c3.', Nlong*Nlat,1);
174c4_yao=reshape(c4.', Nlong*Nlat,1);
175c5_yao=reshape(c5.', Nlong*Nlat,1);
176c6_yao=reshape(c6.', Nlong*Nlat,1);
177c7_yao=reshape(c7.', Nlong*Nlat,1);
178c8_yao=reshape(c8.', Nlong*Nlat,1);
179c9_yao=reshape(c9.', Nlong*Nlat,1);
180
181%create the i j indices
182cd1=[]; for k=1:Nlong; cd1=[cd1; k*ones(Nlat,1)]; end
183cd2=repmat([1:1:Nlat].',Nlong,1);
184
185Yao_CC=[ ones(Nlong*Nlat,1)  cd1 cd2 c1_yao;...
186    2*ones(Nlong*Nlat,1)  cd1 cd2 c2_yao;...
187    3*ones(Nlong*Nlat,1)  cd1 cd2 c3_yao; ...
188    4*ones(Nlong*Nlat,1)  cd1 cd2 c4_yao;...
189    5*ones(Nlong*Nlat,1)  cd1 cd2 c5_yao;...
190    6*ones(Nlong*Nlat,1)  cd1 cd2 c6_yao;...
191    7*ones(Nlong*Nlat,1)  cd1 cd2 c7_yao;...
192    8*ones(Nlong*Nlat,1)  cd1 cd2 c8_yao;...
193    9*ones(Nlong*Nlat,1)  cd1 cd2 c9_yao;];
194   
195%2-DD
196d1_yao=reshape(d1.', Nlong*Nlat,1);
197d2_yao=reshape(d2.', Nlong*Nlat,1);
198d3_yao=reshape(d3.', Nlong*Nlat,1);
199d4_yao=reshape(d4.', Nlong*Nlat,1);
200d5_yao=reshape(d5.', Nlong*Nlat,1);
201d6_yao=reshape(d6.', Nlong*Nlat,1);
202d7_yao=reshape(d7.', Nlong*Nlat,1);
203d8_yao=reshape(d8.', Nlong*Nlat,1);
204d9_yao=reshape(d9.', Nlong*Nlat,1);
205
206
207
208Yao_DD=[ ones(Nlong*Nlat,1)  cd1 cd2 d1_yao;...
209    2*ones(Nlong*Nlat,1)  cd1 cd2 d2_yao;...
210    3*ones(Nlong*Nlat,1)  cd1 cd2 d3_yao; ...
211    4*ones(Nlong*Nlat,1)  cd1 cd2 d4_yao;...
212    5*ones(Nlong*Nlat,1)  cd1 cd2 d5_yao;...
213    6*ones(Nlong*Nlat,1)  cd1 cd2 d6_yao;...
214    7*ones(Nlong*Nlat,1)  cd1 cd2 d7_yao;...
215    8*ones(Nlong*Nlat,1)  cd1 cd2 d8_yao;...
216    9*ones(Nlong*Nlat,1)  cd1 cd2 d9_yao;];
217
218%3- Fake mask of ones, to remove from yao later!
219maskk=ones(Nlat,Nlong);
220mask_yao=reshape(maskk, Nlong*Nlat,1);
221Yao_mask=[ ones(Nlong*Nlat,1)  cd1 cd2 mask_yao];
222
223%4- The normalization after finishing the filter
224norm_u=fileu.';
225nu_yao=reshape(norm_u, Nlong*Nlat,1);
226Yao_nu=[ ones(Nlong*Nlat,1)  cd1 cd2 nu_yao];
227
228norm_v=filev.';
229nv_yao=reshape(norm_v, Nlong*Nlat,1);
230Yao_nv=[ ones(Nlong*Nlat,1)  cd1 cd2 nv_yao];
231
232%2-Save
233 
234 if (write_coefs==1)
235 
236dlmwrite([outdir 'CC.dat'],Yao_CC,'\t');
237dlmwrite([outdir 'DD.dat'],Yao_DD,'\t');
238dlmwrite([outdir 'Mask.dat'],Yao_mask,'\t');
239dlmwrite([outdir 'NU.dat'],Yao_nu,'\t');
240dlmwrite([outdir 'NV.dat'],Yao_nv,'\t');
241
242fid=fopen([outdir 'ref_fil.txt'],'w');
243fprintf(fid,'defval OFIL %d\n',filter_order);
244fprintf(fid,'YREAL dtfil=%g\n',dtfil);
245fclose(fid);
246
247 end;
248 
249%%%%%TO load these in YAO, you need to add these lines, in the ini file (if
250%there is a filter option_
251%loadstate cfil 0 ij 0 A 1 ../obs_float/CC.dat D
252%loadstate dfil 0 ij 0 A 1 ../obs_float/DD.dat D
253%loadstate mask 0 ij 0 A 1 ../obs_float/Mask.dat D
254%loadstate u_norm 0 ij 0 A 1 ../obs_float/NU.dat D
255%loadstate v_norm 0 ij 0 A 1 ../obs_float/NV.dat D
256
257
258
259
260
261
262
263
264
265
266
267
268
Note: See TracBrowser for help on using the repository browser.