Changeset 5098 for LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Timestamp:
- Jul 22, 2024, 6:53:44 PM (17 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/dyn3dmem
- Files:
-
- 2 edited
-
vlsplt_loc.F (modified) (56 diffs)
-
vlspltqs_loc.F (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlsplt_loc.F
r5082 r5098 4 4 RECURSIVE SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x,iq) 5 5 6 c Auteurs: P.Le Van, F.Hourdin, F.Forget 6 c Auteurs: P.Le Van, F.Hourdin, F.Forget 7 7 c 8 8 c ******************************************************************** … … 28 28 REAL u_m( ijb_u:ije_u,llm),pbarv( iip1,jjb_v:jje_v,llm) 29 29 REAL q(ijb_u:ije_u,llm,nqtot) ! CRisi: ajout dimension nqtot 30 REAL w(ijb_u:ije_u,llm) 30 REAL w(ijb_u:ije_u,llm) 31 31 INTEGER iq ! CRisi 32 32 c 33 c Local 33 c Local 34 34 c --------- 35 35 c … … 49 49 50 50 REAL SSUM 51 EXTERNAL SSUM52 51 53 52 REAL z1,z2,z3 54 53 55 54 INTEGER ijb,ije,ijb_x,ije_x 56 55 57 56 !write(*,*) 'vlsplt 58: entree dans vlx_loc, iq,ijb_x=', 58 57 ! & iq,ijb_x … … 61 60 ijb=ijb_x 62 61 ije=ije_x 63 62 64 63 if (pole_nord.and.ijb==1) ijb=ijb+iip1 65 64 if (pole_sud.and.ije==ip1jmp1) ije=ije-iip1 66 65 67 66 IF (pente_max>-1.e-5) THEN 68 67 c IF (pente_max.gt.10) THEN … … 72 71 ! on a besoin de q entre ijb et ije 73 72 c calcul de la pente aux points u 74 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 73 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 75 74 DO l = 1, llm 76 75 77 76 DO ij=ijb,ije-1 78 77 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) … … 96 95 c limitation subtile 97 96 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) 98 97 99 98 100 99 ENDDO … … 105 104 106 105 DO ij=ijb+1,ije 107 #ifdef CRAY108 dxq(ij,l)=109 , cvmgp(dxqu(ij-1)+dxqu(ij),0.,dxqu(ij-1)*dxqu(ij))110 #else111 106 IF(dxqu(ij-1)*dxqu(ij)>0) THEN 112 107 dxq(ij,l)=dxqu(ij-1)+dxqu(ij) … … 115 110 dxq(ij,l)=0. 116 111 ENDIF 117 #endif118 112 dxq(ij,l)=0.5*dxq(ij,l) 119 113 dxq(ij,l)= … … 172 166 c calcul des flux a gauche et a droite 173 167 174 #ifdef CRAY 175 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 176 DO l=1,llm 177 DO ij=ijb,ije-1 178 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 179 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 180 , u_m(ij,l,iq)) 181 zdum(ij,l)=0.5*zdum(ij,l) 182 u_mq(ij,l)=cvmgp( 183 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 184 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 185 , u_m(ij,l)) 186 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) 187 ENDDO 188 ENDDO 189 c$OMP END DO NOWAIT 190 #else 168 191 169 c on cumule le flux correspondant a toutes les mailles dont la masse 192 170 c au travers de la paroi pENDant le pas de temps. … … 209 187 ENDDO 210 188 c$OMP END DO NOWAIT 211 #endif 212 213 c go to 9999 189 214 190 c detection des points ou on advecte plus que la masse de la 215 191 c maille … … 234 210 c$OMP END DO NOWAIT 235 211 c print*,'Ok test 2' 236 212 237 213 238 214 c traitement special pour le cas ou on advecte en longitude plus que le … … 313 289 ENDDO 314 290 c$OMP END DO NOWAIT 315 cym ENDIF ! n0.gt.0 316 9999 continue 291 cym ENDIF ! n0.gt.0 317 292 318 293 c bouclage en latitude … … 346 321 Ratio(ij,l,iq2)=min_ratio 347 322 endif 348 enddo 323 enddo 349 324 enddo 350 325 c$OMP END DO NOWAIT … … 377 352 378 353 ! retablir les fils en rapport de melange par rapport a l'air: 379 ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio 354 ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio 380 355 ! puis on boucle en longitude 381 356 do ifils=1,tracers(iq)%nqDescen 382 357 iq2=tracers(iq)%iqDescen(ifils) 383 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 358 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 384 359 DO l=1,llm 385 360 DO ij=ijb+1,ije 386 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 361 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 387 362 enddo 388 363 DO ij=ijb+iip1-1,ije,iip1 … … 404 379 RECURSIVE SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v,iq) 405 380 c 406 c Auteurs: P.Le Van, F.Hourdin, F.Forget 381 c Auteurs: P.Le Van, F.Hourdin, F.Forget 407 382 c 408 383 c ******************************************************************** … … 416 391 USE parallel_lmdz 417 392 USE infotrac, ONLY : nqtot,tracers, ! CRisi & 418 & min_qParent,min_qMass,min_ratio ! MVals et CRisi 393 & min_qParent,min_qMass,min_ratio ! MVals et CRisi 419 394 USE comconst_mod, ONLY: pi 420 395 IMPLICIT NONE … … 432 407 INTEGER iq ! CRisi 433 408 c 434 c Local 409 c Local 435 410 c --------- 436 411 c … … 444 419 REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs 445 420 c REAL newq,oldmasse 446 Logical extremum,first ,testcpu421 Logical extremum,first 447 422 REAL temps0,temps1,temps2,temps3,temps4,temps5,second 448 423 SAVE temps0,temps1,temps2,temps3,temps4,temps5 449 424 c$OMP THREADPRIVATE(temps0,temps1,temps2,temps3,temps4,temps5) 450 SAVE first ,testcpu451 c$OMP THREADPRIVATE(first ,testcpu)425 SAVE first 426 c$OMP THREADPRIVATE(first) 452 427 453 428 REAL convpn,convps,convmpn,convmps … … 467 442 EXTERNAL SSUM 468 443 469 DATA first ,testcpu/.true.,.false./444 DATA first/.true./ 470 445 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ 471 446 INTEGER ijb,ije … … 473 448 474 449 ijb=ij_begin-2*iip1 475 ije=ij_end+2*iip1 450 ije=ij_end+2*iip1 476 451 if (pole_nord) ijb=ij_begin 477 452 if (pole_sud) ije=ij_end … … 491 466 sinlondlon(1)=sinlondlon(iip1) 492 467 airej2 = SSUM( iim, aire(iip2), 1 ) 493 airejjm= SSUM( iim, aire(ip1jm -iim), 1 ) 468 airejjm= SSUM( iim, aire(ip1jm -iim), 1 ) 494 469 ENDIF 495 470 … … 497 472 c PRINT*,'CALCUL EN LATITUDE' 498 473 499 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 474 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 500 475 DO l = 1, llm 501 476 c … … 507 482 c de latitude autour du pole (qpns pour le pole nord et qpsn pour 508 483 c le pole nord) qui sera utilisee pour evaluer les pentes au pole. 509 484 510 485 if (pole_nord) then 511 486 DO i = 1, iim … … 514 489 qpns = SSUM( iim, airescb ,1 ) / airej2 515 490 endif 516 491 517 492 if (pole_sud) then 518 493 DO i = 1, iim … … 521 496 qpsn = SSUM( iim, airesch ,1 ) / airejjm 522 497 endif 523 498 524 499 c calcul des pentes aux points v 525 500 … … 528 503 if (pole_nord) ijb=ij_begin 529 504 if (pole_sud) ije=ij_end-iip1 530 505 531 506 ! on a besoin de q entre ij_begin-2*iip1 et ij_end+2*iip1 532 507 ! Si pole sud, entre ij_begin-2*iip1 et ij_end … … 536 511 adyqv(ij)=abs(dyqv(ij)) 537 512 ENDDO 538 513 539 514 540 515 c calcul des pentes aux points scalaires … … 543 518 if (pole_nord) ijb=ij_begin+iip1 544 519 if (pole_sud) ije=ij_end-iip1 545 520 546 521 DO ij=ijb,ije 547 522 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij)) … … 555 530 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 556 531 ENDDO 557 532 558 533 dyn1=0. 559 534 dyn2=0. … … 565 540 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij) 566 541 ENDDO 567 542 568 543 DO ij=1,iip1 569 544 dyq(ij,l)=0. … … 571 546 c ym tout cela ne sert pas a grand chose 572 547 ENDIF 573 548 574 549 IF (pole_sud) THEN 575 550 … … 589 564 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij) 590 565 ENDDO 591 566 592 567 DO ij=1,iip1 593 568 dyq(ip1jm+ij,l)=0. … … 619 594 620 595 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 621 C En memoire de dIFferents tests sur la 596 C En memoire de dIFferents tests sur la 622 597 C limitation des pentes aux poles. 623 598 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC … … 732 707 ijem=ij_end+iip1 733 708 if (pole_nord) ijb=ij_begin 734 if (pole_sud) ije=ij_end 709 if (pole_sud) ije=ij_end 735 710 if (pole_nord) ijbm=ij_begin 736 711 if (pole_sud) ijem=ij_end … … 738 713 do ifils=1,tracers(iq)%nqDescen 739 714 iq2=tracers(iq)%iqDescen(ifils) 740 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 715 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 741 716 DO l=1,llm 742 717 ! modif des bornes: CRisi 16 nov 2020 743 718 ! d'abord masse avec bornes corrigées 744 DO ij=ijbm,ijem 719 DO ij=ijbm,ijem 745 720 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 746 721 masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass) … … 753 728 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 754 729 else 755 Ratio(ij,l,iq2)=min_ratio 756 endif 757 enddo !DO ij=ijbm,ijem 730 Ratio(ij,l,iq2)=min_ratio 731 endif 732 enddo !DO ij=ijbm,ijem 758 733 enddo !DO l=1,llm 759 734 c$OMP END DO NOWAIT … … 765 740 enddo 766 741 ! end CRisi 767 742 768 743 ijb=ij_begin 769 744 ije=ij_end 770 745 if (pole_nord) ijb=ij_begin+iip1 771 746 if (pole_sud) ije=ij_end-iip1 772 773 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 747 748 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 774 749 DO l=1,llm 775 750 DO ij=ijb,ije … … 801 776 enddo 802 777 endif 803 778 804 779 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 805 780 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols 806 781 807 782 if (pole_sud) then 808 783 809 784 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 810 785 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) … … 854 829 do ifils=1,tracers(iq)%nqDescen 855 830 iq2=tracers(iq)%iqDescen(ifils) 856 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 831 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 857 832 DO l=1,llm 858 833 DO ij=ijb,ije 859 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 834 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 860 835 enddo 861 836 enddo … … 866 841 RETURN 867 842 END 868 869 870 843 844 845 871 846 RECURSIVE SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x,iq) 872 847 c 873 c Auteurs: P.Le Van, F.Hourdin, F.Forget 848 c Auteurs: P.Le Van, F.Hourdin, F.Forget 874 849 c 875 850 c ******************************************************************** … … 885 860 USE infotrac, ONLY : nqtot,tracers, ! CRisi & 886 861 & min_qParent,min_qMass,min_ratio ! MVals et CRisi 887 862 888 863 IMPLICIT NONE 889 864 c … … 900 875 INTEGER iq 901 876 c 902 c Local 877 c Local 903 878 c --------- 904 879 c … … 915 890 REAL sigw 916 891 917 LOGICAL testcpu918 SAVE testcpu919 c$OMP THREADPRIVATE(testcpu)920 892 REAL temps0,temps1,temps2,temps3,temps4,temps5,second 921 893 SAVE temps0,temps1,temps2,temps3,temps4,temps5 … … 923 895 924 896 REAL SSUM 925 EXTERNAL SSUM 926 927 DATA testcpu/.false./ 897 928 898 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ 929 899 INTEGER ijb,ije,ijb_x,ije_x … … 933 903 !REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi 934 904 ! Ces varibles doivent être déclarées en pointer et en save dans 935 ! vlz_loc si on veut qu'elles soient vues par tous les threads. 905 ! vlz_loc si on veut qu'elles soient vues par tous les threads. 936 906 INTEGER ifils,iq2 ! CRisi 937 907 … … 939 909 IF (first) THEN 940 910 first=.FALSE. 941 ENDIF 911 ENDIF 942 912 c On oriente tout dans le sens de la pression c'est a dire dans le 943 913 c sens de W 944 914 945 915 !write(*,*) 'vlsplt 926: entree dans vlz_loc, iq=',iq 946 #ifdef BIDON947 IF(testcpu) THEN948 temps0=second(0.)949 ENDIF950 #endif951 916 952 917 ijb=ijb_x 953 918 ije=ije_x 954 919 955 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 920 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 956 921 DO l=2,llm 957 922 DO ij=ijb,ije … … 965 930 DO l=2,llm-1 966 931 DO ij=ijb,ije 967 #ifdef CRAY968 dzq(ij,l)=0.5*969 , cvmgp(dzqw(ij,l)+dzqw(ij,l+1),0.,dzqw(ij,l)*dzqw(ij,l+1))970 #else971 932 IF(dzqw(ij,l)*dzqw(ij,l+1)>0.) THEN 972 933 dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1)) … … 974 935 dzq(ij,l)=0. 975 936 ENDIF 976 #endif977 937 dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1)) 978 938 dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l)) … … 988 948 c$OMP END MASTER 989 949 c$OMP BARRIER 990 #ifdef BIDON991 IF(testcpu) THEN992 temps1=temps1+second(0.)-temps0993 ENDIF994 #endif995 950 996 951 !-------------------------------------------------------- … … 1008 963 ENDDO 1009 964 ENDDO 1010 c$OMP END DO NOWAIT 965 c$OMP END DO NOWAIT 1011 966 1012 967 c --------------------------------------------------------------- … … 1041 996 ENDDO 1042 997 ENDDO 1043 c$OMP END DO NOWAIT 1044 !write(*,*) 'vlz 1001' 998 c$OMP END DO NOWAIT 999 !write(*,*) 'vlz 1001' 1045 1000 1046 1001 ELSE ! countcfl>=1 … … 1079 1034 c on itère jusqu'à ce que tous les poins satisfassent 1080 1035 c le critère 1081 DO WHILE (countcfl>=1) 1036 DO WHILE (countcfl>=1) 1082 1037 IF (prt_level>9) THEN 1083 1038 WRITE(lunout,*)'On viole le CFL Vertical sur ',countcfl,' pts' … … 1130 1085 ENDDO 1131 1086 ENDDO 1132 c$OMP END DO NOWAIT 1087 c$OMP END DO NOWAIT 1133 1088 1134 1089 … … 1162 1117 !wq(ij,l,iq2)=wq(ij,l,iq) ! correction bug le 15mai2015 1163 1118 w(ij,l,iq2)=wq(ij,l,iq) 1164 enddo 1119 enddo 1165 1120 enddo 1166 1121 c$OMP END DO NOWAIT … … 1172 1127 call vlz_loc(Ratio,pente_max,masse,w,ijb_x,ije_x,iq2) 1173 1128 enddo 1174 ! end CRisi 1129 ! end CRisi 1175 1130 1176 1131 ! CRisi: On rajoute ici une barrière car on veut être sur que tous les … … 1190 1145 c$OMP END DO NOWAIT 1191 1146 1192 1147 1193 1148 ! retablir les fils en rapport de melange par rapport a l'air: 1194 1149 do ifils=1,tracers(iq)%nqDescen 1195 1150 iq2=tracers(iq)%iqDescen(ifils) 1196 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1151 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1197 1152 DO l=1,llm 1198 1153 DO ij=ijb,ije 1199 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1154 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1200 1155 enddo 1201 1156 enddo -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlspltqs_loc.F
r5081 r5098 13 13 USE parallel_lmdz 14 14 USE infotrac, ONLY : nqtot,tracers, ! CRisi & 15 & min_qParent,min_qMass,min_ratio ! MVals et CRisi 15 & min_qParent,min_qMass,min_ratio ! MVals et CRisi7 16 16 IMPLICIT NONE 17 17 c … … 91 91 c limitation subtile 92 92 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) 93 93 94 94 95 95 ENDDO … … 100 100 101 101 DO ij=ijb+1,ije 102 #ifdef CRAY103 dxq(ij,l)=104 , cvmgp(dxqu(ij-1)+dxqu(ij),0.,dxqu(ij-1)*dxqu(ij))105 #else106 102 IF(dxqu(ij-1)*dxqu(ij)>0) THEN 107 103 dxq(ij,l)=dxqu(ij-1)+dxqu(ij) … … 110 106 dxq(ij,l)=0. 111 107 ENDIF 112 #endif113 108 dxq(ij,l)=0.5*dxq(ij,l) 114 109 dxq(ij,l)= … … 179 174 180 175 c calcul des flux a gauche et a droite 181 182 #ifdef CRAY183 c--pas encore modification sur Qsat184 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)185 DO l=1,llm186 DO ij=ijb,ije-1187 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),188 , 1.+u_m(ij,l)/masse(ij+1,l,iq),189 , u_m(ij,l))190 zdum(ij,l)=0.5*zdum(ij,l)191 u_mq(ij,l)=cvmgp(192 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),193 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),194 , u_m(ij,l))195 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)196 ENDDO197 ENDDO198 c$OMP END DO NOWAIT199 200 #else201 176 c on cumule le flux correspondant a toutes les mailles dont la masse 202 177 c au travers de la paroi pENDant le pas de temps. … … 217 192 ENDDO 218 193 c$OMP END DO NOWAIT 219 #endif220 194 221 195 … … 466 440 INTEGER ifils,iq2 ! CRisi 467 441 468 REAL SSUM469 470 442 DATA first/.true./ 471 443 INTEGER ijb,ije 472 444 INTEGER ijbm,ijem 445 446 REAL ssum 473 447 474 448 ijb=ij_begin-2*iip1
Note: See TracChangeset
for help on using the changeset viewer.
