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/DIA – 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

Location:
trunk/NEMOGCM/NEMO/OPA_SRC/DIA
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90

    r2528 r2715  
    77   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase + merge TRC-TRA 
    88   !!---------------------------------------------------------------------- 
    9 #if defined key_diaar5 
     9#if defined key_diaar5   || defined key_esopa 
    1010   !!---------------------------------------------------------------------- 
    1111   !!   'key_diaar5'  :                           activate ar5 diagnotics 
     
    2525   PUBLIC   dia_ar5        ! routine called in step.F90 module 
    2626   PUBLIC   dia_ar5_init   ! routine called in opa.F90 module 
     27   PUBLIC   dia_ar5_alloc  ! routine called in nemogcm.F90 module 
    2728 
    2829   LOGICAL, PUBLIC, PARAMETER :: lk_diaar5 = .TRUE.   ! coupled flag 
     
    3031   REAL(wp)                         ::   vol0         ! ocean volume (interior domain) 
    3132   REAL(wp)                         ::   area_tot     ! total ocean surface (interior domain) 
    32    REAL(wp), DIMENSION(jpi,jpj    ) ::   area         ! cell surface (interior domain) 
    33    REAL(wp), DIMENSION(jpi,jpj    ) ::   thick0       ! ocean thickness (interior domain) 
    34    REAL(wp), DIMENSION(jpi,jpj,jpk) ::   sn0          ! initial salinity 
     33   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::   area         ! cell surface (interior domain) 
     34   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::   thick0       ! ocean thickness (interior domain) 
     35   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sn0          ! initial salinity 
    3536       
    3637   !! * Substitutions 
     
    4344CONTAINS 
    4445 
     46   FUNCTION dia_ar5_alloc() 
     47      !!---------------------------------------------------------------------- 
     48      !!                    ***  ROUTINE dia_ar5_alloc  *** 
     49      !!---------------------------------------------------------------------- 
     50      INTEGER :: dia_ar5_alloc 
     51      !!---------------------------------------------------------------------- 
     52      ! 
     53      ALLOCATE( area(jpi,jpj), thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 
     54      ! 
     55      IF( lk_mpp             )   CALL mpp_sum ( dia_ar5_alloc ) 
     56      IF( dia_ar5_alloc /= 0 )   CALL ctl_warn('dia_ar5_alloc: failed to allocate arrays') 
     57      ! 
     58   END FUNCTION dia_ar5_alloc 
     59 
     60 
    4561   SUBROUTINE dia_ar5( kt ) 
    4662      !!---------------------------------------------------------------------- 
     
    4864      !! 
    4965      !! ** Purpose :   compute and output some AR5 diagnostics 
    50       !! 
    51       !!---------------------------------------------------------------------- 
     66      !!---------------------------------------------------------------------- 
     67      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     68      USE wrk_nemo, ONLY:   zarea_ssh => wrk_2d_1 , zbotpres => wrk_2d_2   ! 2D workspace 
     69      USE wrk_nemo, ONLY:   zrhd      => wrk_3d_1 , zrhop    => wrk_3d_2   ! 3D      - 
     70      USE wrk_nemo, ONLY:   ztsn      => wrk_4d_1                          ! 4D      - 
     71      ! 
    5272      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    53       !! 
     73      ! 
    5474      INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    5575      REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 
    56       REAL(wp), DIMENSION(jpi,jpj    ) ::   zarea_ssh, zbotpres 
    57       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zrhd, zrhop 
    58       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::   ztsn 
    5976      !!-------------------------------------------------------------------- 
     77 
     78      IF( wrk_in_use(2, 1,2) .OR.   & 
     79          wrk_in_use(3, 1,2) .OR.   & 
     80          wrk_in_use(4, 1)   ) THEN 
     81         CALL ctl_stop('dia_ar5: requested workspace arrays unavailable')   ;   RETURN 
     82      ENDIF 
    6083 
    6184      CALL iom_put( 'cellthc', fse3t(:,:,:) ) 
     
    137160      CALL iom_put( 'saltot' , zsal  ) 
    138161      ! 
     162      IF( wrk_not_released(2, 1,2) .OR.   & 
     163          wrk_not_released(3, 1,2) .OR.   & 
     164          wrk_not_released(4, 1)   )   CALL ctl_stop('dia_ar5: failed to release workspace arrays') 
     165      ! 
    139166   END SUBROUTINE dia_ar5 
    140167 
     
    146173      !! ** Purpose :   initialization for AR5 diagnostic computation 
    147174      !!---------------------------------------------------------------------- 
     175      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     176      USE wrk_nemo, ONLY:   wrk_4d_1      ! 4D workspace 
     177      ! 
    148178      INTEGER  ::   inum 
    149179      INTEGER  ::   ik 
    150180      INTEGER  ::   ji, jj, jk  ! dummy loop indices 
    151181      REAL(wp) ::   zztmp   
    152       REAL(wp), DIMENSION(jpi,jpj,jpk, 2) ::   zsaldta   ! Jan/Dec levitus salinity 
    153       !!---------------------------------------------------------------------- 
    154       ! 
     182      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zsaldta   ! Jan/Dec levitus salinity 
     183      !!---------------------------------------------------------------------- 
     184      ! 
     185      IF(wrk_in_use(4, 1) ) THEN 
     186         CALL ctl_stop('dia_ar5_init: requested workspace array unavailable.')   ;   RETURN 
     187      ENDIF 
     188      zsaldta => wrk_4d_1(:,:,:,1:2) 
     189 
     190      !                                      ! allocate dia_ar5 arrays 
     191      IF( dia_ar5_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 
     192 
    155193      area(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:) 
    156194 
     
    183221      ENDIF 
    184222      ! 
     223      IF( wrk_not_released(4, 1) )   CALL ctl_stop('dia_ar5_init: failed to release workspace array') 
     224      ! 
    185225   END SUBROUTINE dia_ar5_init 
    186226 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diadimg.F90

    r2528 r2715  
    66# if defined key_dimgout 
    77   !!---------------------------------------------------------------------- 
    8    !! * Modules used 
    98   USE oce             ! ocean dynamics and tracers  
    109   USE dom_oce         ! ocean space and time domain 
     
    1514   PRIVATE 
    1615 
    17    !! * Accessibility 
    1816   PUBLIC dia_wri_dimg            ! called by trd_mld (eg) 
     17   PUBLIC dia_wri_dimg_alloc      ! called by nemo_alloc in nemogcm.F90 
     18 
     19 
     20   !! These workspace arrays are inside the module so that we can make them 
     21   !! allocatable in a clean way. Not done in wrk_nemo because these are of KIND(sp). 
     22   REAL(sp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: z42d    ! 2d temporary workspace (sp) 
     23   REAL(sp), ALLOCATABLE, SAVE, DIMENSION(:)   :: z4dep   ! vertical level (sp) 
    1924 
    2025   !! * Substitutions 
    2126#  include "domzgr_substitute.h90" 
    22  
    2327   !!---------------------------------------------------------------------- 
    2428   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    2630   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    2731   !!---------------------------------------------------------------------- 
    28  
    2932CONTAINS 
    3033 
    31   SUBROUTINE dia_wri_dimg(cd_name, cd_text, ptab, klev, cd_type , ksubi ) 
     34   FUNCTION dia_wri_dimg_alloc() 
     35      !!--------------------------------------------------------------------- 
     36      !!        *** ROUTINE dia_wri_dimg_alloc *** 
     37      !! 
     38      !!--------------------------------------------------------------------- 
     39      INTEGER :: dia_wri_dimg_alloc   ! return value 
     40      !!--------------------------------------------------------------------- 
     41      ! 
     42      ALLOCATE( z42d(jpi,jpj), z4dep(jpk), STAT=dia_wri_dimg_alloc ) 
     43      ! 
     44      IF( lk_mpp                  )   CALL mpp_sum ( dia_wri_dimg_alloc ) 
     45      IF( dia_wri_dimg_alloc /= 0 )   CALL ctl_warn('dia_wri_dimg_alloc: allocation of array failed.') 
     46      ! 
     47  END FUNCTION dia_wri_dimg_alloc 
     48 
     49 
     50  SUBROUTINE dia_wri_dimg( cd_name, cd_text, ptab, klev, cd_type , ksubi ) 
    3251    !!------------------------------------------------------------------------- 
    3352    !!        *** ROUTINE dia_wri_dimg *** 
    3453    !! 
    35     !! ** Purpose : write ptab in the dimg file cd_name, with comment cd_text. 
    36     !!       ptab has klev x 2D fields 
     54    !! ** Purpose :   write ptab in the dimg file cd_name, with comment cd_text. 
     55    !!              ptab has klev x 2D fields 
    3756    !! 
    38     !! ** Action : 
    39     !!       Define header variables from the config parameters 
    40     !!       Open the dimg file on unit inum = 14 ( IEEE I4R4 file ) 
    41     !!       Write header on record 1 
    42     !!       Write ptab on the following klev records 
     57    !! ** Action :   Define header variables from the config parameters 
     58    !!               Open the dimg file on unit inum = 14 ( IEEE I4R4 file ) 
     59    !!               Write header on record 1 
     60    !!               Write ptab on the following klev records 
    4361    !! 
    44     !! History : 
    45     !!   03-12 (J.M. Molines ) : Original. Replace ctl_opn, writn2d 
     62    !! History :  2003-12 (J.M. Molines ) : Original. Replace ctl_opn, writn2d 
    4663    !!--------------------------------------------------------------------------- 
    47     !! * Arguments 
    4864    CHARACTER(len=*),INTENT(in) ::   & 
    4965         &                            cd_name,  &  ! dimg file name 
     
    6379    REAL(sp)                    :: zdx,zdy,zspval,zwest,ztimm 
    6480    REAL(sp)                    :: zsouth 
    65     REAL(sp),DIMENSION(jpi,jpj) :: z42d        ! 2d temporary workspace (sp) 
    66     REAL(sp),DIMENSION(jpk)     :: z4dep       ! vertical level (sp) 
    6781 
    6882    CHARACTER(LEN=80) :: clname                ! name of file in case of dimgnnn 
    6983    CHARACTER(LEN=4) :: clver='@!01'           ! dimg string identifier 
    7084    !!--------------------------------------------------------------------------- 
     85 
     86    !                                      ! allocate dia_wri_dimg array 
     87    IF( dia_wri_dimg_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_wri_dimg : unable to allocate arrays' ) 
    7188 
    7289    !! * Initialisations 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diahth.F90

    r2561 r2715  
    2121   USE phycst          ! physical constants 
    2222   USE in_out_manager  ! I/O manager 
     23   USE lib_mpp         ! MPP library 
    2324   USE iom             ! I/O library 
    2425 
     
    2627   PRIVATE 
    2728 
    28    PUBLIC   dia_hth    ! routine called by step.F90 
    29  
    30    LOGICAL , PUBLIC, PARAMETER          ::   lk_diahth = .TRUE.   !: thermocline-20d depths flag 
     29   PUBLIC   dia_hth       ! routine called by step.F90 
     30   PUBLIC   dia_hth_alloc ! routine called by nemogcm.F90 
     31 
     32   LOGICAL , PUBLIC, PARAMETER          ::   lk_diahth = .TRUE.    !: thermocline-20d depths flag 
    3133   ! note: following variables should move to local variables once iom_put is always used  
    32    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   hth                  !: depth of the max vertical temperature gradient [m] 
    33    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   hd20                 !: depth of 20 C isotherm                         [m] 
    34    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   hd28                 !: depth of 28 C isotherm                         [m] 
    35    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   htc3                 !: heat content of first 300 m                    [W] 
     34   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hth    !: depth of the max vertical temperature gradient [m] 
     35   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hd20   !: depth of 20 C isotherm                         [m] 
     36   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hd28   !: depth of 28 C isotherm                         [m] 
     37   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   htc3   !: heat content of first 300 m                    [W] 
    3638 
    3739   !! * Substitutions 
    3840#  include "domzgr_substitute.h90" 
    3941   !!---------------------------------------------------------------------- 
    40    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     42   !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
    4143   !! $Id$  
    4244   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4345   !!---------------------------------------------------------------------- 
    4446CONTAINS 
     47 
     48   FUNCTION dia_hth_alloc() 
     49      !!--------------------------------------------------------------------- 
     50      INTEGER :: dia_hth_alloc 
     51      !!--------------------------------------------------------------------- 
     52      ! 
     53      ALLOCATE(hth(jpi,jpj), hd20(jpi,jpj), hd28(jpi,jpj), htc3(jpi,jpj), STAT=dia_hth_alloc) 
     54      ! 
     55      IF( lk_mpp           )   CALL mpp_sum ( dia_hth_alloc ) 
     56      IF(dia_hth_alloc /= 0)   CALL ctl_warn('dia_hth_alloc: failed to allocate arrays.') 
     57      ! 
     58   END FUNCTION dia_hth_alloc 
     59 
    4560 
    4661   SUBROUTINE dia_hth( kt ) 
     
    6883      INTEGER                          ::   ji, jj, jk            ! dummy loop arguments 
    6984      INTEGER                          ::   iid, ilevel           ! temporary integers 
    70       INTEGER, DIMENSION(jpi,jpj)      ::   ik20, ik28            ! levels 
     85      INTEGER, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ik20, ik28  ! levels 
    7186      REAL(wp)                         ::   zavt5 = 5.e-4_wp      ! Kz criterion for the turbocline depth 
    7287      REAL(wp)                         ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth 
     
    7691      REAL(wp)                         ::   zztmp, zzdep          ! temporary scalars inside do loop 
    7792      REAL(wp)                         ::   zu, zv, zw, zut, zvt  ! temporary workspace 
    78       REAL(wp), DIMENSION(jpi,jpj)     ::   zabs2                 ! MLD: abs( tn - tn(10m) ) = ztem2  
    79       REAL(wp), DIMENSION(jpi,jpj)     ::   ztm2                  ! Top of thermocline: tn = tn(10m) - ztem2      
    80       REAL(wp), DIMENSION(jpi,jpj)     ::   zrho10_3              ! MLD: rho = rho10m + zrho3       
    81       REAL(wp), DIMENSION(jpi,jpj)     ::   zpycn                 ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
    82       REAL(wp), DIMENSION(jpi,jpj)     ::   ztinv                 ! max of temperature inversion 
    83       REAL(wp), DIMENSION(jpi,jpj)     ::   zdepinv               ! depth of temperature inversion 
    84       REAL(wp), DIMENSION(jpi,jpj)     ::   zrho0_3               ! MLD rho = rho(surf) = 0.03 
    85       REAL(wp), DIMENSION(jpi,jpj)     ::   zrho0_1               ! MLD rho = rho(surf) = 0.01 
    86       REAL(wp), DIMENSION(jpi,jpj)     ::   zmaxdzT               ! max of dT/dz 
    87       REAL(wp), DIMENSION(jpi,jpj)     ::   zthick                ! vertical integration thickness  
    88       REAL(wp), DIMENSION(jpi,jpj)     ::   zdelr                 ! delta rho equivalent to deltaT = 0.2 
     93      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2  
     94      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2      
     95      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho10_3   ! MLD: rho = rho10m + zrho3       
     96      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
     97      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztinv      ! max of temperature inversion 
     98      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdepinv    ! depth of temperature inversion 
     99      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03 
     100      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01 
     101      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zmaxdzT    ! max of dT/dz 
     102      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zthick     ! vertical integration thickness  
     103      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
    89104      !!---------------------------------------------------------------------- 
    90105 
    91106      IF( kt == nit000 ) THEN 
     107         !                                      ! allocate dia_hth array 
     108         IF( dia_hth_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'lim_sbc_init : unable to allocate standard arrays' ) 
     109 
     110         IF(.not. ALLOCATED(ik20))THEN 
     111            ALLOCATE(ik20(jpi,jpj), ik28(jpi,jpj), & 
     112               &      zabs2(jpi,jpj),   & 
     113               &      ztm2(jpi,jpj),    & 
     114               &      zrho10_3(jpi,jpj),& 
     115               &      zpycn(jpi,jpj),   & 
     116               &      ztinv(jpi,jpj),   & 
     117               &      zdepinv(jpi,jpj), & 
     118               &      zrho0_3(jpi,jpj), & 
     119               &      zrho0_1(jpi,jpj), & 
     120               &      zmaxdzT(jpi,jpj), & 
     121               &      zthick(jpi,jpj),  & 
     122               &      zdelr(jpi,jpj), STAT=ji) 
     123            IF( lk_mpp  )   CALL mpp_sum(ji) 
     124            IF( ji /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard ocean arrays' ) 
     125         END IF 
     126 
    92127         IF(lwp) WRITE(numout,*) 
    93128         IF(lwp) WRITE(numout,*) 'dia_hth : diagnostics of the thermocline depth' 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90

    r2571 r2715  
    5050   INTEGER , PUBLIC ::   nn_fwri    = 15        !: frequency of ptr outputs      [time step] 
    5151 
    52    REAL(wp), PUBLIC, DIMENSION(:), ALLOCATABLE ::   htr_adv, htr_ldf, htr_ove   !: Heat TRansports (adv, diff, overturn.) 
    53    REAL(wp), PUBLIC, DIMENSION(:), ALLOCATABLE ::   str_adv, str_ldf, str_ove   !: Salt TRansports (adv, diff, overturn.) 
     52   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   htr_adv, htr_ldf, htr_ove   !: Heat TRansports (adv, diff, overturn.) 
     53   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   str_adv, str_ldf, str_ove   !: Salt TRansports (adv, diff, overturn.) 
    5454    
    55    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   btmsk                  ! T-point basin interior masks 
    56    REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   btm30                  ! mask out Southern Ocean (=0 south of 30°S) 
    57    REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   htr  , str             ! adv heat and salt transports (approx) 
    58    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   tn_jk, sn_jk , v_msf   ! i-mean T and S, j-Stream-Function 
    59    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   sjk  , r1_sjk          ! i-mean i-k-surface and its inverse         
    60 #if defined key_diaeiv 
    61    REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   htr_eiv, str_eiv   ! bolus adv heat ans salt transports    ('key_diaeiv') 
    62    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   v_msf_eiv          ! bolus j-streamfuction                 ('key_diaeiv') 
    63 #endif 
     55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   btmsk                  ! T-point basin interior masks 
     56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   btm30                  ! mask out Southern Ocean (=0 south of 30°S) 
     57   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htr  , str             ! adv heat and salt transports (approx) 
     58   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_jk, sn_jk , v_msf   ! i-mean T and S, j-Stream-Function 
     59   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sjk  , r1_sjk          ! i-mean i-k-surface and its inverse         
     60   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htr_eiv, str_eiv       ! bolus adv heat ans salt transports ('key_diaeiv') 
     61   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   v_msf_eiv              ! bolus j-streamfuction              ('key_diaeiv') 
     62 
    6463 
    6564   INTEGER ::   niter       ! 
     
    7170   REAL(wp) ::   rc_pwatt = 1.e-15_wp  ! conversion from W    to PW (further x rau0 x Cp) 
    7271   REAL(wp) ::   rc_ggram = 1.e-6_wp   ! conversion from g    to Pg 
     72 
     73   REAL(wp), TARGET, DIMENSION(:),   ALLOCATABLE, SAVE :: p_fval1d 
     74   REAL(wp), TARGET, DIMENSION(:,:), ALLOCATABLE, SAVE :: p_fval2d 
     75 
     76   !! Integer, 1D workspace arrays. Not common enough to be implemented in  
     77   !! wrk_nemo module. 
     78   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: ndex  , ndex_atl     , ndex_pac     , ndex_ind     , ndex_ipc 
     79   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) ::         ndex_atl_30  , ndex_pac_30  , ndex_ind_30  , ndex_ipc_30 
     80   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: ndex_h, ndex_h_atl_30, ndex_h_pac_30, ndex_h_ind_30, ndex_h_ipc_30 
    7381 
    7482   !! * Substitutions 
     
    8290CONTAINS 
    8391 
     92   FUNCTION dia_ptr_alloc() 
     93      !!---------------------------------------------------------------------- 
     94      !!                    ***  ROUTINE dia_ptr_alloc  *** 
     95      !!---------------------------------------------------------------------- 
     96      INTEGER               ::   dia_ptr_alloc   ! return value 
     97      INTEGER, DIMENSION(5) ::   ierr 
     98      !!---------------------------------------------------------------------- 
     99      ierr(:) = 0 
     100      ! 
     101      ALLOCATE( btmsk(jpi,jpj,nptr) ,           & 
     102         &      htr_adv(jpj) , str_adv(jpj) ,   & 
     103         &      htr_ldf(jpj) , str_ldf(jpj) ,   & 
     104         &      htr_ove(jpj) , str_ove(jpj),    & 
     105         &      htr(jpj,nptr) , str(jpj,nptr) , & 
     106         &      tn_jk(jpj,jpk,nptr) , sn_jk (jpj,jpk,nptr) , v_msf(jpj,jpk,nptr) , & 
     107         &      sjk  (jpj,jpk,nptr) , r1_sjk(jpj,jpk,nptr) , STAT=ierr(1)  ) 
     108         ! 
     109#if defined key_diaeiv 
     110      ALLOCATE( htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) , & 
     111         &      v_msf_eiv(jpj,jpk,nptr) , STAT=ierr(2) ) 
     112#endif 
     113      ALLOCATE( p_fval1d(jpj), p_fval2d(jpj,jpk), Stat=ierr(3)) 
     114      ! 
     115      ALLOCATE(ndex(jpj*jpk),        ndex_atl(jpj*jpk), ndex_pac(jpj*jpk), & 
     116         &     ndex_ind(jpj*jpk),    ndex_ipc(jpj*jpk),                    & 
     117         &     ndex_atl_30(jpj*jpk), ndex_pac_30(jpj*jpk), Stat=ierr(4)) 
     118 
     119      ALLOCATE(ndex_ind_30(jpj*jpk), ndex_ipc_30(jpj*jpk),                   & 
     120         &     ndex_h(jpj),          ndex_h_atl_30(jpj), ndex_h_pac_30(jpj), & 
     121         &     ndex_h_ind_30(jpj),   ndex_h_ipc_30(jpj), Stat=ierr(5) ) 
     122         ! 
     123      dia_ptr_alloc = MAXVAL( ierr ) 
     124      IF(lk_mpp)   CALL mpp_sum( dia_ptr_alloc ) 
     125      ! 
     126   END FUNCTION dia_ptr_alloc 
     127 
     128 
    84129   FUNCTION ptr_vj_3d( pva )   RESULT ( p_fval ) 
    85130      !!---------------------------------------------------------------------- 
     
    97142      INTEGER                  ::   ji, jj, jk   ! dummy loop arguments 
    98143      INTEGER                  ::   ijpj         ! ??? 
    99       REAL(wp), DIMENSION(jpj) ::   p_fval       ! function value 
     144      REAL(wp), POINTER, DIMENSION(:) :: p_fval  ! function value 
    100145      !!-------------------------------------------------------------------- 
    101146      ! 
     147      p_fval => p_fval1d 
     148 
    102149      ijpj = jpj 
    103150      p_fval(:) = 0._wp 
     
    109156         END DO 
    110157      END DO 
    111       ! 
    112 #if defined key_mpp_mpi 
    113       CALL mpp_sum( p_fval, ijpj, ncomm_znl) 
     158#if defined key_mpp_mpi 
     159      IF(lk_mpp)   CALL mpp_sum( p_fval, ijpj, ncomm_znl) 
    114160#endif 
    115161      ! 
     
    128174      !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    129175      !!---------------------------------------------------------------------- 
     176      IMPLICIT none 
    130177      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pva   ! mask flux array at V-point 
    131178      !! 
    132       INTEGER                  ::   ji,jj    ! dummy loop arguments 
    133       INTEGER                  ::   ijpj     ! ??? 
    134       REAL(wp), DIMENSION(jpj) ::   p_fval  ! function value 
     179      INTEGER                  ::   ji,jj       ! dummy loop arguments 
     180      INTEGER                  ::   ijpj        ! ??? 
     181      REAL(wp), POINTER, DIMENSION(:) :: p_fval ! function value 
    135182      !!-------------------------------------------------------------------- 
    136183      !  
     184      p_fval => p_fval1d 
     185 
    137186      ijpj = jpj 
    138187      p_fval(:) = 0._wp 
     
    142191         END DO 
    143192      END DO 
    144       ! 
    145193#if defined key_mpp_mpi 
    146194      CALL mpp_sum( p_fval, ijpj, ncomm_znl ) 
     
    161209      !! ** Action  : - p_fval: i-mean poleward flux of pva 
    162210      !!---------------------------------------------------------------------- 
     211#if defined key_mpp_mpi 
     212      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     213      USE wrk_nemo, ONLY:   zwork => wrk_1d_1 
     214#endif 
     215      !! 
     216      IMPLICIT none 
    163217      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk)           ::   pva    ! mask flux array at V-point 
    164218      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)    , OPTIONAL ::   pmsk   ! Optional 2D basin mask 
    165219      !! 
    166       INTEGER                      ::   ji, jj, jk  ! dummy loop arguments 
    167       REAL(wp), DIMENSION(jpj,jpk) ::   p_fval       ! return function value 
     220      INTEGER                           :: ji, jj, jk ! dummy loop arguments 
     221      REAL(wp), POINTER, DIMENSION(:,:) :: p_fval     ! return function value 
    168222#if defined key_mpp_mpi 
    169223      INTEGER, DIMENSION(1) ::   ish 
    170224      INTEGER, DIMENSION(2) ::   ish2 
    171       REAL(wp), DIMENSION(jpj*jpk) ::   zwork   ! 1D workspace 
     225      INTEGER               ::   ijpjjpk 
    172226#endif 
    173227      !!-------------------------------------------------------------------- 
    174228      ! 
     229#if defined key_mpp_mpi 
     230      IF( wrk_in_use(1, 1) ) THEN 
     231         CALL ctl_stop('ptr_vjk: ERROR - requested workspace array is unavailable')   ;   RETURN 
     232      END IF 
     233#endif 
     234 
     235      p_fval => p_fval2d 
     236 
    175237      p_fval(:,:) = 0._wp 
    176238      ! 
     
    195257      ! 
    196258#if defined key_mpp_mpi 
    197       ish(1) = jpj*jpk   ;   ish2(1) = jpj   ;   ish2(2) = jpk 
    198       zwork(:) = RESHAPE( p_fval, ish ) 
    199       CALL mpp_sum( zwork, jpj*jpk, ncomm_znl ) 
     259      ijpjjpk = jpj*jpk 
     260      ish(1) = ijpjjpk  ;   ish2(1) = jpj   ;   ish2(2) = jpk 
     261      zwork(1:ijpjjpk) = RESHAPE( p_fval, ish ) 
     262      CALL mpp_sum( zwork, ijpjjpk, ncomm_znl ) 
    200263      p_fval(:,:) = RESHAPE( zwork, ish2 ) 
    201264#endif 
    202265      ! 
     266#if defined key_mpp_mpi 
     267      IF( wrk_not_released(1, 1) )   CALL ctl_stop('ptr_vjk: ERROR - failed to release workspace array') 
     268#endif 
     269      ! 
    203270   END FUNCTION ptr_vjk 
    204271 
     
    214281      !! ** Action  : - p_fval: i-sum of e1t*e3t*pta 
    215282      !!---------------------------------------------------------------------- 
     283#if defined key_mpp_mpi 
     284      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     285      USE wrk_nemo, ONLY:   zwork => wrk_1d_1 
     286#endif 
     287      !! 
    216288      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pta    ! tracer flux array at T-point 
    217289      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)     ::   pmsk   ! Optional 2D basin mask 
    218290      !! 
    219       INTEGER                     ::  ji, jj, jk   ! dummy loop arguments 
    220       REAL(wp),DIMENSION(jpj,jpk) ::  p_fval       ! return function value 
     291      INTEGER                           :: ji, jj, jk   ! dummy loop arguments 
     292      REAL(wp), POINTER, DIMENSION(:,:) :: p_fval       ! return function value 
    221293#if defined key_mpp_mpi 
    222294      INTEGER, DIMENSION(1) ::   ish 
    223295      INTEGER, DIMENSION(2) ::   ish2 
    224       REAL(wp),DIMENSION(jpj*jpk) ::   zwork   ! 1D workspace 
     296      INTEGER               ::   ijpjjpk 
    225297#endif 
    226298      !!--------------------------------------------------------------------  
    227299      ! 
     300#if defined key_mpp_mpi 
     301      IF( wrk_in_use(1, 1) ) THEN 
     302         CALL ctl_stop('ptr_tjk: requested workspace array unavailable')   ;   RETURN 
     303      ENDIF 
     304#endif 
     305 
     306      p_fval => p_fval2d 
     307 
    228308      p_fval(:,:) = 0._wp 
    229309      DO jk = 1, jpkm1 
     
    235315      END DO 
    236316#if defined key_mpp_mpi 
     317      ijpjjpk = jpj*jpk 
    237318      ish(1) = jpj*jpk   ;   ish2(1) = jpj   ;   ish2(2) = jpk 
    238       zwork(:)= RESHAPE( p_fval, ish ) 
    239       CALL mpp_sum( zwork, jpj*jpk, ncomm_znl ) 
     319      zwork(1:ijpjjpk)= RESHAPE( p_fval, ish ) 
     320      CALL mpp_sum( zwork, ijpjjpk, ncomm_znl ) 
    240321      p_fval(:,:)= RESHAPE( zwork, ish2 ) 
    241322#endif 
    242323      ! 
     324#if defined key_mpp_mpi 
     325      IF( wrk_not_released(1, 1) )   CALL ctl_stop('ptr_tjk: failed to release workspace array') 
     326#endif 
     327      !     
    243328   END FUNCTION ptr_tjk 
    244329 
     
    250335      USE oce,     vt  =>   ua   ! use ua as workspace 
    251336      USE oce,     vs  =>   ua   ! use ua as workspace 
     337      IMPLICIT none 
    252338      !! 
    253339      INTEGER, INTENT(in) ::   kt   ! ocean time step index 
     
    364450      !!---------------------------------------------------------------------- 
    365451 
     452      !                                      ! allocate dia_ptr arrays 
     453      IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'lim_sbc_init : unable to allocate arrays' ) 
     454 
    366455      REWIND( numnam )                 ! Read Namelist namptr : poleward transport parameters 
    367456      READ  ( numnam, namptr ) 
     
    388477      IF( .NOT. ln_diaptr ) THEN       ! diaptr not used 
    389478        RETURN 
    390       ELSE                             ! Allocate the diaptr arrays 
    391          ALLOCATE( btmsk(jpi,jpj,nptr) ,                                                                      & 
    392             &      htr_adv(jpj) , str_adv(jpj) , htr_ldf(jpj) , str_ldf(jpj) , htr_ove(jpj) , str_ove(jpj),   & 
    393             &      htr(jpj,nptr) , str(jpj,nptr) ,                                                              & 
    394             &      tn_jk(jpj,jpk,nptr) , sn_jk (jpj,jpk,nptr) , v_msf(jpj,jpk,nptr) ,                         & 
    395             &      sjk  (jpj,jpk,nptr) , r1_sjk(jpj,jpk,nptr)                       , STAT=ierr  ) 
    396          ! 
    397          IF( ierr > 0 ) THEN 
    398             CALL ctl_stop( 'dia_ptr_init : unable to allocate standard arrays' )   ;   RETURN 
    399          ENDIF 
    400 #if defined key_diaeiv 
    401 !!       IF( lk_diaeiv )   &              ! eddy induced velocity arrays 
    402             ALLOCATE( htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) , v_msf_eiv(jpj,jpk,nptr) , STAT=ierr ) 
    403          ! 
    404          IF( ierr > 0 ) THEN 
    405             CALL ctl_stop( 'dia_ptr_init : unable to allocate eiv arrays' )   ;   RETURN 
    406          ENDIF 
    407 #endif 
    408479      ENDIF 
    409480       
    410       IF( lk_mpp )   CALL mpp_ini_znl     ! Define MPI communicator for zonal sum 
     481      IF( lk_mpp )   CALL mpp_ini_znl( numout )     ! Define MPI communicator for zonal sum 
    411482 
    412483      IF( ln_subbas ) THEN                ! load sub-basin mask 
     
    460531      !! ** Method  :   NetCDF file 
    461532      !!---------------------------------------------------------------------- 
     533      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     534      USE wrk_nemo, ONLY:   zphi => wrk_1d_1, zfoo => wrk_1d_2    ! 1D workspace 
     535      USE wrk_nemo, ONLY:   z_1  => wrk_2d_1                      ! 2D      - 
     536      !! 
    462537      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    463538      !! 
    464539      INTEGER, SAVE ::   nhoridz, ndepidzt, ndepidzw 
    465       INTEGER, SAVE :: ndim  , ndim_atl     , ndim_pac     , ndim_ind     , ndim_ipc 
    466       INTEGER, SAVE ::         ndim_atl_30  , ndim_pac_30  , ndim_ind_30  , ndim_ipc_30 
    467       INTEGER, SAVE :: ndim_h, ndim_h_atl_30, ndim_h_pac_30, ndim_h_ind_30, ndim_h_ipc_30 
    468       INTEGER, SAVE, DIMENSION (jpj*jpk) :: ndex  , ndex_atl     , ndex_pac     , ndex_ind     , ndex_ipc 
    469       INTEGER, SAVE, DIMENSION (jpj*jpk) ::         ndex_atl_30  , ndex_pac_30  , ndex_ind_30  , ndex_ipc_30 
    470       INTEGER, SAVE, DIMENSION (jpj)     :: ndex_h, ndex_h_atl_30, ndex_h_pac_30, ndex_h_ind_30, ndex_h_ipc_30 
    471       !! 
    472       CHARACTER (len=40)       ::   clhstnam, clop, clop_once, cl_comment   ! temporary names 
    473       INTEGER                  ::   iline, it, itmod, ji, jj, jk            ! 
     540      INTEGER, SAVE ::   ndim  , ndim_atl     , ndim_pac     , ndim_ind     , ndim_ipc 
     541      INTEGER, SAVE ::           ndim_atl_30  , ndim_pac_30  , ndim_ind_30  , ndim_ipc_30 
     542      INTEGER, SAVE ::   ndim_h, ndim_h_atl_30, ndim_h_pac_30, ndim_h_ind_30, ndim_h_ipc_30 
     543      !! 
     544      CHARACTER (len=40) ::   clhstnam, clop, clop_once, cl_comment   ! temporary names 
     545      INTEGER            ::   iline, it, itmod, ji, jj, jk            ! 
    474546#if defined key_iomput 
    475       INTEGER                  ::   inum                                    ! temporary logical unit 
    476 #endif 
    477       REAL(wp)                 ::   zsto, zout, zdt, zjulian                ! temporary scalars 
    478       REAL(wp), DIMENSION(jpj) ::   zphi, zfoo 
    479       REAL(wp), DIMENSION(jpj,jpk) :: z_1 
    480       !!---------------------------------------------------------------------- 
     547      INTEGER            ::   inum                                    ! temporary logical unit 
     548#endif 
     549      REAL(wp)           ::   zsto, zout, zdt, zjulian                ! temporary scalars 
     550      !!---------------------------------------------------------------------- 
     551 
     552      IF( wrk_in_use(1, 1,2) .OR. wrk_in_use(2, 1) ) THEN 
     553         CALL ctl_stop('dia_ptr_wri: requested workspace arrays unavailable')   ;   RETURN 
     554      ENDIF 
    481555 
    482556      ! define time axis 
     
    507581            IF( jp_cfg == 2   )   iline =  48   ! i-line that passes near the North Pole 
    508582            IF( jp_cfg == 4   )   iline =  24   ! i-line that passes near the North Pole 
    509             zphi(:) = 0._wp 
     583            zphi(1:jpj) = 0._wp 
    510584            DO ji = mi0(iline), mi1(iline)  
    511                zphi(:) = gphiv(ji,:)         ! if iline is in the local domain 
     585               zphi(1:jpj) = gphiv(ji,:)         ! if iline is in the local domain 
    512586               ! Correct highest latitude for some configurations - will work if domain is parallelized in J ? 
    513587               IF( jp_cfg == 05 ) THEN 
     
    533607         ELSE                                        !   OTHER configurations  
    534608            !                                        ! ======================= 
    535             zphi(:) = gphiv(1,:)             ! assume lat/lon coordinate, select the first i-line 
     609            zphi(1:jpj) = gphiv(1,:)             ! assume lat/lon coordinate, select the first i-line 
    536610            ! 
    537611         ENDIF 
     
    555629 
    556630            zout = nn_fwri * zdt 
    557             zfoo(:) = 0._wp 
    558  
    559             ! Compute julian date from starting date of the run 
    560  
    561             CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian ) 
    562             zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment 
     631            zfoo(1:jpj) = 0._wp 
     632 
     633            CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )  ! Compute julian date from starting date of the run 
     634            zjulian = zjulian - adatrj                         ! set calendar origin to the beginning of the experiment 
    563635 
    564636#if defined key_iomput 
     
    583655            CALL histvert( numptr, "depthw", "Vertical W levels",   & 
    584656               &                   "m", jpk, gdepw_0, ndepidzw, "down" ) 
    585  
    586657            ! 
    587658            CALL wheneq ( jpj*jpk, MIN(sjk(:,:,1), 1._wp), 1, 1., ndex  , ndim  )      ! Lat-Depth 
     
    617688            cl_comment = '                      ' 
    618689#endif 
    619             !  Zonal mean T and S 
    620  
    621             IF( ln_diaznl ) THEN  
     690            IF( ln_diaznl ) THEN             !  Zonal mean T and S 
    622691               CALL histdef( numptr, "zotemglo", "Zonal Mean Temperature","C" ,   & 
    623692                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout ) 
     
    627696               CALL histdef( numptr, "zosrfglo", "Zonal Mean Surface","m^2"   ,   & 
    628697                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout ) 
    629  
     698               ! 
    630699               IF (ln_subbas) THEN  
    631700                  CALL histdef( numptr, "zotematl", "Zonal Mean Temperature: Atlantic","C" ,   & 
     
    657726                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout ) 
    658727               ENDIF 
    659  
    660728            ENDIF 
    661  
     729            ! 
    662730            !  Meridional Stream-Function (Eulerian and Bolus) 
    663  
    664731            CALL histdef( numptr, "zomsfglo", "Meridional Stream-Function: Global"//TRIM(cl_comment),"Sv" ,   & 
    665732               1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout ) 
     
    674741                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout ) 
    675742            ENDIF 
    676  
     743            ! 
    677744            !  Heat transport  
    678  
    679745            CALL histdef( numptr, "sophtadv", "Advective Heat Transport"      ,   & 
    680746               "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout ) 
     
    695761                  "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout ) 
    696762            ENDIF 
    697  
    698  
     763            ! 
    699764            !  Salt transport  
    700  
    701765            CALL histdef( numptr, "sopstadv", "Advective Salt Transport"      ,   & 
    702766               "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout ) 
     
    726790                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout ) 
    727791            ENDIF 
    728  
     792            ! 
    729793            CALL histend( numptr ) 
    730  
     794            ! 
    731795         END IF 
    732796#if defined key_mpp_mpi 
     
    802866      ENDIF 
    803867      ! 
    804    END SUBROUTINE dia_ptr_wri 
     868      IF( wrk_not_released(1, 1,2) .OR.    & 
     869          wrk_not_released(2, 1)    )   CALL ctl_stop('dia_ptr_wri: failed to release workspace arrays') 
     870      ! 
     871  END SUBROUTINE dia_ptr_wri 
    805872 
    806873   !!====================================================================== 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90

    r2561 r2715  
    4848   USE dtatem 
    4949   USE dtasal 
     50   USE lib_mpp         ! MPP library 
    5051 
    5152   IMPLICIT NONE 
     
    5455   PUBLIC   dia_wri                 ! routines called by step.F90 
    5556   PUBLIC   dia_wri_state 
     57   PUBLIC   dia_wri_alloc           ! Called by nemogcm module 
    5658 
    5759   INTEGER ::   nid_T, nz_T, nh_T, ndim_T, ndim_hT   ! grid_T file 
     
    6062   INTEGER ::   nid_W, nz_W, nh_W                    ! grid_W file 
    6163   INTEGER ::   ndex(1)                              ! ??? 
    62    INTEGER, DIMENSION(jpi*jpj)     ::  ndex_hT, ndex_hU, ndex_hV 
    63    INTEGER, DIMENSION(jpi*jpj*jpk) ::  ndex_T, ndex_U, ndex_V 
     64   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hT, ndex_hU, ndex_hV 
     65   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_T, ndex_U, ndex_V 
    6466 
    6567   !! * Substitutions 
     
    7476CONTAINS 
    7577 
     78   INTEGER FUNCTION dia_wri_alloc() 
     79      !!---------------------------------------------------------------------- 
     80      INTEGER, DIMENSION(2) :: ierr 
     81      !!---------------------------------------------------------------------- 
     82      ! 
     83      ierr = 0 
     84      ! 
     85      ALLOCATE( ndex_hT(jpi*jpj) , ndex_T(jpi*jpj*jpk) ,     & 
     86         &      ndex_hU(jpi*jpj) , ndex_U(jpi*jpj*jpk) ,     & 
     87         &      ndex_hV(jpi*jpj) , ndex_V(jpi*jpj*jpk) , STAT=ierr(1) ) 
     88         ! 
     89      dia_wri_alloc = MAXVAL(ierr) 
     90      IF( lk_mpp )   CALL mpp_sum( dia_wri_alloc ) 
     91      ! 
     92  END FUNCTION dia_wri_alloc 
     93 
    7694#if defined key_dimgout 
    7795   !!---------------------------------------------------------------------- 
     
    88106   !!   'key_iomput'                                        use IOM library 
    89107   !!---------------------------------------------------------------------- 
     108 
    90109   SUBROUTINE dia_wri( kt ) 
    91110      !!--------------------------------------------------------------------- 
     
    98117      !!---------------------------------------------------------------------- 
    99118      USE oce, ONLY :   z3d => ta   ! use ta as 3D workspace 
     119      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
     120      USE wrk_nemo, ONLY: z2d => wrk_2d_1 
    100121      !! 
    101122      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     
    103124      INTEGER                      ::   ji, jj, jk              ! dummy loop indices 
    104125      REAL(wp)                     ::   zztmp, zztmpx, zztmpy   !  
    105       REAL(wp), DIMENSION(jpi,jpj) ::   z2d                     !  
    106126      !!---------------------------------------------------------------------- 
    107127      !  
     128      IF( wrk_in_use(2, 1))THEN 
     129         CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.') 
     130         RETURN 
     131      END IF 
     132      ! 
    108133      ! Output the initial state and forcings 
    109134      IF( ninist == 1 ) THEN                        
     
    175200      ENDIF 
    176201      ! 
     202      IF( wrk_not_released(2, 1))THEN 
     203         CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.') 
     204         RETURN 
     205      END IF 
     206      ! 
    177207   END SUBROUTINE dia_wri 
    178208 
     
    194224      !!      Each nwrite time step, output the instantaneous or mean fields 
    195225      !!---------------------------------------------------------------------- 
     226      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
     227      USE wrk_nemo, ONLY: zw2d => wrk_2d_1 
     228      !! 
    196229      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    197230      !! 
     
    201234      INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers 
    202235      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt           ! local scalars 
    203       REAL(wp), DIMENSION(jpi,jpj) ::   zw2d                 ! 2D workspace 
    204236      !!---------------------------------------------------------------------- 
     237      ! 
     238      IF( wrk_in_use(2, 1))THEN 
     239         CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.') 
     240         RETURN 
     241      END IF 
    205242      ! 
    206243      ! Output the initial state and forcings 
     
    502539      CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    503540      CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    504       zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
     541      IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
    505542      CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    506543#endif 
     
    508545      CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    509546      CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    510          zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
     547         IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
    511548      CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    512549#endif 
     
    570607         CALL histclo( nid_W ) 
    571608      ENDIF 
     609      ! 
     610      IF( wrk_not_released(2, 1))THEN 
     611         CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.') 
     612         RETURN 
     613      END IF 
    572614      ! 
    573615   END SUBROUTINE dia_wri 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90

    r2528 r2715  
    6969    INTEGER ,INTENT(in) :: kt 
    7070    !! 
    71     INTEGER :: inbsel, jk 
    72     INTEGER :: iyear,imon,iday 
    73     INTEGER, SAVE :: nmoyct  
    74  
    7571#if defined key_diainstant 
    7672    LOGICAL, PARAMETER :: ll_dia_inst=.TRUE.  !: for instantaneous output 
     
    7874    LOGICAL, PARAMETER :: ll_dia_inst=.FALSE. !: for average output 
    7975#endif 
    80  
    81     REAL(wp), SAVE, DIMENSION (jpi,jpj,jpk) ::  um , vm   ! used to compute mean u, v fields 
    82     REAL(wp), SAVE, DIMENSION (jpi,jpj,jpk) ::  wm        ! used to compute mean w fields 
    83     REAL(wp), SAVE, DIMENSION (jpi,jpj,jpk) ::  avtm      ! used to compute mean kz fields 
    84     REAL(wp), SAVE, DIMENSION (jpi,jpj,jpk) ::  tm , sm   ! used to compute mean t, s fields 
    85     REAL(wp), SAVE, DIMENSION (jpi,jpj,jpk) ::  fsel      ! used to compute mean 2d fields 
     76    INTEGER              , SAVE                    ::  nmoyct  
     77    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  um , vm, wm   ! mean u, v, w fields 
     78    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  avtm          ! mean kz fields 
     79    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  tm , sm       ! mean t, s fields 
     80    REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:,:,:) ::  fsel          ! mean 2d fields 
     81     
     82    INTEGER :: inbsel, jk 
     83    INTEGER :: iyear,imon,iday 
    8684    REAL(wp) :: zdtj 
    87     ! 
    8885    CHARACTER(LEN=80) :: clname 
    8986    CHARACTER(LEN=80) :: cltext 
     
    9592    !  --------------- 
    9693    ! 
     94    IF(.not.ALLOCATED(um))THEN 
     95       ALLOCATE(um(jpi,jpj,jpk), vm(jpi,jpj,jpk), & 
     96                wm(jpi,jpj,jpk),                  & 
     97                avtm(jpi,jpj,jpk),                & 
     98                tm(jpi,jpj,jpk), sm(jpi,jpj,jpk), & 
     99                fsel(jpi,jpj,jpk),                & 
     100                Stat=jk) 
     101       IF(jk /= 0)THEN 
     102          WRITE(*,*) 'ERROR: allocate failed in dia_wri (diawri_dimg.h90)' 
     103          CALL mppabort() 
     104       END IF 
     105    END IF 
     106 
    97107    inbsel = 17 
    98108 
     
    247257       cltext=TRIM(cexper)//' U(m/s) '//TRIM(clmode) 
    248258       ! 
    249        IF( ll_dia_inst) THEN  
    250           CALL dia_wri_dimg(clname, cltext, un, jpk, 'T') 
    251  
    252        ELSE  
    253           CALL dia_wri_dimg(clname, cltext, um, jpk, 'T') 
     259       IF( ll_dia_inst) THEN   ;   CALL dia_wri_dimg(clname, cltext, un, jpk, 'T') 
     260       ELSE                    ;   CALL dia_wri_dimg(clname, cltext, um, jpk, 'T') 
    254261       ENDIF 
    255262 
Note: See TracChangeset for help on using the changeset viewer.