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_r7881_no_wrk_alloc/NEMOGCM/NEMO/NST_SRC – NEMO

source: branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90 @ 8016

Last change on this file since 8016 was 8016, checked in by timgraham, 7 years ago

Delete some remaining "USE wrk_array" lines

  • Property svn:keywords set to Id
File size: 22.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 zdf_oce        ! vertical physics: ocean variables
13
14   IMPLICIT NONE
15   PRIVATE
16
17   PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales
18# if defined key_zdftke
19   PUBLIC Agrif_Update_Tke
20# endif
21   !!----------------------------------------------------------------------
22   !! NEMO/NST 3.6 , NEMO Consortium (2010)
23   !! $Id$
24   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
25   !!----------------------------------------------------------------------
26CONTAINS
27
28   RECURSIVE SUBROUTINE Agrif_Update_Tra( )
29      !!---------------------------------------------
30      !!   *** ROUTINE Agrif_Update_Tra ***
31      !!---------------------------------------------
32      !
33      IF (Agrif_Root()) RETURN
34      !
35#if defined TWO_WAY 
36      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers  from grid Number',Agrif_Fixed(), 'nbcline', nbcline
37
38      Agrif_UseSpecialValueInUpdate = .TRUE.
39      Agrif_SpecialValueFineGrid = 0.
40      !
41      IF (MOD(nbcline,nbclineupdate) == 0) THEN
42# if ! defined DECAL_FEEDBACK
43         CALL Agrif_Update_Variable(tsn_id, procname=updateTS)
44# else
45         CALL Agrif_Update_Variable(tsn_id, locupdate=(/1,0/),procname=updateTS)
46# endif
47      ELSE
48# if ! defined DECAL_FEEDBACK
49         CALL Agrif_Update_Variable(tsn_id,locupdate=(/0,2/), procname=updateTS)
50# else
51         CALL Agrif_Update_Variable(tsn_id,locupdate=(/1,2/), procname=updateTS)
52# endif
53      ENDIF
54      !
55      Agrif_UseSpecialValueInUpdate = .FALSE.
56      !
57      IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update:
58         CALL Agrif_ChildGrid_To_ParentGrid()
59         CALL Agrif_Update_Tra()
60         CALL Agrif_ParentGrid_To_ChildGrid()
61      ENDIF
62      !
63#endif
64      !
65   END SUBROUTINE Agrif_Update_Tra
66
67
68   RECURSIVE SUBROUTINE Agrif_Update_Dyn( )
69      !!---------------------------------------------
70      !!   *** ROUTINE Agrif_Update_Dyn ***
71      !!---------------------------------------------
72      !
73      IF (Agrif_Root()) RETURN
74      !
75#if defined TWO_WAY
76      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed(), 'nbcline', nbcline
77
78      Agrif_UseSpecialValueInUpdate = .FALSE.
79      Agrif_SpecialValueFineGrid = 0.
80      !     
81      IF (mod(nbcline,nbclineupdate) == 0) THEN
82# if ! defined DECAL_FEEDBACK
83         CALL Agrif_Update_Variable(un_update_id,procname = updateU)
84         CALL Agrif_Update_Variable(vn_update_id,procname = updateV)
85# else
86         CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU)
87         CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV)
88# endif
89      ELSE
90# if ! defined DECAL_FEEDBACK
91         CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU)
92         CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV)         
93# else
94         CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU)
95         CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV)
96# endif
97      ENDIF
98
99# if ! defined DECAL_FEEDBACK
100      CALL Agrif_Update_Variable(e1u_id,procname = updateU2d)
101      CALL Agrif_Update_Variable(e2v_id,procname = updateV2d) 
102# else
103      CALL Agrif_Update_Variable(e1u_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU2d)
104      CALL Agrif_Update_Variable(e2v_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV2d) 
105# endif
106
107      IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN
108         ! Update time integrated transports
109         IF (mod(nbcline,nbclineupdate) == 0) THEN
110#  if ! defined DECAL_FEEDBACK
111            CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b)
112            CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b)
113#  else
114            CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateub2b)
115            CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updatevb2b)
116#  endif
117         ELSE
118#  if ! defined DECAL_FEEDBACK
119            CALL Agrif_Update_Variable(ub2b_update_id,locupdate=(/0,1/),procname = updateub2b)
120            CALL Agrif_Update_Variable(vb2b_update_id,locupdate=(/0,1/),procname = updatevb2b)
121#  else
122            CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateub2b)
123            CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updatevb2b)
124#  endif
125         ENDIF
126      END IF
127      !
128      nbcline = nbcline + 1
129      !
130      Agrif_UseSpecialValueInUpdate = .TRUE.
131      Agrif_SpecialValueFineGrid = 0.
132# if ! defined DECAL_FEEDBACK
133      CALL Agrif_Update_Variable(sshn_id,procname = updateSSH)
134# else
135      CALL Agrif_Update_Variable(sshn_id,locupdate=(/1,0/),procname = updateSSH)
136# endif
137      Agrif_UseSpecialValueInUpdate = .FALSE.
138      !
139#endif
140      !
141      ! Do recursive update:
142      IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update:
143         CALL Agrif_ChildGrid_To_ParentGrid()
144         CALL Agrif_Update_Dyn()
145         CALL Agrif_ParentGrid_To_ChildGrid()
146      ENDIF
147      !
148   END SUBROUTINE Agrif_Update_Dyn
149
150# if defined key_zdftke
151
152   SUBROUTINE Agrif_Update_Tke( kt )
153      !!---------------------------------------------
154      !!   *** ROUTINE Agrif_Update_Tke ***
155      !!---------------------------------------------
156      !!
157      INTEGER, INTENT(in) :: kt
158      !       
159      IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN
160#  if defined TWO_WAY
161
162      Agrif_UseSpecialValueInUpdate = .TRUE.
163      Agrif_SpecialValueFineGrid = 0.
164
165      CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN  )
166      CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT )
167      CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM )
168
169      Agrif_UseSpecialValueInUpdate = .FALSE.
170
171#  endif
172     
173   END SUBROUTINE Agrif_Update_Tke
174   
175# endif /* key_zdftke */
176
177   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before )
178      !!---------------------------------------------
179      !!           *** ROUTINE updateT ***
180      !!---------------------------------------------
181      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
182      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
183      LOGICAL, INTENT(in) :: before
184      !!
185      INTEGER :: ji,jj,jk,jn
186      !!---------------------------------------------
187      !
188      IF (before) THEN
189         DO jn = n1,n2
190            DO jk=k1,k2
191               DO jj=j1,j2
192                  DO ji=i1,i2
193                     tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn)
194                  END DO
195               END DO
196            END DO
197         END DO
198      ELSE
199         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
200            ! Add asselin part
201            DO jn = n1,n2
202               DO jk=k1,k2
203                  DO jj=j1,j2
204                     DO ji=i1,i2
205                        IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
206                           tsb(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) & 
207                                 & + atfp * ( tabres(ji,jj,jk,jn) &
208                                 &             - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk)
209                        ENDIF
210                     ENDDO
211                  ENDDO
212               ENDDO
213            ENDDO
214         ENDIF
215         DO jn = n1,n2
216            DO jk=k1,k2
217               DO jj=j1,j2
218                  DO ji=i1,i2
219                     IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
220                        tsn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) * tmask(ji,jj,jk)
221                     END IF
222                  END DO
223               END DO
224            END DO
225         END DO
226      ENDIF
227      !
228   END SUBROUTINE updateTS
229
230
231   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before )
232      !!---------------------------------------------
233      !!           *** ROUTINE updateu ***
234      !!---------------------------------------------
235      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
236      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres
237      LOGICAL                               , INTENT(in   ) :: before
238      !
239      INTEGER  ::   ji, jj, jk
240      REAL(wp) ::   zrhoy
241      !!---------------------------------------------
242      !
243      IF( before ) THEN
244         zrhoy = Agrif_Rhoy()
245         DO jk = k1, k2
246            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)
247         END DO
248      ELSE
249         DO jk=k1,k2
250            DO jj=j1,j2
251               DO ji=i1,i2
252                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e2u(ji,jj) / e3u_n(ji,jj,jk)
253                  !
254                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
255                     ub(ji,jj,jk) = ub(ji,jj,jk) & 
256                           & + atfp * ( tabres(ji,jj,jk) - un(ji,jj,jk) ) * umask(ji,jj,jk)
257                  ENDIF
258                  !
259                  un(ji,jj,jk) = tabres(ji,jj,jk) * umask(ji,jj,jk)
260               END DO
261            END DO
262         END DO
263      ENDIF
264      !
265   END SUBROUTINE updateu
266
267
268   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before )
269      !!---------------------------------------------
270      !!           *** ROUTINE updatev ***
271      !!---------------------------------------------
272      INTEGER :: i1,i2,j1,j2,k1,k2
273      INTEGER :: ji,jj,jk
274      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres
275      LOGICAL :: before
276      !!
277      REAL(wp) :: zrhox
278      !!---------------------------------------------     
279      !
280      IF (before) THEN
281         zrhox = Agrif_Rhox()
282         DO jk=k1,k2
283            DO jj=j1,j2
284               DO ji=i1,i2
285                  tabres(ji,jj,jk) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk)
286               END DO
287            END DO
288         END DO
289      ELSE
290         DO jk=k1,k2
291            DO jj=j1,j2
292               DO ji=i1,i2
293                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk)
294                  !
295                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
296                     vb(ji,jj,jk) = vb(ji,jj,jk) & 
297                           & + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk)
298                  ENDIF
299                  !
300                  vn(ji,jj,jk) = tabres(ji,jj,jk) * vmask(ji,jj,jk)
301               END DO
302            END DO
303         END DO
304      ENDIF
305      !
306   END SUBROUTINE updatev
307
308
309   SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before )
310      !!---------------------------------------------
311      !!          *** ROUTINE updateu2d ***
312      !!---------------------------------------------
313      INTEGER, INTENT(in) :: i1, i2, j1, j2
314      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
315      LOGICAL, INTENT(in) :: before
316      !!
317      INTEGER :: ji, jj, jk
318      REAL(wp) :: zrhoy
319      REAL(wp) :: zcorr
320      !!---------------------------------------------
321      !
322      IF (before) THEN
323         zrhoy = Agrif_Rhoy()
324         DO jj=j1,j2
325            DO ji=i1,i2
326               tabres(ji,jj) = zrhoy * un_b(ji,jj) * hu_n(ji,jj) * e2u(ji,jj)
327            END DO
328         END DO
329      ELSE
330         DO jj=j1,j2
331            DO ji=i1,i2
332               tabres(ji,jj) =  tabres(ji,jj) * r1_hu_n(ji,jj) * r1_e2u(ji,jj) 
333               !   
334               ! Update "now" 3d velocities:
335               spgu(ji,jj) = 0._wp
336               DO jk=1,jpkm1
337                  spgu(ji,jj) = spgu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk)
338               END DO
339               spgu(ji,jj) = spgu(ji,jj) * r1_hu_n(ji,jj)
340               !
341               zcorr = tabres(ji,jj) - spgu(ji,jj)
342               DO jk=1,jpkm1             
343                  un(ji,jj,jk) = un(ji,jj,jk) + zcorr * umask(ji,jj,jk)           
344               END DO
345               !
346               ! Update barotropic velocities:
347               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN
348                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
349                     zcorr = tabres(ji,jj) - un_b(ji,jj)
350                     ub_b(ji,jj) = ub_b(ji,jj) + atfp * zcorr * umask(ji,jj,1)
351                  END IF
352               ENDIF             
353               un_b(ji,jj) = tabres(ji,jj) * umask(ji,jj,1)
354               !       
355               ! Correct "before" velocities to hold correct bt component:
356               spgu(ji,jj) = 0.e0
357               DO jk=1,jpkm1
358                  spgu(ji,jj) = spgu(ji,jj) + e3u_b(ji,jj,jk) * ub(ji,jj,jk)
359               END DO
360               spgu(ji,jj) = spgu(ji,jj) * r1_hu_b(ji,jj)
361               !
362               zcorr = ub_b(ji,jj) - spgu(ji,jj)
363               DO jk=1,jpkm1             
364                  ub(ji,jj,jk) = ub(ji,jj,jk) + zcorr * umask(ji,jj,jk)           
365               END DO
366               !
367            END DO
368         END DO
369      ENDIF
370      !
371   END SUBROUTINE updateu2d
372
373
374   SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before )
375      !!---------------------------------------------
376      !!          *** ROUTINE updatev2d ***
377      !!---------------------------------------------
378      INTEGER, INTENT(in) :: i1, i2, j1, j2
379      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
380      LOGICAL, INTENT(in) :: before
381      !!
382      INTEGER :: ji, jj, jk
383      REAL(wp) :: zrhox
384      REAL(wp) :: zcorr
385      !!---------------------------------------------
386      !
387      IF (before) THEN
388         zrhox = Agrif_Rhox()
389         DO jj=j1,j2
390            DO ji=i1,i2
391               tabres(ji,jj) = zrhox * vn_b(ji,jj) * hv_n(ji,jj) * e1v(ji,jj) 
392            END DO
393         END DO
394      ELSE
395         DO jj=j1,j2
396            DO ji=i1,i2
397               tabres(ji,jj) =  tabres(ji,jj) * r1_hv_n(ji,jj) * r1_e1v(ji,jj) 
398               !   
399               ! Update "now" 3d velocities:
400               spgv(ji,jj) = 0.e0
401               DO jk=1,jpkm1
402                  spgv(ji,jj) = spgv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk)
403               END DO
404               spgv(ji,jj) = spgv(ji,jj) * r1_hv_n(ji,jj)
405               !
406               zcorr = tabres(ji,jj) - spgv(ji,jj)
407               DO jk=1,jpkm1             
408                  vn(ji,jj,jk) = vn(ji,jj,jk) + zcorr * vmask(ji,jj,jk)           
409               END DO
410               !
411               ! Update barotropic velocities:
412               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN
413                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
414                     zcorr = tabres(ji,jj) - vn_b(ji,jj)
415                     vb_b(ji,jj) = vb_b(ji,jj) + atfp * zcorr * vmask(ji,jj,1)
416                  END IF
417               ENDIF             
418               vn_b(ji,jj) = tabres(ji,jj) * vmask(ji,jj,1)
419               !       
420               ! Correct "before" velocities to hold correct bt component:
421               spgv(ji,jj) = 0.e0
422               DO jk=1,jpkm1
423                  spgv(ji,jj) = spgv(ji,jj) + e3v_b(ji,jj,jk) * vb(ji,jj,jk)
424               END DO
425               spgv(ji,jj) = spgv(ji,jj) * r1_hv_b(ji,jj)
426               !
427               zcorr = vb_b(ji,jj) - spgv(ji,jj)
428               DO jk=1,jpkm1             
429                  vb(ji,jj,jk) = vb(ji,jj,jk) + zcorr * vmask(ji,jj,jk)           
430               END DO
431               !
432            END DO
433         END DO
434      ENDIF
435      !
436   END SUBROUTINE updatev2d
437
438
439   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before )
440      !!---------------------------------------------
441      !!          *** ROUTINE updateSSH ***
442      !!---------------------------------------------
443      INTEGER, INTENT(in) :: i1, i2, j1, j2
444      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
445      LOGICAL, INTENT(in) :: before
446      !!
447      INTEGER :: ji, jj
448      !!---------------------------------------------
449      !
450      IF (before) THEN
451         DO jj=j1,j2
452            DO ji=i1,i2
453               tabres(ji,jj) = sshn(ji,jj)
454            END DO
455         END DO
456      ELSE
457         IF( .NOT.ln_dynspg_ts .OR. ( ln_dynspg_ts .AND. .NOT.ln_bt_fw ) ) THEN
458            IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
459               DO jj=j1,j2
460                  DO ji=i1,i2
461                     sshb(ji,jj) =   sshb(ji,jj) &
462                           & + atfp * ( tabres(ji,jj) - sshn(ji,jj) ) * tmask(ji,jj,1)
463                  END DO
464               END DO
465            ENDIF
466         ENDIF
467         !
468         DO jj=j1,j2
469            DO ji=i1,i2
470               sshn(ji,jj) = tabres(ji,jj) * tmask(ji,jj,1)
471            END DO
472         END DO
473      ENDIF
474      !
475   END SUBROUTINE updateSSH
476
477
478   SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before )
479      !!---------------------------------------------
480      !!          *** ROUTINE updateub2b ***
481      !!---------------------------------------------
482      INTEGER, INTENT(in) :: i1, i2, j1, j2
483      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
484      LOGICAL, INTENT(in) :: before
485      !!
486      INTEGER :: ji, jj
487      REAL(wp) :: zrhoy
488      !!---------------------------------------------
489      !
490      IF (before) THEN
491         zrhoy = Agrif_Rhoy()
492         DO jj=j1,j2
493            DO ji=i1,i2
494               tabres(ji,jj) = ub2_i_b(ji,jj) * e2u(ji,jj)
495            END DO
496         END DO
497         tabres = zrhoy * tabres
498      ELSE
499         DO jj=j1,j2
500            DO ji=i1,i2
501               ub2_b(ji,jj) = tabres(ji,jj) / e2u(ji,jj)
502            END DO
503         END DO
504      ENDIF
505      !
506   END SUBROUTINE updateub2b
507
508
509   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before )
510      !!---------------------------------------------
511      !!          *** ROUTINE updatevb2b ***
512      !!---------------------------------------------
513      INTEGER, INTENT(in) :: i1, i2, j1, j2
514      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
515      LOGICAL, INTENT(in) :: before
516      !!
517      INTEGER :: ji, jj
518      REAL(wp) :: zrhox
519      !!---------------------------------------------
520      !
521      IF (before) THEN
522         zrhox = Agrif_Rhox()
523         DO jj=j1,j2
524            DO ji=i1,i2
525               tabres(ji,jj) = vb2_i_b(ji,jj) * e1v(ji,jj) 
526            END DO
527         END DO
528         tabres = zrhox * tabres
529      ELSE
530         DO jj=j1,j2
531            DO ji=i1,i2
532               vb2_b(ji,jj) = tabres(ji,jj) / e1v(ji,jj)
533            END DO
534         END DO
535      ENDIF
536      !
537   END SUBROUTINE updatevb2b
538
539
540   SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before )
541      ! currently not used
542      !!---------------------------------------------
543      !!           *** ROUTINE updateT ***
544      !!---------------------------------------------
545      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
546      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
547      LOGICAL, iNTENT(in) :: before
548      !
549      INTEGER :: ji,jj,jk
550      REAL(wp) :: ztemp
551      !!---------------------------------------------
552
553      IF (before) THEN
554         DO jk=k1,k2
555            DO jj=j1,j2
556               DO ji=i1,i2
557                  tabres(ji,jj,jk,1) = e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
558                  tabres(ji,jj,jk,2) = e1t(ji,jj)*tmask(ji,jj,jk)
559                  tabres(ji,jj,jk,3) = e2t(ji,jj)*tmask(ji,jj,jk)
560               END DO
561            END DO
562         END DO
563         tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy()
564         tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox()
565         tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy()
566      ELSE
567         DO jk=k1,k2
568            DO jj=j1,j2
569               DO ji=i1,i2
570                  IF( tabres(ji,jj,jk,1) .NE. 0. ) THEN
571                     print *,'VAL = ',ji,jj,jk,tabres(ji,jj,jk,1),e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
572                     print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk)
573                     print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk)
574                     ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3)))
575                     print *,'CORR = ',ztemp-1.
576                     print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, &
577                           tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp
578                     e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp
579                     e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp
580                  END IF
581               END DO
582            END DO
583         END DO
584      ENDIF
585      !
586   END SUBROUTINE update_scales
587
588# if defined key_zdftke
589
590   SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before )
591      !!---------------------------------------------
592      !!           *** ROUTINE updateen ***
593      !!---------------------------------------------
594      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
595      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
596      LOGICAL, INTENT(in) :: before
597      !!---------------------------------------------
598      !
599      IF (before) THEN
600         ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2)
601      ELSE
602         en(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
603      ENDIF
604      !
605   END SUBROUTINE updateEN
606
607
608   SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before )
609      !!---------------------------------------------
610      !!           *** ROUTINE updateavt ***
611      !!---------------------------------------------
612      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
613      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
614      LOGICAL, INTENT(in) :: before
615      !!---------------------------------------------
616      !
617      IF (before) THEN
618         ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2)
619      ELSE
620         avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
621      ENDIF
622      !
623   END SUBROUTINE updateAVT
624
625
626   SUBROUTINE updateAVM( ptab, i1, i2, j1, j2, k1, k2, before )
627      !!---------------------------------------------
628      !!           *** ROUTINE updateavm ***
629      !!---------------------------------------------
630      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
631      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
632      LOGICAL, INTENT(in) :: before
633      !!---------------------------------------------
634      !
635      IF (before) THEN
636         ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2)
637      ELSE
638         avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
639      ENDIF
640      !
641   END SUBROUTINE updateAVM
642
643# endif /* key_zdftke */ 
644
645#else
646CONTAINS
647   SUBROUTINE agrif_opa_update_empty
648      !!---------------------------------------------
649      !!   *** ROUTINE agrif_opa_update_empty ***
650      !!---------------------------------------------
651      WRITE(*,*)  'agrif_opa_update : You should not have seen this print! error?'
652   END SUBROUTINE agrif_opa_update_empty
653#endif
654END MODULE agrif_opa_update
655
Note: See TracBrowser for help on using the repository browser.