1 | MODULE mod_bilin |
---|
2 | CONTAINS |
---|
3 | SUBROUTINE bilin ( pout, px, py, kndx, kndy, pax, pay, kpts |
---|
4 | $ , pin, ki, kj) |
---|
5 | C**** |
---|
6 | C ***************************** |
---|
7 | C * OASIS ROUTINE - LEVEL 3 * |
---|
8 | C * ------------- ------- * |
---|
9 | C ***************************** |
---|
10 | C |
---|
11 | C**** *bilin* - Bilinear interpolation |
---|
12 | C |
---|
13 | C Purpose: Proceed to a bilinear interpolation |
---|
14 | C ------- |
---|
15 | C |
---|
16 | C |
---|
17 | C** Interface: |
---|
18 | C --------- |
---|
19 | C *CALL* *bilin* ( zo, px, py, kndx, kndy, pax, pay, kpts |
---|
20 | C $ , z, ki, kj) |
---|
21 | C |
---|
22 | C** Method |
---|
23 | C ------ |
---|
24 | C |
---|
25 | C * * * * |
---|
26 | C |
---|
27 | C * * * * |
---|
28 | C # ==> pt (x,y) |
---|
29 | C * (=) * * ==> = pt (kndx, kndy) |
---|
30 | C |
---|
31 | C * * * * |
---|
32 | C |
---|
33 | C Input: |
---|
34 | C ----- |
---|
35 | C px : longitudes of target grid |
---|
36 | C py : latitudes of target grid |
---|
37 | C kndx : index of source point in source longitude |
---|
38 | C kndy : index of source point in source latitude |
---|
39 | C pax : longitudes of source grid |
---|
40 | C pay : latitudes of source grid |
---|
41 | C kpts : dimension of target grid |
---|
42 | C pin : input field on source grid |
---|
43 | C ki, kj : dimension of source grid |
---|
44 | C |
---|
45 | C Output: |
---|
46 | C ------ |
---|
47 | C pout : interpolated field on target grid |
---|
48 | C |
---|
49 | C Workspace: |
---|
50 | C --------- |
---|
51 | C Local variables |
---|
52 | C zy1, zy2, zy3, zy4, i, j, zdx, zdy ,z1, z2, z3, z4 |
---|
53 | C Statement function |
---|
54 | C cubic |
---|
55 | C |
---|
56 | C Externals: |
---|
57 | C --------- |
---|
58 | C None |
---|
59 | C |
---|
60 | C Reference: |
---|
61 | C --------- |
---|
62 | C See OASIS manual (1995) |
---|
63 | C |
---|
64 | C History: |
---|
65 | C ------- |
---|
66 | C Version Programmer Date Description |
---|
67 | C ------- ---------- ---- ----------- |
---|
68 | C 2.0 O. Marti 96/07/15 Created |
---|
69 | C |
---|
70 | C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
71 | C |
---|
72 | C * |
---|
73 | IMPLICIT NONE |
---|
74 | C |
---|
75 | C* ---------------------------- Argument declarations ------------------- |
---|
76 | C |
---|
77 | INTEGER, INTENT ( in) :: kpts, ki, kj |
---|
78 | REAL, DIMENSION ( kpts), INTENT ( in) :: px, py |
---|
79 | REAL, DIMENSION ( 0: ki + 1), INTENT ( in) :: pax |
---|
80 | REAL, DIMENSION ( 0: kj + 1), INTENT ( in) :: pay |
---|
81 | REAL, DIMENSION ( 0: ki + 1, 0: kj + 1), INTENT ( in) :: pin |
---|
82 | INTEGER, DIMENSION ( kpts), INTENT ( in) :: kndx, kndy |
---|
83 | REAL, DIMENSION ( kpts), INTENT ( out) :: pout |
---|
84 | C |
---|
85 | C* ---------------------------- Local declarations ---------------------- |
---|
86 | C |
---|
87 | REAL :: zy1, zy2 |
---|
88 | INTEGER :: jn, ji, jj |
---|
89 | C |
---|
90 | C* ---------------------------- Statement fucntions---------------------- |
---|
91 | C |
---|
92 | REAL :: zlinear, zdx, zdy , z1, z2 |
---|
93 | C |
---|
94 | zlinear ( z1, z2, zdx) = ( 1.0 - zdx) * z1 + zdx * z2 |
---|
95 | C |
---|
96 | C* ---------------------------- Poema verses ---------------------------- |
---|
97 | C |
---|
98 | C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
99 | C |
---|
100 | C* 1. Interpolation |
---|
101 | C ------------- |
---|
102 | C |
---|
103 | DO jn = 1, kpts |
---|
104 | ji = kndx ( jn) ; jj = kndy ( jn) |
---|
105 | zdx = ( px ( jn) - pax ( ji)) / ( pax ( ji + 1) - pax ( ji)) |
---|
106 | zdy = ( py ( jn) - pay ( jj)) / ( pay ( jj + 1) - pay ( jj)) |
---|
107 | zy1 = zlinear ( pin ( ji, jj ), pin ( ji+1, jj ), zdx) |
---|
108 | zy2 = zlinear ( pin ( ji, jj+1), pin ( ji+1, jj+1), zdx) |
---|
109 | pout ( jn) = zlinear ( zy1, zy2, zdy) |
---|
110 | END DO |
---|
111 | C |
---|
112 | C |
---|
113 | C* 3. End of routine |
---|
114 | C -------------- |
---|
115 | C |
---|
116 | RETURN |
---|
117 | END SUBROUTINE bilin |
---|
118 | END MODULE mod_bilin |
---|