source: trunk/SOURCES/dragging_param_beta_sedim_mod.f90 @ 224

Last change on this file since 224 was 224, checked in by dumas, 5 years ago

format of the parameter file created by the code, possibility to use it in reading

File size: 8.6 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      return
128      end subroutine init_dragging
129!________________________________________________________________________________
130
131!> SUBROUTINE: dragging
132!! Defini la localisation des streams et le frottement basal
133!>
134!-------------------------------------------------------------------------
135subroutine dragging   ! defini la localisation des streams et le frottement basal
136!$ USE OMP_LIB
137
138!         les iles n'ont pas de condition neff mais ont la condition toblim
139!         (ce bloc etait avant dans flottab)
140
141!$OMP PARALLEL
142
143!    -- !$OMP DO
144!    -- do 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
149!    -- end 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.