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 2715 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilapg.F90 – NEMO

Ignore:
Timestamp:
2011-03-30T17:58:35+02:00 (13 years ago)
Author:
rblod
Message:

First attempt to put dynamic allocation on the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilapg.F90

    r2528 r2715  
    44   !! Ocean dynamics:  lateral viscosity trend 
    55   !!====================================================================== 
     6   !! History :  OPA  !  1997-07  (G. Madec)  Original code 
     7   !!  NEMO      1.0  !  2002-08  (G. Madec)  F90: Free form and module 
     8   !!            2.0  !  2004-08  (C. Talandier) New trends organization 
     9   !!---------------------------------------------------------------------- 
    610#if defined key_ldfslp   ||   defined key_esopa 
    711   !!---------------------------------------------------------------------- 
     
    1216   !!   ldfguv         :  
    1317   !!---------------------------------------------------------------------- 
    14    !! * Modules used 
    1518   USE oce             ! ocean dynamics and tracers 
    1619   USE dom_oce         ! ocean space and time domain 
    1720   USE ldfdyn_oce      ! ocean dynamics lateral physics 
    1821   USE zdf_oce         ! ocean vertical physics 
    19    USE in_out_manager  ! I/O manager 
    2022   USE trdmod          ! ocean dynamics trends  
    2123   USE trdmod_oce      ! ocean variables trends 
    2224   USE ldfslp          ! iso-neutral slopes available 
     25   USE in_out_manager  ! I/O manager 
     26   USE lib_mpp         ! MPP library 
    2327   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2428   USE prtctl          ! Print control 
     
    2731   PRIVATE 
    2832 
    29    !! * Routine accessibility 
    30    PUBLIC dyn_ldf_bilapg ! called by step.F90 
     33   PUBLIC   dyn_ldf_bilapg       ! called by step.F90 
     34 
     35   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zfuw, zfvw , zdiu, zdiv   ! 2D workspace (ldfguv) 
     36   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zdju, zdj1u, zdjv, zdj1v  ! 2D workspace (ldfguv) 
    3137 
    3238   !! * Substitutions 
     
    3642   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3743   !! $Id$  
    38    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    39    !!---------------------------------------------------------------------- 
    40  
     44   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     45   !!---------------------------------------------------------------------- 
    4146CONTAINS 
     47 
     48   INTEGER FUNCTION dyn_ldf_bilapg_alloc() 
     49      !!---------------------------------------------------------------------- 
     50      !!               ***  ROUTINE dyn_ldf_bilapg_alloc  *** 
     51      !!---------------------------------------------------------------------- 
     52      ALLOCATE( zfuw(jpi,jpk) , zfvw (jpi,jpk) , zdiu(jpi,jpk) , zdiv (jpi,jpk) ,     & 
     53         &      zdju(jpi,jpk) , zdj1u(jpi,jpk) , zdjv(jpi,jpk) , zdj1v(jpi,jpk) , STAT=dyn_ldf_bilapg_alloc ) 
     54         ! 
     55      IF( dyn_ldf_bilapg_alloc /= 0 )   CALL ctl_warn('dyn_ldf_bilapg_alloc: failed to allocate arrays') 
     56   END FUNCTION dyn_ldf_bilapg_alloc 
     57 
    4258 
    4359   SUBROUTINE dyn_ldf_bilapg( kt ) 
     
    6783      !!                biharmonic mixing trend. 
    6884      !!              - save the trend in (zwk3,zwk4) ('key_trddyn') 
    69       !! 
    70       !! History : 
    71       !!   8.0  !  97-07  (G. Madec)  Original code 
    72       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    73       !!   9.0  !  04-08  (C. Talandier) New trends organization 
    74       !!---------------------------------------------------------------------- 
    75       !! * Modules used      
    76       USE oce, ONLY :    zwk3 => ta,   & ! use ta as 3D workspace    
    77                          zwk4 => sa      ! use sa as 3D workspace    
    78  
    79       !! * Arguments 
     85      !!---------------------------------------------------------------------- 
     86      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     87      USE wrk_nemo, ONLY:   zwk1 => wrk_3d_3 , zwk2 => wrk_3d_4   ! 3D workspace 
     88      USE oce     , ONLY:   zwk3 => ta       , zwk4 => sa         ! ta, sa used as 3D workspace    
     89      ! 
    8090      INTEGER, INTENT( in ) ::   kt           ! ocean time-step index 
    81  
    82       !! * Local declarations 
     91      ! 
    8392      INTEGER ::   ji, jj, jk                 ! dummy loop indices 
    84       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    85          zwk1, zwk2                ! work array used for rotated biharmonic 
    86          !                         ! operator on tracers and/or momentum 
    87       !!---------------------------------------------------------------------- 
     93      !!---------------------------------------------------------------------- 
     94 
     95      IF( wrk_in_use(3, 3,4) ) THEN 
     96         CALL ctl_stop('dyn_ldf_bilapg: requested workspace arrays unavailable')   ;   RETURN 
     97      ENDIF 
    8898 
    8999      IF( kt == nit000 ) THEN 
     
    93103         zwk1(:,:,:) = 0.e0   ;   zwk3(:,:,:) = 0.e0 
    94104         zwk2(:,:,:) = 0.e0   ;   zwk4(:,:,:) = 0.e0 
     105         !                                      ! allocate dyn_ldf_bilapg arrays 
     106         IF( dyn_ldf_bilapg_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_bilapg: failed to allocate arrays') 
    95107      ENDIF 
    96108 
    97109      ! Laplacian of (ub,vb) multiplied by ahm 
    98110      ! --------------------------------------   
    99       ! rotated harmonic operator applied to (ub,vb) 
    100       !     and multiply by ahmu, ahmv (output in (zwk1,zwk2) ) 
    101  
    102       CALL ldfguv ( ub, vb, zwk1, zwk2, 1 ) 
    103  
    104  
    105       ! Lateral boundary conditions on (zwk1,zwk2) 
    106       CALL lbc_lnk( zwk1, 'U', -1. ) 
    107       CALL lbc_lnk( zwk2, 'V', -1. ) 
    108  
     111      CALL ldfguv( ub, vb, zwk1, zwk2, 1 )      ! rotated harmonic operator applied to (ub,vb) 
     112      !                                         ! and multiply by ahmu, ahmv (output in (zwk1,zwk2) ) 
     113      CALL lbc_lnk( zwk1, 'U', -1. )   ;   CALL lbc_lnk( zwk2, 'V', -1. )     ! Lateral boundary conditions 
    109114 
    110115      ! Bilaplacian of (ub,vb) 
    111116      ! ----------------------  
    112       ! rotated harmonic operator applied to (zwk1,zwk2) (output in (zwk3,zwk4) ) 
    113  
    114       CALL ldfguv ( zwk1, zwk2, zwk3, zwk4, 2 ) 
    115  
    116  
    117       ! Update the momentum trends           (j-slab :   2, jpj-1) 
     117      CALL ldfguv( zwk1, zwk2, zwk3, zwk4, 2 )  ! rotated harmonic operator applied to (zwk1,zwk2)  
     118      !                                         ! (output in (zwk3,zwk4) ) 
     119 
     120      ! Update the momentum trends 
    118121      ! -------------------------- 
    119       !                                                ! =============== 
    120       DO jj = 2, jpjm1                                 !  Vertical slab 
    121          !                                             ! =============== 
     122      DO jj = 2, jpjm1               ! add the diffusive trend to the general momentum trends 
    122123         DO jk = 1, jpkm1 
    123124            DO ji = 2, jpim1 
    124                ! add the diffusive trend to the general momentum trends 
    125125               ua(ji,jj,jk) = ua(ji,jj,jk) + zwk3(ji,jj,jk) 
    126126               va(ji,jj,jk) = va(ji,jj,jk) + zwk4(ji,jj,jk) 
    127127            END DO 
    128128         END DO 
    129          !                                             ! =============== 
    130       END DO                                           !   End of slab 
    131       !                                                ! =============== 
    132  
     129      END DO 
     130      ! 
     131      IF( wrk_not_released(3, 3,4) )   CALL ctl_stop('dyn_ldf_bilapg: failed to release workspace arrays') 
     132      ! 
    133133   END SUBROUTINE dyn_ldf_bilapg 
    134134 
     
    174174      !!                          second order vertical derivative term) 
    175175      !!      'key_trddyn' defined: the trend is saved for diagnostics. 
    176       !! 
    177       !! History : 
    178       !!   8.0  !  97-07  (G. Madec)  Original code 
    179       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    180       !!---------------------------------------------------------------------- 
    181       !! * Arguments 
    182       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   & 
    183          pu, pv     ! momentum fields (before u and v for the 1st call, and 
    184       !             ! laplacian of these fields multiplied by ahm for the 2nd 
    185       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) ::   & 
    186          plu, plv   ! partial harmonic operator applied to 
    187       !             ! pu and pv (all the components except 
    188       !             ! second order vertical derivative term) 
    189       INTEGER, INTENT( in ) ::   & 
    190          kahm       ! =1 the laplacian is multiplied by the eddy diffusivity coef. 
    191       !             ! =2 no multiplication 
    192  
    193       !! * Local declarations 
    194       INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    195       REAL(wp) ::   & 
    196          zabe1, zabe2, zcof1, zcof2,    &  ! temporary scalars 
    197          zcoef0, zcoef3, zcoef4 
    198       REAL(wp) ::   & 
    199          zbur, zbvr, zmkt, zmkf, zuav, zvav,    & 
    200          zuwslpi, zuwslpj, zvwslpi, zvwslpj 
    201       REAL(wp), DIMENSION(jpi,jpj) ::   & 
    202          ziut, zjuf , zjvt, zivf,       &  ! workspace 
    203          zdku, zdk1u, zdkv, zdk1v 
    204       REAL(wp), DIMENSION(jpi,jpk) ::   & 
    205          zfuw, zfvw, zdiu, zdiv,        &  ! workspace 
    206          zdju, zdj1u, zdjv, zdj1v  
    207       !!---------------------------------------------------------------------- 
    208  
     176      !!---------------------------------------------------------------------- 
     177      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     178      USE wrk_nemo, ONLY:   ziut => wrk_2d_1 , zjuf  => wrk_2d_2 , zjvt  => wrk_2d_3 
     179      USE wrk_nemo, ONLY:   zivf => wrk_2d_4 , zdku  => wrk_2d_5 , zdk1u => wrk_2d_6 
     180      USE wrk_nemo, ONLY:   zdkv => wrk_2d_7 , zdk1v => wrk_2d_8 
     181      !! 
     182      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu , pv    ! 1st call: before horizontal velocity  
     183      !                                                               ! 2nd call: ahm x these fields 
     184      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   plu, plv   ! partial harmonic operator applied to 
     185      !                                                               ! pu and pv (all the components except 
     186      !                                                               ! second order vertical derivative term) 
     187      INTEGER                         , INTENT(in   ) ::   kahm       ! =1 1st call ; =2 2nd call 
     188      ! 
     189      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     190      REAL(wp) ::   zabe1 , zabe2 , zcof1 , zcof2        ! local scalar 
     191      REAL(wp) ::   zcoef0, zcoef3, zcoef4               !   -      - 
     192      REAL(wp) ::   zbur, zbvr, zmkt, zmkf, zuav, zvav   !   -      - 
     193      REAL(wp) ::   zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
     194      !!---------------------------------------------------------------------- 
     195 
     196      IF( wrk_in_use(2, 1,2,3,4,5,6,7,8) ) THEN 
     197         CALL ctl_stop('dyn:ldfguv: requested workspace arrays unavailable')   ;   RETURN 
     198      END IF 
    209199      !                               ! ********** !   ! =============== 
    210200      DO jk = 1, jpkm1                ! First step !   ! Horizontal slab 
     
    461451      END DO                                           !   End of slab 
    462452      !                                                ! =============== 
     453 
     454      IF( wrk_not_released(2, 1,2,3,4,5,6,7,8) )   CALL ctl_stop('dyn:ldfguv: failed to release workspace arrays') 
     455      ! 
    463456   END SUBROUTINE ldfguv 
    464457 
     
    469462CONTAINS 
    470463   SUBROUTINE dyn_ldf_bilapg( kt )               ! Dummy routine 
     464      INTEGER, INTENT(in) :: kt 
    471465      WRITE(*,*) 'dyn_ldf_bilapg: You should not have seen this print! error?', kt 
    472466   END SUBROUTINE dyn_ldf_bilapg 
Note: See TracChangeset for help on using the changeset viewer.