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.
limmsh_2.F90 in trunk/NEMOGCM/NEMO/LIM_SRC_2 – NEMO

source: trunk/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90 @ 2790

Last change on this file since 2790 was 2715, checked in by rblod, 13 years ago

First attempt to put dynamic allocation on the trunk

  • Property svn:keywords set to Id
File size: 12.3 KB
RevLine 
[821]1MODULE limmsh_2
[3]2   !!======================================================================
[821]3   !!                     ***  MODULE  limmsh_2  ***
4   !! LIM 2.0 ice model :   definition of the ice mesh parameters
[3]5   !!======================================================================
[2528]6   !! History :   -   ! 2001-04 (LIM) original code
7   !!            1.0  ! 2002-08 (C. Ethe, G. Madec) F90, module
8   !!            3.3  ! 2009-05 (G. Garric, C. Bricaud) addition of the lim2_evp case
9   !!----------------------------------------------------------------------
[821]10#if defined key_lim2
[3]11   !!----------------------------------------------------------------------
[821]12   !!   'key_lim2'                                     LIM 2.0sea-ice model
[58]13   !!----------------------------------------------------------------------
[821]14   !!   lim_msh_2   : definition of the ice mesh
[3]15   !!----------------------------------------------------------------------
16   USE phycst
17   USE dom_oce
[821]18   USE dom_ice_2
[3]19   USE lbclnk
[58]20   USE in_out_manager
[2715]21   USE lib_mpp          ! MPP library
[3]22
23   IMPLICIT NONE
24   PRIVATE
25
[821]26   PUBLIC lim_msh_2      ! routine called by ice_ini_2.F90
[3]27
28   !!----------------------------------------------------------------------
[2528]29   !! NEMO/LIM2 3.3 , UCL - NEMO Consortium (2010)
[1156]30   !! $Id$
[2528]31   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]32   !!----------------------------------------------------------------------
33CONTAINS
34
[821]35   SUBROUTINE lim_msh_2
[3]36      !!-------------------------------------------------------------------
[821]37      !!                  ***  ROUTINE lim_msh_2  ***
[3]38      !!             
39      !! ** Purpose : Definition of the charact. of the numerical grid
40      !!       
41      !! ** Action  : - Initialisation of some variables
42      !!              - Definition of some constants linked with the grid
43      !!              - Definition of the metric coef. for the sea/ice
44      !!              - Initialization of the ice masks (tmsk, umsk)
45      !!
46      !! ** Refer.  : Deleersnijder et al. Ocean Modelling 100, 7-10
47      !!---------------------------------------------------------------------
[2715]48      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
49      USE wrk_nemo, ONLY: zd2d1 => wrk_2d_1, zd1d2 => wrk_2d_2
[12]50      INTEGER :: ji, jj      ! dummy loop indices
[2528]51      REAL(wp) ::   zusden   ! local scalars
52#if defined key_lim2_vp
53      REAL(wp) ::   zusden2           ! local scalars
54      REAL(wp) ::   zh1p  , zh2p      !   -      -
55      REAL(wp) ::   zd2d1p, zd1d2p    !   -      -
56#endif
[3]57      !!---------------------------------------------------------------------
[58]58
[2715]59      IF( wrk_in_use(2, 1,2) ) THEN
60         CALL ctl_stop('lim_msh_2 : requested workspace arrays unavailable')   ;   RETURN
61      ENDIF
62
[58]63      IF(lwp) THEN
64         WRITE(numout,*)
[821]65         WRITE(numout,*) 'lim_msh_2 : LIM 2.0 sea-ice model, mesh initialization'
66         WRITE(numout,*) '~~~~~~~~~'
[58]67      ENDIF
[3]68     
[1923]69      IF( jphgr_msh == 2 .OR. jphgr_msh == 3 .OR. jphgr_msh == 5 )   &
70          &      CALL ctl_stop(' Coriolis parameter in LIM not set for f- or beta-plane' )
71
[3]72      !----------------------------------------------------------                         
73      !    Initialization of local and some global (common) variables
74      !------------------------------------------------------------------
75     
[58]76      njeq   = INT( jpj / 2 )   !i bug mpp potentiel
77      njeqm1 = njeq - 1 
[3]78
[2528]79      fcor(:,:) = 2. * omega * SIN( gphit(:,:) * rad )   !  coriolis factor at T-point
[3]80 
[58]81!i    DO jj = 1, jpj
82!i       zmsk(jj) = SUM( tmask(:,jj,:) )   ! = 0          if land  everywhere on a j-line
83!!ii     write(numout,*) jj, zind(jj)
84!i    END DO
[3]85
[58]86      IF( fcor(1,1) * fcor(1,nlcj) < 0.e0 ) THEN   ! local domain include both hemisphere
87         l_jeq = .TRUE.
88         njeq  = 1
89         DO WHILE ( njeq <= jpj .AND. fcor(1,njeq) < 0.e0 )
90            njeq = njeq + 1
91         END DO
92         IF(lwp ) WRITE(numout,*) '          the equator is inside the domain at about njeq = ', njeq
93      ELSEIF( fcor(1,1) < 0.e0 ) THEN
94         l_jeq = .FALSE.
[192]95         njeq = jpj
[58]96         IF(lwp ) WRITE(numout,*) '          the model domain is entirely in the southern hemisphere: njeq = ', njeq
97      ELSE
98         l_jeq = .FALSE.
[192]99         njeq = 2
[58]100         IF(lwp ) WRITE(numout,*) '          the model domain is entirely in the northern hemisphere: njeq = ', njeq
101      ENDIF
102
103      njeqm1 = njeq - 1
104
105
[3]106      !   For each grid, definition of geometric tables
107      !------------------------------------------------------------------
108     
109      !-------------------
[58]110      ! Conventions :    !
[3]111      !-------------------
112      !  indices 1 \ 2 <-> localisation in the 2 direction x \ y
113      !  3rd indice <-> localisation on the mesh :
114      !  0 = Centre ;  1 = corner W x(i-1/2) ; 2 = corner S y(j-1/2) ;
115      !  3 = corner SW x(i-1/2),y(j-1/2)
116      !-------------------
[58]117!!ibug ???
118      wght(:,:,:,:) = 0.e0
[2528]119      tmu(:,:)      = 0.e0
120#if defined key_lim2_vp 
121      akappa(:,:,:,:)     = 0.e0
[58]122      alambd(:,:,:,:,:,:) = 0.e0
[2528]123#else
124      tmv(:,:) = 0.e0
125      tmf(:,:) = 0.e0
126#endif
[58]127!!i
[3]128     
[2528]129
130#if defined key_lim2_vp     
[3]131      ! metric coefficients for sea ice dynamic
132      !----------------------------------------
133      !                                                       ! akappa
[12]134      DO jj = 2, jpj
[58]135         zd1d2(:,jj) = e1v(:,jj) - e1v(:,jj-1)
[3]136      END DO
[12]137      CALL lbc_lnk( zd1d2, 'T', -1. )
[3]138
[58]139      DO ji = 2, jpi
140         zd2d1(ji,:) = e2u(ji,:) - e2u(ji-1,:)
[3]141      END DO
[12]142      CALL lbc_lnk( zd2d1, 'T', -1. )
[3]143
[58]144      akappa(:,:,1,1) =        1.0 / ( 2.0 * e1t(:,:) )
145      akappa(:,:,1,2) = zd1d2(:,:) / ( 4.0 * e1t(:,:) * e2t(:,:) )
146      akappa(:,:,2,1) = zd2d1(:,:) / ( 4.0 * e1t(:,:) * e2t(:,:) )
147      akappa(:,:,2,2) =        1.0 / ( 2.0 * e2t(:,:) )
[3]148     
149      !                                                      ! weights (wght)
[12]150      DO jj = 2, jpj
151         DO ji = 2, jpi
[3]152            zusden = 1. / (  ( e1t(ji,jj) + e1t(ji-1,jj  ) )   &
153               &           * ( e2t(ji,jj) + e2t(ji  ,jj-1) ) )
154            wght(ji,jj,1,1) = zusden * e1t(ji  ,jj) * e2t(ji,jj  )
155            wght(ji,jj,1,2) = zusden * e1t(ji  ,jj) * e2t(ji,jj-1)
156            wght(ji,jj,2,1) = zusden * e1t(ji-1,jj) * e2t(ji,jj  )
157            wght(ji,jj,2,2) = zusden * e1t(ji-1,jj) * e2t(ji,jj-1)
158         END DO
159      END DO
160      CALL lbc_lnk( wght(:,:,1,1), 'I', 1. )      ! CAUTION: even with the lbc_lnk at ice U-V-point
161      CALL lbc_lnk( wght(:,:,1,2), 'I', 1. )      ! the value of wght at jpj is wrong
162      CALL lbc_lnk( wght(:,:,2,1), 'I', 1. )      ! but it is never used
163      CALL lbc_lnk( wght(:,:,2,2), 'I', 1. )
[2528]164#else
165      ! metric coefficients for sea ice dynamic (EVP rheology)
166      !----------------------------------------
167      DO jj = 1, jpjm1                                       ! weights (wght) at F-points
168         DO ji = 1, jpim1
169            zusden = 1. / (  ( e1t(ji+1,jj  ) + e1t(ji,jj) )   &
170               &           * ( e2t(ji  ,jj+1) + e2t(ji,jj) ) ) 
171            wght(ji,jj,1,1) = zusden * e1t(ji+1,jj) * e2t(ji,jj+1)
172            wght(ji,jj,1,2) = zusden * e1t(ji+1,jj) * e2t(ji,jj  )
173            wght(ji,jj,2,1) = zusden * e1t(ji  ,jj) * e2t(ji,jj+1)
174            wght(ji,jj,2,2) = zusden * e1t(ji  ,jj) * e2t(ji,jj  )
175         END DO
176      END DO
177      CALL lbc_lnk( wght(:,:,1,1), 'F', 1. )   ;   CALL lbc_lnk( wght(:,:,1,2),'F', 1. )       ! lateral boundary cond.   
178      CALL lbc_lnk( wght(:,:,2,1), 'F', 1. )   ;   CALL lbc_lnk( wght(:,:,2,2),'F', 1. )
179#endif
[3]180   
181      ! Coefficients for divergence of the stress tensor
182      !-------------------------------------------------
183
[2528]184#if defined key_lim2_vp
[12]185      DO jj = 2, jpj
[1694]186         DO ji = 2, jpi   ! NO vector opt.
[3]187            zh1p  =  e1t(ji  ,jj  ) * wght(ji,jj,2,2)   &
188               &   + e1t(ji-1,jj  ) * wght(ji,jj,1,2)   &
189               &   + e1t(ji  ,jj-1) * wght(ji,jj,2,1)   &
190               &   + e1t(ji-1,jj-1) * wght(ji,jj,1,1)
191
192            zh2p  =  e2t(ji  ,jj  ) * wght(ji,jj,2,2)   &
193               &   + e2t(ji-1,jj  ) * wght(ji,jj,1,2)   &
194               &   + e2t(ji  ,jj-1) * wght(ji,jj,2,1)   &
195               &   + e2t(ji-1,jj-1) * wght(ji,jj,1,1)
196
[58]197! better written but change the last digit and thus solver in less than 100 timestep
[3]198!           zh1p  = e1t(ji-1,jj  ) * wght(ji,jj,1,2) + e1t(ji,jj  ) * wght(ji,jj,2,2)   &
199!              &  + e1t(ji-1,jj-1) * wght(ji,jj,1,1) + e1t(ji,jj-1) * wght(ji,jj,2,1)
200
201!           zh2p  = e2t(ji-1,jj  ) * wght(ji,jj,1,2) + e2t(ji,jj  ) * wght(ji,jj,2,2)   &
202!              &  + e2t(ji-1,jj-1) * wght(ji,jj,1,1) + e2t(ji,jj-1) * wght(ji,jj,2,1)
203
[58]204!!ibug =0   zusden = 1.0 / ( zh1p * zh2p * 4.e0 )
205            zusden = 1.0 / MAX( zh1p * zh2p * 4.e0 , 1.e-20 )
[3]206            zusden2 = zusden * 2.0 
207
208            zd1d2p = zusden * 0.5 * ( -e1t(ji-1,jj-1) + e1t(ji-1,jj  ) - e1t(ji,jj-1) + e1t(ji  ,jj)   )
209            zd2d1p = zusden * 0.5 * (  e2t(ji  ,jj-1) - e2t(ji-1,jj-1) + e2t(ji,jj  ) - e2t(ji-1,jj)   )
210
211            alambd(ji,jj,2,2,2,1) = zusden2 * e2t(ji  ,jj-1)
212            alambd(ji,jj,2,2,2,2) = zusden2 * e2t(ji  ,jj  )
213            alambd(ji,jj,2,2,1,1) = zusden2 * e2t(ji-1,jj-1)
214            alambd(ji,jj,2,2,1,2) = zusden2 * e2t(ji-1,jj  )
215
216            alambd(ji,jj,1,1,2,1) = zusden2 * e1t(ji  ,jj-1)
217            alambd(ji,jj,1,1,2,2) = zusden2 * e1t(ji  ,jj  )
218            alambd(ji,jj,1,1,1,1) = zusden2 * e1t(ji-1,jj-1)
219            alambd(ji,jj,1,1,1,2) = zusden2 * e1t(ji-1,jj  )
220
221            alambd(ji,jj,1,2,2,1) = zd1d2p
222            alambd(ji,jj,1,2,2,2) = zd1d2p
223            alambd(ji,jj,1,2,1,1) = zd1d2p
224            alambd(ji,jj,1,2,1,2) = zd1d2p
225
226            alambd(ji,jj,2,1,2,1) = zd2d1p
227            alambd(ji,jj,2,1,2,2) = zd2d1p
228            alambd(ji,jj,2,1,1,1) = zd2d1p
229            alambd(ji,jj,2,1,1,2) = zd2d1p
230         END DO
231      END DO
232
233      CALL lbc_lnk( alambd(:,:,2,2,2,1), 'I', 1. )      ! CAUTION: even with the lbc_lnk at ice U-V point
234      CALL lbc_lnk( alambd(:,:,2,2,2,2), 'I', 1. )      ! the value of wght at jpj is wrong
235      CALL lbc_lnk( alambd(:,:,2,2,1,1), 'I', 1. )      ! but it is never used
236      CALL lbc_lnk( alambd(:,:,2,2,1,2), 'I', 1. )      !
237
238      CALL lbc_lnk( alambd(:,:,1,1,2,1), 'I', 1. )      ! CAUTION: idem
239      CALL lbc_lnk( alambd(:,:,1,1,2,2), 'I', 1. )      !
240      CALL lbc_lnk( alambd(:,:,1,1,1,1), 'I', 1. )      !
241      CALL lbc_lnk( alambd(:,:,1,1,1,2), 'I', 1. )      !
242
243      CALL lbc_lnk( alambd(:,:,1,2,2,1), 'I', 1. )      ! CAUTION: idem
244      CALL lbc_lnk( alambd(:,:,1,2,2,2), 'I', 1. )      !
245      CALL lbc_lnk( alambd(:,:,1,2,1,1), 'I', 1. )      !
246      CALL lbc_lnk( alambd(:,:,1,2,1,2), 'I', 1. )      !
247
248      CALL lbc_lnk( alambd(:,:,2,1,2,1), 'I', 1. )      ! CAUTION: idem
249      CALL lbc_lnk( alambd(:,:,2,1,2,2), 'I', 1. )      !
250      CALL lbc_lnk( alambd(:,:,2,1,1,1), 'I', 1. )      !
251      CALL lbc_lnk( alambd(:,:,2,1,1,2), 'I', 1. )      !
[2528]252#endif
[3]253           
254
255      ! Initialization of ice masks
256      !----------------------------
257     
258      tms(:,:) = tmask(:,:,1)      ! ice T-point  : use surface tmask
259
[2528]260#if defined key_lim2_vp
261      ! VP rheology : ice velocity point is I-point
[3]262!i here we can use umask with a i and j shift of -1,-1
263      tmu(:,1) = 0.e0
264      tmu(1,:) = 0.e0
265      DO jj = 2, jpj               ! ice U.V-point: computed from ice T-point mask
[1694]266         DO ji = 2, jpim1   ! NO vector opt.
[3]267            tmu(ji,jj) =  tms(ji,jj) * tms(ji-1,jj) * tms(ji,jj-1) * tms(ji-1,jj-1)           
268         END DO
269      END DO
[2528]270      CALL lbc_lnk( tmu(:,:), 'I', 1. )      !--lateral boundary conditions   
271#else
272      ! EVP rheology : ice velocity point are U- & V-points ; ice vorticity
273      ! point is F-point
274      tmu(:,:) = umask(:,:,1)
275      tmv(:,:) = vmask(:,:,1)
276      tmf(:,:) = 0.e0                        ! used of fmask except its special value along the coast (rn_shlat)
277      WHERE( fmask(:,:,1) == 1.e0 )   tmf(:,:) = 1.e0
278#endif
279      !
[3]280      ! unmasked and masked area of T-grid cell
281      area(:,:) = e1t(:,:) * e2t(:,:)
[2528]282      !
[2715]283      IF( wrk_not_released(2, 1,2) )   CALL ctl_stop('lim_msh_2 : failed to release workspace arrays')
284      !
[821]285   END SUBROUTINE lim_msh_2
[58]286
[3]287#else
[58]288   !!----------------------------------------------------------------------
289   !!   Default option            Dummy Module         NO LIM sea-ice model
290   !!----------------------------------------------------------------------
[3]291CONTAINS
[821]292   SUBROUTINE lim_msh_2           ! Dummy routine
293   END SUBROUTINE lim_msh_2
[58]294#endif
[3]295
296   !!======================================================================
[821]297END MODULE limmsh_2
Note: See TracBrowser for help on using the repository browser.