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.
agrif_opa_update.F90 in branches/2017/dev_r8624_AGRIF3_VVL/NEMOGCM/NEMO/NST_SRC – NEMO

source: branches/2017/dev_r8624_AGRIF3_VVL/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90 @ 8762

Last change on this file since 8762 was 8762, checked in by jchanut, 5 years ago

AGRIF + vvl: Final changes, update SETTE tests (these are ok except SAS) - #1965

  • Property svn:keywords set to Id
File size: 35.8 KB
Line 
1#define TWO_WAY        /* TWO WAY NESTING */
2#undef DECAL_FEEDBACK /* SEPARATION of INTERFACES*/
3 
4MODULE agrif_opa_update
5#if defined key_agrif 
6   USE par_oce
7   USE oce
8   USE dom_oce
9   USE agrif_oce
10   USE in_out_manager  ! I/O manager
11   USE lib_mpp
12   USE wrk_nemo 
13   USE zdf_oce        ! vertical physics: ocean variables
14   USE domvvl         ! Need interpolation routines
15
16   IMPLICIT NONE
17   PRIVATE
18
19   PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn, Update_Scales, Agrif_Update_vvl
20
21# if defined key_zdftke
22   PUBLIC Agrif_Update_Tke
23# endif
24   !!----------------------------------------------------------------------
25   !! NEMO/NST 3.6 , NEMO Consortium (2010)
26   !! $Id$
27   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
28   !!----------------------------------------------------------------------
29CONTAINS
30
31   SUBROUTINE Agrif_Update_Tra( )
32      !!---------------------------------------------
33      !!   *** ROUTINE Agrif_Update_Tra ***
34      !!---------------------------------------------
35      !
36      IF (Agrif_Root()) RETURN
37      !
38#if defined TWO_WAY 
39      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers  from grid Number',Agrif_Fixed(), 'nbcline', nbcline
40
41      Agrif_UseSpecialValueInUpdate = .TRUE.
42      Agrif_SpecialValueFineGrid = 0.
43      !
44      IF (MOD(nbcline,nbclineupdate) == 0) THEN
45# if ! defined DECAL_FEEDBACK
46         CALL Agrif_Update_Variable(tsn_id, procname=updateTS)
47# else
48         CALL Agrif_Update_Variable(tsn_id, locupdate=(/1,0/),procname=updateTS)
49# endif
50      ELSE
51# if ! defined DECAL_FEEDBACK
52         CALL Agrif_Update_Variable(tsn_id,locupdate=(/0,2/), procname=updateTS)
53# else
54         CALL Agrif_Update_Variable(tsn_id,locupdate=(/1,2/), procname=updateTS)
55# endif
56      ENDIF
57      !
58      Agrif_UseSpecialValueInUpdate = .FALSE.
59      !
60#endif
61      !
62   END SUBROUTINE Agrif_Update_Tra
63
64   SUBROUTINE Agrif_Update_Dyn( )
65      !!---------------------------------------------
66      !!   *** ROUTINE Agrif_Update_Dyn ***
67      !!---------------------------------------------
68      !
69      IF (Agrif_Root()) RETURN
70      !
71#if defined TWO_WAY
72      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed(), 'nbcline', nbcline
73
74      Agrif_UseSpecialValueInUpdate = .FALSE.
75      Agrif_SpecialValueFineGrid = 0.
76      !     
77      IF (mod(nbcline,nbclineupdate) == 0) THEN
78# if ! defined DECAL_FEEDBACK
79         CALL Agrif_Update_Variable(un_update_id,procname = updateU)
80         CALL Agrif_Update_Variable(vn_update_id,procname = updateV)
81# else
82         CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU)
83         CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV)
84# endif
85      ELSE
86# if ! defined DECAL_FEEDBACK
87         CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU)
88         CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV)         
89# else
90         CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU)
91         CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV)
92# endif
93      ENDIF
94
95# if ! defined DECAL_FEEDBACK
96      CALL Agrif_Update_Variable(e1u_id,procname = updateU2d)
97      CALL Agrif_Update_Variable(e2v_id,procname = updateV2d) 
98# else
99      CALL Agrif_Update_Variable(e1u_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU2d)
100      CALL Agrif_Update_Variable(e2v_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV2d) 
101# endif
102
103      IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN
104         ! Update time integrated transports
105         IF (mod(nbcline,nbclineupdate) == 0) THEN
106#  if ! defined DECAL_FEEDBACK
107            CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b)
108            CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b)
109#  else
110            CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateub2b)
111            CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updatevb2b)
112#  endif
113         ELSE
114#  if ! defined DECAL_FEEDBACK
115            CALL Agrif_Update_Variable(ub2b_update_id,locupdate=(/0,1/),procname = updateub2b)
116            CALL Agrif_Update_Variable(vb2b_update_id,locupdate=(/0,1/),procname = updatevb2b)
117#  else
118            CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateub2b)
119            CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updatevb2b)
120#  endif
121         ENDIF
122      END IF
123      !
124      nbcline = nbcline + 1
125      !
126      Agrif_UseSpecialValueInUpdate = .TRUE.
127      Agrif_SpecialValueFineGrid = 0.
128# if ! defined DECAL_FEEDBACK
129      CALL Agrif_Update_Variable(sshn_id,procname = updateSSH)
130# else
131      CALL Agrif_Update_Variable(sshn_id,locupdate=(/1,0/),procname = updateSSH)
132# endif
133      Agrif_UseSpecialValueInUpdate = .FALSE.
134      !
135#endif
136      !
137   END SUBROUTINE Agrif_Update_Dyn
138
139# if defined key_zdftke
140
141   SUBROUTINE Agrif_Update_Tke( kt )
142      !!---------------------------------------------
143      !!   *** ROUTINE Agrif_Update_Tke ***
144      !!---------------------------------------------
145      !!
146      INTEGER, INTENT(in) :: kt 
147      !
148      IF (Agrif_Root()) RETURN
149      !       
150      IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN
151#  if defined TWO_WAY
152
153      Agrif_UseSpecialValueInUpdate = .TRUE.
154      Agrif_SpecialValueFineGrid = 0.
155
156      CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN  )
157      CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT )
158      CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM )
159
160      Agrif_UseSpecialValueInUpdate = .FALSE.
161
162#  endif
163     
164   END SUBROUTINE Agrif_Update_Tke
165   
166# endif /* key_zdftke */
167
168   SUBROUTINE Agrif_Update_vvl( )
169      !!---------------------------------------------
170      !!   *** ROUTINE Agrif_Update_vvl ***
171      !!---------------------------------------------
172      !
173      IF (Agrif_Root()) RETURN
174      !
175#if defined TWO_WAY 
176      !
177      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update e3 from grid Number',Agrif_Fixed(), 'Step', Agrif_Nb_Step()
178      !
179      Agrif_UseSpecialValueInUpdate = .TRUE.
180      Agrif_SpecialValueFineGrid = 0.
181      !
182# if ! defined DECAL_FEEDBACK
183      CALL Agrif_Update_Variable(e3t_id, procname=updatee3t)
184# else
185      CALL Agrif_Update_Variable(e3t_id, locupdate=(/1,0/), procname=updatee3t)
186# endif 
187      !
188      Agrif_UseSpecialValueInUpdate = .FALSE.
189      !
190      CALL Agrif_ChildGrid_To_ParentGrid()
191      CALL dom_vvl_update_UVF
192      CALL Agrif_ParentGrid_To_ChildGrid()
193      !
194#endif
195      !
196   END SUBROUTINE Agrif_Update_vvl
197
198   SUBROUTINE dom_vvl_update_UVF
199      !!---------------------------------------------
200      !!       *** ROUTINE dom_vvl_update_UVF ***
201      !!---------------------------------------------
202      !!
203      INTEGER :: jk
204      REAL(wp):: zcoef
205      !!---------------------------------------------
206
207      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Finalize e3 on grid Number', &
208                  & Agrif_Fixed(), 'Step', Agrif_Nb_Step()
209
210      ! Save "old" scale factor (prior update) for subsequent asselin correction
211      ! of prognostic variables (needed to update initial state only)
212      ! -------------------------------------------------------------
213      !
214      e3u_a(:,:,:) = e3u_n(:,:,:)
215      e3v_a(:,:,:) = e3v_n(:,:,:)
216!      ua(:,:,:) = e3u_b(:,:,:)
217!      va(:,:,:) = e3v_b(:,:,:)
218      hu_a(:,:) = hu_n(:,:)
219      hv_a(:,:) = hv_n(:,:)
220
221      ! 1) NOW fields
222      !--------------
223     
224         ! Vertical scale factor interpolations
225         ! ------------------------------------
226      CALL dom_vvl_interpol( e3t_n(:,:,:), e3u_n(:,:,:) ,  'U' )
227      CALL dom_vvl_interpol( e3t_n(:,:,:), e3v_n(:,:,:) ,  'V' )
228      CALL dom_vvl_interpol( e3u_n(:,:,:), e3f_n(:,:,:) ,  'F' )
229
230      CALL dom_vvl_interpol( e3u_n(:,:,:), e3uw_n(:,:,:), 'UW' )
231      CALL dom_vvl_interpol( e3v_n(:,:,:), e3vw_n(:,:,:), 'VW' )
232
233         ! Update total depths:
234         ! --------------------
235      hu_n(:,:) = 0._wp                        ! Ocean depth at U-points
236      hv_n(:,:) = 0._wp                        ! Ocean depth at V-points
237      DO jk = 1, jpkm1
238         hu_n(:,:) = hu_n(:,:) + e3u_n(:,:,jk) * umask(:,:,jk)
239         hv_n(:,:) = hv_n(:,:) + e3v_n(:,:,jk) * vmask(:,:,jk)
240      END DO
241      !                                        ! Inverse of the local depth
242      r1_hu_n(:,:) = ssumask(:,:) / ( hu_n(:,:) + 1._wp - ssumask(:,:) )
243      r1_hv_n(:,:) = ssvmask(:,:) / ( hv_n(:,:) + 1._wp - ssvmask(:,:) )
244
245
246      ! 2) BEFORE fields:
247      !------------------
248      IF (     (.NOT.(lk_agrif_fstep.AND.(neuler==0)).AND.(ln_dynspg_exp)) &
249         & .OR.(.NOT.(lk_agrif_fstep.AND.(neuler==0)).AND.(ln_dynspg_ts    &
250         & .AND.(.NOT.ln_bt_fw)))) THEN
251         !
252         ! Vertical scale factor interpolations
253         ! ------------------------------------
254         CALL dom_vvl_interpol( e3t_b(:,:,:), e3u_b(:,:,:),  'U'  )
255         CALL dom_vvl_interpol( e3t_b(:,:,:), e3v_b(:,:,:),  'V'  )
256
257         CALL dom_vvl_interpol( e3u_b(:,:,:), e3uw_b(:,:,:), 'UW' )
258         CALL dom_vvl_interpol( e3v_b(:,:,:), e3vw_b(:,:,:), 'VW' )
259
260         ! Update total depths:
261         ! --------------------
262         hu_b(:,:) = 0._wp                     ! Ocean depth at U-points
263         hv_b(:,:) = 0._wp                     ! Ocean depth at V-points
264         DO jk = 1, jpkm1
265            hu_b(:,:) = hu_b(:,:) + e3u_b(:,:,jk) * umask(:,:,jk)
266            hv_b(:,:) = hv_b(:,:) + e3v_b(:,:,jk) * vmask(:,:,jk)
267         END DO
268         !                                     ! Inverse of the local depth
269         r1_hu_b(:,:) = ssumask(:,:) / ( hu_b(:,:) + 1._wp - ssumask(:,:) )
270         r1_hv_b(:,:) = ssvmask(:,:) / ( hv_b(:,:) + 1._wp - ssvmask(:,:) )
271      ENDIF
272      !
273   END SUBROUTINE dom_vvl_update_UVF
274
275   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before )
276      !!---------------------------------------------
277      !!           *** ROUTINE updateT ***
278      !!---------------------------------------------
279      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
280      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
281      LOGICAL, INTENT(in) :: before
282      !!
283      INTEGER :: ji,jj,jk,jn
284      REAL(wp) :: ztb, ztnu, ztno
285      !!---------------------------------------------
286      !
287      IF (before) THEN
288         DO jn = n1,n2
289            DO jk=k1,k2
290               DO jj=j1,j2
291                  DO ji=i1,i2
292!> jc tmp
293                     tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn)  * e3t_n(ji,jj,jk) / e3t_0(ji,jj,jk)
294!                     tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn)  * e3t_n(ji,jj,jk)
295!< jc tmp
296                  END DO
297               END DO
298            END DO
299         END DO
300      ELSE
301!> jc tmp
302         DO jn = n1,n2
303            tabres(i1:i2,j1:j2,k1:k2,jn) =  tabres(i1:i2,j1:j2,k1:k2,jn) * e3t_0(i1:i2,j1:j2,k1:k2) &
304                                         & * tmask(i1:i2,j1:j2,k1:k2)
305         ENDDO
306!< jc tmp
307         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
308            ! Add asselin part
309            DO jn = n1,n2
310               DO jk=k1,k2
311                  DO jj=j1,j2
312                     DO ji=i1,i2
313                        IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
314                           ztb  = tsb(ji,jj,jk,jn) * e3t_b(ji,jj,jk) ! fse3t_b prior update should be used
315                           ztnu = tabres(ji,jj,jk,jn)
316                           ztno = tsn(ji,jj,jk,jn) * e3t_a(ji,jj,jk)
317                           tsb(ji,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  & 
318                                     &        * tmask(ji,jj,jk) / e3t_b(ji,jj,jk)
319                        ENDIF
320                     ENDDO
321                  ENDDO
322               ENDDO
323            ENDDO
324         ENDIF
325         DO jn = n1,n2
326            DO jk=k1,k2
327               DO jj=j1,j2
328                  DO ji=i1,i2
329                     IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
330                        tsn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) / e3t_n(ji,jj,jk)
331                     END IF
332                  END DO
333               END DO
334            END DO
335         END DO
336         !
337         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
338            tsb(i1:i2,j1:j2,k1:k2,n1:n2)  = tsn(i1:i2,j1:j2,k1:k2,n1:n2)
339         ENDIF
340         !
341      ENDIF
342      !
343   END SUBROUTINE updateTS
344
345
346   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before )
347      !!---------------------------------------------
348      !!           *** ROUTINE updateu ***
349      !!---------------------------------------------
350      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
351      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres
352      LOGICAL                               , INTENT(in   ) :: before
353      !
354      INTEGER  :: ji, jj, jk
355      REAL(wp) :: zrhoy, zub, zunu, zuno
356      !!---------------------------------------------
357      !
358      IF( before ) THEN
359         zrhoy = Agrif_Rhoy()
360         DO jk = k1, k2
361            tabres(i1:i2,j1:j2,jk) = zrhoy * e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk)
362         END DO
363      ELSE
364         DO jk=k1,k2
365            DO jj=j1,j2
366               DO ji=i1,i2
367                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e2u(ji,jj) 
368                  !
369                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
370                     zub  = ub(ji,jj,jk) * e3u_b(ji,jj,jk)
371                     zuno = un(ji,jj,jk) * e3u_a(ji,jj,jk)
372                     zunu = tabres(ji,jj,jk)
373                     ub(ji,jj,jk) = ( zub + atfp * ( zunu - zuno) ) &     
374                                    & * umask(ji,jj,jk) / e3u_b(ji,jj,jk)
375                  ENDIF
376                  !
377                  un(ji,jj,jk) = tabres(ji,jj,jk) * umask(ji,jj,jk) / e3u_n(ji,jj,jk)
378               END DO
379            END DO
380         END DO
381         !
382         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
383            ub(i1:i2,j1:j2,k1:k2)  = un(i1:i2,j1:j2,k1:k2)
384         ENDIF
385         !
386      ENDIF
387      !
388   END SUBROUTINE updateu
389
390
391   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before)
392      !!---------------------------------------------
393      !!           *** ROUTINE updatev ***
394      !!---------------------------------------------
395      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
396      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres
397      LOGICAL                               , INTENT(in   ) :: before
398      !
399      INTEGER  :: ji, jj, jk
400      REAL(wp) :: zrhox, zvb, zvnu, zvno
401      !!---------------------------------------------     
402      !
403      IF (before) THEN
404         zrhox = Agrif_Rhox()
405         DO jk=k1,k2
406            DO jj=j1,j2
407               DO ji=i1,i2
408                  tabres(ji,jj,jk) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk)
409               END DO
410            END DO
411         END DO
412      ELSE
413         DO jk=k1,k2
414            DO jj=j1,j2
415               DO ji=i1,i2
416                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e1v(ji,jj)
417                  !
418                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
419                     zvb  = vb(ji,jj,jk) * e3v_b(ji,jj,jk)
420                     zvno = vn(ji,jj,jk) * e3v_a(ji,jj,jk)
421                     zvnu = tabres(ji,jj,jk)
422                     vb(ji,jj,jk) = ( zvb + atfp * ( zvnu - zvno) ) &     
423                                    & * vmask(ji,jj,jk) / e3v_b(ji,jj,jk)
424                  ENDIF
425                  !
426                  vn(ji,jj,jk) = tabres(ji,jj,jk) * vmask(ji,jj,jk) / e3v_n(ji,jj,jk)
427               END DO
428            END DO
429         END DO
430         !
431         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
432            vb(i1:i2,j1:j2,k1:k2)  = vn(i1:i2,j1:j2,k1:k2)
433         ENDIF
434         !
435      ENDIF
436      !
437   END SUBROUTINE updatev
438
439
440   SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before )
441      !!---------------------------------------------
442      !!          *** ROUTINE updateu2d ***
443      !!---------------------------------------------
444      INTEGER, INTENT(in) :: i1, i2, j1, j2
445      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
446      LOGICAL, INTENT(in) :: before
447      !!
448      INTEGER  :: ji, jj, jk
449      REAL(wp) :: zrhoy
450      REAL(wp) :: zcorr
451      !!---------------------------------------------
452      !
453      IF (before) THEN
454         zrhoy = Agrif_Rhoy()
455         DO jj=j1,j2
456            DO ji=i1,i2
457               tabres(ji,jj) = zrhoy * un_b(ji,jj) * hu_n(ji,jj) * e2u(ji,jj)
458            END DO
459         END DO
460      ELSE
461         DO jj=j1,j2
462            DO ji=i1,i2
463               tabres(ji,jj) =  tabres(ji,jj) * r1_e2u(ji,jj) 
464               !   
465               ! Update "now" 3d velocities:
466               spgu(ji,jj) = 0._wp
467               DO jk=1,jpkm1
468                  spgu(ji,jj) = spgu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk)
469               END DO
470               !
471               zcorr = (tabres(ji,jj) - spgu(ji,jj)) * r1_hu_n(ji,jj)
472               DO jk=1,jpkm1             
473                  un(ji,jj,jk) = un(ji,jj,jk) + zcorr * umask(ji,jj,jk)           
474               END DO
475               !
476               ! Update barotropic velocities:
477               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN
478                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
479                     zcorr = (tabres(ji,jj) - un_b(ji,jj) * hu_a(ji,jj)) * r1_hu_b(ji,jj)
480                     ub_b(ji,jj) = ub_b(ji,jj) + atfp * zcorr * umask(ji,jj,1)
481                  END IF
482               ENDIF   
483               un_b(ji,jj) = tabres(ji,jj) * r1_hu_n(ji,jj) * umask(ji,jj,1)
484               !       
485               ! Correct "before" velocities to hold correct bt component:
486               spgu(ji,jj) = 0.e0
487               DO jk=1,jpkm1
488                  spgu(ji,jj) = spgu(ji,jj) + e3u_b(ji,jj,jk) * ub(ji,jj,jk)
489               END DO
490               !
491               zcorr = ub_b(ji,jj) - spgu(ji,jj) * r1_hu_b(ji,jj)
492               DO jk=1,jpkm1             
493                  ub(ji,jj,jk) = ub(ji,jj,jk) + zcorr * umask(ji,jj,jk)           
494               END DO
495               !
496            END DO
497         END DO
498         !
499         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
500            ub_b(i1:i2,j1:j2)  = un_b(i1:i2,j1:j2)
501         ENDIF
502      ENDIF
503      !
504   END SUBROUTINE updateu2d
505
506
507   SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before )
508      !!---------------------------------------------
509      !!          *** ROUTINE updatev2d ***
510      !!---------------------------------------------
511      INTEGER, INTENT(in) :: i1, i2, j1, j2
512      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
513      LOGICAL, INTENT(in) :: before
514      !!
515      INTEGER  :: ji, jj, jk
516      REAL(wp) :: zrhox
517      REAL(wp) :: zcorr
518      !!---------------------------------------------
519      !
520      IF (before) THEN
521         zrhox = Agrif_Rhox()
522         DO jj=j1,j2
523            DO ji=i1,i2
524               tabres(ji,jj) = zrhox * vn_b(ji,jj) * hv_n(ji,jj) * e1v(ji,jj) 
525            END DO
526         END DO
527      ELSE
528         DO jj=j1,j2
529            DO ji=i1,i2
530               tabres(ji,jj) =  tabres(ji,jj) * r1_e1v(ji,jj) 
531               !   
532               ! Update "now" 3d velocities:
533               spgv(ji,jj) = 0.e0
534               DO jk=1,jpkm1
535                  spgv(ji,jj) = spgv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk)
536               END DO
537               !
538               zcorr = (tabres(ji,jj) - spgv(ji,jj)) * r1_hv_n(ji,jj)
539               DO jk=1,jpkm1             
540                  vn(ji,jj,jk) = vn(ji,jj,jk) + zcorr * vmask(ji,jj,jk)           
541               END DO
542               !
543               ! Update barotropic velocities:
544               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN
545                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
546                     zcorr = (tabres(ji,jj) - vn_b(ji,jj) * hv_a(ji,jj)) * r1_hv_b(ji,jj)
547                     vb_b(ji,jj) = vb_b(ji,jj) + atfp * zcorr * vmask(ji,jj,1)
548                  END IF
549               ENDIF             
550               vn_b(ji,jj) = tabres(ji,jj) * r1_hv_n(ji,jj) * vmask(ji,jj,1)
551               !       
552               ! Correct "before" velocities to hold correct bt component:
553               spgv(ji,jj) = 0.e0
554               DO jk=1,jpkm1
555                  spgv(ji,jj) = spgv(ji,jj) + e3v_b(ji,jj,jk) * vb(ji,jj,jk)
556               END DO
557               !
558               zcorr = vb_b(ji,jj) - spgv(ji,jj) * r1_hv_b(ji,jj)
559               DO jk=1,jpkm1             
560                  vb(ji,jj,jk) = vb(ji,jj,jk) + zcorr * vmask(ji,jj,jk)           
561               END DO
562               !
563            END DO
564         END DO
565         !
566         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
567            vb_b(i1:i2,j1:j2)  = vn_b(i1:i2,j1:j2)
568         ENDIF
569         !
570      ENDIF
571      !
572   END SUBROUTINE updatev2d
573
574
575   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before )
576      !!---------------------------------------------
577      !!          *** ROUTINE updateSSH ***
578      !!---------------------------------------------
579      INTEGER, INTENT(in) :: i1, i2, j1, j2
580      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
581      LOGICAL, INTENT(in) :: before
582      !!
583      INTEGER :: ji, jj
584      !!---------------------------------------------
585      !
586      IF (before) THEN
587         DO jj=j1,j2
588            DO ji=i1,i2
589               tabres(ji,jj) = sshn(ji,jj)
590            END DO
591         END DO
592      ELSE
593         IF( .NOT.ln_dynspg_ts .OR. ( ln_dynspg_ts .AND. .NOT.ln_bt_fw ) ) THEN
594            IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
595               DO jj=j1,j2
596                  DO ji=i1,i2
597                     sshb(ji,jj) =   sshb(ji,jj) &
598                           & + atfp * ( tabres(ji,jj) - sshn(ji,jj) ) * tmask(ji,jj,1)
599                  END DO
600               END DO
601            ENDIF
602         ENDIF
603         !
604         DO jj=j1,j2
605            DO ji=i1,i2
606               sshn(ji,jj) = tabres(ji,jj) * tmask(ji,jj,1)
607            END DO
608         END DO
609         !
610         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
611            sshb(i1:i2,j1:j2)  = sshn(i1:i2,j1:j2)
612         ENDIF
613         !
614
615      ENDIF
616      !
617   END SUBROUTINE updateSSH
618
619
620   SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before, nb, ndir )
621      !!---------------------------------------------
622      !!          *** ROUTINE updateub2b ***
623      !!---------------------------------------------
624      INTEGER, INTENT(in) :: i1, i2, j1, j2
625      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
626      LOGICAL, INTENT(in) :: before
627      INTEGER, INTENT(in) :: nb, ndir
628      !!
629      LOGICAL :: western_side, eastern_side 
630      INTEGER :: ji, jj
631      REAL(wp) :: zrhoy, za1
632      !!---------------------------------------------
633      !
634      IF (before) THEN
635         zrhoy = Agrif_Rhoy()
636         DO jj=j1,j2
637            DO ji=i1,i2
638               tabres(ji,jj) = ub2_i_b(ji,jj) * e2u(ji,jj)
639            END DO
640         END DO
641         tabres = zrhoy * tabres
642      ELSE
643         !
644         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e2u(i1:i2,j1:j2)
645         !
646         ! Refluxing here:
647#if defined DECAL_FEEDBACK
648         western_side  = (nb == 1).AND.(ndir == 1)
649         eastern_side  = (nb == 1).AND.(ndir == 2)
650         !
651         IF (western_side) THEN
652            DO jj=j1,j2
653               sshn(i1  ,jj) = sshn(i1  ,jj) + rdt * r1_e1e2t(i1  ,jj) &
654                     &         * e2u(i1,jj) * (ub2_b(i1,jj)-tabres(i1,jj))
655            END DO
656         ENDIF
657         IF (eastern_side) THEN
658            DO jj=j1,j2
659               sshn(i2+1,jj) = sshn(i2+1,jj) - rdt * r1_e1e2t(i2+1,jj) &
660                     &         * e2u(i2,jj) * (ub2_b(i2,jj)-tabres(i2,jj))
661            END DO
662         ENDIF
663         !
664#endif
665         za1 = 1._wp / REAL(Agrif_rhot(), wp)
666         !
667         DO jj=j1,j2
668            DO ji=i1,i2
669               ! Update time integrated fluxes also in case of multiply nested grids:
670               ub2_i_b(ji,jj) = ub2_i_b(ji,jj) & 
671                & + za1 * (tabres(ji,jj) - ub2_b(ji,jj))
672               ! Update half step back fluxes:
673               ub2_b(ji,jj) = tabres(ji,jj)
674            END DO
675         END DO
676      ENDIF
677      !
678   END SUBROUTINE updateub2b
679
680
681   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before, nb, ndir )
682      !!---------------------------------------------
683      !!          *** ROUTINE updatevb2b ***
684      !!---------------------------------------------
685      INTEGER, INTENT(in) :: i1, i2, j1, j2
686      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
687      LOGICAL, INTENT(in) :: before
688      INTEGER, INTENT(in) :: nb, ndir
689      !!
690      LOGICAL :: southern_side, northern_side 
691      INTEGER :: ji, jj
692      REAL(wp) :: zrhox, za1
693      !!---------------------------------------------
694      !
695      IF (before) THEN
696         zrhox = Agrif_Rhox()
697         DO jj=j1,j2
698            DO ji=i1,i2
699               tabres(ji,jj) = vb2_i_b(ji,jj) * e1v(ji,jj) 
700            END DO
701         END DO
702         tabres = zrhox * tabres
703      ELSE
704         !
705         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e1v(i1:i2,j1:j2)
706         !
707         ! Refluxing here:
708#if defined DECAL_FEEDBACK
709         southern_side = (nb == 2).AND.(ndir == 1)
710         northern_side = (nb == 2).AND.(ndir == 2)
711         !
712         IF (southern_side) THEN
713            DO ji=i1,i2
714               sshn(ji,j1  ) = sshn(ji,j1  ) + rdt * r1_e1e2t(ji,j1  ) &
715                     &         * e1v(ji,j1  ) * (vb2_b(ji,j1)-tabres(ji,j1))
716            END DO
717         ENDIF
718         IF (northern_side) THEN               
719            DO ji=i1,i2
720               sshn(ji,j2+1) = sshn(ji,j2+1) - rdt * r1_e1e2t(ji,j2+1) &
721                     &         * e1v(ji,j2  ) * (vb2_b(ji,j2)-tabres(ji,j2))
722            END DO
723         ENDIF
724         !
725#endif
726         za1 = 1._wp / REAL(Agrif_rhot(), wp)
727         DO jj=j1,j2
728            DO ji=i1,i2
729               ! Update time integrated fluxes also in case of multiply nested grids:
730               vb2_i_b(ji,jj) = vb2_i_b(ji,jj) & 
731                & + za1 * (tabres(ji,jj) - vb2_b(ji,jj))
732               ! Update half step back fluxes:
733               vb2_b(ji,jj) = tabres(ji,jj)
734            END DO
735         END DO
736      ENDIF
737      !
738   END SUBROUTINE updatevb2b
739
740
741   SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before )
742      ! currently not used
743      !!---------------------------------------------
744      !!           *** ROUTINE updateT ***
745      !!---------------------------------------------
746      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
747      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
748      LOGICAL, iNTENT(in) :: before
749      !
750      INTEGER :: ji,jj,jk
751      REAL(wp) :: ztemp
752      !!---------------------------------------------
753
754      IF (before) THEN
755         DO jk=k1,k2
756            DO jj=j1,j2
757               DO ji=i1,i2
758                  tabres(ji,jj,jk,1) = e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
759                  tabres(ji,jj,jk,2) = e1t(ji,jj)*tmask(ji,jj,jk)
760                  tabres(ji,jj,jk,3) = e2t(ji,jj)*tmask(ji,jj,jk)
761               END DO
762            END DO
763         END DO
764         tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy()
765         tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox()
766         tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy()
767      ELSE
768         DO jk=k1,k2
769            DO jj=j1,j2
770               DO ji=i1,i2
771                  IF( tabres(ji,jj,jk,1) .NE. 0. ) THEN
772                     print *,'VAL = ',ji,jj,jk,tabres(ji,jj,jk,1),e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
773                     print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk)
774                     print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk)
775                     ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3)))
776                     print *,'CORR = ',ztemp-1.
777                     print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, &
778                           tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp
779                     e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp
780                     e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp
781                  END IF
782               END DO
783            END DO
784         END DO
785      ENDIF
786      !
787   END SUBROUTINE update_scales
788
789# if defined key_zdftke
790
791   SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before )
792      !!---------------------------------------------
793      !!           *** ROUTINE updateen ***
794      !!---------------------------------------------
795      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
796      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
797      LOGICAL, INTENT(in) :: before
798      !!---------------------------------------------
799      !
800      IF (before) THEN
801         ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2)
802      ELSE
803         en(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
804      ENDIF
805      !
806   END SUBROUTINE updateEN
807
808
809   SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before )
810      !!---------------------------------------------
811      !!           *** ROUTINE updateavt ***
812      !!---------------------------------------------
813      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
814      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
815      LOGICAL, INTENT(in) :: before
816      !!---------------------------------------------
817      !
818      IF (before) THEN
819         ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2)
820      ELSE
821         avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
822      ENDIF
823      !
824   END SUBROUTINE updateAVT
825
826
827   SUBROUTINE updateAVM( ptab, i1, i2, j1, j2, k1, k2, before )
828      !!---------------------------------------------
829      !!           *** ROUTINE updateavm ***
830      !!---------------------------------------------
831      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
832      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
833      LOGICAL, INTENT(in) :: before
834      !!---------------------------------------------
835      !
836      IF (before) THEN
837         ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2)
838      ELSE
839         avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
840      ENDIF
841      !
842   END SUBROUTINE updateAVM
843
844# endif /* key_zdftke */ 
845
846   SUBROUTINE updatee3t( ptab, i1, i2, j1, j2, k1, k2, before )
847      !!---------------------------------------------
848      !!           *** ROUTINE updatee3t ***
849      !!---------------------------------------------
850      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
851      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
852      LOGICAL, INTENT(in) :: before
853      INTEGER :: ji,jj,jk
854      REAL(wp) :: zcoef
855      !!---------------------------------------------
856      !
857      IF (before) THEN
858!> jc tmp:
859!         ptab(i1:i2,j1:j2,k1:k2) = e3t_n(i1:i2,j1:j2,k1:k2)
860         ptab(i1:i2,j1:j2,k1:k2) = e3t_n(i1:i2,j1:j2,k1:k2) / e3t_0(i1:i2,j1:j2,k1:k2) * tmask(i1:i2,j1:j2,k1:k2)
861!< jc tmp:
862      ELSE
863         !
864         ! 1) Updates at BEFORE time step:
865         ! -------------------------------
866         !
867!> jc tmp:
868         DO jk = 1, jpkm1
869            DO jj=j1,j2
870               DO ji=i1,i2
871                  IF (tmask(ji,jj,jk)==1) THEN
872                     ptab(ji,jj,jk) = ptab(ji,jj,jk) * e3t_0(ji,jj,jk)
873                  ELSE
874                     ptab(ji,jj,jk) = e3t_0(ji,jj,jk)
875                  ENDIF
876               END DO
877            END DO
878         END DO
879!         ptab(i1:i2,j1:j2,k1:k2) = ptab(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2)
880!< jc tmp:
881
882         ! Save "old" scale factor (prior update) for subsequent asselin correction
883         ! of prognostic variables (needed to update initial state only)
884         e3t_a(i1:i2,j1:j2,k1:k2) = e3t_n(i1:i2,j1:j2,k1:k2)
885!         hdivn(i1:i2,j1:j2,k1:k2)   = e3t_b(i1:i2,j1:j2,k1:k2)
886
887         IF (     (.NOT.(lk_agrif_fstep.AND.(neuler==0)).AND.(ln_dynspg_exp)) &
888            & .OR.(.NOT.(lk_agrif_fstep.AND.(neuler==0)).AND.(ln_dynspg_ts    &
889            & .AND.(.NOT.ln_bt_fw)))) THEN
890
891            DO jk = 1, jpkm1
892               DO jj=j1,j2
893                  DO ji=i1,i2
894                     e3t_b(ji,jj,jk) =  e3t_b(ji,jj,jk) &
895                           & + atfp * ( ptab(ji,jj,jk) - e3t_n(ji,jj,jk) )
896                  END DO
897               END DO
898            END DO
899            !
900            e3w_b  (i1:i2,j1:j2,1) = e3w_0(i1:i2,j1:j2,1) + e3t_b(i1:i2,j1:j2,1) - e3t_0(i1:i2,j1:j2,1)
901            gdepw_b(i1:i2,j1:j2,1) = 0.0_wp
902            gdept_b(i1:i2,j1:j2,1) = 0.5_wp * e3w_b(i1:i2,j1:j2,1)
903            !
904            DO jk = 2, jpk
905               DO jj = j1,j2
906                  DO ji = i1,i2           
907                     zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
908                     e3w_b(ji,jj,jk)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) *        & 
909                     &                                        ( e3t_b(ji,jj,jk-1) - e3t_0(ji,jj,jk-1) )  &
910                     &                                  +            0.5_wp * tmask(ji,jj,jk)   *        &
911                     &                                        ( e3t_b(ji,jj,jk  ) - e3t_0(ji,jj,jk  ) )
912                     gdepw_b(ji,jj,jk) = gdepw_b(ji,jj,jk-1) + e3t_b(ji,jj,jk-1)
913                     gdept_b(ji,jj,jk) =      zcoef  * ( gdepw_b(ji,jj,jk  ) + 0.5 * e3w_b(ji,jj,jk))  &
914                         &               + (1-zcoef) * ( gdept_b(ji,jj,jk-1) +       e3w_b(ji,jj,jk)) 
915                  END DO
916               END DO
917            END DO
918            !
919         ENDIF       
920         !
921         ! 2) Updates at NOW time step:
922         ! ----------------------------
923         !
924         ! Update vertical scale factor at T-points:
925         e3t_n(i1:i2,j1:j2,k1:k2) = ptab(i1:i2,j1:j2,k1:k2)
926         !
927         ! Update total depth:
928         ht_n(i1:i2,j1:j2) = 0._wp
929         DO jk = 1, jpkm1
930            ht_n(i1:i2,j1:j2) = ht_n(i1:i2,j1:j2) + e3t_n(i1:i2,j1:j2,jk) * tmask(i1:i2,j1:j2,jk)
931         END DO
932         !
933         ! Update vertical scale factor at W-points and depths:
934         e3w_n (i1:i2,j1:j2,1) = e3w_0(i1:i2,j1:j2,1) + e3t_n(i1:i2,j1:j2,1) - e3t_0(i1:i2,j1:j2,1)
935         gdept_n(i1:i2,j1:j2,1) = 0.5_wp * e3w_n(i1:i2,j1:j2,1)
936         gdepw_n(i1:i2,j1:j2,1) = 0.0_wp
937         gde3w_n(i1:i2,j1:j2,1) = gdept_n(i1:i2,j1:j2,1) - (ht_n(i1:i2,j1:j2)-ht_0(i1:i2,j1:j2)) ! Last term in the rhs is ssh
938         !
939         DO jk = 2, jpk
940            DO jj = j1,j2
941               DO ji = i1,i2           
942               zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
943               e3w_n(ji,jj,jk)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) * ( e3t_n(ji,jj,jk-1) - e3t_0(ji,jj,jk-1) )   &
944               &                                  +            0.5_wp * tmask(ji,jj,jk)   * ( e3t_n(ji,jj,jk  ) - e3t_0(ji,jj,jk  ) )
945               gdepw_n(ji,jj,jk) = gdepw_n(ji,jj,jk-1) + e3t_n(ji,jj,jk-1)
946               gdept_n(ji,jj,jk) =      zcoef  * ( gdepw_n(ji,jj,jk  ) + 0.5 * e3w_n(ji,jj,jk))  &
947                   &               + (1-zcoef) * ( gdept_n(ji,jj,jk-1) +       e3w_n(ji,jj,jk)) 
948               gde3w_n(ji,jj,jk) = gdept_n(ji,jj,jk) - (ht_n(ji,jj)-ht_0(ji,jj)) ! Last term in the rhs is ssh
949               END DO
950            END DO
951         END DO
952         !
953         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN
954            e3t_b (i1:i2,j1:j2,1:jpk)  = e3t_n (i1:i2,j1:j2,1:jpk)
955            e3w_b (i1:i2,j1:j2,1:jpk)  = e3w_n (i1:i2,j1:j2,1:jpk)
956            gdepw_b(i1:i2,j1:j2,1:jpk) = gdepw_n(i1:i2,j1:j2,1:jpk)
957            gdept_b(i1:i2,j1:j2,1:jpk) = gdept_n(i1:i2,j1:j2,1:jpk)
958         ENDIF
959         !
960      ENDIF
961      !
962   END SUBROUTINE updatee3t
963
964#else
965CONTAINS
966   SUBROUTINE agrif_opa_update_empty
967      !!---------------------------------------------
968      !!   *** ROUTINE agrif_opa_update_empty ***
969      !!---------------------------------------------
970      WRITE(*,*)  'agrif_opa_update : You should not have seen this print! error?'
971   END SUBROUTINE agrif_opa_update_empty
972#endif
973END MODULE agrif_opa_update
974
Note: See TracBrowser for help on using the repository browser.