10 implicit none ;
private 12 #include <MOM_memory.h> 17 character(len=128) :: restart_output_dir =
' ' 18 real,
pointer,
dimension(:,:) :: &
19 mass_shelf => null(), &
20 area_shelf_h => null(), &
24 salt_flux => null(), &
28 exch_vel_t => null(), &
29 exch_vel_s => null(), &
32 tflux_shelf => null(), &
51 u_face_mask => null(), v_face_mask => null(), &
57 umask => null(), vmask => null(), &
60 ice_visc_bilinear => null(), &
61 ice_visc_lower_tri => null(), &
62 ice_visc_upper_tri => null(), &
63 thickness_boundary_values => null(), &
64 u_boundary_values => null(), &
65 v_boundary_values => null(), &
68 taub_beta_eff_bilinear => null(), &
70 taub_beta_eff_lower_tri => null(), &
71 taub_beta_eff_upper_tri => null(), &
73 od_rt => null(), float_frac_rt => null(), &
74 od_av => null(), float_frac => null()
105 real :: a_glen_isothermal
108 real :: c_basal_friction
109 real :: n_basal_friction
110 real :: density_ocean_avg
113 real :: thresh_float_col_depth
115 real :: input_thickness
120 real :: velocity_update_time_step
125 integer :: velocity_update_sub_counter
126 integer :: velocity_update_counter
127 integer :: nstep_velocity
129 real :: cg_tolerance, nonlinear_tolerance
130 integer :: cg_max_iterations
131 integer :: nonlin_solve_err_mode
138 type(time_type) :: time
142 logical :: shelf_mass_is_dynamic
144 logical :: override_shelf_movement
150 integer :: id_melt = -1, id_exch_vel_s = -1, id_exch_vel_t = -1, &
151 id_tfreeze = -1, id_tfl_shelf = -1, &
152 id_u_shelf = -1, id_v_shelf = -1, id_h_shelf = -1, id_h_mask = -1, &
153 id_u_mask = -1, id_v_mask = -1, &
154 id_surf_elev = -1, id_bathym = -1, id_float_frac = -1, id_col_thick = -1, &
155 id_area_shelf_h = -1, id_od_rt = -1, id_float_frac_rt = -1
160 logical :: write_output_to_file
167 real,
dimension (:,:),
intent(inout) :: u_diagonal, v_diagonal
171 real,
pointer,
dimension (:,:) :: umask, vmask, &
172 nu_lower, nu_upper, beta_lower, beta_upper, hmask
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
186 isc = g%isc ; jsc = g%jsc ; iec = g%iec ; jec = g%jec
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
192 do i=isc-1,iec+1 ;
do j=jsc-1,jec+1 ;
if (hmask(i,j) .eq. 1)
then 197 if (umask(i,j-1) .eq. 1)
then 199 ux = 1./dxh ; uy = 0./dyh
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))
205 u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
206 beta_lower(i,j) * dxdyh * 1./24
209 vx = 1./dxh ; vy = 0./dyh
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))
214 v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
215 beta_lower(i,j) * dxdyh * 1./24
217 ux = 0./dxh ; uy = -1./dyh
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))
223 u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
224 beta_upper(i,j) * dxdyh * 1./24
226 vx = 0./dxh ; vy = -1./dyh
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))
232 v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
233 beta_upper(i,j) * dxdyh * 1./24
237 if (umask(i-1,j) .eq. 1)
then 239 ux = 0./dxh ; uy = 1./dyh
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))
245 u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
246 beta_lower(i,j) * dxdyh * 1./24
249 vx = 0./dxh ; vy = 1./dyh
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))
254 v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
255 beta_lower(i,j) * dxdyh * 1./24
257 ux = -1./dxh ; uy = 0./dyh
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))
263 u_diagonal(i,j-1) = u_diagonal(i,j-1) + &
264 beta_upper(i,j) * dxdyh * 1./24
266 vx = -1./dxh ; vy = 0./dyh
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))
272 v_diagonal(i,j-1) = v_diagonal(i,j-1) + &
273 beta_upper(i,j) * dxdyh * 1./24
277 if (umask(i-1,j-1) .eq. 1)
then 279 ux = -1./dxh ; uy = -1./dyh
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))
285 u_diagonal(i-1,j-1) = u_diagonal(i-1,j-1) + &
286 beta_lower(i,j) * dxdyh * 1./24
288 vx = -1./dxh ; vy = -1./dyh
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))
294 v_diagonal(i-1,j-1) = v_diagonal(i-1,j-1) + &
295 beta_lower(i,j) * dxdyh * 1./24
298 if (umask(i,j) .eq. 1)
then 300 ux = 1./ dxh ; uy = 1./dyh
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))
306 u_diagonal(i,j) = u_diagonal(i,j) + &
307 beta_upper(i,j) * dxdyh * 1./24
309 vx = 1./ dxh ; vy = 1./dyh
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))
315 v_diagonal(i,j) = v_diagonal(i,j) + &
316 beta_upper(i,j) * dxdyh * 1./24
319 endif ;
enddo ;
enddo
Ocean grid type. See mom_grid for details.
Provides the ocean grid type.
Provides subroutines for quantities specific to the equation of state.
subroutine matrix_diagonal_triangle(CS, u_diagonal, v_diagonal)
subroutine, public restart_init(param_file, CS, restart_root)
subroutine, public restore_state(filename, directory, day, G, CS)
A control structure for the equation of state.