source: CPL/oasis3/trunk/src/mod/oasis3/src/mod_bicub.f @ 1677

Last change on this file since 1677 was 1677, checked in by aclsce, 12 years ago

Imported oasis3 (tag ipslcm5a) from cvs server to svn server (igcmg project).

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