--- trunk/libf/dyn3d/advtrac.f90 2011/02/22 13:49:36 40 +++ trunk/Sources/dyn3d/advtrac.f 2015/06/18 13:49:26 150 @@ -9,22 +9,23 @@ ! From dyn3d/advtrac.F, version 1.4 2005/04/13 08:58:34 ! Author: F. Hourdin - USE dimens_m, ONLY : iim, jjm, llm, nqmx - USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, & - llmp1 USE comconst, ONLY : dtvr USE conf_gcm_m, ONLY : iapp_tracvl + USE dimens_m, ONLY : iim, jjm, llm, nqmx USE iniadvtrac_m, ONLY : iadv + use interpre_m, only: interpre + use massbar_m, only: massbar + USE paramet_m, ONLY : iip1, iip2, ijmllm, ijp1llm, ip1jm, ip1jmp1, jjp1, & + llmp1 + use vlspltqs_m, only: vlspltqs - ! Arguments - - INTEGER iapptrac - REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) - REAL, intent(inout):: q(ip1jmp1, llm, nqmx) - real masse(ip1jmp1, llm) + REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) REAL, intent(in):: p(ip1jmp1, llmp1) - real teta(ip1jmp1, llm) - REAL pk(ip1jmp1, llm) + real, intent(in):: masse(ip1jmp1, llm) + REAL, intent(inout):: q(ip1jmp1, llm, nqmx) + INTEGER, intent(out):: iapptrac + real, intent(in):: teta(ip1jmp1, llm) + REAL, intent(in):: pk(ip1jmp1, llm) ! Variables locales @@ -33,7 +34,6 @@ REAL, save:: massem(ip1jmp1, llm) real zdp(ip1jmp1) REAL pbarug(ip1jmp1, llm), pbarvg(ip1jm, llm), wg(ip1jmp1, llm) - REAL cpuadv(nqmx) INTEGER:: iadvtr = 0 INTEGER ij, l, iq @@ -72,20 +72,18 @@ END DO ! selection de la masse instantannee des mailles avant le transport. - IF (iadvtr==0) THEN - CALL scopy(ip1jmp1*llm, masse, 1, massem, 1) - END IF + IF (iadvtr==0) massem = masse iadvtr = iadvtr + 1 iapptrac = iadvtr ! Test pour savoir si on advecte a ce pas de temps - IF (iadvtr==iapp_tracvl) THEN + IF (iadvtr == iapp_tracvl) THEN ! traitement des flux de masse avant advection. ! 1. calcul de w ! 2. groupement des mailles pres du pole. - CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg) + CALL groupe(pbaruc, pbarvc, pbarug, pbarvg, wg) ! test sur l'eventuelle creation de valeurs negatives de la masse DO l = 1, llm - 1 @@ -107,7 +105,7 @@ ! Advection proprement dite - ! Calcul des moyennes basées sur la masse + ! Calcul des moyennes bas\'ees sur la masse CALL massbar(massem, massebx, masseby) ! Appel des sous programmes d'advection @@ -127,7 +125,7 @@ ! Schema de Frederic Hourdin ELSE IF (iadv(iq)==12) THEN ! Pas de temps adaptatif - CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) + CALL adaptdt(dtbon, n, pbarug, massem) IF (n>1) THEN WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & 'n=', n @@ -137,7 +135,7 @@ END DO ELSE IF (iadv(iq)==13) THEN ! Pas de temps adaptatif - CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) + CALL adaptdt(dtbon, n, pbarug, massem) IF (n>1) THEN WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & 'n=', n @@ -151,7 +149,7 @@ ! Schema de Prather ELSE IF (iadv(iq)==30) THEN ! Pas de temps adaptatif - CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) + CALL adaptdt(dtbon, n, pbarug, massem) IF (n>1) THEN WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & 'n=', n @@ -161,7 +159,7 @@ ELSE IF (iadv(iq)==11 .OR. (iadv(iq)>=16 .AND. iadv(iq)<=18)) THEN ! Test sur le flux horizontal ! Pas de temps adaptatif - CALL adaptdt(iadv(iq), dtbon, n, pbarug, massem) + CALL adaptdt(dtbon, n, pbarug, massem) IF (n>1) THEN WRITE (*, *) 'WARNING horizontal dt=', dtbon, 'dtvr=', dtvr, & 'n=', n