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/TOP_SRC/PISCES/p4zprod.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/TOP_SRC/PISCES/p4zprod.F90

    r2528 r2715  
    2222   USE iom 
    2323 
    24    USE lib_mpp 
    25    USE lib_fortran 
    26  
    2724   IMPLICIT NONE 
    2825   PRIVATE 
     
    3027   PUBLIC   p4z_prod         ! called in p4zbio.F90 
    3128   PUBLIC   p4z_prod_init    ! called in trcsms_pisces.F90 
    32  
    33    !! * Shared module variables 
     29   PUBLIC   p4z_prod_alloc 
     30 
    3431   REAL(wp), PUBLIC ::   & 
    3532     pislope   = 3.0_wp          ,  &  !: 
     
    4340     grosip    = 0.151_wp 
    4441 
    45    REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk)  ::  prmax  
     42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prmax   !: 
    4643    
    4744   REAL(wp) ::   & 
     
    5653   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
    5754   !! $Id$  
    58    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    59    !!---------------------------------------------------------------------- 
    60  
     55   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     56   !!---------------------------------------------------------------------- 
    6157CONTAINS 
    6258 
     
    7066      !! ** Method  : - ??? 
    7167      !!--------------------------------------------------------------------- 
     68      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     69      USE wrk_nemo, ONLY:   zmixnano   => wrk_2d_1  , zmixdiat    => wrk_2d_2  , zstrn  => wrk_2d_3 
     70      USE wrk_nemo, ONLY:   zpislopead => wrk_3d_2  , zpislopead2 => wrk_3d_3 
     71      USE wrk_nemo, ONLY:   zprdia     => wrk_3d_4  , zprbio      => wrk_3d_5  , zysopt => wrk_3d_6 
     72      USE wrk_nemo, ONLY:   zprorca    => wrk_3d_7  , zprorcad    => wrk_3d_8 
     73      USE wrk_nemo, ONLY:   zprofed    => wrk_3d_9  , zprofen     => wrk_3d_10 
     74      USE wrk_nemo, ONLY:   zprochln   => wrk_3d_11 , zprochld    => wrk_3d_12 
     75      USE wrk_nemo, ONLY:   zpronew    => wrk_3d_13 , zpronewd    => wrk_3d_14 
     76      ! 
    7277      INTEGER, INTENT(in) :: kt, jnt 
     78      ! 
    7379      INTEGER  ::   ji, jj, jk 
    7480      REAL(wp) ::   zsilfac, zfact 
     
    8187      REAL(wp) ::   zrfact2 
    8288#endif 
    83       REAL(wp), DIMENSION(jpi,jpj)     ::   zmixnano   , zmixdiat, zstrn 
    84       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpislopead , zpislopead2 
    85       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zprdia     , zprbio, zysopt 
    86       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zprorca    , zprorcad, zprofed 
    87       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zprofen   , zprochln, zprochld 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpronew    , zpronewd 
    8989      CHARACTER (len=25) :: charout 
    9090      !!--------------------------------------------------------------------- 
    9191 
    92       zprorca (:,:,:) = 0.0 
    93       zprorcad(:,:,:) = 0.0 
    94       zprofed(:,:,:) = 0.0 
    95       zprofen(:,:,:) = 0.0 
    96       zprochln(:,:,:) = 0.0 
    97       zprochld(:,:,:) = 0.0 
    98       zpronew (:,:,:) = 0.0 
    99       zpronewd(:,:,:) = 0.0 
    100       zprdia  (:,:,:) = 0.0 
    101       zprbio  (:,:,:) = 0.0 
    102       zysopt  (:,:,:) = 0.0 
     92      IF( wrk_in_use(2, 1,2,3)                             .OR.  & 
     93          wrk_in_use(3, 2,3,4,5,6,7,8,9,10,11,12,13,14)  ) THEN 
     94          CALL ctl_stop('p4z_prod: requested workspace arrays unavailable')   ;   RETURN 
     95      ENDIF 
     96 
     97      zprorca (:,:,:) = 0._wp 
     98      zprorcad(:,:,:) = 0._wp 
     99      zprofed (:,:,:) = 0._wp 
     100      zprofen (:,:,:) = 0._wp 
     101      zprochln(:,:,:) = 0._wp 
     102      zprochld(:,:,:) = 0._wp 
     103      zpronew (:,:,:) = 0._wp 
     104      zpronewd(:,:,:) = 0._wp 
     105      zprdia  (:,:,:) = 0._wp 
     106      zprbio  (:,:,:) = 0._wp 
     107      zysopt  (:,:,:) = 0._wp 
    103108 
    104109      ! Computation of the optimal production 
    105  
    106110# if defined key_degrad 
    107111      prmax(:,:,:) = rday1 * tgfunc(:,:,:) * facvol(:,:,:) 
     
    111115 
    112116      ! compute the day length depending on latitude and the day 
    113       zrum = FLOAT( nday_year - 80 ) / REAL(nyear_len(1), wp) 
    114       zcodel = ASIN(  SIN( zrum * rpi * 2. ) * SIN( rad * 23.5 )  ) 
     117      zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 
     118      zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  ) 
    115119 
    116120      ! day length in hours 
    117       zstrn(:,:) = 0. 
     121      zstrn(:,:) = 0._wp 
    118122      DO jj = 1, jpj 
    119123         DO ji = 1, jpi 
     
    187191                  zsilfac = MIN( 6.4,zsilfac * zsilfac2) 
    188192                  zysopt(ji,jj,jk) = grosip * zlim1 * zsilfac 
    189  
    190193              ENDIF 
    191194            END DO 
     
    357360#endif 
    358361 
    359        IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
     362      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    360363         WRITE(charout, FMT="('prod')") 
    361364         CALL prt_ctl_trc_info(charout) 
    362365         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) 
    363        ENDIF 
    364  
     366      ENDIF 
     367 
     368      IF(  wrk_not_released(2, 1,2,3)                          .OR.  & 
     369           wrk_not_released(3, 2,3,4,5,6,7,8,9,10,11,12,13,14)   )   & 
     370           CALL ctl_stop('p4z_prod: failed to release workspace arrays') 
     371      ! 
    365372   END SUBROUTINE p4z_prod 
    366373 
     374 
    367375   SUBROUTINE p4z_prod_init 
    368  
    369376      !!---------------------------------------------------------------------- 
    370377      !!                  ***  ROUTINE p4z_prod_init  *** 
     
    376383      !! 
    377384      !! ** input   :   Namelist nampisprod 
    378       !! 
    379385      !!---------------------------------------------------------------------- 
    380  
    381386      NAMELIST/nampisprod/ pislope, pislope2, excret, excret2, chlcnm, chlcdm,   & 
    382387         &              fecnm, fecdm, grosip 
     388      !!---------------------------------------------------------------------- 
    383389 
    384390      REWIND( numnat )                     ! read numnat 
     
    399405         WRITE(numout,*) '    Minimum Fe/C in diatoms                   fecdm     =', fecdm 
    400406      ENDIF 
    401  
     407      ! 
    402408      rday1     = 0.6 / rday  
    403409      texcret   = 1.0 - excret 
    404410      texcret2  = 1.0 - excret2 
    405411      tpp       = 0. 
    406  
     412      ! 
    407413   END SUBROUTINE p4z_prod_init 
    408414 
    409415 
     416   INTEGER FUNCTION p4z_prod_alloc() 
     417      !!---------------------------------------------------------------------- 
     418      !!                     ***  ROUTINE p4z_prod_alloc  *** 
     419      !!---------------------------------------------------------------------- 
     420      ALLOCATE( prmax(jpi,jpj,jpk), STAT=p4z_prod_alloc ) 
     421      ! 
     422      IF( p4z_prod_alloc /= 0 ) CALL ctl_warn('p4z_prod_alloc : failed to allocate arrays.') 
     423      ! 
     424   END FUNCTION p4z_prod_alloc 
    410425 
    411426#else 
Note: See TracChangeset for help on using the changeset viewer.