source: branches/iLoveclim/SOURCES/dragging_hwat_sedim_mod.f90 @ 38

Last change on this file since 38 was 38, checked in by dumas, 8 years ago

Merge avec la r37 du trunk

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