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/ZDF/zdfddm.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/ZDF/zdfddm.F90

    r2528 r2715  
    2121   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2222   USE prtctl          ! Print control 
     23   USE lib_mpp            ! MPP library 
    2324 
    2425   IMPLICIT NONE 
     
    2728   PUBLIC   zdf_ddm       ! called by step.F90 
    2829   PUBLIC   zdf_ddm_init  ! called by opa.F90 
     30   PUBLIC   zdf_ddm_alloc ! called by nemogcm.F90 
    2931 
    3032   LOGICAL , PUBLIC, PARAMETER ::   lk_zdfddm = .TRUE.  !: double diffusive mixing flag 
    3133 
    32    REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   avs    !: salinity vertical diffusivity coeff. at w-point 
    33    REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   rrau   !: heat/salt buoyancy flux ratio 
     34   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avs    !: salinity vertical diffusivity coeff. at w-point 
     35   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   rrau   !: heat/salt buoyancy flux ratio 
    3436 
    3537   !                                  !!* Namelist namzdf_ddm : double diffusive mixing * 
     
    4042#  include "vectopt_loop_substitute.h90" 
    4143   !!---------------------------------------------------------------------- 
    42    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     44   !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
    4345   !! $Id$ 
    44    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    45    !!---------------------------------------------------------------------- 
    46  
     46   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     47   !!---------------------------------------------------------------------- 
    4748CONTAINS 
     49 
     50   INTEGER FUNCTION zdf_ddm_alloc() 
     51      !!---------------------------------------------------------------------- 
     52      !!                ***  ROUTINE zdf_ddm_alloc  *** 
     53      !!---------------------------------------------------------------------- 
     54      ALLOCATE( avs(jpi,jpj,jpk), rrau(jpi,jpj,jpk), STAT= zdf_ddm_alloc ) 
     55      ! 
     56      IF( lk_mpp             )   CALL mpp_sum ( zdf_ddm_alloc ) 
     57      IF( zdf_ddm_alloc /= 0 )   CALL ctl_warn('zdf_ddm_alloc: failed to allocate arrays') 
     58   END FUNCTION zdf_ddm_alloc 
     59 
    4860 
    4961   SUBROUTINE zdf_ddm( kt ) 
     
    7991      !! References :   Merryfield et al., JPO, 29, 1124-1142, 1999. 
    8092      !!---------------------------------------------------------------------- 
     93      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     94      USE wrk_nemo, ONLY:   zmsks  => wrk_2d_1 , zmskf  => wrk_2d_2 , zmskd1 => wrk_2d_3   ! 2D workspace 
     95      USE wrk_nemo, ONLY:   zmskd2 => wrk_2d_4 , zmskd3 => wrk_2d_5                        !  -      - 
     96      ! 
    8197      INTEGER, INTENT(in) ::   kt   ! ocean time-step indexocean time step 
    82       !! 
     98      ! 
    8399      INTEGER  ::   ji, jj , jk     ! dummy loop indices 
    84100      REAL(wp) ::   zinr, zrr       ! temporary scalars 
    85101      REAL(wp) ::   zavft, zavfs    !    -         - 
    86102      REAL(wp) ::   zavdt, zavds    !    -         - 
    87       REAL(wp), DIMENSION(jpi,jpj) ::   zmsks, zmskf, zmskd1, zmskd2, zmskd3   ! 2D workspace  
    88       !!---------------------------------------------------------------------- 
     103      !!---------------------------------------------------------------------- 
     104 
     105      IF( wrk_in_use(2, 1,2,3,4,5) ) THEN 
     106         CALL ctl_stop('zdf_ddm: Requested workspace arrays already in use')   ;   RETURN 
     107      ENDIF 
    89108 
    90109      !                                                ! =============== 
     
    98117            DO ji = 1, jpi 
    99118               ! stability indicator: msks=1 if rn2>0; 0 elsewhere 
    100                IF( rn2(ji,jj,jk) + 1.e-12  <= 0. ) THEN   ;   zmsks(ji,jj) = 0.e0 
    101                ELSE                                       ;   zmsks(ji,jj) = 1.e0 
     119               IF( rn2(ji,jj,jk) + 1.e-12  <= 0. ) THEN   ;   zmsks(ji,jj) = 0._wp 
     120               ELSE                                       ;   zmsks(ji,jj) = 1._wp 
    102121               ENDIF 
    103122               ! salt fingering indicator: msksf=1 if rrau>1; 0 elsewhere             
    104                IF( rrau(ji,jj,jk) <= 1.          ) THEN   ;   zmskf(ji,jj) = 0.e0 
    105                ELSE                                       ;   zmskf(ji,jj) = 1.e0 
     123               IF( rrau(ji,jj,jk) <= 1.          ) THEN   ;   zmskf(ji,jj) = 0._wp 
     124               ELSE                                       ;   zmskf(ji,jj) = 1._wp 
    106125               ENDIF 
    107126               ! diffusive layering indicators:  
    108127               !     ! mskdl1=1 if 0<rrau<1; 0 elsewhere 
    109                IF( rrau(ji,jj,jk) >= 1.          ) THEN   ;   zmskd1(ji,jj) = 0.e0 
    110                ELSE                                       ;   zmskd1(ji,jj) = 1.e0 
     128               IF( rrau(ji,jj,jk) >= 1.          ) THEN   ;   zmskd1(ji,jj) = 0._wp 
     129               ELSE                                       ;   zmskd1(ji,jj) = 1._wp 
    111130               ENDIF 
    112131               !     ! mskdl2=1 if 0<rrau<0.5; 0 elsewhere 
    113                IF( rrau(ji,jj,jk) >= 0.5         ) THEN   ;   zmskd2(ji,jj) = 0.e0 
    114                ELSE                                       ;   zmskd2(ji,jj) = 1.e0 
     132               IF( rrau(ji,jj,jk) >= 0.5         ) THEN   ;   zmskd2(ji,jj) = 0._wp 
     133               ELSE                                       ;   zmskd2(ji,jj) = 1._wp 
    115134               ENDIF 
    116135               !   mskdl3=1 if 0.5<rrau<1; 0 elsewhere 
    117                IF( rrau(ji,jj,jk) <= 0.5 .OR. rrau(ji,jj,jk) >= 1. ) THEN   ;   zmskd3(ji,jj) = 0.e0 
    118                ELSE                                                         ;   zmskd3(ji,jj) = 1.e0 
     136               IF( rrau(ji,jj,jk) <= 0.5 .OR. rrau(ji,jj,jk) >= 1. ) THEN   ;   zmskd3(ji,jj) = 0._wp 
     137               ELSE                                                         ;   zmskd3(ji,jj) = 1._wp 
    119138               ENDIF 
    120139            END DO 
     
    166185      !                                                   ! =============== 
    167186      ! 
    168       CALL lbc_lnk( avt , 'W', 1. )        ! Lateral boundary conditions   (unchanged sign) 
    169       CALL lbc_lnk( avs , 'W', 1. ) 
    170       CALL lbc_lnk( avm , 'W', 1. ) 
    171       CALL lbc_lnk( avmu, 'U', 1. )  
    172       CALL lbc_lnk( avmv, 'V', 1. ) 
     187      CALL lbc_lnk( avt , 'W', 1._wp )     ! Lateral boundary conditions   (unchanged sign) 
     188      CALL lbc_lnk( avs , 'W', 1._wp ) 
     189      CALL lbc_lnk( avm , 'W', 1._wp ) 
     190      CALL lbc_lnk( avmu, 'U', 1._wp )  
     191      CALL lbc_lnk( avmv, 'V', 1._wp ) 
    173192 
    174193      IF(ln_ctl) THEN 
     
    178197      ENDIF 
    179198      ! 
     199      IF( wrk_not_released(2, 1,2,3,4,5) )   CALL ctl_stop('zdf_ddm: Release of workspace arrays failed') 
     200      ! 
    180201   END SUBROUTINE zdf_ddm 
    181202    
     
    193214      !!---------------------------------------------------------------------- 
    194215      ! 
    195       REWIND ( numnam )               ! Read Namelist namzdf_ddm : double diffusion mixing scheme 
    196       READ   ( numnam, namzdf_ddm ) 
     216      REWIND( numnam )                ! Read Namelist namzdf_ddm : double diffusion mixing scheme 
     217      READ  ( numnam, namzdf_ddm ) 
    197218      ! 
    198219      IF(lwp) THEN                    ! Parameter print 
     
    203224         WRITE(numout,*) '      maximum avs for dd mixing      rn_avts   = ', rn_avts 
    204225         WRITE(numout,*) '      heat/salt buoyancy flux ratio  rn_hsbfr  = ', rn_hsbfr 
    205          WRITE(numout,*) 
    206226      ENDIF 
     227      ! 
     228      !                              ! allocate zdfddm arrays 
     229      IF( zdf_ddm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_ddm_init : unable to allocate arrays' ) 
    207230      ! 
    208231   END SUBROUTINE zdf_ddm_init 
Note: See TracChangeset for help on using the changeset viewer.