source: trunk/SOURCES/dragging_param_beta_sedim_mod.f90 @ 182

Last change on this file since 182 was 178, checked in by aquiquet, 6 years ago

Parametrised beta is the same when using sediments or not (for no sediment condition)

File size: 8.5 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
210! new parametrisation of beta on Neff:
211betamx(:,:)= beta_slope*(neffmx(:,:)**beta_expo) !/neffmin
212betamy(:,:)= beta_slope*(neffmy(:,:)**beta_expo) !/neffmin
213
214where (ilemx(:,:)) betamx(:,:) = betamx(:,:) * coef_ile
215where (ilemy(:,:)) betamy(:,:) = betamy(:,:) * coef_ile
216
217where (h_sedimmx(:,:).gt.seuil_sedim) betamx(:,:) = betamx(:,:) * coef_sedim
218where (h_sedimmy(:,:).gt.seuil_sedim) betamy(:,:) = betamy(:,:) * coef_sedim
219!where (h_sedimmx(:,:).gt.seuil_sedim) betamx(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
220!where (h_sedimmy(:,:).gt.seuil_sedim) betamy(:,:) = beta_slope*(neffmin**beta_expo)/neffmin
221
222betamx(:,:)=max(betamx(:,:),betamin)
223betamy(:,:)=max(betamy(:,:),betamin)
224betamx(:,:)=min(betamx(:,:),betamax)
225betamy(:,:)=min(betamy(:,:),betamax)
226
227where ( hwatmx(:,:) .lt. 0.5 ) betamx(:,:) = betamax
228where ( hwatmy(:,:) .lt. 0.5 ) betamy(:,:) = betamax
229
230!$OMP END WORKSHARE
231
232
233! calcul de gzmx
234
235! points flottants : flgzmx mais pas gzmx
236!$OMP DO
237do j=2,ny
238   do i=2,nx
239      if (flot(i,j).and.(flot(i-1,j))) then
240         flotmx(i,j)=.true.
241         flgzmx(i,j)=.true.
242         gzmx(i,j)=.false.
243         betamx(i,j)=0.
244      end if
245      if (flot(i,j).and.(flot(i,j-1))) then
246         flotmy(i,j)=.true.
247         flgzmy(i,j)=.true.
248         gzmy(i,j)=.false.
249         betamy(i,j)=0.
250      end if
251   end do
252end do
253!$OMP END DO
254
255!--------- autres criteres
256
257! points poses
258!$OMP WORKSHARE
259gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.betamax)   !  Pas de calcul pour les points
260gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.betamax)   !  au fort beta
261
262flgzmx(:,:) = flgzmx(:,:) .or. gzmx(:,:)
263flgzmy(:,:) = flgzmy(:,:) .or. gzmy(:,:)
264
265where (hmx(:,:).eq.0.)
266  flgzmx(:,:) = .false.
267endwhere
268where (hmy(:,:).eq.0.)
269  flgzmy(:,:) = .false.
270endwhere
271
272fleuvemx(:,:)=gzmx(:,:)
273fleuvemy(:,:)=gzmy(:,:)
274!$OMP END WORKSHARE
275
276!$OMP DO
277do j=2,ny-1
278   do i=2,nx-1
279      beta_centre(i,j) = ((betamx(i,j)+betamx(i+1,j)) &
280          + (betamy(i,j)+betamy(i,j+1)))*0.25
281   end do
282end do
283!$OMP END DO
284!$OMP END PARALLEL
285
286return
287end subroutine dragging
288
289end module dragging_param_beta_sedim
290
Note: See TracBrowser for help on using the repository browser.