192 type(ocean_grid_type),
intent(inout) :: g
193 type(verticalgrid_type),
intent(in) :: gv
195 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
196 intent(inout) :: u_in
198 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
199 intent(inout) :: v_in
201 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
202 intent(inout) :: h_in
205 type(thermo_var_ptrs),
intent(in) :: tv
207 type(vertvisc_type),
intent(inout) :: visc
210 type(time_type),
intent(in) :: time_local
212 real,
intent(in) :: dt
214 type(forcing),
intent(in) :: fluxes
217 real,
dimension(:,:),
pointer :: p_surf_begin
220 real,
dimension(:,:),
pointer :: p_surf_end
223 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
226 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
229 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
230 intent(inout) :: uhtr
233 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
234 intent(inout) :: vhtr
237 real,
dimension(SZI_(G),SZJ_(G)),
intent(out) :: eta_av
239 type(mom_dyn_unsplit_rk2_cs),
pointer :: cs
241 type(varmix_cs),
pointer :: varmix
244 type(meke_type),
pointer :: meke
278 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_av, hp
279 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: up
280 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: vp
281 real,
dimension(:,:),
pointer :: p_surf
284 logical :: dyn_p_surf
285 integer :: i, j, k, is, ie, js, je, isq, ieq, jsq, jeq, nz
286 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
287 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
290 h_av(:,:,:) = 0; hp(:,:,:) = 0
294 dyn_p_surf =
associated(p_surf_begin) .and.
associated(p_surf_end)
296 call safe_alloc_ptr(p_surf,g%isd,g%ied,g%jsd,g%jed) ; p_surf(:,:) = 0.0
298 p_surf => fluxes%p_surf
305 call mom_state_chksum(
"Start Predictor ", u_in, v_in, h_in, uh, vh, g, gv)
309 call enable_averaging(dt,time_local, cs%diag)
310 call cpu_clock_begin(id_clock_horvisc)
311 call horizontal_viscosity(u_in, v_in, h_in, cs%diffu, cs%diffv, meke, varmix, &
312 g, gv, cs%hor_visc_CSp)
313 call cpu_clock_end(id_clock_horvisc)
314 call disable_averaging(cs%diag)
315 call cpu_clock_begin(id_clock_pass)
316 call pass_vector(cs%diffu, cs%diffv, g%Domain)
317 call cpu_clock_end(id_clock_pass)
323 call cpu_clock_begin(id_clock_continuity)
326 call continuity(u_in, v_in, h_in, hp, uh, vh, dt_pred, g, gv, cs%continuity_CSp, &
328 call cpu_clock_end(id_clock_continuity)
329 call cpu_clock_begin(id_clock_pass)
330 call pass_var(hp, g%Domain)
331 call pass_vector(uh, vh, g%Domain)
332 call cpu_clock_end(id_clock_pass)
335 call cpu_clock_begin(id_clock_mom_update)
337 do j=js-2,je+2 ;
do i=is-2,ie+2
338 h_av(i,j,k) = (h_in(i,j,k) + hp(i,j,k)) * 0.5
339 enddo ;
enddo ;
enddo 340 call cpu_clock_end(id_clock_mom_update)
343 call cpu_clock_begin(id_clock_cor)
344 call coradcalc(u_in, v_in, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
345 g, gv, cs%CoriolisAdv_CSp)
346 call cpu_clock_end(id_clock_cor)
349 call cpu_clock_begin(id_clock_pres)
350 if (dyn_p_surf)
then ;
do j=js-2,je+2 ;
do i=is-2,ie+2
351 p_surf(i,j) = 0.5*p_surf_begin(i,j) + 0.5*p_surf_end(i,j)
352 enddo ;
enddo ;
endif 353 call pressureforce(h_in, tv, cs%PFu, cs%PFv, g, gv, &
354 cs%PressureForce_CSp, cs%ALE_CSp, p_surf)
355 call cpu_clock_end(id_clock_pres)
356 call cpu_clock_begin(id_clock_pass)
357 call pass_vector(cs%PFu, cs%PFv, g%Domain)
358 call pass_vector(cs%CAu, cs%CAv, g%Domain)
359 call cpu_clock_end(id_clock_pass)
361 if (
associated(cs%OBC)) then;
if (cs%OBC%update_OBC)
then 362 call update_obc_data(cs%OBC, g, gv, tv, h_in, cs%update_OBC_CSp, time_local)
364 if (
associated(cs%OBC))
then 365 call open_boundary_zero_normal_flow(cs%OBC, g, cs%PFu, cs%PFv)
366 call open_boundary_zero_normal_flow(cs%OBC, g, cs%CAu, cs%CAv)
367 call open_boundary_zero_normal_flow(cs%OBC, g, cs%diffu, cs%diffv)
371 call cpu_clock_begin(id_clock_mom_update)
372 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
373 up(i,j,k) = g%mask2dCu(i,j) * (u_in(i,j,k) + dt_pred * &
374 ((cs%PFu(i,j,k) + cs%CAu(i,j,k)) + cs%diffu(i,j,k)))
375 enddo ;
enddo ;
enddo 376 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
377 vp(i,j,k) = g%mask2dCv(i,j) * (v_in(i,j,k) + dt_pred * &
378 ((cs%PFv(i,j,k) + cs%CAv(i,j,k)) + cs%diffv(i,j,k)))
379 enddo ;
enddo ;
enddo 380 call cpu_clock_end(id_clock_mom_update)
383 call mom_accel_chksum(
"Predictor 1 accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv,&
384 cs%diffu, cs%diffv, g, gv)
387 call cpu_clock_begin(id_clock_vertvisc)
388 call enable_averaging(dt, time_local, cs%diag)
389 call set_viscous_ml(up, vp, h_av, tv, fluxes, visc, dt_pred, g, gv, &
391 call disable_averaging(cs%diag)
392 call vertvisc_coef(up, vp, h_av, fluxes, visc, dt_pred, g, gv, &
393 cs%vertvisc_CSp, cs%OBC)
394 call vertvisc(up, vp, h_av, fluxes, visc, dt_pred, cs%OBC, cs%ADp, cs%CDp, &
395 g, gv, cs%vertvisc_CSp)
396 call cpu_clock_end(id_clock_vertvisc)
397 call cpu_clock_begin(id_clock_pass)
398 call pass_vector(up, vp, g%Domain)
399 call cpu_clock_end(id_clock_pass)
403 call cpu_clock_begin(id_clock_continuity)
404 call continuity(up, vp, h_in, hp, uh, vh, &
405 dt, g, gv, cs%continuity_CSp, obc=cs%OBC)
406 call cpu_clock_end(id_clock_continuity)
407 call cpu_clock_begin(id_clock_pass)
408 call pass_var(hp, g%Domain)
409 call pass_vector(uh, vh, g%Domain)
410 call cpu_clock_end(id_clock_pass)
413 do k=1,nz ;
do j=js-2,je+2 ;
do i=is-2,ie+2
414 h_av(i,j,k) = (h_in(i,j,k) + hp(i,j,k)) * 0.5
415 enddo ;
enddo ;
enddo 418 call mom_state_chksum(
"Predictor 1", up, vp, h_av, uh, vh, g, gv)
421 call cpu_clock_begin(id_clock_cor)
422 call coradcalc(up, vp, h_av, uh, vh, cs%CAu, cs%CAv, cs%OBC, cs%ADp, &
423 g, gv, cs%CoriolisAdv_CSp)
424 call cpu_clock_end(id_clock_cor)
425 if (
associated(cs%OBC))
then 426 call open_boundary_zero_normal_flow(cs%OBC, g, cs%CAu, cs%CAv)
433 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
434 up(i,j,k) = g%mask2dCu(i,j) * (u_in(i,j,k) + dt * (1.+cs%begw) * &
435 ((cs%PFu(i,j,k) + cs%CAu(i,j,k)) + cs%diffu(i,j,k)))
436 u_in(i,j,k) = g%mask2dCu(i,j) * (u_in(i,j,k) + dt * &
437 ((cs%PFu(i,j,k) + cs%CAu(i,j,k)) + cs%diffu(i,j,k)))
438 enddo ;
enddo ;
enddo 439 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
440 vp(i,j,k) = g%mask2dCv(i,j) * (v_in(i,j,k) + dt * (1.+cs%begw) * &
441 ((cs%PFv(i,j,k) + cs%CAv(i,j,k)) + cs%diffv(i,j,k)))
442 v_in(i,j,k) = g%mask2dCv(i,j) * (v_in(i,j,k) + dt * &
443 ((cs%PFv(i,j,k) + cs%CAv(i,j,k)) + cs%diffv(i,j,k)))
444 enddo ;
enddo ;
enddo 448 call cpu_clock_begin(id_clock_vertvisc)
449 call vertvisc_coef(up, vp, h_av, fluxes, visc, dt, g, gv, &
450 cs%vertvisc_CSp, cs%OBC)
451 call vertvisc(up, vp, h_av, fluxes, visc, dt, cs%OBC, cs%ADp, cs%CDp, &
452 g, gv, cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot)
453 call vertvisc_coef(u_in, v_in, h_av, fluxes, visc, dt, g, gv, &
454 cs%vertvisc_CSp, cs%OBC)
455 call vertvisc(u_in, v_in, h_av, fluxes, visc, dt, cs%OBC, cs%ADp, cs%CDp,&
456 g, gv, cs%vertvisc_CSp, cs%taux_bot, cs%tauy_bot)
457 call cpu_clock_end(id_clock_vertvisc)
458 call cpu_clock_begin(id_clock_pass)
459 call pass_vector(up, vp, g%Domain)
460 call pass_vector(u_in, v_in, g%Domain)
461 call cpu_clock_end(id_clock_pass)
465 call cpu_clock_begin(id_clock_continuity)
466 call continuity(up, vp, h_in, h_in, uh, vh, &
467 dt, g, gv, cs%continuity_CSp, obc=cs%OBC)
468 call cpu_clock_end(id_clock_continuity)
469 call cpu_clock_begin(id_clock_pass)
470 call pass_var(h_in, g%Domain)
471 call pass_vector(uh, vh, g%Domain)
472 call cpu_clock_end(id_clock_pass)
476 do j=js-2,je+2 ;
do i=isq-2,ieq+2
477 uhtr(i,j,k) = uhtr(i,j,k) + dt*uh(i,j,k)
479 do j=jsq-2,jeq+2 ;
do i=is-2,ie+2
480 vhtr(i,j,k) = vhtr(i,j,k) + dt*vh(i,j,k)
485 call mom_state_chksum(
"Corrector", u_in, v_in, h_in, uh, vh, g, gv)
486 call mom_accel_chksum(
"Corrector accel", cs%CAu, cs%CAv, cs%PFu, cs%PFv, &
487 cs%diffu, cs%diffv, g, gv)
490 if (gv%Boussinesq)
then 491 do j=js,je ;
do i=is,ie ; eta_av(i,j) = -g%bathyT(i,j) ;
enddo ;
enddo 493 do j=js,je ;
do i=is,ie ; eta_av(i,j) = 0.0 ;
enddo ;
enddo 495 do k=1,nz ;
do j=js,je ;
do i=is,ie
496 eta_av(i,j) = eta_av(i,j) + h_av(i,j,k)
497 enddo ;
enddo ;
enddo 499 if (dyn_p_surf)
deallocate(p_surf)
503 if (cs%id_PFu > 0)
call post_data(cs%id_PFu, cs%PFu, cs%diag)
504 if (cs%id_PFv > 0)
call post_data(cs%id_PFv, cs%PFv, cs%diag)
505 if (cs%id_CAu > 0)
call post_data(cs%id_CAu, cs%CAu, cs%diag)
506 if (cs%id_CAv > 0)
call post_data(cs%id_CAv, cs%CAv, cs%diag)
509 if (cs%id_uh > 0)
call post_data(cs%id_uh, uh, cs%diag)
510 if (cs%id_vh > 0)
call post_data(cs%id_vh, vh, cs%diag)