Changeset 1839


Ignore:
Timestamp:
2010-04-14T15:28:04+02:00 (11 years ago)
Author:
edblockley
Message:

1st commit for the mixed_ldfdyn branch
see ticket:659

Location:
branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/DYN/dynldf.F90

    r1152 r1839  
    6969      CASE ( 2 )    ;   CALL dyn_ldf_bilap  ( kt )      ! iso-level bilaplacian 
    7070      CASE ( 3 )    ;   CALL dyn_ldf_bilapg ( kt )      ! s-coord. horizontal bilaplacian 
     71      CASE ( 4 )                                        ! iso-level laplacian + bilaplacian 
     72         CALL dyn_ldf_lap    ( kt ) 
     73         CALL dyn_ldf_bilap  ( kt ) 
     74      CASE ( 5 )                                        ! rotated laplacian + bilaplacian (s-coord) 
     75         CALL dyn_ldf_iso    ( kt ) 
     76         CALL dyn_ldf_bilapg ( kt ) 
    7177      ! 
    7278      CASE ( -1 )                                       ! esopa: test all possibility with control print 
     
    8389                        CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask,   & 
    8490            &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     91      ! 
     92      CASE ( -2 )                                       ! neither laplacian nor bilaplacian schemes used 
     93         IF( kt == nit000 ) THEN 
     94            IF(lwp) WRITE(numout,*) 
     95            IF(lwp) WRITE(numout,*) 'dyn_ldf : no lateral diffusion on momentum setup' 
     96            IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     97         ENDIF 
    8598      END SELECT 
    8699 
     
    124137      IF( ln_dynldf_lap   )   ioptio = ioptio + 1 
    125138      IF( ln_dynldf_bilap )   ioptio = ioptio + 1 
    126       IF( ioptio /= 1 ) CALL ctl_stop( '          use ONE of the 2 lap/bilap operator type on dynamics' ) 
     139      IF( ioptio <  1 ) CALL ctl_warn( '          neither laplacian nor bilaplacian operator set for dynamics' ) 
    127140      ioptio = 0 
    128141      IF( ln_dynldf_level )   ioptio = ioptio + 1 
     
    144157            IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
    145158         ENDIF 
    146          IF ( ln_sco ) THEN             ! z-coordinate 
     159         IF ( ln_sco ) THEN             ! s-coordinate 
    147160            IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation) 
    148161            IF ( ln_dynldf_hor   )   nldf = 1      ! horizontal (   rotation) 
     
    162175            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    163176         ENDIF 
    164          IF ( ln_sco ) THEN             ! z-coordinate 
     177         IF ( ln_sco ) THEN             ! s-coordinate 
    165178            IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation) 
    166179            IF ( ln_dynldf_hor   )   nldf = 3      ! horizontal (   rotation) 
     
    169182      ENDIF 
    170183       
     184      IF( ln_dynldf_lap .AND. ln_dynldf_bilap ) THEN  ! mixed laplacian and bilaplacian operators 
     185         IF ( ln_zco ) THEN                ! z-coordinate 
     186            IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
     187            IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
     188            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
     189         ENDIF 
     190         IF ( ln_zps ) THEN             ! z-coordinate 
     191            IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed  
     192            IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
     193            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
     194         ENDIF 
     195         IF ( ln_sco ) THEN             ! s-coordinate 
     196            IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
     197            IF ( ln_dynldf_hor   )   nldf = 5      ! horizontal (   rotation) 
     198            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
     199         ENDIF 
     200      ENDIF 
     201 
    171202      IF( lk_esopa )                 nldf = -1     ! esopa test 
    172203 
     
    179210      IF(lwp) THEN 
    180211         WRITE(numout,*) 
     212         IF( nldf == -2 )   WRITE(numout,*) '              neither laplacian nor bilaplacian schemes used' 
    181213         IF( nldf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used' 
    182214         IF( nldf ==  0 )   WRITE(numout,*) '              laplacian operator' 
    183          IF( nldf ==  1 )   WRITE(numout,*) '              Rotated laplacian operator' 
     215         IF( nldf ==  1 )   WRITE(numout,*) '              rotated laplacian operator' 
    184216         IF( nldf ==  2 )   WRITE(numout,*) '              bilaplacian operator' 
    185          IF( nldf ==  3 )   WRITE(numout,*) '              Rotated bilaplacian' 
     217         IF( nldf ==  3 )   WRITE(numout,*) '              rotated bilaplacian' 
     218         IF( nldf ==  4 )   WRITE(numout,*) '              laplacian and bilaplacian operators' 
     219         IF( nldf ==  5 )   WRITE(numout,*) '              rotated laplacian and bilaplacian operators' 
    186220      ENDIF 
    187221      ! 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/DYN/dynldf_lap.F90

    r1152 r1839  
    7878      IF( kt == nit000 ) THEN 
    7979         IF(lwp) WRITE(numout,*) 
    80          IF(lwp) WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacien) operator' 
     80         IF(lwp) WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator' 
    8181         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    8282      ENDIF 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn.F90

    r1601 r1839  
    6767      NAMELIST/namdyn_ldf/ ln_dynldf_lap  , ln_dynldf_bilap,                  & 
    6868         &                 ln_dynldf_level, ln_dynldf_hor  , ln_dynldf_iso,   & 
    69          &                 rn_ahm_0       , rn_ahmb_0 
     69         &                 rn_ahm_0       , rn_ahmb_0      , rn_ahm_0_blp 
    7070      !!---------------------------------------------------------------------- 
    7171 
     
    7878         WRITE(numout,*) '~~~~~~~' 
    7979         WRITE(numout,*) '   Namelist nam_dynldf : set lateral mixing parameters' 
    80          WRITE(numout,*) '      laplacian operator          ln_dynldf_lap   = ', ln_dynldf_lap 
    81          WRITE(numout,*) '      bilaplacian operator        ln_dynldf_bilap = ', ln_dynldf_bilap 
    82          WRITE(numout,*) '      iso-level                   ln_dynldf_level = ', ln_dynldf_level 
    83          WRITE(numout,*) '      horizontal (geopotential)   ln_dynldf_hor   = ', ln_dynldf_hor 
    84          WRITE(numout,*) '      iso-neutral                 ln_dynldf_iso   = ', ln_dynldf_iso 
    85          WRITE(numout,*) '      horizontal eddy viscosity   rn_ahm_0        = ', rn_ahm_0 
    86          WRITE(numout,*) '      background viscosity        rn_ahmb_0       = ', rn_ahmb_0 
    87       ENDIF 
    88  
    89       ahm0  = rn_ahm_0                  ! OLD namelist variables defined from DOCTOR namelist variables 
    90       ahmb0 = rn_ahmb_0 
     80         WRITE(numout,*) '      laplacian operator                      ln_dynldf_lap   = ', ln_dynldf_lap 
     81         WRITE(numout,*) '      bilaplacian operator                    ln_dynldf_bilap = ', ln_dynldf_bilap 
     82         WRITE(numout,*) '      iso-level                               ln_dynldf_level = ', ln_dynldf_level 
     83         WRITE(numout,*) '      horizontal (geopotential)               ln_dynldf_hor   = ', ln_dynldf_hor 
     84         WRITE(numout,*) '      iso-neutral                             ln_dynldf_iso   = ', ln_dynldf_iso 
     85         WRITE(numout,*) '      horizontal laplacian eddy viscosity     rn_ahm_0        = ', rn_ahm_0 
     86         WRITE(numout,*) '      background viscosity                    rn_ahmb_0       = ', rn_ahmb_0 
     87         WRITE(numout,*) '      horizontal bilaplacian eddy viscosity   rn_ahm_0        = ', rn_ahm_0 
     88 
     89      ENDIF 
     90 
     91      ahm0     = rn_ahm_0                  ! OLD namelist variables defined from DOCTOR namelist variables 
     92      ahmb0    = rn_ahmb_0 
     93      ahm0_blp = rn_ahm_0_blp 
    9194 
    9295      ! ... check of lateral diffusive operator on tracers 
     
    117120      IF( ln_dynldf_bilap ) THEN 
    118121         IF(lwp) WRITE(numout,*) '   biharmonic momentum diffusion' 
    119          IF( ahm0 > 0 .AND. .NOT. lk_esopa )   CALL ctl_stop( 'The horizontal viscosity coef. ahm0 must be negative' ) 
     122         IF( ahm0_blp == 0.0 ) ahm0_blp = ahm0       ! Old namelist method: bilap specified with ahm0 
     123         IF( .NOT. ln_dynldf_lap ) ahm0 = ahm0_blp   ! Allow spatially varying coefs, which use ahm0 as input 
     124         IF( ahm0_blp > 0 .AND. .NOT. lk_esopa )   CALL ctl_stop( 'The horizontal viscosity coef. ahm0 must be negative' ) 
    120125      ELSE 
    121126         IF(lwp) WRITE(numout,*) '   harmonic momentum diff. (default)' 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn_c1d.h90

    r1152 r1839  
    1717      !! ** Method  :   1D eddy viscosity coefficients ( depth ) 
    1818      !!      ahm3, ahm4 never used 
    19       !!      biharmonic or harmonic operator : ahm1=ahm2 defined at T-level 
     19      !!      harmonic   operator : ahm1 defined at T-level 
     20      !!      biharmonic operator : ahm2 defined at T-level 
    2021      !!      isopycnal or geopotential harmonic operator 
    2122      !!                                      : ahm1 defined at T-level 
     
    2728 
    2829      !! * Local variables 
    29       REAL(wp) ::   zdam, zwam, zm00, zm01, zmhf, zmhs 
     30      REAL(wp) ::    zdam,  zwam,  zm00,  zm01,  zmhf,  zmhs 
     31      REAL(wp) ::   zdam2, zwam2, zm200, zm201, zmh2f, zmh2s 
    3032      REAL(wp) ::   zahmf, zahms 
    3133      !!---------------------------------------------------------------------- 
     
    3638      IF(lwp) WRITE(numout,*) 
    3739 
    38       ! Set ahm1=ahm2   (always at t-level) 
     40      ! Set ahm1 for laplacian     (always at t-level) 
    3941      ! ============= 
    4042      ! (USER: modify ahm1 following your desiderata) 
     
    5355      zmhs = zahms-zmhf * zm00 
    5456 
    55       ! set ahm1=ahm2 at T-level 
     57      ! Set ahm2 for bilaplacian   (always at t-level) 
     58      ! ============= 
     59      ! (USER: modify ahm2 following your desiderata) 
     60 
     61      ! initialization of the profile 
     62      ! ahms, ahmf: surface and bottom values 
     63      zahm2s = ahm0_blp 
     64      zahm2f = ahm0_blp/4. 
     65      ! zdam, zwam: depth of the inflection pt and width of inflection 
     66      zdam2  = -300. 
     67      zwam2  =  300. 
     68      ! computation coefficients 
     69      zm200 = TANH( (0-zdam2)/zwam2 ) 
     70      zm201 = TANH( (-fsdept(1,1,jpk)-zdam2)/zwam2 ) 
     71      zmh2f = (zahm2s-zahm2f)/(zm200-zm201) 
     72      zmh2s = zahm2s-zmh2f * zm00 
     73 
     74 
     75      ! set ahm1 and ahm2 at T-level 
    5676      DO jk = 1, jpk 
    57          ahm1(jk) = zmhs + zmhf * TANH( (-fsdept(1,1,jk)-zdam) / zwam ) 
    58          ahm2(jk) = ahm1(jk) 
     77         ahm1(jk) = zmhs  + zmhf  * TANH( (-fsdept(1,1,jk)-zdam ) / zwam ) 
     78         ahm2(jk) = zmh2s + zmh2f * TANH( (-fsdept(1,1,jk)-zdam2) / zwam2 ) 
    5979      END DO 
    6080 
     
    6282      IF(lwp .AND. ld_print ) THEN 
    6383         WRITE(numout,*) 
    64          WRITE(numout,*) '         ahm profile : ' 
     84         WRITE(numout,*) '         ahm profile (laplacian): ' 
    6585         WRITE(numout,*) 
    6686         WRITE(numout,9100) 
    6787         DO jk = 1, jpk 
    6888            WRITE(numout,9110) jk, ahm1(jk), fsdept(1,1,jk) 
     89         END DO 
     90         WRITE(numout,*) 
     91         WRITE(numout,*) '         ahm profile (bilaplacian): ' 
     92         WRITE(numout,*) 
     93         WRITE(numout,9100) 
     94         DO jk = 1, jpk 
     95            WRITE(numout,9110) jk, ahm2(jk), fsdept(1,1,jk) 
    6996         END DO 
    7097      ENDIF 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn_c2d.h90

    r1694 r1839  
    2727      !!           iso-model level : ahm3, ahm4 not used 
    2828      !! 
    29       !!       biharmonic operator : ahm1 is defined at u-point 
    30       !!                             ahm2 is defined at v-point 
    31       !!                           : ahm3, ahm4 not used 
     29      !!       biharmonic operator : ahm3 is defined at u-point 
     30      !!                             ahm4 is defined at v-point 
     31      !!                           : ahm1, ahm2 not used 
    3232      !! 
    3333      !!---------------------------------------------------------------------- 
     
    102102         IF(lwp) WRITE(numout,*) '              maximum grid-spacing = ', zd_max, ' maximum value for ahm = ', ahm0 
    103103 
    104          za00 = ahm0 / ( zd_max * zd_max * zd_max ) 
     104         za00 = ahm0_blp / ( zd_max * zd_max * zd_max ) 
    105105         DO jj = 1, jpj 
    106106            DO ji = 1, jpi 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn_c3d.h90

    r1694 r1839  
    122122         IF(lwp) WRITE(numout,*) '              maximum grid-spacing = ', zd_max, ' maximum value for ahm = ', ahm0 
    123123 
    124          za00 = ahm0 / ( zd_max * zd_max * zd_max ) 
     124         za00 = ahm0_blp / ( zd_max * zd_max * zd_max ) 
    125125         DO jj = 1, jpj 
    126126            DO ji = 1, jpi 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn_oce.F90

    r1601 r1839  
    1717   LOGICAL , PUBLIC ::   ln_dynldf_hor   = .TRUE.      !: horizontal (geopotential) direction 
    1818   LOGICAL , PUBLIC ::   ln_dynldf_iso   = .FALSE.     !: iso-neutral direction 
    19    REAL(wp), PUBLIC ::   rn_ahm_0        = 40000._wp   !: lateral eddy viscosity (m2/s) 
    20    REAL(wp), PUBLIC ::   rn_ahmb_0       =     0._wp   !: lateral background eddy viscosity (m2/s) 
     19   REAL(wp), PUBLIC ::   rn_ahm_0        = 40000._wp   !: lateral laplacian eddy viscosity (m2/s) 
     20   REAL(wp), PUBLIC ::   rn_ahmb_0       =     0._wp   !: lateral laplacian background eddy viscosity (m2/s) 
     21   REAL(wp), PUBLIC ::   rn_ahm_0_blp    =     0._wp   !: lateral bilaplacian eddy viscosity (m4/s) 
    2122 
    22    REAL(wp), PUBLIC ::   ahm0, ahmb0                 ! OLD namelist names 
     23   REAL(wp), PUBLIC ::   ahm0, ahmb0, ahm0_blp       ! OLD namelist names 
    2324 
    2425#if defined key_dynldf_c3d 
  • branches/dev_r1821_mixed_ldfdyn/NEMO/OPA_SRC/LDF/ldfdyn_substitute.h90

    r1152 r1839  
    1010   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    1111   !!---------------------------------------------------------------------- 
     12   !! 
     13   !! fsahmt, fsahmf - used for laplaian operator only 
     14   !! fsahmu, fsahmv - used for bilaplacian operator only 
     15   !! 
    1216#if defined key_dynldf_c3d 
    1317!   ' key_dynldf_c3d' :                  3D coefficient 
     
    2630#  define   fsahmt(i,j,k)    ahm1(k) 
    2731#  define   fsahmf(i,j,k)    ahm1(k) 
    28 #  define   fsahmu(i,j,k)    ahm1(k) 
    29 #  define   fsahmv(i,j,k)    ahm1(k) 
     32#  define   fsahmu(i,j,k)    ahm2(k) 
     33#  define   fsahmv(i,j,k)    ahm2(k) 
    3034#else 
    3135!   default option :               Constant coefficient 
    3236#  define   fsahmt(i,j,k)   ahm0 
    3337#  define   fsahmf(i,j,k)   ahm0 
    34 #  define   fsahmu(i,j,k)   ahm0 
    35 #  define   fsahmv(i,j,k)   ahm0 
     38#  define   fsahmu(i,j,k)   ahm0_blp 
     39#  define   fsahmv(i,j,k)   ahm0_blp 
    3640#endif 
Note: See TracChangeset for help on using the changeset viewer.