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
MODULE icecor
!!======================================================================
!! *** MODULE icecor ***
!! sea-ice: Corrections on sea-ice variables at the end of the time step
!!======================================================================
!! History : 3.0 ! 2006-04 (M. Vancoppenolle) Original code
!! 3.5 ! 2014-06 (C. Rousset) Complete rewriting/cleaning
!! 4.0 ! 2018 (many people) SI3 [aka Sea Ice cube]
!!----------------------------------------------------------------------
#if defined key_si3
!!----------------------------------------------------------------------
!! 'key_si3' SI3 sea-ice model
!!----------------------------------------------------------------------
!! ice_cor : corrections on sea-ice variables
!!----------------------------------------------------------------------
USE dom_oce ! ocean domain
USE phycst ! physical constants
USE ice ! sea-ice: variable
USE ice1D ! sea-ice: thermodynamic variables
USE iceitd ! sea-ice: rebining
USE icevar ! sea-ice: operations
USE icectl ! sea-ice: control prints
!
USE in_out_manager ! I/O manager
USE iom ! I/O manager library
USE lib_mpp ! MPP library
USE lib_fortran ! fortran utilities (glob_sum + no signed zero)
USE lbclnk ! lateral boundary conditions (or mpp links)
USE timing ! Timing
IMPLICIT NONE
PRIVATE
PUBLIC ice_cor ! called by icestp.F90
!! * Substitutions
# include "do_loop_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/ICE 4.0 , NEMO Consortium (2018)
!! $Id: icecor.F90 15334 2021-10-05 21:18:34Z clem $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE ice_cor( kt, kn )
!!----------------------------------------------------------------------
!! *** ROUTINE ice_cor ***
!!
!! ** Purpose : Computes corrections on sea-ice global variables at
!! the end of the dynamics (kn=1) and thermodynamics (kn=2)
!!----------------------------------------------------------------------
INTEGER, INTENT(in) :: kt ! number of iteration
INTEGER, INTENT(in) :: kn ! 1 = after dyn ; 2 = after thermo
!
INTEGER :: ji, jj, jl ! dummy loop indices
REAL(wp) :: zsal, zzc
!!----------------------------------------------------------------------
! controls
IF( ln_timing ) CALL timing_start('icecor') ! timing
IF( ln_icediachk ) CALL ice_cons_hsm(0, 'icecor', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
IF( ln_icediachk ) CALL ice_cons2D (0, 'icecor', diag_v, diag_s, diag_t, diag_fv, diag_fs, diag_ft) ! conservation
!
IF( kt == nit000 .AND. lwp .AND. kn == 2 ) THEN
WRITE(numout,*)
WRITE(numout,*) 'ice_cor: correct sea ice variables if out of bounds '
WRITE(numout,*) '~~~~~~~'
ENDIF
! !-----------------------------------------------------
! ! ice thickness must exceed himin (for temp. diff.) !
! !-----------------------------------------------------
WHERE( a_i(:,:,:) >= epsi20 ) ; h_i(:,:,:) = v_i(:,:,:) / a_i(:,:,:)
ELSEWHERE ; h_i(:,:,:) = 0._wp
END WHERE
WHERE( h_i(:,:,:) < rn_himin ) a_i(:,:,:) = a_i(:,:,:) * h_i(:,:,:) / rn_himin
!
! !-----------------------------------------------------
! ! ice concentration should not exceed amax !
! !-----------------------------------------------------
at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
DO jl = 1, jpl
WHERE( at_i(:,:) > rn_amax_2d(:,:) ) a_i(:,:,jl) = a_i(:,:,jl) * rn_amax_2d(:,:) / at_i(:,:)
END DO
! !-----------------------------------------------------
! ! Rebin categories with thickness out of bounds !
! !-----------------------------------------------------
IF ( jpl > 1 ) CALL ice_itd_reb( kt )
!
! !-----------------------------------------------------
IF ( nn_icesal == 2 ) THEN ! salinity must stay in bounds [Simin,Simax] !
! !-----------------------------------------------------
zzc = rhoi * r1_Dt_ice
DO jl = 1, jpl
DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
zsal = sv_i(ji,jj,jl)
sv_i(ji,jj,jl) = MIN( MAX( rn_simin*v_i(ji,jj,jl) , sv_i(ji,jj,jl) ) , rn_simax*v_i(ji,jj,jl) )
IF( kn /= 0 ) & ! no ice-ocean exchanges if kn=0 (for bdy for instance) otherwise conservation diags will fail
& sfx_res(ji,jj) = sfx_res(ji,jj) - ( sv_i(ji,jj,jl) - zsal ) * zzc ! associated salt flux
END_2D
END DO
ENDIF
!
IF( kn /= 0 ) THEN ! no zapsmall if kn=0 (for bdy for instance) because we do not want ice-ocean exchanges (wfx,sfx,hfx)
! otherwise conservation diags will fail
! !-----------------------------------------------------
CALL ice_var_zapsmall ! Zap small values !
! !-----------------------------------------------------
ENDIF
!
! controls
IF( sn_cfctl%l_prtctl ) &
& CALL ice_prt3D ('icecor') ! prints
IF( ln_icectl .AND. kn == 2 ) &
& CALL ice_prt ( kt, iiceprt, jiceprt, 2, ' - Final state - ' ) ! prints
IF( ln_icediachk ) CALL ice_cons_hsm(1, 'icecor', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
IF( ln_icediachk ) CALL ice_cons2D (1, 'icecor', diag_v, diag_s, diag_t, diag_fv, diag_fs, diag_ft) ! conservation
IF( ln_timing ) CALL timing_stop ('icecor') ! timing
!
END SUBROUTINE ice_cor
#else
!!----------------------------------------------------------------------
!! Default option Dummy module NO SI3 sea-ice model
!!----------------------------------------------------------------------
#endif
!!======================================================================
END MODULE icecor