! $Id: vlspltqs_loc.f90 5182 2024-09-10 14:25:29Z abarral $ SUBROUTINE vlxqs_loc(q, pente_max, masse, u_m, qsat, ijb_x, ije_x, iq) ! Auteurs: P.Le Van, F.Hourdin, F.Forget ! ******************************************************************** ! Shema d''advection " pseudo amont " . ! ******************************************************************** ! -------------------------------------------------------------------- USE parallel_lmdz USE lmdz_infotrac, ONLY: nqtot, tracers, & ! CRisi & min_qParent, min_qMass, min_ratio ! MVals et CRisi7 USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm USE lmdz_paramet IMPLICIT NONE ! ! Arguments: ! ---------- REAL :: masse(ijb_u:ije_u, llm, nqtot), pente_max REAL :: u_m(ijb_u:ije_u, llm) REAL :: q(ijb_u:ije_u, llm, nqtot) REAL :: qsat(ijb_u:ije_u, llm) INTEGER :: iq ! CRisi ! Local ! --------- INTEGER :: ij, l, j, i, iju, ijq, indu(ijnb_u), niju INTEGER :: n0, iadvplus(ijb_u:ije_u, llm), nl(llm) REAL :: new_m, zu_m, zdum(ijb_u:ije_u, llm) REAL :: dxq(ijb_u:ije_u, llm), dxqu(ijb_u:ije_u) REAL :: zz(ijb_u:ije_u) REAL :: adxqu(ijb_u:ije_u), dxqmax(ijb_u:ije_u, llm) REAL :: u_mq(ijb_u:ije_u, llm) REAL :: Ratio(ijb_u:ije_u, llm, nqtot) ! CRisi INTEGER :: ifils, iq2 ! CRisi INTEGER :: ijb, ije, ijb_x, ije_x !WRITE(*,*) 'vlspltqs 58: entree vlxqs_loc, iq,ijb_x=', ! & iq,ijb_x ! calcul de la pente a droite et a gauche de la maille ! ijb=ij_begin ! ije=ij_end ijb = ijb_x ije = ije_x IF (pole_nord.AND.ijb==1) ijb = ijb + iip1 IF (pole_sud.AND.ije==ip1jmp1) ije = ije - iip1 IF (pente_max>-1.e-5) THEN ! IF (pente_max.gt.10) THEN ! calcul des pentes avec limitation, Van Leer scheme I: ! ----------------------------------------------------- ! calcul de la pente aux points u !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije - 1 dxqu(ij) = q(ij + 1, l, iq) - q(ij, l, iq) ENDDO DO ij = ijb + iip1 - 1, ije, iip1 dxqu(ij) = dxqu(ij - iim) ! sigu(ij)=sigu(ij-iim) ENDDO DO ij = ijb, ije adxqu(ij) = abs(dxqu(ij)) ENDDO ! calcul de la pente maximum dans la maille en valeur absolue DO ij = ijb + 1, ije dxqmax(ij, l) = pente_max * & min(adxqu(ij - 1), adxqu(ij)) ! limitation subtile ! , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) ENDDO DO ij = ijb + iip1 - 1, ije, iip1 dxqmax(ij - iim, l) = dxqmax(ij, l) ENDDO DO ij = ijb + 1, ije IF(dxqu(ij - 1) * dxqu(ij)>0) THEN dxq(ij, l) = dxqu(ij - 1) + dxqu(ij) ELSE ! extremum local dxq(ij, l) = 0. ENDIF dxq(ij, l) = 0.5 * dxq(ij, l) dxq(ij, l) = & sign(min(abs(dxq(ij, l)), dxqmax(ij, l)), dxq(ij, l)) ENDDO ENDDO ! l=1,llm !$OMP END DO NOWAIT ELSE ! (pente_max.lt.-1.e-5) ! Pentes produits: ! ---------------- !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije - 1 dxqu(ij) = q(ij + 1, l, iq) - q(ij, l, iq) ENDDO DO ij = ijb + iip1 - 1, ije, iip1 dxqu(ij) = dxqu(ij - iim) ENDDO DO ij = ijb + 1, ije zz(ij) = dxqu(ij - 1) * dxqu(ij) zz(ij) = zz(ij) + zz(ij) IF(zz(ij)>0) THEN dxq(ij, l) = zz(ij) / (dxqu(ij - 1) + dxqu(ij)) ELSE ! extremum local dxq(ij, l) = 0. ENDIF ENDDO ENDDO !$OMP END DO NOWAIT ENDIF ! (pente_max.lt.-1.e-5) ! bouclage de la pente en iip1: ! ----------------------------- !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb + iip1 - 1, ije, iip1 dxq(ij - iim, l) = dxq(ij, l) ENDDO DO ij = ijb, ije iadvplus(ij, l) = 0 ENDDO ENDDO !$OMP END DO NOWAIT IF (pole_nord) THEN !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm iadvplus(1:iip1, l) = 0 ENDDO !$OMP END DO NOWAIT ENDIF IF (pole_sud) THEN !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm iadvplus(ip1jm + 1:ip1jmp1, l) = 0 ENDDO !$OMP END DO NOWAIT ENDIF ! calcul des flux a gauche et a droite ! on cumule le flux correspondant a toutes les mailles dont la masse ! au travers de la paroi pENDant le pas de temps. ! le rapport de melange de l''air advecte est min(q_vanleer, Qsat_downwind) !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije - 1 IF (u_m(ij, l)>0.) THEN zdum(ij, l) = 1. - u_m(ij, l) / masse(ij, l, iq) u_mq(ij, l) = u_m(ij, l) * & min(q(ij, l, iq) + 0.5 * zdum(ij, l) * dxq(ij, l), qsat(ij + 1, l)) ELSE zdum(ij, l) = 1. + u_m(ij, l) / masse(ij + 1, l, iq) u_mq(ij, l) = u_m(ij, l) * & min(q(ij + 1, l, iq) - 0.5 * zdum(ij, l) * dxq(ij + 1, l), qsat(ij, l)) ENDIF ENDDO ENDDO !$OMP END DO NOWAIT ! detection des points ou on advecte plus que la masse de la ! maille !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije - 1 IF(zdum(ij, l)<0) THEN iadvplus(ij, l) = 1 u_mq(ij, l) = 0. ENDIF ENDDO ENDDO !$OMP END DO NOWAIT !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb + iip1 - 1, ije, iip1 iadvplus(ij, l) = iadvplus(ij - iim, l) ENDDO ENDDO !$OMP END DO NOWAIT ! traitement special pour le cas ou on advecte en longitude plus que le ! contenu de la maille. ! cette partie est mal vectorisee. ! pas d'influence de la pression saturante (pour l'instant) ! calcul du nombre de maille sur lequel on advecte plus que la maille. n0 = 0 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm nl(l) = 0 DO ij = ijb, ije nl(l) = nl(l) + iadvplus(ij, l) ENDDO n0 = n0 + nl(l) ENDDO !$OMP END DO NOWAIT !ym ATTENTION ICI en OpenMP reduction pas forcement necessaire !ym IF(n0.gt.1) THEN !ym IF(n0.gt.0) THEN !cc PRINT*,'Nombre de points pour lesquels on advect plus que le' !cc & ,'contenu de la maille : ',n0 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm IF(nl(l)>0) THEN iju = 0 ! indicage des mailles concernees par le traitement special DO ij = ijb, ije IF(iadvplus(ij, l)==1.AND.mod(ij, iip1)/=0) THEN iju = iju + 1 indu(iju) = ij ENDIF ENDDO niju = iju !PRINT*,'vlxqs 280: niju,nl',niju,nl(l) ! traitement des mailles DO iju = 1, niju ij = indu(iju) j = (ij - 1) / iip1 + 1 zu_m = u_m(ij, l) u_mq(ij, l) = 0. IF(zu_m>0.) THEN ijq = ij i = ijq - (j - 1) * iip1 ! accumulation pour les mailles completements advectees DO while(zu_m>masse(ijq, l, iq)) u_mq(ij, l) = u_mq(ij, l) + q(ijq, l, iq) & * masse(ijq, l, iq) zu_m = zu_m - masse(ijq, l, iq) i = mod(i - 2 + iim, iim) + 1 ijq = (j - 1) * iip1 + i ENDDO ! ajout de la maille non completement advectee u_mq(ij, l) = u_mq(ij, l) + zu_m * (q(ijq, l, iq) & + 0.5 * (1. - zu_m / masse(ijq, l, iq)) * dxq(ijq, l)) ELSE ijq = ij + 1 i = ijq - (j - 1) * iip1 ! accumulation pour les mailles completements advectees DO while(-zu_m>masse(ijq, l, iq)) u_mq(ij, l) = u_mq(ij, l) - q(ijq, l, iq) & * masse(ijq, l, iq) zu_m = zu_m + masse(ijq, l, iq) i = mod(i, iim) + 1 ijq = (j - 1) * iip1 + i ENDDO ! ajout de la maille non completement advectee u_mq(ij, l) = u_mq(ij, l) + zu_m * (q(ijq, l, iq) - & 0.5 * (1. + zu_m / masse(ijq, l, iq)) * dxq(ijq, l)) ENDIF ENDDO ENDIF ENDDO !$OMP END DO NOWAIT !ym ENDIF ! n0.gt.0 ! bouclage en latitude !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb + iip1 - 1, ije, iip1 u_mq(ij, l) = u_mq(ij - iim, l) ENDDO ENDDO !$OMP END DO NOWAIT ! CRisi: appel recursif de l'advection sur les fils. ! Il faut faire ca avant d'avoir mis a jour q et masse !WRITE(*,*) 'vlspltqs 336: iq,ijb_x,nqChildren(iq)=', ! & iq,ijb_x,tracers(iq)%nqChildren DO ifils = 1, tracers(iq)%nqDescen iq2 = tracers(iq)%iqDescen(ifils) !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije !MVals: veiller a ce qu'on n'ait pas de denominateur nul masse(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) IF (q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) else Ratio(ij, l, iq2) = min_ratio endif enddo enddo !$OMP END DO NOWAIT enddo DO ifils = 1, tracers(iq)%nqChildren iq2 = tracers(iq)%iqDescen(ifils) !WRITE(*,*) 'vlxqs 349: on appelle vlx pour iq2=',iq2 CALL vlx_loc(Ratio, pente_max, masse, u_mq, ijb_x, ije_x, iq2) enddo ! end CRisi !WRITE(*,*) 'vlspltqs 360: iq,ijb_x=',iq,ijb_x ! calcul des tendances !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb + 1, ije !MVals: veiller a ce qu'on n'ait pas de denominateur nul new_m = max(masse(ij, l, iq) + u_m(ij - 1, l) - u_m(ij, l), min_qMass) q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + & u_mq(ij - 1, l) - u_mq(ij, l)) & / new_m masse(ij, l, iq) = new_m ENDDO ! Modif Fred 22 03 96 correction d''un bug (les scopy ci-dessous) DO ij = ijb + iip1 - 1, ije, iip1 q(ij - iim, l, iq) = q(ij, l, iq) masse(ij - iim, l, iq) = masse(ij, l, iq) ENDDO ENDDO !$OMP END DO NOWAIT !WRITE(*,*) 'vlspltqs 380: iq,ijb_x=',iq,ijb_x ! retablir les fils en rapport de melange par rapport a l'air: DO ifils = 1, tracers(iq)%nqDescen iq2 = tracers(iq)%iqDescen(ifils) !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb + 1, ije q(ij, l, iq2) = q(ij, l, iq) * Ratio(ij, l, iq2) enddo DO ij = ijb + iip1 - 1, ije, iip1 q(ij - iim, l, iq2) = q(ij, l, iq2) enddo ! DO ij=ijb+iip1-1,ije,iip1 enddo !$OMP END DO NOWAIT enddo !WRITE(*,*) 'vlspltqs 399: iq,ijb_x=',iq,ijb_x ! CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) ! CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1,iq),iip1,masse(iip2,1,iq),iip1) END SUBROUTINE vlxqs_loc SUBROUTINE vlyqs_loc(q, pente_max, masse, masse_adv_v, qsat, iq) ! Auteurs: P.Le Van, F.Hourdin, F.Forget ! ******************************************************************** ! Shema d'advection " pseudo amont " . ! ******************************************************************** ! q,masse_adv_v,w sont des arguments d'entree pour le s-pg .... ! qsat est un argument de sortie pour le s-pg .... ! -------------------------------------------------------------------- USE parallel_lmdz USE lmdz_infotrac, ONLY: nqtot, tracers, & ! CRisi & min_qParent, min_qMass, min_ratio ! MVals et CRisi USE comconst_mod, ONLY: pi USE lmdz_iniprint, ONLY: lunout, prt_level USE lmdz_ssum_scopy, ONLY: ssum USE lmdz_comgeom USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm USE lmdz_paramet IMPLICIT NONE ! ! Arguments: ! ---------- REAL :: masse(ijb_u:ije_u, llm, nqtot), pente_max REAL :: masse_adv_v(ijb_v:ije_v, llm) REAL :: q(ijb_u:ije_u, llm, nqtot) REAL :: qsat(ijb_u:ije_u, llm) INTEGER :: iq ! CRisi ! Local ! --------- INTEGER :: i, ij, l REAL :: airej2, airejjm, airescb(iim), airesch(iim) REAL :: dyq(ijb_u:ije_u, llm), dyqv(ijb_v:ije_v) REAL :: adyqv(ijb_v:ije_v), dyqmax(ijb_u:ije_u) REAL :: qbyv(ijb_v:ije_v, llm, nqtot) REAL :: qpns, qpsn, dyn1, dys1, dyn2, dys2, newmasse, fn, fs ! REAL newq,oldmasse Logical :: first SAVE first !$OMP THREADPRIVATE(first) REAL :: convpn, convps, convmpn, convmps REAL :: sinlon(iip1), sinlondlon(iip1) REAL :: coslon(iip1), coslondlon(iip1) SAVE sinlon, coslon, sinlondlon, coslondlon SAVE airej2, airejjm !$OMP THREADPRIVATE(sinlon,coslon,sinlondlon,coslondlon) !$OMP THREADPRIVATE(airej2,airejjm) REAL :: Ratio(ijb_u:ije_u, llm, nqtot) ! CRisi INTEGER :: ifils, iq2 ! CRisi DATA first/.TRUE./ INTEGER :: ijb, ije INTEGER :: ijbm, ijem ijb = ij_begin - 2 * iip1 ije = ij_end + 2 * iip1 IF (pole_nord) ijb = ij_begin IF (pole_sud) ije = ij_end ij = 3525 l = 3 IF ((ij>=ijb).AND.(ij<=ije)) THEN !WRITE(*,*) 'vlyqs 480: ij,l,iq,ijb,q(ij,l,:)=', ! & ij,l,iq,ijb,q(ij,l,:) ENDIF IF(first) THEN PRINT*, 'Shema Amont nouveau appele dans Vanleer ' PRINT*, 'vlyqs_loc, iq=', iq first = .FALSE. DO i = 2, iip1 coslon(i) = cos(rlonv(i)) sinlon(i) = sin(rlonv(i)) coslondlon(i) = coslon(i) * (rlonu(i) - rlonu(i - 1)) / pi sinlondlon(i) = sinlon(i) * (rlonu(i) - rlonu(i - 1)) / pi ENDDO coslon(1) = coslon(iip1) coslondlon(1) = coslondlon(iip1) sinlon(1) = sinlon(iip1) sinlondlon(1) = sinlondlon(iip1) airej2 = SSUM(iim, aire(iip2), 1) airejjm = SSUM(iim, aire(ip1jm - iim), 1) ENDIF ! !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm ! -------------------------------- ! CALCUL EN LATITUDE ! -------------------------------- ! On commence par calculer la valeur du traceur moyenne sur le premier cercle ! de latitude autour du pole (qpns pour le pole nord et qpsn pour ! le pole nord) qui sera utilisee pour evaluer les pentes au pole. IF (pole_nord) THEN DO i = 1, iim airescb(i) = aire(i + iip1) * q(i + iip1, l, iq) ENDDO qpns = SSUM(iim, airescb, 1) / airej2 ENDIF IF (pole_sud) THEN DO i = 1, iim airesch(i) = aire(i + ip1jm - iip1) * q(i + ip1jm - iip1, l, iq) ENDDO qpsn = SSUM(iim, airesch, 1) / airejjm ENDIF ! calcul des pentes aux points v ijb = ij_begin - 2 * iip1 ije = ij_end + iip1 IF (pole_nord) ijb = ij_begin IF (pole_sud) ije = ij_end - iip1 DO ij = ijb, ije dyqv(ij) = q(ij, l, iq) - q(ij + iip1, l, iq) adyqv(ij) = abs(dyqv(ij)) ENDDO ! calcul des pentes aux points scalaires ijb = ij_begin - iip1 ije = ij_end + iip1 IF (pole_nord) ijb = ij_begin + iip1 IF (pole_sud) ije = ij_end - iip1 DO ij = ijb, ije dyq(ij, l) = .5 * (dyqv(ij - iip1) + dyqv(ij)) dyqmax(ij) = min(adyqv(ij - iip1), adyqv(ij)) dyqmax(ij) = pente_max * dyqmax(ij) ENDDO IF (pole_nord) THEN ! calcul des pentes aux poles DO ij = 1, iip1 dyq(ij, l) = qpns - q(ij + iip1, l, iq) ENDDO ! filtrage de la derivee dyn1 = 0. dyn2 = 0. DO ij = 1, iim dyn1 = dyn1 + sinlondlon(ij) * dyq(ij, l) dyn2 = dyn2 + coslondlon(ij) * dyq(ij, l) ENDDO DO ij = 1, iip1 dyq(ij, l) = dyn1 * sinlon(ij) + dyn2 * coslon(ij) ENDDO ! calcul des pentes limites aux poles fn = 1. DO ij = 1, iim IF(pente_max * adyqv(ij)0.) THEN dyq(ij, l) = sign(min(abs(dyq(ij, l)), dyqmax(ij)), dyq(ij, l)) ELSE dyq(ij, l) = 0. ENDIF ENDDO ENDDO !$OMP END DO NOWAIT ijb = ij_begin - iip1 ije = ij_end IF (pole_nord) ijb = ij_begin IF (pole_sud) ije = ij_end - iip1 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije IF(masse_adv_v(ij, l)>0.) THEN qbyv(ij, l, iq) = MIN(qsat(ij + iip1, l), q(ij + iip1, l, iq) + & dyq(ij + iip1, l) * 0.5 * (1. - masse_adv_v(ij, l) & / masse(ij + iip1, l, iq))) ELSE qbyv(ij, l, iq) = MIN(qsat(ij, l), q(ij, l, iq) - dyq(ij, l) * & 0.5 * (1. + masse_adv_v(ij, l) / masse(ij, l, iq))) ENDIF qbyv(ij, l, iq) = masse_adv_v(ij, l) * qbyv(ij, l, iq) ENDDO ENDDO !$OMP END DO NOWAIT ! CRisi: appel recursif de l'advection sur les fils. ! Il faut faire ca avant d'avoir mis a jour q et masse ! WRITE(*,*)'vlyqs 689: iq,nqChildren(iq)=',iq, ! & tracers(iq)%nqChildren ijb = ij_begin - 2 * iip1 ije = ij_end + 2 * iip1 ijbm = ij_begin - iip1 ijem = ij_end + iip1 IF (pole_nord) ijb = ij_begin IF (pole_sud) ije = ij_end IF (pole_nord) ijbm = ij_begin IF (pole_sud) ijem = ij_end !WRITE(lunout,*) 'vlspltqs 737: iq,ijb,ije=',iq,ijb,ije !WRITE(lunout,*) 'ij_begin,ij_end=',ij_begin,ij_end !WRITE(lunout,*) 'pole_nord,pole_sud=',pole_nord,pole_sud DO ifils = 1, tracers(iq)%nqDescen iq2 = tracers(iq)%iqDescen(ifils) !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm ! modif des bornes: CRisi 16 nov 2020 ! d'abord masse avec bornes corrigees DO ij = ijbm, ijem !MVals: veiller a ce qu'on n'ait pas de denominateur nul masse(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) enddo !DO ij=ijbm,ijem ! ensuite Ratio avec anciennes bornes DO ij = ijb, ije !MVals: veiller a ce qu'on n'ait pas de denominateur nul !WRITE(lunout,*) 'ij,l,q(ij,l,iq)=',ij,l,q(ij,l,iq) IF (q(ij, l, iq)>min_qParent) then ! modif 13 nov 2020 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) else Ratio(ij, l, iq2) = min_ratio endif enddo !DO ij=ijbm,ijem enddo !DO l=1,llm !$OMP END DO NOWAIT enddo DO ifils = 1, tracers(iq)%nqChildren iq2 = tracers(iq)%iqDescen(ifils) !WRITE(lunout,*) 'vly: appel recursiv vly iq2=',iq2 CALL vly_loc(Ratio, pente_max, masse, qbyv, iq2) enddo ! end CRisi ijb = ij_begin ije = ij_end IF (pole_nord) ijb = ij_begin + iip1 IF (pole_sud) ije = ij_end - iip1 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije newmasse = masse(ij, l, iq) & + masse_adv_v(ij, l) - masse_adv_v(ij - iip1, l) q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + qbyv(ij, l, iq) & - qbyv(ij - iip1, l, iq)) / newmasse masse(ij, l, iq) = newmasse ENDDO !.-. ancienne version IF (pole_nord) THEN convpn = SSUM(iim, qbyv(1, l, iq), 1) / apoln convmpn = ssum(iim, masse_adv_v(1, l), 1) / apoln DO ij = 1, iip1 newmasse = masse(ij, l, iq) + convmpn * aire(ij) q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + convpn * aire(ij)) / & newmasse masse(ij, l, iq) = newmasse ENDDO ENDIF IF (pole_sud) THEN convps = -SSUM(iim, qbyv(ip1jm - iim, l, iq), 1) / apols convmps = -SSUM(iim, masse_adv_v(ip1jm - iim, l), 1) / apols DO ij = ip1jm + 1, ip1jmp1 newmasse = masse(ij, l, iq) + convmps * aire(ij) q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + convps * aire(ij)) / & newmasse masse(ij, l, iq) = newmasse ENDDO ENDIF !.-. fin ancienne version !._. nouvelle version ! convpn=SSUM(iim,qbyv(1,l,iq),1) ! convmpn=ssum(iim,masse_adv_v(1,l),1) ! oldmasse=ssum(iim,masse(1,l,iq),1) ! newmasse=oldmasse+convmpn ! newq=(q(1,l,iq)*oldmasse+convpn)/newmasse ! newmasse=newmasse/apoln ! DO ij = 1,iip1 ! q(ij,l,iq)=newq ! masse(ij,l,iq)=newmasse*aire(ij) ! ENDDO ! convps=-SSUM(iim,qbyv(ip1jm-iim,l,iq),1) ! convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) ! oldmasse=ssum(iim,masse(ip1jm-iim,l,iq),1) ! newmasse=oldmasse+convmps ! newq=(q(ip1jmp1,l,iq)*oldmasse+convps)/newmasse ! newmasse=newmasse/apols ! DO ij = ip1jm+1,ip1jmp1 ! q(ij,l,iq)=newq ! masse(ij,l,iq)=newmasse*aire(ij) ! ENDDO !._. fin nouvelle version ENDDO !$OMP END DO NOWAIT ! retablir les fils en rapport de melange par rapport a l'air: ijb = ij_begin ije = ij_end ! if (pole_nord) ijb=ij_begin+iip1 ! if (pole_sud) ije=ij_end-iip1 DO ifils = 1, tracers(iq)%nqDescen iq2 = tracers(iq)%iqDescen(ifils) !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije q(ij, l, iq2) = q(ij, l, iq) * Ratio(ij, l, iq2) enddo enddo !$OMP END DO NOWAIT enddo END SUBROUTINE vlyqs_loc