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 massbar_m, only: massbar |
17 |
|
USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, & |
18 |
|
llmp1 |
19 |
|
|
20 |
! 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) |
|
21 |
REAL, intent(in):: p(ip1jmp1, llmp1) |
REAL, intent(in):: p(ip1jmp1, llmp1) |
22 |
|
real, intent(in):: masse(ip1jmp1, llm) |
23 |
|
REAL, intent(inout):: q(ip1jmp1, llm, nqmx) |
24 |
|
INTEGER, intent(out):: iapptrac |
25 |
real, intent(in):: teta(ip1jmp1, llm) |
real, intent(in):: teta(ip1jmp1, llm) |
26 |
REAL pk(ip1jmp1, llm) |
REAL, intent(in):: pk(ip1jmp1, llm) |
27 |
|
|
28 |
! Variables locales |
! Variables locales |
29 |
|
|
32 |
REAL, save:: massem(ip1jmp1, llm) |
REAL, save:: massem(ip1jmp1, llm) |
33 |
real zdp(ip1jmp1) |
real zdp(ip1jmp1) |
34 |
REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm) |
REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm) |
|
REAL cpuadv(nqmx) |
|
35 |
|
|
36 |
INTEGER:: iadvtr = 0 |
INTEGER:: iadvtr = 0 |
37 |
INTEGER ij, l, iq |
INTEGER ij, l, iq |
70 |
END DO |
END DO |
71 |
|
|
72 |
! selection de la masse instantannee des mailles avant le transport. |
! selection de la masse instantannee des mailles avant le transport. |
73 |
IF (iadvtr==0) THEN |
IF (iadvtr==0) massem = masse |
|
CALL scopy(ip1jmp1*llm, masse, 1, massem, 1) |
|
|
END IF |
|
74 |
|
|
75 |
iadvtr = iadvtr + 1 |
iadvtr = iadvtr + 1 |
76 |
iapptrac = iadvtr |
iapptrac = iadvtr |
77 |
|
|
78 |
! Test pour savoir si on advecte a ce pas de temps |
! Test pour savoir si on advecte a ce pas de temps |
79 |
IF (iadvtr==iapp_tracvl) THEN |
IF (iadvtr == iapp_tracvl) THEN |
80 |
! traitement des flux de masse avant advection. |
! traitement des flux de masse avant advection. |
81 |
! 1. calcul de w |
! 1. calcul de w |
82 |
! 2. groupement des mailles pres du pole. |
! 2. groupement des mailles pres du pole. |
123 |
! Schema de Frederic Hourdin |
! Schema de Frederic Hourdin |
124 |
ELSE IF (iadv(iq)==12) THEN |
ELSE IF (iadv(iq)==12) THEN |
125 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
126 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
127 |
IF (n>1) THEN |
IF (n>1) THEN |
128 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
129 |
'n=', n |
'n=', n |
133 |
END DO |
END DO |
134 |
ELSE IF (iadv(iq)==13) THEN |
ELSE IF (iadv(iq)==13) THEN |
135 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
136 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
137 |
IF (n>1) THEN |
IF (n>1) THEN |
138 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
139 |
'n=', n |
'n=', n |
147 |
! Schema de Prather |
! Schema de Prather |
148 |
ELSE IF (iadv(iq)==30) THEN |
ELSE IF (iadv(iq)==30) THEN |
149 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
150 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
151 |
IF (n>1) THEN |
IF (n>1) THEN |
152 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
153 |
'n=', n |
'n=', n |
157 |
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 |
158 |
! Test sur le flux horizontal |
! Test sur le flux horizontal |
159 |
! Pas de temps adaptatif |
! Pas de temps adaptatif |
160 |
CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) |
CALL adaptdt(dtbon, n, pbarug, massem) |
161 |
IF (n>1) THEN |
IF (n>1) THEN |
162 |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & |
163 |
'n=', n |
'n=', n |