/[lmdze]/trunk/Sources/dyn3d/iniadvtrac.f
ViewVC logotype

Diff of /trunk/Sources/dyn3d/iniadvtrac.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/iniadvtrac.f90 revision 23 by guez, Mon Dec 14 15:25:16 2009 UTC trunk/dyn3d/iniadvtrac.f revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC
# Line 1  Line 1 
1  module iniadvtrac_m  module iniadvtrac_m
2    
3    ! From advtrac.h, v 1.1.1.1 2004/05/19 12:53:06    ! From advtrac.h, version 1.1.1.1 2004/05/19 12:53:06
4    
5      ! iq = 1 pour l'eau vapeur
6      ! iq = 2 pour l'eau liquide
7      ! et éventuellement iq = 3, ..., nqmx pour les autres traceurs
8    
9    use dimens_m, only: nqmx    use dimens_m, only: nqmx
10    
# Line 8  module iniadvtrac_m Line 12  module iniadvtrac_m
12    
13    private nqmx    private nqmx
14    
15    INTEGER iadv(nqmx) ! indice schema de transport    INTEGER iadv(nqmx) ! indice du schéma d'advection pour l'eau et les traceurs
16    INTEGER hadv(nqmx) ! indice schema transport horizontal    ! 11 means Van-Leer scheme for hadv et monotonous PPM for vadv
17    INTEGER vadv(nqmx) ! indice schema transport vertical  
18    INTEGER niadv(nqmx) ! equivalent dyn / physique    integer, parameter:: allowed_adv(10) = (/0, 1, 2, 10, 12, 13, 14, 16, 17, 18/)
19      ! Allowed values for hadv and vadv:
20      ! 1: schema transport type "humidite specifique LMD"
21      ! 2: schema amont
22      ! 10: schema Van-leer (retenu pour l'eau vapeur et liquide)
23      ! 12: schema Frederic Hourdin I
24      ! 13: schema Frederic Hourdin II
25      ! 14: schema Van-leer + humidite specifique
26      ! 16: schema PPM Monotone(Collela & Woodward 1984)
27      ! 17: schema PPM Semi Monotone (overshoots autorisés)
28      ! 18: schema PPM Positif Defini (overshoots undershoots autorisés)
29      ! Pour Van-Leer plus vapeur d'eau saturée : iadv(1)=4
30    
31      INTEGER hadv(nqmx) ! indice schéma transport horizontal
32      INTEGER vadv(nqmx) ! indice schéma transport vertical
33      INTEGER niadv(nqmx) ! équivalent dynamique / physique
34    character(len=8) tnom(nqmx) ! nom court du traceur    character(len=8) tnom(nqmx) ! nom court du traceur
35    character(len=10) tname(nqmx) ! nom du traceur pour restart    character(len=10) tname(nqmx) ! nom du traceur pour restart
36    character(len=13) ttext(nqmx) ! nom long du traceur pour sorties    character(len=13) ttext(nqmx) ! nom long du traceur pour sorties
# Line 22  contains Line 41  contains
41    
42      ! From dyn3d/iniadvtrac.F, version 1.3 2005/04/13 08:58:34      ! From dyn3d/iniadvtrac.F, version 1.3 2005/04/13 08:58:34
43    
44      ! Authors :  P. Le Van, L. Fairhead, F. Hourdin      ! Authors: P. Le Van, L. Fairhead, F. Hourdin, F. Codron,
45      ! Modification spéciale traceur F. Forget 05/94      ! F. Forget, M.-A. Filiberti
     ! Modification M.-A. Filiberti 02/02 lecture de "traceur.def"  
     ! Modification de l'intégration de "q" (26/04/94)  
46    
47      use numer_rec, only: assert      use nr_util, only: assert
48        use jumble, only: new_unit
49    
50      ! Variables local to the procedure:      ! Variables local to the procedure:
51    
52      character(len=3) descrq(30)      character(len=3) descrq(18)
53      character:: txts(3) = (/'x', 'y', 'z'/)      integer iq, iostat, nq_local, unit
     character(len=2) txtp(9)  
     character(len=13) str1, str2  
   
     integer iq, iiq, iiiq, ierr, ii, nq_local  
   
     data txtp/'x', 'y', 'z', 'xx', 'xy', 'xz', 'yy', 'yz', 'zz'/  
54    
55      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
56    
57      print *, "Call sequence information: iniadvtrac"      print *, "Call sequence information: iniadvtrac"
58    
59      ! Initializations:      ! Initializations:
     descrq(14)='VLH'  
60      descrq(10)='VL1'      descrq(10)='VL1'
61      descrq(11)='VLP'      descrq(11)='VLP'
62      descrq(12)='FH1'      descrq(12)='FH1'
63      descrq(13)='FH2'      descrq(13)='FH2'
64        descrq(14)='VLH'
65      descrq(16)='PPM'      descrq(16)='PPM'
66      descrq(17)='PPS'      descrq(17)='PPS'
67      descrq(18)='PPP'      descrq(18)='PPP'
     descrq(20)='SLP'  
     descrq(30)='PRA'  
   
     !        Choix  des schemas d'advection pour l'eau et les traceurs  
   
     ! iadv = 1    schema  transport type "humidite specifique LMD"  
     ! iadv = 2    schema   amont  
     ! iadv = 14    schema  Van-leer + humidite specifique  
     !                        Modif F.Codron  
     ! iadv = 10   schema  Van-leer (retenu pour l'eau vapeur et liquide)  
     ! iadv = 11 schema Van-Leer pour hadv et version PPM (Monotone)  
     !           pour vadv  
     ! iadv = 12   schema  Frederic Hourdin I  
     ! iadv = 13   schema  Frederic Hourdin II  
     ! iadv = 16   schema  PPM Monotone(Collela & Woodward 1984)  
     ! iadv = 17   schema  PPM Semi Monotone (overshoots autorisés)  
     ! iadv = 18   schema  PPM Positif Defini (overshoots undershoots autorisés)  
     ! iadv = 20   schema  Slopes  
     ! iadv = 30   schema  Prather  
   
     !    Dans le tableau q(ij, l, iq) : iq = 1  pour l'eau vapeur  
     !                                 iq = 2  pour l'eau liquide  
     !    Et éventuellement            iq = 3, nqmx pour les autres traceurs  
   
     !    iadv(1): choix pour l'eau vap. et  iadv(2) : choix pour l'eau liq.  
   
     ! Choix du schema d'advection  
     ! choix par defaut = van leer pour tous les traceurs  
     do iq=1, nqmx  
        iadv(iq)=10  
        str1(1:1)='q'  
        if (nqmx.le.99) then  
           WRITE(str1(2:3), '(i2.2)') iq  
        else  
           WRITE(str1(2:4), '(i3.3)') iq  
        endif  
        tnom(iq)=str1  
        tname(iq)=tnom(iq)  
        str2=tnom(iq)  
        ttext(iq) = trim(str2) // descrq(iadv(iq))  
     end do  
68    
69      ! Choix du schema pour l'advection dans fichier "traceur.def"      ! Choix du schéma pour l'advection dans fichier "traceur.def"
70        call new_unit(unit)
71      open(unit=90, file='traceur.def', form='formatted', status='old', &      open(unit, file='traceur.def', status='old', action="read", &
72           iostat=ierr)           position="rewind", iostat=iostat)
73      if (ierr == 0) then      if (iostat == 0) then
74         print *, 'Ouverture de "traceur.def" ok'         print *, 'Ouverture de "traceur.def" ok'
75         read(unit=90, fmt=*) nq_local         read(unit, fmt=*) nq_local
76         print *, 'nombre de traceurs ', nq_local         print *, 'nombre de traceurs ', nq_local
77         call assert(nq_local == nqmx, "iniadvtrac nq_local")         call assert(nq_local == nqmx, "iniadvtrac nq_local")
78    
79         do iq=1, nqmx         do iq=1, nqmx
80            read(90, 999) hadv(iq), vadv(iq), tnom(iq)            read(unit, fmt=*) hadv(iq), vadv(iq), tnom(iq)
81         end do            if (.not. any(hadv(iq) == allowed_adv) &
82         close(90)                   .or. .not. any(vadv(iq) == allowed_adv)) then
83         PRINT *, 'lecture de traceur.def :'                 print *, "bad number for advection scheme"
84         do iq=1, nqmx               stop 1
85            write(*, *) hadv(iq), vadv(iq), tnom(iq)            end if
86         end do         end do
87           close(unit)
88      else      else
89         print *, 'Problème à l''ouverture de "traceur.def"'         print *, 'Problème à l''ouverture de "traceur.def"'
90         print *, 'Attention : on prend des valeurs par défaut.'         print *, 'Attention : on prend des valeurs par défaut.'
91         call assert(nqmx == 4, "iniadvtrac nqmx")         call assert(nqmx == 4, "iniadvtrac nqmx")
92         hadv(1) = 14         hadv(:4) = (/14, 10, 10, 10/)
93         vadv(1) = 14         vadv(:4) = hadv(:4)
94         tnom(1) = 'H2Ov'         tnom(1) = 'H2Ov'
        hadv(2) = 10  
        vadv(2) = 10  
95         tnom(2) = 'H2Ol'         tnom(2) = 'H2Ol'
        hadv(3) = 10  
        vadv(3) = 10  
96         tnom(3) = 'RN'         tnom(3) = 'RN'
        hadv(4) = 10  
        vadv(4) = 10  
97         tnom(4) = 'PB'         tnom(4) = 'PB'
98           do iq = 1, nqmx
99              print *, hadv(iq), vadv(iq), tnom(iq)
100           end do
101      ENDIF      ENDIF
102      PRINT *, 'Valeur de traceur.def :'  
103      do iq=1, nqmx      tname = tnom
        write(*, *) hadv(iq), vadv(iq), tnom(iq)  
     end do  
104    
105      ! À partir du nom court du traceur et du schéma d'advection, on      ! À partir du nom court du traceur et du schéma d'advection, on
106      ! détemine le nom long :      ! détermine le nom long :
107      iiq=0      do iq = 1, nqmx
     ii=0  
     do iq=1, nqmx  
        iiq=iiq+1  
108         if (hadv(iq) /= vadv(iq)) then         if (hadv(iq) /= vadv(iq)) then
109            if (hadv(iq) == 10.and.vadv(iq) == 16) then            if (hadv(iq) == 10 .and. vadv(iq) == 16) then
110               iadv(iiq)=11               iadv(iq) = 11
111            else            else
112               print *, 'le choix des schemas d''advection H et V'               print *, "Bad combination for hozizontal and vertical schemes."
113               print *, 'est non disponible actuellement'               stop 1
              stop  
114            endif            endif
115         else         else
116            iadv(iiq)=hadv(iq)            iadv(iq) = hadv(iq)
        endif  
        ! verification nombre de traceurs  
        if (iadv(iiq).lt.20) then  
           ii=ii+1  
        elseif (iadv(iiq) == 20) then  
           ii=ii+4  
        elseif (iadv(iiq) == 30) then  
           ii=ii+10  
117         endif         endif
118    
119         str1=tnom(iq)         IF (iadv(iq) == 0) THEN
120         tname(iiq)=tnom(iq)            ttext(iq) = tnom(iq)
        IF (iadv(iiq) == 0) THEN  
           ttext(iiq)=trim(str1)  
121         ELSE         ELSE
122            ttext(iiq)=trim(str1)//descrq(iadv(iiq))            ttext(iq)=trim(tnom(iq)) // descrq(iadv(iq))
        endif  
        str2=ttext(iiq)  
        !   schemas tenant compte des moments d'ordre superieur.  
        if (iadv(iiq) == 20) then  
           do iiiq=1, 3  
              iiq=iiq+1  
              iadv(iiq)=-20  
              ttext(iiq)=trim(str2)//txts(iiiq)  
              tname(iiq)=trim(str1)//txts(iiiq)  
           enddo  
        elseif (iadv(iiq) == 30) then  
           do iiiq=1, 9  
              iiq=iiq+1  
              iadv(iiq)=-30  
              ttext(iiq)=trim(str2)//txtp(iiiq)  
              tname(iiq)=trim(str1)//txtp(iiiq)  
           enddo  
        endif  
     end do  
     if (ii /= nqmx) then  
        print *, 'WARNING'  
        print *, 'le nombre de traceurs et de moments eventuels'  
        print *, 'est inferieur a nqmx '  
     endif  
     if (iiq > nqmx) then  
        print *, 'le choix des schemas est incompatible avec '  
        print *, 'la dimension nqmx (nombre de traceurs)'  
        print *, 'verifier traceur.def ou la namelist INCA'  
        print *, 'ou recompiler avec plus de traceurs'  
        stop  
     endif  
     iiq=0  
     do iq=1, nqmx  
        if (iadv(iq).ge.0) then  
           iiq=iiq+1  
           niadv(iiq)=iq  
123         endif         endif
124      end do      end do
125    
126  999 format (i2, 1x, i2, 1x, a8)      forall (iq = 1: nqmx) niadv(iq)=iq
127    
128    END subroutine iniadvtrac    END subroutine iniadvtrac
129    

Legend:
Removed from v.23  
changed lines
  Added in v.82

  ViewVC Help
Powered by ViewVC 1.1.21