/[lmdze]/trunk/dyn3d/advtrac.f
ViewVC logotype

Contents of /trunk/dyn3d/advtrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 254 - (show annotations)
Mon Feb 5 10:39:38 2018 UTC (6 years, 3 months ago) by guez
File size: 4475 byte(s)
Move Sources/* to root directory.
1 module advtrac_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE advtrac(pbaru, pbarv, p, masse, q, iapptrac, teta, pk)
8
9 ! From dyn3d/advtrac.F, version 1.4 2005/04/13 08:58:34
10 ! Author: F. Hourdin
11
12 USE comconst, ONLY : dtvr
13 USE conf_gcm_m, ONLY : iapp_tracvl
14 USE dimens_m, ONLY : jjm, llm, nqmx
15 use groupe_m, only: groupe
16 USE iniadvtrac_m, ONLY : iadv
17 use massbar_m, only: massbar
18 USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, llmp1
19 use vlsplt_m, only: vlsplt
20 use vlspltqs_m, only: vlspltqs
21
22 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
23 REAL, intent(in):: p(ip1jmp1, llmp1)
24 real, intent(in):: masse(ip1jmp1, llm)
25 REAL, intent(inout):: q(ip1jmp1, llm, nqmx)
26 INTEGER, intent(out):: iapptrac
27 real, intent(in):: teta(ip1jmp1, llm)
28 REAL, intent(in):: pk(ip1jmp1, llm)
29
30 ! Variables locales
31
32 REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
33 REAL, save:: pbaruc(ip1jmp1, llm), pbarvc(ip1jm, llm)
34 REAL, save:: massem(ip1jmp1, llm)
35 real zdp(ip1jmp1)
36 REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm)
37
38 INTEGER:: iadvtr = 0
39 INTEGER ij, l, iq
40 REAL zdpmin, zdpmax
41 EXTERNAL minmax
42
43 INTEGER indice, n
44 ! Pas de temps adaptatif pour que CFL < 1
45 REAL dtbon
46
47 !-----------------------------------------------------------
48
49 IF (iadvtr==0) THEN
50 CALL initial0(ijp1llm, pbaruc)
51 CALL initial0(ijmllm, pbarvc)
52 END IF
53
54 ! accumulation des flux de masse horizontaux
55 DO l = 1, llm
56 DO ij = 1, ip1jmp1
57 pbaruc(ij, l) = pbaruc(ij, l) + pbaru(ij, l)
58 END DO
59 DO ij = 1, ip1jm
60 pbarvc(ij, l) = pbarvc(ij, l) + pbarv(ij, l)
61 END DO
62 END DO
63
64 ! selection de la masse instantannee des mailles avant le transport.
65 IF (iadvtr==0) massem = masse
66
67 iadvtr = iadvtr + 1
68 iapptrac = iadvtr
69
70 ! Test pour savoir si on advecte a ce pas de temps
71 IF (iadvtr == iapp_tracvl) THEN
72 ! traitement des flux de masse avant advection.
73 ! 1. calcul de w
74 ! 2. groupement des mailles pres du pole.
75
76 CALL groupe(pbaruc, pbarvc, pbarug, pbarvg, wg)
77
78 ! test sur l'eventuelle creation de valeurs negatives de la masse
79 DO l = 1, llm - 1
80 DO ij = iip2 + 1, ip1jm
81 zdp(ij) = pbarug(ij-1, l) - pbarug(ij, l) - pbarvg(ij-iip1, l) + &
82 pbarvg(ij, l) + wg(ij, l+1) - wg(ij, l)
83 END DO
84 CALL scopy(jjm-1, zdp(iip1+iip1), iip1, zdp(iip2), iip1)
85 DO ij = iip2, ip1jm
86 zdp(ij) = zdp(ij)*dtvr/massem(ij, l)
87 END DO
88
89 CALL minmax(ip1jm-iip1, zdp(iip2), zdpmin, zdpmax)
90
91 IF (max(abs(zdpmin), abs(zdpmax))>0.5) THEN
92 PRINT *, 'WARNING DP/P l=', l, ' MIN:', zdpmin, ' MAX:', zdpmax
93 END IF
94 END DO
95
96 ! Advection proprement dite
97
98 ! Calcul des moyennes bas\'ees sur la masse
99 CALL massbar(massem, massebx, masseby)
100
101 ! Appel des sous programmes d'advection
102
103 DO iq = 1, nqmx
104 select case (iadv(iq))
105 case (10)
106 ! Schema de Van Leer I MUSCL
107 CALL vlsplt(q(:, :, iq), 2., massem, wg, pbarug, pbarvg, dtvr)
108 case (12)
109 ! Schema de Frederic Hourdin
110 ! Pas de temps adaptatif
111 CALL adaptdt(dtbon, n, pbarug, massem)
112 IF (n>1) THEN
113 WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
114 'n=', n
115 END IF
116 DO indice = 1, n
117 CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 1)
118 END DO
119 case (13)
120 ! Pas de temps adaptatif
121 CALL adaptdt(dtbon, n, pbarug, massem)
122 IF (n>1) THEN
123 WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, &
124 'n=', n
125 END IF
126 DO indice = 1, n
127 CALL advn(q(1, 1, iq), massem, wg, pbarug, pbarvg, dtbon, 2)
128 END DO
129 case (14)
130 ! Schema "pseudo amont" + test sur humidite specifique
131 ! pour la vapeur d'eau. F. Codron
132 CALL vlspltqs(q(1, 1, 1), 2., massem, wg, pbarug, pbarvg, dtvr, &
133 p, pk, teta)
134 END select
135 END DO
136
137 ! on reinitialise a zero les flux de masse cumules
138 iadvtr = 0
139 END IF
140
141 END SUBROUTINE advtrac
142
143 end module advtrac_m

  ViewVC Help
Powered by ViewVC 1.1.21