source: trunk/SOURCES/dragging_hwat_sedim_mod.f90 @ 14

Last change on this file since 14 was 14, checked in by dumas, 9 years ago

Nouvelle version Hemin-15 : Hemisphere Nord 15km

File size: 15.7 KB
Line 
1module dragging_hwat_sedim
2
3! Defini les zones de stream avec :
4! * un critere sur la hauteur d'eau
5! * un critere sur la courbure du socle (si negatif, vallees)
6! * un critere sur l'epaisseur de sediments (carte de Gabi & Laske)
7
8use module3d_phy
9
10implicit none
11logical,dimension(nx,ny) :: fleuvemx
12logical,dimension(nx,ny) :: fleuvemy
13logical,dimension(nx,ny) :: fleuve
14logical,dimension(nx,ny) :: fleuve_sedim
15logical,dimension(nx,ny) :: fleuve_sedimx
16logical,dimension(nx,ny) :: fleuve_sedimy
17logical,dimension(nx,ny) :: cote
18
19
20real :: valmax
21integer :: imax,jmax
22integer :: i_moins1,i_plus1,j_moins1,j_plus1
23integer :: lmax=20
24integer :: idep,jdep,iloc,jloc
25
26
27real :: tostick   ! pour la glace posee
28real :: tobmax    ! tobmax : (Pa) frottement maxi sous les streams
29real :: tob_ile    ! pour les iles
30real :: cry_lim=50.  ! courbure limite pour le suivi des fleuves
31
32real,dimension(nx,ny) :: h_sedim    ! epaisseur de sediment
33real,dimension(nx,ny) :: neff ! pression effective noeuds majeurs
34real :: seuil_hwater  ! seuil sur hwater pour avoir du glissement en zone sediment
35real :: seuil_sedim   ! seuil sur h_sedim pour avoir du glissement en zone sediment
36real :: seuil_neff    ! seuil sur la pression effective pour avoir glissement en zone sediment
37real :: coef_sedim    ! coef frottement zones sediments  (1)
38real :: coef_gz       ! coef frottement zones stream std  (10)
39real :: coef_ile      ! coef frottement zones iles   (0.1)
40real :: toto
41
42real :: betacotemax=100  ! valeur max pour betamx et betamy sur les cote
43real :: betacotemin=4
44real :: betasedmax=400    ! 400 dans c-HadCM3-evol-basal-melt-sed : cHadCM3s  et 250 dans c-HadCM3-evol-basal-melt-sed-betasedimin6
45real :: betasedmin=10   ! 10 dans c-HadCM3-evol-basal-melt-sed : cHadCM3s et 6 dans c-HadCM3-evol-basal-melt-sed-betasedimin6
46real :: betastreamax=500
47real :: betastreamin=10
48real :: betailemax=250
49real :: betailemin=6
50
51real, dimension(nx,ny) :: Vcol_x           !< uniquement pour compatibilite avec spinup cat
52real, dimension(nx,ny) :: Vcol_y           !< uniquement pour compatibilite avec spinup cat
53real, dimension(nx,ny) :: Vsl_x            !< uniquement pour compatibilite avec spinup cat
54real, dimension(nx,ny) :: Vsl_y            !< uniquement pour compatibilite avec spinup cat
55logical :: corr_def = .false.              !< for deformation correction, pour compatibilite beta
56
57character(len=150) :: file_sedim   ! fichier epaisseur sediment
58
59contains
60!-------------------------------------------------------------------------------
61subroutine init_dragging      ! Cette routine fait l'initialisation du dragging.
62
63implicit none
64 
65namelist/drag_hwat_sedim/file_sedim,hwatstream,cf,tobmax,toblim,seuil_hwater,seuil_sedim,seuil_neff,coef_sedim,coef_gz,coef_ile   
66
67if (itracebug.eq.1) write(num_tracebug,*)' dragging avec hwatermax'
68
69
70! formats pour les ecritures dans 42
71428 format(A)
72
73! lecture des parametres du run                      block draghwat
74!--------------------------------------------------------------------
75
76rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
77read(num_param,drag_hwat_sedim)
78
79write(num_rep_42,428)'!___________________________________________________________' 
80write(num_rep_42,428) '&drag_hwat_sedim              ! nom du bloc hwat_sedim '
81write(num_rep_42,*)
82write(num_rep_42,*) 'file_sedim     = ', trim(file_sedim)
83write(num_rep_42,*) 'hwatstream     = ', hwatstream 
84write(num_rep_42,*) 'cf             = ', cf
85write(num_rep_42,*) 'tobmax         = ', tobmax
86write(num_rep_42,*) 'toblim         = ', toblim
87write(num_rep_42,*) 'seuil_hwater   = ', seuil_hwater
88write(num_rep_42,*) 'seuil_sedim    = ', seuil_sedim
89write(num_rep_42,*) 'seuil_neff     = ', seuil_neff
90write(num_rep_42,*) 'coef_sedim     = ', coef_sedim
91write(num_rep_42,*) 'coef_gz        = ', coef_gz
92write(num_rep_42,*) 'coef_ile       = ', coef_ile
93
94write(num_rep_42,*) '/'
95write(num_rep_42,428) '! file_sedim : fichier carte epaisseur sediment'                           
96write(num_rep_42,428) '! hwatstream (m) :  critere de passage en stream en partant de la cote si hwater > hwatstream '
97write(num_rep_42,428) '! cf coefficient de la loi de frottement fonction Neff'
98write(num_rep_42,428) '! seulement pour les points cotiers'
99write(num_rep_42,428) '! tobmax : (Pa) frottement maxi sous les streams '
100write(num_rep_42,428) '! toblim : (Pa)  pour les iles '
101write(num_rep_42,428) '! seuil_hwater (m) : seuil hwater pour avoir glissement sur zone sediment'
102write(num_rep_42,428) '! seuil_sedim (m) : seuil epaisseur sediment pour avoir glissement sur zone sediment'
103write(num_rep_42,428) '! seuil_neff (Pa) seuil sur la pression effective pour avoir glissement en zone sediment'
104write(num_rep_42,428) '! coef_sedim : coef frottement zones stream sediments'
105write(num_rep_42,428) '! coef_gz : coef frottement zones stream std'
106write(num_rep_42,428) '! coef_ile : coef frottement zones iles'
107write(num_rep_42,*)
108
109tostick=1.e5   ! valeurs pour les points non flgzmx
110tob_ile=tobmax/2.
111moteurmax=toblim
112
113!-------------------------------------------------------------------
114! masque stream
115
116      mstream_mx(:,:)=1
117      mstream_my(:,:)=1
118
119
120! coefficient permettant de modifier le basal drag.
121      drag_mx(:,:)=1.
122      drag_my(:,:)=1.
123
124where (socle_cry(:,:).lt.cry_lim)
125   debug_3D(:,:,25)=1
126elsewhere
127   debug_3D(:,:,25)=0
128endwhere
129
130! lecture du fichier sediment :
131open(20,file=TRIM(DIRNAMEINP)//trim(file_sedim)) !   'sediment_ij_hemin40.dat')
132do j=1,ny
133   do i=1,nx
134      read(20,*),toto,toto,h_sedim(i,j)
135   enddo
136enddo
137h_sedim(:,:)=max(h_sedim(:,:),0.)  ! pas d'epaisseurs de sediments negatives
138   
139      return
140      end subroutine init_dragging
141!________________________________________________________________________________
142
143
144!-------------------------------------------------------------------------
145subroutine dragging   ! defini la localisation des streams et le frottement basal
146
147
148!         les iles n'ont pas de condition neff mais ont la condition toblim
149!         (ce bloc etait avant dans flottab)
150
151
152do j=2,ny
153   do i=2,nx
154      ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim)
155      ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim)
156   end do
157end do
158
159! le calcul des fleuves se fait sur les mailles majeures en partant de la cote
160
161
162
163
164! le gzmx initial a ete calculé dans flottab pour les points a cheval sur la grounding line
165
166! Partant de la cote, le fleuve est determine en remontant vers le point de hauteur d'eau max
167! tant que ce point est superieur a hwatermax.
168
169! Attention : ce systeme ne permet pas d'avoir des fleuves convergents
170!             et les fleuves n'ont une épaisseur que de 1 noeud.
171
172fleuvemx(:,:)=.false.
173fleuvemy(:,:)=.false.
174fleuve(:,:)=.false.
175cote(:,:)=.false.
176
177! detection des cotes
178do  j=2,ny-1 
179   do i=2,nx-1 
180      if ((.not.flot(i,j)).and. & 
181      ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then
182         cote(i,j)=.true.
183      endif
184   end do
185end do
186
187! calcul de neff (pression effective sur noeuds majeurs)
188do j=1,ny-1
189   do i=1,nx-1
190        neff(i,j)=(neffmx(i,j)+neffmx(i,j+1)+neffmy(i,j)+neffmy(i+1,j))/4
191   enddo
192enddo
193
194! test sur hauteur d'eau et epaisseur sediment :
195!where (h_sedim(:,:).GT.seuil_sedim.and.hwater(:,:).GT.seuil_hwater.and.(.not.flot(:,:))) fleuve(:,:)=.true.
196where (h_sedim(:,:).GT.seuil_sedim.and.neff(:,:).LE.seuil_neff.and.hwater(:,:).GT.seuil_hwater.and.(.not.flot(:,:))) fleuve(:,:)=.true.
197
198fleuve_sedim(:,:)=fleuve(:,:)  ! points uniquement fleuves sediment
199
200
201fleuve_maj: do j=2,ny-1 
202ifleuve:   do i=2,nx-1                     
203
204cote_detect :  if (cote(i,j)) then
205   idep=i
206   jdep=j
207         
208      if (socle_cry(i,j).lt.0.) then    ! dans une vallee
209         fleuve(i,j)=.true. 
210!         write(166,*)
211!         write(166,*)'cote',i,j,hwater(i,j),hwatstream
212      else
213         cote(i,j)=.false.
214         cycle ifleuve
215      endif
216
217suit : do l=1,lmax         ! debut de la boucle de suivi, lmax longueur maxi des fleuves
218           i_moins1=max(idep-1,2)
219           j_moins1=max(jdep-1,1)
220           i_plus1=min(idep+1,nx)
221           j_plus1=min(jdep+1,ny)
222           
223
224
225!!$! recherche du max en suivant la hauteur d'eau maxi chez les voisins
226!!$! * en excluant les points flottants
227!!$! * et ceux qui sont deja tagges fleuves   !version 18 juillet 2007
228
229!!$           valmax=0.
230!!$
231!!$         do jloc=j_moins1,j_plus1
232!!$            do iloc=i_moins1,i_plus1
233!!$
234!!$               if ((hwater(iloc,jloc).gt.valmax) &
235!!$                    .and.(.not.flot(iloc,jloc))  &
236!!$                    .and.(.not.fleuve(iloc,jloc))) then
237!!$                  imax=iloc
238!!$                  jmax=jloc
239!!$                  valmax=hwater(iloc,jloc)
240!!$               endif
241!!$            end do
242!!$         end do
243
244! recherche du max en suivant le socle le plus profond
245! * en excluant les points flottants
246! * et ceux qui sont deja tagges fleuves
247
248           valmax=1000.
249
250        do jloc=j_moins1,j_plus1
251            do iloc=i_moins1,i_plus1
252 
253               if ((B(iloc,jloc).lt.valmax)      & 
254                    .and.(.not.flot(iloc,jloc))  &
255                    .and.(.not.fleuve(iloc,jloc)).and.(socle_cry(iloc,jloc).lt.cry_lim)) then
256                  imax=iloc
257                  jmax=jloc
258                 valmax=B(iloc,jloc)
259               endif
260            end do
261         end do
262
263
264
265
266         if ((hwater(imax,jmax).gt.hwatstream).and.(socle_cry(i,j).lt.cry_lim)) then
267            fleuve(imax,jmax)=.true.
268            idep=imax
269            jdep=jmax
270!            write(166,*) imax,jmax,hwater(imax,jmax)
271         else
272!            fleuve(imax,jmax)=.false.
273            exit suit
274         end if
275 
276      end do suit
277
278   end if cote_detect
279
280end do ifleuve
281end do fleuve_maj
282
283
284! detection de problemes
285!write(166,*)
286!write(166,*) 'detection de pb dans fleuve   time=',time
287!do j=2,ny
288!   do i=2,ny
289!      if (fleuve(i,j).and.(socle_cry(i,j).gt.cry_lim)) then
290!         write(166,*) 'pb fleuve',time,i,j,hwater(i,j),socle_cry(i,j)
291!      endif
292!   end do
293!end do
294
295do j=1,ny-1
296   do i=1,nx-1
297      if (fleuve(i,j)) then
298         fleuvemx(i,j)=.true.
299         fleuvemx(i+1,j)=.true.
300         fleuvemy(i,j)=.true.
301         fleuvemy(i,j+1)=.true.
302      end if
303      if (fleuve_sedim(i,j)) then
304         fleuve_sedimx(i,j)=.true.
305         fleuve_sedimx(i+1,j)=.true.
306         fleuve_sedimy(i,j)=.true.
307         fleuve_sedimy(i,j+1)=.true.
308      endif
309   end do
310end do
311
312! pas de fleuve dans les endroits trop en pente
313!fleuvemx(:,:)=fleuvemx(:,:).and.(abs(rog*Hmx(:,:)*sdx(:,:)).lt.toblim)
314!fleuvemy(:,:)=fleuvemy(:,:).and.(abs(rog*Hmy(:,:)*sdy(:,:)).lt.toblim)
315!fleuvemx(:,:)=fleuvemx(:,:).and.(abs(rog*Hmx(:,:)*sdx(:,:)).lt.toblim)
316!fleuvemy(:,:)=fleuvemy(:,:).and.(abs(rog*Hmy(:,:)*sdy(:,:)).lt.toblim)
317
318
319do j=1,ny
320   do i=1,nx
321      if ((.not.ilemx(i,j)).and.(fleuvemx(i,j))) gzmx(i,j)=.true. 
322
323! calcul du frottement basal (ce bloc etait avant dans neffect)
324
325      if (cotemx(i,j)) then                        ! point cotier
326         betamx(i,j)=cf*neffmx(i,j)*0.1 
327! cat         betamx(i,j)=min(betamx(i,j),tobmax)
328! version Jorge
329! point cotier: frott maxi=40, mini=4
330!         betamx(i,j)=min(betamx(i,j),betacotemax)
331!         betamx(i,j)=max(betamx(i,j),betacotemin)
332! version Jorge stream  en zone sediment :
333      else if (fleuve_sedimx(i,j).and.gzmx(i,j).and.(.not.cotemx(i,j))) then  ! stream  en zone sediment
334! stream sediment: frott maxi=60, mini=6
335!cdc            betamx(i,j)=cf*neffmx(i,j)*3
336             betamx(i,j)=cf*neffmx(i,j)*coef_sedim
337!            betamx(i,j)=min(betamx(i,j),betasedmax)         
338!            betamx(i,j)=max(betamx(i,j),betasedmin)
339      else if ((gzmx(i,j)).and.(.not.cotemx(i,j))) then  ! stream normal
340! cat         betamx(i,j)=tobmax
341! cat         betamx(i,j)=cf*neffmx(i,j)*20.                  ! attention a cette modif juillet 2007
342! cat         betamx(i,j)=min(betamx(i,j),tobmax)
343! cat         betamx(i,j)=max(betamx(i,j),10.)
344! version Jorge
345! stream normal: frott maxi=80, mini=8
346         betamx(i,j)=cf*neffmx(i,j)*coef_gz         
347!         betamx(i,j)=min(betamx(i,j),betastreamax)           
348!         betamx(i,j)=max(betamx(i,j),betastreamin)
349
350! cat         if (cf*neffmx(i,j).gt.1500.) then
351! cat          gzmx(i,j)=.false.
352! cat           betamx(i,j)=tostick
353! cat        endif
354
355      else if (ilemx(i,j)) then
356         betamx(i,j)=cf*neffmx(i,j)*coef_ile
357! cat         betamx(i,j)=min(betamx(i,j),tob_ile)   
358! version Jorge
359! ile : frott maxi=20, mini=2   
360!         betamx(i,j)=min(betamx(i,j),betailemax)
361!         betamx(i,j)=max(betamx(i,j),betailemin)
362      else if (flotmx(i,j)) then     ! flottant ou ile
363         betamx(i,j)=0.
364      else                                         ! grounded, SIA
365         betamx(i,j)=tostick                       ! frottement glace posee (1 bar)
366      endif
367   end do
368end do
369
370
371do j=1,ny                  ! le noeud 1 n'est pas attribue
372   do i=1,nx   
373
374      if ((.not.ilemy(i,j)).and.(fleuvemy(i,j))) gzmy(i,j)=.true. 
375
376
377 ! calcul du frottement basal (ce bloc etait avant dans neffect)
378
379      if (cotemy(i,j)) then                        ! point cotier
380         betamy(i,j)=cf*neffmy(i,j)*0.1 
381! cat         betamy(i,j)=min(betamy(i,j),tobmax)
382! version Jorge
383! point cotier: frott maxi=40, mini=4
384!         betamy(i,j)=min(betamy(i,j),betacotemax)
385!         betamy(i,j)=max(betamy(i,j),betacotemin)
386! version Jorge stream  en zone sediment :
387      else if ((fleuve_sedimy(i,j).and.gzmx(i,j).and.(.not.cotemx(i,j)))) then  ! stream  en zone sediment
388! stream sediment: frott maxi=60, mini=6
389!cdc            betamy(i,j)=cf*neffmy(i,j)*3
390             betamy(i,j)=cf*neffmy(i,j)*coef_sedim
391!            betamy(i,j)=min(betamy(i,j),betasedmax)         
392!            betamy(i,j)=max(betamy(i,j),betasedmin)
393      else if ((gzmy(i,j)).and.(.not.cotemy(i,j))) then  ! stream normal
394! cat         betamy(i,j)=tobmax
395! cat         betamy(i,j)=cf*neffmy(i,j)*20.
396! cat         betamy(i,j)=min(betamy(i,j),tobmax)
397! cat         betamy(i,j)=max(betamy(i,j),10.)
398! version Jorge
399! stream normal: frott maxi=80, mini=8
400         betamy(i,j)=cf*neffmy(i,j)*coef_gz                     
401!         betamy(i,j)=min(betamy(i,j),betastreamax)           
402!         betamy(i,j)=max(betamy(i,j),betastreamin)
403
404! cat         if (cf*neffmy(i,j).gt.1500.) then
405! cat            gzmy(i,j)=.false.
406! cat            betamy(i,j)=tostick
407! cat         endif
408
409      else if (ilemy(i,j)) then
410         betamy(i,j)=cf*neffmy(i,j)*coef_ile
411! cat         betamy(i,j)=min(betamy(i,j),tob_ile)     
412! version Jorge
413! ile : frott maxi=20, mini=2   
414!         betamy(i,j)=min(betamy(i,j),betailemax)
415!         betamy(i,j)=max(betamy(i,j),betailemin)
416      else if (flotmy(i,j)) then     ! flottant ou ile
417         betamy(i,j)=0.
418      else                               ! grounded, SIA
419         betamy(i,j)=tostick             ! frottement glace posee
420      endif
421   end do
422end do
423
424!print*,'dragging debug h_sedim(78,144),hwater,seuil_sedim,seuil_hwater',h_sedim(78,144),seuil_sedim,hwater(78,144),seuil_hwater,fleuve(78,144),gzmx(78,144)
425!print*,'dragging debug h_sedim(90,157),hwater,seuil_sedim,seuil_hwater',h_sedim(90,157),seuil_sedim,hwater(90,157),seuil_hwater,fleuve(90,157),gzmx(90,157),betamx(90,157),betamx(78,144)
426
427
428where (fleuve(:,:))
429   debug_3D(:,:,1)=1
430elsewhere (flot(:,:))
431   debug_3D(:,:,1)=2
432elsewhere
433   debug_3D(:,:,1)=0
434endwhere
435
436where (cote(:,:))
437   debug_3D(:,:,2)=1
438elsewhere
439   debug_3D(:,:,2)=0
440endwhere
441
442where (fleuvemx(:,:))
443   debug_3D(:,:,3)=1
444elsewhere
445   debug_3D(:,:,3)=0
446endwhere
447
448where (flotmx(:,:))
449   debug_3D(:,:,3)=-1
450endwhere
451
452!_____________________
453
454
455where (fleuvemy(:,:))
456   debug_3D(:,:,4)=1
457elsewhere
458   debug_3D(:,:,4)=0
459endwhere
460
461where (flotmy(:,:))
462   debug_3D(:,:,4)=-1
463end where
464
465debug_3D(:,:,23)= abs(RO*G*HMX(:,:)*sdx(:,:)*1.e-5) 
466debug_3D(:,:,24)= abs(RO*G*HMY(:,:)*sdy(:,:)*1.e-5) 
467
468
469!print*,'point (79,145)',hwater(79,145),h_sedim(79,145),flot(79,145),fleuve_sedim(79,145),fleuve(79,145),betamx(79,145),fleuve_sedimx(79,145),gzmx(79,145)
470
471return
472end subroutine dragging
473
474end module dragging_hwat_sedim
475
Note: See TracBrowser for help on using the repository browser.