Changeset 2036 for LMDZ5/trunk/libf/dyn3dmem
- Timestamp:
- May 5, 2014, 11:38:45 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dyn3dmem/guide_loc_mod.F90
r2034 r2036 368 368 369 369 INTEGER :: i,j,l 370 INTEGER,EXTERNAL :: OMP_GET_THREAD_NUM 370 371 371 372 !$OMP MASTER … … 383 384 !$OMP BARRIER 384 385 385 386 ! PRINT *,'---> on rentre dans guide_main' 386 387 ! CALL AllGather_Field(ucov,ip1jmp1,llm) 387 388 ! CALL AllGather_Field(vcov,ip1jm,llm) … … 429 430 IF (ini_anal) THEN 430 431 CALL guide_interp(ps,teta) 431 !$OMP DO 432 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 432 433 DO l=1,llm 433 434 IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l) … … 447 448 ENDIF 448 449 RETURN 449 ENDIF450 ! Verification structure guidage451 IF (guide_u) THEN452 !+tard CALL writefield_u('unat',unat1)453 ! CALL writefield_u('ucov',ucov)454 ENDIF455 IF (guide_T) THEN456 !+tard CALL writefield_p('tnat',tnat1)457 ! CALL writefield_u('teta',teta)458 450 ENDIF 459 451 … … 534 526 f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav) 535 527 IF (f_out) THEN 536 ! Calcul niveaux pression milieu de couches 537 CALL pression_loc( ijnb_u, ap, bp, ps, p ) 538 if (pressure_exner) then 539 CALL exner_hyb_loc(ip1jmp1,ps,p,pks,pk) 540 else 541 CALL exner_milieu_loc(ip1jmp1,ps,p,pks,pk) 542 endif 543 !$OMP BARRIER 528 529 !$OMP BARRIER 530 CALL pression_loc(ijnb_u,ap,bp,ps,p) 531 532 !$OMP BARRIER 533 if (pressure_exner) then 534 CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk) 535 else 536 CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk ) 537 endif 538 539 !$OMP BARRIER 540 544 541 unskap=1./kappa 545 !$OMP DO 542 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 546 543 DO l = 1, llm 547 544 DO j=jjbu,jjeu … … 551 548 ENDDO 552 549 ENDDO 553 CALL guide_out("SP",jjp1,llm,p,1.) 550 551 !!$OMP MASTER 552 ! DO l=1,llm,5 553 ! print*,'avant dump2d l=',l,mpi_rank,OMP_GET_THREAD_NUM() 554 ! print*,'avant dump2d l=',l,mpi_rank 555 ! CALL dump2d(iip1,jjnb_u,p(:,l),'ppp ') 556 ! ENDDO 557 !!$OMP END MASTER 558 !!$OMP BARRIER 559 560 CALL guide_out("SP",jjp1,llm,p(ijb_u:ije_u,1:llm),1.) 554 561 ENDIF 555 562 556 563 if (guide_u) then 557 564 if (guide_add) then 558 !$OMP DO 565 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 559 566 DO l=1,llm 560 567 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l) 561 568 ENDDO 562 569 else 563 !$OMP DO 570 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 564 571 DO l=1,llm 565 572 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l) … … 575 582 IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt) 576 583 IF (f_out) CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:),factt) 577 !$OMP DO 584 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 578 585 DO l=1,llm 579 586 ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) … … 584 591 if (guide_T) then 585 592 if (guide_add) then 586 !$OMP DO 593 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 587 594 DO l=1,llm 588 595 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l) 589 596 ENDDO 590 597 else 591 !$OMP DO 598 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 592 599 DO l=1,llm 593 600 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l) … … 597 604 CALL guide_addfield_u(llm,f_addu,alpha_T) 598 605 IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt) 599 !$OMP DO 606 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 600 607 DO l=1,llm 601 608 teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) … … 617 624 if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1)) 618 625 CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P) 619 IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(1:ip1jmp1,1)/factt,factt)626 ! IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt) 620 627 !$OMP MASTER 621 628 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1) … … 629 636 if (guide_Q) then 630 637 if (guide_add) then 631 !$OMP DO 638 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 632 639 DO l=1,llm 633 640 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l) 634 641 ENDDO 635 642 else 636 !$OMP DO 643 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 637 644 DO l=1,llm 638 645 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l) … … 643 650 IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt) 644 651 645 !$OMP DO 652 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 646 653 DO l=1,llm 647 654 q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) … … 651 658 if (guide_v) then 652 659 if (guide_add) then 653 !$OMP DO 660 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 654 661 DO l=1,llm 655 662 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l) … … 657 664 658 665 else 659 !$OMP DO 666 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 660 667 DO l=1,llm 661 668 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l) … … 671 678 IF (f_out) CALL guide_out("vcov",jjm,llm,f_addv(:,:)/factt,factt) 672 679 673 !$OMP DO 680 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 674 681 DO l=1,llm 675 682 vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l) … … 695 702 INTEGER :: l 696 703 697 !$OMP DO 704 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 698 705 DO l=1,vsize 699 706 field(ijbu:ijeu,l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l) … … 718 725 INTEGER :: l 719 726 720 !$OMP DO 727 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 721 728 DO l=1,vsize 722 729 field(ijbv:ijev,l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l) … … 771 778 772 779 773 !$OMP DO 780 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 774 781 DO l=1,vsize 775 782 fieldm(:,l)=0. … … 841 848 ENDIF 842 849 843 !$OMP DO 850 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 844 851 DO l=1,vsize 845 852 ! Compute zonal average … … 991 998 ! .... Calcul de pls , pression au milieu des couches ,en Pascals 992 999 IF (guide_plevs.EQ.1) THEN 993 !$OMP DO 1000 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 994 1001 DO l=1,llm 995 1002 DO j=jjbu,jjeu … … 1008 1015 unskap=1./kappa 1009 1016 !$OMP BARRIER 1010 !$OMP DO 1017 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1011 1018 DO l = 1, llm 1012 1019 DO j=jjbu,jjeu … … 1019 1026 1020 1027 ! calcul des pressions pour les grilles u et v 1021 !$OMP DO 1028 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1022 1029 do l=1,llm 1023 1030 do j=jjbu,jjeu … … 1036 1043 call massbar_loc(pext, pbarx, pbary ) 1037 1044 !$OMP BARRIER 1038 !$OMP DO 1045 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1039 1046 do l=1,llm 1040 1047 do j=jjbu,jjeu … … 1045 1052 enddo 1046 1053 enddo 1047 !$OMP DO 1054 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1048 1055 do l=1,llm 1049 1056 do j=jjbv,jjev … … 1106 1113 !$OMP BARRIER 1107 1114 ! Conversion en variables GCM 1108 !$OMP DO 1115 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1109 1116 do l=1,llm 1110 1117 do j=jjbu,jjeu … … 1176 1183 ! On suppose qu'on a la bonne variable dans le fichier de guidage: 1177 1184 ! Hum.Rel si guide_hr, Hum.Spec. sinon. 1178 !$OMP DO 1185 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1179 1186 do l=1,llm 1180 1187 do j=jjbu,jjeu … … 1201 1208 enddo 1202 1209 IF (guide_hr) THEN 1203 !$OMP DO 1210 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1204 1211 do l=1,llm 1205 1212 CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp, & … … 1254 1261 1255 1262 ! Conversion en variables GCM 1256 !$OMP DO 1263 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1257 1264 do l=1,llm 1258 1265 do j=jjbu,jjeu … … 1329 1336 !$OMP BARRIER 1330 1337 ! Conversion en variables GCM 1331 !$OMP DO 1338 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1332 1339 do l=1,llm 1333 1340 do j=jjbv,jjev … … 2069 2076 2070 2077 IF (invert_y) THEN 2078 2071 2079 ! PRINT*,"Invertion impossible actuellement" 2072 2080 ! CALL abort_gcm(modname,abort_message,1) … … 2118 2126 CHARACTER*(*), INTENT(IN) :: varname 2119 2127 INTEGER, INTENT (IN) :: hsize,vsize 2120 REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc 2121 REAL, INTENT (IN) :: factt 2128 ! REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc 2129 REAL, DIMENSION (:,:), INTENT(IN) :: field_loc 2130 REAL factt 2122 2131 2123 2132 ! Variables locales … … 2131 2140 INTEGER :: ierr, varid,l 2132 2141 REAL zu(ip1jmp1),zv(ip1jm) 2133 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: field_glo2142 REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: field_glo 2134 2143 2135 2144 !$OMP MASTER 2136 2137 2145 ALLOCATE(field_glo(iip1,hsize,vsize)) 2146 !$OMP END MASTER 2147 !$OMP BARRIER 2148 2149 print*,'gvide_out apres allocation ',hsize,vsize 2150 2138 2151 IF (hsize==jjp1) THEN 2139 CALL gather_field_u(field_loc,field_glo,vsize)2152 CALL gather_field_u(field_loc,field_glo,vsize) 2140 2153 ELSE IF (hsize==jjm) THEN 2141 2154 CALL gather_field_v(field_loc,field_glo, vsize) 2142 2155 ENDIF 2143 2156 2157 print*,'guide_out apres gather ' 2144 2158 CALL Gather_field_u(alpha_u,zu,1) 2145 2159 CALL Gather_field_v(alpha_v,zv,1) 2160 2161 IF (mpi_rank > 0) THEN 2162 !$OMP MASTER 2163 DEALLOCATE(field_glo) 2146 2164 !$OMP END MASTER 2147 2165 !$OMP BARRIER 2148 2166 2149 IF (mpi_rank /= 0) RETURN 2167 RETURN 2168 ENDIF 2150 2169 2151 2170 !$OMP MASTER 2152 ! print *,'Guide: output timestep',timestep,'var ',varname2153 2171 IF (timestep.EQ.0) THEN 2154 2172 ! ---------------------------------------------- … … 2262 2280 END SELECT 2263 2281 2282 !$OMP END MASTER 2283 !$OMP BARRIER 2284 2264 2285 SELECT CASE (varname) 2265 2286 2266 2287 CASE("u","ua") 2267 DO l=1,llm ; field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm) ; ENDDO 2288 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 2289 DO l=1,llm ; print*,'l field-glo',vsize,llm,l ; field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm) ; ENDDO 2268 2290 field_glo(:,1,:)=0. ; field_glo(:,jjp1,:)=0. 2269 2291 CASE("v","va") 2292 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 2270 2293 DO l=1,llm ; field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:) ; ENDDO 2271 2294 END SELECT … … 2275 2298 ! call dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ') 2276 2299 ! endif 2300 2301 !$OMP MASTER 2302 2277 2303 #ifdef NC_DOUBLE 2278 2304 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field_glo) … … 2283 2309 ierr = NF_CLOSE(nid) 2284 2310 2285 2311 DEALLOCATE(field_glo) 2286 2312 !$OMP END MASTER 2287 2313 !$OMP BARRIER
Note: See TracChangeset
for help on using the changeset viewer.