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/physiq.F

    r1398 r1403  
    4141      use conf_phys_m, only: conf_phys
    4242      use radlwsw_m, only: radlwsw
     43      USE control_mod
     44
    4345
    4446      IMPLICIT none
     
    99101#include "dimsoil.h"
    100102#include "clesphys.h"
    101 #include "control.h"
    102103#include "temps.h"
    103104#include "iniprint.h"
     
    216217      REAL d_ps(klon)
    217218      real da(klon,klev),phi(klon,klev,klev),mp(klon,klev)
     219!IM definition dynamique o_trac dans phys_output_open
     220!      type(ctrl_out) :: o_trac(nqtot)
    218221c
    219222cIM Amip2 PV a theta constante
     
    258261      CHARACTER*4 bb2
    259262      CHARACTER*2 bb3
    260 c
     263
    261264      real twriteSTD(klon,nlevSTD,nfiles)
    262265      real qwriteSTD(klon,nlevSTD,nfiles)
     
    473476c
    474477c cnameisccp
    475       CHARACTER *27 cnameisccp(lmaxm1,kmaxm1)
     478      CHARACTER *29 cnameisccp(lmaxm1,kmaxm1)
    476479cIM bad 151205     DATA cnameisccp/'pc< 50hPa, tau< 0.3',
    477480      DATA cnameisccp/'pc= 50-180hPa, tau< 0.3',
     
    639642      REAL q_undi(klon,klev)               ! humidite moyenne dans la zone non perturbee
    640643c
    641       REAL wake_pe(klon)              ! Wake potential energy - WAPE
     644cjyg
     645ccc      REAL wake_pe(klon)              ! Wake potential energy - WAPE
    642646
    643647      REAL wake_gfl(klon)             ! Gust Front Length
     
    655659      REAL dt_a(klon,klev)
    656660      REAL dq_a(klon,klev)
     661      REAL, SAVE :: alp_offset
     662c$OMP THREADPRIVATE(alp_offset)
     663
    657664c
    658665cRR:fin declarations poches froides
     
    660667
    661668      REAL zw2(klon,klev+1)
    662       REAL fraca(klon,klev+1)
     669      REAL fraca(klon,klev+1)       
     670      REAL ztv(klon,klev)
     671      REAL zpspsk(klon,klev)
     672      REAL ztla(klon,klev)
     673      REAL zthl(klon,klev)
    663674
    664675c Variables locales pour la couche limite (al1):
     
    12171228     .     iflag_thermals_ed,iflag_thermals_optflux,
    12181229c     nv flags pour la convection et les poches froides
    1219      .     iflag_coupl,iflag_clos,iflag_wake, read_climoz)
     1230     .     iflag_coupl,iflag_clos,iflag_wake, read_climoz,
     1231     &     alp_offset)
    12201232      call phys_state_var_init(read_climoz)
    12211233      call phys_output_var_init
     
    12391251c         pmflxr=0.
    12401252c         pmflxs=0.
    1241           itau_con=0
    1242         first=.false.
     1253
     1254        itau_con=0
     1255        first=.false.
    12431256
    12441257      endif  ! first
     
    12631276! Gestion calendrier : mise a jour du module phys_cal_mod
    12641277!
    1265 cIM     CALL phys_cal_update(jD_cur,jH_cur)
     1278c     CALL phys_cal_update(jD_cur,jH_cur)
    12661279
    12671280c
     
    13861399         ENDIF
    13871400c
    1388          IF (dtime*FLOAT(radpas).GT.21600..AND.cycle_diurne) THEN
     1401         IF (dtime*REAL(radpas).GT.21600..AND.cycle_diurne) THEN
    13891402           WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
    13901403           WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
     
    14961509     &                        type_ocean,iflag_pbl,ok_mensuel,ok_journe,
    14971510     &                        ok_hf,ok_instan,ok_LES,ok_ade,ok_aie,
    1498      &                        read_climoz, new_aod, aerosol_couple)
     1511     &                        read_climoz, new_aod, aerosol_couple
     1512     &                        )
    14991513c$OMP END MASTER
    15001514c$OMP BARRIER
     
    15581572         CALL VTb(VTinca)
    15591573!         iii = MOD(NINT(xjour),360)
    1560 !         calday = FLOAT(iii) + jH_cur
    1561          calday = FLOAT(days_elapsed) + jH_cur
     1574!         calday = REAL(iii) + jH_cur
     1575         calday = REAL(days_elapsed) + jH_cur
    15621576         WRITE(lunout,*) 'initial time chemini', days_elapsed, calday
    15631577
     
    18411855!   solarlong0
    18421856        if (solarlong0<-999.) then
    1843            CALL orbite(FLOAT(days_elapsed+1),zlongi,dist)
     1857           CALL orbite(REAL(days_elapsed+1),zlongi,dist)
    18441858        else
    18451859           zlongi=solarlong0  ! longitude solaire vraie
     
    18521866!  Avec ou sans cycle diurne
    18531867      IF (cycle_diurne) THEN
    1854         zdtime=dtime*FLOAT(radpas) ! pas de temps du rayonnement (s)
     1868        zdtime=dtime*REAL(radpas) ! pas de temps du rayonnement (s)
    18551869        CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract)
    18561870      ELSE
     
    18621876        call writefield_phy('v_seri',v_seri,llm)
    18631877        call writefield_phy('t_seri',t_seri,llm)
    1864         call writefield_phy('q_seri',q_seri,llm)
     1878        call writefield_phy('q_seri',q_seri,llm)
    18651879      endif
    18661880
     
    19191933        call writefield_phy('v_seri',v_seri,llm)
    19201934        call writefield_phy('t_seri',t_seri,llm)
    1921         call writefield_phy('q_seri',q_seri,llm)
     1935        call writefield_phy('q_seri',q_seri,llm)
    19221936      endif
    19231937
     
    20012015
    20022016      IF (iflag_con.EQ.1) THEN
    2003           stop'reactiver le call conlmd dans physiq.F'
     2017        abort_message ='reactiver le call conlmd dans physiq.F'
     2018        CALL abort_gcm (modname,abort_message,1)
    20042019c     CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q,
    20052020c    .             d_t_con, d_q_con,
     
    20592074c
    20602075ccalcul de ale_wake et alp_wake
    2061        do i = 1,klon
    2062           if (iflag_wake.eq.1) then
    2063           ale_wake(i) = 0.5*wake_cstar(i)**2
    2064           alp_wake(i) = wake_fip(i)
    2065           else
    2066           ale_wake(i) = 0.
    2067           alp_wake(i) = 0.
    2068           endif
    2069        enddo
     2076       if (iflag_wake.eq.1) then
     2077         if (itap .le. it_wape_prescr) then
     2078          do i = 1,klon
     2079           ale_wake(i) = wape_prescr
     2080           alp_wake(i) = fip_prescr
     2081          enddo
     2082         else
     2083          do i = 1,klon
     2084cjyg  ALE=WAPE au lieu de ALE = 1/2 Cstar**2
     2085ccc           ale_wake(i) = 0.5*wake_cstar(i)**2
     2086           ale_wake(i) = wake_pe(i)
     2087           alp_wake(i) = wake_fip(i)
     2088          enddo
     2089         endif
     2090       else
     2091         do i = 1,klon
     2092           ale_wake(i) = 0.
     2093           alp_wake(i) = 0.
     2094         enddo
     2095       endif
    20702096ccombinaison avec ale et alp de couche limite: constantes si pas de couplage, valeurs calculees
    20712097cdans le thermique sinon
    20722098       if (iflag_coupl.eq.0) then
    2073           if (debut) print*,'ALE et ALP imposes'
     2099          if (debut.and.prt_level.gt.9)
     2100     $                     WRITE(lunout,*)'ALE et ALP imposes'
    20742101          do i = 1,klon
    20752102con ne couple que ale
     
    20822109       else
    20832110         IF(prt_level>9)WRITE(lunout,*)'ALE et ALP couples au thermique'
    2084           do i = 1,klon
    2085               ALE(i) = max(ale_wake(i),Ale_bl(i))
    2086               ALP(i) = alp_wake(i) + Alp_bl(i)
    2087 c         write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i)
    2088 c         write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i)
    2089           enddo
     2111!         do i = 1,klon
     2112!             ALE(i) = max(ale_wake(i),Ale_bl(i))
     2113! avant        ALP(i) = alp_wake(i) + Alp_bl(i)
     2114!             ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb
     2115!         write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i)
     2116!         write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i)
     2117!         enddo
     2118
     2119!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     2120! Modif FH 2010/04/27. Sans doute temporaire.
     2121! Deux options pour le alp_offset : constant si >Â 0 ou proportionnel Ãa
     2122! w si <0
     2123!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     2124       do i = 1,klon
     2125          ALE(i) = max(ale_wake(i),Ale_bl(i))
     2126          if (alp_offset>=0.) then
     2127            ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb
     2128          else
     2129            ALP(i)=alp_wake(i)+Alp_bl(i)+alp_offset*min(omega(i,6),0.)
     2130            if (alp(i)<0.) then
     2131               print*,'ALP ',alp(i),alp_wake(i)
     2132     s         ,Alp_bl(i),alp_offset*min(omega(i,6),0.)
     2133            endif
     2134          endif
     2135       enddo
     2136!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     2137
    20902138       endif
    20912139       do i=1,klon
     
    22242272        call writefield_phy('v_seri',v_seri,llm)
    22252273        call writefield_phy('t_seri',t_seri,llm)
    2226         call writefield_phy('q_seri',q_seri,llm)
     2274        call writefield_phy('q_seri',q_seri,llm)
    22272275      endif
    22282276
     
    22462294          za = 0.0
    22472295          DO i = 1, klon
    2248             za = za + airephy(i)/FLOAT(klon)
     2296            za = za + airephy(i)/REAL(klon)
    22492297            zx_t = zx_t + (rain_con(i)+
    2250      .                   snow_con(i))*airephy(i)/FLOAT(klon)
     2298     .                   snow_con(i))*airephy(i)/REAL(klon)
    22512299          ENDDO
    22522300          zx_t = zx_t/za*dtime
     
    23282376
    23292377      endif
     2378c
     2379c===================================================================
     2380cJYG
     2381      IF (ip_ebil_phy.ge.2) THEN
     2382        ztit='after wake'
     2383        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
     2384     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
     2385     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
     2386        call diagphy(airephy,ztit,ip_ebil_phy
     2387     e      , zero_v, zero_v, zero_v, zero_v, zero_v
     2388     e      , zero_v, zero_v, zero_v, ztsol
     2389     e      , d_h_vcol, d_qt, d_ec
     2390     s      , fs_bound, fq_bound )
     2391      END IF
     2392
    23302393c      print*,'apres callwake iflag_cldcon=', iflag_cldcon
    23312394c
     
    23472410      clwcon0th(:,:)=0.
    23482411c
    2349       fm_therm(:,:)=0.
    2350       entr_therm(:,:)=0.
    2351       detr_therm(:,:)=0.
     2412c      fm_therm(:,:)=0.
     2413c      entr_therm(:,:)=0.
     2414c      detr_therm(:,:)=0.
    23522415c
    23532416      IF(prt_level>9)WRITE(lunout,*)
     
    23772440     s      ,ratqsdiff,zqsatth
    23782441con rajoute ale et alp, et les caracteristiques de la couche alim
    2379      s      ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca)
     2442     s      ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca
     2443     s      ,ztv,zpspsk,ztla,zthl)
     2444
     2445! ----------------------------------------------------------------------
     2446! Transport de la TKE par les panaches thermiques.
     2447! FH : 2010/02/01
     2448      if (iflag_pbl.eq.10) then
     2449      call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,
     2450     s           rg,paprs,pbl_tke)
     2451      endif
     2452! ----------------------------------------------------------------------
     2453
    23802454         endif
     2455
    23812456
    23822457
     
    24302505     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
    24312506     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
     2507        call diagphy(airephy,ztit,ip_ebil_phy
     2508     e      , zero_v, zero_v, zero_v, zero_v, zero_v
     2509     e      , zero_v, zero_v, zero_v, ztsol
     2510     e      , d_h_vcol, d_qt, d_ec
     2511     s      , fs_bound, fq_bound )
    24322512      END IF
    24332513
     
    24782558         enddo
    24792559         tau_overturning_th(:)=zmax_th(:)/max(0.5*wmax_th(:),0.1)
    2480          print*,'TAU TH OK ',tau_overturning_th(1),detr_therm(1,3)
     2560         if(prt_level.ge.9)
     2561     &     write(lunout,*)'TAU TH OK ',
     2562     &     tau_overturning_th(1),detr_therm(1,3)
    24812563
    24822564c On impose que l'air autour de la fraction couverte par le thermique
     
    25892671
    25902672!   les ratqs sont une combinaison de ratqss et ratqsc
    2591 !       print*,'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs
     2673       if(prt_level.ge.9)
     2674     $       write(lunout,*)'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs
    25922675
    25932676         if (tau_ratqs>1.e-10) then
     
    26202703     .           pfrac_impa, pfrac_nucl, pfrac_1nucl,
    26212704     .           frac_impa, frac_nucl,
    2622      .           prfl, psfl, rhcl)
     2705     .           prfl, psfl, rhcl,
     2706     .           zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cldcon )
    26232707
    26242708      WHERE (rain_lsc < 0) rain_lsc = 0.
     
    26402724         za = 0.0
    26412725         DO i = 1, klon
    2642             za = za + airephy(i)/FLOAT(klon)
     2726            za = za + airephy(i)/REAL(klon)
    26432727            zx_t = zx_t + (rain_lsc(i)
    2644      .                  + snow_lsc(i))*airephy(i)/FLOAT(klon)
     2728     .                  + snow_lsc(i))*airephy(i)/REAL(klon)
    26452729        ENDDO
    26462730         zx_t = zx_t/za*dtime
     
    26642748        call writefield_phy('v_seri',v_seri,llm)
    26652749        call writefield_phy('t_seri',t_seri,llm)
    2666         call writefield_phy('q_seri',q_seri,llm)
     2750        call writefield_phy('q_seri',q_seri,llm)
    26672751      endif
    26682752
     
    27412825     &        tausum_aero, tau3d_aero)
    27422826      ELSE
     2827cIM 170310 BEG
     2828         tausum_aero(:,:,:) = 0.
     2829cIM 170310 END
    27432830         tau_aero(:,:,:,:) = 0.
    27442831         piz_aero(:,:,:,:) = 0.
     
    28132900     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
    28142901     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
     2902        call diagphy(airephy,ztit,ip_ebil_phy
     2903     e      , zero_v, zero_v, zero_v, zero_v, zero_v
     2904     e      , zero_v, zero_v, zero_v, ztsol
     2905     e      , d_h_vcol, d_qt, d_ec
     2906     s      , fs_bound, fq_bound )
    28152907      END IF
    28162908c
     
    28452937       IF (thermcep) THEN
    28462938        IF(zt2m(i).LT.RTT) then
    2847         Lheat=RLSTT
    2848         ELSE
    2849         Lheat=RLVTT
     2939        Lheat=RLSTT
     2940        ELSE
     2941        Lheat=RLVTT
    28502942        ENDIF
    28512943       ELSE
     
    28532945         Lheat=RLSTT
    28542946        ELSE
    2855         Lheat=RLVTT
     2947        Lheat=RLVTT
    28562948        ENDIF
    28572949       ENDIF
     
    28642956         CALL VTe(VTphysiq)
    28652957         CALL VTb(VTinca)
    2866          calday = FLOAT(days_elapsed + 1) + jH_cur
     2958         calday = REAL(days_elapsed + 1) + jH_cur
    28672959
    28682960         call chemtime(itap+itau_phy-1, date0, dtime)
     
    29083000     $                          cdragm,
    29093001     $                          pctsrf,
    2910      $                          pdtphys,
    2911      $                          itap)
     3002     $                          pdtphys,
     3003     $                            itap)
    29123004
    29133005         CALL VTe(VTinca)
     
    29643056        call writefield_phy('v_seri',v_seri,llm)
    29653057        call writefield_phy('t_seri',t_seri,llm)
    2966         call writefield_phy('q_seri',q_seri,llm)
     3058       call writefield_phy('q_seri',q_seri,llm)
    29673059      endif
    29683060     
     
    30203112      itaprad = itaprad + 1
    30213113
    3022       if (iflag_radia.eq.0) then
     3114      if (iflag_radia.eq.0 .and. prt_level.ge.9) then
    30233115      print *,'--------------------------------------------------'
    30243116      print *,'>>>> ATTENTION rayonnement desactive pour ce cas'
     
    30433135        call writefield_phy('v_seri',v_seri,llm)
    30443136        call writefield_phy('t_seri',t_seri,llm)
    3045         call writefield_phy('q_seri',q_seri,llm)
     3137        call writefield_phy('q_seri',q_seri,llm)
    30463138      endif
    30473139 
     
    31243216        call writefield_phy('v_seri',v_seri,llm)
    31253217        call writefield_phy('t_seri',t_seri,llm)
    3126         call writefield_phy('q_seri',q_seri,llm)
     3218        call writefield_phy('q_seri',q_seri,llm)
    31273219      endif
    31283220     
     
    31883280        call writefield_phy('v_seri',v_seri,llm)
    31893281        call writefield_phy('t_seri',t_seri,llm)
    3190         call writefield_phy('q_seri',q_seri,llm)
     3282        call writefield_phy('q_seri',q_seri,llm)
    31913283      endif
    31923284
     
    32233315     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
    32243316     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
     3317         call diagphy(airephy,ztit,ip_ebil_phy
     3318     e      , zero_v, zero_v, zero_v, zero_v, zero_v
     3319     e      , zero_v, zero_v, zero_v, ztsol
     3320     e      , d_h_vcol, d_qt, d_ec
     3321     s      , fs_bound, fq_bound )
    32253322      END IF
    32263323c
     
    32923389      IF (offline) THEN
    32933390
    3294          print*,'Attention on met a 0 les thermiques pour phystoke'
     3391       IF (prt_level.ge.9)
     3392     $    print*,'Attention on met a 0 les thermiques pour phystoke'
    32953393         call phystokenc (
    32963394     I                   nlon,klev,pdtphys,rlon,rlat,
     
    34003498c
    34013499cIM initialisation 5eme fichier de sortie
     3500cIM ajoute 5eme niveau 170310 BEG
    34023501      twriteSTD(:,:,5)=tlevSTD(:,:)
    34033502      qwriteSTD(:,:,5)=qlevSTD(:,:)
     
    34843583        call writefield_phy('v_seri',v_seri,llm)
    34853584        call writefield_phy('t_seri',t_seri,llm)
    3486         call writefield_phy('q_seri',q_seri,llm)
     3585        call writefield_phy('q_seri',q_seri,llm)
    34873586      endif
    34883587
Note: See TracChangeset for help on using the changeset viewer.