Ignore:
Timestamp:
06/15/16 17:13:33 (8 years ago)
Author:
dumas
Message:

First parallelization instructions with OpenMP tested in debug : exactly the same results | isostasy called only every 50 years

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SOURCES/flottab2-0.7.f90

    r58 r71  
    1616module flottab_mod 
    1717   
     18  !$ USE OMP_LIB 
    1819USE module3D_phy 
    1920use module_choix 
     
    104105 
    105106 
     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 
    106115 
    107116if (itracebug.eq.1)  call tracebug(' Entree dans routine flottab') 
     
    112121! cas particulier des runs paleo ou on impose un masque grounded 
    113122 
     123!$OMP PARALLEL PRIVATE(archim,surnet) 
    114124 if (igrdline.eq.2) then 
     125    !$OMP WORKSHARE 
    115126    where ( mk_init(:,:).eq.1)                 ! pose 
    116127       flot(:,:) = .False. 
     
    120131       flot(:,:) = .True. 
    121132    end where 
     133    !$OMP END WORKSHARE 
    122134 end if 
    123135 
     
    129141 
    130142       appel_new_flot=.false. 
     143       !$OMP DO 
    131144       do j=1,ny 
    132145          do i=1,nx 
     
    136149          enddo 
    137150       enddo 
    138  
     151       !$OMP END DO 
     152        
    139153! ICE(:,:)=(H(:,:).gt.1) ! ice=.true. si epaisseur > 1m 
    140154 
     155      !$OMP WORKSHARE 
    141156      ICE(:,:)=0 
    142157      front(:,:)=0 
     
    148163      cotemy(:,:)=.false. 
    149164      boost=.false. 
     165      !$OMP END WORKSHARE 
    150166 
    151167! fin de l'initialisation 
     
    155171! ------------------------------------- 
    156172 
    157  
     173 !$OMP DO 
    158174 do j=1,ny 
    159175   do i=1,nx 
     
    223239    end do 
    224240 end do 
    225  
     241 !$OMP END DO 
    226242 
    227243!!$ do i=1,nx 
     
    240256 
    241257!----------------------------------------------------------------------- 
    242  
     258 !$OMP DO 
    243259domain_x: do j=1,ny        
    244260         do i=2,nx 
     
    280296          end do 
    281297       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') 
    284300 
    285301!     3_y    B- NOUVELLE DEFINITION DE FLOTMY 
    286302!         -------------------------------- 
     303 !$OMP DO 
    287304domain_y: do j=2,ny        
    288305         do i=1,nx 
     
    318335          end do 
    319336       end do domain_y 
    320  
     337 !$OMP END DO 
    321338 
    322339 
     
    351368!      4- determination des iles 
    352369!      ------------------------- 
    353   
     370          !$OMP WORKSHARE 
    354371          ilemx(:,:)=.false. 
    355372          ilemy(:,:)=.false. 
    356  
    357 !       selon x  
     373          !$OMP END WORKSHARE 
     374 
     375!       selon x 
     376  !$OMP DO 
    358377ilesx:  do j=2,ny-1 
    359378           do i=3,nx-2 
     
    404423         end do 
    405424      end do ilesx 
    406  
    407 !       selon y  
     425   !$OMP END DO 
     426 
     427!       selon y 
     428   !$OMP DO 
    408429ilesy: do j=3,ny-2 
    409430           do i=2,nx-1 
     
    452473         end do 
    453474      end do ilesy 
     475    !$OMP END DO 
     476    !$OMP END PARALLEL 
    454477! fin des iles 
    455478 
     
    479502 
    480503!   6- calcule les vitesses des points qui sont devenus gzm 
    481           
     504!$OMP PARALLEL 
     505!$OMP DO          
    482506do j=1,ny 
    483507   do i=2,nx-1 
     
    492516   end do 
    493517end do 
    494  
     518!$OMP END DO 
     519 
     520!$OMP DO  
    495521do j=2,ny-1 
    496522   do i=1,nx 
     
    504530    end do 
    505531end do 
    506  
     532!$OMP END DO 
    507533 
    508534 
     
    511537 
    512538if (nt.ge.2) then   ! pour ne pas faire ce calcul lors du premier passage 
     539   !$OMP WORKSHARE 
    513540   uxbar(:,:)=uxs1(:,:) 
    514    uybar(:,:)=uys1(:,:)  
     541   uybar(:,:)=uys1(:,:) 
     542   !$OMP END WORKSHARE 
    515543endif 
    516544 
     545!$OMP WORKSHARE 
    517546flgzmx(:,:)=(marine.and.(flotmx(:,:).or.gzmx(:,:).or.ilemx(:,:)))   & 
    518547     .or.(.not.marine.and.flotmx(:,:)) 
    519548flgzmy(:,:)=(marine.and.(flotmy(:,:).or.gzmy(:,:).or.ilemy(:,:)))   & 
    520549     .or.(.not.marine.and.flotmy(:,:)) 
    521  
     550!$OMP END WORKSHARE 
    522551 
    523552 
     
    526555!       fbm est vrai si le point est flottant mais un des voisins est pose  
    527556!_________________________________________________________________________ 
     557!$OMP DO 
    528558do j=2,ny-1 
    529559  do i=2,nx-1 
     
    536566  end do 
    537567end do 
    538  
     568!$OMP END DO 
    539569 
    540570 
     
    552582!!$end do 
    553583 
     584!$OMP WORKSHARE 
    554585where (flot(:,:)) 
    555586   where (H(:,:).gt.(1.1))  
     
    565596   end where 
    566597end where 
     598!$OMP END WORKSHARE 
     599!$OMP END PARALLEL 
    567600 
    568601call DETERMIN_TACHE  
     
    581614!----------------------------------------------! 
    582615!On determine les differents ice strean/shelf  ! 
    583       call DETERMIN_TACHE                      ! 
     616!      call DETERMIN_TACHE                      ! 
    584617!----------------------------------------------! 
    585618 
     
    597630 
    598631!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 
    600634do i=3,nx-2 
    601635   do j=3,ny-2 
     
    666700   end do 
    667701end do 
    668  
     702!$OMP END DO 
     703!$OMP END PARALLEL 
    669704 
    670705!---------------------------------------------- 
     
    691726!print*, 'front',front(50,30),ice(50,30),flotmx(i,j),uxbar(i,j) 
    692727 
    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 
    694741 
    695742end subroutine flottab 
     
    700747!> 
    701748subroutine determin_tache 
     749 
     750!!$ USE OMP_LIB 
    702751 
    703752implicit none 
     
    720769enddo 
    721770!      table_in  = .false. 
    722  
     771!!$OMP PARALLEL 
     772!!$OMP WORKSHARE 
    723773table_out(:,:) = 0 
    724774iceberg(:)  = .true. 
    725775icetrim (:) = .true. 
    726776nb_pts_tache(:) = 0 
    727  
     777!!$OMP END WORKSHARE 
     778!!$OMP END PARALLEL 
    728779!    open(unit=100,file="tache.data",status='replace') 
    729780 
    730781! 2-reperage des taches 
    731782!---------------------- 
     783!!$OMP PARALLEL PRIVATE(mask,label,indice) 
     784!!$OMP DO 
    732785do i=2,nx-1 
    733786  do j=2,ny-1 
     
    736789 
    737790     IF (ice(i,j).ge.1) THEN ! on est sur la glace-----------------------------! 
    738  
     791                         
    739792        if ((ice(i-1,j).ge.1).or.(ice(i,j-1).ge.1)) then   !masque de 2 cases adjacentes 
    740793           !      un des voisins est deja en glace 
     
    747800              if (mask(indice).gt.0) label=min(label,mask(indice)) 
    748801           enddo 
     802!cdc       label=min(label,minval(mask(:), mask=mask > 0)) 
    749803 
    750804           !on fixe la valeur de la tache voisine minimun au point etudie (via label) 
     
    798852  enddo 
    799853enddo 
    800  
     854!!$OMP END DO 
     855!!$OMP END PARALLEL 
    801856 
    802857 
    803858! On reorganise compt en ecrivant le numero de la tache fondamentale 
    804859! 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 
    806862do indice=1,label_max 
    807863   vartemp = compt(indice) 
     
    813869enddo 
    814870 
     871!!$OMP PARALLEL 
     872!!$OMP DO REDUCTION(+:nb_pts_tache) 
    815873do i=1,nx 
    816874   do j=1,ny 
     
    821879   enddo 
    822880enddo 
    823  
    824  
     881!!$OMP END DO 
     882!!$OMP END PARALLEL 
    825883 
    826884 
     
    853911!> 
    854912subroutine determin_front 
    855  
     913!!$ USE OMP_LIB 
    856914integer :: i_moins1,i_plus1,i_plus2 
    857915integer :: j_moins1,j_plus1,j_plus2 
    858916       
    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 
    861921 
    862922 surice:if  (ice(i,j).eq.0) then 
     
    910970       end do 
    911971      end do 
    912  
     972      !!$OMP END DO 
    913973 
    914974!!$call detect_assym(nx,ny,0,41,1,0,1,0,H,itestf) 
     
    923983 
    924984!     print*,'dans remplissage baies',time 
     985        
    925986baies: do k=1,2 
     987!!$OMP DO PRIVATE(i_moins1,j_moins1,i_plus1,j_plus1,i_plus2,j_plus2) 
    926988do j=1,ny 
    927989   do i=1,nx 
     
    9581020   end do 
    9591021end do 
     1022!!$OMP END DO 
    9601023end do baies 
    9611024 
     
    9691032!!$end if 
    9701033 
    971  
    972 do i=2,nx-1 
    973    do j=2,ny-1 
     1034!!$OMP DO 
     1035do j=2,ny-1 
     1036   do i=2,nx-1 
    9741037 
    9751038      if (ice(i,j).eq.1) then     !         test si ice=1 
     
    9831046   end do 
    9841047end do 
     1048!!$OMP END DO 
    9851049 
    9861050! traitement des bords. On considere que l'exterieur n'a pas de glace 
    9871051! attention ce n'est vrai que sur la grande grille 
    9881052 
    989  
     1053!!$OMP DO PRIVATE(i) 
    9901054do j=2,ny-1 
    9911055   i=1 
     
    9941058   front(i,j)=(ice(i-1,j)+ice(i,j+1)+ice(i,j-1)) 
    9951059end do 
    996  
     1060!!$OMP END DO  
     1061 
     1062!!$OMP DO PRIVATE(j) 
    9971063do i=2,nx-1 
    9981064   j=1  
     
    10011067   front(i,j)=(ice(i-1,j)+ice(i+1,j)+ice(i,j-1)) 
    10021068end do 
    1003  
     1069!!$OMP END DO  
    10041070! traitement des coins 
    10051071 
     
    10231089!   si ces deux taches sont posées (ou une des deux), il n'y a pas assez de conditions aux limites 
    10241090 
    1025  
     1091!!$OMP DO  
    10261092do j=1,ny 
    10271093   do i=1,nx-1 
     
    10361102   end do 
    10371103end do 
    1038  
     1104!!$OMP END DO 
     1105 
     1106!!$OMP DO  
    10391107do j=1,ny-1 
    10401108   do i=1,nx 
     
    10491117   end do 
    10501118end do 
     1119!!$OMP END DO 
    10511120 
    10521121!isolx signifie pas de voisins en x 
     
    10561125 
    10571126! calcul de frontfacex et isolx 
     1127!!$OMP DO 
    10581128do j=1,ny 
    10591129   do i=2,nx-1 
     
    10751145   end do 
    10761146end do 
     1147!!$OMP END DO 
    10771148 
    10781149! calcul de frontfacey et isoly 
     1150!!$OMP DO 
    10791151do j=2,ny-1 
    10801152   do i=1,nx 
     
    10961168   end do 
    10971169end do 
    1098  
     1170!!$OMP END DO 
    10991171 
    11001172 
     
    11021174! attention ce n'est vrai que sur la grande grille 
    11031175 
    1104  
     1176!!$OMP DO PRIVATE(i) 
    11051177do j=2,ny-1 
    11061178   i=1 
     
    11211193   end if 
    11221194end do 
    1123  
     1195!!$OMP END DO 
     1196 
     1197!!$OMP DO PRIVATE(j) 
    11241198do i=2,nx-1 
    11251199   j=1  
     
    11401214   end if 
    11411215end do 
    1142  
    1143  
     1216!!$OMP END DO 
     1217!!OMP END PARALLEL 
    11441218 
    11451219return 
Note: See TracChangeset for help on using the changeset viewer.