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.
icedyn_adv.F90 in NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/ICE – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/ICE/icedyn_adv.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
File size: 8.4 KB
Line 
1MODULE icedyn_adv
2   !!======================================================================
3   !!                       ***  MODULE icedyn_adv   ***
4   !!   sea-ice: advection
5   !!======================================================================
6   !! History :  4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
7   !!----------------------------------------------------------------------
8#if defined key_si3
9   !!----------------------------------------------------------------------
10   !!   'key_si3'                                       SI3 sea-ice model
11   !!----------------------------------------------------------------------
12   !!   ice_dyn_adv   : advection of sea ice variables
13   !!----------------------------------------------------------------------
14   USE phycst         ! physical constant
15   USE dom_oce        ! ocean domain
16   USE sbc_oce , ONLY : nn_fsbc   ! frequency of sea-ice call
17   USE ice            ! sea-ice: variables
18   USE icevar         ! sea-ice: operations
19   USE icedyn_adv_pra ! sea-ice: advection scheme (Prather)
20   USE icedyn_adv_umx ! sea-ice: advection scheme (ultimate-macho)
21   USE icectl         ! sea-ice: control prints
22   !
23   USE in_out_manager ! I/O manager
24   USE iom            ! I/O manager library
25   USE lib_mpp        ! MPP library
26   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
27   USE timing         ! Timing
28   USE prtctl         ! Print control
29
30   IMPLICIT NONE
31   PRIVATE
32
33   PUBLIC   ice_dyn_adv        ! called by icestp
34   PUBLIC   ice_dyn_adv_init   ! called by icedyn
35
36   INTEGER ::              nice_adv   ! choice of the type of advection scheme
37   !                                        ! associated indices:
38   INTEGER, PARAMETER ::   np_advPRA = 1   ! Prather scheme
39   INTEGER, PARAMETER ::   np_advUMx = 2   ! Ultimate-Macho scheme
40   !
41   ! ** namelist (namdyn_adv) **
42   INTEGER         ::   nn_UMx       ! order of the UMx advection scheme   
43   !
44   !! * Substitution
45#  include "vectopt_loop_substitute.h90"
46   !!----------------------------------------------------------------------
47   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
48   !! $Id$
49   !! Software governed by the CeCILL licence     (./LICENSE)
50   !!----------------------------------------------------------------------
51CONTAINS
52
53   SUBROUTINE ice_dyn_adv( kt ) 
54      !!----------------------------------------------------------------------
55      !!                   ***  ROUTINE ice_dyn_adv ***
56      !!                   
57      !! ** purpose : advection of sea ice
58      !!
59      !! ** method  : One can choose between
60      !!     a) an Ultimate-Macho scheme (with order defined by nn_UMx) => ln_adv_UMx
61      !!     b) and a second order Prather scheme => ln_adv_Pra
62      !!
63      !! ** action :
64      !!----------------------------------------------------------------------
65      INTEGER, INTENT(in) ::   kt   ! number of iteration
66      !!---------------------------------------------------------------------
67      !
68      ! controls
69      IF( ln_timing    )   CALL timing_start('icedyn_adv')                                                             ! timing
70      IF( ln_icediachk )   CALL ice_cons_hsm(0, 'icedyn_adv', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
71      !
72      IF( kt == nit000 .AND. lwp ) THEN
73         WRITE(numout,*)
74         WRITE(numout,*) 'ice_dyn_adv: sea-ice advection'
75         WRITE(numout,*) '~~~~~~~~~~~'
76      ENDIF
77      !
78      !---------------!
79      !== Advection ==!
80      !---------------!
81      SELECT CASE( nice_adv )
82      !                                !-----------------------!
83      CASE( np_advUMx )                ! ULTIMATE-MACHO scheme !
84         !                             !-----------------------!
85         CALL ice_dyn_adv_umx( nn_UMx, kt, u_ice, v_ice, h_i, h_s, h_ip, &
86            &                          ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, e_s, e_i )
87         !                             !-----------------------!
88      CASE( np_advPRA )                ! PRATHER scheme        !
89         !                             !-----------------------!
90         CALL ice_dyn_adv_pra(         kt, u_ice, v_ice, &
91            &                          ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, e_s, e_i )
92      END SELECT
93
94      !------------
95      ! diagnostics
96      !------------
97      diag_trp_ei(:,:) = SUM(SUM( e_i (:,:,1:nlay_i,:) - e_i_b (:,:,1:nlay_i,:), dim=4 ), dim=3 ) * r1_rdtice
98      diag_trp_es(:,:) = SUM(SUM( e_s (:,:,1:nlay_s,:) - e_s_b (:,:,1:nlay_s,:), dim=4 ), dim=3 ) * r1_rdtice
99      diag_trp_sv(:,:) = SUM(     sv_i(:,:,:)          - sv_i_b(:,:,:)                  , dim=3 ) * r1_rdtice
100      diag_trp_vi(:,:) = SUM(     v_i (:,:,:)          - v_i_b (:,:,:)                  , dim=3 ) * r1_rdtice
101      diag_trp_vs(:,:) = SUM(     v_s (:,:,:)          - v_s_b (:,:,:)                  , dim=3 ) * r1_rdtice
102      IF( iom_use('icemtrp') )   CALL iom_put( 'icemtrp' ,  diag_trp_vi * rhoi          )   ! ice mass transport
103      IF( iom_use('snwmtrp') )   CALL iom_put( 'snwmtrp' ,  diag_trp_vs * rhos          )   ! snw mass transport
104      IF( iom_use('salmtrp') )   CALL iom_put( 'salmtrp' ,  diag_trp_sv * rhoi * 1.e-03 )   ! salt mass transport (kg/m2/s)
105      IF( iom_use('dihctrp') )   CALL iom_put( 'dihctrp' , -diag_trp_ei                 )   ! advected ice heat content (W/m2)
106      IF( iom_use('dshctrp') )   CALL iom_put( 'dshctrp' , -diag_trp_es                 )   ! advected snw heat content (W/m2)
107
108      ! controls
109      IF( ln_icediachk )   CALL ice_cons_hsm(1, 'icedyn_adv', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
110      IF( ln_icectl    )   CALL ice_prt     (kt, iiceprt, jiceprt,-1, ' - ice dyn & trp - ')                           ! prints
111      IF( ln_timing    )   CALL timing_stop ('icedyn_adv')                                                             ! timing
112      !
113   END SUBROUTINE ice_dyn_adv
114
115
116   SUBROUTINE ice_dyn_adv_init
117      !!-------------------------------------------------------------------
118      !!                  ***  ROUTINE ice_dyn_adv_init  ***
119      !!
120      !! ** Purpose :   Physical constants and parameters linked to the ice
121      !!                dynamics
122      !!
123      !! ** Method  :   Read the namdyn_adv namelist and check the ice-dynamic
124      !!                parameter values called at the first timestep (nit000)
125      !!
126      !! ** input   :   Namelist namdyn_adv
127      !!-------------------------------------------------------------------
128      INTEGER ::   ios, ioptio   ! Local integer output status for namelist read
129      !!
130      NAMELIST/namdyn_adv/ ln_adv_Pra, ln_adv_UMx, nn_UMx
131      !!-------------------------------------------------------------------
132      !
133      READ  ( numnam_ice_ref, namdyn_adv, IOSTAT = ios, ERR = 901)
134901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_adv in reference namelist' )
135      READ  ( numnam_ice_cfg, namdyn_adv, IOSTAT = ios, ERR = 902 )
136902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist' )
137      IF(lwm) WRITE( numoni, namdyn_adv )
138      !
139      IF(lwp) THEN                     ! control print
140         WRITE(numout,*)
141         WRITE(numout,*) 'ice_dyn_adv_init: ice parameters for ice dynamics '
142         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
143         WRITE(numout,*) '   Namelist namdyn_adv:'
144         WRITE(numout,*) '      type of advection scheme (Prather)             ln_adv_Pra = ', ln_adv_Pra 
145         WRITE(numout,*) '      type of advection scheme (Ulimate-Macho)       ln_adv_UMx = ', ln_adv_UMx 
146         WRITE(numout,*) '         order of the Ultimate-Macho scheme          nn_UMx     = ', nn_UMx
147      ENDIF
148      !
149      !                             !== set the choice of ice advection ==!
150      ioptio = 0 
151      IF( ln_adv_Pra ) THEN   ;   ioptio = ioptio + 1   ;   nice_adv = np_advPRA    ;   ENDIF
152      IF( ln_adv_UMx ) THEN   ;   ioptio = ioptio + 1   ;   nice_adv = np_advUMx    ;   ENDIF
153      IF( ioptio /= 1 )   CALL ctl_stop( 'ice_dyn_adv_init: choose one and only one ice adv. scheme (ln_adv_Pra or ln_adv_UMx)' )
154      !
155      IF( ln_adv_Pra )   CALL adv_pra_init  !* read or initialize all required files
156      !
157   END SUBROUTINE ice_dyn_adv_init
158
159#else
160   !!----------------------------------------------------------------------
161   !!   Default option         Empty Module           NO SI3 sea-ice model
162   !!----------------------------------------------------------------------
163#endif
164
165   !!======================================================================
166END MODULE icedyn_adv
167
Note: See TracBrowser for help on using the repository browser.