source: trunk/SOURCES/dragging_param_beta_sedim_mod.f90 @ 333

Last change on this file since 333 was 333, checked in by aquiquet, 3 years ago

Addition of a non-linear Coulomb friction law + iterations on velocity computation for convergence / for m=1 gives results very similar to the standard linear law in dragging_param_beta

File size: 9.1 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! lecture des parametres du run                      block drag neff
80!--------------------------------------------------------------------
81
82rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
83read(num_param,drag_param_beta_sedim)
84
85write(num_rep_42,'(A)')'!___________________________________________________________' 
86write(num_rep_42,'(A)') '&drag_param_beta_sedim          ! nom du bloc dragging param beta'
87write(num_rep_42,*)
88write(num_rep_42,*) 'beta_slope            = ', beta_slope
89write(num_rep_42,*) 'beta_expo             = ', beta_expo
90write(num_rep_42,*) 'betamax               = ', betamax
91write(num_rep_42,*) 'betamin               = ', betamin
92write(num_rep_42,'(A,A,A)') 'file_sedim     = "',trim(file_sedim),'"'
93write(num_rep_42,*) 'seuil_sedim    = ', seuil_sedim
94write(num_rep_42,*) 'coef_sedim     = ', coef_sedim
95write(num_rep_42,*)'/'                           
96write(num_rep_42,'(A)') '! Slope & expo of beta = - slope x Neff ** expo'
97write(num_rep_42,'(A)') '! Where h_sedim > seuil_sedim, beta*coef_sedim'
98
99!-------------------------------------------------------------------
100! masque stream
101      mstream_mx(:,:)=1
102      mstream_my(:,:)=1
103
104
105! coefficient permettant de modifier le basal drag.
106      drag_mx(:,:)=1.
107      drag_my(:,:)=1.
108     
109      betamax_2d(:,:) = betamax
110
111! modification of basal drag depends on where we have sediments
112! for Antarctica, we assume that what is present-day below sea level has sediment
113      file_sedim=trim(dirnameinp)//trim(file_sedim)
114      call lect_input(1,'h_sedim',1,h_sedim(:,:),file_sedim,file_ncdf)
115 
116      h_sedimmx(1,:)=h_sedim(1,:)
117      h_sedimmy(:,1)=h_sedim(:,1)
118      do i=2,nx
119         h_sedimmx(i,:)=(h_sedim(i-1,:)+h_sedim(i,:))/2.
120      enddo
121      do j=2,ny
122         h_sedimmy(:,j)=(h_sedim(:,j-1)+h_sedim(:,j))/2.
123      enddo
124 
125      !afq -- toblim = 0. !0.7e5 ! afq -- pour les iles, mais est-ce vraiment utile?
126
127      niter_nolin = 1
128
129      return
130      end subroutine init_dragging
131!________________________________________________________________________________
132
133!> SUBROUTINE: dragging
134!! Defini la localisation des streams et le frottement basal
135!>
136!-------------------------------------------------------------------------
137subroutine dragging   ! defini le frottement basal
138!$ USE OMP_LIB
139
140!         les iles n'ont pas de condition neff mais ont la condition toblim
141!         (ce bloc etait avant dans flottab)
142
143!$OMP PARALLEL
144
145!    -- !$OMP DO
146!    -- do j=2,ny
147!    --    do i=2,nx
148!    --       ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim)
149!    --       ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim)
150!    --    end do
151!    -- end do
152!    -- !$OMP END DO
153
154
155
156! calcul de neff (pression effective sur noeuds majeurs)
157if (sum(neffmx(:,:)).le.0.) neffmx(:,:) =1.e8
158if (sum(neffmy(:,:)).le.0.) neffmy(:,:) =1.e8
159
160!$OMP DO
161do j=1,ny-1
162   do i=1,nx-1
163        neff(i,j)=(neffmx(i,j)+neffmx(i+1,j)+neffmy(i,j)+neffmy(i,j+1))/4
164   enddo
165enddo
166!$OMP END DO
167!aurel, for the borders:
168!$OMP WORKSHARE
169neff(:,ny)=neffmin
170neff(nx,:)=neffmin
171! calcul de hwat (staggered)
172hwatmx(:,:)=0.
173hwatmy(:,:)=0.
174!$OMP END WORKSHARE
175!$OMP DO
176do i=2,nx
177   hwatmx(i,:)=(hwater(i-1,:)+hwater(i,:))/2.
178enddo
179!$OMP END DO
180!$OMP DO
181do j=2,ny
182   hwatmy(:,j)=(hwater(:,j-1)+hwater(:,j))/2.
183enddo
184!$OMP END DO
185
186!$OMP WORKSHARE
187
188where (h_sedimmx(:,:).le.seuil_sedim)
189  betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo)
190elsewhere
191  betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo) * coef_sedim
192endwhere
193
194where (h_sedimmy(:,:).le.seuil_sedim)
195  betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo)
196elsewhere
197  betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo) * coef_sedim
198endwhere
199!where (h_sedimmx(:,:).gt.seuil_sedim) betamx(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
200!where (h_sedimmy(:,:).gt.seuil_sedim) betamy(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
201
202where (ilemx(:,:)) betamx(:,:) = betamx(:,:) * coef_ile
203where (ilemy(:,:)) betamy(:,:) = betamy(:,:) * coef_ile
204
205betamx(:,:)=max(betamx(:,:),betamin)
206betamy(:,:)=max(betamy(:,:),betamin)
207betamx(:,:)=min(betamx(:,:),betamax)
208betamy(:,:)=min(betamy(:,:),betamax)
209
210where ( hwatmx(:,:) .lt. 0.5 ) betamx(:,:) = betamax
211where ( hwatmy(:,:) .lt. 0.5 ) betamy(:,:) = betamax
212
213!$OMP END WORKSHARE
214
215
216! calcul de gzmx
217
218! points flottants
219!$OMP DO
220do j=2,ny
221   do i=2,nx
222      if (flot(i,j).and.(flot(i-1,j))) then
223         betamx(i,j)=0.
224      end if
225      if (flot(i,j).and.(flot(i,j-1))) then
226         betamy(i,j)=0.
227      end if
228   end do
229end do
230!$OMP END DO
231
232!$OMP DO
233do j=2,ny-1
234   do i=2,nx-1
235      beta_centre(i,j) = ((betamx(i,j)+betamx(i+1,j)) &
236          + (betamy(i,j)+betamy(i,j+1)))*0.25
237   end do
238end do
239!$OMP END DO
240!$OMP END PARALLEL
241
242return
243end subroutine dragging
244!________________________________________________________________________________
245
246!> SUBROUTINE: mstream_dragging
247!! Defini la localisation des streams
248!>
249!-------------------------------------------------------------------------
250subroutine mstream_dragging   ! defini la localisation des streams
251
252!$OMP PARALLEL
253
254!$OMP WORKSHARE
255fleuvemx(:,:)=.false.
256fleuvemy(:,:)=.false.
257cote(:,:)=.false.
258gzmx(:,:)=.true.
259gzmy(:,:)=.true.
260flgzmx(:,:)=.false.
261flgzmy(:,:)=.false.
262!$OMP END WORKSHARE
263
264! detection des cotes
265!$OMP DO
266do  j=2,ny-1
267   do i=2,nx-1
268      if ((.not.flot(i,j)).and. &
269      ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then
270         cote(i,j)=.true.
271      endif
272   end do
273end do
274!$OMP END DO
275
276
277! calcul de gzmx
278
279! points flottants : flgzmx mais pas gzmx
280!$OMP DO
281do j=2,ny
282   do i=2,nx
283      if (flot(i,j).and.(flot(i-1,j))) then
284         flotmx(i,j)=.true.
285         flgzmx(i,j)=.true.
286         gzmx(i,j)=.false.
287         betamx(i,j)=0.
288      end if
289      if (flot(i,j).and.(flot(i,j-1))) then
290         flotmy(i,j)=.true.
291         flgzmy(i,j)=.true.
292         gzmy(i,j)=.false.
293         betamy(i,j)=0.
294      end if
295   end do
296end do
297!$OMP END DO
298
299!--------- autres criteres
300
301! points poses
302!$OMP WORKSHARE
303gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.betamax)   !  Pas de calcul pour les points
304gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.betamax)   !  au fort beta
305
306flgzmx(:,:) = flgzmx(:,:) .or. gzmx(:,:)
307flgzmy(:,:) = flgzmy(:,:) .or. gzmy(:,:)
308
309fleuvemx(:,:)=gzmx(:,:)
310fleuvemy(:,:)=gzmy(:,:)
311!$OMP END WORKSHARE
312
313!$OMP END PARALLEL
314
315return
316end subroutine mstream_dragging
317
318end module dragging_param_beta_sedim
319
Note: See TracBrowser for help on using the repository browser.