Changeset 71 for trunk/SOURCES/flottab2-0.7.f90
- Timestamp:
- 06/15/16 17:13:33 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SOURCES/flottab2-0.7.f90
r58 r71 16 16 module flottab_mod 17 17 18 !$ USE OMP_LIB 18 19 USE module3D_phy 19 20 use module_choix … … 104 105 105 106 107 !~ integer :: t1,t2,ir 108 !~ real :: temps, t_cpu_0, t_cpu_1, t_cpu, norme 109 110 !~ ! Temps CPU de calcul initial. 111 !~ call cpu_time(t_cpu_0) 112 !~ ! Temps elapsed de reference. 113 !~ call system_clock(count=t1, count_rate=ir) 114 106 115 107 116 if (itracebug.eq.1) call tracebug(' Entree dans routine flottab') … … 112 121 ! cas particulier des runs paleo ou on impose un masque grounded 113 122 123 !$OMP PARALLEL PRIVATE(archim,surnet) 114 124 if (igrdline.eq.2) then 125 !$OMP WORKSHARE 115 126 where ( mk_init(:,:).eq.1) ! pose 116 127 flot(:,:) = .False. … … 120 131 flot(:,:) = .True. 121 132 end where 133 !$OMP END WORKSHARE 122 134 end if 123 135 … … 129 141 130 142 appel_new_flot=.false. 143 !$OMP DO 131 144 do j=1,ny 132 145 do i=1,nx … … 136 149 enddo 137 150 enddo 138 151 !$OMP END DO 152 139 153 ! ICE(:,:)=(H(:,:).gt.1) ! ice=.true. si epaisseur > 1m 140 154 155 !$OMP WORKSHARE 141 156 ICE(:,:)=0 142 157 front(:,:)=0 … … 148 163 cotemy(:,:)=.false. 149 164 boost=.false. 165 !$OMP END WORKSHARE 150 166 151 167 ! fin de l'initialisation … … 155 171 ! ------------------------------------- 156 172 157 173 !$OMP DO 158 174 do j=1,ny 159 175 do i=1,nx … … 223 239 end do 224 240 end do 225 241 !$OMP END DO 226 242 227 243 !!$ do i=1,nx … … 240 256 241 257 !----------------------------------------------------------------------- 242 258 !$OMP DO 243 259 domain_x: do j=1,ny 244 260 do i=2,nx … … 280 296 end do 281 297 end do domain_x 282 283 if (itracebug.eq.1) call tracebug(' routine flottab apres domain_x')298 !$OMP END DO 299 !if (itracebug.eq.1) call tracebug(' routine flottab apres domain_x') 284 300 285 301 ! 3_y B- NOUVELLE DEFINITION DE FLOTMY 286 302 ! -------------------------------- 303 !$OMP DO 287 304 domain_y: do j=2,ny 288 305 do i=1,nx … … 318 335 end do 319 336 end do domain_y 320 337 !$OMP END DO 321 338 322 339 … … 351 368 ! 4- determination des iles 352 369 ! ------------------------- 353 370 !$OMP WORKSHARE 354 371 ilemx(:,:)=.false. 355 372 ilemy(:,:)=.false. 356 357 ! selon x 373 !$OMP END WORKSHARE 374 375 ! selon x 376 !$OMP DO 358 377 ilesx: do j=2,ny-1 359 378 do i=3,nx-2 … … 404 423 end do 405 424 end do ilesx 406 407 ! selon y 425 !$OMP END DO 426 427 ! selon y 428 !$OMP DO 408 429 ilesy: do j=3,ny-2 409 430 do i=2,nx-1 … … 452 473 end do 453 474 end do ilesy 475 !$OMP END DO 476 !$OMP END PARALLEL 454 477 ! fin des iles 455 478 … … 479 502 480 503 ! 6- calcule les vitesses des points qui sont devenus gzm 481 504 !$OMP PARALLEL 505 !$OMP DO 482 506 do j=1,ny 483 507 do i=2,nx-1 … … 492 516 end do 493 517 end do 494 518 !$OMP END DO 519 520 !$OMP DO 495 521 do j=2,ny-1 496 522 do i=1,nx … … 504 530 end do 505 531 end do 506 532 !$OMP END DO 507 533 508 534 … … 511 537 512 538 if (nt.ge.2) then ! pour ne pas faire ce calcul lors du premier passage 539 !$OMP WORKSHARE 513 540 uxbar(:,:)=uxs1(:,:) 514 uybar(:,:)=uys1(:,:) 541 uybar(:,:)=uys1(:,:) 542 !$OMP END WORKSHARE 515 543 endif 516 544 545 !$OMP WORKSHARE 517 546 flgzmx(:,:)=(marine.and.(flotmx(:,:).or.gzmx(:,:).or.ilemx(:,:))) & 518 547 .or.(.not.marine.and.flotmx(:,:)) 519 548 flgzmy(:,:)=(marine.and.(flotmy(:,:).or.gzmy(:,:).or.ilemy(:,:))) & 520 549 .or.(.not.marine.and.flotmy(:,:)) 521 550 !$OMP END WORKSHARE 522 551 523 552 … … 526 555 ! fbm est vrai si le point est flottant mais un des voisins est pose 527 556 !_________________________________________________________________________ 557 !$OMP DO 528 558 do j=2,ny-1 529 559 do i=2,nx-1 … … 536 566 end do 537 567 end do 538 568 !$OMP END DO 539 569 540 570 … … 552 582 !!$end do 553 583 584 !$OMP WORKSHARE 554 585 where (flot(:,:)) 555 586 where (H(:,:).gt.(1.1)) … … 565 596 end where 566 597 end where 598 !$OMP END WORKSHARE 599 !$OMP END PARALLEL 567 600 568 601 call DETERMIN_TACHE … … 581 614 !----------------------------------------------! 582 615 !On determine les differents ice strean/shelf ! 583 call DETERMIN_TACHE !616 ! call DETERMIN_TACHE ! 584 617 !----------------------------------------------! 585 618 … … 597 630 598 631 !On compte comme englacé uniquement les calottes dont une partie est posée 599 632 !$OMP PARALLEL PRIVATE(smax_,smax_coord,smax_i,smax_j) 633 !$OMP DO 600 634 do i=3,nx-2 601 635 do j=3,ny-2 … … 666 700 end do 667 701 end do 668 702 !$OMP END DO 703 !$OMP END PARALLEL 669 704 670 705 !---------------------------------------------- … … 691 726 !print*, 'front',front(50,30),ice(50,30),flotmx(i,j),uxbar(i,j) 692 727 693 728 !~ ! Temps elapsed final 729 !~ call system_clock(count=t2, count_rate=ir) 730 !~ temps=real(t2 - t1,kind=4)/real(ir,kind=4) 731 !~ ! Temps CPU de calcul final 732 !~ call cpu_time(t_cpu_1) 733 !~ t_cpu = t_cpu_1 - t_cpu_0 734 735 !~ ! Impression du resultat. 736 !~ print '(//,3X,"Valeurs de nx et ny : ",I5,I5/, & 737 !~ & 3X,"Temps elapsed : ",1PE10.3," sec.",/, & 738 !~ & 3X,"Temps CPU : ",1PE10.3," sec.",/, & 739 !~ & 3X,"Norme (PB si /= 0) : ",1PE10.3,//)', & 740 !~ nx,ny,temps,t_cpu,norme 694 741 695 742 end subroutine flottab … … 700 747 !> 701 748 subroutine determin_tache 749 750 !!$ USE OMP_LIB 702 751 703 752 implicit none … … 720 769 enddo 721 770 ! table_in = .false. 722 771 !!$OMP PARALLEL 772 !!$OMP WORKSHARE 723 773 table_out(:,:) = 0 724 774 iceberg(:) = .true. 725 775 icetrim (:) = .true. 726 776 nb_pts_tache(:) = 0 727 777 !!$OMP END WORKSHARE 778 !!$OMP END PARALLEL 728 779 ! open(unit=100,file="tache.data",status='replace') 729 780 730 781 ! 2-reperage des taches 731 782 !---------------------- 783 !!$OMP PARALLEL PRIVATE(mask,label,indice) 784 !!$OMP DO 732 785 do i=2,nx-1 733 786 do j=2,ny-1 … … 736 789 737 790 IF (ice(i,j).ge.1) THEN ! on est sur la glace-----------------------------! 738 791 739 792 if ((ice(i-1,j).ge.1).or.(ice(i,j-1).ge.1)) then !masque de 2 cases adjacentes 740 793 ! un des voisins est deja en glace … … 747 800 if (mask(indice).gt.0) label=min(label,mask(indice)) 748 801 enddo 802 !cdc label=min(label,minval(mask(:), mask=mask > 0)) 749 803 750 804 !on fixe la valeur de la tache voisine minimun au point etudie (via label) … … 798 852 enddo 799 853 enddo 800 854 !!$OMP END DO 855 !!$OMP END PARALLEL 801 856 802 857 803 858 ! On reorganise compt en ecrivant le numero de la tache fondamentale 804 859 ! i.e. du plus petit numero present sur la tache (Sans utiliser de recursivité) 805 ! On indique aussi le nb de point que contient chaque taches (nb_pts_tache) 860 ! On indique aussi le nb de point que contient chaque taches (nb_pts_tache) 861 806 862 do indice=1,label_max 807 863 vartemp = compt(indice) … … 813 869 enddo 814 870 871 !!$OMP PARALLEL 872 !!$OMP DO REDUCTION(+:nb_pts_tache) 815 873 do i=1,nx 816 874 do j=1,ny … … 821 879 enddo 822 880 enddo 823 824 881 !!$OMP END DO 882 !!$OMP END PARALLEL 825 883 826 884 … … 853 911 !> 854 912 subroutine determin_front 855 913 !!$ USE OMP_LIB 856 914 integer :: i_moins1,i_plus1,i_plus2 857 915 integer :: j_moins1,j_plus1,j_plus2 858 916 859 do i=3,nx-2 860 do j=3,ny-2 917 !!$OMP PARALLEL 918 !!$OMP DO 919 do j=3,ny-2 920 do i=3,nx-2 861 921 862 922 surice:if (ice(i,j).eq.0) then … … 910 970 end do 911 971 end do 912 972 !!$OMP END DO 913 973 914 974 !!$call detect_assym(nx,ny,0,41,1,0,1,0,H,itestf) … … 923 983 924 984 ! print*,'dans remplissage baies',time 985 925 986 baies: do k=1,2 987 !!$OMP DO PRIVATE(i_moins1,j_moins1,i_plus1,j_plus1,i_plus2,j_plus2) 926 988 do j=1,ny 927 989 do i=1,nx … … 958 1020 end do 959 1021 end do 1022 !!$OMP END DO 960 1023 end do baies 961 1024 … … 969 1032 !!$end if 970 1033 971 972 do i=2,nx-1973 do j=2,ny-11034 !!$OMP DO 1035 do j=2,ny-1 1036 do i=2,nx-1 974 1037 975 1038 if (ice(i,j).eq.1) then ! test si ice=1 … … 983 1046 end do 984 1047 end do 1048 !!$OMP END DO 985 1049 986 1050 ! traitement des bords. On considere que l'exterieur n'a pas de glace 987 1051 ! attention ce n'est vrai que sur la grande grille 988 1052 989 1053 !!$OMP DO PRIVATE(i) 990 1054 do j=2,ny-1 991 1055 i=1 … … 994 1058 front(i,j)=(ice(i-1,j)+ice(i,j+1)+ice(i,j-1)) 995 1059 end do 996 1060 !!$OMP END DO 1061 1062 !!$OMP DO PRIVATE(j) 997 1063 do i=2,nx-1 998 1064 j=1 … … 1001 1067 front(i,j)=(ice(i-1,j)+ice(i+1,j)+ice(i,j-1)) 1002 1068 end do 1003 1069 !!$OMP END DO 1004 1070 ! traitement des coins 1005 1071 … … 1023 1089 ! si ces deux taches sont posées (ou une des deux), il n'y a pas assez de conditions aux limites 1024 1090 1025 1091 !!$OMP DO 1026 1092 do j=1,ny 1027 1093 do i=1,nx-1 … … 1036 1102 end do 1037 1103 end do 1038 1104 !!$OMP END DO 1105 1106 !!$OMP DO 1039 1107 do j=1,ny-1 1040 1108 do i=1,nx … … 1049 1117 end do 1050 1118 end do 1119 !!$OMP END DO 1051 1120 1052 1121 !isolx signifie pas de voisins en x … … 1056 1125 1057 1126 ! calcul de frontfacex et isolx 1127 !!$OMP DO 1058 1128 do j=1,ny 1059 1129 do i=2,nx-1 … … 1075 1145 end do 1076 1146 end do 1147 !!$OMP END DO 1077 1148 1078 1149 ! calcul de frontfacey et isoly 1150 !!$OMP DO 1079 1151 do j=2,ny-1 1080 1152 do i=1,nx … … 1096 1168 end do 1097 1169 end do 1098 1170 !!$OMP END DO 1099 1171 1100 1172 … … 1102 1174 ! attention ce n'est vrai que sur la grande grille 1103 1175 1104 1176 !!$OMP DO PRIVATE(i) 1105 1177 do j=2,ny-1 1106 1178 i=1 … … 1121 1193 end if 1122 1194 end do 1123 1195 !!$OMP END DO 1196 1197 !!$OMP DO PRIVATE(j) 1124 1198 do i=2,nx-1 1125 1199 j=1 … … 1140 1214 end if 1141 1215 end do 1142 1143 1216 !!$OMP END DO 1217 !!OMP END PARALLEL 1144 1218 1145 1219 return
Note: See TracChangeset
for help on using the changeset viewer.