MOM6
shelf_triangular_festuff Module Reference

Data Types

type  ice_shelf_cs
 

Functions/Subroutines

subroutine matrix_diagonal_triangle (CS, u_diagonal, v_diagonal)
 

Function/Subroutine Documentation

◆ matrix_diagonal_triangle()

subroutine shelf_triangular_festuff::matrix_diagonal_triangle ( type(ice_shelf_cs), pointer  CS,
real, dimension (:,:), intent(inout)  u_diagonal,
real, dimension (:,:), intent(inout)  v_diagonal 
)

Definition at line 165 of file shelf_triangular_FEstuff.F90.

165 
166  type(ice_shelf_cs), pointer :: cs
167  real, dimension (:,:), intent(inout) :: u_diagonal, v_diagonal
168 
169 ! returns the diagonal entries of the matrix for a Jacobi preconditioning
170 
171  real, pointer, dimension (:,:) :: umask, vmask, &
172  nu_lower, nu_upper, beta_lower, beta_upper, hmask
173  type(ocean_grid_type), pointer :: g
174  integer :: i, j, is, js, cnt, isc, jsc, iec, jec
175  real :: a, n, ux, uy, vx, vy, eps_min, domain_width, dxh, dyh, dxdyh
176 
177  g => cs%grid
178 
179 ! if (G%symmetric) then
180 ! isym=1
181 ! else
182 ! isym=0
183 ! endif
184 
185 
186  isc = g%isc ; jsc = g%jsc ; iec = g%iec ; jec = g%jec
187 
188  umask => cs%umask ; vmask => cs%vmask ; hmask => cs%hmask
189  nu_lower => cs%ice_visc_lower_tri ; nu_upper => cs%ice_visc_upper_tri
190  beta_lower => cs%taub_beta_eff_lower_tri ; beta_upper => cs%taub_beta_eff_upper_tri
191 
192  do i=isc-1,iec+1 ; do j=jsc-1,jec+1 ; if (hmask(i,j) .eq. 1) then
193  dxh = g%dxT(i,j)
194  dyh = g%dyT(i,j)
195  dxdyh = g%areaT(i,j)
196 
197  if (umask(i,j-1) .eq. 1) then ! this (bot right) is a degree of freedom node
198 
199  ux = 1./dxh ; uy = 0./dyh
200  vx = 0. ; vy = 0.
201 
202  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
203  .5 * dxdyh * nu_lower(i,j) * ((4*ux+2*vy) * (1./dxh) + (uy+vy) * (0./dyh))
204 
205  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
206  beta_lower(i,j) * dxdyh * 1./24
207 
208  ux = 0. ; uy = 0.
209  vx = 1./dxh ; vy = 0./dyh
210 
211  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
212  .5 * dxdyh * nu_lower(i,j) * ((uy+vx) * (1./dxh) + (4*vy+2*ux) * (0./dyh))
213 
214  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
215  beta_lower(i,j) * dxdyh * 1./24
216 
217  ux = 0./dxh ; uy = -1./dyh
218  vx = 0. ; vy = 0.
219 
220  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
221  .5 * dxdyh * nu_upper(i,j) * ((4*ux+2*vy) * (0./dxh) + (uy+vy) * (-1./dyh))
222 
223  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
224  beta_upper(i,j) * dxdyh * 1./24
225 
226  vx = 0./dxh ; vy = -1./dyh
227  ux = 0. ; uy = 0.
228 
229  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
230  .5 * dxdyh * nu_upper(i,j) * ((uy+vx) * (0./dxh) + (4*vy+2*ux) * (-1./dyh))
231 
232  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
233  beta_upper(i,j) * dxdyh * 1./24
234 
235  endif
236 
237  if (umask(i-1,j) .eq. 1) then ! this (top left) is a degree of freedom node
238 
239  ux = 0./dxh ; uy = 1./dyh
240  vx = 0. ; vy = 0.
241 
242  u_diagonal(i-1,j) = u_diagonal(i-1,j) + &
243  .5 * dxdyh * nu_lower(i,j) * ((4*ux+2*vy) * (0./dxh) + (uy+vy) * (1./dyh))
244 
245  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
246  beta_lower(i,j) * dxdyh * 1./24
247 
248  ux = 0. ; uy = 0.
249  vx = 0./dxh ; vy = 1./dyh
250 
251  v_diagonal(i-1,j) = v_diagonal(i-1,j) + &
252  .5 * dxdyh * nu_lower(i,j) * ((uy+vx) * (0./dxh) + (4*vy+2*ux) * (1./dyh))
253 
254  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
255  beta_lower(i,j) * dxdyh * 1./24
256 
257  ux = -1./dxh ; uy = 0./dyh
258  vx = 0. ; vy = 0.
259 
260  u_diagonal(i-1,j) = u_diagonal(i-1,j) + &
261  .5 * dxdyh * nu_upper(i,j) * ((4*ux+2*vy) * (-1./dxh) + (uy+vy) * (0./dyh))
262 
263  u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
264  beta_upper(i,j) * dxdyh * 1./24
265 
266  vx = -1./dxh ; vy = 0./dyh
267  ux = 0. ; uy = 0.
268 
269  v_diagonal(i-1,j) = v_diagonal(i-1,j) + &
270  .5 * dxdyh * nu_upper(i,j) * ((uy+vx) * (-1./dxh) + (4*vy+2*ux) * (0./dyh))
271 
272  v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
273  beta_upper(i,j) * dxdyh * 1./24
274 
275  endif
276 
277  if (umask(i-1,j-1) .eq. 1) then ! this (bot left) is a degree of freedom node
278 
279  ux = -1./dxh ; uy = -1./dyh
280  vx = 0. ; vy = 0.
281 
282  u_diagonal(i-1,j-1) = u_diagonal(i-1,j-1) + &
283  .5 * dxdyh * nu_upper(i,j) * ((4*ux+2*vy) * (-1./dxh) + (uy+vy) * (-1./dyh))
284 
285  u_diagonal(i-1,j-1) = u_diagonal(i-1,j-1) + &
286  beta_lower(i,j) * dxdyh * 1./24
287 
288  vx = -1./dxh ; vy = -1./dyh
289  ux = 0. ; uy = 0.
290 
291  v_diagonal(i-1,j-1) = v_diagonal(i-1,j-1) + &
292  .5 * dxdyh * nu_upper(i,j) * ((uy+vx) * (-1./dxh) + (4*vy+2*ux) * (-1./dyh))
293 
294  v_diagonal(i-1,j-1) = v_diagonal(i-1,j-1) + &
295  beta_lower(i,j) * dxdyh * 1./24
296  endif
297 
298  if (umask(i,j) .eq. 1) then ! this (top right) is a degree of freedom node
299 
300  ux = 1./ dxh ; uy = 1./dyh
301  vx = 0. ; vy = 0.
302 
303  u_diagonal(i,j) = u_diagonal(i,j) + &
304  .5 * dxdyh * nu_upper(i,j) * ((4*ux+2*vy) * (1./dxh) + (uy+vy) * (1./dyh))
305 
306  u_diagonal(i,j) = u_diagonal(i,j) + &
307  beta_upper(i,j) * dxdyh * 1./24
308 
309  vx = 1./ dxh ; vy = 1./dyh
310  ux = 0. ; uy = 0.
311 
312  v_diagonal(i,j) = v_diagonal(i,j) + &
313  .5 * dxdyh * nu_upper(i,j) * ((uy+vx) * (1./dxh) + (4*vy+2*ux) * (1./dyh))
314 
315  v_diagonal(i,j) = v_diagonal(i,j) + &
316  beta_upper(i,j) * dxdyh * 1./24
317 
318  endif
319  endif ; enddo ; enddo
320 
Ocean grid type. See mom_grid for details.
Definition: MOM_grid.F90:19