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 775 for branches/dev_001_GM/NEMO/TOP_SRC/PISCES_SMS/p4zopt.F90 – NEMO

Ignore:
Timestamp:
2007-12-19T14:45:15+01:00 (16 years ago)
Author:
gm
Message:

dev_001_GM - PISCES in F90 : encapsulation of all p4z...F files in module F90 + doctor norme for local variables - compilation OK

File:
1 moved

Legend:

Unmodified
Added
Removed
  • branches/dev_001_GM/NEMO/TOP_SRC/PISCES_SMS/p4zopt.F90

    r774 r775  
    1  
    2 CCC $Header$  
    3 CCC  TOP 1.0 , LOCEAN-IPSL (2005)  
    4 C This software is governed by CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    5 C --------------------------------------------------------------------------- 
    6 CDIR$ LIST 
    7       SUBROUTINE p4zopt 
    8 #if defined key_top && defined key_pisces 
    9 CCC--------------------------------------------------------------------- 
    10 CCC 
    11 CCC             ROUTINE p4zopt : PISCES MODEL 
    12 CCC             ***************************** 
    13 CCC 
    14 CCC  PURPOSE : 
    15 CCC  --------- 
    16 CCC         Compute the light availability in the water column 
    17 CCC         depending on the depth and the chlorophyll concentration 
    18 CCC 
    19 CC   INPUT : 
    20 CC   ----- 
    21 CC      argument 
    22 CC              None 
    23 CC      common 
    24 CC              all the common defined in opa 
    25 CC 
    26 CC 
    27 CC   OUTPUT :                   : no 
    28 CC   ------ 
    29 CC 
    30 CC   MODIFICATIONS: 
    31 CC   -------------- 
    32 CC      original  : O. Aumont (2004) 
    33 CC---------------------------------------------------------------------- 
    34 CC parameters and commons 
    35 CC ====================== 
    36 CDIR$ NOLIST 
    37       USE oce_trc 
    38       USE trp_trc 
    39       USE sms 
    40       IMPLICIT NONE 
    41 #include "domzgr_substitute.h90" 
    42 CDIR$ LIST 
    43 CC---------------------------------------------------------------------- 
    44 CC local declarations 
    45 CC ================== 
    46       INTEGER ji, jj, jk, mrgb 
    47       REAL xchl,ekg(jpi,jpj,jpk),ekr(jpi,jpj,jpk),ekb(jpi,jpj,jpk) 
    48       REAL parlux,e1(jpi,jpj,jpk),e2(jpi,jpj,jpk),e3(jpi,jpj,jpk) 
    49       REAL zdepmoy(jpi,jpj),etmp(jpi,jpj) 
    50       REAL zrlight,zblight,zglight 
    51       REAL zrlight1,zblight1,zglight1 
    52       REAL e3lum(jpi,jpj,jpk),e4lum(jpi,jpj,jpk) 
    53       REAL e5lum(jpi,jpj,jpk),e6lum(jpi,jpj,jpk) 
    54 C 
    55 C     Initialisation of variables used to compute PAR 
    56 C     ----------------------------------------------- 
    57 C 
    58         e1     = 0. 
    59         e2     = 0. 
    60         e3     = 0. 
    61         etot   = 0. 
    62         parlux = 0.43/3. 
    63  
    64         IF (ln_qsr_sms) THEN 
    65 C 
    66 C    IF activated, computation of the qsr for the dynamics 
    67 C    ----------------------------------------------------- 
    68 C 
    69           e3lum=0. 
    70           e4lum=0. 
    71           e5lum=0. 
    72           e6lum=0. 
    73         ENDIF 
    74  
    75         DO jk=1,jpkm1 
    76           DO jj=1,jpj 
    77             DO ji=1,jpi 
    78 C 
    79 C     Separation in three light bands: red, green, blue 
    80 C     ------------------------------------------------- 
    81 C 
    82         xchl=(trn(ji,jj,jk,jpnch)+trn(ji,jj,jk,jpdch)+rtrn)*1.E6 
    83         xchl=max(0.03,xchl) 
    84         xchl=min(10.,xchl) 
     1MODULE p4zopt 
     2   !!====================================================================== 
     3   !!                         ***  MODULE p4zopt  *** 
     4   !! TOP :   PISCES Compute the light availability in the water column 
     5   !!====================================================================== 
     6   !! History :   1.0  !  2004     (O. Aumont) Original code 
     7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90 
     8   !!---------------------------------------------------------------------- 
     9#if defined key_pisces 
     10   !!---------------------------------------------------------------------- 
     11   !!   'key_pisces'                                       PISCES bio-model 
     12   !!---------------------------------------------------------------------- 
     13   !!   p4z_opt        :   Compute the light availability in the water column 
     14   !!---------------------------------------------------------------------- 
     15   USE oce_trc         ! 
     16   USE trp_trc 
     17   USE sms 
     18 
     19   IMPLICIT NONE 
     20   PRIVATE 
     21 
     22   PUBLIC   p4z_opt   ! called in p4zprg.F90 
     23 
     24   !!* Substitution 
     25#  include "domzgr_substitute.h90" 
     26   !!---------------------------------------------------------------------- 
     27   !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007)  
     28   !! $Header:$  
     29   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     30   !!---------------------------------------------------------------------- 
     31 
     32CONTAINS 
     33 
     34   SUBROUTINE p4z_opt 
     35      !!--------------------------------------------------------------------- 
     36      !!                     ***  ROUTINE p4z_opt  *** 
     37      !! 
     38      !! ** Purpose :   Compute the light availability in the water column 
     39      !!              depending on the depth and the chlorophyll concentration 
     40      !! 
     41      !! ** Method  : - ??? 
     42      !!--------------------------------------------------------------------- 
     43      INTEGER  ::   ji, jj, jk 
     44      INTEGER  ::   irgb 
     45      REAL(wp) ::   zchl, zparlux 
     46      REAL(wp) ::   zrlight , zblight , zglight 
     47      REAL(wp) ::   zrlight1, zblight1, zglight1 
     48      REAL(wp), DIMENSION(jpi,jpj)     ::   zdepmoy, zetmp 
     49      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zekg, zekr, zekb 
     50      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze1 , ze2 , ze3 
     51      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze3lum, ze4lum 
     52      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze5lum, ze6lum 
     53      !!--------------------------------------------------------------------- 
     54 
     55!     Initialisation of variables used to compute PAR 
     56!     ----------------------------------------------- 
     57      ze1 (:,:,:) = 0.e0 
     58      ze2 (:,:,:) = 0.e0 
     59      ze3 (:,:,:) = 0.e0 
     60      etot(:,:,:) = 0.e0 
     61         
     62      zparlux = 0.43 / 3. 
     63 
     64!    IF activated, computation of the qsr for the dynamics 
     65!    ----------------------------------------------------- 
     66      IF( ln_qsr_sms ) THEN 
     67         ze3lum(:,:,:) = 0.e0 
     68         ze4lum(:,:,:) = 0.e0 
     69         ze5lum(:,:,:) = 0.e0 
     70         ze6lum(:,:,:) = 0.e0 
     71      ENDIF 
     72 
     73      DO jk = 1, jpkm1 
     74         DO jj = 1, jpj 
     75            DO ji = 1, jpi 
     76 
     77!     Separation in three light bands: red, green, blue 
     78!     ------------------------------------------------- 
     79               zchl = ( trn(ji,jj,jk,jpnch) + trn(ji,jj,jk,jpdch) + rtrn ) * 1.e6 
     80               zchl = MAX( 0.03, zchl ) 
     81               zchl = MIN( 10. , zchl ) 
    8582                                                                                 
    86         mrgb = int(41+20.*log10(xchl)+rtrn) 
     83               irgb = INT( 41 + 20.* LOG10( zchl ) + rtrn ) 
    8784                                                                                 
    88         ekb(ji,jj,jk)=xkrgb(1,mrgb) 
    89         ekg(ji,jj,jk)=xkrgb(2,mrgb) 
    90         ekr(ji,jj,jk)=xkrgb(3,mrgb) 
    91 C 
    92             END DO 
    93           END DO 
    94         END DO 
    95 C 
    96           DO jj = 1,jpj 
    97             DO ji = 1,jpi 
    98 C 
    99 C     Separation in three light bands: red, green, blue 
    100 C     ------------------------------------------------- 
    101 C 
    102         zblight=0.5*ekb(ji,jj,1)*fse3t(ji,jj,1) 
    103         zglight=0.5*ekg(ji,jj,1)*fse3t(ji,jj,1) 
    104         zrlight=0.5*ekr(ji,jj,1)*fse3t(ji,jj,1) 
    105 C 
    106         e1(ji,jj,1) = parlux*qsr(ji,jj)*exp(-zblight) 
    107         e2(ji,jj,1) = parlux*qsr(ji,jj)*exp(-zglight) 
    108         e3(ji,jj,1) = parlux*qsr(ji,jj)*exp(-zrlight) 
    109 C 
    110             END DO 
    111           END DO 
    112  
    113         DO jk = 2,jpkm1 
    114           DO jj = 1,jpj 
    115             DO ji = 1,jpi 
    116 C 
    117 C     Separation in three light bands: red, green, blue 
    118 C     ------------------------------------------------- 
    119 C 
    120         zblight=0.5*(ekb(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    121      &    +ekb(ji,jj,jk)*fse3t(ji,jj,jk)) 
    122         zglight=0.5*(ekg(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    123      &    +ekg(ji,jj,jk)*fse3t(ji,jj,jk)) 
    124         zrlight=0.5*(ekr(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    125      &    +ekr(ji,jj,jk)*fse3t(ji,jj,jk)) 
    126 C 
    127         e1(ji,jj,jk) = e1(ji,jj,jk-1)*exp(-zblight) 
    128         e2(ji,jj,jk) = e2(ji,jj,jk-1)*exp(-zglight) 
    129         e3(ji,jj,jk) = e3(ji,jj,jk-1)*exp(-zrlight) 
    130 C 
    131             END DO 
    132           END DO 
    133         END DO 
    134 C 
    135         etot(:,:,:) = e1(:,:,:)+e2(:,:,:)+e3(:,:,:) 
    136  
    137         IF (ln_qsr_sms) THEN 
    138 C 
    139 C   In the following, the vertical attenuation of qsr for the  
    140 C   dynamics is computed 
    141 C   --------------------------------------------------------- 
    142 C 
    143           DO jj = 1,jpj 
    144             DO ji = 1,jpi 
    145 C 
    146 C     Separation in three light bands: red, green, blue 
    147 C     ------------------------------------------------- 
    148 C 
    149         zblight=0.5*ekb(ji,jj,1)*fse3t(ji,jj,1) 
    150         zglight=0.5*ekg(ji,jj,1)*fse3t(ji,jj,1) 
    151         zrlight=0.5*ekr(ji,jj,1)*fse3t(ji,jj,1) 
    152 C 
    153         e3lum(ji,jj,1) = parlux*qsr(ji,jj) 
    154         e4lum(ji,jj,1) = parlux*qsr(ji,jj) 
    155         e5lum(ji,jj,1) = parlux*qsr(ji,jj) 
    156         e6lum(ji,jj,1) = (1.-3.*parlux)*qsr(ji,jj) 
    157 C 
    158             END DO 
    159           END DO 
    160  
    161         DO jk = 2,jpkm1 
    162           DO jj = 1,jpj 
    163             DO ji = 1,jpi 
    164 C 
    165 C     Separation in three light bands: red, green, blue 
    166 C     ------------------------------------------------- 
    167 C 
    168         zblight1=ekb(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    169         zglight1=ekg(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    170         zrlight1=ekr(ji,jj,jk-1)*fse3t(ji,jj,jk-1) 
    171  
    172         e3lum(ji,jj,jk) = e3lum(ji,jj,jk-1)*exp(-zblight) 
    173         e4lum(ji,jj,jk) = e4lum(ji,jj,jk-1)*exp(-zglight) 
    174         e5lum(ji,jj,jk) = e5lum(ji,jj,jk-1)*exp(-zrlight) 
    175         e6lum(ji,jj,jk) = e6lum(ji,jj,jk-1) 
    176      &    *exp(-fse3t(ji,jj,jk-1)/xsi1) 
    177 C 
    178             END DO 
    179           END DO 
    180         END DO 
    181  
    182         etot3(:,:,:)=e3lum(:,:,:)+e4lum(:,:,:)+e5lum(:,:,:) 
    183      &    +e6lum(:,:,:) 
    184  
    185         ENDIF 
    186 C     
    187 C     Computation of the euphotic depth 
    188 C     --------------------------------- 
    189 C     
    190         zmeu(:,:) = 300. 
    191  
    192         DO jk = 2,jpkm1 
    193           DO jj = 1,jpj 
    194             DO ji = 1,jpi 
    195         IF (etot(ji,jj,jk).GE.0.0043*qsr(ji,jj)) THEN 
    196            zmeu(ji,jj) = fsdepw(ji,jj,jk+1) 
    197         ENDIF 
    198             END DO 
    199           END DO 
    200         END DO 
    201 C 
    202         zmeu(:,:)=min(300.,zmeu(:,:)) 
    203 C 
    204 C    Computation of the mean light over the mixed layer depth 
    205 C    -------------------------------------------------------- 
    206 C 
    207         zdepmoy  = 0 
    208         etmp  = 0. 
    209         emoy  = 0. 
    210  
    211         DO jk = 1,jpkm1 
    212           DO jj = 1,jpj 
    213             DO ji = 1,jpi 
    214          if (fsdepw(ji,jj,jk+1).le.hmld(ji,jj)) then 
    215        etmp(ji,jj) = etmp(ji,jj)+etot(ji,jj,jk)*fse3t(ji,jj,jk) 
    216        zdepmoy(ji,jj)=zdepmoy(ji,jj)+fse3t(ji,jj,jk) 
    217          endif 
    218             END DO 
    219           END DO 
    220         END DO 
    221  
    222         emoy(:,:,:) = etot(:,:,:) 
    223  
    224         DO jk = 1,jpkm1 
    225           DO jj = 1,jpj 
    226             DO ji = 1,jpi 
    227         IF (fsdepw(ji,jj,jk+1).LE.hmld(ji,jj)) THEN 
    228           emoy(ji,jj,jk) = etmp(ji,jj)/(zdepmoy(ji,jj)+rtrn) 
    229         ENDIF 
    230             END DO 
    231           END DO 
    232         END DO 
    233  
    234 #   if defined key_trc_diaadd 
    235         trc2d(:,:,11) = zmeu(:,:) 
    236 #    endif 
    237 C 
    238 #endif 
    239       RETURN 
    240       END 
     85               zekb(ji,jj,jk) = xkrgb(1,irgb) 
     86               zekg(ji,jj,jk) = xkrgb(2,irgb) 
     87               zekr(ji,jj,jk) = xkrgb(3,irgb) 
     88 
     89            END DO 
     90         END DO 
     91      END DO 
     92 
     93      DO jj = 1,jpj 
     94         DO ji = 1,jpi 
     95 
     96!     Separation in three light bands: red, green, blue 
     97!     ------------------------------------------------- 
     98 
     99            zblight = 0.5 * zekb(ji,jj,1) * fse3t(ji,jj,1) 
     100            zglight = 0.5 * zekg(ji,jj,1) * fse3t(ji,jj,1) 
     101            zrlight = 0.5 * zekr(ji,jj,1) * fse3t(ji,jj,1) 
     102 
     103            ze1(ji,jj,1) = zparlux * qsr(ji,jj) * EXP(-zblight) 
     104            ze2(ji,jj,1) = zparlux * qsr(ji,jj) * EXP(-zglight) 
     105            ze3(ji,jj,1) = zparlux * qsr(ji,jj) * EXP(-zrlight) 
     106 
     107         END DO 
     108      END DO 
     109 
     110      DO jk = 2, jpkm1 
     111          DO jj = 1, jpj 
     112            DO ji = 1, jpi 
     113 
     114!     Separation in three light bands: red, green, blue 
     115!     ------------------------------------------------- 
     116 
     117               zblight = 0.5 * ( zekb(ji,jj,jk-1) * fse3t(ji,jj,jk-1)   & 
     118                  &            + zekb(ji,jj,jk  ) * fse3t(ji,jj,jk  ) ) 
     119               zglight = 0.5 * ( zekg(ji,jj,jk-1) * fse3t(ji,jj,jk-1)   & 
     120                  &            + zekg(ji,jj,jk  ) * fse3t(ji,jj,jk  ) ) 
     121               zrlight = 0.5 * ( zekr(ji,jj,jk-1) * fse3t(ji,jj,jk-1)   & 
     122                  &            + zekr(ji,jj,jk  ) * fse3t(ji,jj,jk  ) ) 
     123 
     124               ze1(ji,jj,jk) = ze1(ji,jj,jk-1) * EXP(-zblight) 
     125               ze2(ji,jj,jk) = ze2(ji,jj,jk-1) * EXP(-zglight) 
     126               ze3(ji,jj,jk) = ze3(ji,jj,jk-1) * EXP(-zrlight) 
     127 
     128            END DO 
     129         END DO 
     130      END DO 
     131 
     132      etot(:,:,:) = ze1(:,:,:) + ze2(:,:,:) + ze3(:,:,:) 
     133 
     134      IF( ln_qsr_sms ) THEN 
     135 
     136!   In the following, the vertical attenuation of qsr for the dynamics is computed 
     137!   ------------------------------------------------------------------------------ 
     138 
     139         DO jj = 1, jpj 
     140            DO ji = 1, jpi 
     141 
     142!     Separation in three light bands: red, green, blue 
     143!     ------------------------------------------------- 
     144 
     145               zblight = 0.5 * zekb(ji,jj,1) * fse3t(ji,jj,1) 
     146               zglight = 0.5 * zekg(ji,jj,1) * fse3t(ji,jj,1) 
     147               zrlight = 0.5 * zekr(ji,jj,1) * fse3t(ji,jj,1) 
     148 
     149               ze3lum(ji,jj,1) = zparlux * qsr(ji,jj) 
     150               ze4lum(ji,jj,1) = zparlux * qsr(ji,jj) 
     151               ze5lum(ji,jj,1) = zparlux * qsr(ji,jj) 
     152               ze6lum(ji,jj,1) = (1.-3. * zparlux) * qsr(ji,jj) 
     153 
     154            END DO 
     155         END DO 
     156 
     157         DO jk = 2, jpkm1 
     158            DO jj = 1, jpj 
     159               DO ji = 1, jpi 
     160 
     161!     Separation in three light bands: red, green, blue 
     162!     ------------------------------------------------- 
     163 
     164                  zblight1 = zekb(ji,jj,jk-1) * fse3t(ji,jj,jk-1) 
     165                  zglight1 = zekg(ji,jj,jk-1) * fse3t(ji,jj,jk-1) 
     166                  zrlight1 = zekr(ji,jj,jk-1) * fse3t(ji,jj,jk-1) 
     167 
     168                  ze3lum(ji,jj,jk) = ze3lum(ji,jj,jk-1) * EXP( -zblight ) 
     169                  ze4lum(ji,jj,jk) = ze4lum(ji,jj,jk-1) * EXP( -zglight ) 
     170                  ze5lum(ji,jj,jk) = ze5lum(ji,jj,jk-1) * EXP( -zrlight ) 
     171                  ze6lum(ji,jj,jk) = ze6lum(ji,jj,jk-1) * EXP( -fse3t(ji,jj,jk-1) / xsi1 ) 
     172 
     173               END DO 
     174            END DO 
     175         END DO 
     176 
     177         etot3(:,:,:) = ze3lum(:,:,:) + ze4lum(:,:,:) + ze5lum(:,:,:) + ze6lum(:,:,:) 
     178 
     179      ENDIF 
     180 
     181!     Computation of the euphotic depth 
     182!     --------------------------------- 
     183     
     184      zmeu(:,:) = 300.e0 
     185 
     186      DO jk = 2, jpkm1 
     187         DO jj = 1, jpj 
     188            DO ji = 1, jpi 
     189               IF( etot(ji,jj,jk) >= 0.0043 * qsr(ji,jj) )   zmeu(ji,jj) = fsdepw(ji,jj,jk+1) 
     190            END DO 
     191         END DO 
     192      END DO 
     193 
     194      zmeu(:,:) = MIN( 300., zmeu(:,:) ) 
     195 
     196!    Computation of the mean light over the mixed layer depth 
     197!    -------------------------------------------------------- 
     198 
     199      zdepmoy(:,:)   = 0.e0 
     200      zetmp  (:,:)   = 0.e0 
     201      emoy   (:,:,:) = 0.e0 
     202 
     203      DO jk = 1, jpkm1 
     204         DO jj = 1, jpj 
     205            DO ji = 1, jpi 
     206               IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN 
     207                  zetmp  (ji,jj) = zetmp  (ji,jj) + etot(ji,jj,jk) * fse3t(ji,jj,jk) 
     208                  zdepmoy(ji,jj) = zdepmoy(ji,jj) +                  fse3t(ji,jj,jk) 
     209               ENDIF 
     210            END DO 
     211         END DO 
     212      END DO 
     213 
     214      emoy(:,:,:) = etot(:,:,:) 
     215 
     216      DO jk = 1, jpkm1 
     217         DO jj = 1, jpj 
     218            DO ji = 1, jpi 
     219               IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN 
     220                  emoy(ji,jj,jk) = zetmp(ji,jj) / ( zdepmoy(ji,jj) + rtrn ) 
     221               ENDIF 
     222            END DO 
     223         END DO 
     224      END DO 
     225 
     226# if defined key_trc_diaadd 
     227      trc2d(:,:,11) = zmeu(:,:) 
     228# endif 
     229      ! 
     230   END SUBROUTINE p4z_opt 
     231 
     232#else 
     233   !!====================================================================== 
     234   !!  Dummy module :                                   No PISCES bio-model 
     235   !!====================================================================== 
     236CONTAINS 
     237   SUBROUTINE p4z_opt                   ! Empty routine 
     238   END SUBROUTINE p4z_opt 
     239#endif  
     240 
     241   !!====================================================================== 
     242END MODULE  p4zopt 
Note: See TracChangeset for help on using the changeset viewer.