Ignore:
Timestamp:
Oct 21, 2024, 2:58:45 PM (22 hours ago)
Author:
abarral
Message:

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/dyn3d_common/diagedyn.f90

    r5245 r5246  
    33!
    44
    5 C======================================================================
    6       SUBROUTINE diagedyn(tit,iprt,idiag,idiag2,dtime
    7      e  , ucov    , vcov , ps, p ,pk , teta , q, ql)
    8 C======================================================================
    9 C
    10 C Purpose:
    11 C    Calcul la difference d'enthalpie et de masse d'eau entre 2 appels,
    12 C    et calcul le flux de chaleur et le flux d'eau necessaire a ces
    13 C    changements. Ces valeurs sont moyennees sur la surface de tout
    14 C    le globe et sont exprime en W/2 et kg/s/m2
    15 C    Outil pour diagnostiquer la conservation de l'energie
    16 C    et de la masse dans la dynamique.
    17 C
    18 C
    19 c======================================================================
    20 C Arguments:
    21 C tit-----imput-A15- Comment added in PRINT (CHARACTER*15)
    22 C iprt----input-I-  PRINT level ( <=1 : no PRINT)
    23 C idiag---input-I- indice dans lequel sera range les nouveaux
    24 C                  bilans d' entalpie et de masse
    25 C idiag2--input-I-les nouveaux bilans d'entalpie et de masse
    26 C                 sont compare au bilan de d'enthalpie de masse de
    27 C                 l'indice numero idiag2
    28 C                 Cas parriculier : si idiag2=0, pas de comparaison, on
    29 c                 sort directement les bilans d'enthalpie et de masse
    30 C dtime----input-R- time step (s)
    31 C uconv, vconv-input-R- vents covariants (m/s)
    32 C ps-------input-R- Surface pressure (Pa)
    33 C p--------input-R- pressure at the interfaces
    34 C pk-------input-R- pk= (p/Pref)**kappa
    35 c teta-----input-R- potential temperature (K)
    36 c q--------input-R- vapeur d'eau (kg/kg)
    37 c ql-------input-R- liquid watter (kg/kg)
    38 c aire-----input-R- mesh surafce (m2)
    39 c
    40 C the following total value are computed by UNIT of earth surface
    41 C
    42 C d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
    43 c            change (J/m2) during one time step (dtime) for the whole
    44 C            atmosphere (air, watter vapour, liquid and solid)
    45 C d_qt------output-R- total water mass flux (kg/m2/s) defined as the
    46 C           total watter (kg/m2) change during one time step (dtime),
    47 C d_qw------output-R- same, for the watter vapour only (kg/m2/s)
    48 C d_ql------output-R- same, for the liquid watter only (kg/m2/s)
    49 C d_ec------output-R- Cinetic Energy Budget (W/m2) for vertical air column
    50 C
    51 C
    52 C J.L. Dufresne, July 2002
    53 c======================================================================
    54  
    55       USE control_mod, ONLY : planet_type
    56      
    57       IMPLICIT NONE
    58 C
    59       INCLUDE "dimensions.h"
    60       INCLUDE "paramet.h"
    61       INCLUDE "comgeom.h"
    62       INCLUDE "iniprint.h"
    63 
    64 !#ifdef CPP_EARTH
    65 !      INCLUDE "../phylmd/YOMCST.h"
    66 !      INCLUDE "../phylmd/YOETHF.h"
    67 !#endif
    68 ! Ehouarn: for now set these parameters to what is in Earth physics...
    69 !          (cf ../phylmd/suphel.h)
    70 !          this should be generalized...
    71       REAL,PARAMETER :: RCPD=
    72      &               3.5*(1000.*(6.0221367E+23*1.380658E-23)/28.9644)
    73       REAL,PARAMETER :: RCPV=
    74      &               4.*(1000.*(6.0221367E+23*1.380658E-23)/18.0153)
    75       REAL,PARAMETER :: RCS=RCPV
    76       REAL,PARAMETER :: RCW=RCPV
    77       REAL,PARAMETER :: RLSTT=2.8345E+6
    78       REAL,PARAMETER :: RLVTT=2.5008E+6
    79 !
    80 C
    81       INTEGER imjmp1
    82       PARAMETER( imjmp1=iim*jjp1)
    83 c     Input variables
    84       CHARACTER*15 tit
    85       INTEGER iprt,idiag, idiag2
    86       REAL dtime
    87       REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
    88       REAL ps(ip1jmp1)                       ! pression  au sol
    89       REAL p (ip1jmp1,llmp1  )  ! pression aux interfac.des couches
    90       REAL pk (ip1jmp1,llm  )  ! = (p/Pref)**kappa
    91       REAL teta(ip1jmp1,llm)                 ! temperature potentielle
    92       REAL q(ip1jmp1,llm)               ! champs eau vapeur
    93       REAL ql(ip1jmp1,llm)               ! champs eau liquide
    94 
    95 
    96 c     Output variables
    97       REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
    98 C
    99 C     Local variables
    100 c
    101       REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
    102      .  , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
    103 c h_vcol_tot--  total enthalpy of vertical air column
    104 C            (air with watter vapour, liquid and solid) (J/m2)
    105 c h_dair_tot-- total enthalpy of dry air (J/m2)
    106 c h_qw_tot----  total enthalpy of watter vapour (J/m2)
    107 c h_ql_tot----  total enthalpy of liquid watter (J/m2)
    108 c h_qs_tot----  total enthalpy of solid watter  (J/m2)
    109 c qw_tot------  total mass of watter vapour (kg/m2)
    110 c ql_tot------  total mass of liquid watter (kg/m2)
    111 c qs_tot------  total mass of solid watter (kg/m2)
    112 c ec_tot------  total cinetic energy (kg/m2)
    113 C
    114       REAL masse(ip1jmp1,llm)                ! masse d'air
    115       REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
    116       REAL ecin(ip1jmp1,llm)
    117 
    118       REAL zaire(imjmp1)
    119       REAL zps(imjmp1)
    120       REAL zairm(imjmp1,llm)
    121       REAL zecin(imjmp1,llm)
    122       REAL zpaprs(imjmp1,llm)
    123       REAL zpk(imjmp1,llm)
    124       REAL zt(imjmp1,llm)
    125       REAL zh(imjmp1,llm)
    126       REAL zqw(imjmp1,llm)
    127       REAL zql(imjmp1,llm)
    128       REAL zqs(imjmp1,llm)
    129 
    130       REAL  zqw_col(imjmp1)
    131       REAL  zql_col(imjmp1)
    132       REAL  zqs_col(imjmp1)
    133       REAL  zec_col(imjmp1)
    134       REAL  zh_dair_col(imjmp1)
    135       REAL  zh_qw_col(imjmp1), zh_ql_col(imjmp1), zh_qs_col(imjmp1)
    136 C
    137       REAL      d_h_dair, d_h_qw, d_h_ql, d_h_qs
    138 C
    139       REAL airetot, zcpvap, zcwat, zcice
    140 C
    141       INTEGER i, k, jj, ij , l ,ip1jjm1
    142 C
    143       INTEGER ndiag     ! max number of diagnostic in parallel
    144       PARAMETER (ndiag=10)
    145       integer pas(ndiag)
    146       save pas
    147       data pas/ndiag*0/
    148 C     
    149       REAL      h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag)
    150      $    , h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag)
    151      $    , ql_pre(ndiag), qs_pre(ndiag) , ec_pre(ndiag)
    152       SAVE      h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre
    153      $        , h_qs_pre, qw_pre, ql_pre, qs_pre , ec_pre
    154 
    155 
    156 !#ifdef CPP_EARTH
    157       IF (planet_type=="earth") THEN
    158      
    159 c======================================================================
    160 C     Compute Kinetic enrgy
    161       CALL covcont  ( llm    , ucov    , vcov , ucont, vcont        )
    162       CALL enercin ( vcov   , ucov  , vcont     , ucont  , ecin  )
    163       CALL massdair( p, masse )
    164 c======================================================================
    165 C
    166 C
    167       print*,'MAIS POURQUOI DONC DIAGEDYN NE MARCHE PAS ?'
    168       return
    169 C     On ne garde les donnees que dans les colonnes i=1,iim
    170       DO jj = 1,jjp1
    171         ip1jjm1=iip1*(jj-1)
    172         DO ij =  1,iim
    173           i=iim*(jj-1)+ij
    174           zaire(i)=aire(ij+ip1jjm1)
    175           zps(i)=ps(ij+ip1jjm1)
    176         ENDDO
    177       ENDDO
    178 C 3D arrays
    179       DO l  =  1, llm
    180         DO jj = 1,jjp1
    181           ip1jjm1=iip1*(jj-1)
    182           DO ij =  1,iim
    183             i=iim*(jj-1)+ij
    184             zairm(i,l) = masse(ij+ip1jjm1,l)
    185             zecin(i,l) = ecin(ij+ip1jjm1,l)
    186             zpaprs(i,l) = p(ij+ip1jjm1,l)
    187             zpk(i,l) = pk(ij+ip1jjm1,l)
    188             zh(i,l) = teta(ij+ip1jjm1,l)
    189             zqw(i,l) = q(ij+ip1jjm1,l)
    190             zql(i,l) = ql(ij+ip1jjm1,l)
    191             zqs(i,l) = 0.
    192           ENDDO
    193         ENDDO
    194       ENDDO
    195 C
    196 C     Reset variables
    197       DO i = 1, imjmp1
    198         zqw_col(i)=0.
    199         zql_col(i)=0.
    200         zqs_col(i)=0.
    201         zec_col(i) = 0.
    202         zh_dair_col(i) = 0.
    203         zh_qw_col(i) = 0.
    204         zh_ql_col(i) = 0.
    205         zh_qs_col(i) = 0.
     5!======================================================================
     6SUBROUTINE diagedyn(tit,iprt,idiag,idiag2,dtime &
     7        , ucov    , vcov , ps, p ,pk , teta , q, ql)
     8  !======================================================================
     9  !
     10  ! Purpose:
     11  !    Calcul la difference d'enthalpie et de masse d'eau entre 2 appels,
     12  !    et calcul le flux de chaleur et le flux d'eau necessaire a ces
     13  !    changements. Ces valeurs sont moyennees sur la surface de tout
     14  !    le globe et sont exprime en W/2 et kg/s/m2
     15  !    Outil pour diagnostiquer la conservation de l'energie
     16  !    et de la masse dans la dynamique.
     17  !
     18  !
     19  !======================================================================
     20  ! Arguments:
     21  ! tit-----imput-A15- Comment added in PRINT (CHARACTER*15)
     22  ! iprt----input-I-  PRINT level ( <=1 : no PRINT)
     23  ! idiag---input-I- indice dans lequel sera range les nouveaux
     24  !              bilans d' entalpie et de masse
     25  ! idiag2--input-I-les nouveaux bilans d'entalpie et de masse
     26  !             sont compare au bilan de d'enthalpie de masse de
     27  !             l'indice numero idiag2
     28  !             Cas parriculier : si idiag2=0, pas de comparaison, on
     29  !             sort directement les bilans d'enthalpie et de masse
     30  ! dtime----input-R- time step (s)
     31  ! uconv, vconv-input-R- vents covariants (m/s)
     32  ! ps-------input-R- Surface pressure (Pa)
     33  ! p--------input-R- pressure at the interfaces
     34  ! pk-------input-R- pk= (p/Pref)**kappa
     35  ! teta-----input-R- potential temperature (K)
     36  ! q--------input-R- vapeur d'eau (kg/kg)
     37  ! ql-------input-R- liquid watter (kg/kg)
     38  ! aire-----input-R- mesh surafce (m2)
     39  !
     40  ! the following total value are computed by UNIT of earth surface
     41  !
     42  ! d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
     43  !        change (J/m2) during one time step (dtime) for the whole
     44  !        atmosphere (air, watter vapour, liquid and solid)
     45  ! d_qt------output-R- total water mass flux (kg/m2/s) defined as the
     46  !       total watter (kg/m2) change during one time step (dtime),
     47  ! d_qw------output-R- same, for the watter vapour only (kg/m2/s)
     48  ! d_ql------output-R- same, for the liquid watter only (kg/m2/s)
     49  ! d_ec------output-R- Cinetic Energy Budget (W/m2) for vertical air column
     50  !
     51  !
     52  ! J.L. Dufresne, July 2002
     53  !======================================================================
     54
     55  USE control_mod, ONLY : planet_type
     56
     57  IMPLICIT NONE
     58  !
     59  INCLUDE "dimensions.h"
     60  INCLUDE "paramet.h"
     61  INCLUDE "comgeom.h"
     62  INCLUDE "iniprint.h"
     63
     64  !#ifdef CPP_EARTH
     65   ! INCLUDE "../phylmd/YOMCST.h"
     66   ! INCLUDE "../phylmd/YOETHF.h"
     67  !#endif
     68  ! Ehouarn: for now set these parameters to what is in Earth physics...
     69   !     (cf ../phylmd/suphel.h)
     70   !     this should be generalized...
     71  REAL,PARAMETER :: RCPD= &
     72        3.5*(1000.*(6.0221367E+23*1.380658E-23)/28.9644)
     73  REAL,PARAMETER :: RCPV= &
     74        4.*(1000.*(6.0221367E+23*1.380658E-23)/18.0153)
     75  REAL,PARAMETER :: RCS=RCPV
     76  REAL,PARAMETER :: RCW=RCPV
     77  REAL,PARAMETER :: RLSTT=2.8345E+6
     78  REAL,PARAMETER :: RLVTT=2.5008E+6
     79  !
     80  !
     81  INTEGER :: imjmp1
     82  PARAMETER( imjmp1=iim*jjp1)
     83  ! Input variables
     84  CHARACTER(len=15) :: tit
     85  INTEGER :: iprt,idiag, idiag2
     86  REAL :: dtime
     87  REAL :: vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
     88  REAL :: ps(ip1jmp1)                       ! pression  au sol
     89  REAL :: p (ip1jmp1,llmp1  )  ! pression aux interfac.des couches
     90  REAL :: pk (ip1jmp1,llm  )  ! = (p/Pref)**kappa
     91  REAL :: teta(ip1jmp1,llm)                 ! temperature potentielle
     92  REAL :: q(ip1jmp1,llm)               ! champs eau vapeur
     93  REAL :: ql(ip1jmp1,llm)               ! champs eau liquide
     94
     95
     96  ! Output variables
     97  REAL :: d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
     98  !
     99  ! Local variables
     100  !
     101  REAL :: h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot &
     102        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
     103  ! h_vcol_tot--  total enthalpy of vertical air column
     104         ! (air with watter vapour, liquid and solid) (J/m2)
     105  ! h_dair_tot-- total enthalpy of dry air (J/m2)
     106  ! h_qw_tot----  total enthalpy of watter vapour (J/m2)
     107  ! h_ql_tot----  total enthalpy of liquid watter (J/m2)
     108  ! h_qs_tot----  total enthalpy of solid watter  (J/m2)
     109  ! qw_tot------  total mass of watter vapour (kg/m2)
     110  ! ql_tot------  total mass of liquid watter (kg/m2)
     111  ! qs_tot------  total mass of solid watter (kg/m2)
     112  ! ec_tot------  total cinetic energy (kg/m2)
     113  !
     114  REAL :: masse(ip1jmp1,llm)                ! masse d'air
     115  REAL :: vcont(ip1jm,llm),ucont(ip1jmp1,llm)
     116  REAL :: ecin(ip1jmp1,llm)
     117
     118  REAL :: zaire(imjmp1)
     119  REAL :: zps(imjmp1)
     120  REAL :: zairm(imjmp1,llm)
     121  REAL :: zecin(imjmp1,llm)
     122  REAL :: zpaprs(imjmp1,llm)
     123  REAL :: zpk(imjmp1,llm)
     124  REAL :: zt(imjmp1,llm)
     125  REAL :: zh(imjmp1,llm)
     126  REAL :: zqw(imjmp1,llm)
     127  REAL :: zql(imjmp1,llm)
     128  REAL :: zqs(imjmp1,llm)
     129
     130  REAL :: zqw_col(imjmp1)
     131  REAL :: zql_col(imjmp1)
     132  REAL :: zqs_col(imjmp1)
     133  REAL :: zec_col(imjmp1)
     134  REAL :: zh_dair_col(imjmp1)
     135  REAL :: zh_qw_col(imjmp1), zh_ql_col(imjmp1), zh_qs_col(imjmp1)
     136  !
     137  REAL :: d_h_dair, d_h_qw, d_h_ql, d_h_qs
     138  !
     139  REAL :: airetot, zcpvap, zcwat, zcice
     140  !
     141  INTEGER :: i, k, jj, ij , l ,ip1jjm1
     142  !
     143  INTEGER :: ndiag     ! max number of diagnostic in parallel
     144  PARAMETER (ndiag=10)
     145  integer :: pas(ndiag)
     146  save pas
     147  data pas/ndiag*0/
     148  !
     149  REAL :: h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag) &
     150        , h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag) &
     151        , ql_pre(ndiag), qs_pre(ndiag) , ec_pre(ndiag)
     152  SAVE      h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre &
     153        , h_qs_pre, qw_pre, ql_pre, qs_pre , ec_pre
     154
     155
     156  !#ifdef CPP_EARTH
     157  IF (planet_type=="earth") THEN
     158
     159  !======================================================================
     160  ! Compute Kinetic enrgy
     161  CALL covcont  ( llm    , ucov    , vcov , ucont, vcont        )
     162  CALL enercin ( vcov   , ucov  , vcont     , ucont  , ecin  )
     163  CALL massdair( p, masse )
     164  !======================================================================
     165  !
     166  !
     167  print*,'MAIS POURQUOI DONC DIAGEDYN NE MARCHE PAS ?'
     168  return
     169  ! On ne garde les donnees que dans les colonnes i=1,iim
     170  DO jj = 1,jjp1
     171    ip1jjm1=iip1*(jj-1)
     172    DO ij =  1,iim
     173      i=iim*(jj-1)+ij
     174      zaire(i)=aire(ij+ip1jjm1)
     175      zps(i)=ps(ij+ip1jjm1)
     176    ENDDO
     177  ENDDO
     178  ! 3D arrays
     179  DO l  =  1, llm
     180    DO jj = 1,jjp1
     181      ip1jjm1=iip1*(jj-1)
     182      DO ij =  1,iim
     183        i=iim*(jj-1)+ij
     184        zairm(i,l) = masse(ij+ip1jjm1,l)
     185        zecin(i,l) = ecin(ij+ip1jjm1,l)
     186        zpaprs(i,l) = p(ij+ip1jjm1,l)
     187        zpk(i,l) = pk(ij+ip1jjm1,l)
     188        zh(i,l) = teta(ij+ip1jjm1,l)
     189        zqw(i,l) = q(ij+ip1jjm1,l)
     190        zql(i,l) = ql(ij+ip1jjm1,l)
     191        zqs(i,l) = 0.
    206192      ENDDO
    207 C
    208       zcpvap=RCPV
    209       zcwat=RCW
    210       zcice=RCS
    211 C
    212 C     Compute vertical sum for each atmospheric column
    213 C     ================================================
    214       DO k = 1, llm
    215         DO i = 1, imjmp1
    216 C         Watter mass
    217           zqw_col(i) = zqw_col(i) + zqw(i,k)*zairm(i,k)
    218           zql_col(i) = zql_col(i) + zql(i,k)*zairm(i,k)
    219           zqs_col(i) = zqs_col(i) + zqs(i,k)*zairm(i,k)
    220 C         Cinetic Energy
    221           zec_col(i) =  zec_col(i)
    222      $        +zecin(i,k)*zairm(i,k)
    223 C         Air enthalpy
    224           zt(i,k)= zh(i,k) * zpk(i,k) / RCPD
    225           zh_dair_col(i) = zh_dair_col(i)
    226      $        + RCPD*(1.-zqw(i,k)-zql(i,k)-zqs(i,k))*zairm(i,k)*zt(i,k)
    227           zh_qw_col(i) = zh_qw_col(i)
    228      $        + zcpvap*zqw(i,k)*zairm(i,k)*zt(i,k)
    229           zh_ql_col(i) = zh_ql_col(i)
    230      $        + zcwat*zql(i,k)*zairm(i,k)*zt(i,k)
    231      $        - RLVTT*zql(i,k)*zairm(i,k)
    232           zh_qs_col(i) = zh_qs_col(i)
    233      $        + zcice*zqs(i,k)*zairm(i,k)*zt(i,k)
    234      $        - RLSTT*zqs(i,k)*zairm(i,k)
    235 
    236         END DO
    237       ENDDO
    238 C
    239 C     Mean over the planete surface
    240 C     =============================
    241       qw_tot = 0.
    242       ql_tot = 0.
    243       qs_tot = 0.
    244       ec_tot = 0.
    245       h_vcol_tot = 0.
    246       h_dair_tot = 0.
    247       h_qw_tot = 0.
    248       h_ql_tot = 0.
    249       h_qs_tot = 0.
    250       airetot=0.
    251 C
    252       do i=1,imjmp1
    253         qw_tot = qw_tot + zqw_col(i)
    254         ql_tot = ql_tot + zql_col(i)
    255         qs_tot = qs_tot + zqs_col(i)
    256         ec_tot = ec_tot + zec_col(i)
    257         h_dair_tot = h_dair_tot + zh_dair_col(i)
    258         h_qw_tot = h_qw_tot + zh_qw_col(i)
    259         h_ql_tot = h_ql_tot + zh_ql_col(i)
    260         h_qs_tot = h_qs_tot + zh_qs_col(i)
    261         airetot=airetot+zaire(i)
    262       END DO
    263 C
    264       qw_tot = qw_tot/airetot
    265       ql_tot = ql_tot/airetot
    266       qs_tot = qs_tot/airetot
    267       ec_tot = ec_tot/airetot
    268       h_dair_tot = h_dair_tot/airetot
    269       h_qw_tot = h_qw_tot/airetot
    270       h_ql_tot = h_ql_tot/airetot
    271       h_qs_tot = h_qs_tot/airetot
    272 C
    273       h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot+h_qs_tot
    274 C
    275 C     Compute the change of the atmospheric state compare to the one
    276 C     stored in "idiag2", and convert it in flux. THis computation
    277 C     is performed IF idiag2 /= 0 and IF it is not the first CALL
    278 c     for "idiag"
    279 C     ===================================
    280 C
    281       IF ( (idiag2.gt.0) .and. (pas(idiag2) .ne. 0) ) THEN
    282         d_h_vcol  = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
    283         d_h_dair = (h_dair_tot- h_dair_pre(idiag2))/dtime
    284         d_h_qw   = (h_qw_tot  - h_qw_pre(idiag2)  )/dtime
    285         d_h_ql   = (h_ql_tot  - h_ql_pre(idiag2)  )/dtime
    286         d_h_qs   = (h_qs_tot  - h_qs_pre(idiag2)  )/dtime
    287         d_qw     = (qw_tot    - qw_pre(idiag2)    )/dtime
    288         d_ql     = (ql_tot    - ql_pre(idiag2)    )/dtime
    289         d_qs     = (qs_tot    - qs_pre(idiag2)    )/dtime
    290         d_ec     = (ec_tot    - ec_pre(idiag2)    )/dtime
    291         d_qt = d_qw + d_ql + d_qs
    292       ELSE
    293         d_h_vcol = 0.
    294         d_h_dair = 0.
    295         d_h_qw   = 0.
    296         d_h_ql   = 0.
    297         d_h_qs   = 0.
    298         d_qw     = 0.
    299         d_ql     = 0.
    300         d_qs     = 0.
    301         d_ec     = 0.
    302         d_qt     = 0.
    303       ENDIF
    304 C
    305       IF (iprt.ge.2) THEN
    306         WRITE(6,9000) tit,pas(idiag),d_qt,d_qw,d_ql,d_qs
    307  9000   format('Dyn3d. Watter Mass Budget (kg/m2/s)',A15
    308      $      ,1i6,10(1pE14.6))
    309         WRITE(6,9001) tit,pas(idiag), d_h_vcol
     193    ENDDO
     194  ENDDO
     195  !
     196  ! Reset variables
     197  DO i = 1, imjmp1
     198    zqw_col(i)=0.
     199    zql_col(i)=0.
     200    zqs_col(i)=0.
     201    zec_col(i) = 0.
     202    zh_dair_col(i) = 0.
     203    zh_qw_col(i) = 0.
     204    zh_ql_col(i) = 0.
     205    zh_qs_col(i) = 0.
     206  ENDDO
     207  !
     208  zcpvap=RCPV
     209  zcwat=RCW
     210  zcice=RCS
     211  !
     212  ! Compute vertical sum for each atmospheric column
     213  ! ================================================
     214  DO k = 1, llm
     215    DO i = 1, imjmp1
     216      ! Watter mass
     217      zqw_col(i) = zqw_col(i) + zqw(i,k)*zairm(i,k)
     218      zql_col(i) = zql_col(i) + zql(i,k)*zairm(i,k)
     219      zqs_col(i) = zqs_col(i) + zqs(i,k)*zairm(i,k)
     220      ! Cinetic Energy
     221      zec_col(i) =  zec_col(i) &
     222            +zecin(i,k)*zairm(i,k)
     223      ! Air enthalpy
     224      zt(i,k)= zh(i,k) * zpk(i,k) / RCPD
     225      zh_dair_col(i) = zh_dair_col(i) &
     226            + RCPD*(1.-zqw(i,k)-zql(i,k)-zqs(i,k))*zairm(i,k)*zt(i,k)
     227      zh_qw_col(i) = zh_qw_col(i) &
     228            + zcpvap*zqw(i,k)*zairm(i,k)*zt(i,k)
     229      zh_ql_col(i) = zh_ql_col(i) &
     230            + zcwat*zql(i,k)*zairm(i,k)*zt(i,k) &
     231            - RLVTT*zql(i,k)*zairm(i,k)
     232      zh_qs_col(i) = zh_qs_col(i) &
     233            + zcice*zqs(i,k)*zairm(i,k)*zt(i,k) &
     234            - RLSTT*zqs(i,k)*zairm(i,k)
     235
     236    END DO
     237  ENDDO
     238  !
     239  ! Mean over the planete surface
     240  ! =============================
     241  qw_tot = 0.
     242  ql_tot = 0.
     243  qs_tot = 0.
     244  ec_tot = 0.
     245  h_vcol_tot = 0.
     246  h_dair_tot = 0.
     247  h_qw_tot = 0.
     248  h_ql_tot = 0.
     249  h_qs_tot = 0.
     250  airetot=0.
     251  !
     252  do i=1,imjmp1
     253    qw_tot = qw_tot + zqw_col(i)
     254    ql_tot = ql_tot + zql_col(i)
     255    qs_tot = qs_tot + zqs_col(i)
     256    ec_tot = ec_tot + zec_col(i)
     257    h_dair_tot = h_dair_tot + zh_dair_col(i)
     258    h_qw_tot = h_qw_tot + zh_qw_col(i)
     259    h_ql_tot = h_ql_tot + zh_ql_col(i)
     260    h_qs_tot = h_qs_tot + zh_qs_col(i)
     261    airetot=airetot+zaire(i)
     262  END DO
     263  !
     264  qw_tot = qw_tot/airetot
     265  ql_tot = ql_tot/airetot
     266  qs_tot = qs_tot/airetot
     267  ec_tot = ec_tot/airetot
     268  h_dair_tot = h_dair_tot/airetot
     269  h_qw_tot = h_qw_tot/airetot
     270  h_ql_tot = h_ql_tot/airetot
     271  h_qs_tot = h_qs_tot/airetot
     272  !
     273  h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot+h_qs_tot
     274  !
     275  ! Compute the change of the atmospheric state compare to the one
     276  ! stored in "idiag2", and convert it in flux. THis computation
     277  ! is performed IF idiag2 /= 0 and IF it is not the first CALL
     278  ! for "idiag"
     279  ! ===================================
     280  !
     281  IF ( (idiag2.gt.0) .and. (pas(idiag2) .ne. 0) ) THEN
     282    d_h_vcol  = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
     283    d_h_dair = (h_dair_tot- h_dair_pre(idiag2))/dtime
     284    d_h_qw   = (h_qw_tot  - h_qw_pre(idiag2)  )/dtime
     285    d_h_ql   = (h_ql_tot  - h_ql_pre(idiag2)  )/dtime
     286    d_h_qs   = (h_qs_tot  - h_qs_pre(idiag2)  )/dtime
     287    d_qw     = (qw_tot    - qw_pre(idiag2)    )/dtime
     288    d_ql     = (ql_tot    - ql_pre(idiag2)    )/dtime
     289    d_qs     = (qs_tot    - qs_pre(idiag2)    )/dtime
     290    d_ec     = (ec_tot    - ec_pre(idiag2)    )/dtime
     291    d_qt = d_qw + d_ql + d_qs
     292  ELSE
     293    d_h_vcol = 0.
     294    d_h_dair = 0.
     295    d_h_qw   = 0.
     296    d_h_ql   = 0.
     297    d_h_qs   = 0.
     298    d_qw     = 0.
     299    d_ql     = 0.
     300    d_qs     = 0.
     301    d_ec     = 0.
     302    d_qt     = 0.
     303  ENDIF
     304  !
     305  IF (iprt.ge.2) THEN
     306    WRITE(6,9000) tit,pas(idiag),d_qt,d_qw,d_ql,d_qs
     307 9000   format('Dyn3d. Watter Mass Budget (kg/m2/s)',A15 &
     308              ,1i6,10(1pE14.6))
     309    WRITE(6,9001) tit,pas(idiag), d_h_vcol
    310310 9001   format('Dyn3d. Enthalpy Budget (W/m2) ',A15,1i6,10(F8.2))
    311         WRITE(6,9002) tit,pas(idiag), d_ec
     311    WRITE(6,9002) tit,pas(idiag), d_ec
    312312 9002   format('Dyn3d. Cinetic Energy Budget (W/m2) ',A15,1i6,10(F8.2))
    313 C        WRITE(6,9003) tit,pas(idiag), ec_tot
     313     ! WRITE(6,9003) tit,pas(idiag), ec_tot
    314314 9003   format('Dyn3d. Cinetic Energy (W/m2) ',A15,1i6,10(E15.6))
    315         WRITE(6,9004) tit,pas(idiag), d_h_vcol+d_ec
     315    WRITE(6,9004) tit,pas(idiag), d_h_vcol+d_ec
    316316 9004   format('Dyn3d. Total Energy Budget (W/m2) ',A15,1i6,10(F8.2))
    317       END IF
    318 C
    319 C    Store the new atmospheric state in "idiag"
    320 C
    321       pas(idiag)=pas(idiag)+1
    322       h_vcol_pre(idiag)  = h_vcol_tot
    323       h_dair_pre(idiag) = h_dair_tot
    324       h_qw_pre(idiag)   = h_qw_tot
    325       h_ql_pre(idiag)   = h_ql_tot
    326       h_qs_pre(idiag)   = h_qs_tot
    327       qw_pre(idiag)     = qw_tot
    328       ql_pre(idiag)     = ql_tot
    329       qs_pre(idiag)     = qs_tot
    330       ec_pre (idiag)    = ec_tot
    331 C
    332 !#else
    333       ELSE
    334         write(lunout,*)'diagedyn: set to function with Earth parameters'
    335       ENDIF ! of if (planet_type=="earth")
    336 !#endif
    337 ! #endif of #ifdef CPP_EARTH
    338       RETURN
    339       END
     317  END IF
     318  !
     319  ! Store the new atmospheric state in "idiag"
     320  !
     321  pas(idiag)=pas(idiag)+1
     322  h_vcol_pre(idiag)  = h_vcol_tot
     323  h_dair_pre(idiag) = h_dair_tot
     324  h_qw_pre(idiag)   = h_qw_tot
     325  h_ql_pre(idiag)   = h_ql_tot
     326  h_qs_pre(idiag)   = h_qs_tot
     327  qw_pre(idiag)     = qw_tot
     328  ql_pre(idiag)     = ql_tot
     329  qs_pre(idiag)     = qs_tot
     330  ec_pre (idiag)    = ec_tot
     331  !
     332  !#else
     333  ELSE
     334    write(lunout,*)'diagedyn: set to function with Earth parameters'
     335  ENDIF ! of if (planet_type=="earth")
     336  !#endif
     337  ! #endif of #ifdef CPP_EARTH
     338  RETURN
     339END SUBROUTINE diagedyn
Note: See TracChangeset for help on using the changeset viewer.