Ignore:
Timestamp:
Jul 1, 2010, 11:02:53 AM (14 years ago)
Author:
Laurent Fairhead
Message:

Merged LMDZ4V5.0-dev branch changes r1292:r1399 to trunk.

Validation:
Validation consisted in compiling the HEAD revision of the trunk,
LMDZ4V5.0-dev branch and the merged sources and running different
configurations on local and SX8 machines comparing results.

Local machine: bench configuration, 32x24x11, gfortran

  • IPSLCM5A configuration (comparison between trunk and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent
  • MH07 configuration, new physics package (comparison between LMDZ4V5.0-dev branch and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent

SX8 machine (brodie), 96x95x39 on 4 processors:

  • IPSLCM5A configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent
  • MH07 configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent

Changes to the makegcm and create_make_gcm scripts to take into account
main programs in F90 files


Fusion de la branche LMDZ4V5.0-dev (r1292:r1399) au tronc principal

Validation:
La validation a consisté à compiler la HEAD de le trunk et de la banche
LMDZ4V5.0-dev et les sources fusionnées et de faire tourner le modéle selon
différentes configurations en local et sur SX8 et de comparer les résultats

En local: 32x24x11, config bench/gfortran

  • pour une config IPSLCM5A (comparaison tronc/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux (à part sur RN et Pb)
    • fichiers histoire égaux
  • pour une config nlle physique (MH07) (comparaison LMDZ4v5.0-dev/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux
    • fichiers histoire équivalents

Sur brodie, 96x95x39 sur 4 proc:

  • pour une config IPSLCM5A:
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc
  • pour une config MH07
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc

Changement sur makegcm et create_make-gcm pour pouvoir prendre en compte des
programmes principaux en *F90

Location:
LMDZ4/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/trunk

  • LMDZ4/trunk/libf/phylmd/traclmdz_mod.F90

    r1279 r1403  
    66! only if running without any other chemestry model as INCA or REPROBUS. 
    77!
     8
     9  IMPLICIT NONE
    810
    911  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: masktr   ! Masque reservoir de sol traceur
     
    3537!$OMP THREADPRIVATE(id_be)
    3638
     39!IM ajout traceurs RR
     40  INTEGER,SAVE :: id_dry !traceur dry intrusions
     41!$OMP THREADPRIVATE(id_dry)
     42  INTEGER,SAVE :: id_pcsat, id_pcocsat, id_pcq ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
     43!$OMP THREADPRIVATE(id_pcsat, id_pcocsat, id_pcq)
     44  INTEGER,SAVE :: id_pcs0, id_pcos0, id_pcq0 ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
     45!                                            ! qui ne sont pas transportes par la convection
     46!$OMP THREADPRIVATE(id_pcs0, id_pcos0, id_pcq0)
     47
     48  INTEGER, SAVE:: id_o3
     49  !$OMP THREADPRIVATE(id_o3)
     50  ! index of ozone tracer with Cariolle parameterization
     51  ! 0 means no ozone tracer
     52
    3753  LOGICAL,SAVE :: rnpb=.TRUE. ! Presence du couple Rn222, Pb210
    3854!$OMP THREADPRIVATE(rnpb)
     
    4763    USE dimphy
    4864    USE infotrac
    49     IMPLICIT NONE
    5065   
    5166    ! Input argument
     
    6580
    6681
    67   SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)
     82  SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
    6883    ! This subroutine allocates and initialize module variables and control variables.
    6984    USE dimphy
    7085    USE infotrac
     86    USE regr_pr_comb_coefoz_m, ONLY: alloc_coefoz
     87    USE press_coefoz_m, ONLY: press_coefoz
    7188    USE carbon_cycle_mod, ONLY : carbon_cycle_init, carbon_cycle_tr, carbon_cycle_cpl
    72 
    73     IMPLICIT NONE
    7489
    7590    INCLUDE "indicesol.h"
     
    7893    REAL,DIMENSION(klon,nbsrf),INTENT(IN)     :: pctsrf ! Pourcentage de sol f(nature du sol)
    7994    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] 
     95!IM traceurs RR   REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 
     96    REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri! Concentration Traceur [U/KgA] 
     97    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
     98    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
     99    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
    81100
    82101! Output variables
     
    85104       
    86105! Local variables   
    87     INTEGER :: ierr, it, iiq
     106    INTEGER :: ierr, it, iiq, i, k
     107    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
    88108   
    89109! --------------------------------------------
     
    121141   
    122142!
    123 ! Recherche des traceurs connus : Be7, CO2,...
     143! Recherche des traceurs connus : Be7, O3, CO2,...
    124144! --------------------------------------------
    125145    id_be=0
     146    id_o3=0
    126147    DO it=1,nbtr
    127148       iiq=niadv(it+2)
     
    135156          CALL init_be(pctsrf,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
    136157          WRITE(*,*) 'Initialisation srcBe: OK'
     158       ELSE IF (tname(iiq)=="O3" .OR. tname(iiq)=="o3") THEN
     159          ! Recherche de l'ozone : parametrization de la chimie par Cariolle
     160          id_o3=it
     161          CALL alloc_coefoz   ! allocate ozone coefficients
     162          CALL press_coefoz   ! read input pressure levels
    137163       END IF   
    138164    END DO
     165
     166    id_dry=0
     167
     168    DO it=1,nbtr
     169       iiq=niadv(it+2)
     170       IF ( tname(iiq) == "dry" .OR. tname(iiq) == "Dry" ) THEN
     171        id_dry=it
     172       END IF   
     173    END DO 
     174
     175    id_pcsat=0
     176    DO it=1,nbtr
     177       iiq=niadv(it+2)
     178       IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN
     179        id_pcsat=it
     180      END IF
     181    END DO
     182
     183    id_pcocsat=0
     184    DO it=1,nbtr
     185       iiq=niadv(it+2)
     186       IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN
     187        id_pcocsat=it
     188       END IF
     189    END DO
     190
     191    id_pcq=0
     192    DO it=1,nbtr
     193       iiq=niadv(it+2)
     194       IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN
     195        id_pcq=it
     196       END IF
     197    END DO
     198
     199    id_pcs0=0
     200    DO it=1,nbtr
     201       iiq=niadv(it+2)
     202       IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN
     203        id_pcs0=it
     204      END IF
     205    END DO
     206
     207    id_pcos0=0
     208    DO it=1,nbtr
     209       iiq=niadv(it+2)
     210       IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN
     211        id_pcos0=it
     212       END IF
     213    END DO
     214
     215    id_pcq0=0
     216    DO it=1,nbtr
     217       iiq=niadv(it+2)
     218       IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN
     219        id_pcq0=it
     220       END IF
     221    END DO
     222
    139223!
    140224! Valeurs specifiques pour les traceurs Rn222 et Pb210
     
    159243    END IF
    160244
     245!IM initialisation traceurs pseudo-vapeurs
     246    call q_sat(klon*klev,t_seri,pplay,qsat)
     247    IF ( id_pcsat /= 0 ) THEN
     248     DO k = 1, klev
     249      DO i = 1, klon
     250       IF ( pplay(i,k).GE.85000.) THEN
     251        tr_seri(i,k,id_pcsat) = qsat(i,k)
     252       ELSE
     253        tr_seri(i,k,id_pcsat) = 100.
     254       END IF
     255      END DO
     256     END DO
     257    END IF
     258
     259    IF ( id_pcocsat /= 0 ) THEN
     260     DO k = 1, klev
     261      DO i = 1, klon
     262       IF ( pplay(i,k).GE.85000.) THEN
     263        IF ( pctsrf (i, is_oce) > 0. ) THEN
     264         tr_seri(i,k,id_pcocsat) = qsat(i,k)
     265        ELSE
     266         tr_seri(i,k,id_pcocsat) = 100.
     267        END IF
     268       END IF
     269      END DO
     270     END DO
     271    END IF
     272
     273    IF ( id_pcq /= 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_pcq) = sh(i,k)
     278       ELSE
     279        tr_seri(i,k,id_pcq) = 100.
     280       END IF
     281      END DO
     282     END DO
     283    END IF
     284
     285    IF ( id_pcs0 /= 0 ) THEN
     286     DO k = 1, klev
     287      DO i = 1, klon
     288       IF ( pplay(i,k).GE.85000.) THEN
     289        tr_seri(i,k,id_pcs0) = qsat(i,k)
     290       ELSE
     291        tr_seri(i,k,id_pcs0) = 100.
     292       END IF
     293      END DO
     294     END DO
     295    END IF
     296
     297    IF ( id_pcos0 /= 0 ) THEN
     298     DO k = 1, klev
     299      DO i = 1, klon
     300       IF ( pplay(i,k).GE.85000.) THEN
     301        IF ( pctsrf (i, is_oce) > 0. ) THEN
     302         tr_seri(i,k,id_pcos0) = qsat(i,k)
     303        ELSE
     304         tr_seri(i,k,id_pcos0) = 100.
     305        END IF
     306       END IF
     307      END DO
     308     END DO
     309    END IF
     310
     311    IF ( id_pcq0 /= 0 ) THEN
     312     DO k = 1, klev
     313      DO i = 1, klon
     314       IF ( pplay(i,k).GE.85000.) THEN
     315        tr_seri(i,k,id_pcq0) = sh(i,k)
     316       ELSE
     317        tr_seri(i,k,id_pcq0) = 100.
     318       END IF
     319      END DO
     320     END DO
     321    END IF
     322 
    161323  END SUBROUTINE traclmdz_init
    162324
    163   SUBROUTINE traclmdz(                           &
    164        nstep,    pdtphys,      t_seri,           &
    165        paprs,    pplay,        cdragh,  coefh,   &
    166        yu1,      yv1,          ftsol,   pctsrf,  &
    167        xlat,     couchelimite,                   &
    168        tr_seri,  source,       solsym,  d_tr_cl)
     325  SUBROUTINE traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, &
     326       cdragh,  coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, sh, &
     327       tr_seri, source, solsym, d_tr_cl, zmasse)
    169328   
    170329    USE dimphy
    171330    USE infotrac
     331    USE regr_pr_comb_coefoz_m, ONLY: regr_pr_comb_coefoz
     332    USE o3_chem_m, ONLY: o3_chem
    172333    USE carbon_cycle_mod, ONLY : carbon_cycle, carbon_cycle_tr, carbon_cycle_cpl
    173    
    174     IMPLICIT NONE
    175    
    176334    INCLUDE "YOMCST.h"
    177335    INCLUDE "indicesol.h"
     
    185343!Configuration grille,temps:
    186344    INTEGER,INTENT(IN) :: nstep      ! nombre d'appels de la physiq
     345    INTEGER,INTENT(IN) :: julien     ! Jour julien
     346    REAL,INTENT(IN)    :: gmtime
    187347    REAL,INTENT(IN)    :: pdtphys    ! Pas d'integration pour la physique (seconde) 
    188348    REAL,DIMENSION(klon),INTENT(IN) :: xlat    ! latitudes pour chaque point
     349    REAL, INTENT(IN):: xlon(:) ! dim(klon) longitude
    189350
    190351!
     
    194355    REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs   ! pression pour chaque inter-couche (en Pa)
    195356    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
     357    REAL,intent(in):: zmasse (:, :)   ! dim(klon,klev) density of air, in kg/m2
    196358
    197359
     
    204366    REAL,DIMENSION(klon),INTENT(IN)      :: yv1        ! vents au premier niveau
    205367    LOGICAL,INTENT(IN)                   :: couchelimite
     368!IM traceurs RR
     369    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
    206370
    207371! Arguments necessaires pour les sources et puits de traceur:
     
    223387
    224388    INTEGER :: i, k, it
     389    INTEGER lmt_pas ! number of time steps of "physics" per day
    225390
    226391    REAL,DIMENSION(klon)           :: d_trs    ! Td dans le reservoir
    227     REAL,DIMENSION(klon,klev)      :: delp     ! epaisseur de couche (Pa)
    228    
    229392    REAL,DIMENSION(klon,klev,nbtr) :: d_tr_dec ! Td radioactive
    230393    REAL                           :: zrho      ! Masse Volumique de l'air KgA/m3
    231394
    232 !
     395!IM traceurs RR
     396    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
     397    REAL :: amn, amx
    233398!
    234399!=================================================================
     
    245410    END IF
    246411 
     412!IM ajout traceurs RR
     413    call q_sat(klon*klev,t_seri,pplay,qsat)
     414   
     415    IF ( id_pcsat /= 0 ) THEN
     416     DO k = 1, klev
     417      DO i = 1, klon
     418       IF ( pplay(i,k).GE.85000.) THEN
     419        tr_seri(i,k,id_pcsat) = qsat(i,k)
     420       END IF
     421      END DO
     422     END DO
     423    END IF
     424
     425    IF ( id_pcocsat /= 0 ) THEN
     426     DO k = 1, klev
     427      DO i = 1, klon
     428       IF ( pplay(i,k).GE.85000.) THEN
     429        IF ( pctsrf (i, is_oce) > 0. ) THEN
     430         tr_seri(i,k,id_pcocsat) = qsat(i,k)
     431        END IF
     432       END IF
     433      END DO
     434     END DO
     435    END IF
     436
     437    IF ( id_pcq /= 0 ) THEN
     438     DO k = 1, klev
     439      DO i = 1, klon
     440       IF ( pplay(i,k).GE.85000.) THEN
     441        tr_seri(i,k,id_pcq) = sh(i,k)
     442       END IF
     443      END DO
     444     END DO
     445    END IF
     446
     447    IF ( id_pcs0 /= 0 ) THEN
     448     DO k = 1, klev
     449      DO i = 1, klon
     450       IF ( pplay(i,k).GE.85000.) THEN
     451        tr_seri(i,k,id_pcs0) = qsat(i,k)
     452       END IF
     453      END DO
     454     END DO
     455    END IF
     456
     457    IF ( id_pcos0 /= 0 ) THEN
     458     DO k = 1, klev
     459      DO i = 1, klon
     460       IF ( pplay(i,k).GE.85000.) THEN
     461        IF ( pctsrf (i, is_oce) > 0. ) THEN
     462         tr_seri(i,k,id_pcos0) = qsat(i,k)
     463        END IF
     464       END IF
     465      END DO
     466     END DO
     467    END IF
     468
     469    IF ( id_pcq0 /= 0 ) THEN
     470     DO k = 1, klev
     471      DO i = 1, klon
     472       IF ( pplay(i,k).GE.85000.) THEN
     473        tr_seri(i,k,id_pcq0) = sh(i,k)
     474       END IF
     475      END DO
     476     END DO
     477    END IF
    247478
    248479    DO it=1,nbtr
     
    265496    END IF
    266497   
    267 
    268     DO k = 1, klev
    269        DO i = 1, klon
    270           delp(i,k) = paprs(i,k)-paprs(i,k+1)
    271        END DO
    272     END DO
    273    
    274498    DO it=1, nbtr
    275499       IF (couchelimite .AND. pbl_flg(it) == 0 ) THEN ! couche limite avec quantite dans le sol calculee
     
    277501               cdragh, coefh,t_seri,ftsol,pctsrf,  &
    278502               tr_seri(:,:,it),trs(:,it),          &
    279                paprs, pplay, delp,                &
     503               paprs, pplay, zmasse * rg, &
    280504               masktr(:,it),fshtr(:,it),hsoltr(it),&
    281505               tautr(it),vdeptr(it),               &
     
    294518       END IF
    295519    END DO
    296            
     520         
     521!IM traceurs RR
     522    IF ( id_pcsat /= 0 ) THEN
     523     DO k = 1, klev
     524      DO i = 1, klon
     525       IF ( pplay(i,k).LT.85000.) THEN
     526        tr_seri(i,k,id_pcsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcsat))
     527       END IF
     528      END DO
     529     END DO
     530    END IF
     531
     532    IF ( id_pcocsat /= 0 ) THEN
     533     DO k = 1, klev
     534      DO i = 1, klon
     535       IF ( pplay(i,k).LT.85000.) THEN
     536        tr_seri(i,k,id_pcocsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcocsat))
     537       END IF
     538      END DO
     539     END DO
     540    END IF
     541
     542    IF ( id_pcq /= 0 ) THEN
     543     DO k = 1, klev
     544      DO i = 1, klon
     545       IF ( pplay(i,k).LT.85000.) THEN
     546        tr_seri(i,k,id_pcq) = MIN (qsat(i,k), tr_seri(i,k,id_pcq))
     547       END IF
     548      END DO 
     549     END DO 
     550    END IF 
     551
     552    IF ( id_pcs0 /= 0 ) THEN
     553     DO k = 1, klev
     554      DO i = 1, klon
     555       IF ( pplay(i,k).LT.85000.) THEN
     556        tr_seri(i,k,id_pcs0) = MIN (qsat(i,k), tr_seri(i,k,id_pcs0))
     557       END IF
     558      END DO
     559     END DO
     560    END IF
     561
     562    IF ( id_pcos0 /= 0 ) THEN
     563     DO k = 1, klev
     564      DO i = 1, klon
     565       IF ( pplay(i,k).LT.85000.) THEN
     566        tr_seri(i,k,id_pcos0) = MIN (qsat(i,k), tr_seri(i,k,id_pcos0))
     567       END IF
     568      END DO
     569     END DO
     570    END IF
     571
     572    IF ( id_pcq0 /= 0 ) THEN
     573     DO k = 1, klev
     574      DO i = 1, klon
     575       IF ( pplay(i,k).LT.85000.) THEN
     576        tr_seri(i,k,id_pcq0) = MIN (qsat(i,k), tr_seri(i,k,id_pcq0))
     577       END IF
     578      END DO
     579     END DO
     580    END IF
    297581!======================================================================
    298582!   Calcul de l'effet du puits radioactif
     
    312596
    313597!======================================================================
     598!   Parameterization of ozone chemistry
     599!======================================================================
     600
     601    IF (id_o3 /= 0) then
     602       lmt_pas = NINT(86400./pdtphys)
     603       IF (MOD(nstep - 1, lmt_pas) == 0) THEN
     604          ! Once per day, update the coefficients for ozone chemistry:
     605          CALL regr_pr_comb_coefoz(julien, xlat, paprs, pplay)
     606       END IF
     607       CALL o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, xlat, &
     608            xlon, tr_seri(:, :, id_o3))
     609    END IF
     610
     611!======================================================================
    314612!   Calcul de cycle de carbon
    315613!======================================================================
     
    327625    USE infotrac
    328626   
    329     IMPLICIT NONE
    330    
    331627    REAL,DIMENSION(klon,nbtr), INTENT(OUT) :: trs_out
    332628    INTEGER :: ierr
Note: See TracChangeset for help on using the changeset viewer.