Ignore:
Timestamp:
06/29/16 16:21:13 (8 years ago)
Author:
dumas
Message:

OpenMP parallelization in conserv-mass-adv-diff_sept2009_mod.f90, diffusiv-polyn-0.6.f90, dragging_neff_slope_mod.f90, eaubasale-0.5_mod.f90 and relaxation_water_diffusion.f90

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SOURCES/conserv-mass-adv-diff_sept2009_mod.f90

    r65 r76  
    8080subroutine icethick3 
    8181 
     82!$ USE OMP_LIB 
     83 
    8284implicit none 
    8385real,dimension(nx,ny) :: Dminx,Dminy 
     
    9294! Copie de H sur vieuxH         
    9395! -------------------- 
     96!$OMP PARALLEL 
     97!$OMP WORKSHARE 
    9498where (mk0(:,:).eq.0) 
    9599   vieuxH(:,:)=0. 
     
    99103   vieuxH(:,:)=H(:,:) 
    100104end where 
     105!$OMP END WORKSHARE 
    101106 
    102107! mk0 est le masque à ne jamais dépasser 
     
    110115jmaxdia=0 
    111116 
    112 ! attention limitation !  
     117! attention limitation ! 
     118!$OMP WORKSHARE  
    113119uxbar(:,:)=max(uxbar(:,:),-V_limit) 
    114120uxbar(:,:)=min(uxbar(:,:),V_limit) 
    115121uybar(:,:)=max(uybar(:,:),-V_limit) 
    116122uybar(:,:)=min(uybar(:,:),V_limit) 
     123!$OMP END WORKSHARE 
    117124 
    118125! le pas de temps est choisi pour rendre la matrice advective diagonale dominante 
    119 do i=2,nx-1 
    120    do j=2,ny-1 
     126!$OMP END PARALLEL 
     127!$OMP PARALLEL 
     128!$OMP DO PRIVATE(aux) 
     129!do i=2,nx-1 
     130!   do j=2,ny-1 
     131do j=2,ny-1 
     132  do i=2,nx-1 
    121133      aux = (abs(uxbar(i,j)) + abs(uxbar(i+1,j))) & 
    122134           + (abs(uybar(i,j)) + abs(uybar(i,j+1))) 
    123135      aux=aux*dx1*0.5 
     136      !$OMP CRITICAL 
    124137      if (aux.gt.maxdia) then 
    125138         maxdia=aux 
    126          imaxdia=i 
    127          jmaxdia=j 
     139!         imaxdia=i 
     140!         jmaxdia=j 
    128141      endif 
     142      !$OMP END CRITICAL 
    129143   end do 
    130144end do 
    131  
     145!$OMP END DO 
     146!$OMP END PARALLEL 
    132147 
    133148if (maxdia.ge.(testdiag/dtmax)) then 
     
    141156! avec le pas de temps long (dtt) 
    142157 
    143  call next_time(time,dt,dtt,dtmax,dtmin,isynchro,itracebug,num_tracebug) 
     158call next_time(time,dt,dtt,dtmax,dtmin,isynchro,itracebug,num_tracebug) 
    144159 
    145160 
    146161! calcul diffusivite - vitesse  
    147162!-----------------------------------------------------------------  
    148  
     163!$OMP PARALLEL 
     164!$OMP WORKSHARE 
    149165Uxdiff(:,:)=diffmx(:,:)*(-sdx(:,:))   ! vitesse qui peut s'exprimer en terme diffusif 
    150166Uydiff(:,:)=diffmy(:,:)*(-sdy(:,:))   ! dans les where qui suivent elle est limitee a uxbar 
     
    172188  uydiff(:,:)=max(uydiff(:,:),uybar(:,:))       ! pour tenir compte limitation utot 
    173189end where 
    174  
     190!$OMP END WORKSHARE 
    175191 
    176192 
     
    179195 
    180196if (adv_frac.gt.1.) then ! advection seulement 
     197   !$OMP WORKSHARE 
    181198   advmx(:,:)=Uxbar(:,:) 
    182199   advmy(:,:)=Uybar(:,:) 
    183200   Dmx(:,:)=0. 
    184201   Dmy(:,:)=0. 
    185  
     202   !$OMP END WORKSHARE 
    186203else if (abs(adv_frac).lt.1.e-8) then   ! diffusion seulement 
     204   !$OMP WORKSHARE 
    187205   advmx(:,:)=0. 
    188206   advmy(:,:)=0. 
    189  
     207   !$OMP END WORKSHARE 
    190208   ! D reste la valeur au dessus) 
    191209 
     
    197215! diffusion = ce qui peut être exprime en diffusion  
    198216!             + une partie (1-adv_frac) de l'advection 
    199  
     217   !$OMP WORKSHARE 
    200218   where ((abs(sdx(:,:)).gt.1.e-8).and.(Hmx(:,:).gt.2.))      ! cas general 
    201219       advmx(:,:)=(Uxbar(:,:)-Uxdiff(:,:))                   ! tout ce qui n'est pas diffusion 
     
    236254          dmy(:,:)=dminy(:,:)*H(:,:) 
    237255       end where 
    238  
    239  
    240  
    241256   elsewhere   ! zones trop plates ou trop fines 
    242257      Dmy(:,:)=0. 
    243258      advmy(:,:)=Uybar(:,:) 
    244259   end where 
    245  
     260   !$OMP END WORKSHARE 
    246261 
    247262else if (adv_frac.lt.0) then                  ! diffusif dans zones SIA, advectif ailleurs 
    248  
     263   !$OMP WORKSHARE 
    249264   zonemx(:,:)=flgzmx(:,:) 
    250265   zonemy(:,:)=flgzmy(:,:) 
     
    265280    advmy(:,:)=0. 
    266281   end where 
    267  
     282   !$OMP END WORKSHARE 
    268283end if 
    269284 
    270  
     285!$OMP WORKSHARE 
    271286where (flot(:,:) ) 
    272287   tabtest(:,:)=1. 
     
    274289   tabtest(:,:)=0. 
    275290end where 
    276  
     291!$OMP END WORKSHARE 
     292!$OMP END PARALLEL 
    277293!------------------------------------------------------------------detect 
    278294!!$ tabtest(:,:)=dmx(:,:) 
     
    375391 
    376392 
    377 debug_3D(:,:,45)=dmx(:,:) 
    378 debug_3D(:,:,46)=dmy(:,:) 
    379 debug_3D(:,:,47)=advmx(:,:) 
    380 debug_3D(:,:,48)=advmy(:,:) 
    381  
    382  
     393!debug_3D(:,:,45)=dmx(:,:) 
     394!debug_3D(:,:,46)=dmy(:,:) 
     395!debug_3D(:,:,47)=advmx(:,:) 
     396!debug_3D(:,:,48)=advmy(:,:) 
     397 
     398!$OMP PARALLEL 
     399!$OMP WORKSHARE 
    383400bilmass(:,:)=bm(:,:)-bmelt(:,:)                       ! surface and bottom mass balance 
     401!$OMP END WORKSHARE 
     402!$OMP END PARALLEL 
    384403 
    385404! diverses precription de l'epaisseur en fonction de l'objectif 
     
    387406 
    388407 
    389   call prescribe_fixed_points            ! ceux qui sont fixes pour tout le run (bords de grille, regions) 
    390  
    391  
    392     
     408call prescribe_fixed_points            ! ceux qui sont fixes pour tout le run (bords de grille, regions) 
    393409 
    394410 
     
    436452!!$end if 
    437453 
    438 debug_3D(:,:,87)=S(:,:)-debug_3D(:,:,88) 
    439  
    440 debug_3D(:,:,86)=Hp(:,:) 
    441 debug_3D(:,:,85)=i_Hp(:,:) 
     454!debug_3D(:,:,87)=S(:,:)-debug_3D(:,:,88) 
     455 
     456!debug_3D(:,:,86)=Hp(:,:) 
     457!debug_3D(:,:,85)=i_Hp(:,:) 
    442458 
    443459!!$where (i_hp(:,:).eq.1) 
     
    463479call resol_adv_diff_2D_vect (Dmx,Dmy,advmx,advmy,Hp,i_Hp,bilmass,vieuxH,H) 
    464480 
    465 ! remise à 0 des epaisseurs negatives, on garde la difference dans ablbord  
     481! remise à 0 des epaisseurs negatives, on garde la difference dans ablbord 
     482!$OMP PARALLEL 
     483!$OMP WORKSHARE  
    466484where (H(:,:).lt.0.) 
    467485   ablbord(:,:)=H(:,:)/dt 
     
    489507endwhere 
    490508 
    491  
    492509! eventuellement retirer apres spinup ou avoir un cas serac 
    493510Hdot(:,:)=(H(:,:)-vieuxH(:,:))/dt 
     511!$OMP END WORKSHARE 
    494512 
    495513if (igrdline.ne.3) then 
     514   !$OMP WORKSHARE 
    496515   Hdot(:,:)=min(Hdot(:,:),10.) 
    497516   Hdot(:,:)=max(Hdot(:,:),-10.) 
     517   !$OMP END WORKSHARE 
    498518endif 
    499519 
     520!$OMP WORKSHARE 
    500521where (i_hp(:,:).ne.1) 
    501522   H(:,:)=vieuxH(:,:)+Hdot(:,:)*dt 
     
    511532   Hdot(:,:)=0. 
    512533end where 
    513  
    514  
     534!$OMP END WORKSHARE 
     535!$OMP END PARALLEL 
    515536 
    516537!calul de l'ablation sur les bords (pourrait n'être appelé que pour les sorties courtes) 
Note: See TracChangeset for help on using the changeset viewer.