Changeset 1376 for LMDZ4


Ignore:
Timestamp:
May 5, 2010, 3:23:18 PM (14 years ago)
Author:
musat
Message:

Output all tracers defined in .def in hist files with dynamic
declaration of LMDZ atmospheric tracers' output levels
Add 6 pseudo-water tracers with and without transport by boundary layer
IM

Location:
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/clesphys.h

    r1350 r1376  
     1
    12!
    23! $Id$
     
    6768       LOGICAL :: ok_strato
    6869       LOGICAL :: ok_hines
     70       INTEGER :: nseuil
    6971
    7072       COMMON/clesphys/cycle_diurne, soil_model, new_oliq,              &
     
    8587     &     , ok_lic_melt, cvl_corr, aer_type                            &
    8688     &     , qsol0, iflag_rrtm, ok_strato,ok_hines,ecrit_LES            &
    87      &     , co2_ppm0
     89     &     , co2_ppm0, nseuil
    8890     
    8991!$OMP THREADPRIVATE(/clesphys/)
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/conf_phys.F90

    r1356 r1376  
    151151  REAL,SAVE :: ecrit_LES_omp
    152152  REAL,SAVE :: ecrit_tra_omp
     153  INTEGER, SAVE :: nseuil_omp   
    153154  REAL,SAVE :: cvl_corr_omp
    154155  LOGICAL,SAVE :: ok_lic_melt_omp
     
    12261227  ecrit_tra_omp = 30.
    12271228  call getin('ecrit_tra',ecrit_tra_omp)
     1229!
     1230!Config Key  = nseuil
     1231!Config Desc = Numero du traceur a partir duquel on ne transporte
     1232!              pas par convection
     1233!Config Def  = 7 !a partir du numero 7 pour les pseudo-traceurs de Remy
     1234!Config Help =
     1235!
     1236  nseuil_omp = 7
     1237  call getin('nseuil',nseuil_omp)
     1238!
    12281239!
    12291240!Config Key  = ecrit_reg
     
    15151526    ecrit_mth = ecrit_mth_omp
    15161527    ecrit_tra = ecrit_tra_omp
     1528    nseuil = nseuil_omp
    15171529    ecrit_reg = ecrit_reg_omp
    15181530    cvl_corr = cvl_corr_omp
     
    16781690  write(numout,*)' ecrit_ hf, ins, day, mth, reg, tra, ISCCP, LES',&
    16791691   ecrit_hf, ecrit_ins, ecrit_day, ecrit_mth, ecrit_reg, ecrit_tra, ecrit_ISCCP, ecrit_LES
     1692  write(numout,*)' nseuil ',nseuil
    16801693
    16811694  write(numout,*) 'ok_strato = ', ok_strato
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/phys_output_mod.F90

    r1347 r1376  
    1111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1212
    13 MODULE phys_output_mod
     13MODULE phys_output_mod 
    1414
    1515  IMPLICIT NONE
     
    525525  type(ctrl_out),save :: o_dvlif        = ctrl_out((/ 4, 10, 10, 10, 10 /),'dvlif')
    526526
    527 ! Attention a refaire correctement
    528   type(ctrl_out),save,dimension(2) :: o_trac         = (/ ctrl_out((/ 4, 10, 10, 10, 10 /),'trac01'), &
    529                                                      ctrl_out((/ 4, 10, 10, 10, 10 /),'trac02') /)
    530527    CONTAINS
    531528
     
    539536       type_ocean, iflag_pbl,ok_mensuel,ok_journe, &
    540537       ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, read_climoz, &
    541        new_aod, aerosol_couple)   
     538       new_aod, aerosol_couple, o_trac)   
    542539
    543540
     
    602599  real, dimension(nfiles), save     :: phys_out_latmin        = (/ -90., -90., -90., -90., -90. /)
    603600  real, dimension(nfiles), save     :: phys_out_latmax        = (/ 90., 90., 90., 90., 90. /)
    604  
    605  
    606 
    607 !
     601
     602!IM definition dynamique flag o_trac pour sortie traceurs
     603  INTEGER :: nq
     604  type(ctrl_out) :: o_trac(nqtot)
     605  CHARACTER(len=8) :: solsym(nqtot)
     606
    608607   print*,'Debut phys_output_mod.F90'
    609608! Initialisations (Valeurs par defaut
     
    12201219     ENDIF
    12211220
    1222       if (nqtot>=3) THEN
    1223 !Attention    DO iq=3,nqtot
    1224     DO iq=3,4 
     1221!IM traceurs dynamiques
     1222    DO nq=1,nqtot
     1223      IF(nq.LT.10) THEN
     1224       WRITE(solsym(nq),'(i1)') nq
     1225       o_trac(nq)    =  ctrl_out((/ 4, 5, 1, 1, 1 /),'trac0'//TRIM(solsym(nq)))
     1226      ELSE
     1227       WRITE(solsym(nq),'(i2)') nq
     1228       o_trac(nq)    =  ctrl_out((/ 4, 5, 1, 1, 1 /),'trac'//TRIM(solsym(nq)))
     1229      ENDIF
     1230     WRITE(*,*) 'nq, o_trac(nq)=',nq, o_trac(nq)
     1231    ENDDO
     1232!
     1233    if (nqtot>=3) THEN
     1234     DO iq=3,nqtot 
    12251235       iiq=niadv(iq)
    1226 ! CALL histdef3d (iff, o_trac%flag,'o_'//tnom(iq)%name,ttext(iiq), "-" )
    12271236  CALL histdef3d (iff, o_trac(iq-2)%flag,o_trac(iq-2)%name,ttext(iiq), "-" )
    1228     ENDDO
    1229       endif
     1237     ENDDO
     1238    endif
    12301239
    12311240        CALL histend(nid_files(iff))
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/phys_output_write.h

    r1366 r1376  
    15051505        ENDIF
    15061506
    1507 !       IF (o_trac%flag(iff)<=lev_files(iff)) THEN
    1508          if (nqtot.GE.3) THEN
    1509 !           DO iq=3,nqtot
    1510            DO iq=3,4
     1507        if (nqtot.GE.3) THEN
     1508         DO iq=3,nqtot
    15111509       IF (o_trac(iq-2)%flag(iff)<=lev_files(iff)) THEN
    15121510         CALL histwrite_phy(nid_files(iff),
    15131511     s                  o_trac(iq-2)%name,itau_w,qx(:,:,iq))
    15141512       ENDIF
    1515            ENDDO
    1516          endif
     1513         ENDDO
     1514        endif
    15171515
    15181516      if (ok_sync) then
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/phytrac.F90

    r1299 r1376  
     1
    12!$Id $
    23
     
    213214     SELECT CASE(type_trac)
    214215     CASE('lmdz')
    215         CALL traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)
     216!IM ajout t_seri, pplay, sh    CALL traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)
     217        CALL traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
    216218     CASE('inca')
    217219        source(:,:)=0.
     
    239241          paprs,    pplay,        cdragh,  coefh,   &
    240242          yu1,      yv1,          ftsol,   pctsrf,  &
    241           xlat,     couchelimite,                   &
     243          xlat,     couchelimite, sh,               &
    242244          tr_seri,  source,       solsym,  d_tr_cl)
    243245     
     
    277279        END IF
    278280
     281!IM ajout traceurs RR
     282!      print*,'phytrac it,nseuil=',it,nseuil
     283       IF (it.lt.nseuil) THEN
    279284        DO k = 1, klev
    280285           DO i = 1, klon       
     
    282287           END DO
    283288        END DO
     289       END IF !(it.lt.nseuil) then
    284290
    285291        CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'convection it = '//solsym(it))
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/traclmdz_mod.F90

    r1279 r1376  
    3535!$OMP THREADPRIVATE(id_be)
    3636
     37!IM ajout traceurs RR
     38  INTEGER,SAVE :: id_dry !traceur dry intrusions
     39!$OMP THREADPRIVATE(id_dry)
     40  INTEGER,SAVE :: id_pcsat, id_pcocsat, id_pcq ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
     41!$OMP THREADPRIVATE(id_pcsat, id_pcocsat, id_pcq)
     42  INTEGER,SAVE :: id_pcs0, id_pcos0, id_pcq0 ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
     43!                                            ! qui ne sont pas transportes par la convection
     44!$OMP THREADPRIVATE(id_pcs0, id_pcos0, id_pcq0)
     45
    3746  LOGICAL,SAVE :: rnpb=.TRUE. ! Presence du couple Rn222, Pb210
    3847!$OMP THREADPRIVATE(rnpb)
     
    6574
    6675
    67   SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)
     76  SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
    6877    ! This subroutine allocates and initialize module variables and control variables.
    6978    USE dimphy
     
    7887    REAL,DIMENSION(klon,nbsrf),INTENT(IN)     :: pctsrf ! Pourcentage de sol f(nature du sol)
    7988    REAL,DIMENSION(klon,nbsrf),INTENT(IN)     :: ftsol  ! Temperature du sol (surf)(Kelvin)
    80     REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 
     89!IM traceurs RR   REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 
     90    REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri! Concentration Traceur [U/KgA] 
     91    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
     92    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
     93    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
    8194
    8295! Output variables
     
    8598       
    8699! Local variables   
    87     INTEGER :: ierr, it, iiq
     100    INTEGER :: ierr, it, iiq, i, k
     101    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
    88102   
    89103! --------------------------------------------
     
    137151       END IF   
    138152    END DO
     153
     154    id_dry=0
     155
     156    DO it=1,nbtr
     157       iiq=niadv(it+2)
     158       IF ( tname(iiq) == "dry" .OR. tname(iiq) == "Dry" ) THEN
     159        id_dry=it
     160       END IF   
     161    END DO 
     162
     163    id_pcsat=0
     164    DO it=1,nbtr
     165       iiq=niadv(it+2)
     166       IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN
     167        id_pcsat=it
     168      END IF
     169    END DO
     170
     171    id_pcocsat=0
     172    DO it=1,nbtr
     173       iiq=niadv(it+2)
     174       IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN
     175        id_pcocsat=it
     176       END IF
     177    END DO
     178
     179    id_pcq=0
     180    DO it=1,nbtr
     181       iiq=niadv(it+2)
     182       IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN
     183        id_pcq=it
     184       END IF
     185    END DO
     186
     187    id_pcs0=0
     188    DO it=1,nbtr
     189       iiq=niadv(it+2)
     190       IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN
     191        id_pcs0=it
     192      END IF
     193    END DO
     194
     195    id_pcos0=0
     196    DO it=1,nbtr
     197       iiq=niadv(it+2)
     198       IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN
     199        id_pcos0=it
     200       END IF
     201    END DO
     202
     203    id_pcq0=0
     204    DO it=1,nbtr
     205       iiq=niadv(it+2)
     206       IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN
     207        id_pcq0=it
     208       END IF
     209    END DO
     210
    139211!
    140212! Valeurs specifiques pour les traceurs Rn222 et Pb210
     
    159231    END IF
    160232
     233!IM initialisation traceurs pseudo-vapeurs
     234    call q_sat(klon*klev,t_seri,pplay,qsat)
     235    IF ( id_pcsat /= 0 ) THEN
     236     DO k = 1, klev
     237      DO i = 1, klon
     238       IF ( pplay(i,k).GE.85000.) THEN
     239        tr_seri(i,k,id_pcsat) = qsat(i,k)
     240       ELSE
     241        tr_seri(i,k,id_pcsat) = 100.
     242       END IF
     243      END DO
     244     END DO
     245    END IF
     246
     247    IF ( id_pcocsat /= 0 ) THEN
     248     DO k = 1, klev
     249      DO i = 1, klon
     250       IF ( pplay(i,k).GE.85000.) THEN
     251        IF ( pctsrf (i, is_oce) > 0. ) THEN
     252         tr_seri(i,k,id_pcocsat) = qsat(i,k)
     253        ELSE
     254         tr_seri(i,k,id_pcocsat) = 100.
     255        END IF
     256       END IF
     257      END DO
     258     END DO
     259    END IF
     260
     261    IF ( id_pcq /= 0 ) THEN
     262     DO k = 1, klev
     263      DO i = 1, klon
     264       IF ( pplay(i,k).GE.85000.) THEN
     265        tr_seri(i,k,id_pcq) = sh(i,k)
     266       ELSE
     267        tr_seri(i,k,id_pcq) = 100.
     268       END IF
     269      END DO
     270     END DO
     271    END IF
     272
     273    IF ( id_pcs0 /= 0 ) THEN
     274     DO k = 1, klev
     275      DO i = 1, klon
     276       IF ( pplay(i,k).GE.85000.) THEN
     277        tr_seri(i,k,id_pcs0) = qsat(i,k)
     278       ELSE
     279        tr_seri(i,k,id_pcs0) = 100.
     280       END IF
     281      END DO
     282     END DO
     283    END IF
     284
     285    IF ( id_pcos0 /= 0 ) THEN
     286     DO k = 1, klev
     287      DO i = 1, klon
     288       IF ( pplay(i,k).GE.85000.) THEN
     289        IF ( pctsrf (i, is_oce) > 0. ) THEN
     290         tr_seri(i,k,id_pcos0) = qsat(i,k)
     291        ELSE
     292         tr_seri(i,k,id_pcos0) = 100.
     293        END IF
     294       END IF
     295      END DO
     296     END DO
     297    END IF
     298
     299    IF ( id_pcq0 /= 0 ) THEN
     300     DO k = 1, klev
     301      DO i = 1, klon
     302       IF ( pplay(i,k).GE.85000.) THEN
     303        tr_seri(i,k,id_pcq0) = sh(i,k)
     304       ELSE
     305        tr_seri(i,k,id_pcq0) = 100.
     306       END IF
     307      END DO
     308     END DO
     309    END IF
     310 
    161311  END SUBROUTINE traclmdz_init
    162312
     
    165315       paprs,    pplay,        cdragh,  coefh,   &
    166316       yu1,      yv1,          ftsol,   pctsrf,  &
    167        xlat,     couchelimite,                   &
     317       xlat,     couchelimite, sh,               &
    168318       tr_seri,  source,       solsym,  d_tr_cl)
    169319   
     
    204354    REAL,DIMENSION(klon),INTENT(IN)      :: yv1        ! vents au premier niveau
    205355    LOGICAL,INTENT(IN)                   :: couchelimite
     356!IM traceurs RR
     357    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
    206358
    207359! Arguments necessaires pour les sources et puits de traceur:
     
    230382    REAL                           :: zrho      ! Masse Volumique de l'air KgA/m3
    231383
    232 !
     384!IM traceurs RR
     385    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
     386    REAL :: amn, amx
    233387!
    234388!=================================================================
     
    245399    END IF
    246400 
     401!IM ajout traceurs RR
     402    call q_sat(klon*klev,t_seri,pplay,qsat)
     403   
     404    IF ( id_pcsat /= 0 ) THEN
     405     DO k = 1, klev
     406      DO i = 1, klon
     407       IF ( pplay(i,k).GE.85000.) THEN
     408        tr_seri(i,k,id_pcsat) = qsat(i,k)
     409       END IF
     410      END DO
     411     END DO
     412    END IF
     413
     414    IF ( id_pcocsat /= 0 ) THEN
     415     DO k = 1, klev
     416      DO i = 1, klon
     417       IF ( pplay(i,k).GE.85000.) THEN
     418        IF ( pctsrf (i, is_oce) > 0. ) THEN
     419         tr_seri(i,k,id_pcocsat) = qsat(i,k)
     420        END IF
     421       END IF
     422      END DO
     423     END DO
     424    END IF
     425
     426    IF ( id_pcq /= 0 ) THEN
     427     DO k = 1, klev
     428      DO i = 1, klon
     429       IF ( pplay(i,k).GE.85000.) THEN
     430        tr_seri(i,k,id_pcq) = sh(i,k)
     431       END IF
     432      END DO
     433     END DO
     434    END IF
     435
     436    IF ( id_pcs0 /= 0 ) THEN
     437     DO k = 1, klev
     438      DO i = 1, klon
     439       IF ( pplay(i,k).GE.85000.) THEN
     440        tr_seri(i,k,id_pcs0) = qsat(i,k)
     441       END IF
     442      END DO
     443     END DO
     444    END IF
     445
     446    IF ( id_pcos0 /= 0 ) THEN
     447     DO k = 1, klev
     448      DO i = 1, klon
     449       IF ( pplay(i,k).GE.85000.) THEN
     450        IF ( pctsrf (i, is_oce) > 0. ) THEN
     451         tr_seri(i,k,id_pcos0) = qsat(i,k)
     452        END IF
     453       END IF
     454      END DO
     455     END DO
     456    END IF
     457
     458    IF ( id_pcq0 /= 0 ) THEN
     459     DO k = 1, klev
     460      DO i = 1, klon
     461       IF ( pplay(i,k).GE.85000.) THEN
     462        tr_seri(i,k,id_pcq0) = sh(i,k)
     463       END IF
     464      END DO
     465     END DO
     466    END IF
    247467
    248468    DO it=1,nbtr
     
    294514       END IF
    295515    END DO
    296            
     516         
     517!IM traceurs RR
     518    IF ( id_pcsat /= 0 ) THEN
     519     DO k = 1, klev
     520      DO i = 1, klon
     521       IF ( pplay(i,k).LT.85000.) THEN
     522        tr_seri(i,k,id_pcsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcsat))
     523       END IF
     524      END DO
     525     END DO
     526    END IF
     527
     528    IF ( id_pcocsat /= 0 ) THEN
     529     DO k = 1, klev
     530      DO i = 1, klon
     531       IF ( pplay(i,k).LT.85000.) THEN
     532        tr_seri(i,k,id_pcocsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcocsat))
     533       END IF
     534      END DO
     535     END DO
     536    END IF
     537
     538    IF ( id_pcq /= 0 ) THEN
     539     DO k = 1, klev
     540      DO i = 1, klon
     541       IF ( pplay(i,k).LT.85000.) THEN
     542        tr_seri(i,k,id_pcq) = MIN (qsat(i,k), tr_seri(i,k,id_pcq))
     543       END IF
     544      END DO 
     545     END DO 
     546    END IF 
     547
     548    IF ( id_pcs0 /= 0 ) THEN
     549     DO k = 1, klev
     550      DO i = 1, klon
     551       IF ( pplay(i,k).LT.85000.) THEN
     552        tr_seri(i,k,id_pcs0) = MIN (qsat(i,k), tr_seri(i,k,id_pcs0))
     553       END IF
     554      END DO
     555     END DO
     556    END IF
     557
     558    IF ( id_pcos0 /= 0 ) THEN
     559     DO k = 1, klev
     560      DO i = 1, klon
     561       IF ( pplay(i,k).LT.85000.) THEN
     562        tr_seri(i,k,id_pcos0) = MIN (qsat(i,k), tr_seri(i,k,id_pcos0))
     563       END IF
     564      END DO
     565     END DO
     566    END IF
     567
     568    IF ( id_pcq0 /= 0 ) THEN
     569     DO k = 1, klev
     570      DO i = 1, klon
     571       IF ( pplay(i,k).LT.85000.) THEN
     572        tr_seri(i,k,id_pcq0) = MIN (qsat(i,k), tr_seri(i,k,id_pcq0))
     573       END IF
     574      END DO
     575     END DO
     576    END IF
    297577!======================================================================
    298578!   Calcul de l'effet du puits radioactif
Note: See TracChangeset for help on using the changeset viewer.