source: trunk/SOURCES/dragging_param_beta_sedim_mod.f90 @ 188

Last change on this file since 188 was 188, checked in by dumas, 6 years ago

Bug in dragging : all ocean points need to be flgzmx and flgzmy

File size: 8.4 KB
Line 
1!> \file dragging_neff_contmaj_mod.f90
2!! Defini les zones de stream avec 3 criteres
3!<
4
5!> \namespace  dragging_neff_contmaj
6!! Defini les zones de stream avec 3 criteres
7!! \author ...
8!! \date ...
9!! @note Les trois criteres sont:
10!! @note   * un critere sur la pression effective
11!! @note   * un critere de continuite depuis la cote
12!! @note   * un critere sur la courbure du socle (si negatif, vallees)
13!! @note Used module
14!! @note   - use module3D_phy
15!! @note   - use param_phy_mod
16!<
17
18module dragging_param_beta_sedim
19
20! Defini les zones de stream avec :
21! * un critere sur la pression effective
22! * un critere de continuite depuis la cote
23! * un critere sur la courbure du socle (si negatif, vallees)
24
25use module3d_phy
26use param_phy_mod
27use interface_input
28use io_netcdf_grisli
29use fake_beta_iter_vitbil_mod
30
31implicit none
32
33logical,dimension(nx,ny) :: cote
34
35real,dimension(nx,ny) :: beta_param ! local variable
36
37real :: betamin   ! betamin : (Pa) frottement mini sous les streams
38
39real :: beta_slope        ! = A in:     B = A x Neff ** K
40real :: beta_expo         ! = K in:     B = A x Neff ** K
41
42real,dimension(nx,ny) :: neff   ! pression effective noeuds majeurs
43real,dimension(nx,ny) :: hwatmx ! hauteur d'eau staggered grille - afq
44real,dimension(nx,ny) :: hwatmy ! hauteur d'eau staggered grille - afq
45
46real :: coef_ile      ! coef frottement zones iles   (0.1)
47
48real,dimension(nx,ny) :: h_sedimmx   ! sediment thickness (or rebounded bedrock)
49real,dimension(nx,ny) :: h_sedimmy   ! sediment thickness (or rebounded bedrock)
50real :: seuil_sedim   ! drag reduced beyond this threshold
51real :: coef_sedim    ! drag reduction factor
52real :: neffmin = 1.e5 ! as in neffect, but this should be the exact same variable
53
54real, dimension(nx,ny) :: Vcol_x           !< uniquement pour compatibilite avec spinup cat
55real, dimension(nx,ny) :: Vcol_y           !< uniquement pour compatibilite avec spinup cat
56real, dimension(nx,ny) :: Vsl_x            !< uniquement pour compatibilite avec spinup cat
57real, dimension(nx,ny) :: Vsl_y            !< uniquement pour compatibilite avec spinup cat
58logical :: corr_def = .false.              !< for deformation correction, pour compatibilite beta
59
60contains
61!-------------------------------------------------------------------------------
62
63!> SUBROUTINE: init_dragging
64!! Cette routine fait l'initialisation du dragging.
65!>
66subroutine init_dragging      ! Cette routine fait l'initialisation du dragging.
67
68implicit none
69
70real,dimension(nx,ny) :: h_sedim   ! sediment thickness (or rebounded bedrock)
71character(len=150) :: file_sedim   ! file for sediment thickness for HN or rebounded bsoc for Antar
72character(len=150) :: file_ncdf    ! fichier netcdf issue des fichiers .dat
73
74namelist/drag_param_beta_sedim/beta_slope,beta_expo,betamax,betamin,coef_ile,file_sedim,seuil_sedim,coef_sedim
75
76if (itracebug.eq.1)  call tracebug(' dragging param avec sedim')
77
78
79! formats pour les ecritures dans 42
80428 format(A)
81
82! lecture des parametres du run                      block drag neff
83!--------------------------------------------------------------------
84
85rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
86read(num_param,drag_param_beta_sedim)
87
88write(num_rep_42,428)'!___________________________________________________________' 
89write(num_rep_42,428) '&drag_param_beta_sedim          ! nom du bloc dragging param beta'
90write(num_rep_42,*)
91write(num_rep_42,*) 'beta_slope            = ', beta_slope
92write(num_rep_42,*) 'beta_expo             = ', beta_expo
93write(num_rep_42,*) 'betamax               = ', betamax
94write(num_rep_42,*) 'betamin               = ', betamin
95write(num_rep_42,*) 'file_sedim     = ', file_sedim
96write(num_rep_42,*) 'seuil_sedim    = ', seuil_sedim
97write(num_rep_42,*) 'coef_sedim     = ', coef_sedim
98write(num_rep_42,*)'/'                           
99write(num_rep_42,428) '! Slope & expo of beta = - slope x Neff ** expo'
100write(num_rep_42,428) '! Where h_sedim > seuil_sedim, beta*coef_sedim'
101
102!-------------------------------------------------------------------
103! masque stream
104      mstream_mx(:,:)=1
105      mstream_my(:,:)=1
106
107
108! coefficient permettant de modifier le basal drag.
109      drag_mx(:,:)=1.
110      drag_my(:,:)=1.
111     
112      betamax_2d(:,:) = betamax
113
114! modification of basal drag depends on where we have sediments
115! for Antarctica, we assume that what is present-day below sea level has sediment
116      file_sedim=trim(dirnameinp)//trim(file_sedim)
117      call lect_input(1,'h_sedim',1,h_sedim(:,:),file_sedim,file_ncdf)
118 
119      h_sedimmx(1,:)=h_sedim(1,:)
120      h_sedimmy(:,1)=h_sedim(:,1)
121      do i=2,nx
122         h_sedimmx(i,:)=(h_sedim(i-1,:)+h_sedim(i,:))/2.
123      enddo
124      do j=2,ny
125         h_sedimmy(:,j)=(h_sedim(:,j-1)+h_sedim(:,j))/2.
126      enddo
127 
128      return
129      end subroutine init_dragging
130!________________________________________________________________________________
131
132!> SUBROUTINE: dragging
133!! Defini la localisation des streams et le frottement basal
134!>
135!-------------------------------------------------------------------------
136subroutine dragging   ! defini la localisation des streams et le frottement basal
137!$ USE OMP_LIB
138
139!         les iles n'ont pas de condition neff mais ont la condition toblim
140!         (ce bloc etait avant dans flottab)
141
142!$OMP PARALLEL
143!$OMP DO
144do j=2,ny
145   do i=2,nx
146      ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim)
147      ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim)
148   end do
149end do
150!$OMP END DO
151
152
153! le gzmx initial a ete calculé dans flottab pour les points a cheval sur la grounding line
154
155
156!$OMP WORKSHARE
157fleuvemx(:,:)=.false.
158fleuvemy(:,:)=.false.
159cote(:,:)=.false.
160gzmx(:,:)=.true.
161gzmy(:,:)=.true.
162flgzmx(:,:)=.false.
163flgzmy(:,:)=.false.
164!$OMP END WORKSHARE
165
166! detection des cotes
167!$OMP DO
168do  j=2,ny-1 
169   do i=2,nx-1 
170      if ((.not.flot(i,j)).and. & 
171      ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then
172         cote(i,j)=.true.
173      endif
174   end do
175end do
176!$OMP END DO
177
178! calcul de neff (pression effective sur noeuds majeurs)
179if (sum(neffmx(:,:)).le.0.) neffmx(:,:) =1.e8
180if (sum(neffmy(:,:)).le.0.) neffmy(:,:) =1.e8
181
182!$OMP DO
183do j=1,ny-1
184   do i=1,nx-1
185        neff(i,j)=(neffmx(i,j)+neffmx(i+1,j)+neffmy(i,j)+neffmy(i,j+1))/4
186   enddo
187enddo
188!$OMP END DO
189!aurel, for the borders:
190!$OMP WORKSHARE
191neff(:,ny)=neffmin
192neff(nx,:)=neffmin
193! calcul de hwat (staggered)
194hwatmx(:,:)=0.
195hwatmy(:,:)=0.
196!$OMP END WORKSHARE
197!$OMP DO
198do i=2,nx
199   hwatmx(i,:)=(hwater(i-1,:)+hwater(i,:))/2.
200enddo
201!$OMP END DO
202!$OMP DO
203do j=2,ny
204   hwatmy(:,j)=(hwater(:,j-1)+hwater(:,j))/2.
205enddo
206!$OMP END DO
207
208!$OMP WORKSHARE
209
210where (h_sedimmx(:,:).le.seuil_sedim)
211  betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo)
212elsewhere
213  betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo) * coef_sedim
214endwhere
215
216where (h_sedimmy(:,:).le.seuil_sedim)
217  betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo)
218elsewhere
219  betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo) * coef_sedim
220endwhere
221!where (h_sedimmx(:,:).gt.seuil_sedim) betamx(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
222!where (h_sedimmy(:,:).gt.seuil_sedim) betamy(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
223
224where (ilemx(:,:)) betamx(:,:) = betamx(:,:) * coef_ile
225where (ilemy(:,:)) betamy(:,:) = betamy(:,:) * coef_ile
226
227betamx(:,:)=max(betamx(:,:),betamin)
228betamy(:,:)=max(betamy(:,:),betamin)
229betamx(:,:)=min(betamx(:,:),betamax)
230betamy(:,:)=min(betamy(:,:),betamax)
231
232where ( hwatmx(:,:) .lt. 0.5 ) betamx(:,:) = betamax
233where ( hwatmy(:,:) .lt. 0.5 ) betamy(:,:) = betamax
234
235!$OMP END WORKSHARE
236
237
238! calcul de gzmx
239
240! points flottants : flgzmx mais pas gzmx
241!$OMP DO
242do j=2,ny
243   do i=2,nx
244      if (flot(i,j).and.(flot(i-1,j))) then
245         flotmx(i,j)=.true.
246         flgzmx(i,j)=.true.
247         gzmx(i,j)=.false.
248         betamx(i,j)=0.
249      end if
250      if (flot(i,j).and.(flot(i,j-1))) then
251         flotmy(i,j)=.true.
252         flgzmy(i,j)=.true.
253         gzmy(i,j)=.false.
254         betamy(i,j)=0.
255      end if
256   end do
257end do
258!$OMP END DO
259
260!--------- autres criteres
261
262! points poses
263!$OMP WORKSHARE
264gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.betamax)   !  Pas de calcul pour les points
265gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.betamax)   !  au fort beta
266
267flgzmx(:,:) = flgzmx(:,:) .or. gzmx(:,:)
268flgzmy(:,:) = flgzmy(:,:) .or. gzmy(:,:)
269
270fleuvemx(:,:)=gzmx(:,:)
271fleuvemy(:,:)=gzmy(:,:)
272!$OMP END WORKSHARE
273
274!$OMP DO
275do j=2,ny-1
276   do i=2,nx-1
277      beta_centre(i,j) = ((betamx(i,j)+betamx(i+1,j)) &
278          + (betamy(i,j)+betamy(i,j+1)))*0.25
279   end do
280end do
281!$OMP END DO
282!$OMP END PARALLEL
283
284return
285end subroutine dragging
286
287end module dragging_param_beta_sedim
288
Note: See TracBrowser for help on using the repository browser.