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.
limhdf.F90 in tags/nemo_v1_04/NEMO/LIM_SRC – NEMO

source: tags/nemo_v1_04/NEMO/LIM_SRC/limhdf.F90 @ 9353

Last change on this file since 9353 was 258, checked in by opalod, 19 years ago

nemo_v1_update_004 : CT : Integration of the control print option for debugging work

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1MODULE limhdf
2   !!======================================================================
3   !!                    ***  MODULE limhdf   ***
4   !! LIM ice model : horizontal diffusion of sea-ice quantities
5   !!======================================================================
6#if defined key_ice_lim
7   !!----------------------------------------------------------------------
8   !!   'key_ice_lim'                                     LIM sea-ice model
9   !!----------------------------------------------------------------------
10   !!   lim_hdf  : diffusion trend on sea-ice variable
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE dom_oce
14   USE ice_oce         ! ice variables
15   USE in_out_manager
16   USE ice
17!  USE limdyn
18   USE lbclnk
19   USE lib_mpp
20   USE prtctl          ! Print control
21
22   IMPLICIT NONE
23   PRIVATE
24
25   !! * Routine accessibility
26   PUBLIC lim_hdf    ! called by lim_tra
27
28   !! * Module variables
29   LOGICAL  ::   linit = .TRUE.              ! ???
30   REAL(wp) ::   epsi04 = 1e-04              ! constant
31   REAL(wp), DIMENSION(jpi,jpj) ::   zfact   ! ???
32
33   !! * Substitution
34#  include "vectopt_loop_substitute.h90"
35   !!----------------------------------------------------------------------
36   !!   LIM 2.0,  UCL-LOCEAN-IPSL (2005)
37   !! $Header$
38   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
39   !!----------------------------------------------------------------------
40
41CONTAINS
42
43   SUBROUTINE lim_hdf( ptab )
44      !!-------------------------------------------------------------------
45      !!                  ***  ROUTINE lim_hdf  ***
46      !!
47      !! ** purpose :   Compute and add the diffusive trend on sea-ice
48      !!      variables
49      !!
50      !! ** method  :   Second order diffusive operator evaluated using a
51      !!      Cranck-Nicholson time Scheme.
52      !!
53      !! ** Action  :    update ptab with the diffusive contribution
54      !!
55      !! History :
56      !!        !  00-01 (LIM) Original code
57      !!        !  01-05 (G. Madec, R. Hordoir) opa norm
58      !!        !  02-08 (C. Ethe)  F90, free form
59      !!-------------------------------------------------------------------
60      ! * Arguments
61      REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) ::   &
62         ptab                 ! Field on which the diffusion is applied 
63      REAL(wp), DIMENSION(jpi,jpj) ::   &
64         ptab0                ! ???
65
66      ! * Local variables
67      INTEGER ::  ji, jj      ! dummy loop indices
68      INTEGER ::  &
69         its, iter            ! temporary integers
70      CHARACTER (len=55) :: charout
71      REAL(wp) ::  &
72         zalfa, zrlxint, zconv, zeps   ! temporary scalars
73      REAL(wp), DIMENSION(jpi,jpj) ::  & 
74         zrlx, zflu, zflv, &  ! temporary workspaces
75         zdiv0, zdiv          !    "           "
76      !!-------------------------------------------------------------------
77
78      ! Initialisation
79      ! ---------------   
80      ! Time integration parameters
81      zalfa = 0.5       ! =1.0/0.5/0.0 = implicit/Cranck-Nicholson/explicit
82      its   = 100       ! Maximum number of iteration
83      zeps  =  2. * epsi04
84
85      ! Arrays initialization
86      ptab0 (:, : ) = ptab(:,:)
87!bug  zflu (:,jpj) = 0.e0
88!bug  zflv (:,jpj) = 0.e0
89      zdiv0(:, 1 ) = 0.e0
90      zdiv0(:,jpj) = 0.e0
91      IF( .NOT.lk_vopt_loop ) THEN
92         zflu (jpi,:) = 0.e0   
93         zflv (jpi,:) = 0.e0
94         zdiv0(1,  :) = 0.e0
95         zdiv0(jpi,:) = 0.e0
96      ENDIF
97
98      ! Metric coefficient (compute at the first call and saved in
99      IF( linit ) THEN
100         DO jj = 2, jpjm1 
101            DO ji = fs_2 , fs_jpim1   ! vector opt.
102               zfact(ji,jj) = ( e2u(ji,jj) + e2u(ji-1,jj  ) + e1v(ji,jj) + e1v(ji,jj-1) ) &
103                  &          / ( e1t(ji,jj) * e2t(ji,jj) )
104            END DO
105         END DO
106         linit = .FALSE.
107      ENDIF
108
109
110      ! Sub-time step loop
111      zconv = 1.e0
112      iter  = 0
113
114      !                                                   !===================
115      DO WHILE ( ( zconv > zeps ) .AND. (iter <= its) )   ! Sub-time step loop
116         !                                                !===================
117         ! incrementation of the sub-time step number
118         iter = iter + 1
119
120         ! diffusive fluxes in U- and V- direction
121         DO jj = 1, jpjm1
122            DO ji = 1 , fs_jpim1   ! vector opt.
123               zflu(ji,jj) = pahu(ji,jj) * e2u(ji,jj) / e1u(ji,jj) * ( ptab(ji+1,jj) - ptab(ji,jj) )
124               zflv(ji,jj) = pahv(ji,jj) * e1v(ji,jj) / e2v(ji,jj) * ( ptab(ji,jj+1) - ptab(ji,jj) )
125            END DO
126         END DO
127
128         ! diffusive trend : divergence of the fluxes
129         DO jj= 2, jpjm1
130            DO ji = fs_2 , fs_jpim1   ! vector opt.
131               zdiv (ji,jj) = (  zflu(ji,jj) - zflu(ji-1,jj  )   &
132                  &            + zflv(ji,jj) - zflv(ji  ,jj-1)  ) / ( e1t (ji,jj) * e2t (ji,jj) )
133            END DO
134         END DO
135
136         ! save the first evaluation of the diffusive trend in zdiv0
137         IF( iter == 1 )   zdiv0(:,:) = zdiv(:,:)       
138
139         ! XXXX iterative evaluation?????
140         DO jj = 2, jpjm1
141            DO ji = fs_2 , fs_jpim1   ! vector opt.
142               zrlxint = (   ptab0(ji,jj)    &
143                  &       +  rdt_ice * (           zalfa   * ( zdiv(ji,jj) + zfact(ji,jj) * ptab(ji,jj) )   &
144                  &                      + ( 1.0 - zalfa ) *   zdiv0(ji,jj) )  )                             & 
145                  &    / ( 1.0 + zalfa * rdt_ice * zfact(ji,jj) )
146               zrlx(ji,jj) = ptab(ji,jj) + om * ( zrlxint - ptab(ji,jj) )
147            END DO
148         END DO
149
150         ! convergence test
151         zconv = 0.e0
152         DO jj = 2, jpjm1
153            DO ji = 2, jpim1
154               zconv = MAX( zconv, ABS( zrlx(ji,jj) - ptab(ji,jj) )  )
155            END DO
156         END DO
157         IF( lk_mpp )   CALL mpp_max( zconv )   ! max over the global domain
158
159         DO jj = 2, jpjm1
160            DO ji = 2 , jpim1
161               ptab(ji,jj) = zrlx(ji,jj)
162            END DO
163         END DO
164
165         ! lateral boundary condition on ptab
166         CALL lbc_lnk( ptab, 'T', 1. )
167         !                                         !==========================
168      END DO                                       ! end of sub-time step loop
169      !                                            !==========================
170
171      ptab(:,:) = ptab(:,:)
172      IF(ln_ctl)   THEN
173         zrlx(:,:) = ptab(:,:) - ptab0(:,:)
174         WRITE(charout,FMT="(' lim_hdf  : zconv =',D23.16, ' iter =',I4,2X)") zconv, iter
175         CALL prt_ctl(tab2d_1=zrlx, clinfo1=charout)
176      ENDIF
177
178   END SUBROUTINE lim_hdf
179
180#else
181   !!----------------------------------------------------------------------
182   !!   Default option          Dummy module           NO LIM sea-ice model
183   !!----------------------------------------------------------------------
184CONTAINS
185   SUBROUTINE lim_hdf         ! Empty routine
186   END SUBROUTINE lim_hdf
187#endif
188
189   !!======================================================================
190END MODULE limhdf
Note: See TracBrowser for help on using the repository browser.