Changeset 1508 for trunk/LMDZ.COMMON/libf/dyn3d
- Timestamp:
- Jan 15, 2016, 8:27:16 AM (9 years ago)
- Location:
- trunk/LMDZ.COMMON/libf/dyn3d
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/dyn3d/advtrac.F90
r1441 r1508 9 9 ! M.A Filiberti (04/2002) 10 10 ! 11 USE infotrac, ONLY: nqtot, iadv 11 USE infotrac, ONLY: nqtot, iadv, nqperes, ok_iso_verif 12 12 USE control_mod, ONLY: iapp_tracvl, day_step 13 13 USE comconst_mod, ONLY: dtvr … … 218 218 ! Appel des sous programmes d'advection 219 219 !----------------------------------------------------------- 220 do iq=1,nqtot 220 if (ok_iso_verif) then 221 write(*,*) 'advtrac 227' 222 call check_isotopes_seq(q,ip1jmp1,'advtrac 162') 223 endif !if (ok_iso_verif) then 224 225 do iq=1,nqperes 221 226 ! call clock(t_initial) 222 227 if(iadv(iq) == 0) cycle … … 225 230 ! ---------------------------------------------------------------- 226 231 if(iadv(iq).eq.10) THEN 227 call vlsplt(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr) 232 ! CRisi: on fait passer tout q pour avoir acces aux fils 233 234 !write(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:) 235 call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq) 228 236 229 237 ! ---------------------------------------------------------------- … … 233 241 else if(iadv(iq).eq.14) then 234 242 ! 235 CALL vlspltqs( q(1,1,1), 2., massem, wg , & 236 pbarug,pbarvg,dtvr,p,pk,teta ) 243 !write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:) 244 CALL vlspltqs( q, 2., massem, wg , & 245 pbarug,pbarvg,dtvr,p,pk,teta,iq) 246 237 247 ! ---------------------------------------------------------------- 238 248 ! Schema de Frederic Hourdin … … 383 393 end DO 384 394 395 if (ok_iso_verif) then 396 write(*,*) 'advtrac 402' 397 call check_isotopes_seq(q,ip1jmp1,'advtrac 397') 398 endif !if (ok_iso_verif) then 385 399 386 400 !------------------------------------------------------------------ -
trunk/LMDZ.COMMON/libf/dyn3d/caladvtrac.F
r1422 r1508 53 53 if (planet_type.eq."earth") then 54 54 C initialisation 55 dq(:,:,1:2)=q(:,:,1:2) 55 ! CRisi: il faut gérer tous les traceurs si on veut pouvoir faire des 56 ! isotopes 57 ! dq(:,:,1:2)=q(:,:,1:2) 58 dq(:,:,1:nqtot)=q(:,:,1:nqtot) 56 59 57 60 c test des valeurs minmax … … 82 85 ENDDO 83 86 84 CALL qminimum( q, 2, finmasse ) 87 !write(*,*) 'caladvtrac 87' 88 CALL qminimum( q, nqtot, finmasse ) 89 !write(*,*) 'caladvtrac 89' 85 90 86 91 CALL SCOPY ( ip1jmp1*llm, masse, 1, finmasse, 1 ) … … 92 97 dtvrtrac = iapp_tracvl * dtvr 93 98 c 94 DO iq = 1 , 299 DO iq = 1 , nqtot 95 100 DO l = 1 , llm 96 101 DO ij = 1,ip1jmp1 … … 105 110 if (planet_type.eq."earth") then 106 111 ! Earth-specific treatment for the first 2 tracers (water) 107 dq(:,:,1: 2)=0.112 dq(:,:,1:nqtot)=0. 108 113 endif ! of if (planet_type.eq."earth") 109 114 ENDIF ! of IF( iapptrac.EQ.iapp_tracvl ) -
trunk/LMDZ.COMMON/libf/dyn3d/guide_mod.F90
r1441 r1508 79 79 ! Lecture des parametres: 80 80 ! --------------------------------------------- 81 call ini_getparam("nudging_parameters_out.txt") 81 82 ! Variables guidees 82 83 CALL getpar('guide_u',.true.,guide_u,'guidage de u') … … 144 145 CALL getpar('guide_inverty',.true.,invert_y,'inversion N-S') 145 146 CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P') 147 148 call fin_getparam 146 149 147 150 ! --------------------------------------------- -
trunk/LMDZ.COMMON/libf/dyn3d/leapfrog.F
r1422 r1508 12 12 use IOIPSL 13 13 #endif 14 USE infotrac, ONLY: nqtot 14 USE infotrac, ONLY: nqtot,ok_iso_verif 15 15 USE guide_mod, ONLY : guide_main 16 16 USE write_field, ONLY: writefield … … 305 305 jH_cur = jH_cur - int(jH_cur) 306 306 307 if (ok_iso_verif) then 308 call check_isotopes_seq(q,ip1jmp1,'leapfrog 321') 309 endif !if (ok_iso_verif) then 307 310 308 311 #ifdef CPP_IOIPSL … … 337 340 ! CALL SCOPY ( ijp1llm, masse, 1, finvmaold, 1 ) 338 341 ! CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 ) 342 343 if (ok_iso_verif) then 344 call check_isotopes_seq(q,ip1jmp1,'leapfrog 400') 345 endif !if (ok_iso_verif) then 339 346 340 347 2 CONTINUE ! Matsuno backward or leapfrog step begins here … … 381 388 #endif 382 389 390 if (ok_iso_verif) then 391 call check_isotopes_seq(q,ip1jmp1,'leapfrog 589') 392 endif !if (ok_iso_verif) then 393 383 394 c----------------------------------------------------------------------- 384 395 c calcul des tendances dynamiques: … … 419 430 c ------------------------------------------------------------- 420 431 432 if (ok_iso_verif) then 433 call check_isotopes_seq(q,ip1jmp1, 434 & 'leapfrog 686: avant caladvtrac') 435 endif !if (ok_iso_verif) then 436 421 437 IF( forward. OR . leapf ) THEN 422 438 ! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step … … 443 459 c ---------------------------------- 444 460 445 446 CALL integrd ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 , 461 if (ok_iso_verif) then 462 write(*,*) 'leapfrog 720' 463 call check_isotopes_seq(q,ip1jmp1,'leapfrog 756') 464 endif !if (ok_iso_verif) then 465 466 CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 , 447 467 $ dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis ) 448 468 ! $ finvmaold ) 469 470 if (ok_iso_verif) then 471 write(*,*) 'leapfrog 724' 472 call check_isotopes_seq(q,ip1jmp1,'leapfrog 762') 473 endif !if (ok_iso_verif) then 449 474 450 475 IF ((planet_type.eq."titan").and.(tidal)) then … … 519 544 IF (ip_ebil_dyn.ge.1 ) THEN 520 545 ztit='bil dyn' 521 ! Ehouarn: be careful, diagedyn is Earth-specific (includes ../phylmd/..)!546 ! Ehouarn: be careful, diagedyn is Earth-specific! 522 547 IF (planet_type.eq."earth") THEN 523 548 CALL diagedyn(ztit,2,1,1,dtphys … … 619 644 CALL massdair(p,masse) 620 645 646 if (ok_iso_verif) then 647 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196') 648 endif !if (ok_iso_verif) then 649 621 650 c----------------------------------------------------------------------- 622 651 c dissipation horizontale et verticale des petites echelles: … … 717 746 c preparation du pas d'integration suivant ...... 718 747 748 if (ok_iso_verif) then 749 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509') 750 endif !if (ok_iso_verif) then 751 719 752 IF ( .NOT.purmats ) THEN 720 753 c ........................................................ … … 776 809 777 810 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 811 812 if (ok_iso_verif) then 813 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584') 814 endif !if (ok_iso_verif) then 778 815 779 816 c----------------------------------------------------------------------- … … 858 895 ELSE ! of IF (.not.purmats) 859 896 897 if (ok_iso_verif) then 898 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664') 899 endif !if (ok_iso_verif) then 900 860 901 c ........................................................ 861 902 c .............. schema matsuno ............... … … 880 921 881 922 ELSE ! of IF(forward) i.e. backward step 923 924 if (ok_iso_verif) then 925 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698') 926 endif !if (ok_iso_verif) then 882 927 883 928 IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN -
trunk/LMDZ.COMMON/libf/dyn3d/qminimum.F
r1422 r1508 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE qminimum( q,nq ,deltap )4 SUBROUTINE qminimum( q,nqtot,deltap ) 5 5 6 USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif 6 7 IMPLICIT none 7 8 c … … 12 13 #include "paramet.h" 13 14 c 14 INTEGER nq 15 REAL q(ip1jmp1,llm,nq ), deltap(ip1jmp1,llm)15 INTEGER nqtot 16 REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm) 16 17 c 17 18 INTEGER iq_vap, iq_liq … … 29 30 INTEGER i, k, iq 30 31 REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe 32 33 real zx_defau_diag(ip1jmp1,llm,2) 34 real q_follow(ip1jmp1,llm,2) 31 35 c 32 36 REAL SSUM … … 35 39 SAVE imprim 36 40 DATA imprim /0/ 41 !INTEGER ijb,ije 42 !INTEGER Index_pump(ij_end-ij_begin+1) 43 !INTEGER nb_pump 44 INTEGER ixt 37 45 c 38 46 c Quand l'eau liquide est trop petite (ou negative), on prend … … 40 48 c (sans changer la temperature !) 41 49 c 50 51 if (ok_iso_verif) then 52 call check_isotopes_seq(q,ip1jmp1,'qminimum 52') 53 endif !if (ok_iso_verif) then 54 55 zx_defau_diag(:,:,:)=0.0 56 q_follow(:,:,1:2)=q(:,:,1:2) 42 57 DO 1000 k = 1, llm 43 58 DO 1040 i = 1, ip1jmp1 44 59 if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then 60 61 if (ok_isotopes) then 62 zx_defau_diag(i,k,iq_liq)=AMAX1 63 : ( seuil_liq - q(i,k,iq_liq), 0.0 ) 64 endif !if (ok_isotopes) then 65 45 66 q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq 46 67 q(i,k,iq_liq) = seuil_liq … … 58 79 DO i = 1, ip1jmp1 59 80 if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then 81 82 if (ok_isotopes) then 83 zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 ) 84 endif !if (ok_isotopes) then 85 60 86 q(i,k-1,iq) = q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) * 61 87 & deltap(i,k) / deltap(i,k-1) … … 82 108 ENDDO 83 109 ENDIF 110 111 !write(*,*) 'qminimum 128' 112 if (ok_isotopes) then 113 ! CRisi: traiter de même les traceurs d'eau 114 ! Mais il faut les prendre à l'envers pour essayer de conserver la 115 ! masse. 116 ! 1) pompage dans le sol 117 ! On suppose que ce pompage se fait sans isotopes -> on ne modifie 118 ! rien ici et on croise les doigts pour que ça ne soit pas trop 119 ! génant 120 DO i = 1,ip1jmp1 121 if (zx_pump(i).gt.0.0) then 122 q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i) 123 endif !if (zx_pump(i).gt.0.0) then 124 enddo !DO i = 1,ip1jmp1 125 126 ! 2) transfert de vap vers les couches plus hautes 127 !write(*,*) 'qminimum 139' 128 do k=2,llm 129 DO i = 1,ip1jmp1 130 if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 131 ! on ajoute la vapeur en k 132 do ixt=1,ntraciso 133 q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap)) 134 : +zx_defau_diag(i,k,iq_vap) 135 : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 136 137 ! et on la retranche en k-1 138 q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap)) 139 : -zx_defau_diag(i,k,iq_vap) 140 : *deltap(i,k)/deltap(i,k-1) 141 : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 142 143 enddo !do ixt=1,niso 144 q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap) 145 : +zx_defau_diag(i,k,iq_vap) 146 q_follow(i,k-1,iq_vap)= q_follow(i,k-1,iq_vap) 147 : -zx_defau_diag(i,k,iq_vap) 148 : *deltap(i,k)/deltap(i,k-1) 149 endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 150 enddo !DO i = 1, ip1jmp1 151 enddo !do k=2,llm 152 153 if (ok_iso_verif) then 154 call check_isotopes_seq(q,ip1jmp1,'qminimum 168') 155 endif !if (ok_iso_verif) then 156 157 158 ! 3) transfert d'eau de la vapeur au liquide 159 !write(*,*) 'qminimum 164' 160 do k=1,llm 161 DO i = 1,ip1jmp1 162 if (zx_defau_diag(i,k,iq_liq).gt.0.0) then 163 164 ! on ajoute eau liquide en k en k 165 do ixt=1,ntraciso 166 q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq)) 167 : +zx_defau_diag(i,k,iq_liq) 168 : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap) 169 ! et on la retranche à la vapeur en k 170 q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap)) 171 : -zx_defau_diag(i,k,iq_liq) 172 : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap) 173 enddo !do ixt=1,niso 174 q_follow(i,k,iq_liq)= q_follow(i,k,iq_liq) 175 : +zx_defau_diag(i,k,iq_liq) 176 q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap) 177 : -zx_defau_diag(i,k,iq_liq) 178 endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 179 enddo !DO i = 1, ip1jmp1 180 enddo !do k=2,llm 181 182 if (ok_iso_verif) then 183 call check_isotopes_seq(q,ip1jmp1,'qminimum 197') 184 endif !if (ok_iso_verif) then 185 186 endif !if (ok_isotopes) then 187 !write(*,*) 'qminimum 188' 188 84 189 c 85 190 RETURN -
trunk/LMDZ.COMMON/libf/dyn3d/vlsplt.F
r1422 r1508 1 1 c 2 c $Id: vlsplt.F 1550 2011-07-05 09:44:55Z lguez $ 3 c 4 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt) 2 c $Id: vlsplt.F 2286 2015-05-20 13:27:07Z emillour $ 3 c 4 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 6 USE infotrac, ONLY: nqtot,nqdesc,iqfils 6 7 c 7 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 29 30 c REAL masse(iip1,jjp1,llm),pente_max 30 31 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 31 REAL q(ip1jmp1,llm )32 REAL q(ip1jmp1,llm,nqtot) 32 33 c REAL q(iip1,jjp1,llm) 33 34 REAL w(ip1jmp1,llm),pdt 35 INTEGER iq ! CRisi 34 36 c 35 37 c Local … … 39 41 INTEGER ijlqmin,iqmin,jqmin,lqmin 40 42 c 41 REAL zm(ip1jmp1,llm ),newmasse43 REAL zm(ip1jmp1,llm,nqtot),newmasse 42 44 REAL mu(ip1jmp1,llm) 43 45 REAL mv(ip1jm,llm) 44 46 REAL mw(ip1jmp1,llm+1) 45 REAL zq(ip1jmp1,llm ),zz47 REAL zq(ip1jmp1,llm,nqtot),zz 46 48 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm) 47 49 REAL second,temps0,temps1,temps2,temps3 … … 52 54 SAVE temps1,temps2,temps3 53 55 INTEGER iminn,imaxx 56 INTEGER ifils,iq2 ! CRisi 54 57 55 58 REAL qmin,qmax … … 76 79 mw(ij,llm+1)=0. 77 80 ENDDO 78 79 CALL SCOPY(ijp1llm,q,1,zq,1) 80 CALL SCOPY(ijp1llm,masse,1,zm,1) 81 82 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 83 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 84 85 if (nqdesc(iq).gt.0) then 86 do ifils=1,nqdesc(iq) 87 iq2=iqfils(ifils,iq) 88 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 89 enddo 90 endif !if (nqfils(iq).gt.0) then 81 91 82 92 cprint*,'Entree vlx1' 83 93 c call minmaxq(zq,qmin,qmax,'avant vlx ') 84 call vlx(zq,pente_max,zm,mu )94 call vlx(zq,pente_max,zm,mu,iq) 85 95 cprint*,'Sortie vlx1' 86 96 c call minmaxq(zq,qmin,qmax,'apres vlx1 ') 87 97 88 98 c print*,'Entree vly1' 89 call vly(zq,pente_max,zm,mv) 99 100 call vly(zq,pente_max,zm,mv,iq) 90 101 c call minmaxq(zq,qmin,qmax,'apres vly1 ') 91 102 cprint*,'Sortie vly1' 92 call vlz(zq,pente_max,zm,mw )103 call vlz(zq,pente_max,zm,mw,iq) 93 104 c call minmaxq(zq,qmin,qmax,'apres vlz ') 94 105 95 106 96 call vly(zq,pente_max,zm,mv )107 call vly(zq,pente_max,zm,mv,iq) 97 108 c call minmaxq(zq,qmin,qmax,'apres vly ') 98 109 99 110 100 call vlx(zq,pente_max,zm,mu )111 call vlx(zq,pente_max,zm,mu,iq) 101 112 c call minmaxq(zq,qmin,qmax,'apres vlx2 ') 102 113 … … 104 115 DO l=1,llm 105 116 DO ij=1,ip1jmp1 106 q(ij,l )=zq(ij,l)117 q(ij,l,iq)=zq(ij,l,iq) 107 118 ENDDO 108 119 DO ij=1,ip1jm+1,iip1 109 q(ij+iim,l)=q(ij,l) 110 ENDDO 111 ENDDO 120 q(ij+iim,l,iq)=q(ij,l,iq) 121 ENDDO 122 ENDDO 123 ! CRisi: aussi pour les fils 124 if (nqdesc(iq).gt.0) then 125 do ifils=1,nqdesc(iq) 126 iq2=iqfils(ifils,iq) 127 DO l=1,llm 128 DO ij=1,ip1jmp1 129 q(ij,l,iq2)=zq(ij,l,iq2) 130 ENDDO 131 DO ij=1,ip1jm+1,iip1 132 q(ij+iim,l,iq2)=q(ij,l,iq2) 133 ENDDO 134 ENDDO 135 enddo !do ifils=1,nqdesc(iq) 136 endif ! if (nqdesc(iq).gt.0) then 112 137 113 138 RETURN 114 139 END 115 SUBROUTINE vlx(q,pente_max,masse,u_m) 140 RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq) 141 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 116 142 117 143 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 133 159 c Arguments: 134 160 c ---------- 135 REAL masse(ip1jmp1,llm ),pente_max161 REAL masse(ip1jmp1,llm,nqtot),pente_max 136 162 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm) 137 REAL q(ip1jmp1,llm )163 REAL q(ip1jmp1,llm,nqtot) 138 164 REAL w(ip1jmp1,llm) 165 INTEGER iq ! CRisi 139 166 c 140 167 c Local … … 149 176 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 150 177 REAL u_mq(ip1jmp1,llm) 178 179 ! CRisi 180 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 181 INTEGER ifils,iq2 ! CRisi 151 182 152 183 Logical extremum,first,testcpu … … 182 213 DO l = 1, llm 183 214 DO ij=iip2,ip1jm-1 184 dxqu(ij)=q(ij+1,l )-q(ij,l)215 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 185 216 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 186 c sigu(ij)=u_m(ij,l)/masse(ij,l )217 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 187 218 ENDDO 188 219 DO ij=iip1+iip1,ip1jm,iip1 … … 237 268 DO l = 1, llm 238 269 DO ij=iip2,ip1jm-1 239 dxqu(ij)=q(ij+1,l )-q(ij,l)270 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 240 271 ENDDO 241 272 DO ij=iip1+iip1,ip1jm,iip1 … … 279 310 DO l=1,llm 280 311 DO ij=iip2,ip1jm-1 281 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),282 , 1.+u_m(ij,l)/masse(ij+1,l ),312 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 313 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 283 314 , u_m(ij,l)) 284 315 zdum(ij,l)=0.5*zdum(ij,l) 285 316 u_mq(ij,l)=cvmgp( 286 , q(ij,l )+zdum(ij,l)*dxq(ij,l),287 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),317 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 318 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 288 319 , u_m(ij,l)) 289 320 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 297 328 DO l=1,llm 298 329 DO ij=iip2,ip1jm-1 299 c print*,'masse(',ij,')=',masse(ij,l )330 c print*,'masse(',ij,')=',masse(ij,l,iq) 300 331 IF (u_m(ij,l).gt.0.) THEN 301 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )302 u_mq(ij,l)=u_m(ij,l)*(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l))332 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 333 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l)) 303 334 ELSE 304 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l) 305 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l)) 335 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 336 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq) 337 & -0.5*zdum(ij,l)*dxq(ij+1,l)) 306 338 ENDIF 307 339 ENDDO … … 373 405 i=ijq-(j-1)*iip1 374 406 c accumulation pour les mailles completements advectees 375 do while(zu_m.gt.masse(ijq,l)) 376 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 377 zu_m=zu_m-masse(ijq,l) 407 do while(zu_m.gt.masse(ijq,l,iq)) 408 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) 409 & *masse(ijq,l,iq) 410 zu_m=zu_m-masse(ijq,l,iq) 378 411 i=mod(i-2+iim,iim)+1 379 412 ijq=(j-1)*iip1+i … … 381 414 c ajout de la maille non completement advectee 382 415 u_mq(ij,l)=u_mq(ij,l)+zu_m* 383 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 416 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 417 & *dxq(ijq,l)) 384 418 ELSE 385 419 ijq=ij+1 386 420 i=ijq-(j-1)*iip1 387 421 c accumulation pour les mailles completements advectees 388 do while(-zu_m.gt.masse(ijq,l)) 389 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 390 zu_m=zu_m+masse(ijq,l) 422 do while(-zu_m.gt.masse(ijq,l,iq)) 423 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 424 & *masse(ijq,l,iq) 425 zu_m=zu_m+masse(ijq,l,iq) 391 426 i=mod(i,iim)+1 392 427 ijq=(j-1)*iip1+i 393 428 ENDDO 394 429 c ajout de la maille non completement advectee 395 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-396 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))430 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 431 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 397 432 ENDIF 398 433 ENDDO … … 411 446 ENDDO 412 447 448 ! CRisi: appel récursif de l'advection sur les fils. 449 ! Il faut faire ça avant d'avoir mis à jour q et masse 450 !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq) 451 452 if (nqdesc(iq).gt.0) then 453 do ifils=1,nqdesc(iq) 454 iq2=iqfils(ifils,iq) 455 DO l=1,llm 456 DO ij=iip2,ip1jm 457 ! On a besoin de q et masse seulement entre iip2 et ip1jm 458 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 459 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 460 enddo 461 enddo 462 enddo !do ifils=1,nqdesc(iq) 463 do ifils=1,nqfils(iq) 464 iq2=iqfils(ifils,iq) 465 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 466 enddo !do ifils=1,nqfils(iq) 467 endif !if (nqfils(iq).gt.0) then 468 ! end CRisi 469 413 470 414 471 c calcul des tENDances … … 416 473 DO l=1,llm 417 474 DO ij=iip2+1,ip1jm 418 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)419 q(ij,l )=(q(ij,l)*masse(ij,l)+475 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 476 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 420 477 & u_mq(ij-1,l)-u_mq(ij,l)) 421 478 & /new_m 422 masse(ij,l )=new_m479 masse(ij,l,iq)=new_m 423 480 ENDDO 424 481 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 425 482 DO ij=iip1+iip1,ip1jm,iip1 426 q(ij-iim,l)=q(ij,l) 427 masse(ij-iim,l)=masse(ij,l) 428 ENDDO 429 ENDDO 483 q(ij-iim,l,iq)=q(ij,l,iq) 484 masse(ij-iim,l,iq)=masse(ij,l,iq) 485 ENDDO 486 ENDDO 487 488 ! retablir les fils en rapport de melange par rapport a l'air: 489 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 490 ! puis on boucle en longitude 491 if (nqdesc(iq).gt.0) then 492 do ifils=1,nqdesc(iq) 493 iq2=iqfils(ifils,iq) 494 DO l=1,llm 495 DO ij=iip2+1,ip1jm 496 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 497 enddo 498 DO ij=iip1+iip1,ip1jm,iip1 499 q(ij-iim,l,iq2)=q(ij,l,iq2) 500 enddo ! DO ij=ijb+iip1-1,ije,iip1 501 enddo !DO l=1,llm 502 enddo !do ifils=1,nqdesc(iq) 503 endif !if (nqfils(iq).gt.0) then 504 430 505 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) 431 506 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) … … 434 509 RETURN 435 510 END 436 SUBROUTINE vly(q,pente_max,masse,masse_adv_v) 511 RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq) 512 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 513 USE comconst_mod, ONLY: pi 437 514 c 438 515 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 446 523 c 447 524 c -------------------------------------------------------------------- 448 USE comconst_mod, ONLY: pi449 450 525 IMPLICIT NONE 451 526 c … … 457 532 c Arguments: 458 533 c ---------- 459 REAL masse(ip1jmp1,llm ),pente_max534 REAL masse(ip1jmp1,llm,nqtot),pente_max 460 535 REAL masse_adv_v( ip1jm,llm) 461 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm) 536 REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm) 537 INTEGER iq ! CRisi 462 538 c 463 539 c Local … … 484 560 SAVE sinlon,coslon,sinlondlon,coslondlon 485 561 SAVE airej2,airejjm 562 563 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 564 INTEGER ifils,iq2 ! CRisi 565 486 566 c 487 567 c … … 490 570 DATA first,testcpu/.true.,.false./ 491 571 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ 572 573 !write(*,*) 'vly 578: entree, iq=',iq 492 574 493 575 IF(first) THEN … … 522 604 523 605 DO i = 1, iim 524 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )525 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )606 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 607 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 526 608 ENDDO 527 609 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 531 613 532 614 DO ij=1,ip1jm 533 dyqv(ij)=q(ij,l )-q(ij+iip1,l)615 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 534 616 adyqv(ij)=abs(dyqv(ij)) 535 617 ENDDO … … 546 628 547 629 DO ij=1,iip1 548 dyq(ij,l)=qpns-q(ij+iip1,l )549 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn630 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 631 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 550 632 ENDDO 551 633 … … 668 750 ENDDO 669 751 752 !write(*,*) 'vly 756' 670 753 DO l=1,llm 671 754 DO ij=1,ip1jm 672 755 IF(masse_adv_v(ij,l).gt.0) THEN 673 qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)* 674 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)) 756 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* 757 , 0.5*(1.-masse_adv_v(ij,l) 758 , /masse(ij+iip1,l,iq)) 675 759 ELSE 676 qbyv(ij,l)=q(ij,l)-dyq(ij,l)* 677 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) 760 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* 761 , 0.5*(1.+masse_adv_v(ij,l) 762 , /masse(ij,l,iq)) 678 763 ENDIF 679 764 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l) … … 681 766 ENDDO 682 767 768 ! CRisi: appel récursif de l'advection sur les fils. 769 ! Il faut faire ça avant d'avoir mis à jour q et masse 770 !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 771 772 if (nqfils(iq).gt.0) then 773 do ifils=1,nqdesc(iq) 774 iq2=iqfils(ifils,iq) 775 DO l=1,llm 776 DO ij=1,ip1jmp1 777 ! attention, chaque fils doit avoir son masseq, sinon, le 1er 778 ! fils ecrase le masseq de ses freres. 779 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 780 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 781 enddo 782 enddo 783 enddo !do ifils=1,nqdesc(iq) 784 785 do ifils=1,nqfils(iq) 786 iq2=iqfils(ifils,iq) 787 call vly(Ratio,pente_max,masseq,qbyv,iq2) 788 enddo !do ifils=1,nqfils(iq) 789 endif !if (nqfils(iq).gt.0) then 683 790 684 791 DO l=1,llm 685 792 DO ij=iip2,ip1jm 686 newmasse=masse(ij,l )793 newmasse=masse(ij,l,iq) 687 794 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 688 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))689 & /newmasse690 masse(ij,l )=newmasse795 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 796 & -qbyv(ij-iip1,l))/newmasse 797 masse(ij,l,iq)=newmasse 691 798 ENDDO 692 799 c.-. ancienne version … … 696 803 convpn=SSUM(iim,qbyv(1,l),1) 697 804 convmpn=ssum(iim,masse_adv_v(1,l),1) 698 massepn=ssum(iim,masse(1,l ),1)805 massepn=ssum(iim,masse(1,l,iq),1) 699 806 qpn=0. 700 807 do ij=1,iim 701 qpn=qpn+masse(ij,l )*q(ij,l)808 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq) 702 809 enddo 703 810 qpn=(qpn+convpn)/(massepn+convmpn) 704 811 do ij=1,iip1 705 q(ij,l )=qpn812 q(ij,l,iq)=qpn 706 813 enddo 707 814 … … 711 818 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 712 819 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) 713 masseps=ssum(iim, masse(ip1jm+1,l ),1)820 masseps=ssum(iim, masse(ip1jm+1,l,iq),1) 714 821 qps=0. 715 822 do ij = ip1jm+1,ip1jmp1-1 716 qps=qps+masse(ij,l )*q(ij,l)823 qps=qps+masse(ij,l,iq)*q(ij,l,iq) 717 824 enddo 718 825 qps=(qps+convps)/(masseps+convmps) 719 826 do ij=ip1jm+1,ip1jmp1 720 q(ij,l )=qps827 q(ij,l,iq)=qps 721 828 enddo 722 829 … … 732 839 c DO ij = 1,iip1 733 840 c q(ij,l)=newq 734 c masse(ij,l )=newmasse*aire(ij)841 c masse(ij,l,iq)=newmasse*aire(ij) 735 842 c ENDDO 736 843 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 742 849 c DO ij = ip1jm+1,ip1jmp1 743 850 c q(ij,l)=newq 744 c masse(ij,l )=newmasse*aire(ij)851 c masse(ij,l,iq)=newmasse*aire(ij) 745 852 c ENDDO 746 853 c._. fin nouvelle version 747 854 ENDDO 855 856 ! retablir les fils en rapport de melange par rapport a l'air: 857 if (nqfils(iq).gt.0) then 858 do ifils=1,nqdesc(iq) 859 iq2=iqfils(ifils,iq) 860 DO l=1,llm 861 DO ij=1,ip1jmp1 862 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 863 enddo 864 enddo 865 enddo !do ifils=1,nqdesc(iq) 866 endif !if (nqfils(iq).gt.0) then 867 868 !write(*,*) 'vly 853: sortie' 748 869 749 870 RETURN 750 871 END 751 SUBROUTINE vlz(q,pente_max,masse,w) 872 RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq) 873 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 752 874 c 753 875 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 769 891 c Arguments: 770 892 c ---------- 771 REAL masse(ip1jmp1,llm ),pente_max772 REAL q(ip1jmp1,llm )893 REAL masse(ip1jmp1,llm,nqtot),pente_max 894 REAL q(ip1jmp1,llm,nqtot) 773 895 REAL w(ip1jmp1,llm+1) 896 INTEGER iq 774 897 c 775 898 c Local … … 782 905 REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax 783 906 REAL sigw 907 908 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 909 INTEGER ifils,iq2 ! CRisi 784 910 785 911 LOGICAL testcpu … … 795 921 c On oriente tout dans le sens de la pression c'est a dire dans le 796 922 c sens de W 923 924 !write(*,*) 'vlz 923: entree' 797 925 798 926 #ifdef BIDON … … 803 931 DO l=2,llm 804 932 DO ij=1,ip1jmp1 805 dzqw(ij,l)=q(ij,l-1 )-q(ij,l)933 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq) 806 934 adzqw(ij,l)=abs(dzqw(ij,l)) 807 935 ENDDO … … 825 953 ENDDO 826 954 955 !write(*,*) 'vlz 954' 827 956 DO ij=1,ip1jmp1 828 957 dzq(ij,1)=0. … … 841 970 c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq 842 971 972 !write(*,*) 'vlz 969' 843 973 DO l = 1,llm-1 844 974 do ij = 1,ip1jmp1 845 975 IF(w(ij,l+1).gt.0.) THEN 846 sigw=w(ij,l+1)/masse(ij,l+1) 847 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1)) 976 sigw=w(ij,l+1)/masse(ij,l+1,iq) 977 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq) 978 & +0.5*(1.-sigw)*dzq(ij,l+1)) 848 979 ELSE 849 sigw=w(ij,l+1)/masse(ij,l )850 wq(ij,l+1)=w(ij,l+1)*(q(ij,l )-0.5*(1.+sigw)*dzq(ij,l))980 sigw=w(ij,l+1)/masse(ij,l,iq) 981 wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l)) 851 982 ENDIF 852 983 ENDDO … … 858 989 ENDDO 859 990 991 ! CRisi: appel récursif de l'advection sur les fils. 992 ! Il faut faire ça avant d'avoir mis à jour q et masse 993 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 994 if (nqfils(iq).gt.0) then 995 do ifils=1,nqdesc(iq) 996 iq2=iqfils(ifils,iq) 997 DO l=1,llm 998 DO ij=1,ip1jmp1 999 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1000 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1001 enddo 1002 enddo 1003 enddo !do ifils=1,nqdesc(iq) 1004 1005 do ifils=1,nqfils(iq) 1006 iq2=iqfils(ifils,iq) 1007 call vlz(Ratio,pente_max,masseq,wq,iq2) 1008 enddo !do ifils=1,nqfils(iq) 1009 endif !if (nqfils(iq).gt.0) then 1010 ! end CRisi 1011 860 1012 DO l=1,llm 861 1013 DO ij=1,ip1jmp1 862 newmasse=masse(ij,l )+w(ij,l+1)-w(ij,l)863 q(ij,l )=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))1014 newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l) 1015 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l)) 864 1016 & /newmasse 865 masse(ij,l)=newmasse 866 ENDDO 867 ENDDO 868 1017 masse(ij,l,iq)=newmasse 1018 ENDDO 1019 ENDDO 1020 1021 ! retablir les fils en rapport de melange par rapport a l'air: 1022 if (nqfils(iq).gt.0) then 1023 do ifils=1,nqdesc(iq) 1024 iq2=iqfils(ifils,iq) 1025 DO l=1,llm 1026 DO ij=1,ip1jmp1 1027 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1028 enddo 1029 enddo 1030 enddo !do ifils=1,nqdesc(iq) 1031 endif !if (nqfils(iq).gt.0) then 1032 !write(*,*) 'vlsplt 1032' 869 1033 870 1034 RETURN -
trunk/LMDZ.COMMON/libf/dyn3d/vlspltqs.F
r1422 r1508 1 ! 2 ! $Header$3 ! 1 c 2 c $Id: vlspltqs.F 2286 2015-05-20 13:27:07Z emillour $ 3 c 4 4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, 5 , p,pk,teta ) 5 , p,pk,teta,iq ) 6 USE infotrac, ONLY: nqtot,nqdesc,iqfils 6 7 c 7 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron … … 33 34 REAL masse(ip1jmp1,llm),pente_max 34 35 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 35 REAL q(ip1jmp1,llm )36 REAL q(ip1jmp1,llm,nqtot) 36 37 REAL w(ip1jmp1,llm),pdt 37 38 REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm) 39 INTEGER iq ! CRisi 38 40 c 39 41 c Local … … 41 43 c 42 44 INTEGER i,ij,l,j,ii 45 INTEGER ifils,iq2 ! CRisi 43 46 c 44 47 REAL qsat(ip1jmp1,llm) 45 REAL zm(ip1jmp1,llm )48 REAL zm(ip1jmp1,llm,nqtot) 46 49 REAL mu(ip1jmp1,llm) 47 50 REAL mv(ip1jm,llm) 48 51 REAL mw(ip1jmp1,llm+1) 49 REAL zq(ip1jmp1,llm )52 REAL zq(ip1jmp1,llm,nqtot) 50 53 REAL temps1,temps2,temps3 51 54 REAL zzpbar, zzw … … 63 66 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play 64 67 REAL ptarg,pdelarg,foeew,zdelta 65 ! ADAPTATION GCM POUR CP(T)66 68 REAL tempe(ip1jmp1,llm) 67 69 … … 115 117 ENDDO 116 118 117 CALL SCOPY(ijp1llm,q,1,zq,1) 118 CALL SCOPY(ijp1llm,masse,1,zm,1) 119 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 120 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 121 if (nqdesc(iq).gt.0) then 122 do ifils=1,nqdesc(iq) 123 iq2=iqfils(ifils,iq) 124 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 125 enddo 126 endif !if (nqfils(iq).gt.0) then 119 127 120 128 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 121 call vlxqs(zq,pente_max,zm,mu,qsat) 122 129 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 123 130 124 131 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 125 132 126 call vlyqs(zq,pente_max,zm,mv,qsat) 127 133 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 128 134 129 135 c call minmaxq(zq,qmin,qmax,'avant vlz ') 130 136 131 call vlz(zq,pente_max,zm,mw) 132 137 call vlz(zq,pente_max,zm,mw,iq) 133 138 134 139 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 135 140 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ') 136 141 137 call vlyqs(zq,pente_max,zm,mv,qsat) 138 142 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 139 143 140 144 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 141 145 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ') 142 146 143 call vlxqs(zq,pente_max,zm,mu,qsat )147 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 144 148 145 149 c call minmaxq(zq,qmin,qmax,'apres vlxqs ') … … 149 153 DO l=1,llm 150 154 DO ij=1,ip1jmp1 151 q(ij,l )=zq(ij,l)155 q(ij,l,iq)=zq(ij,l,iq) 152 156 ENDDO 153 157 DO ij=1,ip1jm+1,iip1 154 q(ij+iim,l)=q(ij,l) 155 ENDDO 156 ENDDO 158 q(ij+iim,l,iq)=q(ij,l,iq) 159 ENDDO 160 ENDDO 161 ! CRisi: aussi pour les fils 162 if (nqdesc(iq).gt.0) then 163 do ifils=1,nqdesc(iq) 164 iq2=iqfils(ifils,iq) 165 DO l=1,llm 166 DO ij=1,ip1jmp1 167 q(ij,l,iq2)=zq(ij,l,iq2) 168 ENDDO 169 DO ij=1,ip1jm+1,iip1 170 q(ij+iim,l,iq2)=q(ij,l,iq2) 171 ENDDO 172 ENDDO 173 enddo !do ifils=1,nqdesc(iq) 174 endif ! if (nqfils(iq).gt.0) then 175 !write(*,*) 'vlspltqs 183: fin de la routine' 157 176 158 177 RETURN 159 178 END 160 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat) 179 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq) 180 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 181 161 182 c 162 183 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 175 196 c Arguments: 176 197 c ---------- 177 REAL masse(ip1jmp1,llm ),pente_max198 REAL masse(ip1jmp1,llm,nqtot),pente_max 178 199 REAL u_m( ip1jmp1,llm ) 179 REAL q(ip1jmp1,llm )200 REAL q(ip1jmp1,llm,nqtot) 180 201 REAL qsat(ip1jmp1,llm) 202 INTEGER iq ! CRisi 181 203 c 182 204 c Local … … 191 213 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 192 214 REAL u_mq(ip1jmp1,llm) 215 216 ! CRisi 217 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 218 INTEGER ifils,iq2 ! CRisi 193 219 194 220 Logical first,testcpu … … 223 249 DO l = 1, llm 224 250 DO ij=iip2,ip1jm-1 225 dxqu(ij)=q(ij+1,l )-q(ij,l)251 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 226 252 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 227 c sigu(ij)=u_m(ij,l)/masse(ij,l )253 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 228 254 ENDDO 229 255 DO ij=iip1+iip1,ip1jm,iip1 … … 277 303 DO l = 1, llm 278 304 DO ij=iip2,ip1jm-1 279 dxqu(ij)=q(ij+1,l )-q(ij,l)305 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 280 306 ENDDO 281 307 DO ij=iip1+iip1,ip1jm,iip1 … … 319 345 DO l=1,llm 320 346 DO ij=iip2,ip1jm-1 321 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),322 , 1.+u_m(ij,l)/masse(ij+1,l ),347 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 348 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 323 349 , u_m(ij,l)) 324 350 zdum(ij,l)=0.5*zdum(ij,l) 325 351 u_mq(ij,l)=cvmgp( 326 , q(ij,l )+zdum(ij,l)*dxq(ij,l),327 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),352 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 353 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 328 354 , u_m(ij,l)) 329 355 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 337 363 DO ij=iip2,ip1jm-1 338 364 IF (u_m(ij,l).gt.0.) THEN 339 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )365 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 340 366 u_mq(ij,l)=u_m(ij,l)* 341 $ min(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))367 $ min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l)) 342 368 ELSE 343 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l )369 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 344 370 u_mq(ij,l)=u_m(ij,l)* 345 $ min(q(ij+1,l )-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))371 $ min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l)) 346 372 ENDIF 347 373 ENDDO … … 412 438 i=ijq-(j-1)*iip1 413 439 c accumulation pour les mailles completements advectees 414 do while(zu_m.gt.masse(ijq,l)) 415 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 416 zu_m=zu_m-masse(ijq,l) 440 do while(zu_m.gt.masse(ijq,l,iq)) 441 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) 442 & *masse(ijq,l,iq) 443 zu_m=zu_m-masse(ijq,l,iq) 417 444 i=mod(i-2+iim,iim)+1 418 445 ijq=(j-1)*iip1+i … … 420 447 c ajout de la maille non completement advectee 421 448 u_mq(ij,l)=u_mq(ij,l)+zu_m* 422 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 449 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 450 & *dxq(ijq,l)) 423 451 ELSE 424 452 ijq=ij+1 425 453 i=ijq-(j-1)*iip1 426 454 c accumulation pour les mailles completements advectees 427 do while(-zu_m.gt.masse(ijq,l)) 428 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 429 zu_m=zu_m+masse(ijq,l) 455 do while(-zu_m.gt.masse(ijq,l,iq)) 456 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 457 & *masse(ijq,l,iq) 458 zu_m=zu_m+masse(ijq,l,iq) 430 459 i=mod(i,iim)+1 431 460 ijq=(j-1)*iip1+i 432 461 ENDDO 433 462 c ajout de la maille non completement advectee 434 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-435 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))463 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 464 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 436 465 ENDIF 437 466 ENDDO … … 450 479 ENDDO 451 480 481 ! CRisi: appel récursif de l'advection sur les fils. 482 ! Il faut faire ça avant d'avoir mis à jour q et masse 483 !write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq) 484 485 if (nqfils(iq).gt.0) then 486 do ifils=1,nqdesc(iq) 487 iq2=iqfils(ifils,iq) 488 DO l=1,llm 489 DO ij=iip2,ip1jm 490 ! On a besoin de q et masse seulement entre iip2 et ip1jm 491 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 492 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 493 enddo 494 enddo 495 enddo !do ifils=1,nqdesc(iq) 496 do ifils=1,nqfils(iq) 497 iq2=iqfils(ifils,iq) 498 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 499 enddo !do ifils=1,nqfils(iq) 500 endif !if (nqfils(iq).gt.0) then 501 ! end CRisi 452 502 453 503 c calcul des tendances … … 455 505 DO l=1,llm 456 506 DO ij=iip2+1,ip1jm 457 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)458 q(ij,l )=(q(ij,l)*masse(ij,l)+507 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 508 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 459 509 & u_mq(ij-1,l)-u_mq(ij,l)) 460 510 & /new_m 461 masse(ij,l )=new_m511 masse(ij,l,iq)=new_m 462 512 ENDDO 463 513 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 464 514 DO ij=iip1+iip1,ip1jm,iip1 465 q(ij-iim,l)=q(ij,l) 466 masse(ij-iim,l)=masse(ij,l) 467 ENDDO 468 ENDDO 515 q(ij-iim,l,iq)=q(ij,l,iq) 516 masse(ij-iim,l,iq)=masse(ij,l,iq) 517 ENDDO 518 ENDDO 519 520 ! retablir les fils en rapport de melange par rapport a l'air: 521 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 522 ! puis on boucle en longitude 523 if (nqdesc(iq).gt.0) then 524 do ifils=1,nqdesc(iq) 525 iq2=iqfils(ifils,iq) 526 DO l=1,llm 527 DO ij=iip2+1,ip1jm 528 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 529 enddo 530 DO ij=iip1+iip1,ip1jm,iip1 531 q(ij-iim,l,iq2)=q(ij,l,iq2) 532 enddo ! DO ij=ijb+iip1-1,ije,iip1 533 enddo !DO l=1,llm 534 enddo !do ifils=1,nqdesc(iq) 535 endif !if (nqfils(iq).gt.0) then 469 536 470 537 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 474 541 RETURN 475 542 END 476 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat) 543 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq) 544 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 545 USE comconst_mod, ONLY: pi 477 546 c 478 547 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 486 555 c 487 556 c -------------------------------------------------------------------- 488 USE comconst_mod, ONLY: pi489 490 557 IMPLICIT NONE 491 558 c … … 497 564 c Arguments: 498 565 c ---------- 499 REAL masse(ip1jmp1,llm ),pente_max566 REAL masse(ip1jmp1,llm,nqtot),pente_max 500 567 REAL masse_adv_v( ip1jm,llm) 501 REAL q(ip1jmp1,llm )568 REAL q(ip1jmp1,llm,nqtot) 502 569 REAL qsat(ip1jmp1,llm) 570 INTEGER iq ! CRisi 503 571 c 504 572 c Local … … 524 592 SAVE sinlon,coslon,sinlondlon,coslondlon 525 593 SAVE airej2,airejjm 594 595 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 596 INTEGER ifils,iq2 ! CRisi 526 597 c 527 598 c … … 562 633 563 634 DO i = 1, iim 564 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )565 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )635 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 636 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 566 637 ENDDO 567 638 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 571 642 572 643 DO ij=1,ip1jm 573 dyqv(ij)=q(ij,l )-q(ij+iip1,l)644 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 574 645 adyqv(ij)=abs(dyqv(ij)) 575 646 ENDDO … … 586 657 587 658 DO ij=1,iip1 588 dyq(ij,l)=qpns-q(ij+iip1,l )589 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn659 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 660 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 590 661 ENDDO 591 662 … … 705 776 DO ij=1,ip1jm 706 777 IF( masse_adv_v(ij,l).GT.0. ) THEN 707 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) + 708 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))) 778 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l,iq ) + 779 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l) 780 , /masse(ij+iip1,l,iq))) 709 781 ELSE 710 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l ) - dyq(ij,l) *711 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l )) )782 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) * 783 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) ) 712 784 ENDIF 713 785 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l) … … 716 788 717 789 790 ! CRisi: appel récursif de l'advection sur les fils. 791 ! Il faut faire ça avant d'avoir mis à jour q et masse 792 !write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq) 793 794 if (nqfils(iq).gt.0) then 795 do ifils=1,nqdesc(iq) 796 iq2=iqfils(ifils,iq) 797 DO l=1,llm 798 DO ij=1,ip1jmp1 799 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 800 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 801 enddo 802 enddo 803 enddo !do ifils=1,nqdesc(iq) 804 805 do ifils=1,nqfils(iq) 806 iq2=iqfils(ifils,iq) 807 !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 808 call vly(Ratio,pente_max,masseq,qbyv,iq2) 809 enddo !do ifils=1,nqfils(iq) 810 endif !if (nqfils(iq).gt.0) then 811 718 812 DO l=1,llm 719 813 DO ij=iip2,ip1jm 720 newmasse=masse(ij,l )814 newmasse=masse(ij,l,iq) 721 815 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 722 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))723 & /newmasse724 masse(ij,l )=newmasse816 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 817 & -qbyv(ij-iip1,l))/newmasse 818 masse(ij,l,iq)=newmasse 725 819 ENDDO 726 820 c.-. ancienne version … … 728 822 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln 729 823 DO ij = 1,iip1 730 newmasse=masse(ij,l )+convmpn*aire(ij)731 q(ij,l )=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/824 newmasse=masse(ij,l,iq)+convmpn*aire(ij) 825 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*aire(ij))/ 732 826 & newmasse 733 masse(ij,l )=newmasse827 masse(ij,l,iq)=newmasse 734 828 ENDDO 735 829 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 736 830 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols 737 831 DO ij = ip1jm+1,ip1jmp1 738 newmasse=masse(ij,l )+convmps*aire(ij)739 q(ij,l )=(q(ij,l)*masse(ij,l)+convps*aire(ij))/832 newmasse=masse(ij,l,iq)+convmps*aire(ij) 833 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*aire(ij))/ 740 834 & newmasse 741 masse(ij,l )=newmasse835 masse(ij,l,iq)=newmasse 742 836 ENDDO 743 837 c.-. fin ancienne version … … 752 846 c DO ij = 1,iip1 753 847 c q(ij,l)=newq 754 c masse(ij,l )=newmasse*aire(ij)848 c masse(ij,l,iq)=newmasse*aire(ij) 755 849 c ENDDO 756 850 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 762 856 c DO ij = ip1jm+1,ip1jmp1 763 857 c q(ij,l)=newq 764 c masse(ij,l )=newmasse*aire(ij)858 c masse(ij,l,iq)=newmasse*aire(ij) 765 859 c ENDDO 766 860 c._. fin nouvelle version 767 861 ENDDO 768 862 863 !write(*,*) 'vly 866' 864 865 ! retablir les fils en rapport de melange par rapport a l'air: 866 if (nqdesc(iq).gt.0) then 867 do ifils=1,nqdesc(iq) 868 iq2=iqfils(ifils,iq) 869 DO l=1,llm 870 DO ij=1,ip1jmp1 871 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 872 enddo 873 enddo 874 enddo !do ifils=1,nqdesc(iq) 875 endif !if (nqfils(iq).gt.0) then 876 !write(*,*) 'vly 879' 877 769 878 RETURN 770 879 END
Note: See TracChangeset
for help on using the changeset viewer.