Changeset 66 for trunk/libf/phylmd


Ignore:
Timestamp:
Feb 16, 2011, 4:57:45 PM (14 years ago)
Author:
emillour
Message:

EM: Mise a niveau par rapport a la version terrestre (LMDZ5V2.0-dev, rev 1487)

  • Mise a jour des scripts (terrestres) 'makegcm' et 'create_make_gcm'
  • Ajout du script 'makelmdz' (version "amelioree", en Bash, de makegcm)
  • Mise a jour des routines dans phylmd (sauf regr_lat_time_climoz_m.F)
  • disvert (dans dyn3d et dyn3dpar): passage au Fortran 90
  • parallel.F90 (dyn3dpar): correction bug
  • etat0_netcdf.F90 (dyn3d et dyn3dpar) : mise a jour mineure
  • ce0l.F90 (dyn3dpar) : correction bug
  • abort_gcm.F (dyn3dpar) : correction bug
  • ugeostr.F90 (dyn3d et dyn3dpar) : passage au Fortran 90
  • fluxstokenc_p.F (dyn3dpar) : correction bug
  • iniacademic.F90 (dyn3d et dyn3dpar) : passage au Fortran 90
  • friction_p.F (dyn3dpar) : correction bug
  • infotrac.F90 (dyn3d et dyn3dpar) : correction bug mineur sur lecture traceurs
  • caladvtrac.F (dyn3d) : modifications cosmetiques
