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.
Changeset 492 for trunk/NEMO/TOP_SRC – NEMO

Changeset 492 for trunk/NEMO/TOP_SRC


Ignore:
Timestamp:
2006-09-01T15:56:45+02:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_bugfix_055:CE+RB: allow no diffusion on passive tracers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/TOP_SRC/TRP/trctrp_ctl.F90

    r439 r492  
    3939      !!                 
    4040      !! ** Purpose :   Control the consistency between cpp options for  
    41       !!      tracer transport 
     41      !!                tracer transport 
    4242      !! 
    4343      !! History : 
     
    100100      ! Control of Advection scheme options 
    101101      ! ----------------------------------- 
    102       ioptio = 0 
    103       IF( ln_trcadv_cen2   )   ioptio = ioptio + 1 
    104       IF( ln_trcadv_tvd    )   ioptio = ioptio + 1 
    105       IF( ln_trcadv_muscl  )   ioptio = ioptio + 1 
    106       IF( ln_trcadv_muscl2 )   ioptio = ioptio + 1 
    107       IF( ln_trcadv_smolar )   ioptio = ioptio + 1 
    108  
    109       IF( lk_esopa ) THEN 
    110          IF(lwp) WRITE(numout,*) ' esopa control : the use of all scheme is forced' 
    111          ln_trcadv_cen2   = .TRUE. 
    112          ln_trcadv_tvd    = .TRUE. 
    113          ln_trcadv_muscl  = .TRUE. 
    114          ln_trcadv_muscl2 = .TRUE. 
    115          ln_trcadv_smolar = .TRUE. 
    116       ELSEIF( ioptio > 1 .OR. ioptio == 0 ) THEN 
    117          IF(lwp) WRITE(numout,cform_err) 
    118          IF(lwp) WRITE(numout,*) ' Choose one advection scheme in namelist nam_trcadv' 
    119          IF(lwp) WRITE(numout,*) '        ***                              ***********' 
    120          nstop = nstop + 1 
    121       ENDIF 
    122  
    123       IF( n_cla == 1 .AND. .NOT. ln_trcadv_cen2 ) THEN 
    124          IF(lwp) WRITE(numout,cform_err) 
    125          IF(lwp) WRITE(numout,*) '     cross-land advection only with 2nd order advection scheme' 
    126          nstop = nstop + 1 
    127       ENDIF 
    128  
    129       IF( lk_trccfg_1d ) THEN 
     102     IF( lk_trccfg_1d ) THEN 
    130103         ln_trcadv_cen2   = .FALSE.    ;  ln_trcadv_tvd    = .FALSE. ; ln_trcadv_muscl  = .FALSE. 
    131104         ln_trcadv_muscl2 = .FALSE.    ;  ln_trcadv_smolar = .FALSE. 
    132          IF(lwp) WRITE(numout,*) ' *******  1D configuration : No advection on passive tracers *******' 
    133          IF(lwp) WRITE(numout,*) ' *******                                                     *******' 
     105         IF(lwp) WRITE(numout,*) ' *** 1D configuration : No advection on passive tracers ' 
     106         IF(lwp) WRITE(numout,*)  
     107      ELSE 
     108         ioptio = 0 
     109         IF( ln_trcadv_cen2   )   ioptio = ioptio + 1 
     110         IF( ln_trcadv_tvd    )   ioptio = ioptio + 1 
     111         IF( ln_trcadv_muscl  )   ioptio = ioptio + 1 
     112         IF( ln_trcadv_muscl2 )   ioptio = ioptio + 1 
     113         IF( ln_trcadv_smolar )   ioptio = ioptio + 1 
     114          
     115         IF( lk_esopa ) THEN 
     116            IF(lwp) WRITE(numout,*) ' esopa control : the use of all scheme is forced' 
     117            ln_trcadv_cen2   = .TRUE. 
     118            ln_trcadv_tvd    = .TRUE. 
     119            ln_trcadv_muscl  = .TRUE. 
     120            ln_trcadv_muscl2 = .TRUE. 
     121            ln_trcadv_smolar = .TRUE. 
     122         ELSEIF( ioptio > 1 .OR. ioptio == 0 ) THEN 
     123            CALL ctl_stop( '  Choose one advection scheme in namelist nam_trcadv' ) 
     124         ENDIF 
     125          
     126         IF( n_cla == 1 .AND. .NOT. ln_trcadv_cen2 ) & 
     127            &    CALL ctl_stop( '    cross-land advection only with 2nd order advection scheme ' ) 
    134128      ENDIF 
    135129 
     
    156150      ! Parameter control 
    157151 
    158       ! control the input 
    159       ioptio = 0 
    160       IF( ln_trcldf_lap   )   ioptio = ioptio + 1 
    161       IF( ln_trcldf_bilap )   ioptio = ioptio + 1 
    162       IF( ioptio /= 1 )   THEN 
    163           IF(lwp) WRITE(numout,cform_err) 
    164           IF(lwp) WRITE(numout,*) '          use ONE of the 2 lap/bilap operator type on tracer' 
    165           nstop = nstop + 1 
    166       ENDIF 
    167       ioptio = 0 
    168       IF( ln_trcldf_level )   ioptio = ioptio + 1 
    169       IF( ln_trcldf_hor   )   ioptio = ioptio + 1 
    170       IF( ln_trcldf_iso   )   ioptio = ioptio + 1 
    171       IF( ioptio /= 1 ) THEN 
    172          IF(lwp) WRITE(numout,cform_err) 
    173          IF(lwp) WRITE(numout,*) '          use only ONE direction (level/hor/iso)' 
    174          nstop = nstop + 1 
    175       ENDIF 
    176  
    177       ! ... Choice of the lateral scheme used 
    178       IF( lk_trcldf_eiv ) THEN 
    179          IF(lwp) WRITE(numout,*) '          eddy induced velocity on tracers' 
    180             IF( .NOT.ln_trcldf_iso .OR. ln_trcldf_bilap ) THEN 
    181             IF(lwp) WRITE(numout,cform_err) 
    182             IF(lwp) WRITE(numout,*) ' the eddy induced velocity on tracers requires isopycnal laplacian diffusion' 
    183             nstop = nstop + 1 
    184          ENDIF 
    185       ENDIF 
    186  
    187       IF( lk_sco ) THEN          ! s-coordinates: rotation required for horizontal or isopycnal mixing 
    188          IF( ( ln_trcldf_iso .OR. ln_trcldf_hor ) .AND. .NOT.lk_ldfslp ) THEN 
    189             IF(lwp) WRITE(numout,cform_err) 
    190             IF(lwp) WRITE(numout,*) '          the rotation of the diffusive tensor require key_ldfslp' 
    191             IF( .NOT.lk_esopa )   nstop = nstop + 1 
    192          ENDIF 
    193       ELSE                       ! z-coordinates with/without partial step: 
    194          ln_trcldf_level = ln_trcldf_level .OR. ln_trcldf_hor      ! level diffusion = horizontal diffusion 
    195          ln_trcldf_hor   = .FALSE. 
    196          IF(lwp) WRITE(numout,*) '          horizontal mixing in z-coord or partial steps: force ln_trcldf_level = T' 
    197          IF(lwp) WRITE(numout,*) '                                                  and    force ln_trcldf_hor   = F' 
    198          IF( ln_trcldf_iso .AND. .NOT.lk_ldfslp ) THEN             ! rotation required for isopycnal mixing 
    199             IF(lwp) WRITE(numout,cform_err) 
    200             IF(lwp) WRITE(numout,*) '          the rotation of the diffusive tensor require key_ldfslp' 
    201             IF( .NOT.lk_esopa )   nstop = nstop + 1 
    202          ENDIF 
    203       ENDIF 
    204  
    205       l_trcldf_lap     =  ln_trcldf_lap   .AND. ln_trcldf_level     ! iso-level   laplacian operator 
    206       l_trcldf_bilap   =  ln_trcldf_bilap .AND. ln_trcldf_level     ! iso-level bilaplacian operator 
    207       l_trcldf_bilapg  =  ln_trcldf_bilap .AND. ln_trcldf_hor       ! geopotential bilap. (s-coord) 
    208       l_trcldf_iso     =  ln_trcldf_lap   .AND.                  &  ! laplacian operator 
    209          &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (z-coord) or horizontal (s-coord) 
    210          &                                     .AND. .NOT.lk_zps 
    211       l_trcldf_iso_zps =       ln_trcldf_lap   .AND.                  &  ! laplacian operator 
    212          &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (partial steps) 
    213          &                                     .AND. lk_zps              ! or geopotential in mixed partial steps/s-coord 
    214       l_trczdf_iso    = .FALSE. 
    215       l_trczdf_iso_vo = .FALSE. 
    216       IF( l_trcldf_iso     )   l_trczdf_iso = .TRUE. 
    217       IF( l_trcldf_iso_zps )   l_trczdf_iso = .TRUE. 
    218 #if defined key_vectopt_memory 
    219       IF( l_trczdf_iso ) THEN 
    220          l_trczdf_iso    = .FALSE. 
    221          l_trczdf_iso_vo = .TRUE. 
    222       ENDIF 
    223 #endif 
    224  
    225   
    226       ioptio = 0 
    227       IF( l_trcldf_lap     )   ioptio = ioptio + 1 
    228       IF( l_trcldf_bilap   )   ioptio = ioptio + 1 
    229       IF( l_trcldf_bilapg  )   ioptio = ioptio + 1 
    230       IF( l_trcldf_iso     )   ioptio = ioptio + 1 
    231       IF( l_trcldf_iso_zps )   ioptio = ioptio + 1 
    232       IF( ioptio /= 1 ) THEN 
    233          IF(lwp) WRITE(numout,cform_err) 
    234          IF(lwp) WRITE(numout,*) '          this combination of operator and direction has not been implemented' 
    235          nstop = nstop + 1 
    236       ENDIF 
    237  
    238       IF( lk_esopa ) THEN 
    239          l_trcldf_lap = .TRUE.   ;   l_trcldf_bilap   = .TRUE.   ;   l_trcldf_bilapg  = .TRUE. 
    240          l_trcldf_iso = .TRUE.   ;   l_trcldf_iso_zps = .TRUE. 
    241          l_trczdf_iso = .TRUE.   ;   l_trczdf_iso_vo  = .TRUE. 
    242          IF(lwp ) WRITE(numout,*) '          esopa test: use all lateral physics options' 
    243       ENDIF 
    244  
    245152      IF( .NOT. ln_trcldf_diff .OR. lk_trccfg_1d ) THEN 
    246153         l_trcldf_lap = .FALSE.   ;   l_trcldf_bilap   = .FALSE.   ;   l_trcldf_bilapg  = .FALSE. 
    247154         l_trcldf_iso = .FALSE.   ;   l_trcldf_iso_zps = .FALSE. 
    248155         l_trczdf_iso = .FALSE.   ;   l_trczdf_iso_vo  = .FALSE. 
    249          IF(lwp ) WRITE(numout,*) '************* No lateral physics on passive tracers *****************' 
    250          IF(lwp ) WRITE(numout,*) '*************                                       *****************' 
     156         IF(lwp ) WRITE(numout,*) '*** No lateral diffusion on passive tracers ' 
     157         IF(lwp ) WRITE(numout,*)  
    251158      ELSE 
     159         ! control the input 
     160         ioptio = 0 
     161         IF( ln_trcldf_lap   )   ioptio = ioptio + 1 
     162         IF( ln_trcldf_bilap )   ioptio = ioptio + 1 
     163         IF( ioptio /= 1 )  & 
     164            &   CALL ctl_stop( '    use ONE of the 2 lap/bilap operator type on tracer' ) 
     165          
     166         ioptio = 0 
     167         IF( ln_trcldf_level )   ioptio = ioptio + 1 
     168         IF( ln_trcldf_hor   )   ioptio = ioptio + 1 
     169         IF( ln_trcldf_iso   )   ioptio = ioptio + 1 
     170         IF( ioptio /= 1 ) & 
     171            &   CALL ctl_stop( '   use only ONE direction (level/hor/iso)' ) 
     172          
     173         ! ... Choice of the lateral scheme used 
     174         IF( lk_trcldf_eiv ) THEN 
     175            IF(lwp) WRITE(numout,*) '          eddy induced velocity on tracers' 
     176            IF( .NOT.ln_trcldf_iso .OR. ln_trcldf_bilap ) & 
     177               &      CALL ctl_stop( ' the eddy induced velocity on tracers ',& 
     178               &                     'requires isopycnal laplacian diffusion' ) 
     179         ENDIF 
     180          
     181         IF( ln_sco ) THEN          ! s-coordinates: rotation required for horizontal or isopycnal mixing 
     182            IF( ( ln_trcldf_iso .OR. ln_trcldf_hor ) .AND. .NOT.lk_ldfslp ) & 
     183               &      CALL ctl_stop( '  the rotation of the diffusive tensor require key_ldfslp' ) 
     184         ELSE                       ! z-coordinates with/without partial step: 
     185            ln_trcldf_level = ln_trcldf_level .OR. ln_trcldf_hor      ! level diffusion = horizontal diffusion 
     186            ln_trcldf_hor   = .FALSE. 
     187            IF(lwp) WRITE(numout,*) '          horizontal mixing in z-coord or partial steps: force ln_trcldf_level = T' 
     188            IF(lwp) WRITE(numout,*) '                                                  and    force ln_trcldf_hor   = F' 
     189            IF( ln_trcldf_iso .AND. .NOT.lk_ldfslp ) &            ! rotation required for isopycnal mixing 
     190               &      CALL ctl_stop( ' the rotation of the diffusive tensor require key_ldfslp' ) 
     191         ENDIF 
     192          
     193         l_trcldf_lap     =  ln_trcldf_lap   .AND. ln_trcldf_level     ! iso-level   laplacian operator 
     194         l_trcldf_bilap   =  ln_trcldf_bilap .AND. ln_trcldf_level     ! iso-level bilaplacian operator 
     195         l_trcldf_bilapg  =  ln_trcldf_bilap .AND. ln_trcldf_hor       ! geopotential bilap. (s-coord) 
     196         l_trcldf_iso     =  ln_trcldf_lap   .AND.                  &  ! laplacian operator 
     197            &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (z-coord) or horizontal (s-coord) 
     198            &                                     .AND. .NOT.ln_zps 
     199         l_trcldf_iso_zps =       ln_trcldf_lap   .AND.                  &  ! laplacian operator 
     200            &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (partial steps) 
     201            &                                     .AND. ln_zps              ! or geopotential in mixed partial steps/s-coord 
     202         l_trczdf_iso    = .FALSE. 
     203         l_trczdf_iso_vo = .FALSE. 
     204         IF( l_trcldf_iso     )   l_trczdf_iso = .TRUE. 
     205         IF( l_trcldf_iso_zps )   l_trczdf_iso = .TRUE. 
     206#if defined key_vectopt_memory 
     207         IF( l_trczdf_iso ) THEN 
     208            l_trczdf_iso    = .FALSE. 
     209            l_trczdf_iso_vo = .TRUE. 
     210         ENDIF 
     211#endif 
     212          
     213          
     214         ioptio = 0 
     215         IF( l_trcldf_lap     )   ioptio = ioptio + 1 
     216         IF( l_trcldf_bilap   )   ioptio = ioptio + 1 
     217         IF( l_trcldf_bilapg  )   ioptio = ioptio + 1 
     218         IF( l_trcldf_iso     )   ioptio = ioptio + 1 
     219         IF( l_trcldf_iso_zps )   ioptio = ioptio + 1 
     220         IF( ioptio /= 1 ) & 
     221            &   CALL ctl_stop( '  this combination of operator and direction has not been implemented' ) 
     222          
     223         IF( lk_esopa ) THEN 
     224            l_trcldf_lap = .TRUE.   ;   l_trcldf_bilap   = .TRUE.   ;   l_trcldf_bilapg  = .TRUE. 
     225            l_trcldf_iso = .TRUE.   ;   l_trcldf_iso_zps = .TRUE. 
     226            l_trczdf_iso = .TRUE.   ;   l_trczdf_iso_vo  = .TRUE. 
     227            IF(lwp ) WRITE(numout,*) '          esopa test: use all lateral physics options' 
     228         ENDIF 
     229          
    252230         ! ... Space variation of eddy coefficients 
    253231         ioptio = 0 
    254 #if defined key_traldf_c3d 
     232#if defined key_traldf_c3d || defined key_off_degrad 
    255233         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( latitude, longitude, depth)' 
    256234         ioptio = ioptio + 1 
    257235#endif 
    258 #if defined key_traldf_c2d 
     236#if defined key_traldf_c2d && ! defined key_off_degrad 
    259237         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( latitude, longitude)' 
    260238         ioptio = ioptio + 1 
    261239#endif 
    262 #if defined key_traldf_c1d 
     240#if defined key_traldf_c1d && ! defined key_off_degrad 
    263241         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( depth )' 
    264242         ioptio = ioptio + 1 
    265          IF( lk_sco ) THEN 
    266             IF(lwp) WRITE(numout,cform_err) 
    267             IF(lwp) WRITE(numout,*) '          key_traldf_c1d cannot be used in s-coordinate (key_s_coord)' 
    268             nstop = nstop + 1 
    269          ENDIF 
     243         IF( ln_sco ) & 
     244            &  CALL ctl_stop( '    key_traldf_c1d cannot be used in s-coordinate ' ) 
    270245#endif 
    271246         IF( ioptio == 0 ) THEN 
    272247            IF(lwp) WRITE(numout,*) ' tracer mixing coef. = constant (default option)' 
    273248         ELSEIF( ioptio > 1 ) THEN 
    274             IF(lwp) WRITE(numout,cform_err) 
    275             IF(lwp) WRITE(numout,*) ' use only one of the following keys:',   & 
    276                &                    ' key_traldf_c3d, key_traldf_c2d, key_traldf_c1d' 
    277             nstop = nstop + 1 
     249            CALL ctl_stop( '  use only one of the following keys:',   & 
     250               &                 ' key_traldf_c3d, key_traldf_c2d, key_traldf_c1d' ) 
    278251         ENDIF 
    279252          
    280253         IF( l_trcldf_bilap .OR. l_trcldf_bilapg ) THEN 
    281254            IF(lwp) WRITE(numout,*) '  biharmonic tracer diffusion' 
    282             IF( ahtrc0 > 0 .AND. .NOT. lk_esopa ) THEN 
    283                IF(lwp) WRITE(numout,cform_err) 
    284                IF(lwp) WRITE(numout,*) ' The horizontal diffusivity coef. aht0 must be negative' 
    285                nstop = nstop + 1 
    286             ENDIF 
     255            IF( ahtrc0 > 0 .AND. .NOT. lk_esopa ) & 
     256               &  CALL ctl_stop( '  The horizontal diffusivity coef. aht0 must be negative' ) 
    287257         ELSE 
    288258            IF(lwp) WRITE(numout,*) ' harmonic tracer diffusion (default)' 
    289             IF( ahtrc0 < 0 .AND. .NOT. lk_esopa ) THEN 
    290                IF(lwp) WRITE(numout,cform_err) 
    291                IF(lwp) WRITE(numout,*) 'The horizontal diffusivity coef. aht0 must be positive' 
    292                nstop = nstop + 1 
    293             ENDIF 
     259            IF( ahtrc0 < 0 .AND. .NOT. lk_esopa ) & 
     260               &  CALL ctl_stop( ' The horizontal diffusivity coef. aht0 must be positive' ) 
    294261         ENDIF 
    295262      ENDIF 
     
    364331 
    365332      CASE DEFAULT 
    366          IF(lwp) WRITE(numout,cform_err) 
    367          IF(lwp) WRITE(numout,*) '          bad flag value for ndmptr = ', ndmptr 
    368          nstop = nstop + 1 
     333 
     334         WRITE(ctmp1,*) '          bad flag value for nmldmp = ', ndmptr 
     335         CALL ctl_stop(ctmp1) 
    369336 
    370337      END SELECT 
     
    383350 
    384351      CASE DEFAULT 
    385          IF(lwp) WRITE(numout,cform_err) 
    386          IF(lwp) WRITE(numout,*) '          bad flag value for nmldmptr = ', nmldmptr 
    387          nstop = nstop + 1 
     352         WRITE(ctmp1,*) '          bad flag value for nmldmp = ', nmldmptr 
     353         CALL ctl_stop(ctmp1) 
    388354 
    389355      END SELECT 
Note: See TracChangeset for help on using the changeset viewer.