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.
isfdynatf.F90 in NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/OCE/ISF – NEMO

source: NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/OCE/ISF/isfdynatf.F90 @ 14219

Last change on this file since 14219 was 14219, checked in by mcastril, 4 years ago

Add Mixed Precision support by Oriol Tintó

File size: 4.3 KB
Line 
1MODULE isfdynatf
2   !!=========================================================================
3   !!                       ***  MODULE  isfnxt  ***
4   !! Ice shelf update: compute the dynatf ice shelf contribution
5   !!=========================================================================
6   !! History :  OPA  !  2019-09  (P. Mathiot)  Original code
7   !!-------------------------------------------------------------------------
8 
9   !!-------------------------------------------------------------------------
10   !!   isfnxt       : apply correction needed for the ice shelf to ensure conservation
11   !!-------------------------------------------------------------------------
12
13   USE isf_oce
14
15   USE phycst , ONLY: r1_rho0         ! physical constant
16   USE dom_oce                        ! time and space domain
17   USE oce, ONLY : ssh                ! sea-surface height for qco substitution
18
19   USE in_out_manager
20
21   IMPLICIT NONE
22
23   PRIVATE
24
25   PUBLIC isf_dynatf
26   !! * Substitutions
27#  include "do_loop_substitute.h90"
28#  include "domzgr_substitute.h90"
29#  include "single_precision_substitute.h90"
30
31CONTAINS
32
33   SUBROUTINE isf_dynatf ( kt, Kmm, pe3t_f, pcoef )
34      !!--------------------------------------------------------------------
35      !!                  ***  ROUTINE isf_dynatf  ***
36      !!
37      !! ** Purpose : compute the ice shelf volume filter correction for cavity, param, ice sheet coupling case
38      !!
39      !!-------------------------- OUT -------------------------------------
40      INTEGER                         , INTENT(in   ) :: kt       ! ocean time step
41      INTEGER                         , INTENT(in   ) :: Kmm      ! ocean time level index
42      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pe3t_f   ! time filtered scale factor to be corrected
43      !
44      REAL(wp)                        , INTENT(in   ) :: pcoef    ! rn_atfp * rn_Dt * r1_rho0
45      !!--------------------------------------------------------------------
46      INTEGER :: jk  ! loop index
47      !!--------------------------------------------------------------------
48      !
49      ! ice shelf cavity
50      IF ( ln_isfcav_mlt ) CALL isf_dynatf_mlt(Kmm, pe3t_f, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, fwfisf_cav_b, pcoef)
51      !
52      ! ice shelf parametrised
53      IF ( ln_isfpar_mlt ) CALL isf_dynatf_mlt(Kmm, pe3t_f, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, pcoef)
54      !
55      IF ( ln_isfcpl .AND. ln_rstart .AND. kt == nit000+1 ) THEN
56         DO jk = 1, jpkm1
57            pe3t_f(:,:,jk) =   pe3t_f(:,:,jk) - pcoef * risfcpl_vol(:,:,jk) * r1_e1e2t(:,:)
58         END DO
59      END IF
60      !
61   END SUBROUTINE isf_dynatf
62
63   SUBROUTINE isf_dynatf_mlt ( Kmm, pe3t_f, ktop, kbot, phtbl, pfrac, pfwf, pfwf_b, pcoef )
64      !!--------------------------------------------------------------------
65      !!                  ***  ROUTINE isf_dynatf_mlt  ***
66      !!
67      !! ** Purpose : compute the ice shelf volume filter correction for cavity or param
68      !!
69      !!-------------------------- IN  -------------------------------------
70      INTEGER                         , INTENT(in   ) :: Kmm             ! ocean time level index
71      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pe3t_f          ! time-filtered scale factor to be corrected
72      INTEGER , DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop , kbot     ! top and bottom level of tbl
73      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfrac, phtbl    ! fraction of bottom cell included in tbl, tbl thickness
74      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfwf , pfwf_b   ! now/before fwf
75      REAL(wp),                         INTENT(in   ) :: pcoef           ! rn_atfp * rn_Dt * r1_rho0
76      !!----------------------------------------------------------------------
77      INTEGER :: ji,jj,jk
78      REAL(wp), DIMENSION(jpi,jpj) :: zfwfinc
79      !!----------------------------------------------------------------------
80      !
81      ! compute fwf conservation correction
82      zfwfinc(:,:) = pcoef * ( pfwf_b(:,:) - pfwf(:,:) ) / ( ht(:,:) + 1._wp - ssmask(:,:) ) * r1_rho0
83      !
84      ! add the increment
85      DO jk = 1, jpkm1
86         pe3t_f(:,:,jk) = pe3t_f(:,:,jk) - tmask(:,:,jk) * zfwfinc(:,:)   &
87            &                              * e3t(:,:,jk,Kmm)
88      END DO
89      !
90   END SUBROUTINE isf_dynatf_mlt
91
92END MODULE isfdynatf
Note: See TracBrowser for help on using the repository browser.