Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#undef DECAL_FEEDBACK /* SEPARATION of INTERFACES */
#undef DECAL_FEEDBACK_2D /* SEPARATION of INTERFACES (Barotropic mode) */
#undef VOL_REFLUX /* VOLUME REFLUXING*/
MODULE agrif_oce_update
!!======================================================================
!! *** MODULE agrif_oce_interp ***
!! AGRIF: update package for the ocean dynamics (OCE)
!!======================================================================
!! History : 2.0 ! 2002-06 (L. Debreu) Original code
!! 3.2 ! 2009-04 (R. Benshila)
!! 3.6 ! 2014-09 (R. Benshila)
!!----------------------------------------------------------------------
#if defined key_agrif
!!----------------------------------------------------------------------
!! 'key_agrif' AGRIF zoom
!!----------------------------------------------------------------------
USE par_oce
USE oce
USE dom_oce
USE zdf_oce ! vertical physics: ocean variables
USE agrif_oce
USE dom_oce
!
USE in_out_manager ! I/O manager
USE lib_mpp ! MPP library
USE domvvl ! Need interpolation routines
USE vremap ! Vertical remapping
USE lbclnk
#if defined key_qco
USE domqco
#endif
IMPLICIT NONE
PRIVATE
PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn, Agrif_Update_vvl, Agrif_Update_ssh
PUBLIC Update_Scales, Agrif_Check_parent_bat
!! * Substitutions
# include "domzgr_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/NST 4.0 , NEMO Consortium (2018)
!! $Id: agrif_oce_update.F90 15317 2021-10-01 16:09:36Z jchanut $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE Agrif_Update_Tra( )
!!----------------------------------------------------------------------
!! *** ROUTINE Agrif_Update_Tra ***
!!----------------------------------------------------------------------
!
IF (Agrif_Root()) RETURN
!
IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers from grid Number',Agrif_Fixed()
l_vremap = ln_vert_remap
Agrif_UseSpecialValueInUpdate = .NOT.l_vremap
Agrif_SpecialValueFineGrid = 0._wp
!
# if ! defined DECAL_FEEDBACK
CALL Agrif_Update_Variable(ts_update_id, procname=updateTS)
! near boundary update:
! CALL Agrif_Update_Variable(ts_update_id,locupdate=(/0,2/), procname=updateTS)
# else
CALL Agrif_Update_Variable(ts_update_id, locupdate=(/1,0/),procname=updateTS)
! near boundary update:
! CALL Agrif_Update_Variable(ts_update_id,locupdate=(/1,2/), procname=updateTS)
# endif
!
Agrif_UseSpecialValueInUpdate = .FALSE.
l_vremap = .FALSE.
!
!
END SUBROUTINE Agrif_Update_Tra
SUBROUTINE Agrif_Update_Dyn( )
!!----------------------------------------------------------------------
!! *** ROUTINE Agrif_Update_Dyn ***
!!----------------------------------------------------------------------
!
IF (Agrif_Root()) RETURN
!
IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed()
Agrif_UseSpecialValueInUpdate = .FALSE.
Agrif_SpecialValueFineGrid = 0._wp
l_vremap = ln_vert_remap
use_sign_north = .TRUE.
sign_north = -1._wp
!
# if ! defined DECAL_FEEDBACK_2D
CALL Agrif_Update_Variable(unb_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updateU2d)
CALL Agrif_Update_Variable(vnb_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updateV2d)
# else
CALL Agrif_Update_Variable(unb_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/1+nn_shift_bar,-2/),procname = updateU2d)
CALL Agrif_Update_Variable(vnb_update_id,locupdate1=(/1+nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updateV2d)
# endif
!
IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN
! Update time integrated transports
# if ! defined DECAL_FEEDBACK_2D
CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updateub2b)
CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updatevb2b)
# else
CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/ nn_shift_bar,-2/),locupdate2=(/1+nn_shift_bar,-2/),procname = updateub2b)
CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1+nn_shift_bar,-2/),locupdate2=(/ nn_shift_bar,-2/),procname = updatevb2b)
# endif
END IF
# if ! defined DECAL_FEEDBACK
CALL Agrif_Update_Variable(un_update_id,procname = updateU)
CALL Agrif_Update_Variable(vn_update_id,procname = updateV)
! near boundary update:
! CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU)
! CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV)
# else
CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU)
CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV)
! near boundary update:
! CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU)
! CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV)
# endif
!
use_sign_north = .FALSE.
l_vremap = .FALSE.
!
END SUBROUTINE Agrif_Update_Dyn
SUBROUTINE Agrif_Update_ssh( )
!!---------------------------------------------
!! *** ROUTINE Agrif_Update_ssh ***
!!---------------------------------------------
!
IF (Agrif_Root()) RETURN
!
l_vremap = ln_vert_remap
Agrif_UseSpecialValueInUpdate = .NOT.l_vremap
Agrif_SpecialValueFineGrid = 0._wp
# if ! defined DECAL_FEEDBACK_2D
CALL Agrif_Update_Variable(sshn_id,locupdate=(/ nn_shift_bar,-2/), procname = updateSSH)
# else
CALL Agrif_Update_Variable(sshn_id,locupdate=(/1+nn_shift_bar,-2/),procname = updateSSH)
# endif
!
Agrif_UseSpecialValueInUpdate = .FALSE.
l_vremap = .FALSE.
!
# if defined VOL_REFLUX
IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN
use_sign_north = .TRUE.
sign_north = -1._wp
! Refluxing on ssh:
# if defined DECAL_FEEDBACK_2D
CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/nn_shift_bar,nn_shift_bar/),locupdate2=(/1+nn_shift_bar,1+nn_shift_bar/),procname = reflux_sshu)
CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1+nn_shift_bar,1+nn_shift_bar/),locupdate2=(/nn_shift_bar,nn_shift_bar/),procname = reflux_sshv)
# else
CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/-1+nn_shift_bar,-1+nn_shift_bar/),locupdate2=(/nn_shift_bar, nn_shift_bar/),procname = reflux_sshu)
CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/ nn_shift_bar, nn_shift_bar/),locupdate2=(/-1+nn_shift_bar,-1+nn_shift_bar/),procname = reflux_sshv)
# endif
use_sign_north = .FALSE.
END IF
# endif
!
END SUBROUTINE Agrif_Update_ssh
SUBROUTINE Agrif_Update_Tke( )
!!---------------------------------------------
!! *** ROUTINE Agrif_Update_Tke ***
!!---------------------------------------------
!!
!
IF (Agrif_Root()) RETURN
!
Agrif_UseSpecialValueInUpdate = .TRUE.
Agrif_SpecialValueFineGrid = 0._wp
CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN )
CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT )
CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM )
Agrif_UseSpecialValueInUpdate = .FALSE.
END SUBROUTINE Agrif_Update_Tke
SUBROUTINE Agrif_Update_vvl( )
!!---------------------------------------------
!! *** ROUTINE Agrif_Update_vvl ***
!!---------------------------------------------
!
IF (Agrif_Root()) RETURN
!
IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update e3 from grid Number',Agrif_Fixed(), 'Step', Agrif_Nb_Step()
!
#if defined key_qco
CALL Agrif_ChildGrid_To_ParentGrid()
CALL Agrif_Update_qco
CALL Agrif_ParentGrid_To_ChildGrid()
#elif defined key_linssh
Loading
Loading full blame...