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/LIM_SRC_3/limthd_dh.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/LIM_SRC_3/limthd_dh.F90

    r2528 r2715  
    77   !!                 ! 2005-06 (M. Vancoppenolle) 3D version  
    88   !!            3.2  ! 2009-07 (M. Vancoppenolle, Y. Aksenov, G. Madec) bug correction in rdmsnif & rdmicif 
     9   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
    910   !!---------------------------------------------------------------------- 
    1011#if defined key_lim3 
     
    1718   USE phycst           ! physical constants (OCE directory)  
    1819   USE sbc_oce          ! Surface boundary condition: ocean fields 
    19    USE ice 
    20    USE par_ice 
    21    USE thd_ice 
    22    USE in_out_manager 
    23    USE lib_mpp 
     20   USE ice              ! LIM variables 
     21   USE par_ice          ! LIM parameters 
     22   USE thd_ice          ! LIM thermodynamics 
     23   USE wrk_nemo         ! workspace manager 
     24   USE in_out_manager   ! I/O manager 
     25   USE lib_mpp          ! MPP library 
    2426 
    2527   IMPLICIT NONE 
     
    3537 
    3638   !!---------------------------------------------------------------------- 
    37    !! NEMO/LIM3 3.3 , UCL - NEMO Consortium (2010) 
     39   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2010) 
    3840   !! $Id$ 
    39    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     41   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4042   !!---------------------------------------------------------------------- 
    41  
    4243CONTAINS 
    4344 
    44    SUBROUTINE lim_thd_dh(kideb,kiut,jl) 
     45   SUBROUTINE lim_thd_dh( kideb, kiut, jl ) 
    4546      !!------------------------------------------------------------------ 
    4647      !!                ***  ROUTINE lim_thd_dh  *** 
     
    7576      INTEGER  ::   i_ice_switch   ! ice thickness above a certain treshold or not 
    7677      INTEGER  ::   iter 
    77  
    78       REAL(wp) ::   zzfmass_i, zzfmass_s   ! temporary scalar 
    79       REAL(wp) ::   zhsnew, zihgnew, ztmelts               ! temporary scalar 
     78      INTEGER  ::   num_iter_max, numce_dh 
     79 
     80      REAL(wp) ::   meance_dh 
     81      REAL(wp) ::   zzfmass_i, zihgnew                     ! local scalar 
     82      REAL(wp) ::   zzfmass_s, zhsnew, ztmelts             ! local scalar 
    8083      REAL(wp) ::   zhn, zdhcf, zdhbf, zhni, zhnfi, zihg   ! 
    81       REAL(wp) ::   zdhnm, zhnnew, zhisn, zihic            ! 
     84      REAL(wp) ::   zdhnm, zhnnew, zhisn, zihic, zzc       ! 
    8285      REAL(wp) ::   zfracs       ! fractionation coefficient for bottom salt entrapment 
    8386      REAL(wp) ::   zds          ! increment of bottom ice salinity 
     
    8992      REAL(wp) ::   zgrr         ! bottom growth rate 
    9093      REAL(wp) ::   ztform       ! bottom formation temperature 
    91  
    92       REAL(wp), DIMENSION(jpij) ::   zh_i        ! ice layer thickness 
    93       REAL(wp), DIMENSION(jpij) ::   zh_s        ! snow layer thickness 
    94       REAL(wp), DIMENSION(jpij) ::   ztfs        ! melting point 
    95       REAL(wp), DIMENSION(jpij) ::   zhsold      ! old snow thickness 
    96       REAL(wp), DIMENSION(jpij) ::   zqprec      ! energy of fallen snow 
    97       REAL(wp), DIMENSION(jpij) ::   zqfont_su   ! incoming, remaining surface energy 
    98       REAL(wp), DIMENSION(jpij) ::   zqfont_bo   ! incoming, bottom energy 
    99       REAL(wp), DIMENSION(jpij) ::   z_f_surf    ! surface heat for ablation 
    100       REAL(wp), DIMENSION(jpij) ::   zhgnew      ! new ice thickness 
    101       REAL(wp), DIMENSION(jpij) ::   zfmass_i    !  
    102  
    103       REAL(wp), DIMENSION(jpij) ::   zdh_s_mel     ! snow melt  
    104       REAL(wp), DIMENSION(jpij) ::   zdh_s_pre     ! snow precipitation  
    105       REAL(wp), DIMENSION(jpij) ::   zdh_s_sub     ! snow sublimation 
    106       REAL(wp), DIMENSION(jpij) ::   zfsalt_melt   ! salt flux due to ice melt 
    107  
    108       REAL(wp) , DIMENSION(jpij,jkmax) ::   zdeltah 
    109  
    110       ! Pathological cases 
    111       REAL(wp), DIMENSION(jpij) ::   zfdt_init   ! total incoming heat for ice melt 
    112       REAL(wp), DIMENSION(jpij) ::   zfdt_final  ! total remaing heat for ice melt 
    113       REAL(wp), DIMENSION(jpij) ::   zqt_i       ! total ice heat content 
    114       REAL(wp), DIMENSION(jpij) ::   zqt_s       ! total snow heat content 
    115       REAL(wp), DIMENSION(jpij) ::   zqt_dummy   ! dummy heat content 
    116  
     94      ! 
     95      REAL(wp), POINTER, DIMENSION(:) ::   zh_i, ztfs  , zqfont_su, zqprec  , zhgnew 
     96      REAL(wp), POINTER, DIMENSION(:) ::   zh_s, zhsold, zqfont_bo, z_f_surf, zfmass_i 
     97      REAL(wp), POINTER, DIMENSION(:) ::   zdh_s_mel, zdh_s_sub  , zfdt_init , zqt_i, zqt_dummy, zdq_i 
     98      REAL(wp), POINTER, DIMENSION(:) ::   zdh_s_pre, zfsalt_melt, zfdt_final, zqt_s, zfbase   , zinnermelt 
     99      ! 
     100      REAL(wp), DIMENSION(jpij,jkmax) ::   zdeltah 
    117101      REAL(wp), DIMENSION(jpij,jkmax) ::   zqt_i_lay   ! total ice heat content 
    118  
    119       ! Heat conservation  
    120       INTEGER  ::   num_iter_max, numce_dh 
    121       REAL(wp) ::   meance_dh 
    122       INTEGER , DIMENSION(jpij) ::   innermelt 
    123       REAL(wp), DIMENSION(jpij) ::   zfbase, zdq_i 
    124102      !!------------------------------------------------------------------ 
    125103 
    126       zfsalt_melt(:)  = 0.0 
    127       ftotal_fin(:)   = 0.0 
    128       zfdt_init(:)    = 0.0 
    129       zfdt_final(:)   = 0.0 
     104      IF( wrk_in_use(1, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) ) THEN 
     105         CALL ctl_stop('lim_thd_dh: requestead workspace arrays unavailable')   ;   RETURN 
     106      ENDIF 
     107      ! Set-up pointers to sub-arrays of workspace arrays 
     108      zh_i        => wrk_1d_1 (1:jpij)   ! ice layer thickness 
     109      zh_s        => wrk_1d_2 (1:jpij)   ! snow layer thickness 
     110      ztfs        => wrk_1d_3 (1:jpij)   ! melting point 
     111      zhsold      => wrk_1d_4 (1:jpij)   ! old snow thickness 
     112      zqprec      => wrk_1d_5 (1:jpij)   ! energy of fallen snow 
     113      zqfont_su   => wrk_1d_6 (1:jpij)   ! incoming, remaining surface energy 
     114      zqfont_bo   => wrk_1d_7 (1:jpij)   ! incoming, bottom energy 
     115      z_f_surf    => wrk_1d_8 (1:jpij)   ! surface heat for ablation 
     116      zhgnew      => wrk_1d_9 (1:jpij)   ! new ice thickness 
     117      zfmass_i    => wrk_1d_10(1:jpij)   !  
     118      ! 
     119      zdh_s_mel   => wrk_1d_11(1:jpij)   ! snow melt  
     120      zdh_s_pre   => wrk_1d_12(1:jpij)   ! snow precipitation  
     121      zdh_s_sub   => wrk_1d_13(1:jpij)   ! snow sublimation 
     122      zfsalt_melt => wrk_1d_14(1:jpij)   ! salt flux due to ice melt 
     123      ! 
     124      !                              ! Pathological cases 
     125      zfdt_init   => wrk_1d_15(1:jpij)   ! total incoming heat for ice melt 
     126      zfdt_final  => wrk_1d_16(1:jpij)   ! total remaing heat for ice melt 
     127      zqt_i       => wrk_1d_17(1:jpij)   ! total ice heat content 
     128      zqt_s       => wrk_1d_18(1:jpij)   ! total snow heat content 
     129      zqt_dummy   => wrk_1d_19(1:jpij)   ! dummy heat content 
     130            
     131      zfbase      => wrk_1d_20(1:jpij)         
     132      zdq_i       => wrk_1d_21(1:jpij)  
     133      zinnermelt  => wrk_1d_22(1:jpij)  
     134 
     135      zfsalt_melt(:)  = 0._wp 
     136      ftotal_fin(:)   = 0._wp 
     137      zfdt_init(:)    = 0._wp 
     138      zfdt_final(:)   = 0._wp 
    130139 
    131140      DO ji = kideb, kiut 
     
    138147      !------------------------------------------------------------------------------! 
    139148      ! 
    140       DO ji = kideb,kiut 
     149      DO ji = kideb, kiut 
    141150         isnow         = INT( 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_s_b(ji) ) ) ) 
    142151         ztfs(ji)      = isnow * rtt + ( 1.0 - isnow ) * rtt 
     
    146155      END DO ! ji 
    147156 
    148       zqfont_su(:) = 0.0 
    149       zqfont_bo(:) = 0.0 
    150       dsm_i_se_1d(:) = 0.0      
    151       dsm_i_si_1d(:) = 0.    
     157      zqfont_su  (:) = 0._wp 
     158      zqfont_bo  (:) = 0._wp 
     159      dsm_i_se_1d(:) = 0._wp      
     160      dsm_i_si_1d(:) = 0._wp    
    152161      ! 
    153162      !------------------------------------------------------------------------------! 
     
    155164      !------------------------------------------------------------------------------! 
    156165      ! 
    157       ! Layer thickness 
    158       DO ji = kideb,kiut 
     166      DO ji = kideb, kiut     ! Layer thickness 
    159167         zh_i(ji) = ht_i_b(ji) / nlay_i 
    160168         zh_s(ji) = ht_s_b(ji) / nlay_s 
    161169      END DO 
    162  
    163       ! Total enthalpy of the snow 
    164       zqt_s(:) = 0.0 
     170      ! 
     171      zqt_s(:) = 0._wp        ! Total enthalpy of the snow 
    165172      DO jk = 1, nlay_s 
    166          DO ji = kideb,kiut 
     173         DO ji = kideb, kiut 
    167174            zqt_s(ji) =  zqt_s(ji) + q_s_b(ji,jk) * ht_s_b(ji) / nlay_s 
    168175         END DO 
    169176      END DO 
    170  
    171       ! Total enthalpy of the ice 
    172       zqt_i(:) = 0.0 
     177      ! 
     178      zqt_i(:) = 0._wp        ! Total enthalpy of the ice 
    173179      DO jk = 1, nlay_i 
    174          DO ji = kideb,kiut 
    175             zqt_i(ji)        =  zqt_i(ji) + q_i_b(ji,jk) * ht_i_b(ji) / nlay_i 
    176             zqt_i_lay(ji,jk) =              q_i_b(ji,jk) * ht_i_b(ji) / nlay_i 
     180         DO ji = kideb, kiut 
     181            zzc = q_i_b(ji,jk) * ht_i_b(ji) / nlay_i 
     182            zqt_i(ji)        =  zqt_i(ji) + zzc 
     183            zqt_i_lay(ji,jk) =              zzc 
    177184         END DO 
    178185      END DO 
     
    201208         zdh_s_pre(ji) = zcoeff * sprecip_1d(ji) * rdt_ice / rhosn 
    202209      END DO 
    203       zdh_s_mel(:) =  0.0 
     210      zdh_s_mel(:) =  0._wp 
    204211 
    205212      ! Melt of fallen snow 
     
    248255      !-------------------------- 
    249256      DO ji = kideb, kiut  
    250          dh_i_surf(ji) =  0.e0 
     257         dh_i_surf(ji) =  0._wp 
    251258         z_f_surf (ji) =  zqfont_su(ji) / rdt_ice ! heat conservation test 
    252          zdq_i    (ji) =  0.e0 
     259         zdq_i    (ji) =  0._wp 
    253260      END DO ! ji 
    254261 
     
    267274            ! 
    268275            ! contribution to ice-ocean salt flux  
    269             zji = MOD( npb(ji) - 1, jpi ) + 1 
    270             zjj = ( npb(ji) - 1 ) / jpi + 1 
     276            zji = MOD( npb(ji) - 1 , jpi ) + 1 
     277            zjj =    ( npb(ji) - 1 ) / jpi + 1 
    271278            zfsalt_melt(ji) = zfsalt_melt(ji) + ( sss_m(zji,zjj) - sm_i_b(ji) ) * a_i_b(ji)    & 
    272279               &                              * MIN( zdeltah(ji,jk) , 0.e0 ) * rhoic / rdt_ice  
     
    278285         !                  !------------------- 
    279286         numce_dh  = 0 
    280          meance_dh = 0.e0 
     287         meance_dh = 0._wp 
    281288         DO ji = kideb, kiut 
    282289            IF ( ( z_f_surf(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN 
     
    287294               WRITE(numout,*) ' ALERTE heat loss for surface melt ' 
    288295               WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
    289                WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    290                WRITE(numout,*) ' z_f_surf  : ', z_f_surf(ji) 
    291                WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
    292                WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    293                WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
    294                WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
    295                WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
    296                WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
    297                WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
     296               WRITE(numout,*) ' ht_i_b       : ', ht_i_b(ji) 
     297               WRITE(numout,*) ' z_f_surf     : ', z_f_surf(ji) 
     298               WRITE(numout,*) ' zdq_i        : ', zdq_i(ji) 
     299               WRITE(numout,*) ' ht_i_b       : ', ht_i_b(ji) 
     300               WRITE(numout,*) ' fc_bo_i      : ', fc_bo_i(ji) 
     301               WRITE(numout,*) ' fbif_1d      : ', fbif_1d(ji) 
     302               WRITE(numout,*) ' qlbbq_1d     : ', qlbbq_1d(ji) 
     303               WRITE(numout,*) ' s_i_new      : ', s_i_new(ji) 
     304               WRITE(numout,*) ' sss_m        : ', sss_m(zji,zjj) 
    298305            ENDIF 
    299306         END DO 
     
    440447      ! 4.2 Basal melt 
    441448      !---------------- 
    442       meance_dh = 0.0 
     449      meance_dh = 0._wp 
    443450      numce_dh  = 0 
    444       innermelt(:) = 0 
     451      zinnermelt(:) = 0._wp 
    445452 
    446453      DO ji = kideb, kiut 
    447454         ! heat convergence at the surface > 0 
    448          IF(  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) >= 0.e0  ) THEN 
    449  
     455         IF(  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) >= 0._wp  ) THEN 
    450456            s_i_new(ji)   =  s_i_b(ji,nlay_i) 
    451457            zqfont_bo(ji) =  rdt_ice * ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) 
    452  
    453             zfbase(ji)    =  zqfont_bo(ji) / rdt_ice ! heat conservation test 
    454             zdq_i(ji)     =  0.e0 
    455  
    456             dh_i_bott(ji) =  0.e0 
     458            zfbase(ji)    =  zqfont_bo(ji) / rdt_ice     ! heat conservation test 
     459            zdq_i(ji)     =  0._wp 
     460            dh_i_bott(ji) =  0._wp 
    457461         ENDIF 
    458462      END DO 
     
    461465         DO ji = kideb, kiut 
    462466            IF (  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .GE. 0.0  ) THEN 
    463                ztmelts             =   - tmut * s_i_b(ji,jk) + rtt  
    464                IF ( t_i_b(ji,jk) .GE. ztmelts ) THEN 
     467               ztmelts            =   - tmut * s_i_b(ji,jk) + rtt  
     468               IF( t_i_b(ji,jk) >= ztmelts ) THEN 
    465469                  zdeltah(ji,jk)  = - zh_i(ji) 
    466470                  dh_i_bott(ji)   = dh_i_bott(ji) + zdeltah(ji,jk) 
    467                   innermelt(ji)   = 1 
     471                  zinnermelt(ji)   = 1._wp 
    468472               ELSE  ! normal ablation 
    469473                  zdeltah(ji,jk)  = - zqfont_bo(ji) / q_i_b(ji,jk) 
     
    492496               ENDIF 
    493497               IF ( zfbase(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN 
    494                   WRITE(numout,*) ' ALERTE heat loss for basal  melt ' 
    495                   WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
    496                   WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    497                   WRITE(numout,*) ' zfbase  : ', zfbase(ji) 
    498                   WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
    499                   WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    500                   WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
    501                   WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
    502                   WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
    503                   WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
    504                   WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
     498                  WRITE(numout,*) ' ALERTE heat loss for basal melt : zji, zjj, jl :', zji, zjj, jl 
     499                  WRITE(numout,*) ' ht_i_b    : ', ht_i_b(ji) 
     500                  WRITE(numout,*) ' zfbase    : ', zfbase(ji) 
     501                  WRITE(numout,*) ' zdq_i     : ', zdq_i(ji) 
     502                  WRITE(numout,*) ' ht_i_b    : ', ht_i_b(ji) 
     503                  WRITE(numout,*) ' fc_bo_i   : ', fc_bo_i(ji) 
     504                  WRITE(numout,*) ' fbif_1d   : ', fbif_1d(ji) 
     505                  WRITE(numout,*) ' qlbbq_1d  : ', qlbbq_1d(ji) 
     506                  WRITE(numout,*) ' s_i_new   : ', s_i_new(ji) 
     507                  WRITE(numout,*) ' sss_m     : ', sss_m(zji,zjj) 
    505508                  WRITE(numout,*) ' dh_i_bott : ', dh_i_bott(ji) 
    506                   WRITE(numout,*) ' innermelt : ', innermelt(ji) 
     509                  WRITE(numout,*) ' innermelt : ', INT( zinnermelt(ji) ) 
    507510               ENDIF 
    508511            ENDIF 
     
    687690 
    688691         ! Total ablation ! new lines added to debug 
    689          IF( ht_i_b(ji) <= 0.e0 )   a_i_b(ji) = 0.0 
     692         IF( ht_i_b(ji) <= 0._wp )   a_i_b(ji) = 0._wp 
    690693 
    691694         ! diagnostic ( snow ice growth ) 
     
    695698         ! 
    696699      END DO !ji 
    697  
     700      ! 
     701      IF( wrk_not_released(1, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) )   & 
     702          CALL ctl_stop('lim_thd_dh : failed to release workspace arrays') 
     703      ! 
    698704   END SUBROUTINE lim_thd_dh 
    699705    
Note: See TracChangeset for help on using the changeset viewer.