New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
obs_rot_vel.F90 in branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/OBS – NEMO

source: branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/OBS/obs_rot_vel.F90 @ 2287

Last change on this file since 2287 was 2287, checked in by smasson, 14 years ago

update licence of all NEMO files...

  • Property svn:keywords set to Id
File size: 8.5 KB
Line 
1MODULE obs_rot_vel
2   !!======================================================================
3   !!                       ***  MODULE obs_rot_vel  ***
4   !! Observation diagnostics: Read the velocity profile observations
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !!   obs_rotvel : Rotate velocity data into N-S,E-W directorions
9   !!----------------------------------------------------------------------
10   !! * Modules used   
11   USE par_kind                 ! Precision variables
12   USE par_oce                  ! Ocean parameters
13   USE in_out_manager           ! I/O manager
14   USE dom_oce                  ! Ocean space and time domain variables
15   USE obs_grid                 ! Grid search
16   USE obs_utils                ! For error handling
17   USE obs_profiles_def         ! Profile definitions
18   USE obs_inter_h2d            ! Horizontal interpolation
19   USE obs_inter_sup            ! MPP support routines for interpolation
20   USE geo2ocean                ! Rotation of vectors
21   USE obs_fbm                  ! Feedback definitions
22
23   IMPLICIT NONE
24
25   !! * Routine accessibility
26   PRIVATE
27
28   PUBLIC obs_rotvel            ! Rotate the observations
29
30   !!----------------------------------------------------------------------
31   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
32   !! $Id$
33   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
34   !!----------------------------------------------------------------------
35
36CONTAINS
37
38   SUBROUTINE obs_rotvel( profdata, k2dint, pu, pv )
39      !!---------------------------------------------------------------------
40      !!
41      !!                   *** ROUTINE obs_rea_pro_dri ***
42      !!
43      !! ** Purpose : Rotate velocity data into N-S,E-W directorions
44      !!
45      !! ** Method  : Interpolation of geo2ocean coefficients on U,V grid
46      !!              to observation point followed by a similar computations
47      !!              as in geo2ocean.
48      !!
49      !! ** Action  : Review if there is a better way to do this.
50      !!
51      !! References :
52      !!
53      !! History : 
54      !!      ! :  2009-02 (K. Mogensen) : New routine
55      !!----------------------------------------------------------------------
56      !! * Modules used
57   
58      !! * Arguments
59      TYPE(obs_prof), INTENT(INOUT) :: profdata    ! Profile data to be read
60      INTEGER, INTENT(IN) :: k2dint     ! Horizontal interpolation methed
61      REAL(wp), DIMENSION(*) :: &
62         & pu, &
63         & pv
64      !! * Local declarations
65      REAL(wp), DIMENSION(jpi,jpj) :: &
66         & zsingu, &
67         & zcosgu, &
68         & zsingv, &
69         & zcosgv
70      REAL(wp), DIMENSION(2,2,1) :: zweig
71      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: &
72         & zmasku, &
73         & zmaskv, &
74         & zcoslu, &
75         & zsinlu, &
76         & zcoslv, &
77         & zsinlv, &
78         & zglamu, &
79         & zgphiu, &
80         & zglamv, &
81         & zgphiv
82      REAL(wp), DIMENSION(1) :: &
83         & zsinu, &
84         & zcosu, &
85         & zsinv, &
86         & zcosv
87      REAL(wp) :: zsin
88      REAL(wp) :: zcos
89      REAL(wp), DIMENSION(1) :: zobsmask
90      INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: &
91         & igrdiu, &
92         & igrdju, &
93         & igrdiv, &
94         & igrdjv
95      INTEGER :: ji
96      INTEGER :: jk
97
98      !-----------------------------------------------------------------------
99      ! Allocate data for message parsing and interpolation
100      !-----------------------------------------------------------------------
101
102      ALLOCATE( &
103         & igrdiu(2,2,profdata%nprof), &
104         & igrdju(2,2,profdata%nprof), &
105         & zglamu(2,2,profdata%nprof), &
106         & zgphiu(2,2,profdata%nprof), &
107         & zmasku(2,2,profdata%nprof), &
108         & zcoslu(2,2,profdata%nprof), &
109         & zsinlu(2,2,profdata%nprof), &
110         & igrdiv(2,2,profdata%nprof), &
111         & igrdjv(2,2,profdata%nprof), &
112         & zglamv(2,2,profdata%nprof), &
113         & zgphiv(2,2,profdata%nprof), &
114         & zmaskv(2,2,profdata%nprof), &
115         & zcoslv(2,2,profdata%nprof), &
116         & zsinlv(2,2,profdata%nprof)  &
117         & )
118
119      !-----------------------------------------------------------------------
120      ! Receive the angles on the U and V grids.
121      !-----------------------------------------------------------------------
122
123      CALL obs_rot( zsingu, zcosgu, zsingv, zcosgv )
124
125      DO ji = 1, profdata%nprof
126         igrdiu(1,1,ji) = profdata%mi(ji,1)-1
127         igrdju(1,1,ji) = profdata%mj(ji,1)-1
128         igrdiu(1,2,ji) = profdata%mi(ji,1)-1
129         igrdju(1,2,ji) = profdata%mj(ji,1)
130         igrdiu(2,1,ji) = profdata%mi(ji,1)
131         igrdju(2,1,ji) = profdata%mj(ji,1)-1
132         igrdiu(2,2,ji) = profdata%mi(ji,1)
133         igrdju(2,2,ji) = profdata%mj(ji,1)
134         igrdiv(1,1,ji) = profdata%mi(ji,2)-1
135         igrdjv(1,1,ji) = profdata%mj(ji,2)-1
136         igrdiv(1,2,ji) = profdata%mi(ji,2)-1
137         igrdjv(1,2,ji) = profdata%mj(ji,2)
138         igrdiv(2,1,ji) = profdata%mi(ji,2)
139         igrdjv(2,1,ji) = profdata%mj(ji,2)-1
140         igrdiv(2,2,ji) = profdata%mi(ji,2)
141         igrdjv(2,2,ji) = profdata%mj(ji,2)
142      END DO
143
144      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiu, igrdju, &
145         &                  glamu, zglamu )
146      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiu, igrdju, &
147         &                  gphiu, zgphiu )
148      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiu, igrdju, &
149         &                  umask(:,:,1), zmasku )
150      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiu, igrdju, &
151         &                  zsingu, zsinlu )
152      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiu, igrdju, &
153         &                  zcosgu, zcoslu )
154      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiv, igrdjv, &
155         &                  glamv, zglamv )
156      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiv, igrdjv, &
157         &                  gphiv, zgphiv )
158      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiv, igrdjv, &
159         &                  vmask(:,:,1), zmaskv )
160      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiv, igrdjv, &
161         &                  zsingv, zsinlv )
162      CALL obs_int_comm_2d( 2, 2, profdata%nprof, igrdiv, igrdjv, &
163         &                  zcosgv, zcoslv )
164
165      DO ji = 1, profdata%nprof
166           
167         CALL obs_int_h2d_init( 1, 1, k2dint, &
168            &                   profdata%rlam(ji), profdata%rphi(ji), &
169            &                   zglamu(:,:,ji), zgphiu(:,:,ji), &
170            &                   zmasku(:,:,ji), zweig, zobsmask )
171         
172         CALL obs_int_h2d( 1, 1, zweig, zsinlu(:,:,ji),  zsinu )
173
174         CALL obs_int_h2d( 1, 1, zweig, zcoslu(:,:,ji),  zcosu )
175
176         CALL obs_int_h2d_init( 1, 1, k2dint, &
177            &                   profdata%rlam(ji), profdata%rphi(ji), &
178            &                   zglamv(:,:,ji), zgphiv(:,:,ji), &
179            &                   zmaskv(:,:,ji), zweig, zobsmask )
180         
181         CALL obs_int_h2d( 1, 1, zweig, zsinlv(:,:,ji),  zsinv )
182
183         CALL obs_int_h2d( 1, 1, zweig, zcoslv(:,:,ji),  zcosv )
184
185         ! Assume that the angle at observation point is the
186         ! mean of u and v cosines/sines
187
188         zcos = 0.5_wp * ( zcosu(1) + zcosv(1) )
189         zsin = 0.5_wp * ( zsinu(1) + zsinv(1) )
190         
191         IF ( ( profdata%npvsta(ji,1) /= profdata%npvsta(ji,2) ) .OR. &
192            & ( profdata%npvend(ji,1) /= profdata%npvend(ji,2) ) ) THEN
193            CALL fatal_error( 'Different number of U and V observations '// &
194               'in a profile in obs_rotvel', __LINE__ )
195         ENDIF
196
197         DO jk = profdata%npvsta(ji,1), profdata%npvend(ji,1)
198            IF ( ( profdata%var(1)%vmod(jk) /= fbrmdi ) .AND. &
199               & ( profdata%var(1)%vmod(jk) /= fbrmdi ) ) THEN
200               pu(jk) = profdata%var(1)%vmod(jk) * zcos - &
201                  &     profdata%var(2)%vmod(jk) * zsin
202               pv(jk) = profdata%var(2)%vmod(jk) * zcos + &
203                  &     profdata%var(1)%vmod(jk) * zsin
204            ELSE
205               pu(jk) = fbrmdi
206               pv(jk) = fbrmdi
207            ENDIF
208         END DO
209
210      END DO
211     
212      DEALLOCATE( &
213         & igrdiu, &
214         & igrdju, &
215         & zglamu, &
216         & zgphiu, &
217         & zmasku, &
218         & zcoslu, &
219         & zsinlu, &
220         & igrdiv, &
221         & igrdjv, &
222         & zglamv, &
223         & zgphiv, &
224         & zmaskv, &
225         & zcoslv, &
226         & zsinlv  &
227         & )
228
229   END SUBROUTINE obs_rotvel
230
231END MODULE obs_rot_vel
Note: See TracBrowser for help on using the repository browser.