9 |
! From dyn3d/advtrac.F, version 1.4 2005/04/13 08:58:34 |
! From dyn3d/advtrac.F, version 1.4 2005/04/13 08:58:34 |
10 |
! Author: F. Hourdin |
! Author: F. Hourdin |
11 |
|
|
|
USE dimens_m, ONLY : iim, jjm, llm, nqmx |
|
|
USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, & |
|
|
llmp1 |
|
12 |
USE comconst, ONLY : dtvr |
USE comconst, ONLY : dtvr |
13 |
USE conf_gcm_m, ONLY : iapp_tracvl |
USE conf_gcm_m, ONLY : iapp_tracvl |
14 |
|
USE dimens_m, ONLY : iim, jjm, llm, nqmx |
15 |
USE iniadvtrac_m, ONLY : iadv |
USE iniadvtrac_m, ONLY : iadv |
16 |
|
use interpre_m, only: interpre |
17 |
|
use massbar_m, only: massbar |
18 |
|
USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, & |
19 |
|
llmp1 |
20 |
|
use vlspltqs_m, only: vlspltqs |
21 |
|
|
22 |
! Arguments |
REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) |
|
|
|
|
INTEGER iapptrac |
|
|
REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) |
|
|
REAL, intent(inout):: q(ip1jmp1, llm, nqmx) |
|
|
real masse(ip1jmp1, llm) |
|
23 |
REAL, intent(in):: p(ip1jmp1, llmp1) |
REAL, intent(in):: p(ip1jmp1, llmp1) |
24 |
real teta(ip1jmp1, llm) |
real, intent(in):: masse(ip1jmp1, llm) |
25 |
REAL pk(ip1jmp1, llm) |
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 |
! Variables locales |
31 |
|
|
34 |
REAL, save:: massem(ip1jmp1, llm) |
REAL, save:: massem(ip1jmp1, llm) |
35 |
real zdp(ip1jmp1) |
real zdp(ip1jmp1) |
36 |
REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm) |
REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm) |
|
REAL cpuadv(nqmx) |
|
37 |
|
|
38 |
INTEGER:: iadvtr = 0 |
INTEGER:: iadvtr = 0 |
39 |
INTEGER ij, l, iq |
INTEGER ij, l, iq |
72 |
END DO |
END DO |
73 |
|
|
74 |
! selection de la masse instantannee des mailles avant le transport. |
! selection de la masse instantannee des mailles avant le transport. |
75 |
IF (iadvtr==0) THEN |
IF (iadvtr==0) massem = masse |
|
CALL scopy(ip1jmp1*llm, masse, 1, massem, 1) |
|
|
END IF |
|
76 |
|
|
77 |
iadvtr = iadvtr + 1 |
iadvtr = iadvtr + 1 |
78 |
iapptrac = iadvtr |
iapptrac = iadvtr |
79 |
|
|
80 |
! Test pour savoir si on advecte a ce pas de temps |
! Test pour savoir si on advecte a ce pas de temps |
81 |
IF (iadvtr==iapp_tracvl) THEN |
IF (iadvtr == iapp_tracvl) THEN |
82 |
! traitement des flux de masse avant advection. |
! traitement des flux de masse avant advection. |
83 |
! 1. calcul de w |
! 1. calcul de w |
84 |
! 2. groupement des mailles pres du pole. |
! 2. groupement des mailles pres du pole. |
85 |
|
|
86 |
CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg) |
CALL groupe(pbaruc, pbarvc, pbarug, pbarvg, wg) |
87 |
|
|
88 |
! test sur l'eventuelle creation de valeurs negatives de la masse |
! test sur l'eventuelle creation de valeurs negatives de la masse |
89 |
DO l = 1, llm - 1 |
DO l = 1, llm - 1 |
105 |
|
|
106 |
! Advection proprement dite |
! Advection proprement dite |
107 |
|
|
108 |
! Calcul des moyennes basées sur la masse |
! Calcul des moyennes bas\'ees sur la masse |
109 |
CALL massbar(massem, massebx, masseby) |
CALL massbar(massem, massebx, masseby) |
110 |
|
|
111 |
! Appel des sous programmes d'advection |
! Appel des sous programmes d'advection |
125 |
! Schema de Frederic Hourdin |
! Schema de Frederic Hourdin |
126 |
ELSE IF (iadv(iq)==12) THEN |
ELSE IF (iadv(iq)==12) THEN |
127 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
128 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
129 |
IF (n>1) THEN |
IF (n>1) THEN |
130 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
131 |
'n=', n |
'n=', n |
135 |
END DO |
END DO |
136 |
ELSE IF (iadv(iq)==13) THEN |
ELSE IF (iadv(iq)==13) THEN |
137 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
138 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
139 |
IF (n>1) THEN |
IF (n>1) THEN |
140 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
141 |
'n=', n |
'n=', n |
149 |
! Schema de Prather |
! Schema de Prather |
150 |
ELSE IF (iadv(iq)==30) THEN |
ELSE IF (iadv(iq)==30) THEN |
151 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
152 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
153 |
IF (n>1) THEN |
IF (n>1) THEN |
154 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
155 |
'n=', n |
'n=', n |
159 |
ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN |
ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN |
160 |
! Test sur le flux horizontal |
! Test sur le flux horizontal |
161 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
162 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
163 |
IF (n>1) THEN |
IF (n>1) THEN |
164 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
165 |
'n=', n |
'n=', n |