Location:
trunk/libf/phylmd
Files:
7 added
3 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/libf/phylmd/aeropt_5wv.F90

    r1 r66  
    11!
    2 ! $Id: aeropt_5wv.F90 1418 2010-07-19 15:11:24Z jghattas $
     2! $Id: aeropt_5wv.F90 1470 2010-12-21 15:51:32Z idelkadi $
    33!
    44
     
    756756    ENDIF
    757757
    758     used_tau(spsol)=.TRUE.
     758!Bug 21 12 10 AI
     759!    used_tau(spsol)=.TRUE.
     760    IF (soluble) then
     761      used_tau(spsol)=.TRUE.
     762       ELSE
     763      used_tau(naero_soluble+spinsol)=.TRUE.
     764    ENDIF
     765
    759766    DO la=1,las
    760767
  • trunk/libf/phylmd/calcul_divers.h

    r1 r66  
    22c $Header$
    33c
    4 c
    5 c initialisations diverses au "debut" du mois
    6 c
    7       IF(MOD(itap,INT(ecrit_mth/dtime)).EQ.1) THEN
     4
     5c     Initialisations diverses au "debut" du mois
     6      IF(debut) THEN
     7         nday_rain(:)=0.
     8
     9c        surface terre
     10         paire_ter(:)=0.
    811         DO i=1, klon
    9           nday_rain(i)=0.
    10          ENDDO !i
    11 c
    12 c surface terre
    13        DO i=1, klon
    14          IF(pctsrf(i,is_ter).GT.0.) THEN
    15             paire_ter(i)=airephy(i)*pctsrf(i,is_ter)
    16          ENDIF
    17        ENDDO
    18 c
    19       ENDIF !MOD(itap,INT(ecrit_mth)).EQ.1
    20 c
    21       IF(MOD(itap,INT(ecrit_day/dtime)).EQ.0) THEN
    22 c
    23 cIM calcul total_rain, nday_rain
    24 c
    25        DO i = 1, klon
    26         total_rain(i)=rain_fall(i)+snow_fall(i) 
    27         IF(total_rain(i).GT.0.) nday_rain(i)=nday_rain(i)+1.
    28        ENDDO
    29       ENDIF !itap.EQ.ecrit_mth
     12            IF(pctsrf(i,is_ter).GT.0.) THEN
     13               paire_ter(i)=airephy(i)*pctsrf(i,is_ter)
     14            ENDIF
     15         ENDDO
     16      ENDIF
     17
     18cIM   Calcul une fois par jour : total_rain, nday_rain
     19      IF(MOD(itap,INT(un_jour/dtime)).EQ.0) THEN
     20         DO i = 1, klon
     21            total_rain(i)=rain_fall(i)+snow_fall(i) 
     22            IF(total_rain(i).GT.0.) nday_rain(i)=nday_rain(i)+1.
     23         ENDDO
     24      ENDIF
  • trunk/libf/phylmd/carbon_cycle_mod.F90

    r1 r66  
    11MODULE carbon_cycle_mod
    2 
     2! Controle module for the carbon CO2 tracers :
     3!   - Identification
     4!   - Get concentrations comming from coupled model or read from file to tracers
     5!   - Calculate new RCO2 for radiation scheme
     6!   - Calculate new carbon flux for sending to coupled models (PISCES and ORCHIDEE)
     7!
    38! Author : Josefine GHATTAS, Patricia CADULE
    49
     
    1318  LOGICAL, PUBLIC :: carbon_cycle_cpl       ! Coupling of CO2 fluxes between LMDZ/ORCHIDEE and LMDZ/OCEAN(PISCES)
    1419!$OMP THREADPRIVATE(carbon_cycle_cpl)
     20
    1521  LOGICAL :: carbon_cycle_emis_comp=.FALSE. ! Calculation of emission compatible
     22!$OMP THREADPRIVATE(carbon_cycle_emis_comp)
     23
     24  LOGICAL :: RCO2_inter  ! RCO2 interactive : if true calculate new value RCO2 for the radiation scheme
     25!$OMP THREADPRIVATE(RCO2_inter)
    1626
    1727! Scalare values when no transport, from physiq.def
     
    2131!$OMP THREADPRIVATE(emis_land_s)
    2232
    23   INTEGER :: ntr_co2                ! Number of tracers concerning the carbon cycle
    24   INTEGER :: id_fco2_tot            ! Tracer index
    25   INTEGER :: id_fco2_ocn            !  - " -
    26   INTEGER :: id_fco2_land           !  - " -
    27   INTEGER :: id_fco2_land_use       !  - " -
    28   INTEGER :: id_fco2_fos_fuel       !  - " -
    29 !$OMP THREADPRIVATE(ntr_co2, id_fco2_tot, id_fco2_ocn, id_fco2_land, id_fco2_land_use, id_fco2_fos_fuel) 
    30 
    31   REAL, DIMENSION(:), ALLOCATABLE :: fos_fuel        ! CO2 fossil fuel emission from file [gC/m2/d]
    32 !$OMP THREADPRIVATE(fos_fuel)
    33   REAL, DIMENSION(:), ALLOCATABLE, PUBLIC :: fco2_ocn_day ! flux CO2 from ocean for 1 day (cumulated) [gC/m2/d]
     33  REAL :: airetot     ! Total area of the earth surface
     34!$OMP THREADPRIVATE(airetot)
     35
     36  INTEGER :: ntr_co2  ! Number of tracers concerning the carbon cycle
     37!$OMP THREADPRIVATE(ntr_co2)
     38
     39! fco2_ocn_day : flux CO2 from ocean for 1 day (cumulated) [gC/m2/d]. Allocation and initalization done in cpl_mod
     40  REAL, DIMENSION(:), ALLOCATABLE, PUBLIC :: fco2_ocn_day
    3441!$OMP THREADPRIVATE(fco2_ocn_day)
     42
    3543  REAL, DIMENSION(:), ALLOCATABLE :: fco2_land_day   ! flux CO2 from land for 1 day (cumulated)  [gC/m2/d]
    3644!$OMP THREADPRIVATE(fco2_land_day)
     
    3846!$OMP THREADPRIVATE(fco2_lu_day)
    3947
    40 ! Following 2 fields will be initialized in surf_land_orchidee at each time step
     48  REAL, DIMENSION(:,:), ALLOCATABLE :: dtr_add       ! Tracer concentration to be injected
     49!$OMP THREADPRIVATE(dtr_add)
     50
     51! Following 2 fields will be allocated and initialized in surf_land_orchidee
    4152  REAL, DIMENSION(:), ALLOCATABLE, PUBLIC :: fco2_land_inst  ! flux CO2 from land at one time step
    4253!$OMP THREADPRIVATE(fco2_land_inst)
     
    4556
    4657! Calculated co2 field to be send to the ocean via the coupler and to ORCHIDEE
    47   REAL, DIMENSION(:), ALLOCATABLE, PUBLIC :: co2_send
     58  REAL, DIMENSION(:), ALLOCATABLE, PUBLIC :: co2_send ! Field allocated in phyetat0
    4859!$OMP THREADPRIVATE(co2_send)
     60
     61
     62  TYPE, PUBLIC ::   co2_trac_type
     63     CHARACTER(len = 8) :: name       ! Tracer name in tracer.def
     64     INTEGER            :: id         ! Index in total tracer list, tr_seri
     65     CHARACTER(len=30)  :: file       ! File name
     66     LOGICAL            :: cpl        ! True if this tracers is coupled from ORCHIDEE or PISCES.
     67                                      ! False if read from file.
     68     INTEGER            :: updatefreq ! Frequence to inject in second
     69     INTEGER            :: readstep   ! Actual time step to read in file
     70     LOGICAL            :: updatenow  ! True if this tracer should be updated this time step
     71  END TYPE co2_trac_type
     72  INTEGER,PARAMETER :: maxco2trac=5  ! Maximum number of different CO2 fluxes
     73  TYPE(co2_trac_type), DIMENSION(maxco2trac) :: co2trac
    4974
    5075CONTAINS
    5176 
    52   SUBROUTINE carbon_cycle_init(tr_seri, aerosol, radio)
     77  SUBROUTINE carbon_cycle_init(tr_seri, pdtphys, aerosol, radio)
     78! This subroutine is called from traclmdz_init, only at first timestep.
     79! - Read controle parameters from .def input file
     80! - Search for carbon tracers and set default values
     81! - Allocate variables
     82! - Test for compatibility
     83
    5384    USE dimphy
     85    USE comgeomphy
     86    USE mod_phys_lmdz_transfert_para
    5487    USE infotrac
    5588    USE IOIPSL
    5689    USE surface_data, ONLY : ok_veget, type_ocean
     90    USE phys_cal_mod, ONLY : mth_len
    5791
    5892    IMPLICIT NONE
     
    6296! Input argument
    6397    REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri ! Concentration Traceur [U/KgA] 
     98    REAL,INTENT(IN)                           :: pdtphys ! length of time step in physiq (sec)
    6499
    65100! InOutput arguments
     
    68103
    69104! Local variables
    70     INTEGER               :: ierr, it, iiq
    71     REAL, DIMENSION(klon) :: tr_seri_sum
    72 
    73 
    74 ! 0) Test for compatibility
    75     IF (carbon_cycle_cpl .AND. type_ocean/='couple') &
    76          CALL abort_gcm('carbon_cycle_init', 'Coupling with ocean model is needed for carbon_cycle_cpl',1)
    77     IF (carbon_cycle_cpl .AND..NOT. ok_veget) &
    78          CALL abort_gcm('carbon_cycle_init', 'Coupling with surface land model ORCHDIEE is needed for carbon_cycle_cpl',1)
    79 
    80 
    81 ! 1) Check if transport of one tracer flux CO2 or 4 separated tracers
    82     IF (carbon_cycle_tr) THEN
    83        id_fco2_tot=0
    84        id_fco2_ocn=0
    85        id_fco2_land=0
    86        id_fco2_land_use=0
    87        id_fco2_fos_fuel=0
    88        
    89        ! Search in tracer list
    90        DO it=1,nbtr
    91           iiq=niadv(it+2)
    92           IF (tname(iiq) == "fCO2" ) THEN
    93              id_fco2_tot=it
    94           ELSE IF (tname(iiq) == "fCO2_ocn" ) THEN
    95              id_fco2_ocn=it
    96           ELSE IF (tname(iiq) == "fCO2_land" ) THEN
    97              id_fco2_land=it
    98           ELSE IF (tname(iiq) == "fCO2_land_use" ) THEN
    99              id_fco2_land_use=it
    100           ELSE IF (tname(iiq) == "fCO2_fos_fuel" ) THEN
    101              id_fco2_fos_fuel=it
    102           END IF
    103        END DO
    104 
    105        ! Count tracers found
    106        IF (id_fco2_tot /= 0 .AND. &
    107             id_fco2_ocn==0 .AND. id_fco2_land==0 .AND. id_fco2_land_use==0 .AND. id_fco2_fos_fuel==0) THEN
    108          
    109           ! transport  1 tracer flux CO2
    110           ntr_co2 = 1
    111          
    112        ELSE IF (id_fco2_tot==0 .AND. &
    113             id_fco2_ocn /=0 .AND. id_fco2_land/=0 .AND. id_fco2_land_use/=0 .AND. id_fco2_fos_fuel/=0) THEN
    114          
    115           ! transport 4 tracers seperatively
    116           ntr_co2 = 4
    117          
    118        ELSE
    119           CALL abort_gcm('carbon_cycle_init', 'error in coherence between traceur.def and gcm.def',1)
    120        END IF
    121 
    122        ! Definition of control varaiables for the tracers
    123        DO it=1,nbtr
    124           IF (it==id_fco2_tot .OR. it==id_fco2_ocn .OR. it==id_fco2_land .OR. &
    125                it==id_fco2_land_use .OR. it==id_fco2_fos_fuel) THEN
    126              aerosol(it) = .FALSE.
    127              radio(it)   = .FALSE.
    128           END IF
    129        END DO
    130 
    131     ELSE
    132        ! No transport of CO2
    133        ntr_co2 = 0
    134     END IF ! carbon_cycle_tr
    135 
    136 
    137 ! 2) Allocate variable for CO2 fossil fuel emission
    138     IF (carbon_cycle_tr) THEN
    139        ! Allocate 2D variable
    140        ALLOCATE(fos_fuel(klon), stat=ierr)
    141        IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 1',1)
    142     ELSE
    143        ! No transport : read value from .def
     105    INTEGER               :: ierr, it, iiq, itc
     106    INTEGER               :: teststop
     107
     108
     109
     110! 1) Read controle parameters from .def input file
     111! ------------------------------------------------
     112    ! Read fosil fuel value if no transport
     113    IF (.NOT. carbon_cycle_tr) THEN
    144114       fos_fuel_s = 0.
    145115       CALL getin ('carbon_cycle_fos_fuel',fos_fuel_s)
     
    148118
    149119
    150 ! 3) Allocate and initialize fluxes
    151     IF (carbon_cycle_cpl) THEN
    152        IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 2',1)
    153        ALLOCATE(fco2_land_day(klon), stat=ierr)
    154        IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 3',1)
    155        ALLOCATE(fco2_lu_day(klon), stat=ierr)
    156        IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 4',1)
    157 
    158        fco2_land_day(:) = 0.  ! JG : Doit prend valeur de restart
    159        fco2_lu_day(:)   = 0.  ! JG : Doit prend valeur de restart
    160 
    161        ! fco2_ocn_day is allocated in cpl_mod
    162        ! fco2_land_inst and fco2_lu_inst are allocated in surf_land_orchidee
    163        
    164        ALLOCATE(co2_send(klon), stat=ierr)
    165        IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 7',1)
    166        
    167        ! Calculate using restart tracer values
    168        IF (carbon_cycle_tr) THEN
    169           IF (ntr_co2==1) THEN
    170              co2_send(:) = tr_seri(:,1,id_fco2_tot) + co2_ppm0
    171           ELSE ! ntr_co2==4
    172              ! Calculate the delta CO2 flux
    173              tr_seri_sum(:) = tr_seri(:,1,id_fco2_fos_fuel) + tr_seri(:,1,id_fco2_land_use) + &
    174                   tr_seri(:,1,id_fco2_land) + tr_seri(:,1,id_fco2_ocn)
    175              co2_send(:) = tr_seri_sum(:) + co2_ppm0
    176           END IF
    177        ELSE
    178           ! Send a scalare value in 2D variable to ocean and land model (PISCES and ORCHIDEE)
    179           co2_send(:) = co2_ppm
    180        END IF
    181 
    182 
    183     ELSE
    184        IF (carbon_cycle_tr) THEN
    185           ! No coupling of CO2 fields :
    186           ! corresponding fields will instead be read from files
    187           ALLOCATE(fco2_ocn_day(klon), stat=ierr)
    188           IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 8',1)
    189           ALLOCATE(fco2_land_day(klon), stat=ierr)
    190           IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 9',1)
    191           ALLOCATE(fco2_lu_day(klon), stat=ierr)
    192           IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 10',1)       
    193        END IF
    194     END IF
    195 
    196 ! 4) Read parmeter for calculation of emission compatible
     120    ! Read parmeter for calculation compatible emission
    197121    IF (.NOT. carbon_cycle_tr) THEN
    198122       carbon_cycle_emis_comp=.FALSE.
    199123       CALL getin('carbon_cycle_emis_comp',carbon_cycle_emis_comp)
    200124       WRITE(lunout,*) 'carbon_cycle_emis_comp = ',carbon_cycle_emis_comp
    201     END IF
     125       IF (carbon_cycle_emis_comp) THEN
     126          CALL abort_gcm('carbon_cycle_init', 'carbon_cycle_emis_comp option not yet implemented!!',1)
     127       END IF
     128    END IF
     129
     130    ! Read parameter for interactive calculation of the CO2 value for the radiation scheme
     131    RCO2_inter=.FALSE.
     132    CALL getin('RCO2_inter',RCO2_inter)
     133    WRITE(lunout,*) 'RCO2_inter = ', RCO2_inter
     134    IF (RCO2_inter) THEN
     135       WRITE(lunout,*) 'RCO2 will be recalculated once a day'
     136       WRITE(lunout,*) 'RCO2 initial = ', RCO2
     137    END IF
     138
     139
     140! 2) Search for carbon tracers and set default values
     141! ---------------------------------------------------
     142    itc=0
     143    DO it=1,nbtr
     144       iiq=niadv(it+2)
     145       
     146       SELECT CASE(tname(iiq))
     147       CASE("fCO2_ocn")
     148          itc = itc + 1
     149          co2trac(itc)%name='fCO2_ocn'
     150          co2trac(itc)%id=it
     151          co2trac(itc)%file='fl_co2_ocean.nc'
     152          IF (carbon_cycle_cpl .AND. type_ocean=='couple') THEN
     153             co2trac(itc)%cpl=.TRUE.
     154             co2trac(itc)%updatefreq = 86400 ! Once a day as the coupling with OASIS/PISCES
     155          ELSE
     156             co2trac(itc)%cpl=.FALSE.
     157             co2trac(itc)%updatefreq = 86400*mth_len ! Once a month
     158          END IF
     159       CASE("fCO2_land")
     160          itc = itc + 1
     161          co2trac(itc)%name='fCO2_land'
     162          co2trac(itc)%id=it
     163          co2trac(itc)%file='fl_co2_land.nc'
     164          IF (carbon_cycle_cpl .AND. ok_veget) THEN
     165             co2trac(itc)%cpl=.TRUE.
     166             co2trac(itc)%updatefreq = INT(pdtphys) ! Each timestep as the coupling with ORCHIDEE
     167          ELSE
     168             co2trac(itc)%cpl=.FALSE.
     169!             co2trac(itc)%updatefreq = 10800   ! 10800sec = 3H
     170             co2trac(itc)%updatefreq = 86400*mth_len ! Once a month
     171          END IF
     172       CASE("fCO2_land_use")
     173          itc = itc + 1
     174          co2trac(itc)%name='fCO2_land_use'
     175          co2trac(itc)%id=it
     176          co2trac(itc)%file='fl_co2_land_use.nc'
     177          IF (carbon_cycle_cpl .AND. ok_veget) THEN
     178             co2trac(it)%cpl=.TRUE.
     179             co2trac(itc)%updatefreq = INT(pdtphys) ! Each timestep as the coupling with ORCHIDEE
     180          ELSE
     181             co2trac(itc)%cpl=.FALSE.
     182             co2trac(itc)%updatefreq = 10800   ! 10800sec = 3H
     183          END IF
     184       CASE("fCO2_fos_fuel")
     185          itc = itc + 1
     186          co2trac(itc)%name='fCO2_fos_fuel'
     187          co2trac(itc)%id=it
     188          co2trac(itc)%file='fossil_fuel.nc'
     189          co2trac(itc)%cpl=.FALSE.       ! This tracer always read from file
     190!         co2trac(itc)%updatefreq = 86400  ! 86400sec = 24H Cadule case
     191          co2trac(itc)%updatefreq = 86400*mth_len ! Once a month
     192       CASE("fCO2_bbg")
     193          itc = itc + 1
     194          co2trac(itc)%name='fCO2_bbg'
     195          co2trac(itc)%id=it
     196          co2trac(itc)%file='fl_co2_bbg.nc'
     197          co2trac(itc)%cpl=.FALSE.       ! This tracer always read from file
     198          co2trac(itc)%updatefreq = 86400*mth_len ! Once a month
     199       CASE("fCO2")
     200          ! fCO2 : One tracer transporting the total CO2 flux
     201          itc = itc + 1
     202          co2trac(itc)%name='fCO2'
     203          co2trac(itc)%id=it
     204          co2trac(itc)%file='fl_co2.nc'
     205          IF (carbon_cycle_cpl) THEN
     206             co2trac(itc)%cpl=.TRUE.
     207          ELSE
     208             co2trac(itc)%cpl=.FALSE.
     209          END IF
     210          co2trac(itc)%updatefreq = 86400
     211          ! DOES THIS WORK ???? Problematic due to implementation of the coupled fluxes...
     212          CALL abort_gcm('carbon_cycle_init','transport of total CO2 has to be implemented and tested',1)
     213       END SELECT
     214    END DO
     215
     216    ! Total number of carbon CO2 tracers
     217    ntr_co2 = itc
     218   
     219    ! Definition of control varaiables for the tracers
     220    DO it=1,ntr_co2
     221       aerosol(co2trac(it)%id) = .FALSE.
     222       radio(co2trac(it)%id)   = .FALSE.
     223    END DO
     224   
     225    ! Vector indicating which timestep to read for each tracer
     226    ! Always start read in the beginning of the file
     227    co2trac(:)%readstep = 0
     228   
     229
     230! 3) Allocate variables
     231! ---------------------
     232    ! Allocate vector for storing fluxes to inject
     233    ALLOCATE(dtr_add(klon,maxco2trac), stat=ierr)
     234    IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 11',1)       
     235   
     236    ! Allocate variables for cumulating fluxes from ORCHIDEE
     237    IF (RCO2_inter) THEN
     238       IF (.NOT. carbon_cycle_tr .AND. carbon_cycle_cpl) THEN
     239          ALLOCATE(fco2_land_day(klon), stat=ierr)
     240          IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 2',1)
     241          fco2_land_day(1:klon) = 0.
     242         
     243          ALLOCATE(fco2_lu_day(klon), stat=ierr)
     244          IF (ierr /= 0) CALL abort_gcm('carbon_cycle_init', 'pb in allocation 3',1)
     245          fco2_lu_day(1:klon)   = 0.
     246       END IF
     247    END IF
     248
     249
     250! 4) Test for compatibility
     251! -------------------------
     252!    IF (carbon_cycle_cpl .AND. type_ocean/='couple') THEN
     253!       WRITE(lunout,*) 'Coupling with ocean model is needed for carbon_cycle_cpl'
     254!       CALL abort_gcm('carbon_cycle_init', 'coupled ocean is needed for carbon_cycle_cpl',1)
     255!    END IF
     256!
     257!    IF (carbon_cycle_cpl .AND..NOT. ok_veget) THEN
     258!       WRITE(lunout,*) 'Coupling with surface land model ORCHDIEE is needed for carbon_cycle_cpl'
     259!       CALL abort_gcm('carbon_cycle_init', 'ok_veget is needed for carbon_cycle_cpl',1)
     260!    END IF
     261
     262    ! Compiler test : following should never happen
     263    teststop=0
     264    DO it=1,teststop
     265       CALL abort_gcm('carbon_cycle_init', 'Entering loop from 1 to 0',1)
     266    END DO
     267
     268    IF (ntr_co2==0) THEN
     269       ! No carbon tracers found in tracer.def. It is not possible to do carbon cycle
     270       WRITE(lunout,*) 'No carbon tracers found in tracer.def. Not ok with carbon_cycle_tr and/or carbon_cycle_cp'
     271       CALL abort_gcm('carbon_cycle_init', 'No carbon tracers found in tracer.def',1)
     272    END IF
     273   
     274! 5) Calculate total area of the earth surface
     275! --------------------------------------------
     276    CALL reduce_sum(SUM(airephy),airetot)
     277    CALL bcast(airetot)
    202278
    203279  END SUBROUTINE carbon_cycle_init
    204280
     281
     282  SUBROUTINE carbon_cycle(nstep, pdtphys, pctsrf, tr_seri, source)
     283! Subroutine for injection of co2 in the tracers
    205284!
    206 !
    207 !
    208 
    209   SUBROUTINE carbon_cycle(nstep, pdtphys, pctsrf, tr_seri)
    210    
     285! - Find out if it is time to update
     286! - Get tracer from coupled model or from file
     287! - Calculate new RCO2 value for the radiation scheme
     288! - Calculate CO2 flux to send to ocean and land models (PISCES and ORCHIDEE)
     289
    211290    USE infotrac
    212291    USE dimphy
    213     USE mod_phys_lmdz_transfert_para, ONLY : reduce_sum
     292    USE mod_phys_lmdz_transfert_para
    214293    USE phys_cal_mod, ONLY : mth_cur, mth_len
    215294    USE phys_cal_mod, ONLY : day_cur
     
    220299    INCLUDE "clesphys.h"
    221300    INCLUDE "indicesol.h"
     301    INCLUDE "iniprint.h"
     302    INCLUDE "YOMCST.h"
    222303
    223304! In/Output arguments
    224305    INTEGER,INTENT(IN) :: nstep      ! time step in physiq
    225306    REAL,INTENT(IN)    :: pdtphys    ! length of time step in physiq (sec)
    226     REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol f(nature du sol)
    227     REAL, DIMENSION(klon,klev,nbtr), INTENT(INOUT)  :: tr_seri
     307    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf            ! Surface fraction
     308    REAL, DIMENSION(klon,klev,nbtr), INTENT(INOUT)  :: tr_seri ! All tracers
     309    REAL, DIMENSION(klon,nbtr), INTENT(INOUT)       :: source  ! Source for all tracers
    228310
    229311! Local variables
     312    INTEGER :: it
    230313    LOGICAL :: newmonth ! indicates if a new month just started
    231314    LOGICAL :: newday   ! indicates if a new day just started
     
    233316
    234317    REAL, PARAMETER :: fact=1.E-15/2.12  ! transformation factor from gC/m2/day => ppm/m2/day
    235     REAL, DIMENSION(klon) :: fco2_tmp, tr_seri_sum
     318    REAL, DIMENSION(klon) :: fco2_tmp
    236319    REAL :: sumtmp
    237     REAL :: airetot     ! Total area the earth
    238320    REAL :: delta_co2_ppm
    239321   
    240 ! -) Calculate logicals indicating if it is a new month, new day or the last time step in a day (end day)
     322
     323! 1) Calculate logicals indicating if it is a new month, new day or the last time step in a day (end day)
     324! -------------------------------------------------------------------------------------------------------
    241325
    242326    newday = .FALSE.; endday = .FALSE.; newmonth = .FALSE.
     
    245329    IF (MOD(nstep,INT(86400./pdtphys))==0) endday=.TRUE.
    246330    IF (newday .AND. day_cur==1) newmonth=.TRUE.
    247    
    248 ! -) Read new maps if new month started
    249     IF (newmonth .AND. carbon_cycle_tr) THEN
    250        CALL read_map2D('fossil_fuel.nc','fos_fuel', mth_cur, .FALSE., fos_fuel)
    251        
    252        ! division by month lenght to get dayly value
    253        fos_fuel(:) = fos_fuel(:)/mth_len
    254        
    255        IF (.NOT. carbon_cycle_cpl) THEN
    256           ! Get dayly values from monthly fluxes
    257           CALL read_map2D('fl_co2_ocean.nc','CO2_OCN',mth_cur,.FALSE.,fco2_ocn_day)
    258           CALL read_map2D('fl_co2_land.nc','CO2_LAND', mth_cur,.FALSE.,fco2_land_day)
    259           CALL read_map2D('fl_co2_land_use.nc','CO2_LAND_USE',mth_cur,.FALSE.,fco2_lu_day)
    260        END IF
    261     END IF
    262    
    263 
    264 
    265 ! -) Update tracers at beginning of a new day. Beginning of a new day correspond to a new coupling period in cpl_mod.
    266     IF (newday) THEN
     331
     332! 2)  For each carbon tracer find out if it is time to inject (update)
     333! --------------------------------------------------------------------
     334    DO it = 1, ntr_co2
     335       IF ( MOD(nstep,INT(co2trac(it)%updatefreq/pdtphys)) == 1 ) THEN
     336          co2trac(it)%updatenow = .TRUE.
     337       ELSE
     338          co2trac(it)%updatenow = .FALSE.
     339       END IF
     340    END DO
     341
     342! 3) Get tracer update
     343! --------------------------------------
     344    DO it = 1, ntr_co2
     345       IF ( co2trac(it)%updatenow ) THEN
     346          IF ( co2trac(it)%cpl ) THEN
     347             ! Get tracer from coupled model
     348             SELECT CASE(co2trac(it)%name)
     349             CASE('fCO2_land')     ! from ORCHIDEE
     350                dtr_add(:,it) = fco2_land_inst(:)*pctsrf(:,is_ter)*fact ! [ppm/m2/day]
     351             CASE('fCO2_land_use') ! from ORCHIDEE
     352                dtr_add(:,it) = fco2_lu_inst(:)  *pctsrf(:,is_ter)*fact ! [ppm/m2/day]
     353             CASE('fCO2_ocn')      ! from PISCES
     354                dtr_add(:,it) = fco2_ocn_day(:)  *pctsrf(:,is_oce)*fact ! [ppm/m2/day]
     355             CASE DEFAULT
     356                WRITE(lunout,*) 'Error with tracer ',co2trac(it)%name
     357                CALL abort_gcm('carbon_cycle', 'No coupling implemented for this tracer',1)
     358             END SELECT
     359          ELSE
     360             ! Read tracer from file
     361             co2trac(it)%readstep = co2trac(it)%readstep + 1 ! increment time step in file
     362! Patricia   CALL read_map2D(co2trac(it)%file,'fco2',co2trac(it)%readstep,.FALSE.,dtr_add(:,it))
     363             CALL read_map2D(co2trac(it)%file,'fco2',co2trac(it)%readstep,.TRUE.,dtr_add(:,it))
     364
     365             ! Converte from kgC/m2/h to kgC/m2/s
     366             dtr_add(:,it) = dtr_add(:,it)/3600
     367             ! Add individual treatment of values read from file
     368             SELECT CASE(co2trac(it)%name)
     369             CASE('fCO2_land')
     370                dtr_add(:,it) = dtr_add(:,it) *pctsrf(:,is_ter)
     371             CASE('fCO2_land_use')
     372                dtr_add(:,it) = dtr_add(:,it) *pctsrf(:,is_ter)
     373             CASE('fCO2_ocn')
     374                dtr_add(:,it) = dtr_add(:,it) *pctsrf(:,is_oce)
     375! Patricia :
     376!             CASE('fCO2_fos_fuel')
     377!                dtr_add(:,it) = dtr_add(:,it)/mth_len
     378!                co2trac(it)%readstep = 0 ! Always read same value for fossil fuel(Cadule case)
     379             END SELECT
     380          END IF
     381       END IF
     382    END DO
     383
     384! 4) Update co2 tracers :
     385!    Loop over all carbon tracers and add source
     386! ------------------------------------------------------------------
     387    IF (carbon_cycle_tr) THEN
     388       DO it = 1, ntr_co2
     389          IF (.FALSE.) THEN
     390             tr_seri(1:klon,1,co2trac(it)%id) = tr_seri(1:klon,1,co2trac(it)%id) + dtr_add(1:klon,it)
     391             source(1:klon,co2trac(it)%id) = 0.
     392          ELSE
     393             source(1:klon,co2trac(it)%id) = dtr_add(1:klon,it)
     394          END IF
     395       END DO
     396    END IF
     397
     398
     399! 5) Calculations for new CO2 value for the radiation scheme(instead of reading value from .def)
     400! ----------------------------------------------------------------------------------------------
     401    IF (RCO2_inter) THEN
     402       ! Cumulate fluxes from ORCHIDEE at each timestep
     403       IF (.NOT. carbon_cycle_tr .AND. carbon_cycle_cpl) THEN
     404          IF (newday) THEN ! Reset cumulative variables once a day
     405             fco2_land_day(1:klon) = 0.
     406             fco2_lu_day(1:klon)   = 0.
     407          END IF
     408          fco2_land_day(1:klon) = fco2_land_day(1:klon) + fco2_land_inst(1:klon) ![gC/m2/day]
     409          fco2_lu_day(1:klon)   = fco2_lu_day(1:klon)   + fco2_lu_inst(1:klon)   ![gC/m2/day]
     410       END IF
     411
     412       ! At the end of a new day, calculate a mean scalare value of CO2
     413       ! JG : Ici on utilise uniquement le traceur du premier couche du modele. Est-ce que c'est correcte ?
     414       IF (endday) THEN
     415
     416          IF (carbon_cycle_tr) THEN
     417             ! Sum all co2 tracers to get the total delta CO2 flux
     418             fco2_tmp(:) = 0.
     419             DO it = 1, ntr_co2
     420                fco2_tmp(1:klon) = fco2_tmp(1:klon) + tr_seri(1:klon,1,co2trac(it)%id)
     421             END DO
     422             
     423          ELSE IF (carbon_cycle_cpl) THEN ! no carbon_cycle_tr
     424             ! Sum co2 fluxes comming from coupled models and parameter for fossil fuel
     425             fco2_tmp(1:klon) = fos_fuel_s + ((fco2_lu_day(1:klon) + fco2_land_day(1:klon))*pctsrf(1:klon,is_ter) &
     426                  + fco2_ocn_day(:)*pctsrf(:,is_oce)) * fact
     427          END IF
     428
     429          ! Calculate a global mean value of delta CO2 flux
     430          fco2_tmp(1:klon) = fco2_tmp(1:klon) * airephy(1:klon)
     431          CALL reduce_sum(SUM(fco2_tmp),sumtmp)
     432          CALL bcast(sumtmp)
     433          delta_co2_ppm = sumtmp/airetot
     434         
     435          ! Add initial value for co2_ppm and delta value
     436          co2_ppm = co2_ppm0 + delta_co2_ppm
     437         
     438          ! Transformation of atmospheric CO2 concentration for the radiation code
     439          RCO2 = co2_ppm * 1.0e-06  * 44.011/28.97
     440         
     441          WRITE(lunout,*) 'RCO2 is now updated! RCO2 = ', RCO2
     442       END IF ! endday
     443
     444    END IF ! RCO2_inter
     445
     446
     447! 6) Calculate CO2 flux to send to ocean and land models : PISCES and ORCHIDEE         
     448! ----------------------------------------------------------------------------
     449    IF (carbon_cycle_cpl) THEN
    267450
    268451       IF (carbon_cycle_tr) THEN
    269 
    270           ! Update tracers
    271           IF (ntr_co2 == 1) THEN
    272              ! Calculate the new flux CO2
    273              tr_seri(:,1,id_fco2_tot) = tr_seri(:,1,id_fco2_tot) + &
    274                   (fos_fuel(:) + &
    275                   fco2_lu_day(:)  * pctsrf(:,is_ter) + &
    276                   fco2_land_day(:)* pctsrf(:,is_ter) + &
    277                   fco2_ocn_day(:) * pctsrf(:,is_oce)) * fact
    278 
    279           ELSE ! ntr_co2 == 4
    280              tr_seri(:,1,id_fco2_fos_fuel)  = tr_seri(:,1,id_fco2_fos_fuel) + fos_fuel(:) * fact ! [ppm/m2/day]
    281 
    282              tr_seri(:,1,id_fco2_land_use)  = tr_seri(:,1,id_fco2_land_use) + &
    283                   fco2_lu_day(:)  *pctsrf(:,is_ter)*fact ! [ppm/m2/day]
    284 
    285              tr_seri(:,1,id_fco2_land)      = tr_seri(:,1,id_fco2_land)     + &
    286                   fco2_land_day(:)*pctsrf(:,is_ter)*fact ! [ppm/m2/day]
    287 
    288              tr_seri(:,1,id_fco2_ocn)       = tr_seri(:,1,id_fco2_ocn)      + &
    289                   fco2_ocn_day(:) *pctsrf(:,is_oce)*fact ! [ppm/m2/day]
    290 
    291           END IF
    292 
    293        ELSE ! no transport
    294           IF (carbon_cycle_cpl) THEN
    295              IF (carbon_cycle_emis_comp) THEN
    296                 ! Calcul emission compatible a partir des champs 2D et co2_ppm
    297                 !!! TO DO!!
    298                 CALL abort_gcm('carbon_cycle', ' Option carbon_cycle_emis_comp not yet implemented',1)
    299              END IF
    300           END IF
    301 
    302        END IF ! carbon_cycle_tr
    303    
    304        ! Reset cumluative variables
    305        IF (carbon_cycle_cpl) THEN
    306           fco2_land_day(:) = 0.
    307           fco2_lu_day(:)   = 0.
    308        END IF
    309    
    310     END IF ! newday
    311        
    312 
    313 
    314 ! -) Cumulate fluxes from ORCHIDEE at each timestep
    315     IF (carbon_cycle_cpl) THEN
    316        fco2_land_day(:) = fco2_land_day(:) + fco2_land_inst(:)
    317        fco2_lu_day(:)   = fco2_lu_day(:)   + fco2_lu_inst(:)
    318     END IF
    319 
    320 
    321 
    322 ! -)  At the end of a new day, calculate a mean scalare value of CO2 to be used by
    323 !     the radiation scheme (instead of reading value from .def)
    324 
    325 ! JG : Ici on utilise uniquement le traceur du premier couche du modele. Est-ce que c'est correcte ?
    326     IF (endday) THEN
    327        ! Calculte total area of the earth surface
    328        CALL reduce_sum(SUM(airephy),airetot)
    329        
    330 
    331        IF (carbon_cycle_tr) THEN
    332           IF (ntr_co2 == 1) THEN
    333          
    334              ! Calculate mean value of tracer CO2 to get an scalare value to be used in the
    335              ! radiation scheme (instead of reading value from .def)
    336              ! Mean value weighted with the grid cell area
    337              
    338              ! Calculate mean value
    339              fco2_tmp(:) = tr_seri(:,1,id_fco2_tot) * airephy(:)
    340              CALL reduce_sum(SUM(fco2_tmp),sumtmp)
    341              co2_ppm = sumtmp/airetot + co2_ppm0
    342              
    343           ELSE ! ntr_co2 == 4
    344              
    345              ! Calculate the delta CO2 flux
    346              tr_seri_sum(:) = tr_seri(:,1,id_fco2_fos_fuel) + tr_seri(:,1,id_fco2_land_use) + &
    347                   tr_seri(:,1,id_fco2_land) + tr_seri(:,1,id_fco2_ocn)
    348              
    349              ! Calculate mean value of delta CO2 flux
    350              fco2_tmp(:) = tr_seri_sum(:) * airephy(:)
    351              CALL reduce_sum(SUM(fco2_tmp),sumtmp)
    352              delta_co2_ppm = sumtmp/airetot
    353              
    354              ! Add initial value for co2_ppm to delta value
    355              co2_ppm = delta_co2_ppm + co2_ppm0
    356           END IF
    357 
    358        ELSE IF (carbon_cycle_cpl) THEN ! no carbon_cycle_tr
    359 
    360           ! Calculate the total CO2 flux and integrate to get scalare value for the radiation scheme
    361           fco2_tmp(:) = (fos_fuel(:) + (fco2_lu_day(:) + fco2_land_day(:))*pctsrf(:,is_ter) &
    362                + fco2_ocn_day(:)*pctsrf(:,is_oce)) * fact
    363          
    364           ! Calculate mean value
    365           fco2_tmp(:) = fco2_tmp(:) * airephy(:)
    366           CALL reduce_sum(SUM(fco2_tmp),sumtmp)
    367           delta_co2_ppm = sumtmp/airetot
    368 
    369           ! Update current value of the atmospheric co2_ppm
    370           co2_ppm = co2_ppm + delta_co2_ppm
    371          
    372        END IF ! carbon_cycle_tr
    373 
    374        ! transformation of the atmospheric CO2 concentration for the radiation code
    375        RCO2 = co2_ppm * 1.0e-06  * 44.011/28.97
    376 
    377     END IF
    378 
    379     ! Calculate CO2 flux to send to ocean and land models : PISCES and ORCHIDEE         
    380     IF (endday .AND. carbon_cycle_cpl) THEN
    381        
    382        IF (carbon_cycle_tr) THEN
    383           IF (ntr_co2==1) THEN
    384 
    385              co2_send(:) = tr_seri(:,1,id_fco2_tot) + co2_ppm0
    386 
    387           ELSE ! ntr_co2 == 4
    388 
    389              co2_send(:) = tr_seri_sum(:) + co2_ppm0
    390 
    391           END IF
     452          ! Sum all co2 tracers to get the total delta CO2 flux at first model layer
     453          fco2_tmp(:) = 0.
     454          DO it = 1, ntr_co2
     455             fco2_tmp(1:klon) = fco2_tmp(1:klon) + tr_seri(1:klon,1,co2trac(it)%id)
     456          END DO
     457          co2_send(1:klon) = fco2_tmp(1:klon) + co2_ppm0
    392458       ELSE
    393459          ! Send a scalare value in 2D variable to ocean and land model (PISCES and ORCHIDEE)
    394           co2_send(:) = co2_ppm
     460          co2_send(1:klon) = co2_ppm
    395461       END IF
    396462
  • trunk/libf/phylmd/change_srf_frac_mod.F90

    r1 r66  
    99!
    1010! Change Surface Fractions
    11 !
     11! Author J Ghattas 2008
     12
    1213  SUBROUTINE change_srf_frac(itime, dtime, jour, &
    1314       pctsrf, alb1, alb2, tsurf, u10m, v10m, pbl_tke)
     
    7677    END SELECT
    7778
    78     IF (is_modified) THEN
     79
    7980!****************************************************************************************
    8081! 2)
     
    8485!
    8586!****************************************************************************************
     87    IF (is_modified) THEN
    8688 
    8789! Test and exit if a fraction is negative
     
    150152       CALL pbl_surface_newfrac(itime, pctsrf, pctsrf_old, tsurf, alb1, alb2, u10m, v10m, pbl_tke)
    151153
     154    ELSE
     155       ! No modifcation should be done
     156       pctsrf(:,:) = pctsrf_old(:,:)
     157
    152158    END IF ! is_modified
    153159
  • trunk/libf/phylmd/conf_phys.F90

    r1 r66  
    11
    22!
    3 ! $Id: conf_phys.F90 1423 2010-08-02 14:52:29Z jghattas $
     3! $Id: conf_phys.F90 1486 2011-02-11 12:07:39Z fairhead $
    44!
    55!
     
    1313  subroutine conf_phys(ok_journe, ok_mensuel, ok_instan, ok_hf, &
    1414                       ok_LES,&
     15                       callstats,&
    1516                       solarlong0,seuil_inversion, &
    1617                       fact_cldcon, facttemps,ok_newmicro,iflag_radia,&
     
    6667  logical              :: ok_journe, ok_mensuel, ok_instan, ok_hf
    6768  logical              :: ok_LES
     69  LOGICAL              :: callstats
    6870  LOGICAL              :: ok_ade, ok_aie, aerosol_couple
    6971  INTEGER              :: flag_aerosol
     
    7981  logical,SAVE        :: ok_journe_omp, ok_mensuel_omp, ok_instan_omp, ok_hf_omp       
    8082  logical,SAVE        :: ok_LES_omp   
     83  LOGICAL,SAVE        :: callstats_omp
    8184  LOGICAL,SAVE        :: ok_ade_omp, ok_aie_omp, aerosol_couple_omp
    8285  INTEGER, SAVE       :: flag_aerosol_omp
     
    14181421  ok_LES_omp = .false.                                             
    14191422  call getin('OK_LES', ok_LES_omp)                                 
     1423
     1424!Config Key  = callstats                                               
     1425!Config Desc = Pour des sorties callstats                                 
     1426!Config Def  = .false.                                             
     1427!Config Help = Pour creer le fichier stats contenant les sorties 
     1428!              stats                                                 
     1429!                                                                   
     1430  callstats_omp = .false.                                             
     1431  call getin('callstats', callstats_omp)                                 
    14201432!
    14211433!Config Key  = ecrit_LES
     
    15811593    ok_hines = ok_hines_omp
    15821594    ok_LES = ok_LES_omp
     1595    callstats = callstats_omp
    15831596    ecrit_LES = ecrit_LES_omp
    15841597    carbon_cycle_tr = carbon_cycle_tr_omp
  • trunk/libf/phylmd/cpl_mod.F90

    r1 r66  
    100100  SUBROUTINE cpl_init(dtime, rlon, rlat)
    101101    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, fco2_ocn_day
     102    USE surface_data
    102103
    103104    INCLUDE "dimensions.h"
     
    270271    ENDIF    ! is_sequential
    271272   
     273
     274!*************************************************************************************
     275! compatibility test
     276!
     277!*************************************************************************************
     278    IF (carbon_cycle_cpl .AND. version_ocean=='opa8') THEN
     279       abort_message='carbon_cycle_cpl does not work with opa8'
     280       CALL abort_gcm(modname,abort_message,1)
     281    END IF
     282
    272283  END SUBROUTINE cpl_init
    273284 
  • trunk/libf/phylmd/cv3_routines.F

    r1 r66  
    11!
    2 ! $Id: cv3_routines.F 1403 2010-07-01 09:02:53Z fairhead $
     2! $Id: cv3_routines.F 1467 2010-12-17 11:17:22Z idelkadi $
    33!
    44c
     
    8989
    9090      betad=10.0   ! original value (from convect 4.3)
     91
     92      OPEN(99,file='conv_param.data',status='old',
     93     $          form='formatted',err=9999)
     94      READ(99,*,end=9998) dpbase
     95      READ(99,*,end=9998) pbcrit
     96      READ(99,*,end=9998) ptcrit
     97      READ(99,*,end=9998) sigdz
     98      READ(99,*,end=9998) spfac
     999998  Continue
     100      CLOSE(99)
     1019999  Continue
     102      WRITE(*,*)'dpbase=',dpbase
     103      WRITE(*,*)'pbcrit=',pbcrit
     104      WRITE(*,*)'ptcrit=',ptcrit
     105      WRITE(*,*)'sigdz=',sigdz
     106      WRITE(*,*)'spfac=',spfac
    91107
    92108      return
  • trunk/libf/phylmd/phyetat0.F

    r1 r66  
    11!
    2 ! $Id: phyetat0.F 1403 2010-07-01 09:02:53Z fairhead $
     2! $Id: phyetat0.F 1457 2010-11-22 15:19:25Z musat $
    33!
    44c
     
    2121      USE infotrac
    2222      USE traclmdz_mod,    ONLY : traclmdz_from_restart
    23       USE carbon_cycle_mod,ONLY : carbon_cycle_tr, carbon_cycle_cpl
     23      USE carbon_cycle_mod,ONLY :
     24     &     carbon_cycle_tr, carbon_cycle_cpl, co2_send
    2425
    2526      IMPLICIT none
     
    133134
    134135       
    135 
    136          IF( clesphy0(1).NE.tab_cntrl( 5 ) )  THEN
    137              clesphy0(1)=tab_cntrl( 5 )
    138          ENDIF
    139 
    140          IF( clesphy0(2).NE.tab_cntrl( 6 ) )  THEN
    141              clesphy0(2)=tab_cntrl( 6 )
    142          ENDIF
    143 
    144          IF( clesphy0(3).NE.tab_cntrl( 7 ) )  THEN
    145              clesphy0(3)=tab_cntrl( 7 )
    146          ENDIF
    147 
    148          IF( clesphy0(4).NE.tab_cntrl( 8 ) )  THEN
    149              clesphy0(4)=tab_cntrl( 8 )
    150          ENDIF
    151 
    152          IF( clesphy0(5).NE.tab_cntrl( 9 ) )  THEN
    153              clesphy0(5)=tab_cntrl( 9 )
    154          ENDIF
    155 
    156          IF( clesphy0(6).NE.tab_cntrl( 10 ) )  THEN
    157              clesphy0(6)=tab_cntrl( 10 )
    158          ENDIF
    159 
    160          IF( clesphy0(7).NE.tab_cntrl( 11 ) )  THEN
    161              clesphy0(7)=tab_cntrl( 11 )
    162          ENDIF
    163 
    164          IF( clesphy0(8).NE.tab_cntrl( 12 ) )  THEN
    165              clesphy0(8)=tab_cntrl( 12 )
    166          ENDIF
    167 
     136      clesphy0(1)=tab_cntrl( 5 )
     137      clesphy0(2)=tab_cntrl( 6 )
     138      clesphy0(3)=tab_cntrl( 7 )
     139      clesphy0(4)=tab_cntrl( 8 )
     140      clesphy0(5)=tab_cntrl( 9 )
     141      clesphy0(6)=tab_cntrl( 10 )
     142      clesphy0(7)=tab_cntrl( 11 )
     143      clesphy0(8)=tab_cntrl( 12 )
    168144
    169145c
     
    841817          ENDIF
    842818          WRITE(str2,'(i2.2)') nsrf
    843           CALL get_field("TKE"//str2,pbl_tke(:,1:klev,nsrf),found)
     819          CALL get_field("TKE"//str2,pbl_tke(:,1:klev+1,nsrf),found)
    844820          IF (.NOT. found) THEN
    845821            PRINT*, "phyetat0: <TKE"//str2//"> est absent"
     
    848824          xmin = 1.0E+20
    849825          xmax = -1.0E+20
    850           DO k = 1, klev
     826          DO k = 1, klev+1
    851827            DO i = 1, klon
    852828              xmin = MIN(pbl_tke(i,k,nsrf),xmin)
     
    10781054
    10791055         END DO
    1080          
    10811056         CALL traclmdz_from_restart(trs)
     1057
     1058         IF (carbon_cycle_cpl) THEN
     1059            ALLOCATE(co2_send(klon), stat=ierr)
     1060            IF (ierr /= 0) CALL abort_gcm
     1061     &           ('phyetat0','pb allocation co2_send',1)
     1062            CALL get_field("co2_send",co2_send,found)
     1063            IF (.NOT. found) THEN
     1064               PRINT*,"phyetat0: Le champ <co2_send> est absent"
     1065               PRINT*,"Initialisation uniforme a co2_ppm=",co2_ppm
     1066               co2_send(:) = co2_ppm
     1067            END IF
     1068         END IF
    10821069      END IF
    10831070
  • trunk/libf/phylmd/phyredem.F

    r1 r66  
    11!
    2 ! $Id: phyredem.F 1403 2010-07-01 09:02:53Z fairhead $
     2! $Id: phyredem.F 1457 2010-11-22 15:19:25Z musat $
    33!
    44c
     
    1515      USE infotrac
    1616      USE control_mod
    17 
     17      USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, co2_send
    1818
    1919      IMPLICIT none
     
    289289            WRITE(str2,'(i2.2)') nsrf
    290290            CALL put_field("TKE"//str2,"Energ. Cineti. Turb."//str2,
    291      .                     pbl_tke(:,1:klev,nsrf))
     291     .                     pbl_tke(:,1:klev+1,nsrf))
    292292          ELSE
    293293            PRINT*, "Trop de sous-mailles"
     
    337337            CALL put_field("trs_"//tname(iiq),"",trs(:,it))
    338338         END DO
     339         IF (carbon_cycle_cpl) THEN
     340            IF (.NOT. ALLOCATED(co2_send)) THEN
     341               ! This is the case of create_etat0_limit, ce0l
     342               ALLOCATE(co2_send(klon))
     343               co2_send(:) = co2_ppm0
     344            END IF
     345            CALL put_field("co2_send","co2_ppm for coupling",co2_send)
     346         END IF
    339347      END IF
    340348
  • trunk/libf/phylmd/phys_output_mod.F90

    r1 r66  
    1 ! $Id: phys_output_mod.F90 1424 2010-09-01 09:20:28Z jghattas $
     1! $Id: phys_output_mod.F90 1473 2011-01-12 15:07:43Z fairhead $
    22!
    33! Abderrahmane 12 2007
     
    427427  type(ctrl_out),save :: o_pres         = ctrl_out((/ 2, 3, 10, 10, 1 /),'pres')
    428428  type(ctrl_out),save :: o_paprs        = ctrl_out((/ 2, 3, 10, 10, 1 /),'paprs')
     429  type(ctrl_out),save :: o_mass        = ctrl_out((/ 2, 3, 10, 10, 1 /),'mass')
     430
    429431  type(ctrl_out),save :: o_rneb         = ctrl_out((/ 2, 5, 10, 10, 1 /),'rneb')
    430432  type(ctrl_out),save :: o_rnebcon      = ctrl_out((/ 2, 5, 10, 10, 1 /),'rnebcon')
     
    11081110 CALL histdef3d(iff,o_pres%flag,o_pres%name, "Air pressure", "Pa" )
    11091111 CALL histdef3d(iff,o_paprs%flag,o_paprs%name, "Air pressure Inter-Couches", "Pa" )
     1112 CALL histdef3d(iff,o_mass%flag,o_mass%name, "Masse Couches", "kg/m2" )
    11101113 CALL histdef3d(iff,o_rneb%flag,o_rneb%name, "Cloud fraction", "-")
    11111114 CALL histdef3d(iff,o_rnebcon%flag,o_rnebcon%name, "Convective Cloud Fraction", "-")
  • trunk/libf/phylmd/phys_output_write.h

    r1 r66  
    104104     s                   o_psol%name,itau_w,zx_tmp_fi2d)
    105105       ENDIF
     106
     107       IF (o_mass%flag(iff)<=lev_files(iff)) THEN
     108      CALL histwrite_phy(nid_files(iff),o_mass%name,itau_w,zmasse)
     109        ENDIF
     110
    106111
    107112       IF (o_qsurf%flag(iff)<=lev_files(iff)) THEN
  • trunk/libf/phylmd/physiq.F

    r1 r66  
    1 ! $Id: physiq.F 1428 2010-09-13 08:43:37Z fairhead $
     1! $Id: physiq.F 1486 2011-02-11 12:07:39Z fairhead $
    22c#define IO_DEBUG
    33
     
    158158      save ok_LES                           
    159159c$OMP THREADPRIVATE(ok_LES)                 
     160c
     161      LOGICAL callstats ! sortir le fichier stats
     162      save callstats                           
     163c$OMP THREADPRIVATE(callstats)                 
    160164c
    161165      LOGICAL ok_region ! sortir le fichier regional
     
    606610      real, save :: ale_bl_prescr=0.
    607611
    608       real, save :: ale_max=100.
     612      real, save :: ale_max=1000.
    609613      real, save :: alp_max=2.
    610614
     
    11501154!     and 360
    11511155
     1156      INTEGER ierr
    11521157#include "YOMCST.h"
    11531158#include "YOETHF.h"
     
    12221227     .     ok_instan, ok_hf,
    12231228     .     ok_LES,
     1229     .     callstats,
    12241230     .     solarlong0,seuil_inversion,
    12251231     .     fact_cldcon, facttemps,ok_newmicro,iflag_radia,
     
    12501256cym Attention pbase pas initialise dans concvl !!!!
    12511257          pbase=0
    1252           paire_ter(:)=0.   
    12531258cIM 180608
    12541259c         pmflxr=0.
     
    18471852! doit donc etre placé avant radlwsw et pbl_surface
    18481853
     1854!!!   jyg 17 Sep 2010 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     1855      call ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq)
     1856      day_since_equinox = (jD_cur + jH_cur) - jD_eq
     1857!
     1858!   choix entre calcul de la longitude solaire vraie ou valeur fixee a
     1859!   solarlong0
     1860      if (solarlong0<-999.) then
     1861       if (new_orbit) then
    18491862! calcul selon la routine utilisee pour les planetes
    1850       if (new_orbit) then
    1851         call ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq)
    1852         day_since_equinox = (jD_cur + jH_cur) - jD_eq
    1853 !        day_since_equinox = (jD_cur) - jD_eq
    18541863        call solarlong(day_since_equinox, zlongi, dist)
    1855       else     
     1864       else   
    18561865! calcul selon la routine utilisee pour l'AR4
    1857 !   choix entre calcul de la longitude solaire vraie ou valeur fixee a
    1858 !   solarlong0
    1859         if (solarlong0<-999.) then
    1860            CALL orbite(REAL(days_elapsed+1),zlongi,dist)
    1861         else
     1866        CALL orbite(REAL(days_elapsed+1),zlongi,dist)
     1867       endif   
     1868      else   
    18621869           zlongi=solarlong0  ! longitude solaire vraie
    1863            dist=1.            ! distance au soleil / moyenne
    1864         endif
    1865       endif
     1870           dist=1.            ! distance au soleil / moyenne
     1871      endif   
    18661872      if(prt_level.ge.1)                                                &
    18671873     &    write(lunout,*)'Longitude solaire ',zlongi,solarlong0,dist
     
    33763382     I                   cdragh,coefh,u1,v1,ftsol,pctsrf,
    33773383     I                   frac_impa, frac_nucl,
    3378      I                   pphis,airephy,dtime,itap)
     3384     I                   pphis,airephy,dtime,itap,
     3385     I                   rlon,rlat,qx(:,:,ivap),da,phi,mp,upwd,dnwd)
    33793386
    33803387
     
    36943701c====================================================================
    36953702c
    3696      
     3703
     3704c        -----------------------------------------------------------------
     3705c        WSTATS: Saving statistics
     3706c        -----------------------------------------------------------------
     3707c        ("stats" stores and accumulates 8 key variables in file "stats.nc"
     3708c        which can later be used to make the statistic files of the run:
     3709c        "stats")          only possible in 3D runs !
     3710
     3711         
     3712         IF (callstats) THEN
     3713
     3714           call wstats(klon,o_psol%name,"Surface pressure","Pa"
     3715     &                 ,2,paprs(:,1))
     3716           call wstats(klon,o_tsol%name,"Surface temperature","K",
     3717     &                 2,zxtsol)
     3718           zx_tmp_fi2d(:) = rain_fall(:) + snow_fall(:)
     3719           call wstats(klon,o_precip%name,"Precip Totale liq+sol",
     3720     &                 "kg/(s*m2)",2,zx_tmp_fi2d)
     3721           zx_tmp_fi2d(:) = rain_lsc(:) + snow_lsc(:)
     3722           call wstats(klon,o_plul%name,"Large-scale Precip",
     3723     &                 "kg/(s*m2)",2,zx_tmp_fi2d)
     3724           zx_tmp_fi2d(:) = rain_con(:) + snow_con(:)
     3725           call wstats(klon,o_pluc%name,"Convective Precip",
     3726     &                 "kg/(s*m2)",2,zx_tmp_fi2d)
     3727           call wstats(klon,o_sols%name,"Solar rad. at surf.",
     3728     &                 "W/m2",2,solsw)
     3729           call wstats(klon,o_soll%name,"IR rad. at surf.",
     3730     &                 "W/m2",2,sollw)
     3731          zx_tmp_fi2d(:) = topsw(:)-toplw(:)
     3732          call wstats(klon,o_nettop%name,"Net dn radiatif flux at TOA",
     3733     &                 "W/m2",2,zx_tmp_fi2d)
     3734
     3735
     3736
     3737           call wstats(klon,o_temp%name,"Air temperature","K",
     3738     &                 3,t_seri)
     3739           call wstats(klon,o_vitu%name,"Zonal wind","m.s-1",
     3740     &                 3,u_seri)
     3741           call wstats(klon,o_vitv%name,"Meridional wind",
     3742     &                "m.s-1",3,v_seri)
     3743           call wstats(klon,o_vitw%name,"Vertical wind",
     3744     &                "m.s-1",3,omega)
     3745           call wstats(klon,o_ovap%name,"Specific humidity", "kg/kg",
     3746     &                 3,q_seri)
     3747 
     3748
     3749
     3750           IF(lafin) THEN
     3751             write (*,*) "Writing stats..."
     3752             call mkstats(ierr)
     3753           ENDIF
     3754
     3755         ENDIF !if callstats
     3756     
    36973757
    36983758      IF (lafin) THEN
  • trunk/libf/phylmd/phytrac.F90

    r1 r66  
    6666!--------
    6767  REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
    68   REAL,DIMENSION(klon,klev),INTENT(IN)   :: u       !
    69   REAL,DIMENSION(klon,klev),INTENT(IN)   :: v       !
     68  REAL,DIMENSION(klon,klev),INTENT(IN)   :: u       ! variable not used
     69  REAL,DIMENSION(klon,klev),INTENT(IN)   :: v       ! variable not used
    7070  REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
    7171  REAL,DIMENSION(klon,klev),INTENT(IN)   :: rh      ! humidite relative
     
    118118!--------------
    119119!
    120   REAL,DIMENSION(klon,klev),INTENT(IN) :: cdragh ! coeff drag pour T et Q
     120  REAL,DIMENSION(klon),INTENT(IN)      :: cdragh ! coeff drag pour T et Q
    121121  REAL,DIMENSION(klon,klev),INTENT(IN) :: coefh  ! coeff melange CL (m**2/s)
    122122  REAL,DIMENSION(klon),INTENT(IN)      :: yu1    ! vents au premier niveau
     
    213213     SELECT CASE(type_trac)
    214214     CASE('lmdz')
    215 !IM ajout t_seri, pplay, sh    CALL traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)
    216         CALL traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
     215        CALL traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, pdtphys, aerosol, lessivage)
    217216     CASE('inca')
    218217        source(:,:)=0.
  • trunk/libf/phylmd/read_map2D.F90

    r1 r66  
    1111
    1212! Input arguments
    13   CHARACTER(len=20), INTENT(IN) :: filename     ! name of file to read
    14   CHARACTER(len=20), INTENT(IN) :: varname      ! name of variable in file
     13  CHARACTER(len=*), INTENT(IN) :: filename     ! name of file to read
     14  CHARACTER(len=*), INTENT(IN) :: varname      ! name of variable in file
    1515  INTEGER, INTENT(IN)           :: timestep     ! actual timestep
    1616  LOGICAL, INTENT(IN)           :: inverse      ! TRUE if latitude needs to be inversed
     
    2727  REAL, DIMENSION(nbp_lon,nbp_lat) :: var_glo2D_tmp ! 2D global
    2828  REAL, DIMENSION(klon_glo)        :: var_glo1D     ! 1D global
    29 
     29  INCLUDE "iniprint.h"
    3030
    3131! Read variable from file. Done by master process MPI and master thread OpenMP
    3232  IF (is_mpi_root .AND. is_omp_root) THEN
    33      ierr = NF90_OPEN (filename, NF90_NOWRITE, nid)
    34      IF (ierr /= NF90_NOERR) CALL abort_gcm(modname,'Problem in opening file '//filename,1)
     33     ierr = NF90_OPEN(trim(filename), NF90_NOWRITE, nid)
     34     IF (ierr /= NF90_NOERR) CALL write_err_mess('Problem in opening file')
    3535
    36      ierr = NF90_INQ_VARID(nid, varname, nvarid)
    37      IF (ierr /= NF90_NOERR) CALL abort_gcm(modname, 'The variable '//varname//' is absent in file',1)
     36     ierr = NF90_INQ_VARID(nid, trim(varname), nvarid)
     37     IF (ierr /= NF90_NOERR) CALL write_err_mess('The variable is absent in file')
    3838     
    3939     start=(/1,1,timestep/)
    4040     count=(/nbp_lon,nbp_lat,1/)
    4141     ierr = NF90_GET_VAR(nid, nvarid, var_glo2D,start,count)
    42      IF (ierr /= NF90_NOERR) CALL abort_gcm(modname, 'Problem in reading varaiable '//varname,1)
     42     IF (ierr /= NF90_NOERR) CALL write_err_mess('Problem in reading varaiable')
     43
     44     ierr = NF90_CLOSE(nid)
     45     IF (ierr /= NF90_NOERR) CALL write_err_mess('Problem in closing file')
    4346
    4447     ! Inverse latitude order
     
    5356     CALL grid2Dto1D_glo(var_glo2D,var_glo1D)
    5457
     58     WRITE(lunout,*) 'in read_map2D, filename = ', trim(filename)
     59     WRITE(lunout,*) 'in read_map2D, varname  = ', trim(varname)
     60     WRITE(lunout,*) 'in read_map2D, timestep = ', timestep
    5561  ENDIF
    5662
     
    5864  CALL scatter(var_glo1D, varout)
    5965
     66  CONTAINS
     67    SUBROUTINE write_err_mess(err_mess)
     68
     69      CHARACTER(len=*), INTENT(IN) :: err_mess
     70      INCLUDE "iniprint.h"
     71     
     72      WRITE(lunout,*) 'Error in read_map2D, filename = ', trim(filename)
     73      WRITE(lunout,*) 'Error in read_map2D, varname  = ', trim(varname)
     74      WRITE(lunout,*) 'Error in read_map2D, timestep = ', timestep
     75
     76      CALL abort_gcm(modname, err_mess, 1)
     77
     78    END SUBROUTINE write_err_mess
     79
    6080END SUBROUTINE read_map2D
  • trunk/libf/phylmd/readaerosol.F90

    r1 r66  
    1 ! $Id: readaerosol.F90 1403 2010-07-01 09:02:53Z fairhead $
     1! $Id: readaerosol.F90 1484 2011-02-09 15:44:57Z jghattas $
    22!
    33MODULE readaerosol_mod
     
    77CONTAINS
    88
    9 SUBROUTINE readaerosol(name_aero, type, iyr_in, klev_src, pt_ap, pt_b, pt_out, psurf, load)
     9SUBROUTINE readaerosol(name_aero, type, filename, iyr_in, klev_src, pt_ap, pt_b, pt_out, psurf, load)
    1010
    1111!****************************************************************************************
     
    2727  ! Input arguments
    2828  CHARACTER(len=7), INTENT(IN) :: name_aero
    29   CHARACTER(len=*), INTENT(IN) :: type  ! correspond to aer_type in clesphys.h
     29  CHARACTER(len=*), INTENT(IN) :: type  ! actuel, annuel, scenario or preind
     30  CHARACTER(len=8), INTENT(IN) :: filename
    3031  INTEGER, INTENT(IN)          :: iyr_in
    3132
     
    5859     ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
    5960     ! pt_out has dimensions (klon, klev_src, 12)
    60      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     61     CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    6162     
    6263
     
    6768     ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
    6869     ! pt_out has dimensions (klon, klev_src, 12)
    69      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     70     CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    7071     
    7172  ELSE IF (type == 'annuel') THEN
     
    7677     ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    7778     ! pt_out has dimensions (klon, klev_src, 12)
    78      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     79     CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    7980     
    8081  ELSE IF (type == 'scenario') THEN
     
    8687        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
    8788        ! pt_out has dimensions (klon, klev_src, 12)
    88         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     89        CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    8990       
    9091     ELSE IF (iyr_in .GE. 2100) THEN
     
    9394        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
    9495        ! pt_out has dimensions (klon, klev_src, 12)
    95         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     96        CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    9697       
    9798     ELSE
     
    113114        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
    114115        ! pt_out has dimensions (klon, klev_src, 12)
    115         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
     116        CALL get_aero_fromfile(name_aero, cyear, filename, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    116117       
    117118        ! If to read two decades:
     
    125126           ! get_aero_fromfile returns pt_2 allocated and initialized with data for 12 month
    126127           ! pt_2 has dimensions (klon, klev_src, 12)
    127            CALL get_aero_fromfile(name_aero, cyear, klev_src2, pt_ap, pt_b, p0, pt_2, psurf2, load2)
     128           CALL get_aero_fromfile(name_aero, cyear, filename, klev_src2, pt_ap, pt_b, p0, pt_2, psurf2, load2)
    128129           ! Test for same number of vertical levels
    129130           IF (klev_src /= klev_src2) THEN
     
    160161
    161162  ELSE
    162      WRITE(lunout,*)'This option is not implemented : aer_type = ', type
     163     WRITE(lunout,*)'This option is not implemented : aer_type = ', type,' name_aero=',name_aero
    163164     CALL abort_gcm('readaerosol','Error : aer_type parameter not accepted',1)
    164165  END IF ! type
     
    168169
    169170
    170   SUBROUTINE get_aero_fromfile(varname, cyr, klev_src, pt_ap, pt_b, p0, pt_year, psurf_out, load_out)
     171  SUBROUTINE get_aero_fromfile(varname, cyr, filename, klev_src, pt_ap, pt_b, p0, pt_year, psurf_out, load_out)
    171172!****************************************************************************************
    172173! Read 12 month aerosol from file and distribute to local process on physical grid.
     
    200201    CHARACTER(len=7), INTENT(IN)          :: varname
    201202    CHARACTER(len=4), INTENT(IN)          :: cyr
     203    CHARACTER(len=8), INTENT(IN)          :: filename
    202204
    203205! Output arguments
     
    213215! Local variables
    214216    CHARACTER(len=30)     :: fname
    215     CHARACTER(len=8)      :: filename='aerosols'
    216217    CHARACTER(len=30)     :: cvar
    217218    INTEGER               :: ncid, dimid, varid
     
    242243! 1) Open file
    243244!****************************************************************************************
    244        fname = filename//cyr//'.nc'
     245! Add suffix to filename
     246       fname = trim(filename)//cyr//'.nc'
    245247 
    246        WRITE(lunout,*) 'reading ', TRIM(fname)
     248       WRITE(lunout,*) 'reading variable ',TRIM(varname),' in file ', TRIM(fname)
    247249       CALL check_err( nf90_open(TRIM(fname), NF90_NOWRITE, ncid) )
    248250
     
    283285          CALL abort_gcm('get_aero_fromfile', 'latitudes do not correspond between file and model',1)
    284286       END IF
    285 
    286 ! 1.5) Check number of month in file opened
    287 !
    288 !**************************************************************************************************
    289        ierr = nf90_inq_dimid(ncid, 'TIME',dimid)
    290        CALL check_err( nf90_inquire_dimension(ncid, dimid, len = nbr_tsteps) )
    291 !       IF (nbr_tsteps /= 12 .AND. nbr_tsteps /= 14) THEN
    292        IF (nbr_tsteps /= 12 ) THEN
    293          CALL abort_gcm('get_aero_fromfile', 'not the right number of months in aerosol file read (should be 12 for the moment)',1)
    294        ENDIF
    295287
    296288
     
    335327
    336328       IF (new_file) THEN
     329! ++) Check number of month in file opened
     330!**************************************************************************************************
     331       ierr = nf90_inq_dimid(ncid, 'TIME',dimid)
     332       CALL check_err( nf90_inquire_dimension(ncid, dimid, len = nbr_tsteps) )
     333!       IF (nbr_tsteps /= 12 .AND. nbr_tsteps /= 14) THEN
     334       IF (nbr_tsteps /= 12 ) THEN
     335         CALL abort_gcm('get_aero_fromfile', 'not the right number of months in aerosol file read (should be 12 for the moment)',1)
     336       ENDIF
    337337
    338338! ++) Read the aerosol concentration month by month and concatenate to total variable varyear
  • trunk/libf/phylmd/readaerosol_interp.F90

    r1 r66  
    9292  LOGICAL,SAVE       :: debug=.FALSE.! Debugging in this subroutine
    9393!$OMP THREADPRIVATE(vert_interp, debug)
     94  CHARACTER(len=8)      :: type
     95  CHARACTER(len=8)      :: filename
    9496
    9597
     
    173175     ! Reading values corresponding to the closest year taking into count the choice of aer_type.
    174176     ! For aer_type=scenario interpolation between 2 data sets is done in readaerosol.
    175      CALL readaerosol(name_aero(id_aero), aer_type, iyr, klev_src, pt_ap, pt_b, pt_tmp, &
     177     ! If aer_type=mix1 or mix2, the run type and file name depends on the aerosol.
     178     IF (aer_type=='preind' .OR. aer_type=='actuel' .OR. aer_type=='annuel' .OR. aer_type=='scenario') THEN
     179        ! Standard case
     180        filename='aerosols'
     181        type=aer_type
     182     ELSE IF (aer_type == 'mix1') THEN
     183        ! Special case using a mix of decenal sulfate file and annual aerosols(all aerosols except sulfate)
     184        IF (name_aero(id_aero) == 'SO4') THEN
     185           filename='so4.run '
     186           type='scenario'
     187        ELSE
     188           filename='aerosols'
     189           type='annuel'
     190        END IF
     191     ELSE  IF (aer_type == 'mix2') THEN
     192        ! Special case using a mix of decenal sulfate file and natrual aerosols
     193        IF (name_aero(id_aero) == 'SO4') THEN
     194           filename='so4.run '
     195           type='scenario'
     196        ELSE
     197           filename='aerosols'
     198           type='preind'
     199        END IF
     200     ELSE
     201        CALL abort_gcm('readaerosol_interp', 'this aer_type not supported',1)
     202     END IF
     203
     204     CALL readaerosol(name_aero(id_aero), type, filename, iyr, klev_src, pt_ap, pt_b, pt_tmp, &
    176205          psurf_year(:,:,id_aero), load_year(:,:,id_aero))
    177206     IF (.NOT. ALLOCATED(var_year)) THEN
     
    182211
    183212     ! Reading values corresponding to the preindustrial concentrations.
    184      CALL readaerosol(name_aero(id_aero), 'preind', iyr, pi_klev_src, pt_ap, pt_b, pt_tmp, &
     213     type='preind'
     214     CALL readaerosol(name_aero(id_aero), type, filename, iyr, pi_klev_src, pt_ap, pt_b, pt_tmp, &
    185215          pi_psurf_year(:,:,id_aero), pi_load_year(:,:,id_aero))
    186216
  • trunk/libf/phylmd/surf_land_orchidee_mod.F90

    r1 r66  
    4343    USE mod_surf_para
    4444    USE mod_synchro_omp
    45    
    46 USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, fco2_land_inst, fco2_lu_inst
     45    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl
    4746
    4847!   
     
    138137    INTEGER                                   :: error
    139138    REAL, DIMENSION(klon)                     :: swdown_vrai
    140     REAL, DIMENSION(klon)                     :: fco2_land_comp  ! sur grille compresse
    141     REAL, DIMENSION(klon)                     :: fco2_lu_comp    ! sur grille compresse
    142139    CHARACTER (len = 20)                      :: modname = 'surf_land_orchidee'
    143140    CHARACTER (len = 80)                      :: abort_message
     
    348345       ENDIF
    349346!
    350 ! Allocate variables needed for carbon_cycle_mod
     347! carbon_cycle_cpl not possible with this interface and version of ORHCHIDEE
    351348!
    352349       IF (carbon_cycle_cpl) THEN
    353           IF (.NOT. ALLOCATED(fco2_land_inst)) THEN
    354              ALLOCATE(fco2_land_inst(klon),stat=error)
    355              IF (error /= 0)  CALL abort_gcm(modname,'Pb in allocation fco2_land_inst',1)
    356              
    357              ALLOCATE(fco2_lu_inst(klon),stat=error)
    358              IF(error /=0) CALL abort_gcm(modname,'Pb in allocation fco2_lu_inst',1)
    359           END IF
     350          abort_message='carbon_cycle_cpl not yet possible with this interface of ORCHIDEE'
     351          CALL abort_gcm(modname,abort_message,1)
    360352       END IF
    361353       
     
    464456
    465457   
    466 ! JG : TEMPORAIRE!!!! Les variables fco2_land_comp et fco2_lu_comp seront plus tard en sortie d'ORCHIDEE
    467 !      ici mis a valeur quelquonque pour test. Ces variables sont sur la grille compresse avec uniquement des points de terres
    468 
    469     fco2_land_comp(:) = 1.
    470     fco2_lu_comp(:)   = 10.
    471 
    472 ! Decompress variables for the module carbon_cycle_mod
    473     IF (carbon_cycle_cpl) THEN
    474        fco2_land_inst(:)=0.
    475        fco2_lu_inst(:)=0.
    476        
    477        DO igrid = 1, knon
    478           ireal = knindex(igrid)
    479           fco2_land_inst(ireal) = fco2_land_comp(igrid)
    480           fco2_lu_inst(ireal)   = fco2_lu_comp(igrid)
    481        END DO
    482     END IF
    483 
    484458  END SUBROUTINE surf_land_orchidee
    485459!
  • trunk/libf/phylmd/surf_land_orchidee_noopenmp_mod.F90

    r1 r66  
    138138    INTEGER                                   :: ij, jj, igrid, ireal, index
    139139    INTEGER                                   :: error
     140    INTEGER, SAVE                             :: nb_fields_cpl ! number of fields for the climate-carbon coupling (between ATM and ORCHIDEE).
     141    REAL, SAVE, ALLOCATABLE, DIMENSION(:,:)   :: fields_cpl    ! Fluxes for the climate-carbon coupling
    140142    REAL, DIMENSION(klon)                     :: swdown_vrai
    141     REAL, DIMENSION(klon)                     :: fco2_land_comp  ! sur grille compresse
    142     REAL, DIMENSION(klon)                     :: fco2_lu_comp    ! sur grille compresse
    143143    CHARACTER (len = 20)                      :: modname = 'surf_land_orchidee'
    144144    CHARACTER (len = 80)                      :: abort_message
     
    210210 
    211211    IF (debut) THEN
     212! Test de coherence
     213#ifndef ORCH_NEW
     214       ! Compilation avec orchidee nouvelle version necessaire avec carbon_cycle_cpl=y
     215       IF (carbon_cycle_cpl) THEN
     216          abort_message='You must define preprossing key ORCH_NEW when running carbon_cycle_cpl=y'
     217          CALL abort_gcm(modname,abort_message,1)
     218       END IF
     219#endif
    212220       ALLOCATE(ktindex(knon))
    213221       IF ( .NOT. ALLOCATED(albedo_keep)) THEN
     
    342350!
    343351! Allocate variables needed for carbon_cycle_mod
    344 !
     352       IF ( carbon_cycle_cpl ) THEN
     353          nb_fields_cpl=2
     354       ELSE
     355          nb_fields_cpl=1
     356       END IF
     357
     358
    345359       IF (carbon_cycle_cpl) THEN
    346           IF (.NOT. ALLOCATED(fco2_land_inst)) THEN
    347              ALLOCATE(fco2_land_inst(klon),stat=error)
    348              IF (error /= 0)  CALL abort_gcm(modname,'Pb in allocation fco2_land_inst',1)
    349              
    350              ALLOCATE(fco2_lu_inst(klon),stat=error)
    351              IF(error /=0) CALL abort_gcm(modname,'Pb in allocation fco2_lu_inst',1)
    352           END IF
     360          ALLOCATE(fco2_land_inst(klon),stat=error)
     361          IF (error /= 0)  CALL abort_gcm(modname,'Pb in allocation fco2_land_inst',1)
     362         
     363          ALLOCATE(fco2_lu_inst(klon),stat=error)
     364          IF(error /=0) CALL abort_gcm(modname,'Pb in allocation fco2_lu_inst',1)
    353365       END IF
     366
     367       ALLOCATE(fields_cpl(klon,nb_fields_cpl), stat = error)
     368       IF (error /= 0) CALL abort_gcm(modname,'Pb in allocation fields_cpl',1)
    354369
    355370    ENDIF                          ! (fin debut)
     
    406421               evap, fluxsens, fluxlat, coastalflow, riverflow, &
    407422               tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, &
    408                lon_scat, lat_scat, q2m, t2m)
     423               lon_scat, lat_scat, q2m, t2m &
     424#ifdef ORCH_NEW
     425               , nb_fields_cpl, fields_cpl)
     426#else
     427               )
     428#endif
    409429
    410430#else         
    411           ! Interface for ORCHIDEE version 1.9 or later(1.9.2, 1.9.3, 1.9.4) compiled in parallel mode(with preprocessing flag CPP_MPI)
     431          ! Interface for ORCHIDEE version 1.9 or later(1.9.2, 1.9.3, 1.9.4, 1.9.5) compiled in parallel mode(with preprocessing flag CPP_MPI)
    412432          CALL intersurf_main (itime+itau_phy-1, iim, jjm+1, offset, knon, ktindex, &
    413433               orch_comm, dtime, lrestart_read, lrestart_write, lalo, &
     
    418438               evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
    419439               tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
    420                lon_scat, lat_scat, q2m, t2m)
     440               lon_scat, lat_scat, q2m, t2m &
     441#ifdef ORCH_NEW
     442               , nb_fields_cpl, fields_cpl(1:knon,:))
     443#else
     444               )
     445#endif
    421446#endif
    422447         
     
    431456
    432457    IF (knon /=0) THEN
    433    
    434458#ifndef CPP_MPI
    435459       ! Interface for ORCHIDEE compiled in sequential mode(without preprocessing flag CPP_MPI)
     
    442466            evap, fluxsens, fluxlat, coastalflow, riverflow, &
    443467            tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, &
    444             lon_scat, lat_scat, q2m, t2m)
    445        
     468            lon_scat, lat_scat, q2m, t2m &
     469#ifdef ORCH_NEW
     470            , nb_fields_cpl, fields_cpl)
     471#else
     472            )
     473#endif
    446474#else
    447475       ! Interface for ORCHIDEE version 1.9 or later compiled in parallel mode(with preprocessing flag CPP_MPI)
     
    454482            evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
    455483            tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
    456             lon_scat, lat_scat, q2m, t2m)
    457 #endif
    458        
     484            lon_scat, lat_scat, q2m, t2m &
     485#ifdef ORCH_NEW
     486            , nb_fields_cpl, fields_cpl(1:knon,:))
     487#else
     488            )
     489#endif
     490#endif
    459491    ENDIF
    460492
     
    478510
    479511    IF (debut) lrestart_read = .FALSE.
    480 
    481 
    482 ! JG : TEMPORAIRE!!!! Les variables fco2_land_comp et fco2_lu_comp seront plus tard en sortie d'ORCHIDEE
    483 !      ici mis a valeur quelquonque pour test. Ces variables sont sur la grille compresse avec uniquement des points de terres
    484 
    485     fco2_land_comp(:) = 1.
    486     fco2_lu_comp(:)   = 10.
    487512
    488513! Decompress variables for the module carbon_cycle_mod
     
    493518       DO igrid = 1, knon
    494519          ireal = knindex(igrid)
    495           fco2_land_inst(ireal) = fco2_land_comp(igrid)
    496           fco2_lu_inst(ireal)   = fco2_lu_comp(igrid)
     520          fco2_land_inst(ireal) = fields_cpl(igrid,1)
     521          fco2_lu_inst(ireal)   = fields_cpl(igrid,2)
    497522       END DO
    498523    END IF
  • trunk/libf/phylmd/traclmdz_mod.F90

    r1 r66  
    8484
    8585
    86   SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
     86  SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, pdtphys, aerosol, lessivage)
    8787    ! This subroutine allocates and initialize module variables and control variables.
    8888    ! Initialization of the tracers should be done here only for those not found in the restart file.
     
    104104    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
    105105    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
     106    REAL,INTENT(IN)                        :: pdtphys ! Pas d'integration pour la physique (seconde) 
    106107
    107108! Output variables
     
    226227! ----------------------------------------------
    227228    IF (carbon_cycle_tr .OR. carbon_cycle_cpl) THEN
    228        CALL carbon_cycle_init(tr_seri, aerosol, radio)
     229       CALL carbon_cycle_init(tr_seri, pdtphys, aerosol, radio)
    229230    END IF
    230231
     
    312313!--------------
    313314!
    314     REAL,DIMENSION(klon,klev),INTENT(IN) :: cdragh     ! coeff drag pour T et Q
     315    REAL,DIMENSION(klon),INTENT(IN)      :: cdragh     ! coeff drag pour T et Q
    315316    REAL,DIMENSION(klon,klev),INTENT(IN) :: coefh      ! coeff melange CL (m**2/s)
    316317    REAL,DIMENSION(klon),INTENT(IN)      :: yu1        ! vents au premier niveau
     
    546547!======================================================================
    547548    IF (carbon_cycle_tr .OR. carbon_cycle_cpl) THEN
    548        CALL carbon_cycle(nstep, pdtphys, pctsrf, tr_seri)
     549       CALL carbon_cycle(nstep, pdtphys, pctsrf, tr_seri, source)
    549550    END IF
    550551
Note: See TracChangeset for help on using the changeset viewer.