1 |
gforget |
1.1 |
% |
2 |
|
|
%This function does a "near-bilinear interpolation". |
3 |
|
|
% |
4 |
|
|
%We have to work with distorted quadrilaterals rather than rectangles, but |
5 |
|
|
%we use the distance to the quadrilateral sides as in bilinear interpolation: |
6 |
|
|
%-> when the quadrilateral is a rectangle this actually is bilinear interpolation. |
7 |
|
|
%-> for convex quadrilaterals it is close. |
8 |
|
|
%-> for non-convex quadrilaterals !? |
9 |
|
|
% |
10 |
|
|
%Author: Gael Forget |
11 |
|
|
%Date: June 14th 2007 |
12 |
|
|
% |
13 |
|
|
function [coeffs]=netcdf_ecco_GenericgridCoeffs(x0,y0,x_all,y_all); |
14 |
|
|
|
15 |
|
|
warning off MATLAB:divideByZero; |
16 |
|
|
|
17 |
|
|
x=ones([length(x_all) size(x0)]); for icur=1:length(x_all); x(icur,:,:)=x0; end; |
18 |
|
|
y=ones([length(x_all) size(x0)]); for icur=1:length(x_all); y(icur,:,:)=y0; end; |
19 |
|
|
|
20 |
|
|
alpha=zeros(size(x)); beta=zeros(size(x)); gamma=zeros(size(x)); coeffs=zeros(size(x)); |
21 |
|
|
|
22 |
|
|
x_all2=zeros([length(x_all) size(x0,1) 1]); for icur=1:length(x_all); x_all2(icur,:,:)=x_all(icur); end; |
23 |
|
|
y_all2=zeros([length(y_all) size(x0,1) 1]); for icur=1:length(y_all); y_all2(icur,:,:)=y_all(icur); end; |
24 |
|
|
|
25 |
|
|
for icur=1:4; |
26 |
|
|
|
27 |
|
|
x=circshift(x,[0 0 1]); y=circshift(y,[0 0 1]); |
28 |
|
|
alpha=circshift(alpha,[0 0 1]); beta=circshift(beta,[0 0 1]); |
29 |
|
|
|
30 |
|
|
v1x=x_all2(:,:)-x(:,:,1); v1y=y_all2(:,:,1)-y(:,:,1); v2x=x(:,:,2)-x(:,:,1); v2y=y(:,:,2)-y(:,:,1); |
31 |
|
|
alpha(:,:,1)=(v1x.*v2x+v1y.*v2y)./(v2x.*v2x+v2y.*v2y); |
32 |
|
|
x_tmp=x(:,:,1)+alpha(:,:,1).*v2x; y_tmp=y(:,:,1)+alpha(:,:,1).*v2y; |
33 |
|
|
beta(:,:,1)=(x_all2(:,:,1)-x_tmp).^2+(y_all2(:,:,1)-y_tmp).^2; |
34 |
|
|
|
35 |
|
|
end |
36 |
|
|
|
37 |
|
|
%at this point: beta contains the distance to the four sides, and this |
38 |
|
|
%is all we are going to need |
39 |
|
|
|
40 |
|
|
for icur=1:4; |
41 |
|
|
beta=circshift(beta,[0 0 1]); coeffs=circshift(coeffs,[0 0 1]); |
42 |
|
|
coeffs(:,:,1)=beta(:,:,2).*beta(:,:,3); |
43 |
|
|
end |
44 |
|
|
coeffs=reshape(coeffs,[size(coeffs,1)*size(coeffs,2) size(coeffs,3)]); |
45 |
|
|
coeffs=coeffs./(sum(coeffs,2)*ones(1,4)); |
46 |
|
|
coeffs=reshape(coeffs,[size(alpha,1) size(alpha,2) size(alpha,3)]); |
47 |
|
|
|
48 |
|
|
warning on MATLAB:divideByZero; |
49 |
|
|
|