Ignore:
Timestamp:
Oct 21, 2024, 2:58:45 PM (11 months 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)

Location:
LMDZ6/trunk/libf/phylmd/Dust
Files:
31 moved

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/Dust/aeropt_spl.f90

    r5245 r5246  
    1       SUBROUTINE aeropt_spl(zdz, tr_seri, RHcl,
    2      .              id_prec, id_fine, id_coss, id_codu, id_scdu,
    3      .              ok_chimeredust,
    4      .                      ztaue550,ztaue670,ztaue865,
    5      .                      taue550_tr2,taue670_tr2,taue865_tr2,
    6      .                      taue550_ss,taue670_ss,taue865_ss,
    7      .                      taue550_dust,taue670_dust,taue865_dust,
    8      .             taue550_dustsco,taue670_dustsco,taue865_dustsco)
    9 c
    10       USE dimphy
    11       USE infotrac
    12       IMPLICIT none
    13 c
    14       INCLUDE "chem.h"
    15       INCLUDE "dimensions.h"
    16 cINCLUDE "dimphy.h"
    17       INCLUDE "YOMCST.h"
    18 c
    19 c Arguments:
    20 c
    21 c======================== INPUT ==================================     
    22       REAL zdz(klon,klev)
    23       REAL tr_seri(klon,klev,nbtr) ! masse of tracer
    24       REAL RHcl(klon,klev)     ! humidite relativen ciel clair
    25       INTEGER id_prec, id_fine, id_coss, id_codu, id_scdu
    26       LOGICAL ok_chimeredust
    27 c============================== OUTPUT =================================
    28       REAL ztaue550(klon) ! epaisseur optique aerosol 550 nm
    29       REAL ztaue670(klon) ! epaisseur optique aerosol 670 nm
    30       REAL ztaue865(klon) ! epaisseur optique aerosol 865 nm
    31       REAL taue550_tr2(klon) ! epaisseur optique aerosol 550 nm, diagnostic
    32       REAL taue670_tr2(klon) ! epaisseur optique aerosol 670 nm, diagnostic
    33       REAL taue865_tr2(klon) ! epaisseur optique aerosol 865 nm, diagnostic
    34       REAL taue550_ss(klon) ! epaisseur optique aerosol 550 nm, diagnostic
    35       REAL taue670_ss(klon) ! epaisseur optique aerosol 670 nm, diagnostic
    36       REAL taue865_ss(klon) ! epaisseur optique aerosol 865 nm, diagnostic
    37       REAL taue550_dust(klon) ! epaisseur optique aerosol 550 nm, diagnostic
    38       REAL taue670_dust(klon) ! epaisseur optique aerosol 670 nm, diagnostic
    39       REAL taue865_dust(klon) ! epaisseur optique aerosol 865 nm, diagnostic
    40       REAL taue550_dustsco(klon) ! epaisseur optique aerosol 550 nm, diagnostic
    41       REAL taue670_dustsco(klon) ! epaisseur optique aerosol 670 nm, diagnostic
    42       REAL taue865_dustsco(klon) ! epaisseur optique aerosol 865 nm, diagnostic
    43 c===================== LOCAL VARIABLES ===========================     
    44       INTEGER nb_lambda,nbre_RH
    45       PARAMETER (nb_lambda=3,nbre_RH=12)
    46       INTEGER i, k, RH_num
    47       REAL rh, RH_MAX, DELTA, RH_tab(nbre_RH)
    48       PARAMETER (RH_MAX=95.)
    49       INTEGER rh_int
    50       PARAMETER (rh_int=12)
    51       REAL auxreal
    52 c      REAL ss_a(nb_lambda,int,nbtr-1)
    53 c      DATA ss_a/72*1./
    54       REAL ss_dust(nb_lambda), ss_acc550(rh_int), alpha_acc
    55       REAL ss_dustsco(nb_lambda)
    56       REAL ss_acc670(rh_int), ss_acc865(rh_int)
    57       REAL ss_ssalt550(rh_int)
    58       REAL ss_ssalt670(rh_int), ss_ssalt865(rh_int)
    59       REAL burden_ss(klon)
    60       DATA ss_acc550 /3.135,3.135,3.135, 3.135, 4.260, 4.807,
    61      .                5.546,6.651,8.641,10.335,13.534,22.979/
    62       DATA ss_acc670 /2.220,2.220,2.220, 2.220, 3.048, 3.460,
    63      .                4.023,4.873,6.426, 7.761,10.322,18.079/
    64       DATA ss_acc865 /1.329,1.329,1.329, 1.329, 1.855, 2.124,
    65      .                2.494,3.060,4.114, 5.033, 6.831,12.457/ 
    66 !old4tracers      DATA ss_dust/0.564, 0.614, 0.700/ !for bin 0.5-10um
    67 !      DATA ss_dust/0.553117, 0.610185, 0.7053460 / !for bin 0.5-3um radius
    68 !      DATA ss_dustsco/0.1014, 0.102156, 0.1035538 / !for bin 3-15um radius
    69 !20140902      DATA ss_dust/0.5345737, 0.5878828, 0.6772957/ !for bin 0.5-3um radius
    70 !20140902      DATA ss_dustsco/0.1009634, 0.1018700, 0.1031178/ !for bin 3-15um radius
    71 !3days      DATA ss_dust/0.4564216, 0.4906738, 0.5476248/ !for bin 0.5-3um radius
    72 !3days      DATA ss_dustsco/0.1015022, 0.1024051, 0.1036622/ !for bin 3-15um radius
    73 !JE20140911      DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius
    74 !JE20140911      DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius
    75 !JE20140915      DATA ss_dust/0.3188754,0.3430106,0.3829019/ !for bin 0.5-5um radius
    76 !JE20140915      DATA ss_dustsco/8.0582686E-02,8.1255026E-02,8.1861295E-02/ !for bin 5-15um radius
    77 
    78 !      DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius
    79 !      DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius
    80 
    81 
    82       DATA ss_ssalt550/0.182,0.182,0.182,0.182,0.366,0.430,
    83      .                 0.484,0.551,0.648,0.724,0.847,1.218/ !for bin 0.5-20 um, fit_v2
    84       DATA ss_ssalt670/0.193,0.193,0.193,0.193,0.377,0.431,
    85      .                 0.496,0.587,0.693,0.784,0.925,1.257/ !for bin 0.5-20 um
    86       DATA ss_ssalt865/0.188,0.188,0.188,0.188,0.384,0.443,
    87      .                 0.502,0.580,0.699,0.799,0.979,1.404/ !for bin 0.5-20 um
    88 
    89       DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./
    90 c
    91       IF (ok_chimeredust) THEN
    92 !JE20150212<< : changes in ustar in dustmod changes emission distribution
    93 !      ss_dust=(/0.5167768,0.5684330,0.6531643/)
    94 !      ss_dustsco=(/0.1003391,0.1012288,0.1024651/)
    95 ! JE20150618: Change in dustmodule, div3 is now =6: change distributions
    96 ! div3=3      ss_dust   =(/0.4670522 , 0.5077308 , 0.5745184/)
    97 ! div3=3      ss_dustsco=(/0.099858  , 0.1007395 , 0.1019673/)
    98       ss_dust   =(/0.4851232 , 0.5292494 , 0.5935509/)
    99       ss_dustsco=(/0.1001981 , 0.1011043 , 0.1023113/)
    100 
    101 !JE20150212>>
    102 
    103       ELSE
    104       ss_dust=(/0.564, 0.614, 0.700/)
    105       ss_dustsco=(/0.,0.,0./)
    106       ENDIF
    107 
    108       DO i=1, klon
    109         ztaue550(i)=0.0
    110         ztaue670(i)=0.0
    111         ztaue865(i)=0.0
    112         taue550_tr2(i)=0.0
    113         taue670_tr2(i)=0.0
    114         taue865_tr2(i)=0.0
    115         taue550_ss(i)=0.0
    116         taue670_ss(i)=0.0
    117         taue865_ss(i)=0.0
    118         taue550_dust(i)=0.0
    119         taue670_dust(i)=0.0
    120         taue865_dust(i)=0.0
    121         taue550_dustsco(i)=0.0
    122         taue670_dustsco(i)=0.0
    123         taue865_dustsco(i)=0.0
    124         burden_ss(i)=0.0
    125       ENDDO
    126 
    127       DO k=1, klev
    128       DO i=1, klon
    129 c     
    130       rh=MIN(RHcl(i,k)*100.,RH_MAX)
    131       RH_num = INT( rh/10. + 1.)
    132       IF (rh.gt.85.) RH_num=10
    133       IF (rh.gt.90.) RH_num=11
    134 c      IF (rh.gt.40.) THEN
    135 c          RH_num=5   ! Added by NHL temporarily
    136 c          print *,'TEMPORARY CASE'
    137 c      ENDIF
    138       DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num))
    139 
    140 
    141 c*******************************************************************
    142 c                      AOD at 550 NM
    143 c*******************************************************************
    144         alpha_acc=ss_acc550(RH_num) + DELTA*(ss_acc550(RH_num+1)-
    145      .            ss_acc550(RH_num))              !--m2/g
    146 cnhl_test TOTAL AOD
    147        auxreal=0.
    148       IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
    149       IF(id_coss>0) auxreal=auxreal+ss_ssalt550(RH_num)*
    150      .                       tr_seri(i,k,id_coss)
    151       IF(id_codu>0) auxreal=auxreal+ss_dust(1)*tr_seri(i,k,id_codu)
    152       IF(id_scdu>0) auxreal=auxreal+ss_dustsco(1)*tr_seri(i,k,id_scdu)
    153       ztaue550(i)=ztaue550(i)+auxreal*zdz(i,k)*1.e6
    154    
    155 !JE20150128        ztaue550(i)=ztaue550(i)+(alpha_acc*tr_seri(i,k,id_fine)+
    156 !    .                 ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)+
    157 !    .                 ss_dust(1)*tr_seri(i,k,id_codu)+
    158 !    .              ss_dustsco(1)*tr_seri(i,k,id_scdu)  )*zdz(i,k)*1.e6
    159 
    160 cnhl_test TOTAL AOD IS NOW AOD COARSE MODE ONLY
    161 cnhl_test        ztaue550(i)=ztaue550(i)+(                     
    162 cnhl_test     .                 ss_ssalt550(RH_num)*tr_seri(i,k,3)+
    163 cnhl_test     .                 ss_dust(1)*tr_seri(i,k,4))*zdz(i,k)*1.e6
    164 
    165         IF(id_fine>0) taue550_tr2(i)=taue550_tr2(i)
    166      .               + alpha_acc*tr_seri(i,k,id_fine)*zdz(i,k)*1.e6
    167         IF(id_coss>0) taue550_ss(i)=taue550_ss(i)+
    168      .                ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)*
    169      .                zdz(i,k)*1.e6
    170         IF(id_codu>0) taue550_dust(i)=taue550_dust(i)+
    171      .                ss_dust(1)*tr_seri(i,k,id_codu)*
    172      .                zdz(i,k)*1.e6
    173         IF(id_scdu>0) taue550_dustsco(i)=taue550_dustsco(i)+
    174      .                ss_dustsco(1)*tr_seri(i,k,id_scdu)*
    175      .                zdz(i,k)*1.e6
    176 !        print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),
    177 !    .                                          MAXVAL(taue550_ss)
    178 
    179 c*******************************************************************
    180 c                       AOD at 670 NM
    181 c*******************************************************************
    182         alpha_acc=ss_acc670(RH_num) + DELTA*(ss_acc670(RH_num+1)-
    183      .            ss_acc670(RH_num))              !--m2/g
    184       auxreal=0.
    185       IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
    186       IF(id_coss>0) auxreal=auxreal+ss_ssalt670(RH_num)
    187      .                      *tr_seri(i,k,id_coss)
    188       IF(id_codu>0) auxreal=auxreal+ss_dust(2)*tr_seri(i,k,id_codu)
    189       IF(id_scdu>0) auxreal=auxreal+ss_dustsco(2)*tr_seri(i,k,id_scdu)
    190       ztaue670(i)=ztaue670(i)+auxreal*zdz(i,k)*1.e6
    191 
    192 !JE20150128        ztaue670(i)=ztaue670(i)+(alpha_acc*tr_seri(i,k,id_fine)+
    193 !    .                 ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)+
    194 !    .                 ss_dust(2)*tr_seri(i,k,id_codu)+
    195 !    .               ss_dustsco(2)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6
    196 
    197       IF(id_fine>0)  taue670_tr2(i)=taue670_tr2(i)+
    198      .                alpha_acc*tr_seri(i,k,id_fine)*
    199      .                 zdz(i,k)*1.e6
    200       IF(id_coss>0)  taue670_ss(i)=taue670_ss(i)+
    201      .                ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)*
    202      .                zdz(i,k)*1.e6
    203       IF(id_codu>0)  taue670_dust(i)=taue670_dust(i)
    204      .                +ss_dust(2)*tr_seri(i,k,id_codu)*
    205      .                zdz(i,k)*1.e6
    206       IF(id_scdu>0)  taue670_dustsco(i)=taue670_dustsco(i)+
    207      .                ss_dustsco(2)*tr_seri(i,k,id_scdu)*
    208      .                zdz(i,k)*1.e6
    209 
    210 c*******************************************************************
    211 c                      AOD at 865 NM
    212 c*******************************************************************
    213         alpha_acc=ss_acc865(RH_num) + DELTA*(ss_acc865(RH_num+1)-
    214      .            ss_acc865(RH_num))              !--m2/g
    215         auxreal=0.
    216       IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
    217       IF(id_coss>0) auxreal=auxreal
    218      .                     +ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)
    219       IF(id_codu>0) auxreal=auxreal+ss_dust(3)*tr_seri(i,k,id_codu)
    220       IF(id_scdu>0) auxreal=auxreal+ss_dustsco(3)*tr_seri(i,k,id_scdu)
    221         ztaue865(i)=ztaue865(i)+auxreal*zdz(i,k)*1.e6
    222 !JE20150128        ztaue865(i)=ztaue865(i)+(alpha_acc*tr_seri(i,k,id_fine)+
    223 !    .                 ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)+
    224 !    .                 ss_dust(3)*tr_seri(i,k,id_codu)+
    225 !    .               ss_dustsco(3)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6
    226       IF(id_fine>0) taue865_tr2(i)=taue865_tr2(i)
    227      .                +alpha_acc*tr_seri(i,k,id_fine)*
    228      .                 zdz(i,k)*1.e6
    229       IF(id_coss>0) taue865_ss(i)=taue865_ss(i)+
    230      .                ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)*
    231      .                zdz(i,k)*1.e6
    232       IF(id_codu>0)  taue865_dust(i)=taue865_dust(i)
    233      .                +ss_dust(3)*tr_seri(i,k,id_codu)*
    234      .                zdz(i,k)*1.e6
    235       IF(id_scdu>0)  taue865_dustsco(i)=taue865_dustsco(i)+
    236      .                ss_dustsco(3)*tr_seri(i,k,id_scdu)*
    237      .                zdz(i,k)*1.e6
    238 
    239 
    240 c
    241       IF(id_coss>0)  burden_ss(i)=burden_ss(i)
    242      .                +tr_seri(i,k,id_coss)*1.e6*1.e3*zdz(i,k)
    243       ENDDO            !-loop on klev
    244       ENDDO            !-loop on klon
    245 !      print *,'tr_seri = ',SUM(tr_seri(:,:,3)),MINVAL(tr_seri(:,:,3)),
    246 !    .                                          MAXVAL(tr_seri(:,:,3))
    247 !      print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),
    248 !    .                                        MAXVAL(taue550_ss)
    249 c
    250       RETURN
    251       END
     1SUBROUTINE aeropt_spl(zdz, tr_seri, RHcl, &
     2        id_prec, id_fine, id_coss, id_codu, id_scdu, &
     3        ok_chimeredust, &
     4        ztaue550,ztaue670,ztaue865, &
     5        taue550_tr2,taue670_tr2,taue865_tr2, &
     6        taue550_ss,taue670_ss,taue865_ss, &
     7        taue550_dust,taue670_dust,taue865_dust, &
     8        taue550_dustsco,taue670_dustsco,taue865_dustsco)
     9  !
     10  USE dimphy
     11  USE infotrac
     12  IMPLICIT none
     13  !
     14  INCLUDE "chem.h"
     15  INCLUDE "dimensions.h"
     16  !INCLUDE "dimphy.h"
     17  INCLUDE "YOMCST.h"
     18  !
     19  ! Arguments:
     20  !
     21  !======================== INPUT ==================================
     22  REAL :: zdz(klon,klev)
     23  REAL :: tr_seri(klon,klev,nbtr) ! masse of tracer
     24  REAL :: RHcl(klon,klev)     ! humidite relativen ciel clair
     25  INTEGER :: id_prec, id_fine, id_coss, id_codu, id_scdu
     26  LOGICAL :: ok_chimeredust
     27  !============================== OUTPUT =================================
     28  REAL :: ztaue550(klon) ! epaisseur optique aerosol 550 nm
     29  REAL :: ztaue670(klon) ! epaisseur optique aerosol 670 nm
     30  REAL :: ztaue865(klon) ! epaisseur optique aerosol 865 nm
     31  REAL :: taue550_tr2(klon) ! epaisseur optique aerosol 550 nm, diagnostic
     32  REAL :: taue670_tr2(klon) ! epaisseur optique aerosol 670 nm, diagnostic
     33  REAL :: taue865_tr2(klon) ! epaisseur optique aerosol 865 nm, diagnostic
     34  REAL :: taue550_ss(klon) ! epaisseur optique aerosol 550 nm, diagnostic
     35  REAL :: taue670_ss(klon) ! epaisseur optique aerosol 670 nm, diagnostic
     36  REAL :: taue865_ss(klon) ! epaisseur optique aerosol 865 nm, diagnostic
     37  REAL :: taue550_dust(klon) ! epaisseur optique aerosol 550 nm, diagnostic
     38  REAL :: taue670_dust(klon) ! epaisseur optique aerosol 670 nm, diagnostic
     39  REAL :: taue865_dust(klon) ! epaisseur optique aerosol 865 nm, diagnostic
     40  REAL :: taue550_dustsco(klon) ! epaisseur optique aerosol 550 nm, diagnostic
     41  REAL :: taue670_dustsco(klon) ! epaisseur optique aerosol 670 nm, diagnostic
     42  REAL :: taue865_dustsco(klon) ! epaisseur optique aerosol 865 nm, diagnostic
     43  !===================== LOCAL VARIABLES ===========================
     44  INTEGER :: nb_lambda,nbre_RH
     45  PARAMETER (nb_lambda=3,nbre_RH=12)
     46  INTEGER :: i, k, RH_num
     47  REAL :: rh, RH_MAX, DELTA, RH_tab(nbre_RH)
     48  PARAMETER (RH_MAX=95.)
     49  INTEGER :: rh_int
     50  PARAMETER (rh_int=12)
     51  REAL :: auxreal
     52   ! REAL ss_a(nb_lambda,int,nbtr-1)
     53   ! DATA ss_a/72*1./
     54  REAL :: ss_dust(nb_lambda), ss_acc550(rh_int), alpha_acc
     55  REAL :: ss_dustsco(nb_lambda)
     56  REAL :: ss_acc670(rh_int), ss_acc865(rh_int)
     57  REAL :: ss_ssalt550(rh_int)
     58  REAL :: ss_ssalt670(rh_int), ss_ssalt865(rh_int)
     59  REAL :: burden_ss(klon)
     60  DATA ss_acc550 /3.135,3.135,3.135, 3.135, 4.260, 4.807, &
     61        5.546,6.651,8.641,10.335,13.534,22.979/
     62  DATA ss_acc670 /2.220,2.220,2.220, 2.220, 3.048, 3.460, &
     63        4.023,4.873,6.426, 7.761,10.322,18.079/
     64  DATA ss_acc865 /1.329,1.329,1.329, 1.329, 1.855, 2.124, &
     65        2.494,3.060,4.114, 5.033, 6.831,12.457/
     66  !old4tracers      DATA ss_dust/0.564, 0.614, 0.700/ !for bin 0.5-10um
     67   ! DATA ss_dust/0.553117, 0.610185, 0.7053460 / !for bin 0.5-3um radius
     68   ! DATA ss_dustsco/0.1014, 0.102156, 0.1035538 / !for bin 3-15um radius
     69  !20140902      DATA ss_dust/0.5345737, 0.5878828, 0.6772957/ !for bin 0.5-3um radius
     70  !20140902      DATA ss_dustsco/0.1009634, 0.1018700, 0.1031178/ !for bin 3-15um radius
     71  !3days      DATA ss_dust/0.4564216, 0.4906738, 0.5476248/ !for bin 0.5-3um radius
     72  !3days      DATA ss_dustsco/0.1015022, 0.1024051, 0.1036622/ !for bin 3-15um radius
     73  !JE20140911      DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius
     74  !JE20140911      DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius
     75  !JE20140915      DATA ss_dust/0.3188754,0.3430106,0.3829019/ !for bin 0.5-5um radius
     76  !JE20140915      DATA ss_dustsco/8.0582686E-02,8.1255026E-02,8.1861295E-02/ !for bin 5-15um radius
     77
     78   ! DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius
     79   ! DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius
     80
     81
     82  DATA ss_ssalt550/0.182,0.182,0.182,0.182,0.366,0.430, &
     83        0.484,0.551,0.648,0.724,0.847,1.218/ !for bin 0.5-20 um, fit_v2
     84  DATA ss_ssalt670/0.193,0.193,0.193,0.193,0.377,0.431, &
     85        0.496,0.587,0.693,0.784,0.925,1.257/ !for bin 0.5-20 um
     86  DATA ss_ssalt865/0.188,0.188,0.188,0.188,0.384,0.443, &
     87        0.502,0.580,0.699,0.799,0.979,1.404/ !for bin 0.5-20 um
     88
     89  DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./
     90  !
     91  IF (ok_chimeredust) THEN
     92  !JE20150212<< : changes in ustar in dustmod changes emission distribution
     93   ! ss_dust=(/0.5167768,0.5684330,0.6531643/)
     94   ! ss_dustsco=(/0.1003391,0.1012288,0.1024651/)
     95  ! JE20150618: Change in dustmodule, div3 is now =6: change distributions
     96  ! div3=3      ss_dust   =(/0.4670522 , 0.5077308 , 0.5745184/)
     97  ! div3=3      ss_dustsco=(/0.099858  , 0.1007395 , 0.1019673/)
     98  ss_dust   =(/0.4851232 , 0.5292494 , 0.5935509/)
     99  ss_dustsco=(/0.1001981 , 0.1011043 , 0.1023113/)
     100
     101  !JE20150212>>
     102
     103  ELSE
     104  ss_dust=(/0.564, 0.614, 0.700/)
     105  ss_dustsco=(/0.,0.,0./)
     106  ENDIF
     107
     108  DO i=1, klon
     109    ztaue550(i)=0.0
     110    ztaue670(i)=0.0
     111    ztaue865(i)=0.0
     112    taue550_tr2(i)=0.0
     113    taue670_tr2(i)=0.0
     114    taue865_tr2(i)=0.0
     115    taue550_ss(i)=0.0
     116    taue670_ss(i)=0.0
     117    taue865_ss(i)=0.0
     118    taue550_dust(i)=0.0
     119    taue670_dust(i)=0.0
     120    taue865_dust(i)=0.0
     121    taue550_dustsco(i)=0.0
     122    taue670_dustsco(i)=0.0
     123    taue865_dustsco(i)=0.0
     124    burden_ss(i)=0.0
     125  ENDDO
     126
     127  DO k=1, klev
     128  DO i=1, klon
     129  !
     130  rh=MIN(RHcl(i,k)*100.,RH_MAX)
     131  RH_num = INT( rh/10. + 1.)
     132  IF (rh.gt.85.) RH_num=10
     133  IF (rh.gt.90.) RH_num=11
     134   ! IF (rh.gt.40.) THEN
     135   !     RH_num=5   ! Added by NHL temporarily
     136   !     print *,'TEMPORARY CASE'
     137   ! ENDIF
     138  DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num))
     139
     140
     141  !*******************************************************************
     142                    ! AOD at 550 NM
     143  !*******************************************************************
     144    alpha_acc=ss_acc550(RH_num) + DELTA*(ss_acc550(RH_num+1)- &
     145          ss_acc550(RH_num))              !--m2/g
     146  !nhl_test TOTAL AOD
     147   auxreal=0.
     148  IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
     149  IF(id_coss>0) auxreal=auxreal+ss_ssalt550(RH_num)* &
     150        tr_seri(i,k,id_coss)
     151  IF(id_codu>0) auxreal=auxreal+ss_dust(1)*tr_seri(i,k,id_codu)
     152  IF(id_scdu>0) auxreal=auxreal+ss_dustsco(1)*tr_seri(i,k,id_scdu)
     153  ztaue550(i)=ztaue550(i)+auxreal*zdz(i,k)*1.e6
     154
     155  !JE20150128        ztaue550(i)=ztaue550(i)+(alpha_acc*tr_seri(i,k,id_fine)+
     156  ! .                 ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)+
     157  ! .                 ss_dust(1)*tr_seri(i,k,id_codu)+
     158  ! .              ss_dustsco(1)*tr_seri(i,k,id_scdu)  )*zdz(i,k)*1.e6
     159
     160  !nhl_test TOTAL AOD IS NOW AOD COARSE MODE ONLY
     161  !nhl_test        ztaue550(i)=ztaue550(i)+(
     162  !nhl_test     .                 ss_ssalt550(RH_num)*tr_seri(i,k,3)+
     163  !nhl_test     .                 ss_dust(1)*tr_seri(i,k,4))*zdz(i,k)*1.e6
     164
     165    IF(id_fine>0) taue550_tr2(i)=taue550_tr2(i) &
     166          + alpha_acc*tr_seri(i,k,id_fine)*zdz(i,k)*1.e6
     167    IF(id_coss>0) taue550_ss(i)=taue550_ss(i)+ &
     168          ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)* &
     169          zdz(i,k)*1.e6
     170    IF(id_codu>0) taue550_dust(i)=taue550_dust(i)+ &
     171          ss_dust(1)*tr_seri(i,k,id_codu)* &
     172          zdz(i,k)*1.e6
     173    IF(id_scdu>0) taue550_dustsco(i)=taue550_dustsco(i)+ &
     174          ss_dustsco(1)*tr_seri(i,k,id_scdu)* &
     175          zdz(i,k)*1.e6
     176     ! print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),
     177  ! .                                          MAXVAL(taue550_ss)
     178
     179  !*******************************************************************
     180  !                   AOD at 670 NM
     181  !*******************************************************************
     182    alpha_acc=ss_acc670(RH_num) + DELTA*(ss_acc670(RH_num+1)- &
     183          ss_acc670(RH_num))              !--m2/g
     184  auxreal=0.
     185  IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
     186  IF(id_coss>0) auxreal=auxreal+ss_ssalt670(RH_num) &
     187        *tr_seri(i,k,id_coss)
     188  IF(id_codu>0) auxreal=auxreal+ss_dust(2)*tr_seri(i,k,id_codu)
     189  IF(id_scdu>0) auxreal=auxreal+ss_dustsco(2)*tr_seri(i,k,id_scdu)
     190  ztaue670(i)=ztaue670(i)+auxreal*zdz(i,k)*1.e6
     191
     192  !JE20150128        ztaue670(i)=ztaue670(i)+(alpha_acc*tr_seri(i,k,id_fine)+
     193  ! .                 ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)+
     194  ! .                 ss_dust(2)*tr_seri(i,k,id_codu)+
     195  ! .               ss_dustsco(2)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6
     196
     197  IF(id_fine>0)  taue670_tr2(i)=taue670_tr2(i)+ &
     198        alpha_acc*tr_seri(i,k,id_fine)* &
     199        zdz(i,k)*1.e6
     200  IF(id_coss>0)  taue670_ss(i)=taue670_ss(i)+ &
     201        ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)* &
     202        zdz(i,k)*1.e6
     203  IF(id_codu>0)  taue670_dust(i)=taue670_dust(i) &
     204        +ss_dust(2)*tr_seri(i,k,id_codu)* &
     205        zdz(i,k)*1.e6
     206  IF(id_scdu>0)  taue670_dustsco(i)=taue670_dustsco(i)+ &
     207        ss_dustsco(2)*tr_seri(i,k,id_scdu)* &
     208        zdz(i,k)*1.e6
     209
     210  !*******************************************************************
     211                    ! AOD at 865 NM
     212  !*******************************************************************
     213    alpha_acc=ss_acc865(RH_num) + DELTA*(ss_acc865(RH_num+1)- &
     214          ss_acc865(RH_num))              !--m2/g
     215    auxreal=0.
     216  IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine)
     217  IF(id_coss>0) auxreal=auxreal &
     218        +ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)
     219  IF(id_codu>0) auxreal=auxreal+ss_dust(3)*tr_seri(i,k,id_codu)
     220  IF(id_scdu>0) auxreal=auxreal+ss_dustsco(3)*tr_seri(i,k,id_scdu)
     221    ztaue865(i)=ztaue865(i)+auxreal*zdz(i,k)*1.e6
     222  !JE20150128        ztaue865(i)=ztaue865(i)+(alpha_acc*tr_seri(i,k,id_fine)+
     223  ! .                 ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)+
     224  ! .                 ss_dust(3)*tr_seri(i,k,id_codu)+
     225  ! .               ss_dustsco(3)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6
     226  IF(id_fine>0) taue865_tr2(i)=taue865_tr2(i) &
     227        +alpha_acc*tr_seri(i,k,id_fine)* &
     228        zdz(i,k)*1.e6
     229  IF(id_coss>0) taue865_ss(i)=taue865_ss(i)+ &
     230        ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)* &
     231        zdz(i,k)*1.e6
     232  IF(id_codu>0)  taue865_dust(i)=taue865_dust(i) &
     233        +ss_dust(3)*tr_seri(i,k,id_codu)* &
     234        zdz(i,k)*1.e6
     235  IF(id_scdu>0)  taue865_dustsco(i)=taue865_dustsco(i)+ &
     236        ss_dustsco(3)*tr_seri(i,k,id_scdu)* &
     237        zdz(i,k)*1.e6
     238
     239
     240  !
     241  IF(id_coss>0)  burden_ss(i)=burden_ss(i) &
     242        +tr_seri(i,k,id_coss)*1.e6*1.e3*zdz(i,k)
     243  ENDDO            !-loop on klev
     244  ENDDO            !-loop on klon
     245   ! print *,'tr_seri = ',SUM(tr_seri(:,:,3)),MINVAL(tr_seri(:,:,3)),
     246  ! .                                          MAXVAL(tr_seri(:,:,3))
     247  !  print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),
     248  ! .                                        MAXVAL(taue550_ss)
     249  !
     250  RETURN
     251END SUBROUTINE aeropt_spl
  • LMDZ6/trunk/libf/phylmd/Dust/bcscav_spl.f90

    r5245 r5246  
    1       SUBROUTINE bcscav_spl(pdtime,flxr,flxs,alpha_r,alpha_s,x,dx)
     1SUBROUTINE bcscav_spl(pdtime,flxr,flxs,alpha_r,alpha_s,x,dx)
    22
    3       USE dimphy
    4       IMPLICIT NONE
    5 c=====================================================================
    6 c Objet : below-cloud scavenging of tracers
    7 c Date : september 1999
    8 c Auteur: O. Boucher (LOA)
    9 c=====================================================================
    10 c
    11       INCLUDE "dimensions.h"
    12       INCLUDE "chem.h"
    13       INCLUDE "YOMCST.h"
    14       INCLUDE "YOECUMF.h"
    15 c
    16       REAL pdtime, alpha_r, alpha_s, R_r, R_s
    17       PARAMETER (R_r=0.001)          !--mean raindrop radius (m)
    18       PARAMETER (R_s=0.001)          !--mean snow crystal radius (m)
    19       REAL flxr(klon,klev)         ! liquid precipitation rate (kg/m2/s)
    20       REAL flxs(klon,klev)         ! solid  precipitation rate (kg/m2/s)
    21       REAL flxr_aux(klon,klev+1)
    22       REAL flxs_aux(klon,klev+1)
    23       REAL x(klon,klev)              ! q de traceur 
    24       REAL dx(klon,klev)             ! tendance de traceur
    25 c
    26 c--variables locales     
    27       INTEGER i, k
    28       REAL pr, ps, ice, water
    29 c
    30 c------------------------------------------
    31 c
    32 ! NHL
    33 ! Auxiliary variables defined to deal with the fact that precipitation
    34 ! fluxes are defined on klev levels only.
    35 ! NHL
    36 !
    37       flxr_aux(:,klev+1)=0.0
    38       flxs_aux(:,klev+1)=0.0
    39       flxr_aux(:,1:klev)=flxr(:,:)
    40       flxs_aux(:,1:klev)=flxs(:,:)
    41 !
    42       DO k=1, klev
    43       DO i=1, klon
    44        pr=0.5*(flxr_aux(i,k)+flxr_aux(i,k+1))
    45        ps=0.5*(flxs_aux(i,k)+flxs_aux(i,k+1))
    46        water=pr*alpha_r/R_r/rho_water
    47        ice=ps*alpha_s/R_s/rho_ice
    48        dx(i,k)=-3./4.*x(i,k)*pdtime*(water+ice)
    49 ctmp       dx(i,k)=-3./4.*x(i,k)*pdtime*
    50 ctmp     .         (pr*alpha_r/R_r/rho_water+ps*alpha_s/R_s/rho_ice)
    51       ENDDO
    52       ENDDO
    53 c
    54       RETURN
    55       END
     3  USE dimphy
     4  IMPLICIT NONE
     5  !=====================================================================
     6  ! Objet : below-cloud scavenging of tracers
     7  ! Date : september 1999
     8  ! Auteur: O. Boucher (LOA)
     9  !=====================================================================
     10  !
     11  INCLUDE "dimensions.h"
     12  INCLUDE "chem.h"
     13  INCLUDE "YOMCST.h"
     14  INCLUDE "YOECUMF.h"
     15  !
     16  REAL :: pdtime, alpha_r, alpha_s, R_r, R_s
     17  PARAMETER (R_r=0.001)          !--mean raindrop radius (m)
     18  PARAMETER (R_s=0.001)          !--mean snow crystal radius (m)
     19  REAL :: flxr(klon,klev)         ! liquid precipitation rate (kg/m2/s)
     20  REAL :: flxs(klon,klev)         ! solid  precipitation rate (kg/m2/s)
     21  REAL :: flxr_aux(klon,klev+1)
     22  REAL :: flxs_aux(klon,klev+1)
     23  REAL :: x(klon,klev)              ! q de traceur
     24  REAL :: dx(klon,klev)             ! tendance de traceur
     25  !
     26  !--variables locales
     27  INTEGER :: i, k
     28  REAL :: pr, ps, ice, water
     29  !
     30  !------------------------------------------
     31  !
     32  ! NHL
     33  ! Auxiliary variables defined to deal with the fact that precipitation
     34  ! fluxes are defined on klev levels only.
     35  ! NHL
     36  !
     37  flxr_aux(:,klev+1)=0.0
     38  flxs_aux(:,klev+1)=0.0
     39  flxr_aux(:,1:klev)=flxr(:,:)
     40  flxs_aux(:,1:klev)=flxs(:,:)
     41  !
     42  DO k=1, klev
     43  DO i=1, klon
     44   pr=0.5*(flxr_aux(i,k)+flxr_aux(i,k+1))
     45   ps=0.5*(flxs_aux(i,k)+flxs_aux(i,k+1))
     46   water=pr*alpha_r/R_r/rho_water
     47   ice=ps*alpha_s/R_s/rho_ice
     48   dx(i,k)=-3./4.*x(i,k)*pdtime*(water+ice)
     49  !tmp       dx(i,k)=-3./4.*x(i,k)*pdtime*
     50  !tmp     .         (pr*alpha_r/R_r/rho_water+ps*alpha_s/R_s/rho_ice)
     51  ENDDO
     52  ENDDO
     53  !
     54  RETURN
     55END SUBROUTINE bcscav_spl
  • LMDZ6/trunk/libf/phylmd/Dust/bl_for_dms.f90

    r5245 r5246  
    1       SUBROUTINE bl_for_dms(u,v,paprs,pplay,cdragh,cdragm
    2      .                     ,t,q,tsol,ustar,obklen)
    3       USE dimphy
    4       IMPLICIT NONE
    5 c
    6 c===================================================================
    7 c Auteur : E. Cosme
    8 c Calcul de la vitesse de friction (ustar) et de la longueur de
    9 c Monin-Obukhov (obklen), necessaires pour calculer les flux de DMS
    10 c par la methode de Nightingale.
    11 c Cette subroutine est plus que fortement inspiree de la subroutine
    12 c 'nonlocal' dans clmain.F .
    13 c reference :  Holtslag, A.A.M., and B.A. Boville, 1993:
    14 c Local versus nonlocal boundary-layer diffusion in a global climate
    15 c model. J. of Climate, vol. 6, 1825-1842. (a confirmer)
    16 c 31 08 01
    17 c===================================================================
    18 c
    19       INCLUDE "dimensions.h"
    20       INCLUDE "YOMCST.h"
    21       INCLUDE "YOETHF.h"
    22       INCLUDE "FCTTRE.h"
    23 c
    24 c Arguments :
    25       REAL u(klon,klev)          ! vent zonal
    26       REAL v(klon,klev)          ! vent meridien
    27       REAL paprs(klon,klev+1)    ! niveaux de pression aux intercouches (Pa)
    28       REAL pplay(klon,klev)      ! niveaux de pression aux milieux... (Pa)
    29       REAL cdragh(klon)          ! coefficient de trainee pour la chaleur
    30       REAL cdragm(klon)          ! coefficient de trainee pour le vent
    31       REAL t(klon,klev)          ! temperature
    32       REAL q(klon,klev)          ! humidite kg/kg
    33       REAL tsol(klon)            ! temperature du sol
    34       REAL ustar(klon)           ! vitesse de friction
    35       REAL obklen(klon)          ! longueur de Monin-Obukhov
    36 c
    37 c Locales :
    38       REAL vk
    39       PARAMETER (vk=0.35)
    40       REAL beta  ! coefficient d'evaporation reelle (/evapotranspiration)
    41                  ! entre 0 et 1, mais 1 au-dessus de la mer
    42       PARAMETER (beta=1.)
    43       INTEGER i,k
    44       REAL zxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy
    45       REAL zcor, zdelta, zcvm5
    46       REAL z(klon,klev)
    47       REAL zx_alf1, zx_alf2 ! parametres pour extrapolation
    48       REAL khfs(klon)       ! surface kinematic heat flux [mK/s]
    49       REAL kqfs(klon)       ! sfc kinematic constituent flux [m/s]
    50       REAL heatv(klon)      ! surface virtual heat flux
     1SUBROUTINE bl_for_dms(u,v,paprs,pplay,cdragh,cdragm &
     2        ,t,q,tsol,ustar,obklen)
     3  USE dimphy
     4  IMPLICIT NONE
     5  !
     6  !===================================================================
     7  ! Auteur : E. Cosme
     8  ! Calcul de la vitesse de friction (ustar) et de la longueur de
     9  ! Monin-Obukhov (obklen), necessaires pour calculer les flux de DMS
     10  ! par la methode de Nightingale.
     11  ! Cette subroutine est plus que fortement inspiree de la subroutine
     12  ! 'nonlocal' dans clmain.F .
     13  ! reference :  Holtslag, A.A.M., and B.A. Boville, 1993:
     14  ! Local versus nonlocal boundary-layer diffusion in a global climate
     15  ! model. J. of Climate, vol. 6, 1825-1842. (a confirmer)
     16  ! 31 08 01
     17  !===================================================================
     18  !
     19  INCLUDE "dimensions.h"
     20  INCLUDE "YOMCST.h"
     21  INCLUDE "YOETHF.h"
     22  INCLUDE "FCTTRE.h"
     23  !
     24  ! Arguments :
     25  REAL :: u(klon,klev)          ! vent zonal
     26  REAL :: v(klon,klev)          ! vent meridien
     27  REAL :: paprs(klon,klev+1)    ! niveaux de pression aux intercouches (Pa)
     28  REAL :: pplay(klon,klev)      ! niveaux de pression aux milieux... (Pa)
     29  REAL :: cdragh(klon)          ! coefficient de trainee pour la chaleur
     30  REAL :: cdragm(klon)          ! coefficient de trainee pour le vent
     31  REAL :: t(klon,klev)          ! temperature
     32  REAL :: q(klon,klev)          ! humidite kg/kg
     33  REAL :: tsol(klon)            ! temperature du sol
     34  REAL :: ustar(klon)           ! vitesse de friction
     35  REAL :: obklen(klon)          ! longueur de Monin-Obukhov
     36  !
     37  ! Locales :
     38  REAL :: vk
     39  PARAMETER (vk=0.35)
     40  REAL :: beta  ! coefficient d'evaporation reelle (/evapotranspiration)
     41             ! ! entre 0 et 1, mais 1 au-dessus de la mer
     42  PARAMETER (beta=1.)
     43  INTEGER :: i,k
     44  REAL :: zxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy
     45  REAL :: zcor, zdelta, zcvm5
     46  REAL :: z(klon,klev)
     47  REAL :: zx_alf1, zx_alf2 ! parametres pour extrapolation
     48  REAL :: khfs(klon)       ! surface kinematic heat flux [mK/s]
     49  REAL :: kqfs(klon)       ! sfc kinematic constituent flux [m/s]
     50  REAL :: heatv(klon)      ! surface virtual heat flux
    5151
    52      
    53 c
    54 c======================================================================
    55 c
    56 c Calculer les hauteurs de chaque couche
    57 c
    58 ! JE20150707      r2es=611.14 *18.0153/28.9644
    59       DO i = 1, klon
    60          z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1)))
    61      .               * (paprs(i,1)-pplay(i,1)) / RG
    62       ENDDO
    63       DO k = 2, klev
    64       DO i = 1, klon
    65          z(i,k) = z(i,k-1)
    66      .              + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k)
    67      .                   * (pplay(i,k-1)-pplay(i,k)) / RG
    68       ENDDO
    69       ENDDO
    7052
    71       DO i = 1, klon
    72 c
    73         zdelta=MAX(0.,SIGN(1.,RTT-tsol(i)))
    74         zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
    75         zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1))
    76         zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1)
    77         zxqs=MIN(0.5,zxqs)
    78         zcor=1./(1.-retv*zxqs)
    79         zxqs=zxqs*zcor
    80 c
    81         zx_alf1 = 1.0
    82         zx_alf2 = 1.0 - zx_alf1
    83         zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1)))
    84      .        *(1.+RETV*q(i,1))*zx_alf1
    85      .      + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2)))
    86      .        *(1.+RETV*q(i,2))*zx_alf2
    87         zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2
    88         zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2
    89         zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2
    90         zxmod = 1.0+SQRT(zxu**2+zxv**2)
    91         khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i)
    92         kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta
    93         heatv(i) = khfs(i) + 0.61*zxt*kqfs(i)
    94         taux = zxu *zxmod*cdragm(i)
    95         tauy = zxv *zxmod*cdragm(i)
    96         ustar(i) = SQRT(taux**2+tauy**2)
    97         ustar(i) = MAX(SQRT(ustar(i)),0.01)
    98 c
    99       ENDDO
    100 c
    101       DO i = 1, klon
    102          obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i))
    103       ENDDO
    104 c
    105       END SUBROUTINE
     53  !
     54  !======================================================================
     55  !
     56  ! Calculer les hauteurs de chaque couche
     57  !
     58  ! JE20150707      r2es=611.14 *18.0153/28.9644
     59  DO i = 1, klon
     60     z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) &
     61           * (paprs(i,1)-pplay(i,1)) / RG
     62  ENDDO
     63  DO k = 2, klev
     64  DO i = 1, klon
     65     z(i,k) = z(i,k-1) &
     66           + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) &
     67           * (pplay(i,k-1)-pplay(i,k)) / RG
     68  ENDDO
     69  ENDDO
     70
     71  DO i = 1, klon
     72  !
     73    zdelta=MAX(0.,SIGN(1.,RTT-tsol(i)))
     74    zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
     75    zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1))
     76    zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1)
     77    zxqs=MIN(0.5,zxqs)
     78    zcor=1./(1.-retv*zxqs)
     79    zxqs=zxqs*zcor
     80  !
     81    zx_alf1 = 1.0
     82    zx_alf2 = 1.0 - zx_alf1
     83    zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) &
     84          *(1.+RETV*q(i,1))*zx_alf1 &
     85          + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) &
     86          *(1.+RETV*q(i,2))*zx_alf2
     87    zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2
     88    zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2
     89    zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2
     90    zxmod = 1.0+SQRT(zxu**2+zxv**2)
     91    khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i)
     92    kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta
     93    heatv(i) = khfs(i) + 0.61*zxt*kqfs(i)
     94    taux = zxu *zxmod*cdragm(i)
     95    tauy = zxv *zxmod*cdragm(i)
     96    ustar(i) = SQRT(taux**2+tauy**2)
     97    ustar(i) = MAX(SQRT(ustar(i)),0.01)
     98  !
     99  ENDDO
     100  !
     101  DO i = 1, klon
     102     obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i))
     103  ENDDO
     104  !
     105END SUBROUTINE
  • LMDZ6/trunk/libf/phylmd/Dust/blcloud_scav.f90

    r5245 r5246  
    1 c Subroutine that calculates the effect of precipitation in scavenging
    2 c BELOW the cloud, for large scale as well as convective precipitation
    3       SUBROUTINE blcloud_scav(lminmax,qmin,qmax,pdtphys,prfl,psfl,
    4      .                        pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse,
    5      .                                  his_dhbclsc,his_dhbccon,tr_seri)
     1! Subroutine that calculates the effect of precipitation in scavenging
     2! BELOW the cloud, for large scale as well as convective precipitation
     3SUBROUTINE blcloud_scav(lminmax,qmin,qmax,pdtphys,prfl,psfl, &
     4        pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse, &
     5        his_dhbclsc,his_dhbccon,tr_seri)
    66
    7       USE dimphy
    8       USE indice_sol_mod
    9       USE infotrac
    10       IMPLICIT NONE
     7  USE dimphy
     8  USE indice_sol_mod
     9  USE infotrac
     10  IMPLICIT NONE
    1111
    12       INCLUDE "dimensions.h"
    13       INCLUDE "chem.h"
    14       INCLUDE "YOMCST.h"
    15       INCLUDE "paramet.h"
     12  INCLUDE "dimensions.h"
     13  INCLUDE "chem.h"
     14  INCLUDE "YOMCST.h"
     15  INCLUDE "paramet.h"
    1616
    17 c============================= INPUT ===================================
    18       REAL qmin,qmax
    19       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    20 !      REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
    21 !      REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
    22       REAL alpha_r(nbtr)!--coefficient d'impaction pour la pluie
    23       REAL alpha_s(nbtr)!--coefficient d'impaction pour la neige     
    24       REAL masse(nbtr)
    25       LOGICAL lminmax
    26       REAL zdz(klon,klev)
    27       REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
    28       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
    29 c============================= OUTPUT ==================================
    30       REAL tr_seri(klon,klev,nbtr) ! traceur
    31       REAL aux_var1(klon,klev) ! traceur
    32       REAL aux_var2(klon,klev) ! traceur
    33       REAL his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)
    34 c========================= LOCAL VARIABLES =============================     
    35       INTEGER it, k, i, j
    36       REAL d_tr(klon,klev,nbtr)
     17  !============================= INPUT ===================================
     18  REAL :: qmin,qmax
     19  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     20   ! REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
     21   ! REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
     22  REAL :: alpha_r(nbtr)!--coefficient d'impaction pour la pluie
     23  REAL :: alpha_s(nbtr)!--coefficient d'impaction pour la neige
     24  REAL :: masse(nbtr)
     25  LOGICAL :: lminmax
     26  REAL :: zdz(klon,klev)
     27  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
     28  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
     29  !============================= OUTPUT ==================================
     30  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     31  REAL :: aux_var1(klon,klev) ! traceur
     32  REAL :: aux_var2(klon,klev) ! traceur
     33  REAL :: his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)
     34  !========================= LOCAL VARIABLES =============================
     35  INTEGER :: it, k, i, j
     36  REAL :: d_tr(klon,klev,nbtr)
    3737
    38       EXTERNAL minmaxqfi, bcscav_spl
    39      
    40       DO it=1, nbtr
    41 c
    42       DO j=1,klev
    43       DO i=1,klon
    44         aux_var1(i,j)=tr_seri(i,j,it)
    45         aux_var2(i,j)=d_tr(i,j,it)
    46       ENDDO
    47       ENDDO
    48 c
    49 cnhl      CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
    50 cnhl     .                tr_seri(1,1,it),d_tr(1,1,it))
    51       CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
    52      .                aux_var1,aux_var2)
    53 c
    54       DO j=1,klev
    55       DO i=1,klon
    56         tr_seri(i,j,it)=aux_var1(i,j)
    57         d_tr(i,j,it)=aux_var2(i,j)
    58       ENDDO
    59       ENDDO
    60       DO k = 1, klev
    61       DO i = 1, klon
    62          tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
    63          his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO*
    64      .                masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys  !--mgS/m2/s
    65              
    66       ENDDO
    67       ENDDO
    68 c
    69       DO i=1,klon
    70       DO j=1,klev
    71         aux_var1(i,j)=tr_seri(i,j,it)
    72         aux_var2(i,j)=d_tr(i,j,it)
    73       ENDDO
    74       ENDDO
    75 c
    76       IF (lminmax) THEN
    77         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc')
    78 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')
    79       ENDIF
    80 c
    81 c-scheme for convective scavenging
    82 c
    83 cnhl      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
    84 cnhl     .                tr_seri(1,1,it),d_tr(1,1,it))
     38  EXTERNAL minmaxqfi, bcscav_spl
     39
     40  DO it=1, nbtr
     41  !
     42  DO j=1,klev
     43  DO i=1,klon
     44    aux_var1(i,j)=tr_seri(i,j,it)
     45    aux_var2(i,j)=d_tr(i,j,it)
     46  ENDDO
     47  ENDDO
     48  !
     49  !nhl      CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
     50  !nhl     .                tr_seri(1,1,it),d_tr(1,1,it))
     51  CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), &
     52        aux_var1,aux_var2)
     53  !
     54  DO j=1,klev
     55  DO i=1,klon
     56    tr_seri(i,j,it)=aux_var1(i,j)
     57    d_tr(i,j,it)=aux_var2(i,j)
     58  ENDDO
     59  ENDDO
     60  DO k = 1, klev
     61  DO i = 1, klon
     62     tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
     63     his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO* &
     64           masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys  !--mgS/m2/s
     65
     66  ENDDO
     67  ENDDO
     68  !
     69  DO i=1,klon
     70  DO j=1,klev
     71    aux_var1(i,j)=tr_seri(i,j,it)
     72    aux_var2(i,j)=d_tr(i,j,it)
     73  ENDDO
     74  ENDDO
     75  !
     76  IF (lminmax) THEN
     77    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc')
     78  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')
     79  ENDIF
     80  !
     81  !-scheme for convective scavenging
     82  !
     83  !nhl      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
     84  !nhl     .                tr_seri(1,1,it),d_tr(1,1,it))
    8585
    8686
    87       CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
    88      .                aux_var1,aux_var2)
     87  CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it), &
     88        aux_var1,aux_var2)
    8989
    9090
    91 c
    92       DO i=1,klon
    93       DO j=1,klev
    94         tr_seri(i,j,it)=aux_var1(i,j)
    95         d_tr(i,j,it)=aux_var2(i,j)
    96       ENDDO
    97       ENDDO
    98 c
    99       DO k = 1, klev
    100       DO i = 1, klon
    101          tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
    102          his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO*
    103      .                masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys    !--mgS/m2/s
    104       ENDDO
    105       ENDDO
    106 c
    107       IF (lminmax) THEN
    108         DO j=1,klev
    109         DO i=1,klon
    110           aux_var1(i,j)=tr_seri(i,j,it)
    111         ENDDO
    112         ENDDO
    113         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con')
    114 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')
    115         DO j=1,klev
    116         DO i=1,klon
    117           tr_seri(i,j,it)=aux_var1(i,j)
    118         ENDDO
    119         ENDDO
    120       ENDIF
    121 c
    122 c
    123       ENDDO !--boucle sur it
    124 c
    125       END
     91  !
     92  DO i=1,klon
     93  DO j=1,klev
     94    tr_seri(i,j,it)=aux_var1(i,j)
     95    d_tr(i,j,it)=aux_var2(i,j)
     96  ENDDO
     97  ENDDO
     98  !
     99  DO k = 1, klev
     100  DO i = 1, klon
     101     tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
     102     his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO* &
     103           masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys    !--mgS/m2/s
     104  ENDDO
     105  ENDDO
     106  !
     107  IF (lminmax) THEN
     108    DO j=1,klev
     109    DO i=1,klon
     110      aux_var1(i,j)=tr_seri(i,j,it)
     111    ENDDO
     112    ENDDO
     113    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con')
     114  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')
     115    DO j=1,klev
     116    DO i=1,klon
     117      tr_seri(i,j,it)=aux_var1(i,j)
     118    ENDDO
     119    ENDDO
     120  ENDIF
     121  !
     122  !
     123  ENDDO !--boucle sur it
     124  !
     125END SUBROUTINE blcloud_scav
  • LMDZ6/trunk/libf/phylmd/Dust/blcloud_scav_lsc.f90

    r5245 r5246  
    1 c Subroutine that calculates the effect of precipitation in scavenging
    2 c BELOW the cloud, for large scale as well as convective precipitation
    3       SUBROUTINE blcloud_scav_lsc(lminmax,qmin,qmax,pdtphys,prfl,psfl,
    4      .                        pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse,
    5      .                                  his_dhbclsc,his_dhbccon,tr_seri)
     1! Subroutine that calculates the effect of precipitation in scavenging
     2! BELOW the cloud, for large scale as well as convective precipitation
     3SUBROUTINE blcloud_scav_lsc(lminmax,qmin,qmax,pdtphys,prfl,psfl, &
     4        pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse, &
     5        his_dhbclsc,his_dhbccon,tr_seri)
    66
    7       USE dimphy
    8       USE indice_sol_mod
    9       USE infotrac
    10       IMPLICIT NONE
     7  USE dimphy
     8  USE indice_sol_mod
     9  USE infotrac
     10  IMPLICIT NONE
    1111
    12       INCLUDE "dimensions.h"
    13       INCLUDE "chem.h"
    14       INCLUDE "YOMCST.h"
    15       INCLUDE "paramet.h"
     12  INCLUDE "dimensions.h"
     13  INCLUDE "chem.h"
     14  INCLUDE "YOMCST.h"
     15  INCLUDE "paramet.h"
    1616
    17 c============================= INPUT ===================================
    18       REAL qmin,qmax
    19       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    20 !      REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
    21 !      REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
    22       REAL alpha_r(nbtr)!--coefficient d'impaction pour la pluie
    23       REAL alpha_s(nbtr)!--coefficient d'impaction pour la neige     
    24       REAL masse(nbtr)
    25       LOGICAL lminmax
    26       REAL zdz(klon,klev)
    27       REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
    28       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
    29 c============================= OUTPUT ==================================
    30       REAL tr_seri(klon,klev,nbtr) ! traceur
    31       REAL aux_var1(klon,klev) ! traceur
    32       REAL aux_var2(klon,klev) ! traceur
    33       REAL his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)
    34 c========================= LOCAL VARIABLES =============================     
    35       INTEGER it, k, i, j
    36       REAL d_tr(klon,klev,nbtr)
     17  !============================= INPUT ===================================
     18  REAL :: qmin,qmax
     19  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     20   ! REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
     21   ! REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
     22  REAL :: alpha_r(nbtr)!--coefficient d'impaction pour la pluie
     23  REAL :: alpha_s(nbtr)!--coefficient d'impaction pour la neige
     24  REAL :: masse(nbtr)
     25  LOGICAL :: lminmax
     26  REAL :: zdz(klon,klev)
     27  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
     28  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
     29  !============================= OUTPUT ==================================
     30  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     31  REAL :: aux_var1(klon,klev) ! traceur
     32  REAL :: aux_var2(klon,klev) ! traceur
     33  REAL :: his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)
     34  !========================= LOCAL VARIABLES =============================
     35  INTEGER :: it, k, i, j
     36  REAL :: d_tr(klon,klev,nbtr)
    3737
    38       EXTERNAL minmaxqfi, bcscav_spl
    39      
    40       DO it=1, nbtr
    41 c
    42       DO j=1,klev
    43       DO i=1,klon
    44         aux_var1(i,j)=tr_seri(i,j,it)
    45         aux_var2(i,j)=d_tr(i,j,it)
    46       ENDDO
    47       ENDDO
    48 c
    49 cnhl      CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
    50 cnhl     .                tr_seri(1,1,it),d_tr(1,1,it))
    51       CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
    52      .                aux_var1,aux_var2)
    53 c
    54       DO j=1,klev
    55       DO i=1,klon
    56         tr_seri(i,j,it)=aux_var1(i,j)
    57         d_tr(i,j,it)=aux_var2(i,j)
    58       ENDDO
    59       ENDDO
    60       DO k = 1, klev
    61       DO i = 1, klon
    62          tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
    63          his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO*
    64      .                masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys  !--mgS/m2/s
    65              
    66       ENDDO
    67       ENDDO
    68 c
    69       DO i=1,klon
    70       DO j=1,klev
    71         aux_var1(i,j)=tr_seri(i,j,it)
    72         aux_var2(i,j)=d_tr(i,j,it)
    73       ENDDO
    74       ENDDO
    75 c
    76       IF (lminmax) THEN
    77         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc')
    78 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')
    79       ENDIF
    80 c
    81 c-scheme for convective scavenging
    82 c
    83 cnhl      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
    84 cnhl     .                tr_seri(1,1,it),d_tr(1,1,it))
     38  EXTERNAL minmaxqfi, bcscav_spl
     39
     40  DO it=1, nbtr
     41  !
     42  DO j=1,klev
     43  DO i=1,klon
     44    aux_var1(i,j)=tr_seri(i,j,it)
     45    aux_var2(i,j)=d_tr(i,j,it)
     46  ENDDO
     47  ENDDO
     48  !
     49  !nhl      CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),
     50  !nhl     .                tr_seri(1,1,it),d_tr(1,1,it))
     51  CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), &
     52        aux_var1,aux_var2)
     53  !
     54  DO j=1,klev
     55  DO i=1,klon
     56    tr_seri(i,j,it)=aux_var1(i,j)
     57    d_tr(i,j,it)=aux_var2(i,j)
     58  ENDDO
     59  ENDDO
     60  DO k = 1, klev
     61  DO i = 1, klon
     62     tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
     63     his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO* &
     64           masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys  !--mgS/m2/s
     65
     66  ENDDO
     67  ENDDO
     68  !
     69  DO i=1,klon
     70  DO j=1,klev
     71    aux_var1(i,j)=tr_seri(i,j,it)
     72    aux_var2(i,j)=d_tr(i,j,it)
     73  ENDDO
     74  ENDDO
     75  !
     76  IF (lminmax) THEN
     77    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc')
     78  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')
     79  ENDIF
     80  !
     81  !-scheme for convective scavenging
     82  !
     83  !nhl      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
     84  !nhl     .                tr_seri(1,1,it),d_tr(1,1,it))
    8585
    8686
    87 cJE      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
    88 cJE     .                aux_var1,aux_var2)
     87  !JE      CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),
     88  !JE     .                aux_var1,aux_var2)
    8989
    9090
    91 c
    92       DO i=1,klon
    93       DO j=1,klev
    94         tr_seri(i,j,it)=aux_var1(i,j)
    95         d_tr(i,j,it)=aux_var2(i,j)
    96       ENDDO
    97       ENDDO
    98 c
    99       DO k = 1, klev
    100       DO i = 1, klon
    101          tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
    102          his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO*
    103      .                masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys    !--mgS/m2/s
    104       ENDDO
    105       ENDDO
    106 c
    107       IF (lminmax) THEN
    108         DO j=1,klev
    109         DO i=1,klon
    110           aux_var1(i,j)=tr_seri(i,j,it)
    111         ENDDO
    112         ENDDO
    113         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con')
    114 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')
    115         DO j=1,klev
    116         DO i=1,klon
    117           tr_seri(i,j,it)=aux_var1(i,j)
    118         ENDDO
    119         ENDDO
    120       ENDIF
    121 c
    122 c
    123       ENDDO !--boucle sur it
    124 c
    125       END
     91  !
     92  DO i=1,klon
     93  DO j=1,klev
     94    tr_seri(i,j,it)=aux_var1(i,j)
     95    d_tr(i,j,it)=aux_var2(i,j)
     96  ENDDO
     97  ENDDO
     98  !
     99  DO k = 1, klev
     100  DO i = 1, klon
     101     tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it)
     102     his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO* &
     103           masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys    !--mgS/m2/s
     104  ENDDO
     105  ENDDO
     106  !
     107  IF (lminmax) THEN
     108    DO j=1,klev
     109    DO i=1,klon
     110      aux_var1(i,j)=tr_seri(i,j,it)
     111    ENDDO
     112    ENDDO
     113    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con')
     114  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')
     115    DO j=1,klev
     116    DO i=1,klon
     117      tr_seri(i,j,it)=aux_var1(i,j)
     118    ENDDO
     119    ENDDO
     120  ENDIF
     121  !
     122  !
     123  ENDDO !--boucle sur it
     124  !
     125END SUBROUTINE blcloud_scav_lsc
  • LMDZ6/trunk/libf/phylmd/Dust/cltrac_spl.f90

    r5245 r5246  
    1       SUBROUTINE cltrac_spl(dtime,coef,yu1,yv1,t,tr,
    2      .                     flux,paprs,pplay,d_tr)
     1SUBROUTINE cltrac_spl(dtime,coef,yu1,yv1,t,tr, &
     2        flux,paprs,pplay,d_tr)
    33
    4       USE dimphy
    5       IMPLICIT none
    6 c======================================================================
    7 c Auteur(s): O. Boucher (LOA/LMD) date: 19961127
    8 c            inspire de clvent
    9 c Objet: diffusion verticale de traceurs avec flux fixe a la surface
    10 c        ou/et flux du type c-drag
    11 c======================================================================
    12 c Arguments:
    13 c dtime----input-R- intervalle du temps (en second)
    14 c coef-----input-R- le coefficient d'echange (m**2/s) l>1
    15 c yu1------input-R- le vent dans le 1iere couche
    16 c yv1------input-R- le vent dans le 1iere couche
    17 c t--------input-R- temperature (K)
    18 c tr-------input-R- la q. de traceurs
    19 c flux-----input-R- le flux de traceurs a la surface
    20 c paprs----input-R- pression a inter-couche (Pa)
    21 c pplay----input-R- pression au milieu de couche (Pa)
    22 c delp-----input-R- epaisseur de couche (Pa)
    23 c cdrag----input-R- cdrag pour le flux de surface (non active)
    24 c tr0------input-R- traceurs a la surface ou dans l'ocean (non active)
    25 c d_tr-----output-R- le changement de tr
    26 c flux_tr--output-R- flux de tr
    27 c======================================================================
    28       INCLUDE "dimensions.h"
    29       REAL dtime
    30       REAL coef(klon,klev)
    31       REAL yu1(klon), yv1(klon)
    32       REAL t(klon,klev), tr(klon,klev)
    33       REAL paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev)
    34       REAL d_tr(klon,klev)
    35       REAL flux(klon), cdrag(klon), tr0(klon)
    36 c      REAL flux_tr(klon,klev)
    37 c======================================================================
    38       INCLUDE "YOMCST.h"
    39 c======================================================================
    40       INTEGER i, k
    41       REAL zx_ctr(klon,2:klev)
    42       REAL zx_dtr(klon,2:klev)
    43       REAL zx_buf(klon)
    44       REAL zx_coef(klon,klev)
    45       REAL local_tr(klon,klev)
    46       REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)
    47 c======================================================================
    48 c CHECKING VALUES
    49 !      print *,'CHECKING VALUES IN CLTRAC (INI)'
    50 !      print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)
    51 !      print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux)
    52 !      print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)
    53 c======================================================================
    54       DO k = 1, klev
    55       DO i = 1, klon
    56          local_tr(i,k) = tr(i,k)
    57          delp(i,k) = paprs(i,k)-paprs(i,k+1)
    58       ENDDO
    59       ENDDO
    60 c======================================================================
    61       DO i = 1, klon
    62          zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
    63          zx_alf2(i) = 1.0 - zx_alf1(i)
    64          zx_flux(i) =  -flux(i)*dtime*RG
    65 c--pour le moment le flux est prescrit
    66          cdrag(i) = 0.0
    67 c        cdrag(i) =  coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2))
    68 c    .                * pplay(i,1)/(RD*t(i,1))
    69          tr0(i) = 0.0
    70          zx_coef(i,1) = cdrag(i)*dtime*RG
    71       ENDDO
    72 c======================================================================
    73       DO k = 2, klev
    74       DO i = 1, klon
    75          zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k))
    76      .                  *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
    77          zx_coef(i,k) = zx_coef(i,k)*dtime*RG
    78       ENDDO
    79       ENDDO
    80 c======================================================================
    81       DO i = 1, klon
    82          zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2)
    83          zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+
    84      .                  zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i)
    85          zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) /
    86      .                  zx_buf(i)
    87       ENDDO
    88 c
    89       DO k = 3, klev
    90       DO i = 1, klon
    91          zx_buf(i) = delp(i,k-1) + zx_coef(i,k)
    92      .                  + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1))
    93          zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1)
    94      .                  +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i)
    95          zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i)
    96       ENDDO
    97       ENDDO
    98       DO i = 1, klon
    99          local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev)
    100      .                        +zx_coef(i,klev)*zx_ctr(i,klev) )
    101      .                   / ( delp(i,klev) + zx_coef(i,klev)
    102      .                       -zx_coef(i,klev)*zx_dtr(i,klev) )
    103       ENDDO
    104       DO k = klev-1, 1, -1
    105       DO i = 1, klon
    106          local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1)
    107       ENDDO
    108       ENDDO
    109 c======================================================================
    110 !      print *,'CHECKING VALUES IN CLTRAC (FIN)'
    111 !      print *,'local_tr = ',sum(local_tr),MINVAL(local_tr),
    112 !    .                                    MAXVAL(local_tr)
    113 !      print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr)
    114 !      print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr)
    115 !      print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)
    116 c======================================================================
    117 c== flux_tr est le flux de traceur (positif vers bas)
    118 c      DO i = 1, klon
    119 c         flux_tr(i,1) = zx_coef(i,1)/(RG*dtime)
    120 c      ENDDO
    121 c      DO k = 2, klev
    122 c      DO i = 1, klon
    123 c         flux_tr(i,k) = zx_coef(i,k)/(RG*dtime)
    124 c    .               * (local_tr(i,k)-local_tr(i,k-1))
    125 c      ENDDO
    126 c      ENDDO
    127 c======================================================================
    128       DO k = 1, klev
    129       DO i = 1, klon
    130          d_tr(i,k) = local_tr(i,k) - tr(i,k)
    131       ENDDO
    132       ENDDO
    133 !      print *,'CHECKING VALUES IN CLTRAC (END)'
    134 !      print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)
    135 c
    136       RETURN
    137       END
     4  USE dimphy
     5  IMPLICIT none
     6  !======================================================================
     7  ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127
     8         ! inspire de clvent
     9  ! Objet: diffusion verticale de traceurs avec flux fixe a la surface
     10     ! ou/et flux du type c-drag
     11  !======================================================================
     12  ! Arguments:
     13  ! dtime----input-R- intervalle du temps (en second)
     14  ! coef-----input-R- le coefficient d'echange (m**2/s) l>1
     15  ! yu1------input-R- le vent dans le 1iere couche
     16  ! yv1------input-R- le vent dans le 1iere couche
     17  ! t--------input-R- temperature (K)
     18  ! tr-------input-R- la q. de traceurs
     19  ! flux-----input-R- le flux de traceurs a la surface
     20  ! paprs----input-R- pression a inter-couche (Pa)
     21  ! pplay----input-R- pression au milieu de couche (Pa)
     22  ! delp-----input-R- epaisseur de couche (Pa)
     23  ! cdrag----input-R- cdrag pour le flux de surface (non active)
     24  ! tr0------input-R- traceurs a la surface ou dans l'ocean (non active)
     25  ! d_tr-----output-R- le changement de tr
     26  ! flux_tr--output-R- flux de tr
     27  !======================================================================
     28  INCLUDE "dimensions.h"
     29  REAL :: dtime
     30  REAL :: coef(klon,klev)
     31  REAL :: yu1(klon), yv1(klon)
     32  REAL :: t(klon,klev), tr(klon,klev)
     33  REAL :: paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev)
     34  REAL :: d_tr(klon,klev)
     35  REAL :: flux(klon), cdrag(klon), tr0(klon)
     36   ! REAL flux_tr(klon,klev)
     37  !======================================================================
     38  INCLUDE "YOMCST.h"
     39  !======================================================================
     40  INTEGER :: i, k
     41  REAL :: zx_ctr(klon,2:klev)
     42  REAL :: zx_dtr(klon,2:klev)
     43  REAL :: zx_buf(klon)
     44  REAL :: zx_coef(klon,klev)
     45  REAL :: local_tr(klon,klev)
     46  REAL :: zx_alf1(klon), zx_alf2(klon), zx_flux(klon)
     47  !======================================================================
     48  ! CHECKING VALUES
     49   ! print *,'CHECKING VALUES IN CLTRAC (INI)'
     50   ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)
     51   ! print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux)
     52   ! print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)
     53  !======================================================================
     54  DO k = 1, klev
     55  DO i = 1, klon
     56     local_tr(i,k) = tr(i,k)
     57     delp(i,k) = paprs(i,k)-paprs(i,k+1)
     58  ENDDO
     59  ENDDO
     60  !======================================================================
     61  DO i = 1, klon
     62     zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
     63     zx_alf2(i) = 1.0 - zx_alf1(i)
     64     zx_flux(i) =  -flux(i)*dtime*RG
     65  !--pour le moment le flux est prescrit
     66     cdrag(i) = 0.0
     67      ! cdrag(i) =  coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2))
     68  ! .                * pplay(i,1)/(RD*t(i,1))
     69     tr0(i) = 0.0
     70     zx_coef(i,1) = cdrag(i)*dtime*RG
     71  ENDDO
     72  !======================================================================
     73  DO k = 2, klev
     74  DO i = 1, klon
     75     zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) &
     76           *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
     77     zx_coef(i,k) = zx_coef(i,k)*dtime*RG
     78  ENDDO
     79  ENDDO
     80  !======================================================================
     81  DO i = 1, klon
     82     zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2)
     83     zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+ &
     84           zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i)
     85     zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) / &
     86           zx_buf(i)
     87  ENDDO
     88  !
     89  DO k = 3, klev
     90  DO i = 1, klon
     91     zx_buf(i) = delp(i,k-1) + zx_coef(i,k) &
     92           + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1))
     93     zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1) &
     94           +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i)
     95     zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i)
     96  ENDDO
     97  ENDDO
     98  DO i = 1, klon
     99     local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev) &
     100           +zx_coef(i,klev)*zx_ctr(i,klev) ) &
     101           / ( delp(i,klev) + zx_coef(i,klev) &
     102           -zx_coef(i,klev)*zx_dtr(i,klev) )
     103  ENDDO
     104  DO k = klev-1, 1, -1
     105  DO i = 1, klon
     106     local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1)
     107  ENDDO
     108  ENDDO
     109  !======================================================================
     110   ! print *,'CHECKING VALUES IN CLTRAC (FIN)'
     111   ! print *,'local_tr = ',sum(local_tr),MINVAL(local_tr),
     112  ! .                                    MAXVAL(local_tr)
     113  !  print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr)
     114  !  print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr)
     115  !  print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)
     116  !======================================================================
     117  !== flux_tr est le flux de traceur (positif vers bas)
     118  !  DO i = 1, klon
     119  !     flux_tr(i,1) = zx_coef(i,1)/(RG*dtime)
     120  !  ENDDO
     121  !  DO k = 2, klev
     122  !  DO i = 1, klon
     123  !     flux_tr(i,k) = zx_coef(i,k)/(RG*dtime)
     124  ! .               * (local_tr(i,k)-local_tr(i,k-1))
     125  !  ENDDO
     126  !  ENDDO
     127  !======================================================================
     128  DO k = 1, klev
     129  DO i = 1, klon
     130     d_tr(i,k) = local_tr(i,k) - tr(i,k)
     131  ENDDO
     132  ENDDO
     133   ! print *,'CHECKING VALUES IN CLTRAC (END)'
     134   ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)
     135  !
     136  RETURN
     137END SUBROUTINE cltrac_spl
  • LMDZ6/trunk/libf/phylmd/Dust/cm3_to_kg.f90

    r5245 r5246  
    1       SUBROUTINE cm3_to_kg(pplay,t_seri,tr_seri)
     1SUBROUTINE cm3_to_kg(pplay,t_seri,tr_seri)
    22
    3       USE dimphy
    4       USE infotrac
    5       USE indice_sol_mod
     3  USE dimphy
     4  USE infotrac
     5  USE indice_sol_mod
    66
    7       IMPLICIT NONE
    8 c
    9       INCLUDE "dimensions.h"
    10       INCLUDE "YOMCST.h"
    11 c     
    12       REAL t_seri(klon,klev), pplay(klon,klev)
    13       REAL tr_seri(klon,klev)
    14       REAL zrho
    15       INTEGER i, k
    16 c
    17 !JE20150707      RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.9644
    18       DO k = 1, klev
    19       DO i = 1, klon
    20         zrho=pplay(i,k)/t_seri(i,k)/RD
    21         tr_seri(i,k)=tr_seri(i,k)*1.e6/zrho
    22       ENDDO
    23       ENDDO
    24 c
    25       END
     7  IMPLICIT NONE
     8  !
     9  INCLUDE "dimensions.h"
     10  INCLUDE "YOMCST.h"
     11  !
     12  REAL :: t_seri(klon,klev), pplay(klon,klev)
     13  REAL :: tr_seri(klon,klev)
     14  REAL :: zrho
     15  INTEGER :: i, k
     16  !
     17  !JE20150707      RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.9644
     18  DO k = 1, klev
     19  DO i = 1, klon
     20    zrho=pplay(i,k)/t_seri(i,k)/RD
     21    tr_seri(i,k)=tr_seri(i,k)*1.e6/zrho
     22  ENDDO
     23  ENDDO
     24  !
     25END SUBROUTINE cm3_to_kg
  • LMDZ6/trunk/libf/phylmd/Dust/coarsemission.f90

    r5245 r5246  
    1 c This subroutine calculates the emissions of SEA SALT and DUST, part of
    2 C which goes to tracer 2 and other part to tracer 3.
    3       SUBROUTINE coarsemission(pctsrf,pdtphys,
    4      .                         t_seri,pmflxr,pmflxs,prfl,psfl,
    5      .                         xlat,xlon,debutphy,
    6      .                         zu10m,zv10m,wstar,ale_bl,ale_wake,
    7      .                         scale_param_ssacc,scale_param_sscoa,
    8      .                         scale_param_dustacc,scale_param_dustcoa,
    9      .                         scale_param_dustsco,
    10      .                         nbreg_dust,
    11      .                         iregion_dust,dust_ec,
    12      .                  param_wstarBLperregion,param_wstarWAKEperregion,
    13      .                  nbreg_wstardust,
    14      .                  iregion_wstardust,
    15      .                         lmt_sea_salt,qmin,qmax,
    16      .                             flux_sparam_ddfine,flux_sparam_ddcoa,
    17      .                             flux_sparam_ddsco,
    18      .                             flux_sparam_ssfine,flux_sparam_sscoa,
    19      .                          id_prec,id_fine,id_coss,id_codu,id_scdu,
    20      .                          ok_chimeredust,
    21      .                                                source_tr,flux_tr)
    22 !    .                         wth,cly,zprecipinsoil,lmt_sea_salt,
    23 
    24 !      CALL dustemission( debutphy, xlat, xlon, pctsrf,
    25 !    .               zu10m     zv10m,wstar,ale_bl,ale_wake)
    26 !
    27 
    28       USE dimphy
    29       USE indice_sol_mod
    30       USE infotrac
    31       USE dustemission_mod,  ONLY : dustemission
    32 !      USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
    33       IMPLICIT NONE
    34 
    35       INCLUDE "dimensions.h"
    36       INCLUDE "chem.h"
    37       INCLUDE "chem_spla.h"
    38       INCLUDE "YOMCST.h"
    39       INCLUDE "paramet.h"
    40      
    41 c============================== INPUT ==================================
    42       INTEGER nbjour
    43       LOGICAL ok_chimeredust
    44       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    45       REAL t_seri(klon,klev)  ! temperature
    46       REAL pctsrf(klon,nbsrf)
    47       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
    48 !      REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
    49       REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
    50 !      REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
    51       LOGICAL debutphy, lafinphy
    52       REAL, intent(in) ::  xlat(klon)    ! latitudes pour chaque point
    53       REAL, intent(in) ::  xlon(klon)    ! longitudes pour chaque point
    54       REAL,DIMENSION(klon),INTENT(IN)    :: zu10m
    55       REAL,DIMENSION(klon),INTENT(IN)    :: zv10m
    56       REAL,DIMENSION(klon),INTENT(IN)    :: wstar,Ale_bl,ale_wake
    57 
    58 c
    59 c------------------------- Scaling Parameters --------------------------
    60 c
    61       INTEGER iregion_dust(klon) !Defines  dust regions
    62       REAL scale_param_ssacc  !Scaling parameter for Fine Sea Salt
    63       REAL scale_param_sscoa  !Scaling parameter for Coarse Sea Salt
    64       REAL scale_param_dustacc(nbreg_dust)  !Scaling parameter for Fine Dust
    65       REAL scale_param_dustcoa(nbreg_dust)  !Scaling parameter for Coarse Dust
    66       REAL scale_param_dustsco(nbreg_dust)  !Scaling parameter for SCoarse Dust
    67 !JE20141124<<
    68       INTEGER iregion_wstardust(klon) !Defines dust regions in terms of wstar
    69       REAL param_wstarBLperregion(nbreg_wstardust)  !
    70       REAL param_wstarWAKEperregion(nbreg_wstardust)  !
    71       REAL param_wstarBL(klon)  !parameter for surface wind correction..
    72       REAL param_wstarWAKE(klon)  !parameter for surface wind correction..
    73       INTEGER nbreg_wstardust
    74 !JE20141124>>
    75       INTEGER nbreg_dust
    76       INTEGER, INTENT(IN) :: id_prec,id_fine,id_coss,id_codu,id_scdu
    77 c============================== OUTPUT =================================
    78       REAL source_tr(klon,nbtr)
    79       REAL flux_tr(klon,nbtr)
    80       REAL flux_sparam_ddfine(klon), flux_sparam_ddcoa(klon)
    81       REAL flux_sparam_ddsco(klon)
    82       REAL flux_sparam_ssfine(klon), flux_sparam_sscoa(klon)
    83 c=========================== LOCAL VARIABLES ===========================           
    84       INTEGER i, j
    85       REAL pct_ocean(klon)
    86 !      REAL zprecipinsoil(klon)
    87 !      REAL cly(klon), wth(klon)
    88       REAL clyfac, avgdryrate, drying
    89            
    90 c---------------------------- SEA SALT emissions ------------------------
    91       REAL lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um                         
    92 c
    93 c--------vent 10 m CEPMMT
    94 c
    95       REAL dust_ec(klon)
    96 
    97       real tmp_var2(klon,nbtr) ! auxiliary variable to replace source
    98       REAL qmin, qmax
    99 !----------------------DUST Sahara ---------------
    100       REAL, DIMENSION(klon) :: dustsourceacc,dustsourcecoa,dustsourcesco
    101       INTEGER, DIMENSION(klon) :: maskd
    102 C*********************** DUST EMMISSIONS *******************************
    103 c
    104      
    105 !    avgdryrate=300./365.*pdtphys/86400.
    106 c
    107 !    DO i=1, klon
    108 c
    109 !       IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN
    110 !        zprecipinsoil(i)=zprecipinsoil(i) +
    111 !    .        (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys
    112 c
    113 !        clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil
    114 !        drying=avgdryrate*exp(0.03905491*
    115 !    .                    exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]
    116 !        zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm]
    117 c         
    118 !       ENDIF
    119 c
    120 !    ENDDO
    121 c               
    122 c ==================== CALCULATING DUST EMISSIONS ======================
    123 c
    124 !      IF (lminmax) THEN
    125       DO j=1,nbtr
    126       DO i=1,klon
    127          tmp_var2(i,j)=source_tr(i,j)
    128       ENDDO
    129       ENDDO
    130       CALL minmaxsource(tmp_var2,qmin,qmax,'src: before DD emiss')
    131 !      print *,'Source = ',SUM(source_tr),MINVAL(source_tr),
    132 !    .                                     MAXVAL(source_tr)
    133 !      ENDIF
    134 
    135 c
    136       IF (.NOT. ok_chimeredust)  THEN 
    137       DO i=1, klon
    138 !!     IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR.
    139 !!    .    t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN
    140 !!          dust_ec(i)=0.0
    141 !!     ENDIF
    142 !c Corresponds to dust_emission.EQ.3       
    143 !!!!!!!****************AQUIIIIIIIIIIIIIIIIIIIIIIIIIIII
    144 !! Original line (4 tracers)
    145 !JE<<  old 4 tracer(nhl scheme)        source_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*
    146 !    .                  dust_ec(i)*1.e3*0.093   ! g/m2/s
    147 !         source_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*
    148 !    .                  dust_ec(i)*1.e3*0.905   ! g/m2/s   bin 0.5-10um
    149 !! Original line (4 tracers)
    150 !         flux_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*
    151 !    .                  dust_ec(i)*1.e3*0.093*1.e3  !mg/m2/s
    152 !         flux_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*
    153 !    .                  dust_ec(i)*1.e3*0.905*1.e3  !mg/m2/s bin 0.5-10um
    154 !         flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *
    155 !    .                            dust_ec(i)*1.e3*0.093*1.e3
    156 !         flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *
    157 !    .                            dust_ec(i)*1.e3*0.905*1.e3
    158       IF(id_fine>0)     source_tr(i,id_fine)=
    159      . scale_param_dustacc(iregion_dust(i))*
    160      .                  dust_ec(i)*1.e3*0.093   ! g/m2/s
    161       IF(id_codu>0)   source_tr(i,id_codu)=
    162      . scale_param_dustcoa(iregion_dust(i))*
    163      .                  dust_ec(i)*1.e3*0.905   ! g/m2/s   bin 0.5-10um
    164       IF(id_scdu>0)  source_tr(i,id_scdu)=0.   ! no supercoarse
    165 ! Original line (4 tracers)
    166        IF(id_fine>0)   flux_tr(i,id_fine)=
    167      .  scale_param_dustacc(iregion_dust(i))*
    168      .                  dust_ec(i)*1.e3*0.093*1.e3  !mg/m2/s
    169        IF(id_codu>0)  flux_tr(i,id_codu)=
    170      . scale_param_dustcoa(iregion_dust(i))*
    171      .                  dust_ec(i)*1.e3*0.905*1.e3  !mg/m2/s bin 0.5-10um
    172        IF(id_scdu>0) flux_tr(i,id_scdu)=0.
    173 
    174          flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *
    175      .                            dust_ec(i)*1.e3*0.093*1.e3
    176          flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *
    177      .                            dust_ec(i)*1.e3*0.905*1.e3
    178          flux_sparam_ddsco(i)=0.
    179       ENDDO
    180       ENDIF
    181 !*****************NEW CHIMERE DUST EMISSION Sahara*****
    182 ! je  20140522
    183       IF(ok_chimeredust) THEN
    184       print *,'MIX- NEW SAHARA DUST SOURCE SCHEME...'
    185 
    186       DO i=1,klon
    187       param_wstarBL(i)  =param_wstarBLperregion(iregion_wstardust(i))
    188       param_wstarWAKE(i)=param_wstarWAKEperregion(iregion_wstardust(i))
    189       ENDDO
    190 
    191 
    192       CALL dustemission( debutphy, xlat, xlon, pctsrf,
    193      .                  zu10m,zv10m,wstar,ale_bl,ale_wake,
    194      .                  param_wstarBL, param_wstarWAKE,
    195      .                  dustsourceacc,dustsourcecoa,
    196      .                  dustsourcesco,maskd)
    197      
    198       DO i=1,klon   
    199          if (maskd(i).gt.0) then
    200       IF(id_fine>0)    source_tr(i,id_fine)=
    201      . scale_param_dustacc(iregion_dust(i))*
    202      .                  dustsourceacc(i)*1.e3   ! g/m2/s  bin 0.03-0.5
    203       IF(id_codu>0)    source_tr(i,id_codu)=
    204      . scale_param_dustcoa(iregion_dust(i))*
    205      .                  dustsourcecoa(i)*1.e3   ! g/m2/s   bin 0.5-3um
    206       IF(id_scdu>0)   source_tr(i,id_scdu)=
    207      . scale_param_dustsco(iregion_dust(i))*
    208      .                  dustsourcesco(i)*1.e3   ! g/m2/s   bin 3-15um
    209 ! Original line (4 tracers)
    210        IF(id_fine>0)  flux_tr(i,id_fine)=
    211      .  scale_param_dustacc(iregion_dust(i))*
    212      .                  dustsourceacc(i)*1.e3*1.e3  !mg/m2/s
    213        IF(id_codu>0)  flux_tr(i,id_codu)=
    214      . scale_param_dustcoa(iregion_dust(i))*
    215      .                  dustsourcecoa(i)*1.e3*1.e3  !mg/m2/s bin 0.5-3um
    216        IF(id_scdu>0)  flux_tr(i,id_scdu)=
    217      . scale_param_dustsco(iregion_dust(i))*
    218      .                  dustsourcesco(i)*1.e3*1.e3  !mg/m2/s bin 3-15um
    219          flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *
    220      .                            dustsourceacc(i)*1.e3*1.e3
    221          flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *
    222      .                            dustsourcecoa(i)*1.e3*1.e3
    223          flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) *
    224      .                            dustsourcesco(i)*1.e3*1.e3
    225          else
    226         IF(id_fine>0) source_tr(i,id_fine)=
    227      .  scale_param_dustacc(iregion_dust(i))*
    228      .                  dust_ec(i)*1.e3*0.114   ! g/m2/s
    229         IF(id_codu>0) source_tr(i,id_codu)=
    230      .  scale_param_dustcoa(iregion_dust(i))*
    231      .                  dust_ec(i)*1.e3*0.108   ! g/m2/s   bin 0.5-3um
    232         IF(id_scdu>0) source_tr(i,id_scdu)=
    233      .  scale_param_dustsco(iregion_dust(i))*
    234      .                  dust_ec(i)*1.e3*0.778   ! g/m2/s   bin 3-15um
    235 ! Original line (4 tracers)
    236         IF(id_fine>0) flux_tr(i,id_fine)=
    237      . scale_param_dustacc(iregion_dust(i))*
    238      .                  dust_ec(i)*1.e3*0.114*1.e3  !mg/m2/s
    239         IF(id_codu>0) flux_tr(i,id_codu)=
    240      . scale_param_dustcoa(iregion_dust(i))*
    241      .                  dust_ec(i)*1.e3*0.108*1.e3  !mg/m2/s bin 0.5-3um
    242         IF(id_scdu>0) flux_tr(i,id_scdu)=
    243      . scale_param_dustsco(iregion_dust(i))*
    244      .                  dust_ec(i)*1.e3*0.778*1.e3  !mg/m2/s bin 0.5-3um
    245 
    246          flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *
    247      .                            dust_ec(i)*1.e3*0.114*1.e3
    248          flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *
    249      .                            dust_ec(i)*1.e3*0.108*1.e3
    250          flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) *
    251      .                            dust_ec(i)*1.e3*0.778*1.e3
    252 
    253          endif
    254       ENDDO
    255 
    256 
    257 
    258 
    259 
    260       ENDIF
    261 !*****************************************************                                   
    262 C******************* SEA SALT EMMISSIONS *******************************
    263       DO i=1,klon
    264          pct_ocean(i)=pctsrf(i,is_oce)
    265       ENDDO
    266 c
    267 !      IF (lminmax) THEN
    268       DO j=1,nbtr
    269       DO i=1,klon
    270          tmp_var2(i,j)=source_tr(i,j)
    271       ENDDO
    272       ENDDO
    273       CALL minmaxsource(tmp_var2,qmin,qmax,'src: before SS emiss')
    274       IF(id_coss>0) then
    275       print *,'Source = ',SUM(source_tr(:,id_coss)),
    276         MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))
    277       ENDIF
    278 !
    279       DO i=1,klon
    280 ! Original line (4 tracers)
    281          IF(id_fine>0) source_tr(i,id_fine)=
    282      . source_tr(i,id_fine)+scale_param_ssacc*
    283      .                                 lmt_sea_salt(i,1)*1.e4       !g/m2/s
    284 
    285 ! Original line (4 tracers)
    286        IF(id_fine>0)  flux_tr(i,id_fine)=
    287      . flux_tr(i,id_fine)+scale_param_ssacc
    288      .                            *lmt_sea_salt(i,1)*1.e4*1.e3      !mg/m2/s
    289 !
    290       IF(id_coss>0)  source_tr(i,id_coss)=
    291      . scale_param_sscoa*lmt_sea_salt(i,2)*1.e4    !g/m2/s
    292       IF(id_coss>0)  flux_tr(i,id_coss)=
    293      . scale_param_sscoa*lmt_sea_salt(i,2)*1.e4*1.e3 !mg/m2/s
    294 c
    295          flux_sparam_ssfine(i)=scale_param_ssacc *
    296      .                                  lmt_sea_salt(i,1)*1.e4*1.e3
    297          flux_sparam_sscoa(i)=scale_param_sscoa *
    298      .                                  lmt_sea_salt(i,2)*1.e4*1.e3
    299       ENDDO
    300 !      IF (lminmax) THEN
    301       DO j=1,nbtr
    302       DO i=1,klon
    303          tmp_var2(i,j)=source_tr(i,j)
    304       ENDDO
    305       ENDDO
    306       CALL minmaxsource(tmp_var2,qmin,qmax,'src: after SS emiss')
    307       IF(id_coss>0) then
    308       print *,'Source = ',SUM(source_tr(:,id_coss)),
    309      .  MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))
    310       ENDIF
    311 c     
    312 
    313       END
     1! This subroutine calculates the emissions of SEA SALT and DUST, part of
     2! which goes to tracer 2 and other part to tracer 3.
     3SUBROUTINE coarsemission(pctsrf,pdtphys, &
     4        t_seri,pmflxr,pmflxs,prfl,psfl, &
     5        xlat,xlon,debutphy, &
     6        zu10m,zv10m,wstar,ale_bl,ale_wake, &
     7        scale_param_ssacc,scale_param_sscoa, &
     8        scale_param_dustacc,scale_param_dustcoa, &
     9        scale_param_dustsco, &
     10        nbreg_dust, &
     11        iregion_dust,dust_ec, &
     12        param_wstarBLperregion,param_wstarWAKEperregion, &
     13        nbreg_wstardust, &
     14        iregion_wstardust, &
     15        lmt_sea_salt,qmin,qmax, &
     16        flux_sparam_ddfine,flux_sparam_ddcoa, &
     17        flux_sparam_ddsco, &
     18        flux_sparam_ssfine,flux_sparam_sscoa, &
     19        id_prec,id_fine,id_coss,id_codu,id_scdu, &
     20        ok_chimeredust, &
     21        source_tr,flux_tr)
     22  ! .                         wth,cly,zprecipinsoil,lmt_sea_salt,
     23
     24  !  CALL dustemission( debutphy, xlat, xlon, pctsrf,
     25  ! .               zu10m     zv10m,wstar,ale_bl,ale_wake)
     26  !
     27
     28  USE dimphy
     29  USE indice_sol_mod
     30  USE infotrac
     31  USE dustemission_mod,  ONLY : dustemission
     32   ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
     33  IMPLICIT NONE
     34
     35  INCLUDE "dimensions.h"
     36  INCLUDE "chem.h"
     37  INCLUDE "chem_spla.h"
     38  INCLUDE "YOMCST.h"
     39  INCLUDE "paramet.h"
     40
     41  !============================== INPUT ==================================
     42  INTEGER :: nbjour
     43  LOGICAL :: ok_chimeredust
     44  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     45  REAL :: t_seri(klon,klev)  ! temperature
     46  REAL :: pctsrf(klon,nbsrf)
     47  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
     48   ! REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
     49  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
     50   ! REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
     51  LOGICAL :: debutphy, lafinphy
     52  REAL, intent(in) ::  xlat(klon)    ! latitudes pour chaque point
     53  REAL, intent(in) ::  xlon(klon)    ! longitudes pour chaque point
     54  REAL,DIMENSION(klon),INTENT(IN)    :: zu10m
     55  REAL,DIMENSION(klon),INTENT(IN)    :: zv10m
     56  REAL,DIMENSION(klon),INTENT(IN)    :: wstar,Ale_bl,ale_wake
     57
     58  !
     59  !------------------------- Scaling Parameters --------------------------
     60  !
     61  INTEGER :: iregion_dust(klon) !Defines  dust regions
     62  REAL :: scale_param_ssacc  !Scaling parameter for Fine Sea Salt
     63  REAL :: scale_param_sscoa  !Scaling parameter for Coarse Sea Salt
     64  REAL :: scale_param_dustacc(nbreg_dust)  !Scaling parameter for Fine Dust
     65  REAL :: scale_param_dustcoa(nbreg_dust)  !Scaling parameter for Coarse Dust
     66  REAL :: scale_param_dustsco(nbreg_dust)  !Scaling parameter for SCoarse Dust
     67  !JE20141124<<
     68  INTEGER :: iregion_wstardust(klon) !Defines dust regions in terms of wstar
     69  REAL :: param_wstarBLperregion(nbreg_wstardust)  !
     70  REAL :: param_wstarWAKEperregion(nbreg_wstardust)  !
     71  REAL :: param_wstarBL(klon)  !parameter for surface wind correction..
     72  REAL :: param_wstarWAKE(klon)  !parameter for surface wind correction..
     73  INTEGER :: nbreg_wstardust
     74  !JE20141124>>
     75  INTEGER :: nbreg_dust
     76  INTEGER, INTENT(IN) :: id_prec,id_fine,id_coss,id_codu,id_scdu
     77  !============================== OUTPUT =================================
     78  REAL :: source_tr(klon,nbtr)
     79  REAL :: flux_tr(klon,nbtr)
     80  REAL :: flux_sparam_ddfine(klon), flux_sparam_ddcoa(klon)
     81  REAL :: flux_sparam_ddsco(klon)
     82  REAL :: flux_sparam_ssfine(klon), flux_sparam_sscoa(klon)
     83  !=========================== LOCAL VARIABLES ===========================
     84  INTEGER :: i, j
     85  REAL :: pct_ocean(klon)
     86   ! REAL zprecipinsoil(klon)
     87   ! REAL cly(klon), wth(klon)
     88  REAL :: clyfac, avgdryrate, drying
     89
     90  !---------------------------- SEA SALT emissions ------------------------
     91  REAL :: lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um
     92  !
     93  !--------vent 10 m CEPMMT
     94  !
     95  REAL :: dust_ec(klon)
     96
     97  real :: tmp_var2(klon,nbtr) ! auxiliary variable to replace source
     98  REAL :: qmin, qmax
     99  !----------------------DUST Sahara ---------------
     100  REAL, DIMENSION(klon) :: dustsourceacc,dustsourcecoa,dustsourcesco
     101  INTEGER, DIMENSION(klon) :: maskd
     102  !*********************** DUST EMMISSIONS *******************************
     103  !
     104
     105  ! avgdryrate=300./365.*pdtphys/86400.
     106  !
     107  ! DO i=1, klon
     108  !
     109  !   IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN
     110  !    zprecipinsoil(i)=zprecipinsoil(i) +
     111  !    .        (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys
     112  !
     113  !    clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil
     114  !    drying=avgdryrate*exp(0.03905491*
     115  !    .                    exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]
     116  !    zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm]
     117  !
     118  !   ENDIF
     119  !
     120  ! ENDDO
     121  !
     122  ! ==================== CALCULATING DUST EMISSIONS ======================
     123  !
     124  !  IF (lminmax) THEN
     125  DO j=1,nbtr
     126  DO i=1,klon
     127     tmp_var2(i,j)=source_tr(i,j)
     128  ENDDO
     129  ENDDO
     130  CALL minmaxsource(tmp_var2,qmin,qmax,'src: before DD emiss')
     131   ! print *,'Source = ',SUM(source_tr),MINVAL(source_tr),
     132  ! .                                     MAXVAL(source_tr)
     133  !  ENDIF
     134
     135  !
     136  IF (.NOT. ok_chimeredust)  THEN
     137  DO i=1, klon
     138  !!     IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR.
     139  !!    .    t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN
     140  !!          dust_ec(i)=0.0
     141  !!     ENDIF
     142  !c Corresponds to dust_emission.EQ.3
     143  !!!!!!!****************AQUIIIIIIIIIIIIIIIIIIIIIIIIIIII
     144  !! Original line (4 tracers)
     145  !JE<<  old 4 tracer(nhl scheme)        source_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*
     146  ! .                  dust_ec(i)*1.e3*0.093   ! g/m2/s
     147  !     source_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*
     148  ! .                  dust_ec(i)*1.e3*0.905   ! g/m2/s   bin 0.5-10um
     149  !! Original line (4 tracers)
     150  !     flux_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*
     151  ! .                  dust_ec(i)*1.e3*0.093*1.e3  !mg/m2/s
     152  !     flux_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*
     153  ! .                  dust_ec(i)*1.e3*0.905*1.e3  !mg/m2/s bin 0.5-10um
     154  !     flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *
     155  ! .                            dust_ec(i)*1.e3*0.093*1.e3
     156  !     flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *
     157  ! .                            dust_ec(i)*1.e3*0.905*1.e3
     158  IF(id_fine>0)     source_tr(i,id_fine)= &
     159        scale_param_dustacc(iregion_dust(i))* &
     160        dust_ec(i)*1.e3*0.093   ! g/m2/s
     161  IF(id_codu>0)   source_tr(i,id_codu)= &
     162        scale_param_dustcoa(iregion_dust(i))* &
     163        dust_ec(i)*1.e3*0.905   ! g/m2/s   bin 0.5-10um
     164  IF(id_scdu>0)  source_tr(i,id_scdu)=0.   ! no supercoarse
     165  ! Original line (4 tracers)
     166   IF(id_fine>0)   flux_tr(i,id_fine)= &
     167         scale_param_dustacc(iregion_dust(i))* &
     168         dust_ec(i)*1.e3*0.093*1.e3  !mg/m2/s
     169   IF(id_codu>0)  flux_tr(i,id_codu)= &
     170         scale_param_dustcoa(iregion_dust(i))* &
     171         dust_ec(i)*1.e3*0.905*1.e3  !mg/m2/s bin 0.5-10um
     172   IF(id_scdu>0) flux_tr(i,id_scdu)=0.
     173
     174     flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * &
     175           dust_ec(i)*1.e3*0.093*1.e3
     176     flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * &
     177           dust_ec(i)*1.e3*0.905*1.e3
     178     flux_sparam_ddsco(i)=0.
     179  ENDDO
     180  ENDIF
     181  !*****************NEW CHIMERE DUST EMISSION Sahara*****
     182  ! je  20140522
     183  IF(ok_chimeredust) THEN
     184  print *,'MIX- NEW SAHARA DUST SOURCE SCHEME...'
     185
     186  DO i=1,klon
     187  param_wstarBL(i)  =param_wstarBLperregion(iregion_wstardust(i))
     188  param_wstarWAKE(i)=param_wstarWAKEperregion(iregion_wstardust(i))
     189  ENDDO
     190
     191
     192  CALL dustemission( debutphy, xlat, xlon, pctsrf, &
     193        zu10m,zv10m,wstar,ale_bl,ale_wake, &
     194        param_wstarBL, param_wstarWAKE, &
     195        dustsourceacc,dustsourcecoa, &
     196        dustsourcesco,maskd)
     197
     198  DO i=1,klon
     199     if (maskd(i).gt.0) then
     200  IF(id_fine>0)    source_tr(i,id_fine)= &
     201        scale_param_dustacc(iregion_dust(i))* &
     202        dustsourceacc(i)*1.e3   ! g/m2/s  bin 0.03-0.5
     203  IF(id_codu>0)    source_tr(i,id_codu)= &
     204        scale_param_dustcoa(iregion_dust(i))* &
     205        dustsourcecoa(i)*1.e3   ! g/m2/s   bin 0.5-3um
     206  IF(id_scdu>0)   source_tr(i,id_scdu)= &
     207        scale_param_dustsco(iregion_dust(i))* &
     208        dustsourcesco(i)*1.e3   ! g/m2/s   bin 3-15um
     209  ! Original line (4 tracers)
     210   IF(id_fine>0)  flux_tr(i,id_fine)= &
     211         scale_param_dustacc(iregion_dust(i))* &
     212         dustsourceacc(i)*1.e3*1.e3  !mg/m2/s
     213   IF(id_codu>0)  flux_tr(i,id_codu)= &
     214         scale_param_dustcoa(iregion_dust(i))* &
     215         dustsourcecoa(i)*1.e3*1.e3  !mg/m2/s bin 0.5-3um
     216   IF(id_scdu>0)  flux_tr(i,id_scdu)= &
     217         scale_param_dustsco(iregion_dust(i))* &
     218         dustsourcesco(i)*1.e3*1.e3  !mg/m2/s bin 3-15um
     219     flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * &
     220           dustsourceacc(i)*1.e3*1.e3
     221     flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * &
     222           dustsourcecoa(i)*1.e3*1.e3
     223     flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) * &
     224           dustsourcesco(i)*1.e3*1.e3
     225     else
     226    IF(id_fine>0) source_tr(i,id_fine)= &
     227          scale_param_dustacc(iregion_dust(i))* &
     228          dust_ec(i)*1.e3*0.114   ! g/m2/s
     229    IF(id_codu>0) source_tr(i,id_codu)= &
     230          scale_param_dustcoa(iregion_dust(i))* &
     231          dust_ec(i)*1.e3*0.108   ! g/m2/s   bin 0.5-3um
     232    IF(id_scdu>0) source_tr(i,id_scdu)= &
     233          scale_param_dustsco(iregion_dust(i))* &
     234          dust_ec(i)*1.e3*0.778   ! g/m2/s   bin 3-15um
     235  ! Original line (4 tracers)
     236    IF(id_fine>0) flux_tr(i,id_fine)= &
     237          scale_param_dustacc(iregion_dust(i))* &
     238          dust_ec(i)*1.e3*0.114*1.e3  !mg/m2/s
     239    IF(id_codu>0) flux_tr(i,id_codu)= &
     240          scale_param_dustcoa(iregion_dust(i))* &
     241          dust_ec(i)*1.e3*0.108*1.e3  !mg/m2/s bin 0.5-3um
     242    IF(id_scdu>0) flux_tr(i,id_scdu)= &
     243          scale_param_dustsco(iregion_dust(i))* &
     244          dust_ec(i)*1.e3*0.778*1.e3  !mg/m2/s bin 0.5-3um
     245
     246     flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * &
     247           dust_ec(i)*1.e3*0.114*1.e3
     248     flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * &
     249           dust_ec(i)*1.e3*0.108*1.e3
     250     flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) * &
     251           dust_ec(i)*1.e3*0.778*1.e3
     252
     253     endif
     254  ENDDO
     255
     256
     257
     258
     259
     260  ENDIF
     261  !*****************************************************
     262  !******************* SEA SALT EMMISSIONS *******************************
     263  DO i=1,klon
     264     pct_ocean(i)=pctsrf(i,is_oce)
     265  ENDDO
     266  !
     267  !  IF (lminmax) THEN
     268  DO j=1,nbtr
     269  DO i=1,klon
     270     tmp_var2(i,j)=source_tr(i,j)
     271  ENDDO
     272  ENDDO
     273  CALL minmaxsource(tmp_var2,qmin,qmax,'src: before SS emiss')
     274  IF(id_coss>0) then
     275  print *,'Source = ',SUM(source_tr(:,id_coss)), &
     276        MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))
     277  ENDIF
     278  !
     279  DO i=1,klon
     280  ! Original line (4 tracers)
     281     IF(id_fine>0) source_tr(i,id_fine)= &
     282           source_tr(i,id_fine)+scale_param_ssacc* &
     283           lmt_sea_salt(i,1)*1.e4       !g/m2/s
     284
     285  ! Original line (4 tracers)
     286   IF(id_fine>0)  flux_tr(i,id_fine)= &
     287         flux_tr(i,id_fine)+scale_param_ssacc &
     288         *lmt_sea_salt(i,1)*1.e4*1.e3      !mg/m2/s
     289  !
     290  IF(id_coss>0)  source_tr(i,id_coss)= &
     291       scale_param_sscoa*lmt_sea_salt(i,2)*1.e4    !g/m2/s
     292  IF(id_coss>0)  flux_tr(i,id_coss)= &
     293       scale_param_sscoa*lmt_sea_salt(i,2)*1.e4*1.e3 !mg/m2/s
     294  !
     295     flux_sparam_ssfine(i)=scale_param_ssacc * &
     296           lmt_sea_salt(i,1)*1.e4*1.e3
     297     flux_sparam_sscoa(i)=scale_param_sscoa * &
     298           lmt_sea_salt(i,2)*1.e4*1.e3
     299  ENDDO
     300   ! IF (lminmax) THEN
     301  DO j=1,nbtr
     302  DO i=1,klon
     303     tmp_var2(i,j)=source_tr(i,j)
     304  ENDDO
     305  ENDDO
     306  CALL minmaxsource(tmp_var2,qmin,qmax,'src: after SS emiss')
     307  IF(id_coss>0) then
     308  print *,'Source = ',SUM(source_tr(:,id_coss)), &
     309        MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))
     310  ENDIF
     311  !
     312
     313END SUBROUTINE coarsemission
  • LMDZ6/trunk/libf/phylmd/Dust/condsurfc.f90

    r5245 r5246  
    1       SUBROUTINE condsurfc(jour,lmt_bcff,lmt_bcbb,
    2      .                     lmt_bcbbl,lmt_bcbbh,lmt_bc_penner,
    3      .                     lmt_omff,lmt_ombb,lmt_ombbl,lmt_ombbh,
    4      .                     lmt_omnat)
    5       USE dimphy
    6       IMPLICIT none
    7 !
    8 ! Lire les conditions aux limites du modele pour la chimie.
    9 ! --------------------------------------------------------
    10 !
    11       INCLUDE "dimensions.h"
    12       INCLUDE "netcdf.inc"
    13      
    14       REAL lmt_bcff(klon), lmt_bcbb(klon),lmt_bc_penner(klon)
    15       REAL lmt_omff(klon), lmt_ombb(klon)
    16       REAL lmt_bcbbl(klon), lmt_bcbbh(klon)
    17       REAL lmt_ombbl(klon), lmt_ombbh(klon)
    18       REAL lmt_omnat(klon)
    19       REAL lmt_terp(klon)
    20 !
    21       INTEGER jour, i
    22       INTEGER ierr
    23       INTEGER nid1,nvarid
    24       INTEGER debut(2),epais(2)
    25 !
    26       IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN
    27          IF (jour.GT.(360-1).AND.jour.LE.367) THEN
    28            jour=360-1
    29            print *,'JE: jour changed to jour= ',jour
    30          ELSE
    31            PRINT*,'Le jour demande n est pas correcte:', jour
    32            CALL ABORT
    33          ENDIF
    34       ENDIF
    35 !
    36       ierr = NF_OPEN ("limitcarbon.nc", NF_NOWRITE, nid1)
    37       if (ierr.ne.NF_NOERR) then
    38         write(6,*)' Pb d''ouverture du fichier limitbc.nc'
    39         write(6,*)' ierr = ', ierr
    40         call exit(1)
    41       endif
    42 !
    43 ! Tranche a lire:
    44       debut(1) = 1
    45       debut(2) = jour+1
    46       epais(1) = klon
    47       epais(2) = 1
    48 !
    49 !
    50       ierr = NF_INQ_VARID (nid1, "BCFF", nvarid)
    51 !nhl #ifdef NC_DOUBLE
    52       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcff)
    53 !      print *,'IERR = ',ierr
    54 !      print *,'NF_NOERR = ',NF_NOERR
    55 !      print *,'debut = ',debut
    56 !      print *,'epais = ',epais
    57 !nhl #else
    58 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcff)
    59 !nhl #endif
    60       IF (ierr .NE. NF_NOERR) THEN
    61          PRINT*, 'Pb de lecture pour les sources BC'
    62          CALL exit(1)
    63       ENDIF
    64 !
    65 !
    66       ierr = NF_INQ_VARID (nid1, "BCBB", nvarid)
    67 !nhl #ifdef NC_DOUBLE
    68       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbb)
    69 !nhl #else
    70 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbb)
    71 !nhl #endif
    72       IF (ierr .NE. NF_NOERR) THEN
    73          PRINT*, 'Pb de lecture pour les sources BC-biomass'
    74          CALL exit(1)
    75       ENDIF
    76 !
    77 !
    78       ierr = NF_INQ_VARID (nid1, "BCBL", nvarid)
    79 !nhl #ifdef NC_DOUBLE
    80       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbl)
    81 !nhl #else
    82 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbl)
    83 !nhl #endif
    84       IF (ierr .NE. NF_NOERR) THEN
    85          PRINT*, 'Pb de lecture pour les sources BC low'
    86          CALL exit(1)
    87       ENDIF
    88 !
    89 !
    90       ierr = NF_INQ_VARID (nid1, "BCBH", nvarid)
    91 !nhl #ifdef NC_DOUBLE
    92       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbh)
    93 !nhl #else
    94 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbh)
    95 !nhl #endif
    96       IF (ierr .NE. NF_NOERR) THEN
    97          PRINT*, 'Pb de lecture pour les sources BC high'
    98          CALL exit(1)
    99       ENDIF
    100 !
    101       ierr = NF_INQ_VARID (nid1, "TERP", nvarid)
    102 !nhl #ifdef NC_DOUBLE
    103       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_terp)
    104 !nhl #else
    105 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_terp)
    106 !nhl #endif
    107       IF (ierr .NE. NF_NOERR) THEN
    108          PRINT*, 'Pb de lecture pour les sources Terpene'
    109          CALL exit(1)
    110       ENDIF
    111 !
    112 !
    113       ierr = NF_INQ_VARID (nid1, "BC_penner", nvarid)
    114 !nhl #ifdef NC_DOUBLE
    115       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut,
    116      .       epais, lmt_bc_penner)
    117 !nhl #else
    118 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais,
    119 !nhl      .       lmt_bc_penner)
    120 !nhl #endif
    121       IF (ierr .NE. NF_NOERR) THEN
    122          PRINT*, 'Pb de lecture pour les sources BC Penner'
    123          CALL exit(1)
    124       ENDIF
    125 !
    126 !
    127       ierr = NF_INQ_VARID (nid1, "OMFF", nvarid)
    128 !nhl #ifdef NC_DOUBLE
    129       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_omff)
    130 !nhl #else
    131 !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_omff)
    132 !nhl #endif
    133       IF (ierr .NE. NF_NOERR) THEN
    134          PRINT*, 'Pb de lecture pour les sources om-ifossil'
    135          CALL exit(1)
    136       ENDIF
    137 !
    138       DO i=1,klon
    139         lmt_ombb(i)  = lmt_bcbb(i)*7.0*1.6      !OC/BC=7.0;OM/OC=1.6
    140         lmt_ombbl(i) = lmt_bcbbl(i)*7.0*1.6
    141         lmt_ombbh(i) = lmt_bcbbh(i)*7.0*1.6
    142         lmt_omff(i)  = lmt_omff(i)*1.4          !--OM/OC=1.4
    143         lmt_omnat(i)  = lmt_terp(i)*0.11*1.4 !-- 11% Terpene is OC
    144       ENDDO
    145 !
    146       ierr = NF_CLOSE(nid1)
    147       PRINT*, 'Carbon sources lues pour jour: ', jour
    148 !
    149       RETURN
    150       END
     1SUBROUTINE condsurfc(jour,lmt_bcff,lmt_bcbb, &
     2        lmt_bcbbl,lmt_bcbbh,lmt_bc_penner, &
     3        lmt_omff,lmt_ombb,lmt_ombbl,lmt_ombbh, &
     4        lmt_omnat)
     5  USE dimphy
     6  IMPLICIT none
     7  !
     8  ! Lire les conditions aux limites du modele pour la chimie.
     9  ! --------------------------------------------------------
     10  !
     11  INCLUDE "dimensions.h"
     12  INCLUDE "netcdf.inc"
     13
     14  REAL :: lmt_bcff(klon), lmt_bcbb(klon),lmt_bc_penner(klon)
     15  REAL :: lmt_omff(klon), lmt_ombb(klon)
     16  REAL :: lmt_bcbbl(klon), lmt_bcbbh(klon)
     17  REAL :: lmt_ombbl(klon), lmt_ombbh(klon)
     18  REAL :: lmt_omnat(klon)
     19  REAL :: lmt_terp(klon)
     20  !
     21  INTEGER :: jour, i
     22  INTEGER :: ierr
     23  INTEGER :: nid1,nvarid
     24  INTEGER :: debut(2),epais(2)
     25  !
     26  IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN
     27     IF (jour.GT.(360-1).AND.jour.LE.367) THEN
     28       jour=360-1
     29       print *,'JE: jour changed to jour= ',jour
     30     ELSE
     31       PRINT*,'Le jour demande n est pas correcte:', jour
     32       CALL ABORT
     33     ENDIF
     34  ENDIF
     35  !
     36  ierr = NF_OPEN ("limitcarbon.nc", NF_NOWRITE, nid1)
     37  if (ierr.ne.NF_NOERR) then
     38    write(6,*)' Pb d''ouverture du fichier limitbc.nc'
     39    write(6,*)' ierr = ', ierr
     40    call exit(1)
     41  endif
     42  !
     43  ! Tranche a lire:
     44  debut(1) = 1
     45  debut(2) = jour+1
     46  epais(1) = klon
     47  epais(2) = 1
     48  !
     49  !
     50  ierr = NF_INQ_VARID (nid1, "BCFF", nvarid)
     51  !nhl #ifdef NC_DOUBLE
     52  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcff)
     53   ! print *,'IERR = ',ierr
     54   ! print *,'NF_NOERR = ',NF_NOERR
     55   ! print *,'debut = ',debut
     56   ! print *,'epais = ',epais
     57  !nhl #else
     58  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcff)
     59  !nhl #endif
     60  IF (ierr .NE. NF_NOERR) THEN
     61     PRINT*, 'Pb de lecture pour les sources BC'
     62     CALL exit(1)
     63  ENDIF
     64  !
     65  !
     66  ierr = NF_INQ_VARID (nid1, "BCBB", nvarid)
     67  !nhl #ifdef NC_DOUBLE
     68  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbb)
     69  !nhl #else
     70  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbb)
     71  !nhl #endif
     72  IF (ierr .NE. NF_NOERR) THEN
     73     PRINT*, 'Pb de lecture pour les sources BC-biomass'
     74     CALL exit(1)
     75  ENDIF
     76  !
     77  !
     78  ierr = NF_INQ_VARID (nid1, "BCBL", nvarid)
     79  !nhl #ifdef NC_DOUBLE
     80  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbl)
     81  !nhl #else
     82  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbl)
     83  !nhl #endif
     84  IF (ierr .NE. NF_NOERR) THEN
     85     PRINT*, 'Pb de lecture pour les sources BC low'
     86     CALL exit(1)
     87  ENDIF
     88  !
     89  !
     90  ierr = NF_INQ_VARID (nid1, "BCBH", nvarid)
     91  !nhl #ifdef NC_DOUBLE
     92  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbh)
     93  !nhl #else
     94  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbh)
     95  !nhl #endif
     96  IF (ierr .NE. NF_NOERR) THEN
     97     PRINT*, 'Pb de lecture pour les sources BC high'
     98     CALL exit(1)
     99  ENDIF
     100  !
     101  ierr = NF_INQ_VARID (nid1, "TERP", nvarid)
     102  !nhl #ifdef NC_DOUBLE
     103  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_terp)
     104  !nhl #else
     105  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_terp)
     106  !nhl #endif
     107  IF (ierr .NE. NF_NOERR) THEN
     108     PRINT*, 'Pb de lecture pour les sources Terpene'
     109     CALL exit(1)
     110  ENDIF
     111  !
     112  !
     113  ierr = NF_INQ_VARID (nid1, "BC_penner", nvarid)
     114  !nhl #ifdef NC_DOUBLE
     115  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, &
     116        epais, lmt_bc_penner)
     117  !nhl #else
     118  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais,
     119  !nhl      .       lmt_bc_penner)
     120  !nhl #endif
     121  IF (ierr .NE. NF_NOERR) THEN
     122     PRINT*, 'Pb de lecture pour les sources BC Penner'
     123     CALL exit(1)
     124  ENDIF
     125  !
     126  !
     127  ierr = NF_INQ_VARID (nid1, "OMFF", nvarid)
     128  !nhl #ifdef NC_DOUBLE
     129  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_omff)
     130  !nhl #else
     131  !nhl       ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_omff)
     132  !nhl #endif
     133  IF (ierr .NE. NF_NOERR) THEN
     134     PRINT*, 'Pb de lecture pour les sources om-ifossil'
     135     CALL exit(1)
     136  ENDIF
     137  !
     138  DO i=1,klon
     139    lmt_ombb(i)  = lmt_bcbb(i)*7.0*1.6      !OC/BC=7.0;OM/OC=1.6
     140    lmt_ombbl(i) = lmt_bcbbl(i)*7.0*1.6
     141    lmt_ombbh(i) = lmt_bcbbh(i)*7.0*1.6
     142    lmt_omff(i)  = lmt_omff(i)*1.4          !--OM/OC=1.4
     143    lmt_omnat(i)  = lmt_terp(i)*0.11*1.4 !-- 11% Terpene is OC
     144  ENDDO
     145  !
     146  ierr = NF_CLOSE(nid1)
     147  PRINT*, 'Carbon sources lues pour jour: ', jour
     148  !
     149  RETURN
     150END SUBROUTINE condsurfc
  • LMDZ6/trunk/libf/phylmd/Dust/condsurfc_new.f90

    r5245 r5246  
    1       SUBROUTINE condsurfc_new(jour,lmt_bcff, lmt_bcnff,
    2      .                         lmt_bcbbl,lmt_bcbbh, lmt_bcba,
    3      .                         lmt_omff,lmt_omnff,lmt_ombbl,lmt_ombbh,
    4      .                                             lmt_omnat, lmt_omba)
    5       USE mod_grid_phy_lmdz
    6       USE mod_phys_lmdz_para
    7       USE dimphy
    8       IMPLICIT none
    9 c
    10 c Lire les conditions aux limites du modele pour la chimie.
    11 c --------------------------------------------------------
    12 c
    13       INCLUDE "dimensions.h"
    14       INCLUDE "netcdf.inc"
    15      
    16       REAL lmt_bcff(klon), lmt_bcnff(klon), lmt_bcba(klon)
    17       REAL lmt_omff(klon), lmt_omnff(klon), lmt_ombb(klon)
    18       REAL lmt_bcbbl(klon), lmt_bcbbh(klon)
    19       REAL lmt_ombbl(klon), lmt_ombbh(klon)
    20       REAL lmt_omnat(klon), lmt_omba(klon)
    21       REAL lmt_terp(klon)
    22 c
    23       REAL lmt_bcff_glo(klon_glo), lmt_bcnff_glo(klon_glo)
    24       REAL lmt_bcba_glo(klon_glo)
    25       REAL lmt_omff_glo(klon_glo), lmt_omnff_glo(klon_glo)
    26       REAL lmt_ombb_glo(klon_glo)
    27       REAL lmt_bcbbl_glo(klon_glo), lmt_bcbbh_glo(klon_glo)
    28       REAL lmt_ombbl_glo(klon_glo), lmt_ombbh_glo(klon_glo)
    29       REAL lmt_omnat_glo(klon_glo), lmt_omba_glo(klon_glo)
    30       REAL lmt_terp_glo(klon_glo)
    31 !
    32       INTEGER jour, i
    33       INTEGER ierr
    34       INTEGER nid1,nvarid
    35       INTEGER debut(2),epais(2)
    36 c
    37 !      IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN
    38       IF (jour.LT.0 .OR. jour.GT.366) THEN
    39          PRINT*,'Le jour demande n est pas correcte:', jour
    40          print *,'JE: FORCED TO CONTINUE (emissions have
    41      . to be longer than 1 year!!!! )'
    42 !JE         CALL ABORT
    43       ENDIF
     1SUBROUTINE condsurfc_new(jour,lmt_bcff, lmt_bcnff, &
     2        lmt_bcbbl,lmt_bcbbh, lmt_bcba, &
     3        lmt_omff,lmt_omnff,lmt_ombbl,lmt_ombbh, &
     4        lmt_omnat, lmt_omba)
     5  USE mod_grid_phy_lmdz
     6  USE mod_phys_lmdz_para
     7  USE dimphy
     8  IMPLICIT none
     9  !
     10  ! Lire les conditions aux limites du modele pour la chimie.
     11  ! --------------------------------------------------------
     12  !
     13  INCLUDE "dimensions.h"
     14  INCLUDE "netcdf.inc"
     15
     16  REAL :: lmt_bcff(klon), lmt_bcnff(klon), lmt_bcba(klon)
     17  REAL :: lmt_omff(klon), lmt_omnff(klon), lmt_ombb(klon)
     18  REAL :: lmt_bcbbl(klon), lmt_bcbbh(klon)
     19  REAL :: lmt_ombbl(klon), lmt_ombbh(klon)
     20  REAL :: lmt_omnat(klon), lmt_omba(klon)
     21  REAL :: lmt_terp(klon)
     22  !
     23  REAL :: lmt_bcff_glo(klon_glo), lmt_bcnff_glo(klon_glo)
     24  REAL :: lmt_bcba_glo(klon_glo)
     25  REAL :: lmt_omff_glo(klon_glo), lmt_omnff_glo(klon_glo)
     26  REAL :: lmt_ombb_glo(klon_glo)
     27  REAL :: lmt_bcbbl_glo(klon_glo), lmt_bcbbh_glo(klon_glo)
     28  REAL :: lmt_ombbl_glo(klon_glo), lmt_ombbh_glo(klon_glo)
     29  REAL :: lmt_omnat_glo(klon_glo), lmt_omba_glo(klon_glo)
     30  REAL :: lmt_terp_glo(klon_glo)
     31  !
     32  INTEGER :: jour, i
     33  INTEGER :: ierr
     34  INTEGER :: nid1,nvarid
     35  INTEGER :: debut(2),epais(2)
     36  !
     37  !  IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN
     38  IF (jour.LT.0 .OR. jour.GT.366) THEN
     39     PRINT*,'Le jour demande n est pas correcte:', jour
     40     print *,'JE: FORCED TO CONTINUE (emissions have&
     41           & to be longer than 1 year!!!! )'
     42  !JE         CALL ABORT
     43  ENDIF
    4444
    4545!$OMP MASTER
    46       IF (is_mpi_root .AND. is_omp_root) THEN
    47 !
    48 ! Tranche a lire:
    49       debut(1) = 1
    50       debut(2) = jour
    51       epais(1) = klon_glo
    52 !      epais(1) = klon
    53       epais(2) = 1
    54 !
    55 !=======================================================================
    56 !                        BC EMISSIONS
    57 !=======================================================================
    58 !
    59       ierr = NF_OPEN ("carbon_emissions.nc", NF_NOWRITE, nid1)
    60       if (ierr.ne.NF_NOERR) then
    61         write(6,*)' Pb d''ouverture du fichier limitbc.nc'
    62         write(6,*)' ierr = ', ierr
    63         call exit(1)
    64       endif
    65 !
    66 ! BC emissions from fossil fuel combustion
    67 !
    68       ierr = NF_INQ_VARID (nid1, "BCFF", nvarid)
    69       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    70      .  lmt_bcff_glo)
    71       IF (ierr .NE. NF_NOERR) THEN
    72          PRINT*, 'Pb de lecture pour les sources BC'
    73          CALL exit(1)
    74       ENDIF
    75       !print *,'lmt_bcff = ',lmt_bcff
    76       !stop
    77 !
    78 ! BC emissions from non fossil fuel combustion
    79 !
    80       ierr = NF_INQ_VARID (nid1, "BCNFF", nvarid)
    81       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    82      .    lmt_bcnff_glo)
    83       IF (ierr .NE. NF_NOERR) THEN
    84          PRINT*, 'Pb de lecture pour les sources BC'
    85          CALL exit(1)
    86       ENDIF
    87 !
    88 ! Low BC emissions from biomass burning
    89 !
    90       ierr = NF_INQ_VARID (nid1, "BCBBL", nvarid)
    91       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    92      .  lmt_bcbbl_glo)
    93       IF (ierr .NE. NF_NOERR) THEN
    94          PRINT*, 'Pb de lecture pour les sources BC low'
    95          CALL exit(1)
    96       ENDIF
    97 !
    98 ! High BC emissions from biomass burning
    99 !
    100       ierr = NF_INQ_VARID (nid1, "BCBBH", nvarid)
    101       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    102      .      lmt_bcbbh_glo)
    103       IF (ierr .NE. NF_NOERR) THEN
    104          PRINT*, 'Pb de lecture pour les sources BC high'
    105          CALL exit(1)
    106       ENDIF
    107 !
    108 ! BC emissions from ship transport
    109 !
    110       ierr = NF_INQ_VARID (nid1, "BCBA", nvarid)
    111       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    112      .   lmt_bcba_glo)
    113       IF (ierr .NE. NF_NOERR) THEN
    114          PRINT*, 'Pb de lecture pour les sources BC'
    115          CALL exit(1)
    116       ENDIF
    117 !
    118 !=======================================================================
    119 !                        OM EMISSIONS
    120 !=======================================================================
    121 !
    122 
    123 !
    124 ! OM emissions from fossil fuel combustion
    125 !
    126       ierr = NF_INQ_VARID (nid1, "OMFF", nvarid)
    127       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    128      .  lmt_omff_glo)
    129       IF (ierr .NE. NF_NOERR) THEN
    130          PRINT*, 'Pb de lecture pour les sources OM'
    131          CALL exit(1)
    132       ENDIF
    133 !
    134 ! OM emissions from non fossil fuel combustion
    135 !
    136       ierr = NF_INQ_VARID (nid1, "OMNFF", nvarid)
    137       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    138      .   lmt_omnff_glo)
    139       IF (ierr .NE. NF_NOERR) THEN
    140          PRINT*, 'Pb de lecture pour les sources OM'
    141          CALL exit(1)
    142       ENDIF
    143 !
    144 ! Low OM emissions from biomass burning - low
    145 !
    146       ierr = NF_INQ_VARID (nid1, "OMBBL", nvarid)
    147       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    148      .  lmt_ombbl_glo)
    149       IF (ierr .NE. NF_NOERR) THEN
    150          PRINT*, 'Pb de lecture pour les sources OM low'
    151          CALL exit(1)
    152       ENDIF
    153 !
    154 ! High OM emissions from biomass burning - high
    155 !
    156       ierr = NF_INQ_VARID (nid1, "OMBBH", nvarid)
    157       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    158      .  lmt_ombbh_glo)
    159       IF (ierr .NE. NF_NOERR) THEN
    160          PRINT*, 'Pb de lecture pour les sources OM high'
    161          CALL exit(1)
    162       ENDIF
    163 !
    164 ! High OM emissions from ship
    165 !
    166       ierr = NF_INQ_VARID (nid1, "OMBA", nvarid)
    167       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    168      .   lmt_omba_glo)
    169       IF (ierr .NE. NF_NOERR) THEN
    170          PRINT*, 'Pb de lecture pour les sources OM ship'
    171          CALL exit(1)
    172       ENDIF
    173 !
    174 ! Natural Terpene emissions => Natural OM emissions
    175 !
    176       ierr = NF_INQ_VARID (nid1, "TERP", nvarid)
    177       ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,
    178      .  lmt_terp_glo)
    179       IF (ierr .NE. NF_NOERR) THEN
    180          PRINT*, 'Pb de lecture pour les sources Terpene'
    181          CALL exit(1)
    182       ENDIF
    183 !
    184       DO i=1,klon_glo
    185         lmt_omnat_glo(i)  = lmt_terp_glo(i)*0.11*1.4 !-- 11% Terpene is OC
    186       ENDDO
    187 
    188       ierr = NF_CLOSE(nid1)
    189 !
    190       PRINT*, 'Carbon sources lues pour jour: ', jour
    191 !      lmt_bcff(klon)=0.0
    192 !      lmt_bcnff(klon)=0.0
    193 !      lmt_omff(klon)=0.0
    194 !      lmt_omnff(klon)=0.0
    195 !      lmt_ombb(klon)=0.0
    196 !      lmt_bcbbl(klon)=0.0
    197 !      lmt_bcbbh(klon)=0.0
    198 !      lmt_ombbl(klon)=0.0
    199 !      lmt_ombbh(klon)=0.0
    200 !      lmt_omnat(klon)=0.0
    201 !      lmt_omba(klon)=0.0
    202 !      lmt_terp(klon)=0.0
    203 
    204 
    205       ENDIF
     46  IF (is_mpi_root .AND. is_omp_root) THEN
     47  !
     48  ! Tranche a lire:
     49  debut(1) = 1
     50  debut(2) = jour
     51  epais(1) = klon_glo
     52   ! epais(1) = klon
     53  epais(2) = 1
     54  !
     55  !=======================================================================
     56  !                    BC EMISSIONS
     57  !=======================================================================
     58  !
     59  ierr = NF_OPEN ("carbon_emissions.nc", NF_NOWRITE, nid1)
     60  if (ierr.ne.NF_NOERR) then
     61    write(6,*)' Pb d''ouverture du fichier limitbc.nc'
     62    write(6,*)' ierr = ', ierr
     63    call exit(1)
     64  endif
     65  !
     66  ! BC emissions from fossil fuel combustion
     67  !
     68  ierr = NF_INQ_VARID (nid1, "BCFF", nvarid)
     69  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     70        lmt_bcff_glo)
     71  IF (ierr .NE. NF_NOERR) THEN
     72     PRINT*, 'Pb de lecture pour les sources BC'
     73     CALL exit(1)
     74  ENDIF
     75  ! !print *,'lmt_bcff = ',lmt_bcff
     76  ! !stop
     77  !
     78  ! BC emissions from non fossil fuel combustion
     79  !
     80  ierr = NF_INQ_VARID (nid1, "BCNFF", nvarid)
     81  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     82        lmt_bcnff_glo)
     83  IF (ierr .NE. NF_NOERR) THEN
     84     PRINT*, 'Pb de lecture pour les sources BC'
     85     CALL exit(1)
     86  ENDIF
     87  !
     88  ! Low BC emissions from biomass burning
     89  !
     90  ierr = NF_INQ_VARID (nid1, "BCBBL", nvarid)
     91  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     92        lmt_bcbbl_glo)
     93  IF (ierr .NE. NF_NOERR) THEN
     94     PRINT*, 'Pb de lecture pour les sources BC low'
     95     CALL exit(1)
     96  ENDIF
     97  !
     98  ! High BC emissions from biomass burning
     99  !
     100  ierr = NF_INQ_VARID (nid1, "BCBBH", nvarid)
     101  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     102        lmt_bcbbh_glo)
     103  IF (ierr .NE. NF_NOERR) THEN
     104     PRINT*, 'Pb de lecture pour les sources BC high'
     105     CALL exit(1)
     106  ENDIF
     107  !
     108  ! BC emissions from ship transport
     109  !
     110  ierr = NF_INQ_VARID (nid1, "BCBA", nvarid)
     111  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     112        lmt_bcba_glo)
     113  IF (ierr .NE. NF_NOERR) THEN
     114     PRINT*, 'Pb de lecture pour les sources BC'
     115     CALL exit(1)
     116  ENDIF
     117  !
     118  !=======================================================================
     119                     ! OM EMISSIONS
     120  !=======================================================================
     121  !
     122
     123  !
     124  ! OM emissions from fossil fuel combustion
     125  !
     126  ierr = NF_INQ_VARID (nid1, "OMFF", nvarid)
     127  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     128        lmt_omff_glo)
     129  IF (ierr .NE. NF_NOERR) THEN
     130     PRINT*, 'Pb de lecture pour les sources OM'
     131     CALL exit(1)
     132  ENDIF
     133  !
     134  ! OM emissions from non fossil fuel combustion
     135  !
     136  ierr = NF_INQ_VARID (nid1, "OMNFF", nvarid)
     137  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     138        lmt_omnff_glo)
     139  IF (ierr .NE. NF_NOERR) THEN
     140     PRINT*, 'Pb de lecture pour les sources OM'
     141     CALL exit(1)
     142  ENDIF
     143  !
     144  ! Low OM emissions from biomass burning - low
     145  !
     146  ierr = NF_INQ_VARID (nid1, "OMBBL", nvarid)
     147  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     148        lmt_ombbl_glo)
     149  IF (ierr .NE. NF_NOERR) THEN
     150     PRINT*, 'Pb de lecture pour les sources OM low'
     151     CALL exit(1)
     152  ENDIF
     153  !
     154  ! High OM emissions from biomass burning - high
     155  !
     156  ierr = NF_INQ_VARID (nid1, "OMBBH", nvarid)
     157  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     158        lmt_ombbh_glo)
     159  IF (ierr .NE. NF_NOERR) THEN
     160     PRINT*, 'Pb de lecture pour les sources OM high'
     161     CALL exit(1)
     162  ENDIF
     163  !
     164  ! High OM emissions from ship
     165  !
     166  ierr = NF_INQ_VARID (nid1, "OMBA", nvarid)
     167  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     168        lmt_omba_glo)
     169  IF (ierr .NE. NF_NOERR) THEN
     170     PRINT*, 'Pb de lecture pour les sources OM ship'
     171     CALL exit(1)
     172  ENDIF
     173  !
     174  ! Natural Terpene emissions => Natural OM emissions
     175  !
     176  ierr = NF_INQ_VARID (nid1, "TERP", nvarid)
     177  ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, &
     178        lmt_terp_glo)
     179  IF (ierr .NE. NF_NOERR) THEN
     180     PRINT*, 'Pb de lecture pour les sources Terpene'
     181     CALL exit(1)
     182  ENDIF
     183  !
     184  DO i=1,klon_glo
     185    lmt_omnat_glo(i)  = lmt_terp_glo(i)*0.11*1.4 !-- 11% Terpene is OC
     186  ENDDO
     187
     188  ierr = NF_CLOSE(nid1)
     189  !
     190  PRINT*, 'Carbon sources lues pour jour: ', jour
     191   ! lmt_bcff(klon)=0.0
     192   ! lmt_bcnff(klon)=0.0
     193   ! lmt_omff(klon)=0.0
     194   ! lmt_omnff(klon)=0.0
     195   ! lmt_ombb(klon)=0.0
     196   ! lmt_bcbbl(klon)=0.0
     197   ! lmt_bcbbh(klon)=0.0
     198   ! lmt_ombbl(klon)=0.0
     199   ! lmt_ombbh(klon)=0.0
     200   ! lmt_omnat(klon)=0.0
     201   ! lmt_omba(klon)=0.0
     202   ! lmt_terp(klon)=0.0
     203
     204
     205  ENDIF
    206206!$OMP END MASTER
    207207!$OMP BARRIER
    208       call scatter( lmt_bcff_glo   , lmt_bcff )   
    209       call scatter( lmt_bcnff_glo  , lmt_bcnff )
    210       call scatter( lmt_bcbbl_glo  , lmt_bcbbl )
    211       call scatter( lmt_bcbbh_glo  , lmt_bcbbh )
    212       call scatter( lmt_bcba_glo   , lmt_bcba )
    213       call scatter( lmt_omff_glo   , lmt_omff )
    214       call scatter( lmt_omnff_glo  , lmt_omnff )
    215       call scatter( lmt_ombbl_glo  , lmt_ombbl )
    216       call scatter( lmt_ombbh_glo  , lmt_ombbh )
    217       call scatter( lmt_omba_glo   , lmt_omba )
    218       call scatter( lmt_terp_glo   , lmt_terp )
    219       call scatter( lmt_omnat_glo  , lmt_omnat )
    220 
    221 
    222 
    223 
    224 
    225       RETURN
    226       END
     208  call scatter( lmt_bcff_glo   , lmt_bcff )
     209  call scatter( lmt_bcnff_glo  , lmt_bcnff )
     210  call scatter( lmt_bcbbl_glo  , lmt_bcbbl )
     211  call scatter( lmt_bcbbh_glo  , lmt_bcbbh )
     212  call scatter( lmt_bcba_glo   , lmt_bcba )
     213  call scatter( lmt_omff_glo   , lmt_omff )
     214  call scatter( lmt_omnff_glo  , lmt_omnff )
     215  call scatter( lmt_ombbl_glo  , lmt_ombbl )
     216  call scatter( lmt_ombbh_glo  , lmt_ombbh )
     217  call scatter( lmt_omba_glo   , lmt_omba )
     218  call scatter( lmt_terp_glo   , lmt_terp )
     219  call scatter( lmt_omnat_glo  , lmt_omnat )
     220
     221
     222
     223
     224
     225  RETURN
     226END SUBROUTINE condsurfc_new
  • LMDZ6/trunk/libf/phylmd/Dust/condsurfs.f90

    r5245 r5246  
    1       SUBROUTINE condsurfs(jour, edgar, flag_dms,
    2      .                     lmt_so2h, lmt_so2b, lmt_so2bb, lmt_so2ba,
    3      .                     lmt_so2volc, lmt_altvolc, 
    4      .                     lmt_dmsbio, lmt_h2sbio, lmt_dms, lmt_dmsconc)
    5        USE dimphy
    6       IMPLICIT none
    7 c
    8 c Lire les conditions aux limites du modele pour la chimie.
    9 c --------------------------------------------------------
    10 c
    11       INCLUDE "dimensions.h"
    12       INCLUDE "netcdf.inc"
    13 c
    14       REAL lmt_so2h(klon), lmt_so2b(klon), lmt_so2bb(klon)
    15       REAL lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)
    16       REAL lmt_so2volc(klon), lmt_altvolc(klon)
    17       REAL lmt_dms(klon), lmt_dmsconc(klon)
    18       LOGICAL edgar
    19       INTEGER flag_dms
    20 c
    21       INTEGER jour, i
    22       INTEGER ierr
    23       INTEGER nid,nvarid
    24       INTEGER debut(2),epais(2)
    25 c
    26       IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN
    27          IF ((jour.GT.(360-1)) .AND. (jour.LE.367)) THEN
    28            jour=360-1
    29            print *,'JE: jour changed to jour= ',jour
    30          ELSE
    31            PRINT*,'Le jour demande n est pas correcte:', jour
    32            CALL ABORT
    33          ENDIF
    34       ENDIF
    35 c
    36       ierr = NF_OPEN ("limitsoufre.nc", NF_NOWRITE, nid)
    37       if (ierr.ne.NF_NOERR) then
    38         write(6,*)' Pb d''ouverture du fichier limitsoufre.nc'
    39         write(6,*)' ierr = ', ierr
    40         call exit(1)
    41       endif
    42 c
    43 c Tranche a lire:
    44       debut(1) = 1
    45       debut(2) = jour+1
    46       epais(1) = klon
    47       epais(2) = 1
    48 c
    49       ierr = NF_INQ_VARID (nid, "VOLC", nvarid)
    50 cnhl #ifdef NC_DOUBLE
    51       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2volc)
    52 cnhl #else
    53 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2volc)
    54 cnhl #endif
    55       IF (ierr .NE. NF_NOERR) THEN
    56          PRINT*, 'Pb de lecture pour les sources so2 volcan'
    57          CALL exit(1)
    58       ENDIF
    59 c
    60       ierr = NF_INQ_VARID (nid, "ALTI", nvarid)
    61 cnhl #ifdef NC_DOUBLE
    62       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_altvolc)
    63 cnhl #else
    64 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_altvolc)
    65 cnhl #endif
    66       IF (ierr .NE. NF_NOERR) THEN
    67          PRINT*, 'Pb de lecture pour les altitudes volcan'
    68          CALL exit(1)
    69       ENDIF
    70 c
    71       IF (edgar) THEN   !--EDGAR w/o ship and biomass burning
    72 c
    73       ierr = NF_INQ_VARID (nid, "SO2ED95L", nvarid)
    74 cnhl #ifdef NC_DOUBLE
    75       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b)
    76 cnhl #else
    77 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)
    78 cnhl #endif
    79       IF (ierr .NE. NF_NOERR) THEN
    80          PRINT*, 'Pb de lecture pour les sources so2 edgar low'
    81          CALL exit(1)
    82       ENDIF
    83 c
    84       ierr = NF_INQ_VARID (nid, "SO2ED95H", nvarid)
    85 cnhl #ifdef NC_DOUBLE
    86       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h)
    87 cnhl #else
    88 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)
    89 cnhl #endif
    90       IF (ierr .NE. NF_NOERR) THEN
    91          PRINT*, 'Pb de lecture pour les sources so2 edgar high'
    92          CALL exit(1)
    93       ENDIF
    94 c
    95       ELSE  !--GEIA
    96 c
    97       ierr = NF_INQ_VARID (nid, "SO2H", nvarid)
    98 cnhl #ifdef NC_DOUBLE
    99       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h)
    100 cnhl #else
    101 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)
    102 cnhl #endif
    103       IF (ierr .NE. NF_NOERR) THEN
    104          PRINT*, 'Pb de lecture pour les sources so2 haut'
    105          CALL exit(1)
    106       ENDIF
    107 c
    108       ierr = NF_INQ_VARID (nid, "SO2B", nvarid)
    109 cnhl #ifdef NC_DOUBLE
    110       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b)
    111 cnhl #else
    112 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)
    113 cnhl #endif
    114       IF (ierr .NE. NF_NOERR) THEN
    115          PRINT*, 'Pb de lecture pour les sources so2 bas'
    116          CALL exit(1)
    117       ENDIF
    118 c
    119       ENDIF  !--edgar
    120 c
    121       ierr = NF_INQ_VARID (nid, "SO2BB", nvarid)
    122 cnhl #ifdef NC_DOUBLE
    123       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2bb)
    124 cnhl #else
    125 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2bb)
    126 cnhl #endif
    127       IF (ierr .NE. NF_NOERR) THEN
    128          PRINT*, 'Pb de lecture pour les sources so2 bb'
    129          CALL exit(1)
    130       ENDIF
    131 c
    132       ierr = NF_INQ_VARID (nid, "SO2BA", nvarid)
    133 cnhl #ifdef NC_DOUBLE
    134       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2ba)
    135 cnhl #else
    136 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2ba)
    137 cnhl #endif
    138       IF (ierr .NE. NF_NOERR) THEN
    139          PRINT*, 'Pb de lecture pour les sources so2 bateau'
    140          CALL exit(1)
    141       ENDIF
    142 c
    143       ierr = NF_INQ_VARID (nid, "DMSB", nvarid)
    144 cnhl #ifdef NC_DOUBLE
    145       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dmsbio)
    146 cnhl #else
    147 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsbio)
    148 cnhl #endif
    149       IF (ierr .NE. NF_NOERR) THEN
    150          PRINT*, 'Pb de lecture pour les sources dms bio'
    151          CALL exit(1)
    152       ENDIF
    153 c
    154       ierr = NF_INQ_VARID (nid, "H2SB", nvarid)
    155 cnhl #ifdef NC_DOUBLE
    156       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_h2sbio)
    157 cnhl #else
    158 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_h2sbio)
    159 cnhl #endif
    160       IF (ierr .NE. NF_NOERR) THEN
    161          PRINT*, 'Pb de lecture pour les sources h2s bio'
    162          CALL exit(1)
    163       ENDIF
    164 c
    165       IF (flag_dms.EQ.1) THEN
    166 c
    167       ierr = NF_INQ_VARID (nid, "DMSL", nvarid)
    168 cnhl #ifdef NC_DOUBLE
    169       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms)
    170 cnhl #else
    171 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)
    172 cnhl #endif
    173       IF (ierr .NE. NF_NOERR) THEN
    174          PRINT*, 'Pb de lecture pour les sources dms liss'
    175          CALL exit(1)
    176       ENDIF
    177 c
    178       ELSEIF (flag_dms.EQ.2) THEN
    179 c
    180       ierr = NF_INQ_VARID (nid, "DMSW", nvarid)
    181 cnhl #ifdef NC_DOUBLE
    182       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms)
    183 cnhl #else
    184 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)
    185 cnhl #endif
    186       IF (ierr .NE. NF_NOERR) THEN
    187          PRINT*, 'Pb de lecture pour les sources dms wann'
    188          CALL exit(1)
    189       ENDIF
    190 c
    191       ELSEIF (flag_dms.EQ.3) THEN
    192 c
    193       ierr = NF_INQ_VARID (nid, "DMSC1", nvarid)
    194 cnhl #ifdef NC_DOUBLE
    195       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    196 cnhl #else
    197 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    198 cnhl #endif
    199       IF (ierr .NE. NF_NOERR) THEN
    200          PRINT*, 'Pb de lecture pour les sources dmsconc old'
    201          CALL exit(1)
    202       ENDIF
    203 c
    204       ELSEIF (flag_dms.EQ.4) THEN
    205 c
    206       ierr = NF_INQ_VARID (nid, "DMSC2", nvarid)
    207 cnhl #ifdef NC_DOUBLE
    208       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    209 cnhl #else
    210 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    211 cnhl #endif
    212       IF (ierr .NE. NF_NOERR) THEN
    213          PRINT*, 'Pb de lecture pour les sources dms conc 2'
    214          CALL exit(1)
    215       ENDIF
    216 c
    217       ELSEIF (flag_dms.EQ.5) THEN
    218 c
    219       ierr = NF_INQ_VARID (nid, "DMSC3", nvarid)
    220 cnhl #ifdef NC_DOUBLE
    221       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    222 cnhl #else
    223 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    224 cnhl #endif
    225       IF (ierr .NE. NF_NOERR) THEN
    226          PRINT*, 'Pb de lecture pour les sources dms conc 3'
    227          CALL exit(1)
    228       ENDIF
    229 c
    230       ELSEIF (flag_dms.EQ.6) THEN
    231 c
    232       ierr = NF_INQ_VARID (nid, "DMSC4", nvarid)
    233 cnhl #ifdef NC_DOUBLE
    234       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    235 cnhl #else
    236 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    237 cnhl #endif
    238       IF (ierr .NE. NF_NOERR) THEN
    239          PRINT*, 'Pb de lecture pour les sources dms conc 4'
    240          CALL exit(1)
    241       ENDIF
    242 c
    243       ELSEIF (flag_dms.EQ.7) THEN
    244 c
    245       ierr = NF_INQ_VARID (nid, "DMSC5", nvarid)
    246 cnhl #ifdef NC_DOUBLE
    247       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    248 cnhl #else
    249 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    250 cnhl #endif
    251       IF (ierr .NE. NF_NOERR) THEN
    252          PRINT*, 'Pb de lecture pour les sources dms conc 5'
    253          CALL exit(1)
    254       ENDIF
    255 c
    256       ELSEIF (flag_dms.EQ.8) THEN
    257 c
    258       ierr = NF_INQ_VARID (nid, "DMSC6", nvarid)
    259 cnhl #ifdef NC_DOUBLE
    260       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    261 cnhl #else
    262 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    263 cnhl #endif
    264       IF (ierr .NE. NF_NOERR) THEN
    265          PRINT*, 'Pb de lecture pour les sources dms conc 6'
    266          CALL exit(1)
    267       ENDIF
    268 c
    269       ELSEIF (flag_dms.EQ.9) THEN
    270 c
    271       ierr = NF_INQ_VARID (nid, "DMSC7", nvarid)
    272 cnhl #ifdef NC_DOUBLE
    273       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    274 cnhl #else
    275 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    276 cnhl #endif
    277       IF (ierr .NE. NF_NOERR) THEN
    278          PRINT*, 'Pb de lecture pour les sources dms conc 7'
    279          CALL exit(1)
    280       ENDIF
    281 c
    282       ELSEIF (flag_dms.EQ.10) THEN
    283 c
    284       ierr = NF_INQ_VARID (nid, "DMSC8", nvarid)
    285 cnhl #ifdef NC_DOUBLE
    286       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
    287 cnhl #else
    288 cnhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
    289 cnhl #endif
    290       IF (ierr .NE. NF_NOERR) THEN
    291          PRINT*, 'Pb de lecture pour les sources dms conc 8'
    292          CALL exit(1)
    293       ENDIF
    294 c
    295       ELSE
    296 c
    297          PRINT *,'choix non possible pour flag_dms'
    298          STOP
    299 c
    300       ENDIF
    301 c
    302       ierr = NF_CLOSE(nid)
    303 c
    304       IF (flag_dms.LE.2) THEN
    305       DO i=1, klon
    306          lmt_dmsconc(i)=0.0
    307       ENDDO
    308       ELSE
    309       DO i=1, klon
    310          lmt_dms(i)=0.0
    311       ENDDO
    312       ENDIF
    313 c
    314       PRINT*, 'Sources SOUFRE lues pour jour: ', jour
    315 c
    316       RETURN
    317       END
     1SUBROUTINE condsurfs(jour, edgar, flag_dms, &
     2        lmt_so2h, lmt_so2b, lmt_so2bb, lmt_so2ba, &
     3        lmt_so2volc, lmt_altvolc, &
     4        lmt_dmsbio, lmt_h2sbio, lmt_dms, lmt_dmsconc)
     5   USE dimphy
     6  IMPLICIT none
     7  !
     8  ! Lire les conditions aux limites du modele pour la chimie.
     9  ! --------------------------------------------------------
     10  !
     11  INCLUDE "dimensions.h"
     12  INCLUDE "netcdf.inc"
     13  !
     14  REAL :: lmt_so2h(klon), lmt_so2b(klon), lmt_so2bb(klon)
     15  REAL :: lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)
     16  REAL :: lmt_so2volc(klon), lmt_altvolc(klon)
     17  REAL :: lmt_dms(klon), lmt_dmsconc(klon)
     18  LOGICAL :: edgar
     19  INTEGER :: flag_dms
     20  !
     21  INTEGER :: jour, i
     22  INTEGER :: ierr
     23  INTEGER :: nid,nvarid
     24  INTEGER :: debut(2),epais(2)
     25  !
     26  IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN
     27     IF ((jour.GT.(360-1)) .AND. (jour.LE.367)) THEN
     28       jour=360-1
     29       print *,'JE: jour changed to jour= ',jour
     30     ELSE
     31       PRINT*,'Le jour demande n est pas correcte:', jour
     32       CALL ABORT
     33     ENDIF
     34  ENDIF
     35  !
     36  ierr = NF_OPEN ("limitsoufre.nc", NF_NOWRITE, nid)
     37  if (ierr.ne.NF_NOERR) then
     38    write(6,*)' Pb d''ouverture du fichier limitsoufre.nc'
     39    write(6,*)' ierr = ', ierr
     40    call exit(1)
     41  endif
     42  !
     43  ! Tranche a lire:
     44  debut(1) = 1
     45  debut(2) = jour+1
     46  epais(1) = klon
     47  epais(2) = 1
     48  !
     49  ierr = NF_INQ_VARID (nid, "VOLC", nvarid)
     50  !nhl #ifdef NC_DOUBLE
     51  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2volc)
     52  !nhl #else
     53  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2volc)
     54  !nhl #endif
     55  IF (ierr .NE. NF_NOERR) THEN
     56     PRINT*, 'Pb de lecture pour les sources so2 volcan'
     57     CALL exit(1)
     58  ENDIF
     59  !
     60  ierr = NF_INQ_VARID (nid, "ALTI", nvarid)
     61  !nhl #ifdef NC_DOUBLE
     62  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_altvolc)
     63  !nhl #else
     64  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_altvolc)
     65  !nhl #endif
     66  IF (ierr .NE. NF_NOERR) THEN
     67     PRINT*, 'Pb de lecture pour les altitudes volcan'
     68     CALL exit(1)
     69  ENDIF
     70  !
     71  IF (edgar) THEN   !--EDGAR w/o ship and biomass burning
     72  !
     73  ierr = NF_INQ_VARID (nid, "SO2ED95L", nvarid)
     74  !nhl #ifdef NC_DOUBLE
     75  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b)
     76  !nhl #else
     77  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)
     78  !nhl #endif
     79  IF (ierr .NE. NF_NOERR) THEN
     80     PRINT*, 'Pb de lecture pour les sources so2 edgar low'
     81     CALL exit(1)
     82  ENDIF
     83  !
     84  ierr = NF_INQ_VARID (nid, "SO2ED95H", nvarid)
     85  !nhl #ifdef NC_DOUBLE
     86  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h)
     87  !nhl #else
     88  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)
     89  !nhl #endif
     90  IF (ierr .NE. NF_NOERR) THEN
     91     PRINT*, 'Pb de lecture pour les sources so2 edgar high'
     92     CALL exit(1)
     93  ENDIF
     94  !
     95  ELSE  !--GEIA
     96  !
     97  ierr = NF_INQ_VARID (nid, "SO2H", nvarid)
     98  !nhl #ifdef NC_DOUBLE
     99  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h)
     100  !nhl #else
     101  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)
     102  !nhl #endif
     103  IF (ierr .NE. NF_NOERR) THEN
     104     PRINT*, 'Pb de lecture pour les sources so2 haut'
     105     CALL exit(1)
     106  ENDIF
     107  !
     108  ierr = NF_INQ_VARID (nid, "SO2B", nvarid)
     109  !nhl #ifdef NC_DOUBLE
     110  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b)
     111  !nhl #else
     112  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)
     113  !nhl #endif
     114  IF (ierr .NE. NF_NOERR) THEN
     115     PRINT*, 'Pb de lecture pour les sources so2 bas'
     116     CALL exit(1)
     117  ENDIF
     118  !
     119  ENDIF  !--edgar
     120  !
     121  ierr = NF_INQ_VARID (nid, "SO2BB", nvarid)
     122  !nhl #ifdef NC_DOUBLE
     123  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2bb)
     124  !nhl #else
     125  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2bb)
     126  !nhl #endif
     127  IF (ierr .NE. NF_NOERR) THEN
     128     PRINT*, 'Pb de lecture pour les sources so2 bb'
     129     CALL exit(1)
     130  ENDIF
     131  !
     132  ierr = NF_INQ_VARID (nid, "SO2BA", nvarid)
     133  !nhl #ifdef NC_DOUBLE
     134  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2ba)
     135  !nhl #else
     136  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2ba)
     137  !nhl #endif
     138  IF (ierr .NE. NF_NOERR) THEN
     139     PRINT*, 'Pb de lecture pour les sources so2 bateau'
     140     CALL exit(1)
     141  ENDIF
     142  !
     143  ierr = NF_INQ_VARID (nid, "DMSB", nvarid)
     144  !nhl #ifdef NC_DOUBLE
     145  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dmsbio)
     146  !nhl #else
     147  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsbio)
     148  !nhl #endif
     149  IF (ierr .NE. NF_NOERR) THEN
     150     PRINT*, 'Pb de lecture pour les sources dms bio'
     151     CALL exit(1)
     152  ENDIF
     153  !
     154  ierr = NF_INQ_VARID (nid, "H2SB", nvarid)
     155  !nhl #ifdef NC_DOUBLE
     156  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_h2sbio)
     157  !nhl #else
     158  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_h2sbio)
     159  !nhl #endif
     160  IF (ierr .NE. NF_NOERR) THEN
     161     PRINT*, 'Pb de lecture pour les sources h2s bio'
     162     CALL exit(1)
     163  ENDIF
     164  !
     165  IF (flag_dms.EQ.1) THEN
     166  !
     167  ierr = NF_INQ_VARID (nid, "DMSL", nvarid)
     168  !nhl #ifdef NC_DOUBLE
     169  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms)
     170  !nhl #else
     171  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)
     172  !nhl #endif
     173  IF (ierr .NE. NF_NOERR) THEN
     174     PRINT*, 'Pb de lecture pour les sources dms liss'
     175     CALL exit(1)
     176  ENDIF
     177  !
     178  ELSEIF (flag_dms.EQ.2) THEN
     179  !
     180  ierr = NF_INQ_VARID (nid, "DMSW", nvarid)
     181  !nhl #ifdef NC_DOUBLE
     182  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms)
     183  !nhl #else
     184  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)
     185  !nhl #endif
     186  IF (ierr .NE. NF_NOERR) THEN
     187     PRINT*, 'Pb de lecture pour les sources dms wann'
     188     CALL exit(1)
     189  ENDIF
     190  !
     191  ELSEIF (flag_dms.EQ.3) THEN
     192  !
     193  ierr = NF_INQ_VARID (nid, "DMSC1", nvarid)
     194  !nhl #ifdef NC_DOUBLE
     195  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     196  !nhl #else
     197  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     198  !nhl #endif
     199  IF (ierr .NE. NF_NOERR) THEN
     200     PRINT*, 'Pb de lecture pour les sources dmsconc old'
     201     CALL exit(1)
     202  ENDIF
     203  !
     204  ELSEIF (flag_dms.EQ.4) THEN
     205  !
     206  ierr = NF_INQ_VARID (nid, "DMSC2", nvarid)
     207  !nhl #ifdef NC_DOUBLE
     208  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     209  !nhl #else
     210  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     211  !nhl #endif
     212  IF (ierr .NE. NF_NOERR) THEN
     213     PRINT*, 'Pb de lecture pour les sources dms conc 2'
     214     CALL exit(1)
     215  ENDIF
     216  !
     217  ELSEIF (flag_dms.EQ.5) THEN
     218  !
     219  ierr = NF_INQ_VARID (nid, "DMSC3", nvarid)
     220  !nhl #ifdef NC_DOUBLE
     221  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     222  !nhl #else
     223  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     224  !nhl #endif
     225  IF (ierr .NE. NF_NOERR) THEN
     226     PRINT*, 'Pb de lecture pour les sources dms conc 3'
     227     CALL exit(1)
     228  ENDIF
     229  !
     230  ELSEIF (flag_dms.EQ.6) THEN
     231  !
     232  ierr = NF_INQ_VARID (nid, "DMSC4", nvarid)
     233  !nhl #ifdef NC_DOUBLE
     234  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     235  !nhl #else
     236  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     237  !nhl #endif
     238  IF (ierr .NE. NF_NOERR) THEN
     239     PRINT*, 'Pb de lecture pour les sources dms conc 4'
     240     CALL exit(1)
     241  ENDIF
     242  !
     243  ELSEIF (flag_dms.EQ.7) THEN
     244  !
     245  ierr = NF_INQ_VARID (nid, "DMSC5", nvarid)
     246  !nhl #ifdef NC_DOUBLE
     247  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     248  !nhl #else
     249  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     250  !nhl #endif
     251  IF (ierr .NE. NF_NOERR) THEN
     252     PRINT*, 'Pb de lecture pour les sources dms conc 5'
     253     CALL exit(1)
     254  ENDIF
     255  !
     256  ELSEIF (flag_dms.EQ.8) THEN
     257  !
     258  ierr = NF_INQ_VARID (nid, "DMSC6", nvarid)
     259  !nhl #ifdef NC_DOUBLE
     260  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     261  !nhl #else
     262  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     263  !nhl #endif
     264  IF (ierr .NE. NF_NOERR) THEN
     265     PRINT*, 'Pb de lecture pour les sources dms conc 6'
     266     CALL exit(1)
     267  ENDIF
     268  !
     269  ELSEIF (flag_dms.EQ.9) THEN
     270  !
     271  ierr = NF_INQ_VARID (nid, "DMSC7", nvarid)
     272  !nhl #ifdef NC_DOUBLE
     273  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     274  !nhl #else
     275  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     276  !nhl #endif
     277  IF (ierr .NE. NF_NOERR) THEN
     278     PRINT*, 'Pb de lecture pour les sources dms conc 7'
     279     CALL exit(1)
     280  ENDIF
     281  !
     282  ELSEIF (flag_dms.EQ.10) THEN
     283  !
     284  ierr = NF_INQ_VARID (nid, "DMSC8", nvarid)
     285  !nhl #ifdef NC_DOUBLE
     286  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc)
     287  !nhl #else
     288  !nhl       ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)
     289  !nhl #endif
     290  IF (ierr .NE. NF_NOERR) THEN
     291     PRINT*, 'Pb de lecture pour les sources dms conc 8'
     292     CALL exit(1)
     293  ENDIF
     294  !
     295  ELSE
     296  !
     297     PRINT *,'choix non possible pour flag_dms'
     298     STOP
     299  !
     300  ENDIF
     301  !
     302  ierr = NF_CLOSE(nid)
     303  !
     304  IF (flag_dms.LE.2) THEN
     305  DO i=1, klon
     306     lmt_dmsconc(i)=0.0
     307  ENDDO
     308  ELSE
     309  DO i=1, klon
     310     lmt_dms(i)=0.0
     311  ENDDO
     312  ENDIF
     313  !
     314  PRINT*, 'Sources SOUFRE lues pour jour: ', jour
     315  !
     316  RETURN
     317END SUBROUTINE condsurfs
  • LMDZ6/trunk/libf/phylmd/Dust/condsurfs_new.f90

    r5245 r5246  
    1       SUBROUTINE condsurfs_new(jour, edgar, flag_dms,
    2      .                         lmt_so2b, lmt_so2h, lmt_so2nff,
    3      .                         lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba,
    4      .                         lmt_so2volc_cont, lmt_altvolc_cont, 
    5      .                         lmt_so2volc_expl, lmt_altvolc_expl, 
    6      .                         lmt_dmsbio, lmt_h2sbio, lmt_dms,
    7      .                                                      lmt_dmsconc)
    8       USE mod_grid_phy_lmdz
    9       USE mod_phys_lmdz_para
    10       USE dimphy
    11       IMPLICIT none
    12 c
    13 c Lire les conditions aux limites du modele pour la chimie.
    14 c --------------------------------------------------------
    15 c
    16       INCLUDE "dimensions.h"
    17       INCLUDE "netcdf.inc"
    18 c
    19       REAL lmt_so2b(klon), lmt_so2h(klon), lmt_so2nff(klon)
    20       REAL lmt_so2bb_l(klon), lmt_so2bb_h(klon)
    21       REAL lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)
    22       REAL lmt_so2volc_cont(klon), lmt_altvolc_cont(klon)
    23       REAL lmt_so2volc_expl(klon), lmt_altvolc_expl(klon)
    24       REAL lmt_dms(klon), lmt_dmsconc(klon)
    25 
    26       REAL lmt_so2b_glo(klon_glo), lmt_so2h_glo(klon_glo)
    27       REAL lmt_so2nff_glo(klon_glo)
    28       REAL lmt_so2bb_l_glo(klon_glo), lmt_so2bb_h_glo(klon_glo)
    29       REAL lmt_dmsbio_glo(klon_glo), lmt_h2sbio_glo(klon_glo)
    30       REAL lmt_so2ba_glo(klon_glo)
    31       REAL lmt_so2volc_cont_glo(klon_glo),lmt_altvolc_cont_glo(klon_glo)
    32       REAL lmt_so2volc_expl_glo(klon_glo),lmt_altvolc_expl_glo(klon_glo)
    33       REAL lmt_dms_glo(klon_glo), lmt_dmsconc_glo(klon_glo)
    34       LOGICAL edgar
    35       INTEGER flag_dms
    36 c
    37       INTEGER jour, i
    38       INTEGER ierr
    39       INTEGER nid,nvarid
    40       INTEGER debut(2),epais(2)
    41 c
    42       IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN
    43          PRINT*,'Le jour demande n est pas correcte:', jour
    44          print *,'JE: FORCED TO CONTINUE (emissions have
    45      . to be longer than 1 year!!!! )'
    46 !        CALL ABORT
    47       ENDIF
    48 !
     1SUBROUTINE condsurfs_new(jour, edgar, flag_dms, &
     2        lmt_so2b, lmt_so2h, lmt_so2nff, &
     3        lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba, &
     4        lmt_so2volc_cont, lmt_altvolc_cont, &
     5        lmt_so2volc_expl, lmt_altvolc_expl, &
     6        lmt_dmsbio, lmt_h2sbio, lmt_dms, &
     7        lmt_dmsconc)
     8  USE mod_grid_phy_lmdz
     9  USE mod_phys_lmdz_para
     10  USE dimphy
     11  IMPLICIT none
     12  !
     13  ! Lire les conditions aux limites du modele pour la chimie.
     14  ! --------------------------------------------------------
     15  !
     16  INCLUDE "dimensions.h"
     17  INCLUDE "netcdf.inc"
     18  !
     19  REAL :: lmt_so2b(klon), lmt_so2h(klon), lmt_so2nff(klon)
     20  REAL :: lmt_so2bb_l(klon), lmt_so2bb_h(klon)
     21  REAL :: lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)
     22  REAL :: lmt_so2volc_cont(klon), lmt_altvolc_cont(klon)
     23  REAL :: lmt_so2volc_expl(klon), lmt_altvolc_expl(klon)
     24  REAL :: lmt_dms(klon), lmt_dmsconc(klon)
     25
     26  REAL :: lmt_so2b_glo(klon_glo), lmt_so2h_glo(klon_glo)
     27  REAL :: lmt_so2nff_glo(klon_glo)
     28  REAL :: lmt_so2bb_l_glo(klon_glo), lmt_so2bb_h_glo(klon_glo)
     29  REAL :: lmt_dmsbio_glo(klon_glo), lmt_h2sbio_glo(klon_glo)
     30  REAL :: lmt_so2ba_glo(klon_glo)
     31  REAL :: lmt_so2volc_cont_glo(klon_glo),lmt_altvolc_cont_glo(klon_glo)
     32  REAL :: lmt_so2volc_expl_glo(klon_glo),lmt_altvolc_expl_glo(klon_glo)
     33  REAL :: lmt_dms_glo(klon_glo), lmt_dmsconc_glo(klon_glo)
     34  LOGICAL :: edgar
     35  INTEGER :: flag_dms
     36  !
     37  INTEGER :: jour, i
     38  INTEGER :: ierr
     39  INTEGER :: nid,nvarid
     40  INTEGER :: debut(2),epais(2)
     41  !
     42  IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN
     43     PRINT*,'Le jour demande n est pas correcte:', jour
     44     print *,'JE: FORCED TO CONTINUE (emissions have&
     45           & to be longer than 1 year!!!! )'
     46      ! CALL ABORT
     47  ENDIF
     48  !
    4949
    5050!$OMP MASTER
    51       IF (is_mpi_root .AND. is_omp_root) THEN
    52 
    53 c Tranche a lire:
    54       debut(1) = 1
    55       debut(2) = jour
    56 !      epais(1) = klon
    57       epais(1) = klon_glo
    58       epais(2) = 1
    59 !=======================================================================
    60 !                READING NEW EMISSIONS FROM RCP
    61 !=======================================================================
    62 !
    63       ierr = NF_OPEN ("sulphur_emissions_antro.nc", NF_NOWRITE, nid)
    64       if (ierr.ne.NF_NOERR) then
    65         write(6,*)' Pb d''ouverture du fichier sulphur_emissions_antro'
    66         write(6,*)' ierr = ', ierr
    67         call exit(1)
    68       endif
    69 
    70 !
    71 ! SO2 Low level emissions
    72 !
    73       ierr = NF_INQ_VARID (nid, "SO2FF_LOW", nvarid)
    74       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2b_glo)
    75       IF (ierr .NE. NF_NOERR) THEN
    76         PRINT*, 'Pb de lecture pour les sources so2 low'
    77         print *,'JE klon, jour, debut ,epais ',klon_glo,jour,debut,epais
    78         CALL HANDLE_ERR(ierr)
    79         print *,'error ierr= ',ierr
    80         CALL exit(1)
    81       ENDIF
    82 !
    83 ! SO2 High level emissions
    84 !
    85       ierr = NF_INQ_VARID (nid, "SO2FF_HIGH", nvarid)
    86       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2h_glo)
    87       IF (ierr .NE. NF_NOERR) THEN
    88         PRINT*, 'Pb de lecture pour les sources so2 high'
    89         CALL exit(1)
    90       ENDIF
    91 !
    92 ! SO2 Biomass burning High level emissions
    93 !
    94       ierr = NF_INQ_VARID (nid, "SO2BBH", nvarid)
    95       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,
    96      . epais, lmt_so2bb_h_glo)
    97       IF (ierr .NE. NF_NOERR) THEN
    98         PRINT*, 'Pb de lecture pour les sources so2 BB high'
    99         CALL exit(1)
    100       ENDIF
    101 !
    102 ! SO2 biomass burning low level emissions
    103 !
    104       ierr = NF_INQ_VARID (nid, "SO2BBL", nvarid)
    105       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,
    106      . epais, lmt_so2bb_l_glo)
    107       IF (ierr .NE. NF_NOERR) THEN
    108         PRINT*, 'Pb de lecture pour les sources so2 BB low'
    109         CALL exit(1)
    110       ENDIF
    111 !
    112 ! SO2 ship emissions
    113 !
    114       ierr = NF_INQ_VARID (nid, "SO2BA", nvarid)
    115       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_so2ba_glo)
    116       IF (ierr .NE. NF_NOERR) THEN
    117         PRINT*, 'Pb de lecture pour les sources so2 ship'
    118         CALL exit(1)
    119       ENDIF
    120 !
    121 ! SO2 Non Fossil Fuel Emissions
    122 !
    123       ierr = NF_INQ_VARID (nid, "SO2NFF", nvarid)
    124       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,
    125      .  lmt_so2nff_glo)
    126       IF (ierr .NE. NF_NOERR) THEN
    127         PRINT*, 'Pb de lecture pour les sources so2 non FF'
    128         CALL exit(1)
    129       ENDIF
    130 !
    131       ierr = NF_CLOSE(nid)
    132 !
    133 !=======================================================================
    134 !                      READING NATURAL EMISSIONS
    135 !=======================================================================
    136       ierr = NF_OPEN ("sulphur_emissions_nat.nc", NF_NOWRITE, nid)
    137       if (ierr.ne.NF_NOERR) then
    138         write(6,*)' Pb d''ouverture du fichier sulphur_emissions_nat'
    139         write(6,*)' ierr = ', ierr
    140         call exit(1)
    141       endif
    142 c
    143 c Biologenic source of DMS
    144 c
    145       ierr = NF_INQ_VARID (nid, "DMSB", nvarid)
    146       ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_dmsbio_glo)
    147       IF (ierr .NE. NF_NOERR) THEN
    148          PRINT*, 'Pb de lecture pour les sources dms bio'
    149          CALL exit(1)
    150       ENDIF
    151 c
    152 c Biologenic source of H2S
    153 c
    154       ierr = NF_INQ_VARID (nid, "H2SB", nvarid)
    155       ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_h2sbio_glo)
    156       IF (ierr .NE. NF_NOERR) THEN
    157          PRINT*, 'Pb de lecture pour les sources h2s bio'
    158          CALL exit(1)
    159       ENDIF
    160 c
    161 c Ocean surface concentration of dms (emissions are computed later)
    162 c
    163       IF (flag_dms.EQ.4) THEN
    164 c
    165       ierr = NF_INQ_VARID (nid, "DMSC2", nvarid)
    166       ierr = NF_GET_VARA_DOUBLE (nid,nvarid,debut,epais,lmt_dmsconc_glo)
    167       IF (ierr .NE. NF_NOERR) THEN
    168          PRINT*, 'Pb de lecture pour les sources dms conc 2'
    169          CALL exit(1)
    170       ENDIF
    171 c
    172       DO i=1, klon
    173 !        lmt_dms(i)=0.0
    174          lmt_dms_glo(i)=0.0
    175       ENDDO
    176 c
    177       ELSE
    178 c
    179          PRINT *,'choix non possible pour flag_dms'
    180          STOP
    181 
    182       ENDIF
    183 c
    184       ierr = NF_CLOSE(nid)
    185 c
    186 !=======================================================================
    187 !                      READING VOLCANIC EMISSIONS
    188 !=======================================================================
    189       print *,'   ***      READING VOLCANIC EMISSIONS   ***   '
    190       print *,' Jour = ',jour
    191       ierr = NF_OPEN ("sulphur_emissions_volc.nc", NF_NOWRITE, nid)
    192       if (ierr.ne.NF_NOERR) then
    193         write(6,*)' Pb d''ouverture du fichier sulphur_emissions_volc'
    194         write(6,*)' ierr = ', ierr
    195         call exit(1)
    196       endif
    197 c
    198 c Continuous Volcanic emissions
    199 c
    200 !      ierr = NF_INQ_VARID (nid, "VOLC", nvarid)
    201       ierr = NF_INQ_VARID (nid, "flx_volc_cont", nvarid)
    202       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,
    203      .                           lmt_so2volc_cont_glo)
    204       IF (ierr .NE. NF_NOERR) THEN
    205          PRINT*, 'Pb de lecture pour les sources so2 volcan (cont)'
    206          CALL exit(1)
    207       ENDIF
    208       print *,'SO2 volc cont (in read) = ',SUM(lmt_so2volc_cont_glo),
    209      +      MINVAL(lmt_so2volc_cont_glo),MAXVAL(lmt_so2volc_cont_glo)
    210 !      lmt_so2volc(:)=0.0
    211 c
    212 c Altitud of continuous volcanic emissions
    213 c
    214 !      ierr = NF_INQ_VARID (nid, "ALTI", nvarid)
    215       ierr = NF_INQ_VARID (nid, "flx_volc_altcont", nvarid)
    216       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,
    217      .                           lmt_altvolc_cont_glo)
    218       IF (ierr .NE. NF_NOERR) THEN
    219          PRINT*, 'Pb de lecture pour les altitudes volcan (cont)'
    220          CALL exit(1)
    221       ENDIF
    222 c
    223 c Explosive Volcanic emissions
    224 c
    225       ierr = NF_INQ_VARID (nid, "flx_volc_expl", nvarid)
    226       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,
    227      .                           lmt_so2volc_expl_glo)
    228       IF (ierr .NE. NF_NOERR) THEN
    229          PRINT*, 'Pb de lecture pour les sources so2 volcan (expl)'
    230          CALL exit(1)
    231       ENDIF
    232 !      lmt_so2volc_expl(:)=0.0
    233       print *,'SO2 volc expl (in read) = ',SUM(lmt_so2volc_expl_glo),
    234      +      MINVAL(lmt_so2volc_expl_glo),MAXVAL(lmt_so2volc_expl_glo)
    235 c
    236 c Altitud of explosive volcanic emissions
    237 c
    238       ierr = NF_INQ_VARID (nid, "flx_volc_altexpl", nvarid)
    239       ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,
    240      .                           lmt_altvolc_expl_glo)
    241       IF (ierr .NE. NF_NOERR) THEN
    242          PRINT*, 'Pb de lecture pour les altitudes volcan'
    243          CALL exit(1)
    244       ENDIF
    245 !      lmt_altvolc_expl(:)=0.0
    246 
    247       ierr = NF_CLOSE(nid)
    248 c
    249       PRINT*, 'Sources SOUFRE lues pour jour: ', jour
    250 c
    251 
    252 
    253       ENDIF
     51  IF (is_mpi_root .AND. is_omp_root) THEN
     52
     53  ! Tranche a lire:
     54  debut(1) = 1
     55  debut(2) = jour
     56   ! epais(1) = klon
     57  epais(1) = klon_glo
     58  epais(2) = 1
     59  !=======================================================================
     60              ! READING NEW EMISSIONS FROM RCP
     61  !=======================================================================
     62  !
     63  ierr = NF_OPEN ("sulphur_emissions_antro.nc", NF_NOWRITE, nid)
     64  if (ierr.ne.NF_NOERR) then
     65    write(6,*)' Pb d''ouverture du fichier sulphur_emissions_antro'
     66    write(6,*)' ierr = ', ierr
     67    call exit(1)
     68  endif
     69
     70  !
     71  ! SO2 Low level emissions
     72  !
     73  ierr = NF_INQ_VARID (nid, "SO2FF_LOW", nvarid)
     74  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2b_glo)
     75  IF (ierr .NE. NF_NOERR) THEN
     76    PRINT*, 'Pb de lecture pour les sources so2 low'
     77    print *,'JE klon, jour, debut ,epais ',klon_glo,jour,debut,epais
     78    CALL HANDLE_ERR(ierr)
     79    print *,'error ierr= ',ierr
     80    CALL exit(1)
     81  ENDIF
     82  !
     83  ! SO2 High level emissions
     84  !
     85  ierr = NF_INQ_VARID (nid, "SO2FF_HIGH", nvarid)
     86  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2h_glo)
     87  IF (ierr .NE. NF_NOERR) THEN
     88    PRINT*, 'Pb de lecture pour les sources so2 high'
     89    CALL exit(1)
     90  ENDIF
     91  !
     92  ! SO2 Biomass burning High level emissions
     93  !
     94  ierr = NF_INQ_VARID (nid, "SO2BBH", nvarid)
     95  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, &
     96       epais, lmt_so2bb_h_glo)
     97  IF (ierr .NE. NF_NOERR) THEN
     98    PRINT*, 'Pb de lecture pour les sources so2 BB high'
     99    CALL exit(1)
     100  ENDIF
     101  !
     102  ! SO2 biomass burning low level emissions
     103  !
     104  ierr = NF_INQ_VARID (nid, "SO2BBL", nvarid)
     105  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, &
     106       epais, lmt_so2bb_l_glo)
     107  IF (ierr .NE. NF_NOERR) THEN
     108    PRINT*, 'Pb de lecture pour les sources so2 BB low'
     109    CALL exit(1)
     110  ENDIF
     111  !
     112  ! SO2 ship emissions
     113  !
     114  ierr = NF_INQ_VARID (nid, "SO2BA", nvarid)
     115  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_so2ba_glo)
     116  IF (ierr .NE. NF_NOERR) THEN
     117    PRINT*, 'Pb de lecture pour les sources so2 ship'
     118    CALL exit(1)
     119  ENDIF
     120  !
     121  ! SO2 Non Fossil Fuel Emissions
     122  !
     123  ierr = NF_INQ_VARID (nid, "SO2NFF", nvarid)
     124  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, &
     125        lmt_so2nff_glo)
     126  IF (ierr .NE. NF_NOERR) THEN
     127    PRINT*, 'Pb de lecture pour les sources so2 non FF'
     128    CALL exit(1)
     129  ENDIF
     130  !
     131  ierr = NF_CLOSE(nid)
     132  !
     133  !=======================================================================
     134                   ! READING NATURAL EMISSIONS
     135  !=======================================================================
     136  ierr = NF_OPEN ("sulphur_emissions_nat.nc", NF_NOWRITE, nid)
     137  if (ierr.ne.NF_NOERR) then
     138    write(6,*)' Pb d''ouverture du fichier sulphur_emissions_nat'
     139    write(6,*)' ierr = ', ierr
     140    call exit(1)
     141  endif
     142  !
     143  ! Biologenic source of DMS
     144  !
     145  ierr = NF_INQ_VARID (nid, "DMSB", nvarid)
     146  ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_dmsbio_glo)
     147  IF (ierr .NE. NF_NOERR) THEN
     148     PRINT*, 'Pb de lecture pour les sources dms bio'
     149     CALL exit(1)
     150  ENDIF
     151  !
     152  ! Biologenic source of H2S
     153  !
     154  ierr = NF_INQ_VARID (nid, "H2SB", nvarid)
     155  ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_h2sbio_glo)
     156  IF (ierr .NE. NF_NOERR) THEN
     157     PRINT*, 'Pb de lecture pour les sources h2s bio'
     158     CALL exit(1)
     159  ENDIF
     160  !
     161  ! Ocean surface concentration of dms (emissions are computed later)
     162  !
     163  IF (flag_dms.EQ.4) THEN
     164  !
     165  ierr = NF_INQ_VARID (nid, "DMSC2", nvarid)
     166  ierr = NF_GET_VARA_DOUBLE (nid,nvarid,debut,epais,lmt_dmsconc_glo)
     167  IF (ierr .NE. NF_NOERR) THEN
     168     PRINT*, 'Pb de lecture pour les sources dms conc 2'
     169     CALL exit(1)
     170  ENDIF
     171  !
     172  DO i=1, klon
     173      ! lmt_dms(i)=0.0
     174     lmt_dms_glo(i)=0.0
     175  ENDDO
     176  !
     177  ELSE
     178  !
     179     PRINT *,'choix non possible pour flag_dms'
     180     STOP
     181
     182  ENDIF
     183  !
     184  ierr = NF_CLOSE(nid)
     185  !
     186  !=======================================================================
     187  !                  READING VOLCANIC EMISSIONS
     188  !=======================================================================
     189  print *,'   ***      READING VOLCANIC EMISSIONS   ***   '
     190  print *,' Jour = ',jour
     191  ierr = NF_OPEN ("sulphur_emissions_volc.nc", NF_NOWRITE, nid)
     192  if (ierr.ne.NF_NOERR) then
     193    write(6,*)' Pb d''ouverture du fichier sulphur_emissions_volc'
     194    write(6,*)' ierr = ', ierr
     195    call exit(1)
     196  endif
     197  !
     198  ! Continuous Volcanic emissions
     199  !
     200  !  ierr = NF_INQ_VARID (nid, "VOLC", nvarid)
     201  ierr = NF_INQ_VARID (nid, "flx_volc_cont", nvarid)
     202  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, &
     203        lmt_so2volc_cont_glo)
     204  IF (ierr .NE. NF_NOERR) THEN
     205     PRINT*, 'Pb de lecture pour les sources so2 volcan (cont)'
     206     CALL exit(1)
     207  ENDIF
     208  print *,'SO2 volc cont (in read) = ',SUM(lmt_so2volc_cont_glo), &
     209        MINVAL(lmt_so2volc_cont_glo),MAXVAL(lmt_so2volc_cont_glo)
     210   ! lmt_so2volc(:)=0.0
     211  !
     212  ! Altitud of continuous volcanic emissions
     213  !
     214  !  ierr = NF_INQ_VARID (nid, "ALTI", nvarid)
     215  ierr = NF_INQ_VARID (nid, "flx_volc_altcont", nvarid)
     216  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, &
     217        lmt_altvolc_cont_glo)
     218  IF (ierr .NE. NF_NOERR) THEN
     219     PRINT*, 'Pb de lecture pour les altitudes volcan (cont)'
     220     CALL exit(1)
     221  ENDIF
     222  !
     223  ! Explosive Volcanic emissions
     224  !
     225  ierr = NF_INQ_VARID (nid, "flx_volc_expl", nvarid)
     226  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, &
     227        lmt_so2volc_expl_glo)
     228  IF (ierr .NE. NF_NOERR) THEN
     229     PRINT*, 'Pb de lecture pour les sources so2 volcan (expl)'
     230     CALL exit(1)
     231  ENDIF
     232   ! lmt_so2volc_expl(:)=0.0
     233  print *,'SO2 volc expl (in read) = ',SUM(lmt_so2volc_expl_glo), &
     234        MINVAL(lmt_so2volc_expl_glo),MAXVAL(lmt_so2volc_expl_glo)
     235  !
     236  ! Altitud of explosive volcanic emissions
     237  !
     238  ierr = NF_INQ_VARID (nid, "flx_volc_altexpl", nvarid)
     239  ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, &
     240        lmt_altvolc_expl_glo)
     241  IF (ierr .NE. NF_NOERR) THEN
     242     PRINT*, 'Pb de lecture pour les altitudes volcan'
     243     CALL exit(1)
     244  ENDIF
     245   ! lmt_altvolc_expl(:)=0.0
     246
     247  ierr = NF_CLOSE(nid)
     248  !
     249  PRINT*, 'Sources SOUFRE lues pour jour: ', jour
     250  !
     251
     252
     253  ENDIF
    254254!$OMP END MASTER
    255255!$OMP BARRIER
    256       call scatter( lmt_so2b_glo        , lmt_so2b )
    257       call scatter(lmt_so2h_glo         , lmt_so2h ) 
    258       call scatter(lmt_so2bb_h_glo      , lmt_so2bb_h )
    259       call scatter(lmt_so2bb_l_glo      , lmt_so2bb_l)
    260       call scatter(lmt_so2ba_glo        , lmt_so2ba)
    261       call scatter(lmt_so2nff_glo       , lmt_so2nff)
    262       call scatter(lmt_dmsbio_glo       , lmt_dmsbio)
    263       call scatter(lmt_h2sbio_glo       , lmt_h2sbio)
    264       call scatter(lmt_dmsconc_glo      , lmt_dmsconc)
    265       call scatter(lmt_dms_glo          , lmt_dms)
    266       call scatter(lmt_so2volc_cont_glo , lmt_so2volc_cont)
    267       call scatter(lmt_altvolc_cont_glo , lmt_altvolc_cont)
    268       call scatter(lmt_so2volc_expl_glo , lmt_so2volc_expl)
    269       call scatter(lmt_altvolc_expl_glo , lmt_altvolc_expl)
    270 
    271 
    272       RETURN
    273       END
     256  call scatter( lmt_so2b_glo        , lmt_so2b )
     257  call scatter(lmt_so2h_glo         , lmt_so2h )
     258  call scatter(lmt_so2bb_h_glo      , lmt_so2bb_h )
     259  call scatter(lmt_so2bb_l_glo      , lmt_so2bb_l)
     260  call scatter(lmt_so2ba_glo        , lmt_so2ba)
     261  call scatter(lmt_so2nff_glo       , lmt_so2nff)
     262  call scatter(lmt_dmsbio_glo       , lmt_dmsbio)
     263  call scatter(lmt_h2sbio_glo       , lmt_h2sbio)
     264  call scatter(lmt_dmsconc_glo      , lmt_dmsconc)
     265  call scatter(lmt_dms_glo          , lmt_dms)
     266  call scatter(lmt_so2volc_cont_glo , lmt_so2volc_cont)
     267  call scatter(lmt_altvolc_cont_glo , lmt_altvolc_cont)
     268  call scatter(lmt_so2volc_expl_glo , lmt_so2volc_expl)
     269  call scatter(lmt_altvolc_expl_glo , lmt_altvolc_expl)
     270
     271
     272  RETURN
     273END SUBROUTINE condsurfs_new
  • LMDZ6/trunk/libf/phylmd/Dust/deposition.f90

    r5245 r5246  
    1 c Subroutine that estimates the Deposition velocities and the depostion
    2 C for the different tracers
    3       subroutine deposition(vdep_oce,vdep_sic,vdep_ter,vdep_lic,pctsrf,
    4      .                      zrho,zdz,pdtphys,RHcl,masse,t_seri,pplay,
    5      .                      paprs,lminmax,qmin,qmax,
    6      .                        his_ds,source_tr,tr_seri)
     1! Subroutine that estimates the Deposition velocities and the depostion
     2! for the different tracers
     3subroutine deposition(vdep_oce,vdep_sic,vdep_ter,vdep_lic,pctsrf, &
     4        zrho,zdz,pdtphys,RHcl,masse,t_seri,pplay, &
     5        paprs,lminmax,qmin,qmax, &
     6        his_ds,source_tr,tr_seri)
    77
    8       USE dimphy
    9       USE infotrac
    10       USE indice_sol_mod
     8  USE dimphy
     9  USE infotrac
     10  USE indice_sol_mod
    1111
    12       IMPLICIT NONE
     12  IMPLICIT NONE
    1313
    14       INCLUDE "dimensions.h"
    15       INCLUDE "chem.h"
    16       INCLUDE "YOMCST.h"
    17       INCLUDE "paramet.h"
     14  INCLUDE "dimensions.h"
     15  INCLUDE "chem.h"
     16  INCLUDE "YOMCST.h"
     17  INCLUDE "paramet.h"
    1818
    19 c----------------------------- INPUT -----------------------------------
    20       LOGICAL lminmax
    21       REAL qmin, qmax
    22       REAL vdep_oce(nbtr), vdep_sic(nbtr)
    23       REAL vdep_ter(nbtr), vdep_lic(nbtr)     
    24       REAL pctsrf(klon,nbsrf)
    25       REAL zrho(klon,klev)        !Density of air at mid points of Z (kg/m3)
    26       REAL zdz(klon,klev)       
    27       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    28       REAL RHcl(klon,klev)  ! humidite relativen ciel clair
    29       REAL t_seri(klon,klev)  ! temperature
    30       REAL pplay(klon,klev)  ! pression pour le mileu de chaque couche (en Pa)
    31       REAL paprs(klon, klev+1)    !pressure at interface of layers Z (Pa)
    32       REAL masse(nbtr)
    33                                          
    34 c----------------------------- OUTPUT ----------------------------------
    35       REAL his_ds(klon,nbtr)                                         
    36       REAL source_tr(klon,nbtr)
    37       REAL tr_seri(klon, klev,nbtr) !conc of tracers
    38 c--------------------- INTERNAL VARIABLES ------------------------------     
    39       INTEGER i, it
    40       REAL vdep        !sed. velocity
     19  !----------------------------- INPUT -----------------------------------
     20  LOGICAL :: lminmax
     21  REAL :: qmin, qmax
     22  REAL :: vdep_oce(nbtr), vdep_sic(nbtr)
     23  REAL :: vdep_ter(nbtr), vdep_lic(nbtr)
     24  REAL :: pctsrf(klon,nbsrf)
     25  REAL :: zrho(klon,klev)        !Density of air at mid points of Z (kg/m3)
     26  REAL :: zdz(klon,klev)
     27  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     28  REAL :: RHcl(klon,klev)  ! humidite relativen ciel clair
     29  REAL :: t_seri(klon,klev)  ! temperature
     30  REAL :: pplay(klon,klev)  ! pression pour le mileu de chaque couche (en Pa)
     31  REAL :: paprs(klon, klev+1)    !pressure at interface of layers Z (Pa)
     32  REAL :: masse(nbtr)
    4133
    42       DO it=1, nbtr
    43       DO i=1, klon
    44           vdep=vdep_oce(it)*pctsrf(i,is_oce)+
    45      .         vdep_sic(it)*pctsrf(i,is_sic)+
    46      .         vdep_ter(it)*pctsrf(i,is_ter)+
    47      .         vdep_lic(it)*pctsrf(i,is_lic)
    48 c--Unit: molec/m2/s for it=1 to nbtr-3, mg/m2/s for it=nbtr-2 to nbtr
    49           source_tr(i,it)=source_tr(i,it)
    50      .                    -vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2
    51           his_ds(i,it)=vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2
    52      .                 /RNAVO*masse(it)*1.e3               ! mg/m2/s
    53       ENDDO
    54       ENDDO
    55 c
    56       END
     34  !----------------------------- OUTPUT ----------------------------------
     35  REAL :: his_ds(klon,nbtr)
     36  REAL :: source_tr(klon,nbtr)
     37  REAL :: tr_seri(klon, klev,nbtr) !conc of tracers
     38  !--------------------- INTERNAL VARIABLES ------------------------------
     39  INTEGER :: i, it
     40  REAL :: vdep        !sed. velocity
     41
     42  DO it=1, nbtr
     43  DO i=1, klon
     44      vdep=vdep_oce(it)*pctsrf(i,is_oce)+ &
     45            vdep_sic(it)*pctsrf(i,is_sic)+ &
     46            vdep_ter(it)*pctsrf(i,is_ter)+ &
     47            vdep_lic(it)*pctsrf(i,is_lic)
     48  !--Unit: molec/m2/s for it=1 to nbtr-3, mg/m2/s for it=nbtr-2 to nbtr
     49      source_tr(i,it)=source_tr(i,it) &
     50            -vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2
     51      his_ds(i,it)=vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2 &
     52            /RNAVO*masse(it)*1.e3               ! mg/m2/s
     53  ENDDO
     54  ENDDO
     55  !
     56END SUBROUTINE deposition
  • LMDZ6/trunk/libf/phylmd/Dust/finemission.f90

    r5245 r5246  
    1 C This subroutine calculates the emissions of BLACK CARBON and ORGANIC
    2 C MATTER
    3       SUBROUTINE finemission(zdz,pdtphys,zalt,kminbc,kmaxbc,
    4      .                       scale_param_bb,scale_param_ff,
    5      .                       iregion_ind,iregion_bb,
    6      .                       nbreg_ind,nbreg_bb,
    7      .                       lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h,
    8      .                       lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l,
    9      .                       lmt_ombb_h,lmt_omnat,lmt_omba,id_fine,
    10      .                                    flux_sparam_bb,flux_sparam_ff,
    11      .                                        source_tr,flux_tr,tr_seri)
     1! This subroutine calculates the emissions of BLACK CARBON and ORGANIC
     2! MATTER
     3SUBROUTINE finemission(zdz,pdtphys,zalt,kminbc,kmaxbc, &
     4        scale_param_bb,scale_param_ff, &
     5        iregion_ind,iregion_bb, &
     6        nbreg_ind,nbreg_bb, &
     7        lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h, &
     8        lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l, &
     9        lmt_ombb_h,lmt_omnat,lmt_omba,id_fine, &
     10        flux_sparam_bb,flux_sparam_ff, &
     11        source_tr,flux_tr,tr_seri)
    1212
    13       USE dimphy
    14       USE indice_sol_mod
    15       USE infotrac
    16 !      USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
    17       IMPLICIT NONE
     13  USE dimphy
     14  USE indice_sol_mod
     15  USE infotrac
     16   ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
     17  IMPLICIT NONE
    1818
    19       INCLUDE "dimensions.h"
    20       INCLUDE "chem.h"
    21       INCLUDE "YOMCST.h"
    22       INCLUDE "paramet.h"
     19  INCLUDE "dimensions.h"
     20  INCLUDE "chem.h"
     21  INCLUDE "YOMCST.h"
     22  INCLUDE "paramet.h"
    2323
    24       INTEGER i, k, kminbc, kmaxbc
    25 c============================= INPUT ===================================
    26       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    27       REAL zalt(klon,klev)
    28       REAL zdz(klon,klev)
    29 c
    30 c------------------------- Scaling Parameters --------------------------
    31 c   
    32       INTEGER nbreg_ind,nbreg_bb
    33       INTEGER iregion_ind(klon)  !Defines regions for SO2, BC & OM
    34       INTEGER iregion_bb(klon)   !Defines regions for SO2, BC & OM
    35       REAL scale_param_bb(nbreg_bb) !Scaling parameter for biomas burning
    36       REAL scale_param_ff(nbreg_ind) !Scaling parameter for industrial emissions (fossil fuel)
    37       INTEGER id_fine
    38 c============================= OUTPUT ==================================
    39       REAL source_tr(klon,nbtr)
    40       REAL flux_tr(klon,nbtr)
    41       REAL tr_seri(klon,klev,nbtr) ! traceur
    42       REAL flux_sparam_bb(klon), flux_sparam_ff(klon)
    43 c========================= LOCAL VARIABLES =============================
    44       REAL zzdz
    45 c------------------------- BLACK CARBON emissions ----------------------
    46       REAL lmt_bcff(klon)       ! emissions de BC fossil fuels
    47       REAL lmt_bcnff(klon)      ! emissions de BC non-fossil fuels
    48       REAL lmt_bcbb_l(klon)     ! emissions de BC biomass basses
    49       REAL lmt_bcbb_h(klon)     ! emissions de BC biomass hautes
    50       REAL lmt_bcba(klon)       ! emissions de BC bateau
    51 c------------------------ ORGANIC MATTER emissions ---------------------
    52       REAL lmt_omff(klon)     ! emissions de OM fossil fuels
    53       REAL lmt_omnff(klon)    ! emissions de OM non-fossil fuels
    54       REAL lmt_ombb_l(klon)   ! emissions de OM biomass basses
    55       REAL lmt_ombb_h(klon)   ! emissions de OM biomass hautes
    56       REAL lmt_omnat(klon)    ! emissions de OM Natural
    57       REAL lmt_omba(klon)     ! emissions de OM bateau
    58                                
    59       EXTERNAL condsurfc                               
    60 c========================================================================
    61 c                        LOW LEVEL EMISSIONS
    62 c========================================================================
    63            
    64 c corresponds to bc_source.EQ.3
     24  INTEGER :: i, k, kminbc, kmaxbc
     25  !============================= INPUT ===================================
     26  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     27  REAL :: zalt(klon,klev)
     28  REAL :: zdz(klon,klev)
     29  !
     30  !------------------------- Scaling Parameters --------------------------
     31  !
     32  INTEGER :: nbreg_ind,nbreg_bb
     33  INTEGER :: iregion_ind(klon)  !Defines regions for SO2, BC & OM
     34  INTEGER :: iregion_bb(klon)   !Defines regions for SO2, BC & OM
     35  REAL :: scale_param_bb(nbreg_bb) !Scaling parameter for biomas burning
     36  REAL :: scale_param_ff(nbreg_ind) !Scaling parameter for industrial emissions (fossil fuel)
     37  INTEGER :: id_fine
     38  !============================= OUTPUT ==================================
     39  REAL :: source_tr(klon,nbtr)
     40  REAL :: flux_tr(klon,nbtr)
     41  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     42  REAL :: flux_sparam_bb(klon), flux_sparam_ff(klon)
     43  !========================= LOCAL VARIABLES =============================
     44  REAL :: zzdz
     45  !------------------------- BLACK CARBON emissions ----------------------
     46  REAL :: lmt_bcff(klon)       ! emissions de BC fossil fuels
     47  REAL :: lmt_bcnff(klon)      ! emissions de BC non-fossil fuels
     48  REAL :: lmt_bcbb_l(klon)     ! emissions de BC biomass basses
     49  REAL :: lmt_bcbb_h(klon)     ! emissions de BC biomass hautes
     50  REAL :: lmt_bcba(klon)       ! emissions de BC bateau
     51  !------------------------ ORGANIC MATTER emissions ---------------------
     52  REAL :: lmt_omff(klon)     ! emissions de OM fossil fuels
     53  REAL :: lmt_omnff(klon)    ! emissions de OM non-fossil fuels
     54  REAL :: lmt_ombb_l(klon)   ! emissions de OM biomass basses
     55  REAL :: lmt_ombb_h(klon)   ! emissions de OM biomass hautes
     56  REAL :: lmt_omnat(klon)    ! emissions de OM Natural
     57  REAL :: lmt_omba(klon)     ! emissions de OM bateau
    6558
    66       DO i=1,klon
    67          IF (iregion_ind(i).GT.0) THEN
    68        IF(id_fine>0)    source_tr(i,id_fine)=source_tr(i,id_fine)+
    69      .                (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+     !g/m2/s
    70      .                 scale_param_ff(iregion_ind(i))*lmt_omff(i)
    71      .                 )     * 1.e4                        !g/m2/s
    72 c
    73       IF(id_fine>0)     flux_tr(i,id_fine)=flux_tr(i,id_fine)+
    74      .                (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+     !mg/m2/s
    75      .                 scale_param_ff(iregion_ind(i))*lmt_omff(i)
    76      .                 )     * 1.e4 *1.e3                  !mg/m2/s
    77 c
    78            flux_sparam_ff(i)= flux_sparam_ff(i) +
    79      .                     scale_param_ff(iregion_ind(i))*
    80      .                     ( lmt_bcff(i)+lmt_omff(i))
    81      .                     *1.e4*1.e3
    82          ENDIF
    83          IF (iregion_bb(i).GT.0) THEN
    84        IF(id_fine>0)    source_tr(i,id_fine)=source_tr(i,id_fine)+
    85      .                (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+   !g/m2/s
    86      .                 scale_param_bb(iregion_bb(i))*lmt_ombb_l(i)    !g/m2/s
    87      .                 )     * 1.e4                        !g/m2/s
    88 c
    89        IF(id_fine>0)    flux_tr(i,id_fine)=flux_tr(i,id_fine)+
    90      .                (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+   !mg/m2/s
    91      .                 scale_param_bb(iregion_bb(i))*lmt_ombb_l(i)+   !mg/m2/s
    92      .                 scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+   !mg/m2/s
    93      .                 scale_param_bb(iregion_bb(i))*lmt_ombb_h(i)    !mg/m2/s
    94      .                 )     * 1.e4 *1.e3                  !mg/m2/s
    95 c
    96            flux_sparam_bb(i)=flux_sparam_bb(i) +
    97      .                   scale_param_bb(iregion_bb(i))*(lmt_bcbb_l(i) +
    98      .                   lmt_bcbb_h(i) + lmt_ombb_l(i) + lmt_ombb_h(i))
    99      .                   *1.e4*1.e3
    100          ENDIF
    101        IF(id_fine>0)  source_tr(i,id_fine)=source_tr(i,id_fine)+
    102      .                (lmt_bcnff(i)+lmt_bcba(i)+lmt_omnff(i)+
    103      .                 lmt_omnat(i)+lmt_omba(i))     * 1.e4           !g/m2/s
    104 c
    105        IF(id_fine>0)  flux_tr(i,id_fine)=flux_tr(i,id_fine)+
    106      .                (lmt_bcnff(i)+lmt_omnff(i)+lmt_omnat(i)+
    107      .                 lmt_omba(i)+lmt_bcba(i))     * 1.e4 *1.e3      !mg/m2/s
    108 c
    109          flux_sparam_ff(i)= flux_sparam_ff(i) +
    110      .                      (lmt_omba(i)+lmt_bcba(i))*1.e4*1.e3
    111       ENDDO
     59  EXTERNAL condsurfc
     60  !========================================================================
     61                     ! LOW LEVEL EMISSIONS
     62  !========================================================================
    11263
    113 c========================================================================
    114 c                        HIGH LEVEL EMISSIONS
    115 c========================================================================
    116                              
    117 c  Sources hautes de BC/OM
     64  ! corresponds to bc_source.EQ.3
    11865
    119 c
    120 c HIGH LEVEL EMISSIONS OF SO2 ARE IN PRECUREMISSION.F
    121 c
    122       k=2                             !introducing emissions in level 2
    123 cnhl      DO i = 1, klon
    124 c
    125 cnhl      tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+scale_param_ff(iregion_ind(i))*
    126 cnhl     .               (lmt_bcff_h(i)+lmt_omff_h(i))/zdz(i,k)/100.*pdtphys
    127 c
    128 cnhl      ENDDO
     66  DO i=1,klon
     67     IF (iregion_ind(i).GT.0) THEN
     68   IF(id_fine>0)    source_tr(i,id_fine)=source_tr(i,id_fine)+ &
     69         (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ & !g/m2/s
     70         scale_param_ff(iregion_ind(i))*lmt_omff(i) &
     71         )     * 1.e4                        !g/m2/s
     72  !
     73  IF(id_fine>0)     flux_tr(i,id_fine)=flux_tr(i,id_fine)+ &
     74        (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ & !mg/m2/s
     75        scale_param_ff(iregion_ind(i))*lmt_omff(i) &
     76        )     * 1.e4 *1.e3                  !mg/m2/s
     77  !
     78       flux_sparam_ff(i)= flux_sparam_ff(i) + &
     79             scale_param_ff(iregion_ind(i))* &
     80             ( lmt_bcff(i)+lmt_omff(i)) &
     81             *1.e4*1.e3
     82     ENDIF
     83     IF (iregion_bb(i).GT.0) THEN
     84   IF(id_fine>0)    source_tr(i,id_fine)=source_tr(i,id_fine)+ &
     85         (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ & !g/m2/s
     86         scale_param_bb(iregion_bb(i))*lmt_ombb_l(i) & !g/m2/s
     87         )     * 1.e4                        !g/m2/s
     88  !
     89   IF(id_fine>0)    flux_tr(i,id_fine)=flux_tr(i,id_fine)+ &
     90         (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ & !mg/m2/s
     91         scale_param_bb(iregion_bb(i))*lmt_ombb_l(i)+ & !mg/m2/s
     92         scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ & !mg/m2/s
     93         scale_param_bb(iregion_bb(i))*lmt_ombb_h(i) & !mg/m2/s
     94         )     * 1.e4 *1.e3                  !mg/m2/s
     95  !
     96       flux_sparam_bb(i)=flux_sparam_bb(i) + &
     97             scale_param_bb(iregion_bb(i))*(lmt_bcbb_l(i) + &
     98             lmt_bcbb_h(i) + lmt_ombb_l(i) + lmt_ombb_h(i)) &
     99             *1.e4*1.e3
     100     ENDIF
     101   IF(id_fine>0)  source_tr(i,id_fine)=source_tr(i,id_fine)+ &
     102         (lmt_bcnff(i)+lmt_bcba(i)+lmt_omnff(i)+ &
     103         lmt_omnat(i)+lmt_omba(i))     * 1.e4           !g/m2/s
     104  !
     105   IF(id_fine>0)  flux_tr(i,id_fine)=flux_tr(i,id_fine)+ &
     106         (lmt_bcnff(i)+lmt_omnff(i)+lmt_omnat(i)+ &
     107         lmt_omba(i)+lmt_bcba(i))     * 1.e4 *1.e3      !mg/m2/s
     108  !
     109     flux_sparam_ff(i)= flux_sparam_ff(i) + &
     110           (lmt_omba(i)+lmt_bcba(i))*1.e4*1.e3
     111  ENDDO
    129112
    130       DO k=kminbc, kmaxbc
    131       DO i = 1, klon
    132           zzdz=zalt(i,kmaxbc+1)-zalt(i,kminbc)
    133 c
    134          IF (iregion_bb(i) .GT.0) THEN
    135         IF(id_fine>0)   tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+
    136      .              (scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+
    137      .               scale_param_bb(iregion_bb(i))*lmt_ombb_h(i))
    138      .                              /zzdz/100.*pdtphys
    139          ENDIF
    140 c
    141       ENDDO
    142       ENDDO
    143 c
    144       END
     113  !========================================================================
     114                     ! HIGH LEVEL EMISSIONS
     115  !========================================================================
     116
     117  !  Sources hautes de BC/OM
     118
     119  !
     120  ! HIGH LEVEL EMISSIONS OF SO2 ARE IN PRECUREMISSION.F
     121  !
     122  k=2                             !introducing emissions in level 2
     123  !nhl      DO i = 1, klon
     124  !
     125  !nhl      tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+scale_param_ff(iregion_ind(i))*
     126  !nhl     .               (lmt_bcff_h(i)+lmt_omff_h(i))/zdz(i,k)/100.*pdtphys
     127  !
     128  !nhl      ENDDO
     129
     130  DO k=kminbc, kmaxbc
     131  DO i = 1, klon
     132      zzdz=zalt(i,kmaxbc+1)-zalt(i,kminbc)
     133  !
     134     IF (iregion_bb(i) .GT.0) THEN
     135    IF(id_fine>0)   tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+ &
     136          (scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ &
     137          scale_param_bb(iregion_bb(i))*lmt_ombb_h(i)) &
     138          /zzdz/100.*pdtphys
     139     ENDIF
     140  !
     141  ENDDO
     142  ENDDO
     143  !
     144END SUBROUTINE finemission
  • LMDZ6/trunk/libf/phylmd/Dust/gastoparticle.f90

    r5245 r5246  
    1       SUBROUTINE gastoparticle(pdtphys,zdz,zrho,xlat,pplay,t_seri,
    2      .         id_prec,id_fine,
    3      .         tr_seri,his_g2pgas ,his_g2paer )
    4 cnhl     .                         fluxso4chem, flux_sparam_sulf,
     1SUBROUTINE gastoparticle(pdtphys,zdz,zrho,xlat,pplay,t_seri, &
     2        id_prec,id_fine, &
     3        tr_seri,his_g2pgas ,his_g2paer )
     4  !nhl     .                         fluxso4chem, flux_sparam_sulf,
    55
    6       USE dimphy
    7       USE infotrac
    8 c      USE indice_sol_mod
     6  USE dimphy
     7  USE infotrac
     8   ! USE indice_sol_mod
    99
    10       IMPLICIT NONE
    11 c
    12       INCLUDE "dimensions.h"
    13       INCLUDE "chem.h"
    14       INCLUDE "chem_spla.h"
    15       INCLUDE "YOMCST.h"
    16       INCLUDE "YOECUMF.h"
    17 c
    18       REAL pdtphys
    19       REAL zrho(klon,klev)
    20       REAL zdz(klon,klev)
    21       REAL tr_seri(klon,klev,nbtr)   ! traceurs
    22       REAL tend                 ! tendance par espece
    23       REAL xlat(klon)       ! latitudes pour chaque point
    24       REAL pi
    25 c   JE: 20140120
    26       REAL his_g2pgas(klon)
    27       REAL his_g2paer(klon)
    28       REAL tendincm3(klon,klev)
    29       REAL tempvar(klon,klev)     
    30       REAL pplay(klon,klev)
    31       REAL t_seri(klon,klev)
    32       REAL tend2d(klon,klev)
    33       INTEGER id_prec,id_fine
    34 c
    35 c------------------------- Scaling Parameter --------------------------
    36 c
    37 c      REAL scale_param_so4(klon)  !Scaling parameter for sulfate
     10  IMPLICIT NONE
     11  !
     12  INCLUDE "dimensions.h"
     13  INCLUDE "chem.h"
     14  INCLUDE "chem_spla.h"
     15  INCLUDE "YOMCST.h"
     16  INCLUDE "YOECUMF.h"
     17  !
     18  REAL :: pdtphys
     19  REAL :: zrho(klon,klev)
     20  REAL :: zdz(klon,klev)
     21  REAL :: tr_seri(klon,klev,nbtr)   ! traceurs
     22  REAL :: tend                 ! tendance par espece
     23  REAL :: xlat(klon)       ! latitudes pour chaque point
     24  REAL :: pi
     25  !   JE: 20140120
     26  REAL :: his_g2pgas(klon)
     27  REAL :: his_g2paer(klon)
     28  REAL :: tendincm3(klon,klev)
     29  REAL :: tempvar(klon,klev)
     30  REAL :: pplay(klon,klev)
     31  REAL :: t_seri(klon,klev)
     32  REAL :: tend2d(klon,klev)
     33  INTEGER :: id_prec,id_fine
     34  !
     35  !------------------------- Scaling Parameter --------------------------
     36  !
     37  !  REAL scale_param_so4(klon)  !Scaling parameter for sulfate
    3838
    39       INTEGER i, k
    40       REAL tau_chem     !---chemical lifetime in s
    41 c
    42 c------------------------- Variables to save --------------------------
    43 c
    44 cnhl      REAL fluxso4chem(klon,klev)
    45 cnhl      REAL flux_sparam_sulf(klon,klev)
     39  INTEGER :: i, k
     40  REAL :: tau_chem     !---chemical lifetime in s
     41  !
     42  !------------------------- Variables to save --------------------------
     43  !
     44  !nhl      REAL fluxso4chem(klon,klev)
     45  !nhl      REAL flux_sparam_sulf(klon,klev)
    4646
    47 c======================================================================
    48       pi=atan(1.)*4.
    49 c
    50       IF (id_prec>0 .AND. id_fine>0) THEN
    51       DO k = 1, klev
    52       DO i = 1, klon
    53 c
    54 c        tau_chem=scale_param_so4(i)*86400.*(8.-5.*cos(xlat(i)*pi/180.))    !tchemfctn2
    55 cnhl        tau_chem=86400.*(8.-5.*cos(xlat(i)*pi/180.))    !tchemfctn2
    56         tau_chem=86400.*(5.-4.*cos(xlat(i)*pi/180.))    !
    57         tend=tr_seri(i,k,id_prec)*(1.-exp(-pdtphys/tau_chem)) ! Sulfate production
    58 cnhl        tend=(1.-exp(-pdtphys/tau_chem))
    59 cnhl        tend=scale_param_so4(i) !as this it works
    60 c     
    61         tr_seri(i,k,id_prec) =tr_seri(i,k,id_prec) - tend
    62         tr_seri(i,k,id_fine) =tr_seri(i,k,id_fine) +
    63      .                      tend/RNAVO*masse_ammsulfate  !--gAER/KgAir
    64         tend2d(i,k)=tend
    65 c
    66 cnhl        fluxso4chem(i,k) = tend/RNAVO*masse_ammsulfate
    67 cnhl        flux_sparam_sulf(i,k) = tend/RNAVO*masse_ammsulfate
    68       ENDDO
    69       ENDDO
    70    
     47  !======================================================================
     48  pi=atan(1.)*4.
     49  !
     50  IF (id_prec>0 .AND. id_fine>0) THEN
     51  DO k = 1, klev
     52  DO i = 1, klon
     53  !
     54  !    tau_chem=scale_param_so4(i)*86400.*(8.-5.*cos(xlat(i)*pi/180.))    !tchemfctn2
     55  !nhl        tau_chem=86400.*(8.-5.*cos(xlat(i)*pi/180.))    !tchemfctn2
     56    tau_chem=86400.*(5.-4.*cos(xlat(i)*pi/180.))    !
     57    tend=tr_seri(i,k,id_prec)*(1.-exp(-pdtphys/tau_chem)) ! Sulfate production
     58  !nhl        tend=(1.-exp(-pdtphys/tau_chem))
     59  !nhl        tend=scale_param_so4(i) !as this it works
     60  !
     61    tr_seri(i,k,id_prec) =tr_seri(i,k,id_prec) - tend
     62    tr_seri(i,k,id_fine) =tr_seri(i,k,id_fine) + &
     63          tend/RNAVO*masse_ammsulfate  !--gAER/KgAir
     64    tend2d(i,k)=tend
     65  !
     66  !nhl        fluxso4chem(i,k) = tend/RNAVO*masse_ammsulfate
     67  !nhl        flux_sparam_sulf(i,k) = tend/RNAVO*masse_ammsulfate
     68  ENDDO
     69  ENDDO
    7170
    7271
    73         tempvar=tend2d
    74          CALL kg_to_cm3(pplay,t_seri,tempvar)
    75         tendincm3=tempvar
    7672
    77       DO k = 1, klev
    78       DO i = 1, klon
     73    tempvar=tend2d
     74     CALL kg_to_cm3(pplay,t_seri,tempvar)
     75    tendincm3=tempvar
    7976
    80 c        his_g2pgas(i) = his_g2pgas(i) + tendincm3(i,k)*1e6*zdz(i,k)/pdtphys
    81         his_g2paer(i) = his_g2paer(i) +     
    82      .    tendincm3(i,k)/RNAVO*masse_ammsulfate*1.e3*
    83      .    1.e6*zdz(i,k)/pdtphys    ! mg/m2/s
    84         his_g2pgas(i) = his_g2paer(i)*masse_s/masse_ammsulfate ! mg-S/m2/s
     77  DO k = 1, klev
     78  DO i = 1, klon
    8579
    86       ENDDO
    87       ENDDO
    88       ENDIF
     80     ! his_g2pgas(i) = his_g2pgas(i) + tendincm3(i,k)*1e6*zdz(i,k)/pdtphys
     81    his_g2paer(i) = his_g2paer(i) + &
     82          tendincm3(i,k)/RNAVO*masse_ammsulfate*1.e3* &
     83          1.e6*zdz(i,k)/pdtphys    ! mg/m2/s
     84    his_g2pgas(i) = his_g2paer(i)*masse_s/masse_ammsulfate ! mg-S/m2/s
    8985
    90 c
    91       RETURN
    92       END
     86  ENDDO
     87  ENDDO
     88  ENDIF
     89
     90  !
     91  RETURN
     92END SUBROUTINE gastoparticle
  • LMDZ6/trunk/libf/phylmd/Dust/incloud_scav.f90

    r5245 r5246  
    1 c Subroutine that calculates the effect of precipitation in scavenging
    2 c WITHIN the cloud, for large scale as well as convective precipitation
    3       SUBROUTINE incloud_scav(lminmax,qmin,qmax,masse,henry,kk,prfl,
    4      .                      psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys,
    5      .                                   his_dhlsc,his_dhcon1,tr_seri)
     1! Subroutine that calculates the effect of precipitation in scavenging
     2! WITHIN the cloud, for large scale as well as convective precipitation
     3SUBROUTINE incloud_scav(lminmax,qmin,qmax,masse,henry,kk,prfl, &
     4        psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys, &
     5        his_dhlsc,his_dhcon1,tr_seri)
    66
    7       USE dimphy
    8       USE infotrac
    9       USE indice_sol_mod
     7  USE dimphy
     8  USE infotrac
     9  USE indice_sol_mod
    1010
    11       IMPLICIT NONE
     11  IMPLICIT NONE
    1212
    13       INCLUDE "dimensions.h"
    14       INCLUDE "chem.h"
    15       INCLUDE "YOMCST.h"
    16       INCLUDE "paramet.h"
     13  INCLUDE "dimensions.h"
     14  INCLUDE "chem.h"
     15  INCLUDE "YOMCST.h"
     16  INCLUDE "paramet.h"
    1717
    18 c============================= INPUT ===================================
    19       REAL qmin, qmax
    20       REAL masse(nbtr)
    21       REAL henry(nbtr)         !--cste de Henry  mol/l/atm
    22       REAL kk(nbtr)            !--coefficient de var avec T (K)
    23       REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
    24 !      REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
    25       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
    26 !      REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
    27       REAL zrho(klon,klev), zdz(klon,klev)
    28       REAL t_seri(klon,klev)
    29       LOGICAL lminmax
    30       REAL pdtphys
    31 !      REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
    32 !      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
    33 c============================= OUTPUT ==================================
    34       REAL tr_seri(klon,klev,nbtr) ! traceur
    35       REAL aux_var1(klon,klev) ! traceur
    36       REAL aux_var2(klon) ! traceur
    37       REAL aux_var3(klon) ! traceur
    38       REAL his_dhlsc(klon,nbtr)        ! in-cloud scavenging lsc
    39       REAL his_dhcon1(klon,nbtr)       ! in-cloud scavenging con
    40 c========================= LOCAL VARIABLES =============================     
    41       INTEGER it, i, j
    42      
    43       EXTERNAL minmaxqfi, inscav_spl
    44      
    45       DO it=1, nbtr
    46 c
    47       DO i=1,klon
    48         aux_var2(i)=his_dhlsc(i,it)
    49         aux_var3(i)=his_dhcon1(i,it)
    50       ENDDO
    51       DO j=1,klev
    52       DO i=1,klon
    53         aux_var1(i,j)=tr_seri(i,j,it)
    54       ENDDO
    55       ENDDO
    56 c     
    57       IF (lminmax) THEN
    58         CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav')
    59 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav')
    60       ENDIF
    61 c
    62 cnhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
    63 cnhl     .             prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it),
    64 cnhl     .             his_dhlsc(1,it))
    65       CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
    66      .             prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2)
    67 c
    68       IF (lminmax) THEN
    69         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc')
    70 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc')
    71       ENDIF
    72 c
    73 c
    74 c-scheme for convective in-cloud scavenging
    75 c
    76 cnhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
    77 cnhl     .             pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it),
    78 cnhl     .             his_dhcon1(1,it))
    79       CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
    80      .             pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3)
    81 c
    82       IF (lminmax) THEN
    83         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con')
    84 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con')
    85       ENDIF
    86 c
    87       DO j=1,klev
    88       DO i=1,klon
    89         tr_seri(i,j,it)=aux_var1(i,j)
    90       ENDDO
    91       ENDDO
    92       DO i=1,klon
    93         his_dhlsc(i,it)=aux_var2(i)
    94         his_dhcon1(i,it)=aux_var3(i)
    95       ENDDO
     18  !============================= INPUT ===================================
     19  REAL :: qmin, qmax
     20  REAL :: masse(nbtr)
     21  REAL :: henry(nbtr)         !--cste de Henry  mol/l/atm
     22  REAL :: kk(nbtr)            !--coefficient de var avec T (K)
     23  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
     24   ! REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
     25  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
     26   ! REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
     27  REAL :: zrho(klon,klev), zdz(klon,klev)
     28  REAL :: t_seri(klon,klev)
     29  LOGICAL :: lminmax
     30  REAL :: pdtphys
     31   ! REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
     32   ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
     33  !============================= OUTPUT ==================================
     34  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     35  REAL :: aux_var1(klon,klev) ! traceur
     36  REAL :: aux_var2(klon) ! traceur
     37  REAL :: aux_var3(klon) ! traceur
     38  REAL :: his_dhlsc(klon,nbtr)        ! in-cloud scavenging lsc
     39  REAL :: his_dhcon1(klon,nbtr)       ! in-cloud scavenging con
     40  !========================= LOCAL VARIABLES =============================
     41  INTEGER :: it, i, j
    9642
    97 c
    98       ENDDO !--boucle sur it
     43  EXTERNAL minmaxqfi, inscav_spl
    9944
    100       END
     45  DO it=1, nbtr
     46  !
     47  DO i=1,klon
     48    aux_var2(i)=his_dhlsc(i,it)
     49    aux_var3(i)=his_dhcon1(i,it)
     50  ENDDO
     51  DO j=1,klev
     52  DO i=1,klon
     53    aux_var1(i,j)=tr_seri(i,j,it)
     54  ENDDO
     55  ENDDO
     56  !
     57  IF (lminmax) THEN
     58    CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav')
     59  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav')
     60  ENDIF
     61  !
     62  !nhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
     63  !nhl     .             prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it),
     64  !nhl     .             his_dhlsc(1,it))
     65  CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, &
     66        prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2)
     67  !
     68  IF (lminmax) THEN
     69    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc')
     70  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc')
     71  ENDIF
     72  !
     73  !
     74  !-scheme for convective in-cloud scavenging
     75  !
     76  !nhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
     77  !nhl     .             pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it),
     78  !nhl     .             his_dhcon1(1,it))
     79  CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, &
     80        pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3)
     81  !
     82  IF (lminmax) THEN
     83    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con')
     84  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con')
     85  ENDIF
     86  !
     87  DO j=1,klev
     88  DO i=1,klon
     89    tr_seri(i,j,it)=aux_var1(i,j)
     90  ENDDO
     91  ENDDO
     92  DO i=1,klon
     93    his_dhlsc(i,it)=aux_var2(i)
     94    his_dhcon1(i,it)=aux_var3(i)
     95  ENDDO
     96
     97  !
     98  ENDDO !--boucle sur it
     99
     100END SUBROUTINE incloud_scav
  • LMDZ6/trunk/libf/phylmd/Dust/incloud_scav_lsc.f90

    r5245 r5246  
    1 c Subroutine that calculates the effect of precipitation in scavenging
    2 c WITHIN the cloud, for large scale as well as convective precipitation
    3       SUBROUTINE incloud_scav_lsc(lminmax,qmin,qmax,masse,henry,kk,prfl,
    4      .                      psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys,
    5      .                                   his_dhlsc,his_dhcon1,tr_seri)
     1! Subroutine that calculates the effect of precipitation in scavenging
     2! WITHIN the cloud, for large scale as well as convective precipitation
     3SUBROUTINE incloud_scav_lsc(lminmax,qmin,qmax,masse,henry,kk,prfl, &
     4        psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys, &
     5        his_dhlsc,his_dhcon1,tr_seri)
    66
    7       USE dimphy
    8       USE infotrac
    9       USE indice_sol_mod
     7  USE dimphy
     8  USE infotrac
     9  USE indice_sol_mod
    1010
    11       IMPLICIT NONE
     11  IMPLICIT NONE
    1212
    13       INCLUDE "dimensions.h"
    14       INCLUDE "chem.h"
    15       INCLUDE "YOMCST.h"
    16       INCLUDE "paramet.h"
     13  INCLUDE "dimensions.h"
     14  INCLUDE "chem.h"
     15  INCLUDE "YOMCST.h"
     16  INCLUDE "paramet.h"
    1717
    18 c============================= INPUT ===================================
    19       REAL qmin, qmax
    20       REAL masse(nbtr)
    21       REAL henry(nbtr)         !--cste de Henry  mol/l/atm
    22       REAL kk(nbtr)            !--coefficient de var avec T (K)
    23       REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
    24 !      REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
    25       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
    26 !      REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
    27       REAL zrho(klon,klev), zdz(klon,klev)
    28       REAL t_seri(klon,klev)
    29       LOGICAL lminmax
    30       REAL pdtphys
    31 !      REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
    32 !      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
    33 c============================= OUTPUT ==================================
    34       REAL tr_seri(klon,klev,nbtr) ! traceur
    35       REAL aux_var1(klon,klev) ! traceur
    36       REAL aux_var2(klon) ! traceur
    37       REAL aux_var3(klon) ! traceur
    38       REAL his_dhlsc(klon,nbtr)        ! in-cloud scavenging lsc
    39       REAL his_dhcon1(klon,nbtr)       ! in-cloud scavenging con
    40 c========================= LOCAL VARIABLES =============================     
    41       INTEGER it, i, j
    42      
    43       EXTERNAL minmaxqfi, inscav_spl
    44       DO it=1, nbtr
    45 c
    46       DO i=1,klon
    47         aux_var2(i)=his_dhlsc(i,it)
    48         aux_var3(i)=his_dhcon1(i,it)
    49       ENDDO
    50       DO j=1,klev
    51       DO i=1,klon
    52         aux_var1(i,j)=tr_seri(i,j,it)
    53       ENDDO
    54       ENDDO
    55 c     
    56       IF (lminmax) THEN
    57         CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav')
    58 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav')
    59       ENDIF
    60 c
    61 cnhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
    62 cnhl     .             prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it),
    63 cnhl     .             his_dhlsc(1,it))
    64       CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
    65      .             prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2)
    66 c
    67       IF (lminmax) THEN
    68         CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc')
    69 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc')
    70       ENDIF
    71 c
    72 c
    73 c-scheme for convective in-cloud scavenging
    74 c
    75 cnhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
    76 cnhl     .             pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it),
    77 cnhl     .             his_dhcon1(1,it))
     18  !============================= INPUT ===================================
     19  REAL :: qmin, qmax
     20  REAL :: masse(nbtr)
     21  REAL :: henry(nbtr)         !--cste de Henry  mol/l/atm
     22  REAL :: kk(nbtr)            !--coefficient de var avec T (K)
     23  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale
     24   ! REAL prfl(klon,klev),   psfl(klon,klev)     !--large-scale
     25  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection
     26   ! REAL pmflxr(klon,klev), pmflxs(klon,klev)   !--convection
     27  REAL :: zrho(klon,klev), zdz(klon,klev)
     28  REAL :: t_seri(klon,klev)
     29  LOGICAL :: lminmax
     30  REAL :: pdtphys
     31   ! REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--large-scale  ! Titane
     32   ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--convection   ! Titane
     33  !============================= OUTPUT ==================================
     34  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     35  REAL :: aux_var1(klon,klev) ! traceur
     36  REAL :: aux_var2(klon) ! traceur
     37  REAL :: aux_var3(klon) ! traceur
     38  REAL :: his_dhlsc(klon,nbtr)        ! in-cloud scavenging lsc
     39  REAL :: his_dhcon1(klon,nbtr)       ! in-cloud scavenging con
     40  !========================= LOCAL VARIABLES =============================
     41  INTEGER :: it, i, j
    7842
    79 c      print *,'JE inscav0'
    80 c      IF (iflag_con.LT.3) THEN
    81 c
    82 c      print *,'JE inscav1'
    83 c      print *,'iflag_con',iflag_con
    84 c      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
    85 c     .             pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3)
    86 c
    87 cc
    88 c      IF (lminmax) THEN
    89 c        CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con')
    90 ccnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con')
    91 c
    92 c      ENDIF
    93 c
    94 c      ENDIF ! iflag_con
     43  EXTERNAL minmaxqfi, inscav_spl
     44  DO it=1, nbtr
     45  !
     46  DO i=1,klon
     47    aux_var2(i)=his_dhlsc(i,it)
     48    aux_var3(i)=his_dhcon1(i,it)
     49  ENDDO
     50  DO j=1,klev
     51  DO i=1,klon
     52    aux_var1(i,j)=tr_seri(i,j,it)
     53  ENDDO
     54  ENDDO
     55  !
     56  IF (lminmax) THEN
     57    CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav')
     58  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav')
     59  ENDIF
     60  !
     61  !nhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3,
     62  !nhl     .             prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it),
     63  !nhl     .             his_dhlsc(1,it))
     64  CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, &
     65        prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2)
     66  !
     67  IF (lminmax) THEN
     68    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc')
     69  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc')
     70  ENDIF
     71  !
     72  !
     73  !-scheme for convective in-cloud scavenging
     74  !
     75  !nhl      CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
     76  !nhl     .             pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it),
     77  !nhl     .             his_dhcon1(1,it))
    9578
    96 c
    97 c      print *,'JE inscav2'
    98       DO j=1,klev
    99       DO i=1,klon
    100         tr_seri(i,j,it)=aux_var1(i,j)
    101       ENDDO
    102       ENDDO
    103       DO i=1,klon
    104         his_dhlsc(i,it)=aux_var2(i)
    105         his_dhcon1(i,it)=aux_var3(i)
    106       ENDDO
     79  !  print *,'JE inscav0'
     80  !  IF (iflag_con.LT.3) THEN
     81  !
     82  !  print *,'JE inscav1'
     83  !  print *,'iflag_con',iflag_con
     84  !  CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3,
     85  ! .             pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3)
     86  !
     87  !c
     88  !  IF (lminmax) THEN
     89  !    CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con')
     90  !cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con')
     91  !
     92  !  ENDIF
     93  !
     94  !  ENDIF ! iflag_con
    10795
    108 c
    109       ENDDO !--boucle sur it
     96  !
     97  !  print *,'JE inscav2'
     98  DO j=1,klev
     99  DO i=1,klon
     100    tr_seri(i,j,it)=aux_var1(i,j)
     101  ENDDO
     102  ENDDO
     103  DO i=1,klon
     104    his_dhlsc(i,it)=aux_var2(i)
     105    his_dhcon1(i,it)=aux_var3(i)
     106  ENDDO
    110107
    111 c      print *,'JE inscav3'
    112       END
     108  !
     109  ENDDO !--boucle sur it
     110
     111   ! print *,'JE inscav3'
     112END SUBROUTINE incloud_scav_lsc
  • LMDZ6/trunk/libf/phylmd/Dust/inscav_spl.f90

    r5245 r5246  
    1       SUBROUTINE inscav_spl(pdtime,it,masse,henry,kk,qliq,
    2      .                   flxr,flxs,zrho,zdz,t,x,
    3      .                   his_dh)
    4       USE dimphy
    5       IMPLICIT NONE
    6 c=====================================================================
    7 c Objet : depot humide de traceurs
    8 c Date : mars 1998
    9 c Auteur: O. Boucher (LOA)
    10 c=====================================================================
    11 c
    12       INCLUDE "dimensions.h"
    13       INCLUDE "chem.h"
    14       INCLUDE "YOMCST.h"
    15       INCLUDE "YOECUMF.h"
    16 c
    17       INTEGER it
    18       REAL pdtime              ! pas de temps (s)
    19       REAL masse               ! molar mass (except for BC/OM/IF/DUST=Nav)
    20       REAL henry               ! constante de Henry en mol/l/atm
    21       REAL kk                  ! coefficient de dependence en T (K)
    22       REAL qliq                ! contenu en eau liquide dans le nuage (kg/kg)
    23 !      REAL flxr(klon,klev+1)   ! flux precipitant de pluie
    24 !      REAL flxs(klon,klev+1)   ! flux precipitant de neige
    25       REAL flxr(klon,klev)   ! flux precipitant de pluie   ! Titane
    26       REAL flxs(klon,klev)   ! flux precipitant de neige   ! Titane
    27       REAL flxr_aux(klon,klev+1)
    28       REAL flxs_aux(klon,klev+1)
    29       REAL zrho(klon,klev)
    30       REAL zdz(klon,klev)
    31       REAL t(klon,klev)
    32       REAL x(klon,klev)        ! q de traceur 
    33       REAL his_dh(klon)        ! tendance de traceur integre verticalement
    34 c
    35 c--variables locales     
    36       INTEGER i, k
    37 c
    38       REAL dx      ! tendance de traceur
    39       REAL f_a     !--rapport de la phase aqueuse a la phase gazeuse
    40       REAL beta    !--taux de conversion de l'eau en pluie
    41       REAL henry_t !--constante de Henry a T t  (mol/l/atm)
    42       REAL scav(klon,klev)    !--fraction aqueuse du constituant
    43       REAL K1, K2, ph, frac
    44       REAL frac_gas, frac_aer !-cste pour la reevaporation
    45       PARAMETER (ph=5., frac_gas=1.0, frac_aer=0.5)
    46 c---cste de dissolution pour le depot humide
    47       REAL frac_fine_scav,frac_coar_scav
    48 c---added by nhl
    49       REAL aux_cte
     1SUBROUTINE inscav_spl(pdtime,it,masse,henry,kk,qliq, &
     2        flxr,flxs,zrho,zdz,t,x, &
     3        his_dh)
     4  USE dimphy
     5  IMPLICIT NONE
     6  !=====================================================================
     7  ! Objet : depot humide de traceurs
     8  ! Date : mars 1998
     9  ! Auteur: O. Boucher (LOA)
     10  !=====================================================================
     11  !
     12  INCLUDE "dimensions.h"
     13  INCLUDE "chem.h"
     14  INCLUDE "YOMCST.h"
     15  INCLUDE "YOECUMF.h"
     16  !
     17  INTEGER :: it
     18  REAL :: pdtime              ! pas de temps (s)
     19  REAL :: masse               ! molar mass (except for BC/OM/IF/DUST=Nav)
     20  REAL :: henry               ! constante de Henry en mol/l/atm
     21  REAL :: kk                  ! coefficient de dependence en T (K)
     22  REAL :: qliq                ! contenu en eau liquide dans le nuage (kg/kg)
     23   ! REAL flxr(klon,klev+1)   ! flux precipitant de pluie
     24   ! REAL flxs(klon,klev+1)   ! flux precipitant de neige
     25  REAL :: flxr(klon,klev)   ! flux precipitant de pluie   ! Titane
     26  REAL :: flxs(klon,klev)   ! flux precipitant de neige   ! Titane
     27  REAL :: flxr_aux(klon,klev+1)
     28  REAL :: flxs_aux(klon,klev+1)
     29  REAL :: zrho(klon,klev)
     30  REAL :: zdz(klon,klev)
     31  REAL :: t(klon,klev)
     32  REAL :: x(klon,klev)        ! q de traceur
     33  REAL :: his_dh(klon)        ! tendance de traceur integre verticalement
     34  !
     35  !--variables locales
     36  INTEGER :: i, k
     37  !
     38  REAL :: dx      ! tendance de traceur
     39  REAL :: f_a     !--rapport de la phase aqueuse a la phase gazeuse
     40  REAL :: beta    !--taux de conversion de l'eau en pluie
     41  REAL :: henry_t !--constante de Henry a T t  (mol/l/atm)
     42  REAL :: scav(klon,klev)    !--fraction aqueuse du constituant
     43  REAL :: K1, K2, ph, frac
     44  REAL :: frac_gas, frac_aer !-cste pour la reevaporation
     45  PARAMETER (ph=5., frac_gas=1.0, frac_aer=0.5)
     46  !---cste de dissolution pour le depot humide
     47  REAL :: frac_fine_scav,frac_coar_scav
     48  !---added by nhl
     49  REAL :: aux_cte
    5050
    51       PARAMETER (frac_fine_scav=0.7)
    52       PARAMETER (frac_coar_scav=0.7)
     51  PARAMETER (frac_fine_scav=0.7)
     52  PARAMETER (frac_coar_scav=0.7)
    5353
    54 c--101.325  m3/l x Pa/atm
    55 c--R        Pa.m3/mol/K
    56 c
    57 c------------------------------------------
    58 c
    59 cnhl      IF (it.EQ.2.OR.it.EQ.3) THEN !--aerosol  ! AS IT WAS FIRST
    60       IF (it.EQ.2.OR.it.EQ.3.OR.it.EQ.4) THEN !--aerosol
    61         frac=frac_aer
    62       ELSE                                                !--gas
    63         frac=frac_gas
    64       ENDIF
    65 c
    66       IF (it.EQ.1) THEN
    67       DO k=1, klev
    68       DO i=1, klon
    69         henry_t=henry*exp(-kk*(1./298.-1./t(i,k)))    !--mol/l/atm
    70         K1=1.2e-2*exp(-2010*(1/298.-1/t(i,k)))
    71         K2=6.6e-8*exp(-1510*(1/298.-1/t(i,k)))
    72         henry_t=henry_t*(1 + K1/10.**(-ph) + K1*K2/(10.**(-ph))**2)
    73         f_a=henry_t/101.325*R*t(i,k)*qliq*zrho(i,k)/rho_water
    74         scav(i,k)=f_a/(1.+f_a)
    75       ENDDO
    76       ENDDO
    77       ELSEIF (it.EQ.2) THEN
    78       DO k=1, klev
    79       DO i=1, klon
    80         scav(i,k)=frac_fine_scav
    81       ENDDO
    82       ENDDO
    83       ELSEIF (it.EQ.3) THEN
    84       DO k=1, klev
    85       DO i=1, klon
    86         scav(i,k)=frac_coar_scav
    87       ENDDO
    88       ENDDO
    89       ELSEIF (it.EQ.4) THEN
    90       DO k=1, klev
    91       DO i=1, klon
    92         scav(i,k)=frac_coar_scav
    93       ENDDO
    94       ENDDO
    95       ELSE
    96         PRINT *,'it non pris en compte'
    97         STOP
    98       ENDIF
    99 c
    100 ! NHL
    101 ! Auxiliary variables defined to deal with the fact that precipitation
    102 ! fluxes are defined on klev levels only.
    103 ! NHL
    104 !
    105       flxr_aux(:,klev+1)=0.0
    106       flxs_aux(:,klev+1)=0.0
    107       flxr_aux(:,1:klev)=flxr(:,:)
    108       flxs_aux(:,1:klev)=flxs(:,:)
    109       DO k=klev, 1, -1
    110       DO i=1, klon
    111 c--scavenging
    112         beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1)
    113         beta=beta/zdz(i,k)/qliq/zrho(i,k)
    114         beta=MAX(0.0,beta)
    115         dx=x(i,k)*(exp(-scav(i,k)*beta*pdtime)-1.)
    116         x(i,k)=x(i,k)+dx
    117         his_dh(i)=his_dh(i)-dx/RNAVO*
    118      .            masse*1.e3*1.e6*zdz(i,k)/pdtime !--mgS/m2/s
    119 c--reevaporation
    120         beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1)
    121         IF (beta.LT.0.) beta=beta/(flxr_aux(i,k+1)+flxs_aux(i,k+1))
    122         IF (flxr_aux(i,k)+flxs_aux(i,k).EQ.0) THEN  !--reevaporation totale
    123           beta=MIN(MAX(0.0,-beta),1.0)
    124         ELSE                          !--reevaporation non totale pour aerosols
    125           !print *,'FRAC USED IN INSCAV_SPL'
    126           beta=MIN(MAX(0.0,-beta)*frac,1.0)
    127         ENDIF
    128         dx=beta*his_dh(i)*RNAVO/masse/1.e3/1.e6/zdz(i,k)*pdtime !ORIG LINE
    129 ! funny line for TL/AD
    130 ! AD test works without (x) and for xd = dxd*1.e5 : 2.79051851638 times the 0.
    131 ! AD test does not work with the line : 754592404.083 times the 0.
    132 ! problem seems to be linked to the largest dx wrt x
    133 !      x(i, k) = x(i, k) + dx
    134 !        x(i, k) = x(i, k) + dx         ! THIS LINE WAS COMMENTED OUT ORIGINALY !nhl
    135         his_dh(i)=(1.-beta)*his_dh(i)
    136       ENDDO
    137       ENDDO
    138 c
    139       RETURN
    140       END
     54  !--101.325  m3/l x Pa/atm
     55  !--R        Pa.m3/mol/K
     56  !
     57  !------------------------------------------
     58  !
     59  !nhl      IF (it.EQ.2.OR.it.EQ.3) THEN !--aerosol  ! AS IT WAS FIRST
     60  IF (it.EQ.2.OR.it.EQ.3.OR.it.EQ.4) THEN !--aerosol
     61    frac=frac_aer
     62  ELSE                                                !--gas
     63    frac=frac_gas
     64  ENDIF
     65  !
     66  IF (it.EQ.1) THEN
     67  DO k=1, klev
     68  DO i=1, klon
     69    henry_t=henry*exp(-kk*(1./298.-1./t(i,k)))    !--mol/l/atm
     70    K1=1.2e-2*exp(-2010*(1/298.-1/t(i,k)))
     71    K2=6.6e-8*exp(-1510*(1/298.-1/t(i,k)))
     72    henry_t=henry_t*(1 + K1/10.**(-ph) + K1*K2/(10.**(-ph))**2)
     73    f_a=henry_t/101.325*R*t(i,k)*qliq*zrho(i,k)/rho_water
     74    scav(i,k)=f_a/(1.+f_a)
     75  ENDDO
     76  ENDDO
     77  ELSEIF (it.EQ.2) THEN
     78  DO k=1, klev
     79  DO i=1, klon
     80    scav(i,k)=frac_fine_scav
     81  ENDDO
     82  ENDDO
     83  ELSEIF (it.EQ.3) THEN
     84  DO k=1, klev
     85  DO i=1, klon
     86    scav(i,k)=frac_coar_scav
     87  ENDDO
     88  ENDDO
     89  ELSEIF (it.EQ.4) THEN
     90  DO k=1, klev
     91  DO i=1, klon
     92    scav(i,k)=frac_coar_scav
     93  ENDDO
     94  ENDDO
     95  ELSE
     96    PRINT *,'it non pris en compte'
     97    STOP
     98  ENDIF
     99  !
     100  ! NHL
     101  ! Auxiliary variables defined to deal with the fact that precipitation
     102  ! fluxes are defined on klev levels only.
     103  ! NHL
     104  !
     105  flxr_aux(:,klev+1)=0.0
     106  flxs_aux(:,klev+1)=0.0
     107  flxr_aux(:,1:klev)=flxr(:,:)
     108  flxs_aux(:,1:klev)=flxs(:,:)
     109  DO k=klev, 1, -1
     110  DO i=1, klon
     111  !--scavenging
     112    beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1)
     113    beta=beta/zdz(i,k)/qliq/zrho(i,k)
     114    beta=MAX(0.0,beta)
     115    dx=x(i,k)*(exp(-scav(i,k)*beta*pdtime)-1.)
     116    x(i,k)=x(i,k)+dx
     117    his_dh(i)=his_dh(i)-dx/RNAVO* &
     118          masse*1.e3*1.e6*zdz(i,k)/pdtime !--mgS/m2/s
     119  !--reevaporation
     120    beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1)
     121    IF (beta.LT.0.) beta=beta/(flxr_aux(i,k+1)+flxs_aux(i,k+1))
     122    IF (flxr_aux(i,k)+flxs_aux(i,k).EQ.0) THEN  !--reevaporation totale
     123      beta=MIN(MAX(0.0,-beta),1.0)
     124    ELSE                          !--reevaporation non totale pour aerosols
     125      ! !print *,'FRAC USED IN INSCAV_SPL'
     126      beta=MIN(MAX(0.0,-beta)*frac,1.0)
     127    ENDIF
     128    dx=beta*his_dh(i)*RNAVO/masse/1.e3/1.e6/zdz(i,k)*pdtime !ORIG LINE
     129  ! funny line for TL/AD
     130  ! AD test works without (x) and for xd = dxd*1.e5 : 2.79051851638 times the 0.
     131  ! AD test does not work with the line : 754592404.083 times the 0.
     132  ! problem seems to be linked to the largest dx wrt x
     133    ! x(i, k) = x(i, k) + dx
     134    !  x(i, k) = x(i, k) + dx         ! THIS LINE WAS COMMENTED OUT ORIGINALY !nhl
     135    his_dh(i)=(1.-beta)*his_dh(i)
     136  ENDDO
     137  ENDDO
     138  !
     139  RETURN
     140END SUBROUTINE inscav_spl
  • LMDZ6/trunk/libf/phylmd/Dust/kg_to_cm3.f90

    r5245 r5246  
    1       SUBROUTINE kg_to_cm3(pplay,t_seri,tr_seri)
    2 c     
    3       USE dimphy
    4       USE infotrac
    5       IMPLICIT NONE
    6 c
    7       INCLUDE "dimensions.h"
    8       INCLUDE "YOMCST.h"
    9 c     
    10       REAL t_seri(klon,klev), pplay(klon,klev)
    11       REAL tr_seri(klon,klev)
    12       REAL zrho
    13       INTEGER i, k
    14 c
    15       DO k = 1, klev
    16       DO i = 1, klon
    17         zrho=pplay(i,k)/t_seri(i,k)/RD
    18         tr_seri(i,k)=tr_seri(i,k)/1.e6*zrho
    19       ENDDO
    20       ENDDO
    21 c
    22       END
     1SUBROUTINE kg_to_cm3(pplay,t_seri,tr_seri)
     2  !
     3  USE dimphy
     4  USE infotrac
     5  IMPLICIT NONE
     6  !
     7  INCLUDE "dimensions.h"
     8  INCLUDE "YOMCST.h"
     9  !
     10  REAL :: t_seri(klon,klev), pplay(klon,klev)
     11  REAL :: tr_seri(klon,klev)
     12  REAL :: zrho
     13  INTEGER :: i, k
     14  !
     15  DO k = 1, klev
     16  DO i = 1, klon
     17    zrho=pplay(i,k)/t_seri(i,k)/RD
     18    tr_seri(i,k)=tr_seri(i,k)/1.e6*zrho
     19  ENDDO
     20  ENDDO
     21  !
     22END SUBROUTINE kg_to_cm3
  • LMDZ6/trunk/libf/phylmd/Dust/minmaxqfi2.f90

    r5245 r5246  
    1       subroutine minmaxqfi2(zq,qmin,qmax,comment)
    2 c
    3       USE dimphy
    4       USE infotrac
    5       INCLUDE "dimensions.h"
     1subroutine minmaxqfi2(zq,qmin,qmax,comment)
     2  !
     3  USE dimphy
     4  USE infotrac
     5  INCLUDE "dimensions.h"
    66
    7 !      character*20 comment
    8       character*(*) comment
    9       real qmin,qmax
    10       real zq(klon,klev)
     7   ! character*20 comment
     8  character(len=*) :: comment
     9  real :: qmin,qmax
     10  real :: zq(klon,klev)
    1111
    12       integer ijmin, lmin, ijlmin
    13       integer ijmax, lmax, ijlmax
     12  integer :: ijmin, lmin, ijlmin
     13  integer :: ijmax, lmax, ijlmax
    1414
    15       integer ismin,ismax
     15  integer :: ismin,ismax
    1616
    17       ijlmin=ismin(klon*klev,zq,1)
    18       lmin=(ijlmin-1)/klon+1
    19       ijmin=ijlmin-(lmin-1)*klon
    20       zqmin=zq(ijmin,lmin)
     17  ijlmin=ismin(klon*klev,zq,1)
     18  lmin=(ijlmin-1)/klon+1
     19  ijmin=ijlmin-(lmin-1)*klon
     20  zqmin=zq(ijmin,lmin)
    2121
    22       ijlmax=ismax(klon*klev,zq,1)
    23       lmax=(ijlmax-1)/klon+1
    24       ijmax=ijlmax-(lmax-1)*klon
    25       zqmax=zq(ijmax,lmax)
    26  
    27       if(zqmin.lt.qmin.or.zqmax.gt.qmax)
    28      s     write(*,9999) comment,
    29      s     ijmin,lmin,zqmin,ijmax,lmax,zqmax
     22  ijlmax=ismax(klon*klev,zq,1)
     23  lmax=(ijlmax-1)/klon+1
     24  ijmax=ijlmax-(lmax-1)*klon
     25  zqmax=zq(ijmax,lmax)
    3026
    31       return
    32 9999  format(a20,2('  q(',i4,',',i2,')=',e12.5))
    33       end
     27  if(zqmin.lt.qmin.or.zqmax.gt.qmax) &
     28        write(*,9999) comment, &
     29        ijmin,lmin,zqmin,ijmax,lmax,zqmax
     30
     31  return
     329999   format(a20,2('  q(',i4,',',i2,')=',e12.5))
     33end subroutine minmaxqfi2
  • LMDZ6/trunk/libf/phylmd/Dust/minmaxsource.f90

    r5245 r5246  
    1       subroutine minmaxsource(zq,qmin,qmax,comment)
     1subroutine minmaxsource(zq,qmin,qmax,comment)
    22
    3       USE dimphy
    4       USE infotrac
     3  USE dimphy
     4  USE infotrac
    55
    6       INCLUDE "dimensions.h"
     6  INCLUDE "dimensions.h"
    77
    8 !      character*20 comment
    9       character*(*) comment
    10       real qmin,qmax
    11       real zq(klon,nbtr)
     8   ! character*20 comment
     9  character(len=*) :: comment
     10  real :: qmin,qmax
     11  real :: zq(klon,nbtr)
    1212
    13       integer ijmin, lmin, ijlmin
    14       integer ijmax, lmax, ijlmax
     13  integer :: ijmin, lmin, ijlmin
     14  integer :: ijmax, lmax, ijlmax
    1515
    16       integer ismin,ismax
     16  integer :: ismin,ismax
    1717
    18       ijlmin=ismin(klon*nbtr,zq,1)
    19       lmin=(ijlmin-1)/klon+1
    20       ijmin=ijlmin-(lmin-1)*klon
    21       zqmin=zq(ijmin,lmin)
     18  ijlmin=ismin(klon*nbtr,zq,1)
     19  lmin=(ijlmin-1)/klon+1
     20  ijmin=ijlmin-(lmin-1)*klon
     21  zqmin=zq(ijmin,lmin)
    2222
    23       ijlmax=ismax(klon*nbtr,zq,1)
    24       lmax=(ijlmax-1)/klon+1
    25       ijmax=ijlmax-(lmax-1)*klon
    26       zqmax=zq(ijmax,lmax)
     23  ijlmax=ismax(klon*nbtr,zq,1)
     24  lmax=(ijlmax-1)/klon+1
     25  ijmax=ijlmax-(lmax-1)*klon
     26  zqmax=zq(ijmax,lmax)
    2727
    28       if(zqmin.lt.qmin.or.zqmax.gt.qmax)
    29      s     write(*,9999) comment,
    30         ijmin,lmin,zqmin,ijmax,lmax,zqmax
     28  if(zqmin.lt.qmin.or.zqmax.gt.qmax) &
     29        write(*,9999) comment, &
     30        ijmin,lmin,zqmin,ijmax,lmax,zqmax
    3131
    32       return
    33 9999  format(a20,2('  q(',i4,',',i2,')=',e12.5))
    34       end
     32  return
     339999   format(a20,2('  q(',i4,',',i2,')=',e12.5))
     34end subroutine minmaxsource
  • LMDZ6/trunk/libf/phylmd/Dust/neutral.f90

    r5245 r5246  
    1 c***********************************************************************
    2         subroutine neutral(u10_mps,ustar_mps,obklen_m,
    3      +         u10n_mps )
    4 c-----------------------------------------------------------------------       
    5 c subroutine to compute u10 neutral wind speed
    6 c inputs
    7 c       u10_mps - wind speed at 10 m (m/s)
    8 c       ustar_mps - friction velocity (m/s)
    9 c       obklen_m - monin-obukhov length scale (m)
    10 c outputs
    11 c       u10n_mps - wind speed at 10 m under neutral conditions (m/s)
    12 c following code assumes reference height Z is 10m, consistent with use
    13 c of u10 and u10_neutral.  If not, code
    14 c should be changed so that constants of 50. and 160. in equations
    15 c below are changed to -5 * Z and -16 * Z respectively.
    16 c Reference:  G. L. Geernaert.  'Bulk parameterizations for the
    17 c wind stress and heat fluxes,' in Surface Waves and Fluxes, Vol. I,
    18 c Current Theory, Geernaert and W.J. Plant, editors, Kluwer Academic
    19 c Publishers, Boston, MA, 1990.
    20 c subroutine written Feb 2001 by eg chapman
    21 c adapted to LMD-ZT by E. Cosme 310801
    22 c Following Will Shaw (PNL, Seattle) the theory applied for flux
    23 c calculation with the scheme of Nightingale et al. (2000) does not
    24 c hold anymore when -1<obklen<20. In this case, u10n is set to 0,
    25 c so that the transfer velocity  computed in nightingale.F will also
    26 c be 0. The flux is then set to 0.
    27 c----------------------------------------------------------------------         
    28 c
    29       USE dimphy
    30       INCLUDE "dimensions.h"
    31 c
    32         real u10_mps(klon),ustar_mps(klon),obklen_m(klon)
    33         real u10n_mps(klon)
    34         real pi,von_karman
    35 c      parameter (pi = 3.141592653589793, von_karman = 0.4)   
    36 c pour etre coherent avec vk de bl_for_dms.F
    37         parameter (pi = 3.141592653589793, von_karman = 0.35)   
    38 c
    39         real phi, phi_inv, phi_inv_sq, f1, f2, f3, dum1, psi
    40         integer i
     1!***********************************************************************
     2  subroutine neutral(u10_mps,ustar_mps,obklen_m, &
     3          u10n_mps )
     4  !-----------------------------------------------------------------------     
     5  ! subroutine to compute u10 neutral wind speed
     6  ! inputs
     7  ! u10_mps - wind speed at 10 m (m/s)
     8  ! ustar_mps - friction velocity (m/s)
     9  ! obklen_m - monin-obukhov length scale (m)
     10  ! outputs
     11  ! u10n_mps - wind speed at 10 m under neutral conditions (m/s)
     12  ! following code assumes reference height Z is 10m, consistent with use
     13  ! of u10 and u10_neutral.  If not, code
     14  ! should be changed so that constants of 50. and 160. in equations
     15  ! below are changed to -5 * Z and -16 * Z respectively.
     16  ! Reference:  G. L. Geernaert.  'Bulk parameterizations for the
     17  ! wind stress and heat fluxes,' in Surface Waves and Fluxes, Vol. I,
     18  ! Current Theory, Geernaert and W.J. Plant, editors, Kluwer Academic
     19  ! Publishers, Boston, MA, 1990.
     20  ! subroutine written Feb 2001 by eg chapman
     21  ! adapted to LMD-ZT by E. Cosme 310801
     22  ! Following Will Shaw (PNL, Seattle) the theory applied for flux
     23  ! calculation with the scheme of Nightingale et al. (2000) does not
     24  ! hold anymore when -1<obklen<20. In this case, u10n is set to 0,
     25  ! so that the transfer velocity  computed in nightingale.F will also
     26  ! be 0. The flux is then set to 0.
     27  !----------------------------------------------------------------------               
     28  !
     29  USE dimphy
     30  INCLUDE "dimensions.h"
     31  !
     32    real :: u10_mps(klon),ustar_mps(klon),obklen_m(klon)
     33    real :: u10n_mps(klon)
     34    real :: pi,von_karman
     35    ! parameter (pi = 3.141592653589793, von_karman = 0.4)     
     36  ! pour etre coherent avec vk de bl_for_dms.F
     37    parameter (pi = 3.141592653589793, von_karman = 0.35)
     38  !
     39    real :: phi, phi_inv, phi_inv_sq, f1, f2, f3, dum1, psi
     40    integer :: i
    4141
    4242
    43         psi = 0.
    44         do i=1,klon
     43    psi = 0.
     44    do i=1,klon
    4545
    46         if (u10_mps(i) .lt. 0.) u10_mps(i) = 0.0
    47        
    48         if  (obklen_m(i) .lt. 0.) then
    49                 phi = (1. - 160./obklen_m(i))**(-0.25)
    50                 phi_inv = 1./phi
    51                 phi_inv_sq = 1./phi * 1./phi
    52                 f1 = (1. + phi_inv) / 2.
    53                 f2 = (1. + phi_inv_sq)/2.
    54 c following to avoid numerical overruns. recall tan(90deg)=infinity
    55                 dum1 = min (1.e24, phi_inv)
    56                 f3 = atan(dum1)
    57                 psi = 2.*log(f1) + log(f2) - 2.*f3 + pi/2.   
    58         else if (obklen_m(i) .gt. 0.) then
    59                 psi = -50. / obklen_m(i)
    60         end if
     46    if (u10_mps(i) .lt. 0.) u10_mps(i) = 0.0
    6147
    62         u10n_mps(i) = u10_mps(i) + (ustar_mps(i) * psi /von_karman )
    63 c u10n set to 0. if -1 < obklen < 20
    64         if ((obklen_m(i).gt.-1.).and.(obklen_m(i).lt.20.)) then
    65             u10n_mps(i) = 0.
    66         endif
    67         if (u10n_mps(i) .lt. 0.) u10n_mps(i) = 0.0
     48    if  (obklen_m(i) .lt. 0.) then
     49            phi = (1. - 160./obklen_m(i))**(-0.25)
     50            phi_inv = 1./phi
     51            phi_inv_sq = 1./phi * 1./phi
     52            f1 = (1. + phi_inv) / 2.
     53            f2 = (1. + phi_inv_sq)/2.
     54  ! following to avoid numerical overruns. recall tan(90deg)=infinity
     55            dum1 = min (1.e24, phi_inv)
     56            f3 = atan(dum1)
     57            psi = 2.*log(f1) + log(f2) - 2.*f3 + pi/2.
     58    else if (obklen_m(i) .gt. 0.) then
     59            psi = -50. / obklen_m(i)
     60    end if
    6861
    69         enddo
    70         return
    71         end
    72 c***********************************************************************
     62    u10n_mps(i) = u10_mps(i) + (ustar_mps(i) * psi /von_karman )
     63  ! u10n set to 0. if -1 < obklen < 20
     64    if ((obklen_m(i).gt.-1.).and.(obklen_m(i).lt.20.)) then
     65        u10n_mps(i) = 0.
     66    endif
     67    if (u10n_mps(i) .lt. 0.) u10n_mps(i) = 0.0
     68
     69    enddo
     70    return
     71end subroutine neutral
     72!***********************************************************************
  • LMDZ6/trunk/libf/phylmd/Dust/nightingale.f90

    r5245 r5246  
    1       SUBROUTINE nightingale(u, v, u_10m, v_10m, paprs, pplay,
    2      .                       cdragh, cdragm, t, q, ftsol, tsol,
    3      .                       pctsrf, lmt_dmsconc, lmt_dms)
    4 c
    5       USE dimphy
    6       USE indice_sol_mod
    7       IMPLICIT NONE
    8 c
    9       INCLUDE "dimensions.h"
    10       INCLUDE "YOMCST.h"
    11 c
    12       REAL u(klon,klev), v(klon,klev)
    13       REAL u_10m(klon), v_10m(klon)
    14       REAL ftsol(klon,nbsrf)
    15       REAL tsol(klon)
    16       REAL paprs(klon,klev+1), pplay(klon,klev)
    17       REAL t(klon,klev)
    18       REAL q(klon,klev)
    19       REAL cdragh(klon), cdragm(klon)
    20       REAL pctsrf(klon,nbsrf)
    21       REAL lmt_dmsconc(klon)  ! concentration oceanique DMS
    22       REAL lmt_dms(klon)      ! flux de DMS
    23 c
    24       REAL ustar(klon), obklen(klon)
    25       REAL u10(klon), u10n(klon)
    26       REAL tvelocity, schmidt_corr
    27       REAL t1, t2, t3, t4, viscosity_kin, diffusivity, schmidt
    28       INTEGER i
    29 c
    30       CALL bl_for_dms(u, v, paprs, pplay, cdragh, cdragm,
    31      .                t, q, tsol, ustar, obklen)
    32 c
    33       DO i=1,klon
    34         u10(i)=SQRT(u_10m(i)**2+v_10m(i)**2)
    35       ENDDO
    36 c
    37       CALL neutral(u10, ustar, obklen, u10n)
    38 c
    39       DO i=1,klon
    40 c
    41 c       tvelocity - transfer velocity, also known as kw (cm/s)
    42 c       schmidt_corr - Schmidt number correction factor (dimensionless)
    43 c Reference:  Nightingale, P.D., G. Malin, C. S. Law, J. J. Watson, P.S. Liss
    44 c  M. I. Liddicoat, J. Boutin, R.C. Upstill-Goddard. 'In situ evaluation
    45 c  of air-sea gas exchange parameterizations using conservative and
    46 c  volatile tracers.'  Glob. Biogeochem. Cycles, 14:373-387, 2000.
    47 c compute transfer velocity using u10neutral     
    48 c
    49       tvelocity = 0.222*u10n(i)*u10n(i) + 0.333*u10n(i)
    50 c
    51 c above expression gives tvelocity in cm/hr. convert to cm/s. 1hr =3600 sec
     1SUBROUTINE nightingale(u, v, u_10m, v_10m, paprs, pplay, &
     2        cdragh, cdragm, t, q, ftsol, tsol, &
     3        pctsrf, lmt_dmsconc, lmt_dms)
     4  !
     5  USE dimphy
     6  USE indice_sol_mod
     7  IMPLICIT NONE
     8  !
     9  INCLUDE "dimensions.h"
     10  INCLUDE "YOMCST.h"
     11  !
     12  REAL :: u(klon,klev), v(klon,klev)
     13  REAL :: u_10m(klon), v_10m(klon)
     14  REAL :: ftsol(klon,nbsrf)
     15  REAL :: tsol(klon)
     16  REAL :: paprs(klon,klev+1), pplay(klon,klev)
     17  REAL :: t(klon,klev)
     18  REAL :: q(klon,klev)
     19  REAL :: cdragh(klon), cdragm(klon)
     20  REAL :: pctsrf(klon,nbsrf)
     21  REAL :: lmt_dmsconc(klon)  ! concentration oceanique DMS
     22  REAL :: lmt_dms(klon)      ! flux de DMS
     23  !
     24  REAL :: ustar(klon), obklen(klon)
     25  REAL :: u10(klon), u10n(klon)
     26  REAL :: tvelocity, schmidt_corr
     27  REAL :: t1, t2, t3, t4, viscosity_kin, diffusivity, schmidt
     28  INTEGER :: i
     29  !
     30  CALL bl_for_dms(u, v, paprs, pplay, cdragh, cdragm, &
     31        t, q, tsol, ustar, obklen)
     32  !
     33  DO i=1,klon
     34    u10(i)=SQRT(u_10m(i)**2+v_10m(i)**2)
     35  ENDDO
     36  !
     37  CALL neutral(u10, ustar, obklen, u10n)
     38  !
     39  DO i=1,klon
     40  !
     41  ! tvelocity - transfer velocity, also known as kw (cm/s)
     42  ! schmidt_corr - Schmidt number correction factor (dimensionless)
     43  ! Reference:  Nightingale, P.D., G. Malin, C. S. Law, J. J. Watson, P.S. Liss
     44  !  M. I. Liddicoat, J. Boutin, R.C. Upstill-Goddard. 'In situ evaluation
     45  !  of air-sea gas exchange parameterizations using conservative and
     46  !  volatile tracers.'  Glob. Biogeochem. Cycles, 14:373-387, 2000.
     47  ! compute transfer velocity using u10neutral
     48  !
     49  tvelocity = 0.222*u10n(i)*u10n(i) + 0.333*u10n(i)
     50  !
     51  ! above expression gives tvelocity in cm/hr. convert to cm/s. 1hr =3600 sec
    5252
    53       tvelocity = tvelocity / 3600.     
     53  tvelocity = tvelocity / 3600.
    5454
    55 c compute the correction factor, which for Nightingale parameterization is
    56 c based on how different the schmidt number is from 600.   
    57 c correction factor based on temperature in Kelvin. good
    58 c only for t<=30 deg C.  for temperatures above that, set correction factor
    59 c equal to value at 30 deg C.
     55  ! compute the correction factor, which for Nightingale parameterization is
     56  ! based on how different the schmidt number is from 600.
     57  ! correction factor based on temperature in Kelvin. good
     58  ! only for t<=30 deg C.  for temperatures above that, set correction factor
     59  ! equal to value at 30 deg C.
    6060
    61       IF (ftsol(i,is_oce) .LE. 303.15) THEN
    62          t1 = ftsol(i,is_oce)
    63       ELSE
    64          t1 = 303.15
    65       ENDIF       
     61  IF (ftsol(i,is_oce) .LE. 303.15) THEN
     62     t1 = ftsol(i,is_oce)
     63  ELSE
     64     t1 = 303.15
     65  ENDIF
    6666
    67       t2 = t1 * t1
    68       t3 = t2 * t1
    69       t4 = t3 * t1
    70       viscosity_kin = 3.0363e-9*t4 - 3.655198e-6*t3 + 1.65333e-3*t2
    71      +      - 3.332083e-1*t1 + 25.26819
    72       diffusivity = 0.01922 * exp(-2177.1/t1)
    73       schmidt = viscosity_kin / diffusivity
    74       schmidt_corr = (schmidt/600.)**(-.5)               
    75 c
    76       lmt_dms(i) = tvelocity  *  pctsrf(i,is_oce)
    77      .        * lmt_dmsconc(i)/1.0e12 * schmidt_corr * RNAVO
    78 c
    79       IF (lmt_dmsconc(i).LE.1.e-20) lmt_dms(i)=0.0
    80 c
    81       ENDDO
    82 c
    83       END
     67  t2 = t1 * t1
     68  t3 = t2 * t1
     69  t4 = t3 * t1
     70  viscosity_kin = 3.0363e-9*t4 - 3.655198e-6*t3 + 1.65333e-3*t2 &
     71        - 3.332083e-1*t1 + 25.26819
     72  diffusivity = 0.01922 * exp(-2177.1/t1)
     73  schmidt = viscosity_kin / diffusivity
     74  schmidt_corr = (schmidt/600.)**(-.5)
     75  !
     76  lmt_dms(i) = tvelocity  *  pctsrf(i,is_oce) &
     77        * lmt_dmsconc(i)/1.0e12 * schmidt_corr * RNAVO
     78  !
     79  IF (lmt_dmsconc(i).LE.1.e-20) lmt_dms(i)=0.0
     80  !
     81  ENDDO
     82  !
     83END SUBROUTINE nightingale
  • LMDZ6/trunk/libf/phylmd/Dust/precuremission.f90

    r5245 r5246  
    1 C Subroutine that calculates the emission of aerosols precursors
    2       SUBROUTINE precuremission(ftsol,u10m_ec,v10m_ec,
    3      .                          pctsrf,u_seri,v_seri,paprs,pplay,cdragh,
    4      .                          cdragm,t_seri,q_seri,tsol,fracso2emis,
    5      .                          frach2sofso2,bateau,zdz,zalt,
    6      .                          kminbc,kmaxbc,pdtphys,scale_param_bb,
    7      .                          scale_param_ind,iregion_ind,iregion_bb,
    8      .                          nbreg_ind, nbreg_bb,
    9      .                          lmt_so2ff_l,lmt_so2ff_h,lmt_so2nff,
    10      .                          lmt_so2ba,lmt_so2bb_l,lmt_so2bb_h,
    11      .                          lmt_so2volc_cont,lmt_altvolc_cont,
    12      .                          lmt_so2volc_expl,lmt_altvolc_expl,
    13      .                          lmt_dmsbio,lmt_h2sbio, lmt_dmsconc,
    14      .                          lmt_dms,id_prec,id_fine,
    15      .                                 flux_sparam_ind,flux_sparam_bb,
    16      .                                 source_tr,flux_tr,tr_seri)
    17 
    18       USE dimphy
    19       USE indice_sol_mod
    20       USE infotrac
    21 !      USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
    22       IMPLICIT NONE
    23 
    24       INCLUDE "dimensions.h"
    25       INCLUDE "chem.h"
    26       INCLUDE "chem_spla.h"
    27       INCLUDE "YOMCST.h"
    28       INCLUDE "paramet.h"
    29 
    30 c============================= INPUT ===================================
    31       INTEGER kminbc, kmaxbc
    32       REAL ftsol(klon,nbsrf)  ! temperature du sol par type
    33       REAL tsol(klon)         ! temperature du sol moyenne
    34       REAL t_seri(klon,klev)  ! temperature
    35       REAL u_seri(klon,klev)  ! vent
    36       REAL v_seri(klon,klev)  ! vent
    37       REAL q_seri(klon,klev)  ! vapeur d eau kg/kg
    38       REAL u10m_ec(klon), v10m_ec(klon)  ! vent a 10 metres
    39       REAL pctsrf(klon,nbsrf)
    40       REAL pdtphys  ! pas d'integration pour la physique (seconde)
    41       REAL paprs(klon,klev+1)  ! pression pour chaque inter-couche (en Pa)
    42       REAL pplay(klon,klev)  ! pression pour le mileu de chaque couche (en Pa)
    43       REAL cdragh(klon), cdragm(klon)     
    44       REAL fracso2emis        !--fraction so2 emis en so2
    45       REAL frach2sofso2       !--fraction h2s from so2
    46       REAL zdz(klon,klev)
    47       LOGICAL edgar, bateau
    48       INTEGER id_prec,id_fine
    49 c
    50 c------------------------- Scaling Parameters --------------------------
    51 c
    52       INTEGER nbreg_ind, nbreg_bb
    53       INTEGER iregion_ind(klon)  !Defines regions for SO2, BC & OM
    54       INTEGER iregion_bb(klon)  !Defines regions for SO2, BC & OM
    55       REAL scale_param_bb(nbreg_bb)  !Scaling parameter for biomas burning
    56       REAL scale_param_ind(nbreg_ind) !Scaling parameter for industrial emissions
    57 c
    58 c============================= OUTPUT ==================================
    59 c
    60       REAL source_tr(klon,nbtr)
    61       REAL flux_tr(klon,nbtr)
    62       REAL tr_seri(klon,klev,nbtr) ! traceur
    63       REAL flux_sparam_ind(klon), flux_sparam_bb(klon)
    64 c========================= LOCAL VARIABLES =============================
    65       INTEGER i, k, kkk_cont(klon), kkk_expl(klon)
    66       REAL zalt(klon,klev), zaltmid(klon,klev)
    67       REAL zzdz
    68 c------------------------- SULFUR emissions ----------------------------
    69       REAL lmt_so2volc_cont(klon)  ! emissions so2 volcan (continuous)
    70       REAL lmt_altvolc_cont(klon)  ! altitude  so2 volcan (continuous)
    71       REAL lmt_so2volc_expl(klon)  ! emissions so2 volcan (explosive)
    72       REAL lmt_altvolc_expl(klon)  ! altitude  so2 volcan (explosive)
    73       REAL lmt_so2ff_l(klon)       ! emissions so2 fossil fuel (low)
    74       REAL lmt_so2ff_h(klon)       ! emissions so2 fossil fuel (high)
    75       REAL lmt_so2nff(klon)        ! emissions so2 non-fossil fuel
    76       REAL lmt_so2bb_l(klon)       ! emissions de so2 biomass burning (low)
    77       REAL lmt_so2bb_h(klon)       ! emissions de so2 biomass burning (high)
    78       REAL lmt_so2ba(klon)         ! emissions de so2 bateau
    79       REAL lmt_dms(klon)           ! emissions de dms
    80       REAL lmt_dmsconc(klon)       ! concentration de dms oceanique
    81       REAL lmt_dmsbio(klon)        ! emissions de dms bio
    82       REAL lmt_h2sbio(klon)        ! emissions de h2s bio
    83                        
    84       EXTERNAL condsurfs, liss, nightingale
    85 c=========================================================================
    86 c Modifications introduced by NHL
    87 c -Variables to save fluxes were introduced
    88 c -lmt_so2ba was multiplied by fracso2emis in line 117
    89 c -scale_param_bb was introduced in line 105
    90 c The last two modifications were errors existing in the original version
    91 c=========================================================================
    92 c=========================================================================
    93 c                        LOW LEVEL EMISSIONS
    94 c=========================================================================
    95                        
    96          CALL nightingale(u_seri, v_seri, u10m_ec, v10m_ec, paprs,
    97      .                 pplay, cdragh, cdragm, t_seri, q_seri, ftsol,
    98      .                 tsol, pctsrf, lmt_dmsconc, lmt_dms)
    99 
    100       IF (.not.bateau) THEN
    101         DO i=1, klon     
    102           lmt_so2ba(i)=0.0
    103         ENDDO
    104       ENDIF
    105 
    106       DO i=1, klon
    107          IF (iregion_ind(i).GT.0) THEN
    108        IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec)
    109      .             + fracso2emis
    110      .             *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4
    111      .             +scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4
    112      .                   *frach2sofso2            ! molec/m2/s
    113 c
    114       IF(id_fine>0) source_tr(i,id_fine)=
    115      .                source_tr(i,id_fine)+(1-fracso2emis)
    116      .                *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)
    117      .                *1.e4*masse_ammsulfate/RNAVO  ! g/m2/s
    118 c
    119        IF(id_prec>0)   flux_tr(i,id_prec)=flux_tr(i,id_prec) + (
    120      .               scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+
    121      .                lmt_so2ff_h(i))
    122      .                *frach2sofso2
    123      .               +scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+
    124      .                lmt_so2ff_h(i))
    125      .                *fracso2emis
    126      .                )*1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
    127 c
    128       IF(id_fine>0)  flux_tr(i,id_fine)=
    129      . flux_tr(i,id_fine)+(1-fracso2emis)
    130      .               *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+
    131      .                lmt_so2ff_h(i))
    132      .               *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    133 c
    134       flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis)
    135      .               *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+
    136      .                lmt_so2ff_h(i))
    137      .               *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    138          ENDIF
    139          IF (iregion_bb(i).GT.0) THEN
    140       IF(id_prec>0) source_tr(i,id_prec)=
    141      .                  source_tr(i,id_prec) + fracso2emis
    142      .                 *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)
    143      .                   *(1.-pctsrf(i,is_oce))*1.e4
    144 c
    145       IF(id_fine>0)     source_tr(i,id_fine)=
    146      .                   source_tr(i,id_fine)+(1-fracso2emis)
    147      .                  *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)*
    148      .                   (1.-pctsrf(i,is_oce))*1.e4*
    149      .                   masse_ammsulfate/RNAVO  ! g/m2/s
    150 c
    151       IF(id_prec>0)     flux_tr(i,id_prec)=flux_tr(i,id_prec) +
    152      .               (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)
    153      .                 +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))
    154      .                      * (1.-pctsrf(i,is_oce))*fracso2emis
    155      .                 *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
    156 c
    157       IF(id_fine>0) flux_tr(i,id_fine)=
    158      .                flux_tr(i,id_fine)+(1-fracso2emis)
    159      .               *(scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)
    160      .                +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))
    161      .                *(1.-pctsrf(i,is_oce))
    162      .                *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    163 c
    164            flux_sparam_bb(i)=
    165      .                scale_param_bb(iregion_bb(i))*(lmt_so2bb_l(i)+
    166      .                                        lmt_so2bb_h(i))
    167      .                      * (1.-pctsrf(i,is_oce))*fracso2emis
    168      .              *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
    169            flux_sparam_bb(i)= flux_sparam_bb(i) + (1-fracso2emis) *
    170      .               (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)+
    171      .                scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))
    172      .                *(1.-pctsrf(i,is_oce))
    173      .               *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    174          ENDIF
    175       IF(id_prec>0)   source_tr(i,id_prec)=source_tr(i,id_prec)
    176      .                 + fracso2emis
    177      .                 *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4
    178      .                 +(lmt_h2sbio(i)
    179      .                   +lmt_dms(i)+lmt_dmsbio(i))*1.e4            ! molec/m2/s
    180 c
    181       IF(id_fine>0)   source_tr(i,id_fine)=source_tr(i,id_fine)
    182      .                +(1-fracso2emis)
    183      .                *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4*
    184      .                   masse_ammsulfate/RNAVO  ! g/m2/s
    185 c
    186       IF(id_prec>0)   flux_tr(i,id_prec)=flux_tr(i,id_prec)
    187      .               + (lmt_h2sbio(i)
    188      .               +lmt_so2volc_cont(i)+lmt_so2volc_expl(i)
    189      .                 +(lmt_so2ba(i)+lmt_so2nff(i))*fracso2emis
    190      .                 +lmt_dms(i)+lmt_dmsbio(i) )
    191      .              *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
    192 c
    193       IF(id_fine>0)   flux_tr(i,id_fine)=flux_tr(i,id_fine)
    194      .               +(1-fracso2emis)
    195      .               *(lmt_so2ba(i) + lmt_so2nff(i))
    196      .               *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    197 c
    198          flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis)
    199      .               *lmt_so2nff(i)
    200      .               *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
    201 c
    202       ENDDO
    203 
    204 c========================================================================
    205 c                        HIGH LEVEL EMISSIONS
    206 c========================================================================
    207 c  Source de SO2 volcaniques
    208       DO i = 1, klon
    209         kkk_cont(i)=1
    210         kkk_expl(i)=1
    211       ENDDO
    212       DO k=1, klev-1
    213       DO i = 1, klon
    214         zaltmid(i,k)=zalt(i,k)+zdz(i,k)/2.
    215         IF (zalt(i,k+1).LT.lmt_altvolc_cont(i)) kkk_cont(i)=k+1
    216         IF (zalt(i,k+1).LT.lmt_altvolc_expl(i)) kkk_expl(i)=k+1
    217       ENDDO
    218       ENDDO
    219       IF(id_prec>0) THEN
    220       DO i = 1, klon
    221         tr_seri(i,kkk_cont(i),id_prec)=tr_seri(i,kkk_cont(i),id_prec) +
    222      .               lmt_so2volc_cont(i)/zdz(i,kkk_cont(i))/100.*pdtphys
    223         tr_seri(i,kkk_expl(i),id_prec)=tr_seri(i,kkk_expl(i),id_prec) +
    224      .               lmt_so2volc_expl(i)/zdz(i,kkk_expl(i))/100.*pdtphys
    225       ENDDO
    226       ENDIF                                           
    227 c  Sources hautes de SO2     
    228      
    229 c
    230 c--only GEIA SO2 emissions has high emissions
    231 c--unit: molec/cm2/s divided by layer height (in cm) multiplied by timestep
    232 c
    233       k=2                             !introducing emissions in level 2
    234       DO i = 1, klon
    235 c
    236          IF (iregion_bb(i).GT.0) THEN
    237       IF(id_prec>0)   tr_seri(i,k,id_prec)=
    238      .              tr_seri(i,k,id_prec) + fracso2emis
    239      .              *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)
    240      .              /zdz(i,k)/100.*pdtphys
    241 c
    242       IF(id_fine>0)     tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)
    243      .              + (1.-fracso2emis)
    244      .              *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)
    245      .              *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys   !g/cm3
    246          ENDIF
    247          IF (iregion_ind(i).GT.0) THEN
    248        IF(id_prec>0)  tr_seri(i,k,id_prec)=
    249      .              tr_seri(i,k,id_prec) + (fracso2emis
    250      .              *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)
    251      .              + frach2sofso2
    252      .              *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i))
    253      .              /zdz(i,k)/100.*pdtphys
    254 c
    255        IF(id_fine>0)    tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)
    256      .               + (1.-fracso2emis)
    257      .              *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)
    258      .              *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys   !g/cm3
    259          ENDIF
    260 c
    261       ENDDO
    262 
    263       END
     1! Subroutine that calculates the emission of aerosols precursors
     2SUBROUTINE precuremission(ftsol,u10m_ec,v10m_ec, &
     3        pctsrf,u_seri,v_seri,paprs,pplay,cdragh, &
     4        cdragm,t_seri,q_seri,tsol,fracso2emis, &
     5        frach2sofso2,bateau,zdz,zalt, &
     6        kminbc,kmaxbc,pdtphys,scale_param_bb, &
     7        scale_param_ind,iregion_ind,iregion_bb, &
     8        nbreg_ind, nbreg_bb, &
     9        lmt_so2ff_l,lmt_so2ff_h,lmt_so2nff, &
     10        lmt_so2ba,lmt_so2bb_l,lmt_so2bb_h, &
     11        lmt_so2volc_cont,lmt_altvolc_cont, &
     12        lmt_so2volc_expl,lmt_altvolc_expl, &
     13        lmt_dmsbio,lmt_h2sbio, lmt_dmsconc, &
     14        lmt_dms,id_prec,id_fine, &
     15        flux_sparam_ind,flux_sparam_bb, &
     16        source_tr,flux_tr,tr_seri)
     17
     18  USE dimphy
     19  USE indice_sol_mod
     20  USE infotrac
     21   ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb
     22  IMPLICIT NONE
     23
     24  INCLUDE "dimensions.h"
     25  INCLUDE "chem.h"
     26  INCLUDE "chem_spla.h"
     27  INCLUDE "YOMCST.h"
     28  INCLUDE "paramet.h"
     29
     30  !============================= INPUT ===================================
     31  INTEGER :: kminbc, kmaxbc
     32  REAL :: ftsol(klon,nbsrf)  ! temperature du sol par type
     33  REAL :: tsol(klon)         ! temperature du sol moyenne
     34  REAL :: t_seri(klon,klev)  ! temperature
     35  REAL :: u_seri(klon,klev)  ! vent
     36  REAL :: v_seri(klon,klev)  ! vent
     37  REAL :: q_seri(klon,klev)  ! vapeur d eau kg/kg
     38  REAL :: u10m_ec(klon), v10m_ec(klon)  ! vent a 10 metres
     39  REAL :: pctsrf(klon,nbsrf)
     40  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     41  REAL :: paprs(klon,klev+1)  ! pression pour chaque inter-couche (en Pa)
     42  REAL :: pplay(klon,klev)  ! pression pour le mileu de chaque couche (en Pa)
     43  REAL :: cdragh(klon), cdragm(klon)
     44  REAL :: fracso2emis        !--fraction so2 emis en so2
     45  REAL :: frach2sofso2       !--fraction h2s from so2
     46  REAL :: zdz(klon,klev)
     47  LOGICAL :: edgar, bateau
     48  INTEGER :: id_prec,id_fine
     49  !
     50  !------------------------- Scaling Parameters --------------------------
     51  !
     52  INTEGER :: nbreg_ind, nbreg_bb
     53  INTEGER :: iregion_ind(klon)  !Defines regions for SO2, BC & OM
     54  INTEGER :: iregion_bb(klon)  !Defines regions for SO2, BC & OM
     55  REAL :: scale_param_bb(nbreg_bb)  !Scaling parameter for biomas burning
     56  REAL :: scale_param_ind(nbreg_ind) !Scaling parameter for industrial emissions
     57  !
     58  !============================= OUTPUT ==================================
     59  !
     60  REAL :: source_tr(klon,nbtr)
     61  REAL :: flux_tr(klon,nbtr)
     62  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     63  REAL :: flux_sparam_ind(klon), flux_sparam_bb(klon)
     64  !========================= LOCAL VARIABLES =============================
     65  INTEGER :: i, k, kkk_cont(klon), kkk_expl(klon)
     66  REAL :: zalt(klon,klev), zaltmid(klon,klev)
     67  REAL :: zzdz
     68  !------------------------- SULFUR emissions ----------------------------
     69  REAL :: lmt_so2volc_cont(klon)  ! emissions so2 volcan (continuous)
     70  REAL :: lmt_altvolc_cont(klon)  ! altitude  so2 volcan (continuous)
     71  REAL :: lmt_so2volc_expl(klon)  ! emissions so2 volcan (explosive)
     72  REAL :: lmt_altvolc_expl(klon)  ! altitude  so2 volcan (explosive)
     73  REAL :: lmt_so2ff_l(klon)       ! emissions so2 fossil fuel (low)
     74  REAL :: lmt_so2ff_h(klon)       ! emissions so2 fossil fuel (high)
     75  REAL :: lmt_so2nff(klon)        ! emissions so2 non-fossil fuel
     76  REAL :: lmt_so2bb_l(klon)       ! emissions de so2 biomass burning (low)
     77  REAL :: lmt_so2bb_h(klon)       ! emissions de so2 biomass burning (high)
     78  REAL :: lmt_so2ba(klon)         ! emissions de so2 bateau
     79  REAL :: lmt_dms(klon)           ! emissions de dms
     80  REAL :: lmt_dmsconc(klon)       ! concentration de dms oceanique
     81  REAL :: lmt_dmsbio(klon)        ! emissions de dms bio
     82  REAL :: lmt_h2sbio(klon)        ! emissions de h2s bio
     83
     84  EXTERNAL condsurfs, liss, nightingale
     85  !=========================================================================
     86  ! Modifications introduced by NHL
     87  ! -Variables to save fluxes were introduced
     88  ! -lmt_so2ba was multiplied by fracso2emis in line 117
     89  ! -scale_param_bb was introduced in line 105
     90  ! The last two modifications were errors existing in the original version
     91  !=========================================================================
     92  !=========================================================================
     93                     ! LOW LEVEL EMISSIONS
     94  !=========================================================================
     95
     96     CALL nightingale(u_seri, v_seri, u10m_ec, v10m_ec, paprs, &
     97           pplay, cdragh, cdragm, t_seri, q_seri, ftsol, &
     98           tsol, pctsrf, lmt_dmsconc, lmt_dms)
     99
     100  IF (.not.bateau) THEN
     101    DO i=1, klon
     102      lmt_so2ba(i)=0.0
     103    ENDDO
     104  ENDIF
     105
     106  DO i=1, klon
     107     IF (iregion_ind(i).GT.0) THEN
     108   IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec) &
     109         + fracso2emis &
     110         *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4 &
     111         +scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4 &
     112         *frach2sofso2            ! molec/m2/s
     113  !
     114  IF(id_fine>0) source_tr(i,id_fine)= &
     115        source_tr(i,id_fine)+(1-fracso2emis) &
     116        *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i) &
     117        *1.e4*masse_ammsulfate/RNAVO  ! g/m2/s
     118  !
     119   IF(id_prec>0)   flux_tr(i,id_prec)=flux_tr(i,id_prec) + ( &
     120         scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ &
     121         lmt_so2ff_h(i)) &
     122         *frach2sofso2 &
     123         +scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ &
     124         lmt_so2ff_h(i)) &
     125         *fracso2emis &
     126         )*1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
     127  !
     128  IF(id_fine>0)  flux_tr(i,id_fine)= &
     129        flux_tr(i,id_fine)+(1-fracso2emis) &
     130        *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ &
     131        lmt_so2ff_h(i)) &
     132        *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     133  !
     134  flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis) &
     135        *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ &
     136        lmt_so2ff_h(i)) &
     137        *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     138     ENDIF
     139     IF (iregion_bb(i).GT.0) THEN
     140  IF(id_prec>0) source_tr(i,id_prec)= &
     141        source_tr(i,id_prec) + fracso2emis &
     142        *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) &
     143        *(1.-pctsrf(i,is_oce))*1.e4
     144  !
     145  IF(id_fine>0)     source_tr(i,id_fine)= &
     146        source_tr(i,id_fine)+(1-fracso2emis) &
     147        *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)* &
     148        (1.-pctsrf(i,is_oce))*1.e4* &
     149        masse_ammsulfate/RNAVO  ! g/m2/s
     150  !
     151  IF(id_prec>0)     flux_tr(i,id_prec)=flux_tr(i,id_prec) + &
     152        (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) &
     153        +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) &
     154        * (1.-pctsrf(i,is_oce))*fracso2emis &
     155        *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
     156  !
     157  IF(id_fine>0) flux_tr(i,id_fine)= &
     158        flux_tr(i,id_fine)+(1-fracso2emis) &
     159        *(scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) &
     160        +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) &
     161        *(1.-pctsrf(i,is_oce)) &
     162        *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     163  !
     164       flux_sparam_bb(i)= &
     165             scale_param_bb(iregion_bb(i))*(lmt_so2bb_l(i)+ &
     166             lmt_so2bb_h(i)) &
     167             * (1.-pctsrf(i,is_oce))*fracso2emis &
     168             *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
     169       flux_sparam_bb(i)= flux_sparam_bb(i) + (1-fracso2emis) * &
     170             (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)+ &
     171             scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) &
     172             *(1.-pctsrf(i,is_oce)) &
     173             *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     174     ENDIF
     175  IF(id_prec>0)   source_tr(i,id_prec)=source_tr(i,id_prec) &
     176        + fracso2emis &
     177        *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4 &
     178        +(lmt_h2sbio(i) &
     179        +lmt_dms(i)+lmt_dmsbio(i))*1.e4            ! molec/m2/s
     180  !
     181  IF(id_fine>0)   source_tr(i,id_fine)=source_tr(i,id_fine) &
     182        +(1-fracso2emis) &
     183        *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4* &
     184        masse_ammsulfate/RNAVO  ! g/m2/s
     185  !
     186  IF(id_prec>0)   flux_tr(i,id_prec)=flux_tr(i,id_prec) &
     187        + (lmt_h2sbio(i) &
     188        +lmt_so2volc_cont(i)+lmt_so2volc_expl(i) &
     189        +(lmt_so2ba(i)+lmt_so2nff(i))*fracso2emis &
     190        +lmt_dms(i)+lmt_dmsbio(i) ) &
     191        *1.e4/RNAVO*masse_s*1.e3          ! mgS/m2/s
     192  !
     193  IF(id_fine>0)   flux_tr(i,id_fine)=flux_tr(i,id_fine) &
     194        +(1-fracso2emis) &
     195        *(lmt_so2ba(i) + lmt_so2nff(i)) &
     196        *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     197  !
     198     flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis) &
     199           *lmt_so2nff(i) &
     200           *1.e4/RNAVO*masse_ammsulfate*1.e3    ! mgS/m2/s
     201  !
     202  ENDDO
     203
     204  !========================================================================
     205                     ! HIGH LEVEL EMISSIONS
     206  !========================================================================
     207  !  Source de SO2 volcaniques
     208  DO i = 1, klon
     209    kkk_cont(i)=1
     210    kkk_expl(i)=1
     211  ENDDO
     212  DO k=1, klev-1
     213  DO i = 1, klon
     214    zaltmid(i,k)=zalt(i,k)+zdz(i,k)/2.
     215    IF (zalt(i,k+1).LT.lmt_altvolc_cont(i)) kkk_cont(i)=k+1
     216    IF (zalt(i,k+1).LT.lmt_altvolc_expl(i)) kkk_expl(i)=k+1
     217  ENDDO
     218  ENDDO
     219  IF(id_prec>0) THEN
     220  DO i = 1, klon
     221    tr_seri(i,kkk_cont(i),id_prec)=tr_seri(i,kkk_cont(i),id_prec) + &
     222          lmt_so2volc_cont(i)/zdz(i,kkk_cont(i))/100.*pdtphys
     223    tr_seri(i,kkk_expl(i),id_prec)=tr_seri(i,kkk_expl(i),id_prec) + &
     224          lmt_so2volc_expl(i)/zdz(i,kkk_expl(i))/100.*pdtphys
     225  ENDDO
     226  ENDIF
     227  !  Sources hautes de SO2
     228
     229  !
     230  !--only GEIA SO2 emissions has high emissions
     231  !--unit: molec/cm2/s divided by layer height (in cm) multiplied by timestep
     232  !
     233  k=2                             !introducing emissions in level 2
     234  DO i = 1, klon
     235  !
     236     IF (iregion_bb(i).GT.0) THEN
     237  IF(id_prec>0)   tr_seri(i,k,id_prec)= &
     238        tr_seri(i,k,id_prec) + fracso2emis &
     239        *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i) &
     240        /zdz(i,k)/100.*pdtphys
     241  !
     242  IF(id_fine>0)     tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine) &
     243        + (1.-fracso2emis) &
     244        *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i) &
     245        *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys   !g/cm3
     246     ENDIF
     247     IF (iregion_ind(i).GT.0) THEN
     248   IF(id_prec>0)  tr_seri(i,k,id_prec)= &
     249         tr_seri(i,k,id_prec) + (fracso2emis &
     250         *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i) &
     251         + frach2sofso2 &
     252         *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)) &
     253         /zdz(i,k)/100.*pdtphys
     254  !
     255   IF(id_fine>0)    tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine) &
     256         + (1.-fracso2emis) &
     257         *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i) &
     258         *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys   !g/cm3
     259     ENDIF
     260  !
     261  ENDDO
     262
     263END SUBROUTINE precuremission
  • LMDZ6/trunk/libf/phylmd/Dust/read_dust.F90

    r5245 r5246  
    1       SUBROUTINE read_dust(debutphy, step, nbjour, dust_ec)
    2       USE dimphy
    3       USE mod_grid_phy_lmdz
    4       USE mod_phys_lmdz_para
    5       IMPLICIT NONE
    6 c
    7       INCLUDE "dimensions.h"
    8       INCLUDE "paramet.h"
    9       INCLUDE "netcdf.inc"
    10 c
    11       INTEGER step, nbjour
    12       LOGICAL debutphy
    13       real dust_ec(klon)
    14       real dust_ec_glo(klon_glo)
    15 c
    16 c as      real dust_nc(iip1,jjp1)
    17       real dust_nc_glo(nbp_lon+1,nbp_lat)
    18       real rcode
    19       integer ncid1, varid1, ncid2, varid2
     1SUBROUTINE read_dust(debutphy, step, nbjour, dust_ec)
     2  USE dimphy
     3  USE mod_grid_phy_lmdz
     4  USE mod_phys_lmdz_para
     5  IMPLICIT NONE
     6  !
     7  INCLUDE "dimensions.h"
     8  INCLUDE "paramet.h"
     9  INCLUDE "netcdf.inc"
     10  !
     11  INTEGER :: step, nbjour
     12  LOGICAL :: debutphy
     13  real :: dust_ec(klon)
     14  real :: dust_ec_glo(klon_glo)
     15  !
     16  ! as      real dust_nc(iip1,jjp1)
     17  real :: dust_nc_glo(nbp_lon+1,nbp_lat)
     18  real :: rcode
     19  integer :: ncid1, varid1, ncid2, varid2
    2020
    21       save ncid1, varid1, ncid2, varid2
     21  save ncid1, varid1, ncid2, varid2
    2222!$OMP THREADPRIVATE(ncid1, varid1, ncid2, varid2)
    23       integer start(4),count(4), status
    24       integer i, j, ig
    25 c
     23  integer :: start(4),count(4), status
     24  integer :: i, j, ig
     25  !
    2626!$OMP MASTER
    27       IF (is_mpi_root .AND. is_omp_root) THEN
    28       if (debutphy) then
    29 c
    30          ncid1=NCOPN('dust.nc',NCNOWRIT,rcode)
    31          varid1=NCVID(ncid1,'EMISSION',rcode)
    32 c
    33       endif
    34 c
    35       start(1)=1
    36       start(2)=1
    37       start(4)=0
     27  IF (is_mpi_root .AND. is_omp_root) THEN
     28  if (debutphy) then
     29  !
     30     ncid1=NCOPN('dust.nc',NCNOWRIT,rcode)
     31     varid1=NCVID(ncid1,'EMISSION',rcode)
     32  !
     33  endif
     34  !
     35  start(1)=1
     36  start(2)=1
     37  start(4)=0
    3838
    39 !      count(1)=iip1
    40       count(1)=nbp_lon+1
    41 !      count(2)=jjp1
    42       count(2)=nbp_lat
    43       count(3)=1
    44       count(4)=0
    45 c
    46       start(3)=step
    47 c
     39   ! count(1)=iip1
     40  count(1)=nbp_lon+1
     41   ! count(2)=jjp1
     42  count(2)=nbp_lat
     43  count(3)=1
     44  count(4)=0
     45  !
     46  start(3)=step
     47  !
    4848#ifdef NC_DOUBLE
    49 !      status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc)
    50       status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc_glo)
     49   ! status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc)
     50  status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc_glo)
    5151#else
    52 !      status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc)
    53       status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc_glo)
     52   ! status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc)
     53  status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc_glo)
    5454#endif
    55 c
    56 !      call correctbid(iim,jjp1,dust_nc)
    57       call correctbid(nbp_lon,nbp_lat,dust_nc_glo)
    58 c
    59 c--upside down + physical grid
    60 c
    61 c--OB=change jjp1 to 1 here ;
    62 c----AS: OB's change is needed if lats N to S (90 to -90) in dust.nc
    63 !      dust_ec(1)=MAX(dust_nc(1,jjp1),0.0)
    64       dust_ec_glo(1)=MAX(dust_nc_glo(1,nbp_lat),0.0)
    65       ig=2
    66 !      DO j=2,jjm
    67       DO j=2,nbp_lat-1
    68 !        DO i = 1, iim
    69          DO i = 1, nbp_lon
    70 c--OB=change jjp1+1-j to j here
    71 !          dust_ec(ig)=MAX(dust_nc(i,jjp1+1-j),0.0)
    72            dust_ec_glo(ig)=MAX(dust_nc_glo(i,nbp_lat+1-j),0.0)
    73            ig=ig+1
    74          ENDDO
    75       ENDDO
    76 c--OB=change second 1 to jjp1 here
    77       dust_ec_glo(ig)=MAX(dust_nc_glo(1,1),0.0)
    78 !      end if master
    79       ENDIF
     55  !
     56  !  call correctbid(iim,jjp1,dust_nc)
     57  call correctbid(nbp_lon,nbp_lat,dust_nc_glo)
     58  !
     59  !--upside down + physical grid
     60  !
     61  !--OB=change jjp1 to 1 here ;
     62  !----AS: OB's change is needed if lats N to S (90 to -90) in dust.nc
     63  !  dust_ec(1)=MAX(dust_nc(1,jjp1),0.0)
     64  dust_ec_glo(1)=MAX(dust_nc_glo(1,nbp_lat),0.0)
     65  ig=2
     66   ! DO j=2,jjm
     67  DO j=2,nbp_lat-1
     68      ! DO i = 1, iim
     69     DO i = 1, nbp_lon
     70  !--OB=change jjp1+1-j to j here
     71        ! dust_ec(ig)=MAX(dust_nc(i,jjp1+1-j),0.0)
     72       dust_ec_glo(ig)=MAX(dust_nc_glo(i,nbp_lat+1-j),0.0)
     73       ig=ig+1
     74     ENDDO
     75  ENDDO
     76  !--OB=change second 1 to jjp1 here
     77  dust_ec_glo(ig)=MAX(dust_nc_glo(1,1),0.0)
     78   ! end if master
     79  ENDIF
    8080!$OMP END MASTER
    8181!$OMP BARRIER
    82       CALL scatter(dust_ec_glo,dust_ec)
    83 c
    84       RETURN
    85       END
     82  CALL scatter(dust_ec_glo,dust_ec)
     83  !
     84  RETURN
     85END SUBROUTINE read_dust
  • LMDZ6/trunk/libf/phylmd/Dust/read_newemissions.f90

    r5245 r5246  
    1 C Routine to read the emissions of the different species
    2 C
    3       subroutine read_newemissions(julien, jH_emi ,edgar, flag_dms,
    4      I                             debutphy,
    5      I                             pdtphys,lafinphy, nbjour, pctsrf,
    6      I                             t_seri, xlat, xlon,
    7      I                             pmflxr, pmflxs, prfl, psfl,
    8      O                             u10m_ec, v10m_ec, dust_ec,
    9      O                             lmt_sea_salt, lmt_so2ff_l,
    10      O                             lmt_so2ff_h, lmt_so2nff, lmt_so2ba,
    11      O                             lmt_so2bb_l, lmt_so2bb_h,
    12      O                             lmt_so2volc_cont, lmt_altvolc_cont,
    13      O                             lmt_so2volc_expl, lmt_altvolc_expl,
    14      O                             lmt_dmsbio, lmt_h2sbio, lmt_dmsconc,
    15      O                             lmt_bcff, lmt_bcnff, lmt_bcbb_l,
    16      O                             lmt_bcbb_h, lmt_bcba, lmt_omff,
    17      O                             lmt_omnff, lmt_ombb_l, lmt_ombb_h,
    18      O                             lmt_omnat, lmt_omba)
    19      
    20       USE dimphy
    21       USE indice_sol_mod
    22       USE mod_grid_phy_lmdz
    23       USE mod_phys_lmdz_para
    24 
    25       IMPLICIT NONE
    26 
    27 
    28       INCLUDE "dimensions.h"
    29 c      INCLUDE 'dimphy.h'     
    30       INCLUDE 'paramet.h'     
    31       INCLUDE 'chem.h'     
    32       INCLUDE 'chem_spla.h'
    33 c      INCLUDE 'indicesol.h'
    34 
    35       logical debutphy, lafinphy, edgar
    36       INTEGER test_vent, test_day, step_vent, flag_dms, nbjour
    37       INTEGER julien, i, iday
    38       SAVE step_vent, test_vent, test_day, iday
     1! Routine to read the emissions of the different species
     2!
     3subroutine read_newemissions(julien, jH_emi ,edgar, flag_dms, &
     4        debutphy, &
     5        pdtphys,lafinphy, nbjour, pctsrf, &
     6        t_seri, xlat, xlon, &
     7        pmflxr, pmflxs, prfl, psfl, &
     8        u10m_ec, v10m_ec, dust_ec, &
     9        lmt_sea_salt, lmt_so2ff_l, &
     10        lmt_so2ff_h, lmt_so2nff, lmt_so2ba, &
     11        lmt_so2bb_l, lmt_so2bb_h, &
     12        lmt_so2volc_cont, lmt_altvolc_cont, &
     13        lmt_so2volc_expl, lmt_altvolc_expl, &
     14        lmt_dmsbio, lmt_h2sbio, lmt_dmsconc, &
     15        lmt_bcff, lmt_bcnff, lmt_bcbb_l, &
     16        lmt_bcbb_h, lmt_bcba, lmt_omff, &
     17        lmt_omnff, lmt_ombb_l, lmt_ombb_h, &
     18        lmt_omnat, lmt_omba)
     19
     20  USE dimphy
     21  USE indice_sol_mod
     22  USE mod_grid_phy_lmdz
     23  USE mod_phys_lmdz_para
     24
     25  IMPLICIT NONE
     26
     27
     28  INCLUDE "dimensions.h"
     29   ! INCLUDE 'dimphy.h'
     30  INCLUDE 'paramet.h'
     31  INCLUDE 'chem.h'
     32  INCLUDE 'chem_spla.h'
     33   ! INCLUDE 'indicesol.h'
     34
     35  logical :: debutphy, lafinphy, edgar
     36  INTEGER :: test_vent, test_day, step_vent, flag_dms, nbjour
     37  INTEGER :: julien, i, iday
     38  SAVE step_vent, test_vent, test_day, iday
    3939!$OMP THREADPRIVATE(step_vent, test_vent, test_day, iday)
    40       REAL pct_ocean(klon), pctsrf(klon,nbsrf)
    41       REAL pdtphys  ! pas d'integration pour la physique (seconde)     
    42       REAL t_seri(klon,klev)  ! temperature
    43 
    44       REAL xlat(klon)       ! latitudes pour chaque point
    45       REAL xlon(klon)       ! longitudes pour chaque point
    46      
    47 c
    48 c   Emissions:
    49 c   ---------
    50 c
    51 c---------------------------- SEA SALT & DUST emissions ------------------------
    52       REAL lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um !NOT SAVED OK
    53       REAL clyfac, avgdryrate, drying
    54 c je      REAL u10m_ec1(klon), v10m_ec1(klon), dust_ec1(klon)
    55 c je      REAL u10m_ec2(klon), v10m_ec2(klon), dust_ec2(klon)
    56 
    57       REAL, SAVE, ALLOCATABLE :: u10m_ec1(:), v10m_ec1(:), dust_ec1(:)
    58       REAL, SAVE, ALLOCATABLE :: u10m_ec2(:), v10m_ec2(:), dust_ec2(:)
     40  REAL :: pct_ocean(klon), pctsrf(klon,nbsrf)
     41  REAL :: pdtphys  ! pas d'integration pour la physique (seconde)
     42  REAL :: t_seri(klon,klev)  ! temperature
     43
     44  REAL :: xlat(klon)       ! latitudes pour chaque point
     45  REAL :: xlon(klon)       ! longitudes pour chaque point
     46
     47  !
     48  !   Emissions:
     49  !   ---------
     50  !
     51  !---------------------------- SEA SALT & DUST emissions ------------------------
     52  REAL :: lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um !NOT SAVED OK
     53  REAL :: clyfac, avgdryrate, drying
     54  ! je      REAL u10m_ec1(klon), v10m_ec1(klon), dust_ec1(klon)
     55  ! je      REAL u10m_ec2(klon), v10m_ec2(klon), dust_ec2(klon)
     56
     57  REAL, SAVE, ALLOCATABLE :: u10m_ec1(:), v10m_ec1(:), dust_ec1(:)
     58  REAL, SAVE, ALLOCATABLE :: u10m_ec2(:), v10m_ec2(:), dust_ec2(:)
    5959!$OMP THREADPRIVATE(u10m_ec1, v10m_ec1, dust_ec1)
    6060!$OMP THREADPRIVATE(u10m_ec2, v10m_ec2, dust_ec2)
    61 c as      REAL u10m_nc(iip1,jjp1), v10m_nc(iip1,jjp1)
    62       REAL u10m_ec(klon), v10m_ec(klon), dust_ec(klon)
    63 c      REAL cly(klon), wth(klon), zprecipinsoil(klon)
    64       REAL, SAVE, ALLOCATABLE :: cly(:), wth(:), zprecipinsoil(:)
    65       REAL :: cly_glo(klon_glo), wth_glo(klon_glo)
    66       REAL :: zprecipinsoil_glo(klon_glo)
     61  ! as      REAL u10m_nc(iip1,jjp1), v10m_nc(iip1,jjp1)
     62  REAL :: u10m_ec(klon), v10m_ec(klon), dust_ec(klon)
     63  !      REAL cly(klon), wth(klon), zprecipinsoil(klon)
     64  REAL, SAVE, ALLOCATABLE :: cly(:), wth(:), zprecipinsoil(:)
     65  REAL :: cly_glo(klon_glo), wth_glo(klon_glo)
     66  REAL :: zprecipinsoil_glo(klon_glo)
    6767!$OMP THREADPRIVATE(cly,wth,zprecipinsoil)
    6868
    6969
    70 c je     SAVE u10m_ec2, v10m_ec2, dust_ec2
    71 c je      SAVE u10m_ec1, v10m_ec1, dust_ec1   ! Added on titane
    72 c je      SAVE cly, wth, zprecipinsoil        ! Added on titane
    73 !    SAVE cly, wth, zprecipinsoil, u10m_ec2, v10m_ec2, dust_ec2
    74 c------------------------- BLACK CARBON emissions ----------------------
    75       REAL lmt_bcff(klon)       ! emissions de BC fossil fuels
    76       REAL lmt_bcnff(klon)      ! emissions de BC non-fossil fuels
    77       REAL lmt_bcbb_l(klon)     ! emissions de BC biomass basses
    78       REAL lmt_bcbb_h(klon)     ! emissions de BC biomass hautes
    79       REAL lmt_bcba(klon)       ! emissions de BC bateau
    80 c------------------------ ORGANIC MATTER emissions ---------------------
    81       REAL lmt_omff(klon)     ! emissions de OM fossil fuels
    82       REAL lmt_omnff(klon)    ! emissions de OM non-fossil fuels
    83       REAL lmt_ombb_l(klon)   ! emissions de OM biomass basses
    84       REAL lmt_ombb_h(klon)   ! emissions de OM biomass hautes
    85       REAL lmt_omnat(klon)    ! emissions de OM Natural
    86       REAL lmt_omba(klon)     ! emissions de OM bateau
    87 c------------------------- SULFUR emissions ----------------------------
    88       REAL lmt_so2ff_l(klon)       ! emissions so2 fossil fuels (low)
    89       REAL lmt_so2ff_h(klon)       ! emissions so2 fossil fuels (high)
    90       REAL lmt_so2nff(klon)        ! emissions so2 non-fossil fuels
    91       REAL lmt_so2bb_l(klon)       ! emissions de so2 biomass burning basse
    92       REAL lmt_so2bb_h(klon)       ! emissions de so2 biomass burning hautes
    93       REAL lmt_so2ba(klon)         ! emissions de so2 bateau
    94       REAL lmt_so2volc_cont(klon)  ! emissions so2 volcan continuous
    95       REAL lmt_altvolc_cont(klon)  ! altitude  so2 volcan continuous
    96       REAL lmt_so2volc_expl(klon)  ! emissions so2 volcan explosive
    97       REAL lmt_altvolc_expl(klon)  ! altitude  so2 volcan explosive
    98       REAL lmt_dmsconc(klon)       ! concentration de dms oceanique
    99       REAL lmt_dmsbio(klon)        ! emissions de dms bio
    100       REAL lmt_h2sbio(klon)        ! emissions de h2s bio
    101 
    102       REAL,SAVE,ALLOCATABLE ::  lmt_dms(:)           ! emissions de dms
     70  ! je     SAVE u10m_ec2, v10m_ec2, dust_ec2
     71  ! je      SAVE u10m_ec1, v10m_ec1, dust_ec1   ! Added on titane
     72  ! je      SAVE cly, wth, zprecipinsoil        ! Added on titane
     73  ! SAVE cly, wth, zprecipinsoil, u10m_ec2, v10m_ec2, dust_ec2
     74  !------------------------- BLACK CARBON emissions ----------------------
     75  REAL :: lmt_bcff(klon)       ! emissions de BC fossil fuels
     76  REAL :: lmt_bcnff(klon)      ! emissions de BC non-fossil fuels
     77  REAL :: lmt_bcbb_l(klon)     ! emissions de BC biomass basses
     78  REAL :: lmt_bcbb_h(klon)     ! emissions de BC biomass hautes
     79  REAL :: lmt_bcba(klon)       ! emissions de BC bateau
     80  !------------------------ ORGANIC MATTER emissions ---------------------
     81  REAL :: lmt_omff(klon)     ! emissions de OM fossil fuels
     82  REAL :: lmt_omnff(klon)    ! emissions de OM non-fossil fuels
     83  REAL :: lmt_ombb_l(klon)   ! emissions de OM biomass basses
     84  REAL :: lmt_ombb_h(klon)   ! emissions de OM biomass hautes
     85  REAL :: lmt_omnat(klon)    ! emissions de OM Natural
     86  REAL :: lmt_omba(klon)     ! emissions de OM bateau
     87  !------------------------- SULFUR emissions ----------------------------
     88  REAL :: lmt_so2ff_l(klon)       ! emissions so2 fossil fuels (low)
     89  REAL :: lmt_so2ff_h(klon)       ! emissions so2 fossil fuels (high)
     90  REAL :: lmt_so2nff(klon)        ! emissions so2 non-fossil fuels
     91  REAL :: lmt_so2bb_l(klon)       ! emissions de so2 biomass burning basse
     92  REAL :: lmt_so2bb_h(klon)       ! emissions de so2 biomass burning hautes
     93  REAL :: lmt_so2ba(klon)         ! emissions de so2 bateau
     94  REAL :: lmt_so2volc_cont(klon)  ! emissions so2 volcan continuous
     95  REAL :: lmt_altvolc_cont(klon)  ! altitude  so2 volcan continuous
     96  REAL :: lmt_so2volc_expl(klon)  ! emissions so2 volcan explosive
     97  REAL :: lmt_altvolc_expl(klon)  ! altitude  so2 volcan explosive
     98  REAL :: lmt_dmsconc(klon)       ! concentration de dms oceanique
     99  REAL :: lmt_dmsbio(klon)        ! emissions de dms bio
     100  REAL :: lmt_h2sbio(klon)        ! emissions de h2s bio
     101
     102  REAL,SAVE,ALLOCATABLE ::  lmt_dms(:)           ! emissions de dms
    103103!$OMP THREADPRIVATE(lmt_dms)
    104 c
    105 c  Lessivage
    106 c  ---------
    107 c
    108       REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection
    109       REAL prfl(klon,klev+1),   psfl(klon,klev+1)   !--large-scale
    110 !      REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection
    111 !      REAL prfl(klon,klev),   psfl(klon,klev)   !--large-scale
    112 c
    113 c  Variable interne
    114 c  ----------------
    115 c     
    116       INTEGER icount
    117       REAL tau_1, tau_2                 
    118       REAL max_flux, min_flux                                         
    119       INTRINSIC MIN, MAX
    120 c
    121 c JE: Changes due to new pdtphys in new physics.
    122 c      REAL windintime ! time in hours of the wind input files resolution
    123 c      REAL dayemintime ! time in hours of the other emissions input files resolution
    124       REAL jH_init ! shift in the hour (count as days) respecto to
    125 !                  ! realhour = (pdtphys*i)/3600/24 -days_elapsed
    126       REAL jH_emi,jH_vent,jH_day
    127       SAVE jH_init,jH_vent,jH_day
     104  !
     105  !  Lessivage
     106  !  ---------
     107  !
     108  REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection
     109  REAL :: prfl(klon,klev+1),   psfl(klon,klev+1)   !--large-scale
     110   ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection
     111   ! REAL prfl(klon,klev),   psfl(klon,klev)   !--large-scale
     112  !
     113  !  Variable interne
     114  !  ----------------
     115  !
     116  INTEGER :: icount
     117  REAL :: tau_1, tau_2
     118  REAL :: max_flux, min_flux
     119  INTRINSIC MIN, MAX
     120  !
     121  ! JE: Changes due to new pdtphys in new physics.
     122  !  REAL windintime ! time in hours of the wind input files resolution
     123  !  REAL dayemintime ! time in hours of the other emissions input files resolution
     124  REAL :: jH_init ! shift in the hour (count as days) respecto to
     125               ! ! realhour = (pdtphys*i)/3600/24 -days_elapsed
     126  REAL :: jH_emi,jH_vent,jH_day
     127  SAVE jH_init,jH_vent,jH_day
    128128!$OMP THREADPRIVATE(jH_init,jH_vent,jH_day)
    129       REAL,PARAMETER :: vent_resol = 6. ! resolution of winds in hours
    130       REAL,PARAMETER :: day_resol = 24. ! resolution of daily emmis. in hours
    131 !      INTEGER   test_day1
    132 !      SAVE test_day1
    133 !      REAL tau_1j,tau_2j
    134 c je
    135 c allocate if necessary
    136 c
    137 
    138       IF (.NOT. ALLOCATED(u10m_ec1)) ALLOCATE(u10m_ec1(klon))
    139       IF (.NOT. ALLOCATED(v10m_ec1)) ALLOCATE(v10m_ec1(klon))
    140       IF (.NOT. ALLOCATED(dust_ec1)) ALLOCATE(dust_ec1(klon))
    141       IF (.NOT. ALLOCATED(u10m_ec2)) ALLOCATE(u10m_ec2(klon))
    142       IF (.NOT. ALLOCATED(v10m_ec2)) ALLOCATE(v10m_ec2(klon))
    143       IF (.NOT. ALLOCATED(dust_ec2)) ALLOCATE(dust_ec2(klon))
    144       IF (.NOT. ALLOCATED(cly)) ALLOCATE(cly(klon))
    145       IF (.NOT. ALLOCATED(wth)) ALLOCATE(wth(klon))
    146       IF (.NOT. ALLOCATED(zprecipinsoil)) ALLOCATE(zprecipinsoil(klon))
    147       IF (.NOT. ALLOCATED(lmt_dms)) ALLOCATE(lmt_dms(klon))
    148 c end je nov2013
    149 c
    150 C***********************************************************************
    151 C DUST EMISSIONS
    152 C***********************************************************************
    153 c
    154       IF (debutphy) THEN
    155 C---Fields are read only at the beginning of the period
    156 c--reading wind and dust
    157         iday=julien
    158         step_vent=1
    159         test_vent=0
    160         test_day=0
    161         CALL read_vent(.true.,step_vent,nbjour,u10m_ec2,v10m_ec2)
    162         print *,'Read (debut) dust emissions: step_vent,julien,nbjour',
    163      .                                   step_vent,julien,nbjour
    164         CALL read_dust(.true.,step_vent,nbjour,dust_ec2)
    165 C Threshold velocity map
     129  REAL,PARAMETER :: vent_resol = 6. ! resolution of winds in hours
     130  REAL,PARAMETER :: day_resol = 24. ! resolution of daily emmis. in hours
     131   ! INTEGER   test_day1
     132   ! SAVE test_day1
     133   ! REAL tau_1j,tau_2j
     134  ! je
     135  ! allocate if necessary
     136  !
     137
     138  IF (.NOT. ALLOCATED(u10m_ec1)) ALLOCATE(u10m_ec1(klon))
     139  IF (.NOT. ALLOCATED(v10m_ec1)) ALLOCATE(v10m_ec1(klon))
     140  IF (.NOT. ALLOCATED(dust_ec1)) ALLOCATE(dust_ec1(klon))
     141  IF (.NOT. ALLOCATED(u10m_ec2)) ALLOCATE(u10m_ec2(klon))
     142  IF (.NOT. ALLOCATED(v10m_ec2)) ALLOCATE(v10m_ec2(klon))
     143  IF (.NOT. ALLOCATED(dust_ec2)) ALLOCATE(dust_ec2(klon))
     144  IF (.NOT. ALLOCATED(cly)) ALLOCATE(cly(klon))
     145  IF (.NOT. ALLOCATED(wth)) ALLOCATE(wth(klon))
     146  IF (.NOT. ALLOCATED(zprecipinsoil)) ALLOCATE(zprecipinsoil(klon))
     147  IF (.NOT. ALLOCATED(lmt_dms)) ALLOCATE(lmt_dms(klon))
     148  ! end je nov2013
     149  !
     150  !***********************************************************************
     151  ! DUST EMISSIONS
     152  !***********************************************************************
     153  !
     154  IF (debutphy) THEN
     155  !---Fields are read only at the beginning of the period
     156  !--reading wind and dust
     157    iday=julien
     158    step_vent=1
     159    test_vent=0
     160    test_day=0
     161    CALL read_vent(.true.,step_vent,nbjour,u10m_ec2,v10m_ec2)
     162    print *,'Read (debut) dust emissions: step_vent,julien,nbjour', &
     163          step_vent,julien,nbjour
     164    CALL read_dust(.true.,step_vent,nbjour,dust_ec2)
     165  ! Threshold velocity map
    166166!$OMP MASTER
    167        IF (is_mpi_root .AND. is_omp_root) THEN
    168         zprecipinsoil_glo(:)=0.0
    169         OPEN(51,file='wth.dat',status='unknown',form='formatted')
    170         READ(51,'(G18.10)') (wth_glo(i),i=1,klon_glo)
    171         CLOSE(51)
    172 c Clay content
    173         OPEN(52,file='cly.dat',status='unknown',form='formatted')
    174         READ(52,'(G18.10)') (cly_glo(i),i=1,klon_glo)
    175         CLOSE(52)
    176         OPEN(53,file='precipinsoil.dat',
    177      .        status='old',form='formatted',err=999)
    178         READ(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo)
    179         PRINT *,'lecture precipinsoil.dat'
    180  999    CONTINUE
    181         CLOSE(53)
    182        ENDIF
     167   IF (is_mpi_root .AND. is_omp_root) THEN
     168    zprecipinsoil_glo(:)=0.0
     169    OPEN(51,file='wth.dat',status='unknown',form='formatted')
     170    READ(51,'(G18.10)') (wth_glo(i),i=1,klon_glo)
     171    CLOSE(51)
     172  ! Clay content
     173    OPEN(52,file='cly.dat',status='unknown',form='formatted')
     174    READ(52,'(G18.10)') (cly_glo(i),i=1,klon_glo)
     175    CLOSE(52)
     176    OPEN(53,file='precipinsoil.dat', &
     177          status='old',form='formatted',err=999)
     178    READ(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo)
     179    PRINT *,'lecture precipinsoil.dat'
     180 999   CONTINUE
     181    CLOSE(53)
     182   ENDIF
    183183!$OMP END MASTER
    184184!$OMP BARRIER
    185        call scatter(wth_glo,wth)
    186        call scatter(cly_glo,cly)
    187        call scatter(zprecipinsoil_glo,zprecipinsoil)
    188 
    189 !JE20140908<<        GOTO 1000
    190 !        DO i=1, klon
    191 !          zprecipinsoil(i)=0.0
    192 !        ENDDO
    193 ! 1000   CLOSE(53)
    194 !JE20140908>>
    195         jH_init=jH_emi
    196         jH_vent=jH_emi
    197         jH_day=jH_emi
    198 !        test_day1=0
    199 !JE end
    200 c
    201      
    202       ENDIF !--- debutphy
    203        
    204       print *,'READ_EMISSION: test_vent & test_day = ',test_vent,
    205      +                                                 test_day
    206       IF (test_vent.EQ.0) THEN    !--on lit toutes les 6 h                                                                     
    207         CALL SCOPY(klon, u10m_ec2, 1, u10m_ec1, 1)
    208         CALL SCOPY(klon, v10m_ec2, 1, v10m_ec1, 1)
    209         CALL SCOPY(klon, dust_ec2, 1, dust_ec1, 1)
    210         step_vent=step_vent+1
    211         !PRINT *,'step_vent=', step_vent
    212         CALL read_vent(.false.,step_vent,nbjour,u10m_ec2,v10m_ec2)
    213         print *,'Reading dust emissions: step_vent, julien, nbjour ',
    214      .                                   step_vent, julien, nbjour
    215         !print *,'test_vent, julien = ',test_vent, julien
    216         CALL read_dust(.false.,step_vent,nbjour,dust_ec2)
    217      
    218       ENDIF !--test_vent
    219 
    220 c    ubicacion original
    221 c      test_vent=test_vent+1
    222 c      IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h
    223            
    224 !JE      tau_2=FLOAT(test_vent)/12.
    225 !JE      tau_1=1.-tau_2
    226       tau_2=(jH_vent-jH_init)*24./(vent_resol)
    227       tau_1=1.-tau_2
    228 !      print*,'JEdec jHv,JHi,ventres',jH_vent,jH_init,vent_resol
    229 !      print*,'JEdec tau2,tau1',tau_2,tau_1
    230 !      print*,'JEdec step_vent',step_vent
    231       DO i=1, klon
    232 !      PRINT*,'JE tau_2,tau_2j',tau_2,tau_2j
    233         u10m_ec(i)=tau_1*u10m_ec1(i)+tau_2*u10m_ec2(i)
    234         v10m_ec(i)=tau_1*v10m_ec1(i)+tau_2*v10m_ec2(i)
    235         dust_ec(i)=tau_1*dust_ec1(i)+tau_2*dust_ec2(i)
    236       ENDDO
    237 c
    238 cJE      IF (test_vent.EQ.(6*2)) THEN
    239 cJE        PRINT *,'6 hrs interval reached'
    240 cJE        print *,'day in read_emission, test_vent = ',julien, test_vent
    241 cJE      ENDIF
    242 cJE
    243 !JE      test_vent=test_vent+1
    244 !JE      IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h
    245 c JE 
    246       jH_vent=jH_vent+pdtphys/(24.*3600.)
    247       test_vent=test_vent+1
    248       IF (jH_vent.GT.(vent_resol)/24.) THEN
    249           test_vent=0
    250           jH_vent=jH_init
    251       ENDIF
    252 !      PRINT*,'JE test_vent,test_vent1,jH_vent ', test_vent,test_vent1
    253 !    .     ,jH_vent
    254 c endJEi
    255 c
    256       avgdryrate=300./365.*pdtphys/86400.
    257 c
    258       DO i=1, klon
    259 c
    260         IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN
    261           zprecipinsoil(i)=zprecipinsoil(i) +
    262      .           (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys
    263 c
    264           clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil
    265           drying=avgdryrate*exp(0.03905491*
    266      .                    exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]
    267           zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm]
    268         ENDIF
    269 !        zprecipinsoil(i)=0.0 ! Temporarely introduced to reproduce obelix result
    270       ENDDO
    271 
    272 !      print *,'cly = ',sum(cly),maxval(cly),minval(cly)
    273 !      print *,'wth = ',sum(wth),maxval(wth),minval(wth)
    274 !      print *,'t_seri = ',sum(t_seri),maxval(t_seri),minval(t_seri)
    275 !      print *,'precipinsoil = ',sum(zprecipinsoil),maxval(zprecipinsoil)
    276 !    .                      ,minval(zprecipinsoil)
    277       icount=0
    278       DO i=1, klon
    279         IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR.
    280      .     t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN
    281              dust_ec(i)=0.0 ! commented out for test dustemtest
    282 !            print *,'Dust emissions surpressed at grid = ',i
    283 !            icount=icount+1
    284         ENDIF
    285       ENDDO                           
    286 c
    287       print *,'Total N of grids with surpressed emission = ',icount
    288       print *,'dust_ec = ',SUM(dust_ec),MINVAL(dust_ec),
    289      .                                  MAXVAL(dust_ec)
    290 cnhl Transitory scaling of desert dust emissions
    291      
    292 cnhl      DO i=1, klon
    293 cnhl         dust_ec(i)=dust_ec(i)/2.
    294 cnhl      ENDDO                           
    295 
    296 C-saving precipitation field to be read in next simulation
    297      
    298       IF (lafinphy) THEN
    299 c
    300         CALL gather(zprecipinsoil,zprecipinsoil_glo)
     185   call scatter(wth_glo,wth)
     186   call scatter(cly_glo,cly)
     187   call scatter(zprecipinsoil_glo,zprecipinsoil)
     188
     189  !JE20140908<<        GOTO 1000
     190     ! DO i=1, klon
     191     !   zprecipinsoil(i)=0.0
     192     ! ENDDO
     193  ! 1000   CLOSE(53)
     194  !JE20140908>>
     195    jH_init=jH_emi
     196    jH_vent=jH_emi
     197    jH_day=jH_emi
     198     ! test_day1=0
     199  !JE end
     200  !
     201
     202  ENDIF !--- debutphy
     203
     204  print *,'READ_EMISSION: test_vent & test_day = ',test_vent, &
     205        test_day
     206  IF (test_vent.EQ.0) THEN    !--on lit toutes les 6 h
     207    CALL SCOPY(klon, u10m_ec2, 1, u10m_ec1, 1)
     208    CALL SCOPY(klon, v10m_ec2, 1, v10m_ec1, 1)
     209    CALL SCOPY(klon, dust_ec2, 1, dust_ec1, 1)
     210    step_vent=step_vent+1
     211    ! !PRINT *,'step_vent=', step_vent
     212    CALL read_vent(.false.,step_vent,nbjour,u10m_ec2,v10m_ec2)
     213    print *,'Reading dust emissions: step_vent, julien, nbjour ', &
     214          step_vent, julien, nbjour
     215    ! !print *,'test_vent, julien = ',test_vent, julien
     216    CALL read_dust(.false.,step_vent,nbjour,dust_ec2)
     217
     218  ENDIF !--test_vent
     219
     220  ! ubicacion original
     221  !  test_vent=test_vent+1
     222  !  IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h
     223
     224  !JE      tau_2=FLOAT(test_vent)/12.
     225  !JE      tau_1=1.-tau_2
     226  tau_2=(jH_vent-jH_init)*24./(vent_resol)
     227  tau_1=1.-tau_2
     228   ! print*,'JEdec jHv,JHi,ventres',jH_vent,jH_init,vent_resol
     229   ! print*,'JEdec tau2,tau1',tau_2,tau_1
     230   ! print*,'JEdec step_vent',step_vent
     231  DO i=1, klon
     232   ! PRINT*,'JE tau_2,tau_2j',tau_2,tau_2j
     233    u10m_ec(i)=tau_1*u10m_ec1(i)+tau_2*u10m_ec2(i)
     234    v10m_ec(i)=tau_1*v10m_ec1(i)+tau_2*v10m_ec2(i)
     235    dust_ec(i)=tau_1*dust_ec1(i)+tau_2*dust_ec2(i)
     236  ENDDO
     237  !
     238  !JE      IF (test_vent.EQ.(6*2)) THEN
     239  !JE        PRINT *,'6 hrs interval reached'
     240  !JE        print *,'day in read_emission, test_vent = ',julien, test_vent
     241  !JE      ENDIF
     242  !JE
     243  !JE      test_vent=test_vent+1
     244  !JE      IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h
     245  ! JE
     246  jH_vent=jH_vent+pdtphys/(24.*3600.)
     247  test_vent=test_vent+1
     248  IF (jH_vent.GT.(vent_resol)/24.) THEN
     249      test_vent=0
     250      jH_vent=jH_init
     251  ENDIF
     252   ! PRINT*,'JE test_vent,test_vent1,jH_vent ', test_vent,test_vent1
     253  ! .     ,jH_vent
     254  ! endJEi
     255  !
     256  avgdryrate=300./365.*pdtphys/86400.
     257  !
     258  DO i=1, klon
     259  !
     260    IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN
     261      zprecipinsoil(i)=zprecipinsoil(i) + &
     262            (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys
     263  !
     264      clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil
     265      drying=avgdryrate*exp(0.03905491* &
     266            exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]
     267      zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm]
     268    ENDIF
     269     ! zprecipinsoil(i)=0.0 ! Temporarely introduced to reproduce obelix result
     270  ENDDO
     271
     272   ! print *,'cly = ',sum(cly),maxval(cly),minval(cly)
     273   ! print *,'wth = ',sum(wth),maxval(wth),minval(wth)
     274   ! print *,'t_seri = ',sum(t_seri),maxval(t_seri),minval(t_seri)
     275   ! print *,'precipinsoil = ',sum(zprecipinsoil),maxval(zprecipinsoil)
     276  ! .                      ,minval(zprecipinsoil)
     277  icount=0
     278  DO i=1, klon
     279    IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR. &
     280          t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN
     281         dust_ec(i)=0.0 ! commented out for test dustemtest
     282          ! print *,'Dust emissions surpressed at grid = ',i
     283          ! icount=icount+1
     284    ENDIF
     285  ENDDO
     286  !
     287  print *,'Total N of grids with surpressed emission = ',icount
     288  print *,'dust_ec = ',SUM(dust_ec),MINVAL(dust_ec), &
     289        MAXVAL(dust_ec)
     290  !nhl Transitory scaling of desert dust emissions
     291
     292  !nhl      DO i=1, klon
     293  !nhl         dust_ec(i)=dust_ec(i)/2.
     294  !nhl      ENDDO
     295
     296  !-saving precipitation field to be read in next simulation
     297
     298  IF (lafinphy) THEN
     299  !
     300    CALL gather(zprecipinsoil,zprecipinsoil_glo)
    301301!$OMP MASTER
    302         IF (is_mpi_root .AND. is_omp_root) THEN
    303 
    304         OPEN(53,file='newprecipinsoil.dat',
    305      .          status='unknown',form='formatted')
    306         WRITE(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo)
    307         CLOSE(53)
    308         ENDIF
     302    IF (is_mpi_root .AND. is_omp_root) THEN
     303
     304    OPEN(53,file='newprecipinsoil.dat', &
     305          status='unknown',form='formatted')
     306    WRITE(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo)
     307    CLOSE(53)
     308    ENDIF
    309309!$OMP END MASTER
    310310!$OMP BARRIER
    311 c
    312       ENDIF
    313 c
    314 C***********************************************************************
    315 C SEA SALT EMISSIONS
    316 C***********************************************************************
    317 c
    318       DO i=1,klon
    319         pct_ocean(i)=pctsrf(i,is_oce)
    320       ENDDO
    321 
    322       print *,'IS_OCE = ',is_oce
    323       CALL seasalt(v10m_ec, u10m_ec, pct_ocean, lmt_sea_salt) !mgSeaSalt/cm2/s
    324 !      print *,'SUM, MAX & MIN Sea Salt = ',SUM(lmt_sea_salt),
    325 !    .               MAXVAL(lmt_sea_salt),MINVAL(lmt_sea_salt)
    326 c     
    327 C***********************************************************************
    328 C SULFUR & CARBON EMISSIONS
    329 C***********************************************************************
    330 c
    331      
    332       IF (test_day.EQ.0) THEN
    333         print *,'Computing SULFATE emissions for day : ',iday,julien,
    334      .                                                   step_vent
    335         CALL condsurfs_new(iday, edgar, flag_dms,
    336      O                      lmt_so2ff_l, lmt_so2ff_h, lmt_so2nff,
    337      O                      lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba,
    338      O                      lmt_so2volc_cont, lmt_altvolc_cont,
    339      O                      lmt_so2volc_expl, lmt_altvolc_expl,
    340      O                      lmt_dmsbio, lmt_h2sbio, lmt_dms,lmt_dmsconc)
    341         print *,'Computing CARBON emissions for day : ',iday,julien,
    342      .                                                   step_vent
    343         CALL condsurfc_new(iday,
    344      O                       lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h,
    345      O                       lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l,
    346      O                       lmt_ombb_h, lmt_omnat, lmt_omba)
    347         print *,'IDAY = ',iday
    348         iday=iday+1
    349         print *,'BCBB_L emissions :',SUM(lmt_bcbb_l), MAXVAL(lmt_bcbb_l)
    350      .                              ,MINVAL(lmt_bcbb_l)
    351         print *,'BCBB_H emissions :',SUM(lmt_bcbb_h), MAXVAL(lmt_bcbb_h)
    352      .                              ,MINVAL(lmt_bcbb_h)
    353       ENDIF
    354      
    355 !JE      test_day=test_day+1
    356 !JE      IF (test_day.EQ.(24*2.)) THEN
    357 !JE        test_day=0 !on remet a zero ttes les 24 h
    358 !JE        print *,'LAST TIME STEP OF DAY ',julien
    359 !JE      ENDIF
    360 
    361 
    362       jH_day=jH_day+pdtphys/(24.*3600.)
    363       test_day=test_day+1
    364       IF (jH_day.GT.(day_resol)/24.) THEN
    365           print *,'LAST TIME STEP OF DAY ',julien
    366           test_day=0
    367           jH_day=jH_init
    368       ENDIF
    369 !      PRINT*,'test_day,test_day1',test_day,test_day1
    370 
    371       END
     311  !
     312  ENDIF
     313  !
     314  !***********************************************************************
     315  ! SEA SALT EMISSIONS
     316  !***********************************************************************
     317  !
     318  DO i=1,klon
     319    pct_ocean(i)=pctsrf(i,is_oce)
     320  ENDDO
     321
     322  print *,'IS_OCE = ',is_oce
     323  CALL seasalt(v10m_ec, u10m_ec, pct_ocean, lmt_sea_salt) !mgSeaSalt/cm2/s
     324   ! print *,'SUM, MAX & MIN Sea Salt = ',SUM(lmt_sea_salt),
     325  ! .               MAXVAL(lmt_sea_salt),MINVAL(lmt_sea_salt)
     326  !
     327  !***********************************************************************
     328  ! SULFUR & CARBON EMISSIONS
     329  !***********************************************************************
     330  !
     331
     332  IF (test_day.EQ.0) THEN
     333    print *,'Computing SULFATE emissions for day : ',iday,julien, &
     334          step_vent
     335    CALL condsurfs_new(iday, edgar, flag_dms, &
     336          lmt_so2ff_l, lmt_so2ff_h, lmt_so2nff, &
     337          lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba, &
     338          lmt_so2volc_cont, lmt_altvolc_cont, &
     339          lmt_so2volc_expl, lmt_altvolc_expl, &
     340          lmt_dmsbio, lmt_h2sbio, lmt_dms,lmt_dmsconc)
     341    print *,'Computing CARBON emissions for day : ',iday,julien, &
     342          step_vent
     343    CALL condsurfc_new(iday, &
     344          lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h, &
     345          lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l, &
     346          lmt_ombb_h, lmt_omnat, lmt_omba)
     347    print *,'IDAY = ',iday
     348    iday=iday+1
     349    print *,'BCBB_L emissions :',SUM(lmt_bcbb_l), MAXVAL(lmt_bcbb_l) &
     350          ,MINVAL(lmt_bcbb_l)
     351    print *,'BCBB_H emissions :',SUM(lmt_bcbb_h), MAXVAL(lmt_bcbb_h) &
     352          ,MINVAL(lmt_bcbb_h)
     353  ENDIF
     354
     355  !JE      test_day=test_day+1
     356  !JE      IF (test_day.EQ.(24*2.)) THEN
     357  !JE        test_day=0 !on remet a zero ttes les 24 h
     358  !JE        print *,'LAST TIME STEP OF DAY ',julien
     359  !JE      ENDIF
     360
     361
     362  jH_day=jH_day+pdtphys/(24.*3600.)
     363  test_day=test_day+1
     364  IF (jH_day.GT.(day_resol)/24.) THEN
     365      print *,'LAST TIME STEP OF DAY ',julien
     366      test_day=0
     367      jH_day=jH_init
     368  ENDIF
     369   ! PRINT*,'test_day,test_day1',test_day,test_day1
     370
     371END SUBROUTINE read_newemissions
  • LMDZ6/trunk/libf/phylmd/Dust/read_vent.F90

    r5245 r5246  
    1       SUBROUTINE read_vent(debutphy, step, nbjour, u10m_ec, v10m_ec)
    2       USE dimphy
    3       USE mod_grid_phy_lmdz
    4       USE mod_phys_lmdz_para
    5 !      USE write_field_phy
    6       IMPLICIT NONE
    7       INCLUDE "dimensions.h"
    8 c      INCLUDE "dimphy.h"
    9       INCLUDE "paramet.h"
    10       INCLUDE "netcdf.inc"
    11 c
    12       INTEGER step, nbjour
    13       LOGICAL debutphy
    14       real u10m_ec(klon), v10m_ec(klon)
    15       real u10m_ec_glo(klon_glo), v10m_ec_glo(klon_glo)
    16 c
    17 !      real u10m_nc(iip1,jjp1) !, v10m_nc(iip1,jjm) ! dim 97x72
    18 !      real v10m_nc(iip1,jjp1)  ! dim 97x73
    19       real u10m_nc_glo(nbp_lon+1,nbp_lat) !, v10m_nc(iip1,jjm) ! dim 97x72
    20       real v10m_nc_glo(nbp_lon+1,nbp_lat)  ! dim 97x73
    21       real rcode
    22       integer ncidu1, varidu1, ncidv1, varidv1
    23       save ncidu1, varidu1, ncidv1, varidv1
     1SUBROUTINE read_vent(debutphy, step, nbjour, u10m_ec, v10m_ec)
     2  USE dimphy
     3  USE mod_grid_phy_lmdz
     4  USE mod_phys_lmdz_para
     5   ! USE write_field_phy
     6  IMPLICIT NONE
     7  INCLUDE "dimensions.h"
     8    ! INCLUDE "dimphy.h"
     9  INCLUDE "paramet.h"
     10  INCLUDE "netcdf.inc"
     11  !
     12  INTEGER :: step, nbjour
     13  LOGICAL :: debutphy
     14  real :: u10m_ec(klon), v10m_ec(klon)
     15  real :: u10m_ec_glo(klon_glo), v10m_ec_glo(klon_glo)
     16  !
     17  !  real u10m_nc(iip1,jjp1) !, v10m_nc(iip1,jjm) ! dim 97x72
     18  !  real v10m_nc(iip1,jjp1)  ! dim 97x73
     19  real :: u10m_nc_glo(nbp_lon+1,nbp_lat) !, v10m_nc(iip1,jjm) ! dim 97x72
     20  real :: v10m_nc_glo(nbp_lon+1,nbp_lat)  ! dim 97x73
     21  real :: rcode
     22  integer :: ncidu1, varidu1, ncidv1, varidv1
     23  save ncidu1, varidu1, ncidv1, varidv1
    2424!$OMP THREADPRIVATE(ncidu1, varidu1, ncidv1, varidv1)
    25       integer start(4),count(4), status
    26       integer i, j, ig
     25  integer :: start(4),count(4), status
     26  integer :: i, j, ig
    2727
    2828
    29 c
     29  !
    3030!$OMP MASTER
    31       IF (is_mpi_root .AND. is_omp_root) THEN
    32       if (debutphy) then
    33 c
    34          ncidu1=NCOPN('u10m.nc',NCNOWRIT,rcode)
    35          varidu1=NCVID(ncidu1,'U10M',rcode)
    36          ncidv1=NCOPN('v10m.nc',NCNOWRIT,rcode)
    37          varidv1=NCVID(ncidv1,'V10M',rcode)
    38 c
    39       endif
    40 c
    41       start(1)=1
    42       start(2)=1
    43       start(4)=0
     31  IF (is_mpi_root .AND. is_omp_root) THEN
     32  if (debutphy) then
     33  !
     34     ncidu1=NCOPN('u10m.nc',NCNOWRIT,rcode)
     35     varidu1=NCVID(ncidu1,'U10M',rcode)
     36     ncidv1=NCOPN('v10m.nc',NCNOWRIT,rcode)
     37     varidv1=NCVID(ncidv1,'V10M',rcode)
     38  !
     39  endif
     40  !
     41  start(1)=1
     42  start(2)=1
     43  start(4)=0
    4444
    45 !      count(1)=iip1
    46       count(1)=nbp_lon+1
    47 !      count(2)=jjp1
    48       count(2)=nbp_lat
    49       count(3)=1
    50       count(4)=0
    51 c
    52       start(3)=step
    53 c
     45   ! count(1)=iip1
     46  count(1)=nbp_lon+1
     47   ! count(2)=jjp1
     48  count(2)=nbp_lat
     49  count(3)=1
     50  count(4)=0
     51  !
     52  start(3)=step
     53  !
    5454#ifdef NC_DOUBLE
    55 !      status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc)
    56       status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc_glo)
     55   ! status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc)
     56  status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc_glo)
    5757#else
    58 !      status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc)
    59       status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc_glo)
     58   ! status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc)
     59  status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc_glo)
    6060#endif
    61 !      print *,status
    62 c
     61    ! print *,status
     62  !
    6363#ifdef NC_DOUBLE
    64 !      status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc)
    65       status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc_glo)
     64   ! status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc)
     65  status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc_glo)
    6666#else
    67 !      status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc)
    68       status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc_glo)
     67   ! status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc)
     68  status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc_glo)
    6969#endif
    70 c
     70  !
    7171
    72 !      print *,'beforebidcor u10m_nc', u10m_nc(1,jjp1)
    73 !      print *,'beforebidcor v10m_nc', v10m_nc(1,jjp1)
     72  !  print *,'beforebidcor u10m_nc', u10m_nc(1,jjp1)
     73  !  print *,'beforebidcor v10m_nc', v10m_nc(1,jjp1)
    7474
    75 !       print *,status
    76 !      call correctbid(iim,jjp1,u10m_nc)
    77 !      call correctbid(iim,jjp1,v10m_nc)
    78       call correctbid(nbp_lon,nbp_lat,u10m_nc_glo)
    79       call correctbid(nbp_lon,nbp_lat,v10m_nc_glo)
     75  !   print *,status
     76  !  call correctbid(iim,jjp1,u10m_nc)
     77  !  call correctbid(iim,jjp1,v10m_nc)
     78  call correctbid(nbp_lon,nbp_lat,u10m_nc_glo)
     79  call correctbid(nbp_lon,nbp_lat,v10m_nc_glo)
    8080
    81 !      print *,'afterbidcor u10m_nc', u10m_nc(1,jjp1)
    82 !      print *,'afterbidcor v10m_nc', v10m_nc(1,jjp1)
    83 c
    84 c--upside down + physical grid
    85 c
    86 !      u10m_ec(1)=u10m_nc(1,jjp1)
    87 !      v10m_ec(1)=v10m_nc(1,jjp1)
    88       u10m_ec_glo(1)=u10m_nc_glo(1,nbp_lat)
    89       v10m_ec_glo(1)=v10m_nc_glo(1,nbp_lat)
    90       ig=2
    91 !      DO j=2,jjm
    92 !         DO i = 1, iim
    93       DO j=2,nbp_lat-1
    94          DO i = 1, nbp_lon
    95 !          u10m_ec(ig)=u10m_nc(i,jjp1+1-j)
    96 !          v10m_ec(ig)=v10m_nc(i,jjp1+1-j)
    97            u10m_ec_glo(ig)=u10m_nc_glo(i,nbp_lat+1-j)
    98            v10m_ec_glo(ig)=v10m_nc_glo(i,nbp_lat+1-j)
    99            ig=ig+1
    100 !         print *,u10m_ec(ig) ,v10m_ec(ig)
    101          ENDDO
    102       ENDDO
    103       u10m_ec_glo(ig)=u10m_nc_glo(1,1)
    104       v10m_ec_glo(ig)=v10m_nc_glo(1,1)
     81   ! print *,'afterbidcor u10m_nc', u10m_nc(1,jjp1)
     82   ! print *,'afterbidcor v10m_nc', v10m_nc(1,jjp1)
     83  !
     84  !--upside down + physical grid
     85  !
     86  !  u10m_ec(1)=u10m_nc(1,jjp1)
     87  !  v10m_ec(1)=v10m_nc(1,jjp1)
     88  u10m_ec_glo(1)=u10m_nc_glo(1,nbp_lat)
     89  v10m_ec_glo(1)=v10m_nc_glo(1,nbp_lat)
     90  ig=2
     91   ! DO j=2,jjm
     92   !    DO i = 1, iim
     93  DO j=2,nbp_lat-1
     94     DO i = 1, nbp_lon
     95        ! u10m_ec(ig)=u10m_nc(i,jjp1+1-j)
     96        ! v10m_ec(ig)=v10m_nc(i,jjp1+1-j)
     97       u10m_ec_glo(ig)=u10m_nc_glo(i,nbp_lat+1-j)
     98       v10m_ec_glo(ig)=v10m_nc_glo(i,nbp_lat+1-j)
     99       ig=ig+1
     100      ! print *,u10m_ec(ig) ,v10m_ec(ig)
     101     ENDDO
     102  ENDDO
     103  u10m_ec_glo(ig)=u10m_nc_glo(1,1)
     104  v10m_ec_glo(ig)=v10m_nc_glo(1,1)
    105105
    106106
    107 !      end if master
    108       ENDIF
     107   ! end if master
     108  ENDIF
    109109!$OMP END MASTER
    110110!$OMP BARRIER
    111       CALL scatter(u10m_ec_glo,u10m_ec)
    112       CALL scatter(v10m_ec_glo,v10m_ec)
     111  CALL scatter(u10m_ec_glo,u10m_ec)
     112  CALL scatter(v10m_ec_glo,v10m_ec)
    113113
    114 !      print *,'JE  tamagno viento ig= ', ig
    115 !      print *,'READ_VENT U = ',SUM(u10m_ec),MINVAL(u10m_ec),
    116 !    .                                      MAXVAL(u10m_ec)
    117 !      print *,'READ_VENT V = ',SUM(v10m_ec),MINVAL(v10m_ec),
    118 !    .                                      MAXVAL(v10m_ec)
    119 !       print *,'u v 1 ', u10m_ec(1),v10m_ec(1)
    120 !       print *,'u v klon ', u10m_ec(klon),v10m_ec(klon)
    121       RETURN
    122       END
     114   ! print *,'JE  tamagno viento ig= ', ig
     115   ! print *,'READ_VENT U = ',SUM(u10m_ec),MINVAL(u10m_ec),
     116  ! .                                      MAXVAL(u10m_ec)
     117  !  print *,'READ_VENT V = ',SUM(v10m_ec),MINVAL(v10m_ec),
     118  ! .                                      MAXVAL(v10m_ec)
     119  !   print *,'u v 1 ', u10m_ec(1),v10m_ec(1)
     120  !   print *,'u v klon ', u10m_ec(klon),v10m_ec(klon)
     121  RETURN
     122END SUBROUTINE read_vent
    123123
    124 c added by JE from the nh SPLA, dyn3d/read_reanalyse.F which is not available any more
    125       subroutine correctbid(iim,nl,x)
    126       integer iim,nl
    127       real x(iim+1,nl)
    128       integer i,l
    129       real zz
     124! added by JE from the nh SPLA, dyn3d/read_reanalyse.F which is not available any more
     125subroutine correctbid(iim,nl,x)
     126  integer :: iim,nl
     127  real :: x(iim+1,nl)
     128  integer :: i,l
     129  real :: zz
    130130
    131       do l=1,nl
    132          do i=2,iim-1
    133             if(abs(x(i,l)).gt.1.e10) then
    134                zz=0.5*(x(i-1,l)+x(i+1,l))
    135 c              print*,'correction ',i,l,x(i,l),zz
    136                x(i,l)=zz
    137             endif
    138          enddo
    139       enddo
     131  do l=1,nl
     132     do i=2,iim-1
     133        if(abs(x(i,l)).gt.1.e10) then
     134           zz=0.5*(x(i-1,l)+x(i+1,l))
     135           ! print*,'correction ',i,l,x(i,l),zz
     136           x(i,l)=zz
     137        endif
     138     enddo
     139  enddo
    140140
    141       return
    142       end
     141  return
     142end subroutine correctbid
    143143
    144144
  • LMDZ6/trunk/libf/phylmd/Dust/seasalt.f90

    r5245 r5246  
    1 c       This subroutine estimateis Sea Salt emission fluxes over
    2 c       Oceanic surfaces.
    3 c
    4       SUBROUTINE seasalt(v_10m, u_10m, pct_ocean, lmt_sea_salt)
    5    
    6       USE dimphy
    7       IMPLICIT NONE
    8 c
    9       INCLUDE "dimensions.h"
    10       INCLUDE "chem.h"
    11       INCLUDE "chem_spla.h"
    12       INCLUDE "YOMCST.h"
    13       INCLUDE "YOECUMF.h"
    14 c
    15       INTEGER i, bin                 !local variables
    16       REAL pct_ocean(klon)           !hfraction of Ocean in each grid
    17       REAL v_10m(klon), u_10m(klon)  !V&H components of wind @10 m
    18       REAL w_speed_10m(klon)         !wind speed at 10m from surface
    19       REAL lmt_sea_salt(klon,ss_bins)!sea salt emission flux - mg/m2/s
    20       REAL sea_salt_flux(ss_bins)    !sea salt emission flux per unit wind speed
     1  ! This subroutine estimateis Sea Salt emission fluxes over
     2  ! Oceanic surfaces.
     3!
     4SUBROUTINE seasalt(v_10m, u_10m, pct_ocean, lmt_sea_salt)
    215
    22       REAL wind, ocean
    23 c
    24 c------Sea salt emission fluxes for each size bin calculated
    25 c------based on on parameterisation of Gong et al. (1997).
    26 c------Fluxes of sea salt for each size bin are given in mg/m^2/sec
    27 c------at wind speed of 1 m/s at 10m height (at 80% RH).
    28 c------Fluxes at various wind speeds (@10 m from sea
    29 c------surfaces are estimated using relationship: F=flux*U_10^3.14
    30 c
    31 cnhl for size bin of 0.03-0.5 and 0.5-20
    32       DATA sea_salt_flux/4.5E-09,8.7E-7/
     6  USE dimphy
     7  IMPLICIT NONE
     8  !
     9  INCLUDE "dimensions.h"
     10  INCLUDE "chem.h"
     11  INCLUDE "chem_spla.h"
     12  INCLUDE "YOMCST.h"
     13  INCLUDE "YOECUMF.h"
     14  !
     15  INTEGER :: i, bin                 !local variables
     16  REAL :: pct_ocean(klon)           !hfraction of Ocean in each grid
     17  REAL :: v_10m(klon), u_10m(klon)  !V&H components of wind @10 m
     18  REAL :: w_speed_10m(klon)         !wind speed at 10m from surface
     19  REAL :: lmt_sea_salt(klon,ss_bins)!sea salt emission flux - mg/m2/s
     20  REAL :: sea_salt_flux(ss_bins)    !sea salt emission flux per unit wind speed
    3321
    34       DO i=1, klon
    35       w_speed_10m(i)= (v_10m(i)**2.0+u_10m(i)**2.0)**0.5
    36       ENDDO
    37 c
    38       DO bin=1,ss_bins
    39       wind=0.0
    40       ocean=0.0
    41       DO i=1, klon
    42       lmt_sea_salt(i,bin)=sea_salt_flux(bin)*(w_speed_10m(i)**3.41)
    43      . *pct_ocean(i)*1.e-4*1.e-3                       !g/cm2/s
    44       wind=wind+w_speed_10m(i)
    45       ocean=ocean+pct_ocean(i)
    46       ENDDO
    47 !      print *,'Sea Salt flux = ',sea_salt_flux(bin)
    48       ENDDO
    49 !      print *,'SUM OF WIND = ',wind
    50 !      print *,'SUM OF OCEAN SURFACE = ',ocean
    51       RETURN   
    52       END
     22  REAL :: wind, ocean
     23  !
     24  !------Sea salt emission fluxes for each size bin calculated
     25  !------based on on parameterisation of Gong et al. (1997).
     26  !------Fluxes of sea salt for each size bin are given in mg/m^2/sec
     27  !------at wind speed of 1 m/s at 10m height (at 80% RH).
     28  !------Fluxes at various wind speeds (@10 m from sea
     29  !------surfaces are estimated using relationship: F=flux*U_10^3.14
     30  !
     31  !nhl for size bin of 0.03-0.5 and 0.5-20
     32  DATA sea_salt_flux/4.5E-09,8.7E-7/
     33
     34  DO i=1, klon
     35  w_speed_10m(i)= (v_10m(i)**2.0+u_10m(i)**2.0)**0.5
     36  ENDDO
     37  !
     38  DO bin=1,ss_bins
     39  wind=0.0
     40  ocean=0.0
     41  DO i=1, klon
     42  lmt_sea_salt(i,bin)=sea_salt_flux(bin)*(w_speed_10m(i)**3.41) &
     43        *pct_ocean(i)*1.e-4*1.e-3                       !g/cm2/s
     44  wind=wind+w_speed_10m(i)
     45  ocean=ocean+pct_ocean(i)
     46  ENDDO
     47   ! print *,'Sea Salt flux = ',sea_salt_flux(bin)
     48  ENDDO
     49   ! print *,'SUM OF WIND = ',wind
     50   ! print *,'SUM OF OCEAN SURFACE = ',ocean
     51  RETURN
     52END SUBROUTINE seasalt
  • LMDZ6/trunk/libf/phylmd/Dust/sediment_mod.f90

    r5245 r5246  
    1 c----- This subroutine calculates the sedimentation flux of Tracers
    2 c
    3       SUBROUTINE sediment_mod(t_seri,pplay,zrho,paprs,time_step,RHcl,
    4      .                                       id_coss,id_codu,id_scdu,
    5      .                                        ok_chimeredust,
    6      .                           sed_ss,sed_dust,sed_dustsco,
    7      .                        sed_ss3D,sed_dust3D,sed_dustsco3D,tr_seri)
    8 cnhl     .                                       xlon,xlat,
    9 c
    10        USE dimphy
    11        USE infotrac
    12       IMPLICIT NONE
    13 c
    14       INCLUDE "dimensions.h"
    15       INCLUDE "chem.h"
    16 c      INCLUDE "dimphy.h"
    17       INCLUDE "YOMCST.h"
    18       INCLUDE "YOECUMF.h"
    19 c
    20        REAL RHcl(klon,klev)     ! humidite relative ciel clair
    21        REAL tr_seri(klon, klev,nbtr) !conc of tracers
    22        REAL sed_ss(klon) !sedimentation flux of Sea Salt (g/m2/s)
    23        REAL sed_dust(klon) !sedimentation flux of dust (g/m2/s)
    24        REAL sed_dustsco(klon) !sedimentation flux of scoarse  dust (g/m2/s)
    25        REAL sed_ss3D(klon,klev) !sedimentation flux of Sea Salt (g/m2/s)
    26        REAL sed_dust3D(klon,klev) !sedimentation flux of dust (g/m2/s)
    27        REAL sed_dustsco3D(klon,klev) !sedimentation flux of scoarse  dust (g/m2/s)
    28        REAL t_seri(klon, klev)   !Temperature at mid points of Z (K)
    29        REAL v_dep_ss(klon,klev)  ! sed. velocity for SS m/s
    30        REAL v_dep_dust(klon,klev)  ! sed. velocity for dust m/s
    31        REAL v_dep_dustsco(klon,klev)  ! sed. velocity for dust m/s
    32        REAL pplay(klon, klev)    !pressure at mid points of Z (Pa)
    33        REAL zrho(klon, klev)     !Density of air at mid points of Z (kg/m3)
    34        REAL paprs(klon, klev+1)    !pressure at interface of layers Z (Pa)
    35        REAL time_step            !time step (sec)
    36        LOGICAL ok_chimeredust
    37        REAL xlat(klon)       ! latitudes pour chaque point
    38        REAL xlon(klon)       ! longitudes pour chaque point
    39        INTEGER id_coss,id_codu,id_scdu
    40 c
    41 c------local variables
    42 c
    43        INTEGER i, k, nbre_RH
    44        PARAMETER(nbre_RH=12)
    45 c
    46        REAL lambda, ss_g           
    47        REAL mmd_ss      !mass median diameter of SS (um)
    48        REAL mmd_dust          !mass median diameter of dust (um)
    49        REAL mmd_dustsco          !mass median diameter of scoarse dust (um)
    50        REAL rho_ss(nbre_RH),rho_ss1 !density of sea salt (kg/m3)
    51        REAL rho_dust          !density of dust(kg/m3)
    52        REAL v_stokes, CC, v_sed, ss_growth_f(nbre_RH)
    53        REAL sed_flux(klon,klev)  ! sedimentation flux g/m2/s
    54        REAL air_visco(klon,klev)
    55        REAL zdz(klon,klev)       ! layers height (m)
    56        REAL temp                 ! temperature in degree Celius
    57 c
    58        INTEGER RH_num
    59        REAL RH_MAX, DELTA, rh, RH_tab(nbre_RH)
    60        PARAMETER (RH_MAX=95.)
    61 c
    62        DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./
    63 c
    64 c
    65        DATA rho_ss/2160. ,2160. ,2160.,  2160,  1451.6, 1367.9,
    66      .             1302.9,1243.2,1182.7, 1149.5,1111.6, 1063.1/
    67 c
    68        DATA ss_growth_f/0.503, 0.503, 0.503, 0.503, 0.724, 0.782,
    69      .                  0.838, 0.905, 1.000, 1.072, 1.188, 1.447/
    70 c
    71 c
    72        mmd_ss=12.7   !dia -um at 80% for bin 0.5-20 um but 90% of real mmd
    73 !              obsolete      mmd_dust=2.8  !micrometer for bin 0.5-20 and 0.5-10 um
    74 ! 4tracer SPLA:       mmd_dust=11.0  !micrometer for bin 0.5-20 and 0.5-10 um
    75 !3days       mmd_dust=3.333464  !micrometer for bin 0.5-20 and 0.5-10 um
    76 !3days       mmd_dustsco=12.91315  !micrometer for bin 0.5-20 and 0.5-10 um
    77 !JE20140911       mmd_dust=3.002283  !micrometer for bin 0.5-20 and 0.5-10 um
    78 !JE20140911       mmd_dustsco=13.09771  !micrometer for bin 0.5-20 and 0.5-10 um
    79 !JE20140911        mmd_dust=5.156346  !micrometer for bin 0.5-20 and 0.5-10 um
    80 !JE20140911        mmd_dustsco=15.56554  !micrometer for bin 0.5-20 and 0.5-10 um
    81         IF (ok_chimeredust) THEN
    82 !JE20150212<< : changes in ustar in dustmod changes emission distribution
    83 !        mmd_dust=3.761212  !micrometer for bin 0.5-3 and 0.5-10 um
    84 !        mmd_dustsco=15.06167  !micrometer for bin 3-20 and 0.5-10 um
    85 !JE20150212>>
    86 !JE20150618: Change in div3 of dustmod changes distribution. now is div3=6
    87 !div=3        mmd_dust=3.983763
    88 !div=3        mmd_dustsco=15.10854
    89         mmd_dust=3.898047
    90         mmd_dustsco=15.06167
    91         ELSE
    92         mmd_dust=11.0  !micrometer for bin 0.5-20 and 0.5-10 um
    93         mmd_dustsco=100. ! absurd value, bin not used in this scheme
    94         ENDIF
    95 
    96 
    97        rho_dust=2600. !kg/m3
    98 c
    99 c--------- Air viscosity (poise=0.1 kg/m-sec)-----------
    100 c
    101        DO k=1, klev
    102        DO i=1, klon
    103 c
    104        zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG
    105 c
    106        temp=t_seri(i,k)-RTT
    107 c
    108        IF (temp.LT.0.) THEN
    109          air_visco(i,k)=(1.718+0.0049*temp-1.2e-5*temp*temp)*1.e-4
    110        ELSE
    111          air_visco(i,k)=(1.718+0.0049*temp)*1.e-4
    112        ENDIF
    113 c
    114        ENDDO
    115        ENDDO
    116 c
    117 c--------- for Sea Salt -------------------
    118 c
    119 c
    120 c
    121        IF(id_coss>0) THEN
    122        DO k=1, klev
    123        DO i=1,klon
    124 c
    125 c---cal. correction factor hygroscopic growth of aerosols
    126 c
    127         rh=MIN(RHcl(i,k)*100.,RH_MAX)
    128         RH_num = INT( rh/10. + 1.)
    129         IF (rh.gt.85.) RH_num=10
    130         IF (rh.gt.90.) RH_num=11
    131         DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num))
    132 c
    133         ss_g=ss_growth_f(rh_num) +
    134           DELTA*(ss_growth_f(RH_num+1)-ss_growth_f(RH_num))
    135 
    136         rho_ss1=rho_ss(rh_num) +
    137      .       DELTA*(rho_ss(RH_num+1)-rho_ss(RH_num))             
    138 c
    139         v_stokes=RG*(rho_ss1-zrho(i,k))*      !m/sec
    140      .           (mmd_ss*ss_g)*(mmd_ss*ss_g)*
    141      .           1.e-12/(18.0*air_visco(i,k)/10.)
    142 c
    143        lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
    144 c
    145        CC=1.0+1.257*lambda/(mmd_ss*ss_g)/1.e6  ! C-correction factor
    146 c
    147        v_sed=v_stokes*CC                       ! m/sec !orig
    148 c
    149 c---------check for v_sed*dt<zdz
    150 c
    151        IF (v_sed*time_step.GT.zdz(i,k)) THEN
    152          v_sed=zdz(i,k)/time_step     
    153        ENDIF
    154 c
    155        v_dep_ss(i,k)= v_sed
    156        sed_flux(i,k)= tr_seri(i,k,id_coss)*v_sed !g/cm3*m/sec
    157        !sed_ss3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
    158       ! conc_sed_ss3D(i,k)=sed_flux(i,k)*1.e6      !g/m3*sec !!!!!!!
    159 c
    160        ENDDO          !klon
    161        ENDDO          !klev
    162 c
    163 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    164        sed_ss3D(:,:)=0.0  ! initialisation
    165      
    166        DO k=1, klev
    167        DO i=1, klon
    168        sed_ss3D(i,k)=sed_ss3D(i,k)-
    169      .        sed_flux(i,k)/zdz(i,k) !!!!!!!!!!!!!!!!!!!!!!
    170        ENDDO          !klon
    171        ENDDO          !klev
    172 c
    173        DO k=1, klev-1
    174        DO i=1, klon
    175         sed_ss3D(i,k)=sed_ss3D(i,k)+                   
    176      .                  sed_flux(i,k+1)/zdz(i,k) !!!!!!!!
    177 
    178        ENDDO          !klon
    179        ENDDO          !klev
    180 
    181       DO k = 1, klev
    182       DO i = 1, klon
    183           tr_seri(i,k,id_coss)=tr_seri(i,k,id_coss)+
    184      s   sed_ss3D(i,k)*time_step
    185       ENDDO
    186       ENDDO
    187 
    188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    189 c
    190        DO i=1, klon
    191          sed_ss(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
    192        ENDDO          !klon
    193        ELSE
    194         DO i=1, klon
    195           sed_ss(i)=0.
    196         ENDDO
    197        ENDIF
    198 c
    199 c
    200 
    201 c--------- For dust ------------------
    202 c
    203 c
    204        IF(id_codu>0) THEN
    205        DO k=1, klev
    206        DO i=1,klon
    207 c
    208         v_stokes=RG*(rho_dust-zrho(i,k))*      !m/sec
    209      .           mmd_dust*mmd_dust*
    210      .           1.e-12/(18.0*air_visco(i,k)/10.)
    211 c
    212        lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
    213        CC=1.0+1.257*lambda/(mmd_dust)/1.e6        !dimensionless
    214        v_sed=v_stokes*CC                       !m/sec
    215 c
    216 c---------check for v_sed*dt<zdz
    217 c
    218        IF (v_sed*time_step.GT.zdz(i,k)) THEN
    219          v_sed=zdz(i,k)/time_step     
    220        ENDIF
    221 
    222 c
    223        v_dep_dust(i,k)= v_sed
    224        sed_flux(i,k)  = tr_seri(i,k,id_codu)*v_sed !g/cm3.m/sec
    225        !sed_dust3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
    226 c
    227        ENDDO          !klon
    228        ENDDO          !klev
    229 
    230 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    231        sed_dust3D(:,:)=0.0  ! initialisation
    232 
    233        DO k=1, klev
    234        DO i=1, klon
    235        sed_dust3D(i,k)=sed_dust3D(i,k)-
    236      .                  sed_flux(i,k)/zdz(i,k)
    237        ENDDO          !klon
    238        ENDDO          !klev
    239 
    240 c
    241 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    242        
    243        DO k=1, klev-1
    244        DO i=1, klon
    245         sed_dust3D(i,k)=sed_dust3D(i,k) +
    246      .                  sed_flux(i,k+1)/zdz(i,k)
    247        ENDDO          !klon
    248        ENDDO          !klev
    249 c
    250       DO k = 1, klev
    251       DO i = 1, klon
    252          tr_seri(i,k,id_codu)=tr_seri(i,k,id_codu)+
    253      s    sed_dust3D(i,k)*time_step
    254       ENDDO
    255       ENDDO
    256 
    257 
    258        DO i=1, klon
    259          sed_dust(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
    260        ENDDO          !klon
    261        ELSE
    262         DO i=1, klon
    263           sed_dust(i)=0.
    264         ENDDO
    265        ENDIF
    266 c
    267 
    268 
    269 c--------- For scoarse  dust ------------------
    270 c
    271 c
    272        IF(id_scdu>0) THEN
    273        DO k=1, klev
    274        DO i=1,klon
    275 c
    276         v_stokes=RG*(rho_dust-zrho(i,k))*      !m/sec
    277      .           mmd_dustsco*mmd_dustsco*
    278      .           1.e-12/(18.0*air_visco(i,k)/10.)
    279 c
    280        lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
    281        CC=1.0+1.257*lambda/(mmd_dustsco)/1.e6        !dimensionless
    282        v_sed=v_stokes*CC                       !m/sec
    283 c
    284 c---------check for v_sed*dt<zdz
    285 
    286 
    287        IF (v_sed*time_step.GT.zdz(i,k)) THEN
    288          v_sed=zdz(i,k)/time_step
    289        ENDIF
    290 
    291 c
    292        v_dep_dustsco(i,k)= v_sed
    293        sed_flux(i,k)     = tr_seri(i,k,id_scdu)*v_sed !g/cm3.m/sec
    294        !sed_dustsco3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
    295 c
    296        ENDDO          !klon
    297        ENDDO          !klev
    298 
    299 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    300        sed_dustsco3D(:,:)=0.0  ! initialisation
    301 
    302        DO k=1, klev
    303        DO i=1, klon
    304        sed_dustsco3D(i,k)=sed_dustsco3D(i,k)-
    305      .                  sed_flux(i,k)/zdz(i,k)
    306        ENDDO          !klon
    307        ENDDO          !klev
    308 c
    309        DO k=1, klev-1
    310        DO i=1, klon
    311         sed_dustsco3D(i,k)=sed_dustsco3D(i,k) +
    312      .                  sed_flux(i,k+1)/zdz(i,k)
    313        ENDDO          !klon
    314        ENDDO          !klev
    315 
    316       DO k = 1, klev
    317       DO i = 1, klon
    318        tr_seri(i,k,id_scdu)=tr_seri(i,k,id_scdu)+
    319      s  sed_dustsco3D(i,k)*time_step
    320       ENDDO
    321       ENDDO
    322 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    323 
    324 
    325 c
    326        DO i=1, klon
    327          sed_dustsco(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
    328        ENDDO          !klon
    329        ELSE
    330         DO i=1, klon
    331           sed_dustsco(i)=0.
    332         ENDDO
    333        ENDIF
    334 c
    335 
    336 
    337 
    338 
    339 c
    340        RETURN
    341        END
     1!----- This subroutine calculates the sedimentation flux of Tracers
     2!
     3SUBROUTINE sediment_mod(t_seri,pplay,zrho,paprs,time_step,RHcl, &
     4        id_coss,id_codu,id_scdu, &
     5        ok_chimeredust, &
     6        sed_ss,sed_dust,sed_dustsco, &
     7        sed_ss3D,sed_dust3D,sed_dustsco3D,tr_seri)
     8  !nhl     .                                       xlon,xlat,
     9  !
     10   USE dimphy
     11   USE infotrac
     12  IMPLICIT NONE
     13  !
     14  INCLUDE "dimensions.h"
     15  INCLUDE "chem.h"
     16    ! INCLUDE "dimphy.h"
     17  INCLUDE "YOMCST.h"
     18  INCLUDE "YOECUMF.h"
     19  !
     20   REAL :: RHcl(klon,klev)     ! humidite relative ciel clair
     21   REAL :: tr_seri(klon, klev,nbtr) !conc of tracers
     22   REAL :: sed_ss(klon) !sedimentation flux of Sea Salt (g/m2/s)
     23   REAL :: sed_dust(klon) !sedimentation flux of dust (g/m2/s)
     24   REAL :: sed_dustsco(klon) !sedimentation flux of scoarse  dust (g/m2/s)
     25   REAL :: sed_ss3D(klon,klev) !sedimentation flux of Sea Salt (g/m2/s)
     26   REAL :: sed_dust3D(klon,klev) !sedimentation flux of dust (g/m2/s)
     27   REAL :: sed_dustsco3D(klon,klev) !sedimentation flux of scoarse  dust (g/m2/s)
     28   REAL :: t_seri(klon, klev)   !Temperature at mid points of Z (K)
     29   REAL :: v_dep_ss(klon,klev)  ! sed. velocity for SS m/s
     30   REAL :: v_dep_dust(klon,klev)  ! sed. velocity for dust m/s
     31   REAL :: v_dep_dustsco(klon,klev)  ! sed. velocity for dust m/s
     32   REAL :: pplay(klon, klev)    !pressure at mid points of Z (Pa)
     33   REAL :: zrho(klon, klev)     !Density of air at mid points of Z (kg/m3)
     34   REAL :: paprs(klon, klev+1)    !pressure at interface of layers Z (Pa)
     35   REAL :: time_step            !time step (sec)
     36   LOGICAL :: ok_chimeredust
     37   REAL :: xlat(klon)       ! latitudes pour chaque point
     38   REAL :: xlon(klon)       ! longitudes pour chaque point
     39   INTEGER :: id_coss,id_codu,id_scdu
     40  !
     41  !------local variables
     42  !
     43   INTEGER :: i, k, nbre_RH
     44   PARAMETER(nbre_RH=12)
     45  !
     46   REAL :: lambda, ss_g
     47   REAL :: mmd_ss      !mass median diameter of SS (um)
     48   REAL :: mmd_dust          !mass median diameter of dust (um)
     49   REAL :: mmd_dustsco          !mass median diameter of scoarse dust (um)
     50   REAL :: rho_ss(nbre_RH),rho_ss1 !density of sea salt (kg/m3)
     51   REAL :: rho_dust          !density of dust(kg/m3)
     52   REAL :: v_stokes, CC, v_sed, ss_growth_f(nbre_RH)
     53   REAL :: sed_flux(klon,klev)  ! sedimentation flux g/m2/s
     54   REAL :: air_visco(klon,klev)
     55   REAL :: zdz(klon,klev)       ! layers height (m)
     56   REAL :: temp                 ! temperature in degree Celius
     57  !
     58   INTEGER :: RH_num
     59   REAL :: RH_MAX, DELTA, rh, RH_tab(nbre_RH)
     60   PARAMETER (RH_MAX=95.)
     61  !
     62   DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./
     63  !
     64  !
     65   DATA rho_ss/2160. ,2160. ,2160.,  2160,  1451.6, 1367.9, &
     66         1302.9,1243.2,1182.7, 1149.5,1111.6, 1063.1/
     67  !
     68   DATA ss_growth_f/0.503, 0.503, 0.503, 0.503, 0.724, 0.782, &
     69         0.838, 0.905, 1.000, 1.072, 1.188, 1.447/
     70  !
     71  !
     72   mmd_ss=12.7   !dia -um at 80% for bin 0.5-20 um but 90% of real mmd
     73            ! obsolete      mmd_dust=2.8  !micrometer for bin 0.5-20 and 0.5-10 um
     74  ! 4tracer SPLA:       mmd_dust=11.0  !micrometer for bin 0.5-20 and 0.5-10 um
     75  !3days       mmd_dust=3.333464  !micrometer for bin 0.5-20 and 0.5-10 um
     76  !3days       mmd_dustsco=12.91315  !micrometer for bin 0.5-20 and 0.5-10 um
     77  !JE20140911       mmd_dust=3.002283  !micrometer for bin 0.5-20 and 0.5-10 um
     78  !JE20140911       mmd_dustsco=13.09771  !micrometer for bin 0.5-20 and 0.5-10 um
     79  !JE20140911        mmd_dust=5.156346  !micrometer for bin 0.5-20 and 0.5-10 um
     80  !JE20140911        mmd_dustsco=15.56554  !micrometer for bin 0.5-20 and 0.5-10 um
     81    IF (ok_chimeredust) THEN
     82  !JE20150212<< : changes in ustar in dustmod changes emission distribution
     83     ! mmd_dust=3.761212  !micrometer for bin 0.5-3 and 0.5-10 um
     84     ! mmd_dustsco=15.06167  !micrometer for bin 3-20 and 0.5-10 um
     85  !JE20150212>>
     86  !JE20150618: Change in div3 of dustmod changes distribution. now is div3=6
     87  !div=3        mmd_dust=3.983763
     88  !div=3        mmd_dustsco=15.10854
     89    mmd_dust=3.898047
     90    mmd_dustsco=15.06167
     91    ELSE
     92    mmd_dust=11.0  !micrometer for bin 0.5-20 and 0.5-10 um
     93    mmd_dustsco=100. ! absurd value, bin not used in this scheme
     94    ENDIF
     95
     96
     97   rho_dust=2600. !kg/m3
     98  !
     99  !--------- Air viscosity (poise=0.1 kg/m-sec)-----------
     100  !
     101   DO k=1, klev
     102   DO i=1, klon
     103  !
     104   zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG
     105  !
     106   temp=t_seri(i,k)-RTT
     107  !
     108   IF (temp.LT.0.) THEN
     109     air_visco(i,k)=(1.718+0.0049*temp-1.2e-5*temp*temp)*1.e-4
     110   ELSE
     111     air_visco(i,k)=(1.718+0.0049*temp)*1.e-4
     112   ENDIF
     113  !
     114   ENDDO
     115   ENDDO
     116  !
     117  !--------- for Sea Salt -------------------
     118  !
     119  !
     120  !
     121   IF(id_coss>0) THEN
     122   DO k=1, klev
     123   DO i=1,klon
     124  !
     125  !---cal. correction factor hygroscopic growth of aerosols
     126  !
     127    rh=MIN(RHcl(i,k)*100.,RH_MAX)
     128    RH_num = INT( rh/10. + 1.)
     129    IF (rh.gt.85.) RH_num=10
     130    IF (rh.gt.90.) RH_num=11
     131    DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num))
     132  !
     133    ss_g=ss_growth_f(rh_num) + &
     134          DELTA*(ss_growth_f(RH_num+1)-ss_growth_f(RH_num))
     135
     136    rho_ss1=rho_ss(rh_num) + &
     137          DELTA*(rho_ss(RH_num+1)-rho_ss(RH_num))
     138  !
     139    v_stokes=RG*(rho_ss1-zrho(i,k))* & !m/sec
     140          (mmd_ss*ss_g)*(mmd_ss*ss_g)* &
     141          1.e-12/(18.0*air_visco(i,k)/10.)
     142  !
     143   lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
     144  !
     145   CC=1.0+1.257*lambda/(mmd_ss*ss_g)/1.e6  ! C-correction factor
     146  !
     147   v_sed=v_stokes*CC                       ! m/sec !orig
     148  !
     149  !---------check for v_sed*dt<zdz
     150  !
     151   IF (v_sed*time_step.GT.zdz(i,k)) THEN
     152     v_sed=zdz(i,k)/time_step
     153   ENDIF
     154  !
     155   v_dep_ss(i,k)= v_sed
     156   sed_flux(i,k)= tr_seri(i,k,id_coss)*v_sed !g/cm3*m/sec
     157   ! !sed_ss3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
     158  ! ! conc_sed_ss3D(i,k)=sed_flux(i,k)*1.e6      !g/m3*sec !!!!!!!
     159  !
     160   ENDDO          !klon
     161   ENDDO          !klev
     162  !
     163  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     164   sed_ss3D(:,:)=0.0  ! initialisation
     165
     166   DO k=1, klev
     167   DO i=1, klon
     168   sed_ss3D(i,k)=sed_ss3D(i,k)- &
     169         sed_flux(i,k)/zdz(i,k) !!!!!!!!!!!!!!!!!!!!!!
     170   ENDDO          !klon
     171   ENDDO          !klev
     172  !
     173   DO k=1, klev-1
     174   DO i=1, klon
     175    sed_ss3D(i,k)=sed_ss3D(i,k)+ &
     176          sed_flux(i,k+1)/zdz(i,k) !!!!!!!!
     177
     178   ENDDO          !klon
     179   ENDDO          !klev
     180
     181  DO k = 1, klev
     182  DO i = 1, klon
     183      tr_seri(i,k,id_coss)=tr_seri(i,k,id_coss)+ &
     184            sed_ss3D(i,k)*time_step
     185  ENDDO
     186  ENDDO
     187
     188  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     189  !
     190   DO i=1, klon
     191     sed_ss(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
     192   ENDDO          !klon
     193   ELSE
     194    DO i=1, klon
     195      sed_ss(i)=0.
     196    ENDDO
     197   ENDIF
     198  !
     199  !
     200
     201  !--------- For dust ------------------
     202  !
     203  !
     204   IF(id_codu>0) THEN
     205   DO k=1, klev
     206   DO i=1,klon
     207  !
     208    v_stokes=RG*(rho_dust-zrho(i,k))* & !m/sec
     209          mmd_dust*mmd_dust* &
     210          1.e-12/(18.0*air_visco(i,k)/10.)
     211  !
     212   lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
     213   CC=1.0+1.257*lambda/(mmd_dust)/1.e6        !dimensionless
     214   v_sed=v_stokes*CC                       !m/sec
     215  !
     216  !---------check for v_sed*dt<zdz
     217  !
     218   IF (v_sed*time_step.GT.zdz(i,k)) THEN
     219     v_sed=zdz(i,k)/time_step
     220   ENDIF
     221
     222  !
     223   v_dep_dust(i,k)= v_sed
     224   sed_flux(i,k)  = tr_seri(i,k,id_codu)*v_sed !g/cm3.m/sec
     225   ! !sed_dust3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
     226  !
     227   ENDDO          !klon
     228   ENDDO          !klev
     229
     230  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     231   sed_dust3D(:,:)=0.0  ! initialisation
     232
     233   DO k=1, klev
     234   DO i=1, klon
     235   sed_dust3D(i,k)=sed_dust3D(i,k)- &
     236         sed_flux(i,k)/zdz(i,k)
     237   ENDDO          !klon
     238   ENDDO          !klev
     239
     240  !
     241  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     242
     243   DO k=1, klev-1
     244   DO i=1, klon
     245    sed_dust3D(i,k)=sed_dust3D(i,k) + &
     246          sed_flux(i,k+1)/zdz(i,k)
     247   ENDDO          !klon
     248   ENDDO          !klev
     249  !
     250  DO k = 1, klev
     251  DO i = 1, klon
     252     tr_seri(i,k,id_codu)=tr_seri(i,k,id_codu)+ &
     253           sed_dust3D(i,k)*time_step
     254  ENDDO
     255  ENDDO
     256
     257
     258   DO i=1, klon
     259     sed_dust(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
     260   ENDDO          !klon
     261   ELSE
     262    DO i=1, klon
     263      sed_dust(i)=0.
     264    ENDDO
     265   ENDIF
     266  !
     267
     268
     269  !--------- For scoarse  dust ------------------
     270  !
     271  !
     272   IF(id_scdu>0) THEN
     273   DO k=1, klev
     274   DO i=1,klon
     275  !
     276    v_stokes=RG*(rho_dust-zrho(i,k))* & !m/sec
     277          mmd_dustsco*mmd_dustsco* &
     278          1.e-12/(18.0*air_visco(i,k)/10.)
     279  !
     280   lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15)
     281   CC=1.0+1.257*lambda/(mmd_dustsco)/1.e6        !dimensionless
     282   v_sed=v_stokes*CC                       !m/sec
     283  !
     284  !---------check for v_sed*dt<zdz
     285
     286
     287   IF (v_sed*time_step.GT.zdz(i,k)) THEN
     288     v_sed=zdz(i,k)/time_step
     289   ENDIF
     290
     291  !
     292   v_dep_dustsco(i,k)= v_sed
     293   sed_flux(i,k)     = tr_seri(i,k,id_scdu)*v_sed !g/cm3.m/sec
     294   ! !sed_dustsco3D(i,k)= -sed_flux(i,k)/zdz(i,k)      !g/cm3*sec !!!!!!!
     295  !
     296   ENDDO          !klon
     297   ENDDO          !klev
     298
     299  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     300   sed_dustsco3D(:,:)=0.0  ! initialisation
     301
     302   DO k=1, klev
     303   DO i=1, klon
     304   sed_dustsco3D(i,k)=sed_dustsco3D(i,k)- &
     305         sed_flux(i,k)/zdz(i,k)
     306   ENDDO          !klon
     307   ENDDO          !klev
     308  !
     309   DO k=1, klev-1
     310   DO i=1, klon
     311    sed_dustsco3D(i,k)=sed_dustsco3D(i,k) + &
     312          sed_flux(i,k+1)/zdz(i,k)
     313   ENDDO          !klon
     314   ENDDO          !klev
     315
     316  DO k = 1, klev
     317  DO i = 1, klon
     318   tr_seri(i,k,id_scdu)=tr_seri(i,k,id_scdu)+ &
     319         sed_dustsco3D(i,k)*time_step
     320  ENDDO
     321  ENDDO
     322  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     323
     324
     325  !
     326   DO i=1, klon
     327     sed_dustsco(i)=sed_flux(i,1)*1.e6*1.e3    !--unit mg/m2/s
     328   ENDDO          !klon
     329   ELSE
     330    DO i=1, klon
     331      sed_dustsco(i)=0.
     332    ENDDO
     333   ENDIF
     334  !
     335
     336
     337
     338
     339  !
     340   RETURN
     341END SUBROUTINE sediment_mod
  • LMDZ6/trunk/libf/phylmd/Dust/tiedqneg.f90

    r5245 r5246  
    1       SUBROUTINE tiedqneg (pres_h,q,d_q)
    2 c
    3       USE dimphy
    4       IMPLICIT none
    5 c======================================================================
    6 c Auteur(s): CG (LGGE/CNRS) date: 19950201
    7 c            O. Boucher (LOA/CNRS) date 19961125
    8 c Objet:  Correction eventuelle des valeurs negatives d'humidite
    9 c induites par le schema de convection de Tiedke
    10 c======================================================================
    11 c Arguments:
    12 c pres_h--input-R-la valeur de la pression aux interfaces
    13 c q-------input-R-quantite de traceur
    14 c d_q-----input-output-R-increment du traceur
    15 c======================================================================
    16 c
    17       INCLUDE "dimensions.h"
    18 c      INCLUDE "dimphy.h"
    19       REAL pres_h(klon,klev+1)
    20       REAL q(klon,klev)
    21       REAL d_q(klon,klev)
    22       INTEGER nb_neg
    23       INTEGER i, l
    24 c
    25       REAL qmin
    26       PARAMETER (qmin=0.0)
    27 c
    28       DO l = klev,2,-1
    29         nb_neg = 0
    30         DO i = 1,klon
    31           IF (q(i,l)+d_q(i,l).LT.qmin) THEN
    32           nb_neg = nb_neg + 1
    33           d_q(i,l-1) = d_q(i,l-1) + (q(i,l)+d_q(i,l)-qmin)
    34      .       *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l-1)-pres_h(i,l))
    35             d_q(i,l) = qmin - q(i,l)
    36           ENDIF
    37         ENDDO
    38 c        IF (nb_neg.NE.0) THEN
    39 c        PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'
    40 c        ENDIF
    41       ENDDO
    42 c
    43       DO l = 1, klev-1
    44         nb_neg = 0
    45         DO i = 1,klon
    46           IF (q(i,l)+d_q(i,l).LT.qmin) THEN
    47           nb_neg = nb_neg + 1
    48           d_q(i,l+1) = d_q(i,l+1) + (q(i,l)+d_q(i,l)-qmin)
    49      .      *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l+1)-pres_h(i,l+2))
    50           d_q(i,l) = qmin - q(i,l)
    51           ENDIF
    52         ENDDO
    53 c        IF (nb_neg.NE.0) THEN
    54 c        PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'
    55 c        ENDIF
    56       ENDDO
    57 c
    58       l = klev
    59       DO i = 1,klon
    60         IF (q(i,l)+d_q(i,l).LT.qmin) THEN
    61           d_q(i,l) = qmin - q(i,l)
    62         ENDIF
    63       ENDDO
    64 c
    65       RETURN
    66       END
     1SUBROUTINE tiedqneg (pres_h,q,d_q)
     2  !
     3  USE dimphy
     4  IMPLICIT none
     5  !======================================================================
     6  ! Auteur(s): CG (LGGE/CNRS) date: 19950201
     7         ! O. Boucher (LOA/CNRS) date 19961125
     8  ! Objet:  Correction eventuelle des valeurs negatives d'humidite
     9  ! induites par le schema de convection de Tiedke
     10  !======================================================================
     11  ! Arguments:
     12  ! pres_h--input-R-la valeur de la pression aux interfaces
     13  ! q-------input-R-quantite de traceur
     14  ! d_q-----input-output-R-increment du traceur
     15  !======================================================================
     16  !
     17  INCLUDE "dimensions.h"
     18    ! INCLUDE "dimphy.h"
     19  REAL :: pres_h(klon,klev+1)
     20  REAL :: q(klon,klev)
     21  REAL :: d_q(klon,klev)
     22  INTEGER :: nb_neg
     23  INTEGER :: i, l
     24  !
     25  REAL :: qmin
     26  PARAMETER (qmin=0.0)
     27  !
     28  DO l = klev,2,-1
     29    nb_neg = 0
     30    DO i = 1,klon
     31      IF (q(i,l)+d_q(i,l).LT.qmin) THEN
     32      nb_neg = nb_neg + 1
     33      d_q(i,l-1) = d_q(i,l-1) + (q(i,l)+d_q(i,l)-qmin) &
     34            *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l-1)-pres_h(i,l))
     35        d_q(i,l) = qmin - q(i,l)
     36      ENDIF
     37    ENDDO
     38     ! IF (nb_neg.NE.0) THEN
     39     ! PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'
     40     ! ENDIF
     41  ENDDO
     42  !
     43  DO l = 1, klev-1
     44    nb_neg = 0
     45    DO i = 1,klon
     46      IF (q(i,l)+d_q(i,l).LT.qmin) THEN
     47      nb_neg = nb_neg + 1
     48      d_q(i,l+1) = d_q(i,l+1) + (q(i,l)+d_q(i,l)-qmin) &
     49            *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l+1)-pres_h(i,l+2))
     50      d_q(i,l) = qmin - q(i,l)
     51      ENDIF
     52    ENDDO
     53     ! IF (nb_neg.NE.0) THEN
     54     ! PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'
     55     ! ENDIF
     56  ENDDO
     57  !
     58  l = klev
     59  DO i = 1,klon
     60    IF (q(i,l)+d_q(i,l).LT.qmin) THEN
     61      d_q(i,l) = qmin - q(i,l)
     62    ENDIF
     63  ENDDO
     64  !
     65  RETURN
     66END SUBROUTINE tiedqneg
  • LMDZ6/trunk/libf/phylmd/Dust/trconvect.f90

    r5245 r5246  
    1 c Subroutine that computes the convective mixing and transport
    2       SUBROUTINE trconvect(pplay,t_seri,pdtphys,pmfu,pmfd,pen_u,pde_u,
    3      .          pen_d,pde_d,paprs,zdz,xconv,qmin,qmax,lminmax,masse,
    4      .                                                dtrconv,tr_seri)
     1! Subroutine that computes the convective mixing and transport
     2SUBROUTINE trconvect(pplay,t_seri,pdtphys,pmfu,pmfd,pen_u,pde_u, &
     3        pen_d,pde_d,paprs,zdz,xconv,qmin,qmax,lminmax,masse, &
     4        dtrconv,tr_seri)
    55
    6       USE dimphy
    7       USE infotrac
    8       USE indice_sol_mod
     6  USE dimphy
     7  USE infotrac
     8  USE indice_sol_mod
    99
    10       IMPLICIT NONE
     10  IMPLICIT NONE
    1111
    12       INCLUDE "dimensions.h"
    13       INCLUDE "chem.h"
    14       INCLUDE "YOMCST.h"
    15       INCLUDE "paramet.h"
     12  INCLUDE "dimensions.h"
     13  INCLUDE "chem.h"
     14  INCLUDE "YOMCST.h"
     15  INCLUDE "paramet.h"
    1616
    17 c============================= INPUT ===================================
    18       REAL qmin, qmax
    19       REAL xconv(nbtr), masse(nbtr)
    20       REAL pplay(klon,klev)    ! pression pour le mileu de chaque couche (en Pa)
    21       REAL t_seri(klon,klev)   ! temperature       
    22       REAL zdz(klon,klev)      ! zdz
    23       REAL paprs(klon,klev+1)  ! pression pour chaque inter-couche (en Pa)
    24       REAL pmfu(klon,klev)     ! flux de masse dans le panache montant
    25       REAL pmfd(klon,klev)     ! flux de masse dans le panache descendant
    26       REAL pen_u(klon,klev)    ! flux entraine dans le panache montant
    27       REAL pde_u(klon,klev)    ! flux detraine dans le panache montant
    28       REAL pen_d(klon,klev)    ! flux entraine dans le panache descendant
    29       REAL pde_d(klon,klev)    ! flux detraine dans le panache descendant 
    30       LOGICAL lminmax
    31       REAL pdtphys
    32 c============================= OUTPUT ==================================
    33       REAL aux_var1(klon,klev)
    34       REAL aux_var2(klon,klev)
    35       REAL tr_seri(klon,klev,nbtr) ! traceur
    36       REAL dtrconv(klon,nbtr) ! traceur
    37 c========================= LOCAL VARIABLES =============================
    38       INTEGER it, k, i, j
    39       REAL d_tr(klon,klev,nbtr)
     17  !============================= INPUT ===================================
     18  REAL :: qmin, qmax
     19  REAL :: xconv(nbtr), masse(nbtr)
     20  REAL :: pplay(klon,klev)    ! pression pour le mileu de chaque couche (en Pa)
     21  REAL :: t_seri(klon,klev)   ! temperature
     22  REAL :: zdz(klon,klev)      ! zdz
     23  REAL :: paprs(klon,klev+1)  ! pression pour chaque inter-couche (en Pa)
     24  REAL :: pmfu(klon,klev)     ! flux de masse dans le panache montant
     25  REAL :: pmfd(klon,klev)     ! flux de masse dans le panache descendant
     26  REAL :: pen_u(klon,klev)    ! flux entraine dans le panache montant
     27  REAL :: pde_u(klon,klev)    ! flux detraine dans le panache montant
     28  REAL :: pen_d(klon,klev)    ! flux entraine dans le panache descendant
     29  REAL :: pde_d(klon,klev)    ! flux detraine dans le panache descendant
     30  LOGICAL :: lminmax
     31  REAL :: pdtphys
     32  !============================= OUTPUT ==================================
     33  REAL :: aux_var1(klon,klev)
     34  REAL :: aux_var2(klon,klev)
     35  REAL :: tr_seri(klon,klev,nbtr) ! traceur
     36  REAL :: dtrconv(klon,nbtr) ! traceur
     37  !========================= LOCAL VARIABLES =============================
     38  INTEGER :: it, k, i, j
     39  REAL :: d_tr(klon,klev,nbtr)
    4040
    41       EXTERNAL nflxtr, tiedqneg, minmaxqfi
    42      
    43       DO it=1, nbtr
    44 c
    45       DO i=1, klon
    46         dtrconv(i,it)=0.0
    47       ENDDO
    48       DO i=1,klon
    49       DO j=1,klev
    50         aux_var1(i,j)=tr_seri(i,j,it)
    51         aux_var2(i,j)=d_tr(i,j,it)
    52       ENDDO
    53       ENDDO
    54                                                  
    55 c
    56 cnhl      CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
    57 cnhl     .            pplay, paprs, tr_seri(1,1,it), d_tr(1,1,it) )
    58       CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
    59      .            pplay, paprs, aux_var1, aux_var2 )
    60 c
    61       CALL tiedqneg(paprs,aux_var1, aux_var2)
    62 cnhl      CALL tiedqneg(paprs,tr_seri(1,1,it), d_tr(1,1,it))
    63       DO i=1,klon
    64       DO j=1,klev
    65         tr_seri(i,j,it)=aux_var1(i,j)
    66         d_tr(i,j,it)=aux_var2(i,j)
    67       ENDDO
    68       ENDDO
    69 c
    70       DO k = 1, klev
    71       DO i = 1, klon
    72         IF (d_tr(i,k,it).LT.0.) THEN
    73           tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)
    74         ELSE
    75           tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)*xconv(it)
    76         ENDIF
    77       ENDDO
    78       ENDDO
    79 c
    80 cnhl      CALL kg_to_cm3(pplay,t_seri,d_tr(1,1,it))
    81       CALL kg_to_cm3(pplay,t_seri,aux_var2)
    82       DO i=1,klon
    83       DO j=1,klev
    84         d_tr(i,j,it)=aux_var2(i,j)
    85       ENDDO
    86       ENDDO
     41  EXTERNAL nflxtr, tiedqneg, minmaxqfi
    8742
    88       DO k = 1, klev
    89       DO i = 1, klon
    90         IF (d_tr(i,k,it).GE.0.) THEN
    91         dtrconv(i,it)=dtrconv(i,it)+(1.-xconv(it))*d_tr(i,k,it)
    92      .                /RNAVO*masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys
    93         ENDIF
    94       ENDDO
    95       ENDDO
     43  DO it=1, nbtr
     44  !
     45  DO i=1, klon
     46    dtrconv(i,it)=0.0
     47  ENDDO
     48  DO i=1,klon
     49  DO j=1,klev
     50    aux_var1(i,j)=tr_seri(i,j,it)
     51    aux_var2(i,j)=d_tr(i,j,it)
     52  ENDDO
     53  ENDDO
    9654
    97       IF (lminmax) THEN
    98         DO i=1,klon
    99         DO j=1,klev
    100           aux_var1(i,j)=tr_seri(i,j,it)
    101         ENDDO
    102         ENDDO
    103         CALL minmaxqfi(aux_var1,qmin,qmax,'apr convection')
    104 cnhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'apr convection')
    105         DO i=1,klon
    106         DO j=1,klev
    107           tr_seri(i,j,it)=aux_var1(i,j)
    108         ENDDO
    109         ENDDO
    110       ENDIF
    111 c
    112       ENDDO
     55  !
     56  !nhl      CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
     57  !nhl     .            pplay, paprs, tr_seri(1,1,it), d_tr(1,1,it) )
     58  CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
     59        pplay, paprs, aux_var1, aux_var2 )
     60  !
     61  CALL tiedqneg(paprs,aux_var1, aux_var2)
     62  !nhl      CALL tiedqneg(paprs,tr_seri(1,1,it), d_tr(1,1,it))
     63  DO i=1,klon
     64  DO j=1,klev
     65    tr_seri(i,j,it)=aux_var1(i,j)
     66    d_tr(i,j,it)=aux_var2(i,j)
     67  ENDDO
     68  ENDDO
     69  !
     70  DO k = 1, klev
     71  DO i = 1, klon
     72    IF (d_tr(i,k,it).LT.0.) THEN
     73      tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)
     74    ELSE
     75      tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)*xconv(it)
     76    ENDIF
     77  ENDDO
     78  ENDDO
     79  !
     80  !nhl      CALL kg_to_cm3(pplay,t_seri,d_tr(1,1,it))
     81  CALL kg_to_cm3(pplay,t_seri,aux_var2)
     82  DO i=1,klon
     83  DO j=1,klev
     84    d_tr(i,j,it)=aux_var2(i,j)
     85  ENDDO
     86  ENDDO
    11387
    114       END
     88  DO k = 1, klev
     89  DO i = 1, klon
     90    IF (d_tr(i,k,it).GE.0.) THEN
     91    dtrconv(i,it)=dtrconv(i,it)+(1.-xconv(it))*d_tr(i,k,it) &
     92          /RNAVO*masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys
     93    ENDIF
     94  ENDDO
     95  ENDDO
     96
     97  IF (lminmax) THEN
     98    DO i=1,klon
     99    DO j=1,klev
     100      aux_var1(i,j)=tr_seri(i,j,it)
     101    ENDDO
     102    ENDDO
     103    CALL minmaxqfi(aux_var1,qmin,qmax,'apr convection')
     104  !nhl      CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'apr convection')
     105    DO i=1,klon
     106    DO j=1,klev
     107      tr_seri(i,j,it)=aux_var1(i,j)
     108    ENDDO
     109    ENDDO
     110  ENDIF
     111  !
     112  ENDDO
     113
     114END SUBROUTINE trconvect
Note: See TracChangeset for help on using the changeset viewer.