source: trunk/SOURCES/Antarctique_general_files/dragging_calc_beta_mod-AGU-2009.f90 @ 23

Last change on this file since 23 was 4, checked in by dumas, 10 years ago

initial import GRISLI trunk

File size: 16.9 KB
Line 
1!> \file dragging_calc_beta.f90
2!! Module qui calcule le beta a partir de vitesses de bilan
3!<
4
5!> \namespace  dragging_calc_beta
6!! Calcule le beta a partir de vitesses de bilan
7!! @note Il faut partir d'un cptr.
8!! \author ...
9!! \date ...
10!! @note Used module
11!! @note   - use module3D_phy
12!<
13module dragging_calc_beta
14
15  ! Calcule le beta a partir de vitesses de bilan
16  ! il faut partir d'un cptr.
17
18
19  use module3d_phy
20  use interface_input
21
22  implicit none
23
24  logical, dimension(nx,ny) :: gz_centre     !< stream on major node
25  real, dimension(nx,ny) :: Vcol_x           !< vertically averaged velocity x direction (balance)
26  real, dimension(nx,ny) :: Vcol_y           !< vertically averaged velocity y direction (balance)
27  real, dimension(nx,ny) :: Vcol2            !<  vertically averaged velocity norme² on major nodes
28  real, dimension(nx,ny) :: beta_centre      !< beta on major node (average)
29  real :: beta_limgz                         !< when beta gt beta_limgz -> not gzmx
30  real :: beta_bord                          !< for the sides of ice streams
31  real :: ubil_limgz                         !< when ubil < ubil_limgz  -> not gzmx
32  real :: coefbeta                           !< coefficient to ajust beta
33  real :: ecart_quad                         !< somme of quadratic difference
34  real :: umag2                              !< square of veloc. at major node
35  integer :: stagger=1                       !< iteration based on centered or staggered nodes
36
37contains
38  !-----------------------------------------------------------------------------------
39  subroutine lect_vitbil  !  idem module spinup
40
41
42    character(len=100) :: balance_vel_file        !  balance velocity file
43    !  vitesses de bilan consideres comme la donnee
44    !  sur laquelle calibrer
45
46    namelist/vitbil_upwind/balance_vel_file   
47
48    if (itracebug.eq.1)  call tracebug(' Subroutine lect_vitbil')
49
50    ! lecture des parametres du run                   
51    !--------------------------------------------------------------------
52
53    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
54428 format(A)
55    read(num_param,vitbil_upwind)
56
57    write(num_rep_42,428) '!___________________________________________________________' 
58    write(num_rep_42,428) '!read balance velocities on staggered grid'
59    write(num_rep_42,vitbil_upwind)                   
60    write(num_rep_42,428) '! balance_vel_file : nom du fichier qui contient les vitesse de bilan'
61    write(num_rep_42,*)
62
63    ! read balance velocities on staggered node
64
65    balance_vel_file  = trim(dirnameinp)//trim(balance_vel_file)
66
67    call lect_input(2,'drag_m',1,drag_mx,balance_vel_file,trim(dirnameinp)//trim(runname)//'.nc')
68    call lect_input(2,'drag_m',2,drag_my,balance_vel_file,trim(dirnameinp)//trim(runname)//'.nc')
69    !call lect_datfile(nx,ny,Vcol_x,1,balance_vel_file)   ! read Vcol_x   
70    !call lect_datfile(nx,ny,Vcol_y,2,balance_vel_file)   ! read Vcol_y
71
72
73
74    do j=2,ny-1
75       do i=2,nx-1
76          umag2=((Vcol_x(i,j)+Vcol_x(i+1,j))*(Vcol_x(i,j)+Vcol_x(i+1,j))) &  ! ux2
77               +((Vcol_y(i,j)+Vcol_y(i,j+1))*(Vcol_y(i,j)+Vcol_y(i,j+1)))    ! uy2
78          Vcol2(i,j) =umag2*0.25
79       end do
80    end do
81
82    ! limit the maximum value
83
84    Vcol_x(:,:)=max(-3900.,Vcol_x(:,:))
85    Vcol_x(:,:)=min( 3900.,Vcol_x(:,:))
86    Vcol_y(:,:)=max(-3900.,Vcol_y(:,:))
87    Vcol_y(:,:)=min( 3900.,Vcol_y(:,:))
88
89
90    debug_3D(:,:,59)=Vcol_x(:,:)
91    debug_3D(:,:,60)=Vcol_y(:,:)
92
93  end subroutine lect_vitbil
94  !-----------------------------------------------------------------------------------------
95
96  subroutine init_dragging      ! Cette routine fait l'initialisation du dragging.
97
98    implicit none
99
100
101
102    if (itracebug.eq.1)  call tracebug(' Calc_beta         subroutine init_dragging')
103    mstream_mx(:,:)=1
104    mstream_my(:,:)=1
105
106    beta_limgz=5.e4     
107    beta_bord= 1000.        !
108    ubil_limgz=3.
109
110    ! coefficient permettant de modifier le basal drag.
111    drag_mx(:,:)=1.
112    drag_my(:,:)=1.
113
114    call lect_vitbil
115
116    iter_beta = 1
117    iter_loop : if (iter_beta.eq.1) then  ! pour calculer initial guess de beta
118       betamx(:,:)=0
119       betamy(:,:)=0
120       coefbeta=5.
121
122    else if (iter_beta.eq.2) then  ! pour partir d'un beta tres fort (ne marche pas)
123       betamx(:,:)=1.e5
124       betamy(:,:)=1.e5
125       coefbeta=10.
126
127    else if (iter_beta.eq.3) then  ! iteration Arthern en partant de l'initial guess
128
129       call lect_input(2,'betam',1,betamx,'beta-estime.dat',trim(dirnameinp)//trim(runname)//'.nc')
130       call lect_input(2,'betam',2,betamy,'beta-estime.dat',trim(dirnameinp)//trim(runname)//'.nc')     
131       !call lect_datfile(nx,ny,betamx,1,'beta-estime.dat')
132       !call lect_datfile(nx,ny,betamy,2,'beta-estime.dat')
133
134       ! average
135       beta_centre(:,:)=0.
136       do j=2,ny-1
137          do i=2,nx-1
138             beta_centre(i,j)= ((betamx(i,j)+betamx(i+1,j)) &
139                  + (betamy(i,j)+betamy(i,j+1)))*0.25
140          end do
141       end do
142
143       ! redistribute on staggered grid
144       if (stagger.eq.0) then
145          do j=2,ny
146             do i=2,nx
147                betamx(i,j)= min(betamx(i,j),(beta_centre(i-1,j)+beta_centre(i,j))*0.5)
148                betamy(i,j)= min(betamx(i,j),(beta_centre(i,j-1)+beta_centre(i,j))*0.5)
149             end do
150          end do
151       end if
152
153       if (stagger.eq.2) then
154          do j=2,ny
155             do i=2,nx
156                if (abs(Vcol_x(i,j)).gt.50.) then     ! fleuve de glace
157                   betamx(i,j+1)=min(betamx(i,j+1),beta_bord)
158                   betamx(i,j-1)=min(betamx(i,j-1),beta_bord)
159                   betamx(i-1,j)=min(betamx(i-1,j),beta_bord)
160                   betamx(i+1,j)=min(betamx(i+1,j),beta_bord)
161                end if
162                if (abs(Vcol_y(i,j)).gt.50.) then     ! fleuve de glace
163                   betamy(i+1,j)=min(betamy(i+1,j),beta_bord)
164                   betamy(i-1,j)=min(betamy(i-1,j),beta_bord)
165                   betamy(i,j+1)=min(betamy(i,j+1),beta_bord)
166                   betamy(i,j-1)=min(betamy(i,j-1),beta_bord)
167                end if
168             end do
169          end do
170       end if
171       coefbeta=1.e-3
172
173    end if iter_loop
174    call gzm_betacalc
175
176
177    return
178
179  end subroutine init_dragging
180  !________________________________________________________________________________
181
182
183  !-------------------------------------------------------------------------
184  subroutine dragging   ! defini la localisation des streams et le frottement basal
185
186    implicit none
187
188!!$where (flgzmy(:,:))
189!!$   debug_3D(:,:,84)=1
190!!$elsewhere
191!!$   debug_3D(:,:,84)=0
192!!$endwhere
193
194
195    if (itracebug.eq.1)  call tracebug(' Subroutine dragging')
196
197    call gzm_betacalc
198
199!!$gzmx(:,:)=.true.
200!!$gzmy(:,:)=.true.
201!!$flgzmx(:,:)=.false.
202!!$flgzmy(:,:)=.false.
203!!$
204!!$
205!!$! points flottants : flgzmx mais pas gzmx
206!!$do j=2,ny
207!!$   do i=2,nx
208!!$      if (flot(i,j).and.(flot(i-1,j))) then
209!!$         flgzmx(i,j)=.true.
210!!$         gzmx(i,j)=.false.
211!!$      end if
212!!$      if (flot(i,j).and.(flot(i,j-1))) then
213!!$         flgzmy(:,:)=.true.
214!!$         gzmy(i,j)=.false.
215!!$      end if
216!!$   end do
217!!$end do
218
219    ! pour être sûr d'avoir quelques points "Dirichlet"
220!!$gzmx(:,:)=gzmx(:,:).and.(abs(vcol_x(:,:)).gt.ubil_limgz)
221!!$gzmy(:,:)=gzmy(:,:).and.(abs(vcol_y(:,:)).gt.ubil_limgz )
222
223    ! si la vitesse de deformation est deja plus grande que la vitesse de bilan
224    !gzmx(:,:)=gzmx(:,:).and.(abs(uxdef).lt.abs(vcol_x(:,:)))
225    !gzmy(:,:)=gzmy(:,:).and.(abs(uydef).lt.abs(vcol_y(:,:)))
226
227    flgzmx(:,:)=flgzmx(:,:).or.gzmx(:,:)
228    flgzmy(:,:)=flgzmy(:,:).or.gzmy(:,:)
229
230    ! pour initialisation, a terme pourrait etre dans une boucle iterative
231
232
233    if (iter_beta.eq.1) then
234       betamx(:,:)=0.
235       betamy(:,:)=0.
236    end if
237
238
239    Rob:if (iter_beta.gt.1) then
240       iter_beta=iter_beta+1
241       if (itracebug.eq.1) then
242          call tracebug(' Dragging : iter=')
243          write(num_tracebug,*) iter_beta
244       endif
245
246       ! iteration Arthern like sur beta
247       !________________________________________
248       ! On part d un beta issus de calc beta et eventuellement lisse par moyenne mobile
249       !
250       ! Vcol_x tient le role de solution Dirichlet et uxbar de solution Neumann
251
252       ecart_quad=0.
253       if (iter_beta.ge.4) then
254
255          stag: if (stagger.eq.1) then
256             do j=2,ny
257                do i=2,nx
258                   if (gzmx(i,j)) then
259                      betamx(i,j)=betamx(i,j)-coefbeta*(Vcol_x(i,j)*Vcol_x(i,j)-uxbar(i,j)*uxbar(i,j))
260                      betamx(i,j)=max(betamx(i,j),0.)
261                      ecart_quad= ecart_quad  & 
262                           + abs(Vcol_x(i,j)*Vcol_x(i,j)-uxbar(i,j)*uxbar(i,j))
263                   end if
264                   if (gzmy(i,j)) then
265                      betamy(i,j)=betamy(i,j)-coefbeta*(Vcol_y(i,j)*Vcol_y(i,j)-uybar(i,j)*uybar(i,j))
266                      betamy(i,j)=max(betamy(i,j),0.)
267                      ecart_quad= ecart_quad  & 
268                           + abs(Vcol_y(i,j)*Vcol_y(i,j)-uybar(i,j)*uybar(i,j))
269                   end if
270                end do
271             end do
272          else if (stagger.eq.0) then          ! le chemin se fait sur les noeuds centres
273             do j=2,ny-1
274                do i=2,nx-1
275                   if (gz_centre(i,j)) then
276                      umag2=((uxbar(i,j)+uxbar(i+1,j))*(uxbar(i,j)+uxbar(i+1,j))) &  ! ux2
277                           +((uybar(i,j)+uybar(i,j+1))*(uybar(i,j)+uybar(i,j+1)))    ! uy2
278                      umag2=umag2*0.25
279
280                      beta_centre(i,j)=beta_centre(i,j)-coefbeta*(Vcol2(i,j)-umag2) 
281                      beta_centre(i,j)=max(beta_centre(i,j),0.)           
282                      ecart_quad= ecart_quad  & 
283                           + abs(Vcol2(i,j)-umag2) 
284                   end if
285                end do
286             end do
287             ! redistribute on staggered grid
288             do j=2,ny
289                do i=2,nx
290                   betamx(i,j)= (beta_centre(i-1,j)+beta_centre(i,j))*0.5
291                   betamy(i,j)= (beta_centre(i,j-1)+beta_centre(i,j))*0.5
292                end do
293             end do
294
295          else if (stagger.eq.2) then          ! le chemin se fait sur les noeuds centres
296             beta_centre(:,:)=0.
297             write(6,*) coefbeta
298             do j=2,ny-1
299                do i=2,nx-1
300                   if (gz_centre(i,j)) then
301                      umag2=((uxbar(i,j)+uxbar(i+1,j))*(uxbar(i,j)+uxbar(i+1,j))) &  ! ux2
302                           +((uybar(i,j)+uybar(i,j+1))*(uybar(i,j)+uybar(i,j+1)))    ! uy2
303                      umag2=umag2*0.25
304
305                      beta_centre(i,j)=-coefbeta*(Vcol2(i,j)-umag2) 
306                      beta_centre(i,j)=min(beta_centre(i,j),100.)
307                      beta_centre(i,j)=max(beta_centre(i,j),-100.)
308                      ecart_quad= ecart_quad  & 
309                           + abs(Vcol2(i,j)-umag2) 
310                   end if
311                end do
312             end do
313             debug_3D(:,:,86)=beta_centre(:,:)
314
315             ! redistribute on staggered grid
316             do j=2,ny
317                do i=2,nx
318                   betamx(i,j)= betamx(i,j)+((beta_centre(i-1,j)+beta_centre(i,j)) &
319                        + (beta_centre(i-1,j-1)+beta_centre(i,j-1)) &
320                        + (beta_centre(i-1,j+1)+beta_centre(i,j+1)))/6. 
321
322                   betamx(i,j)=max(betamx(i,j),0.)
323                   betamx(i,j)=min(betamx(i,j),beta_limgz)
324
325                   betamy(i,j)= betamy(i,j)+((beta_centre(i,j-1)+beta_centre(i,j)) &
326                        + (beta_centre(i-1,j-1)+beta_centre(i-1,j)) &
327                        + (beta_centre(i+1,j-1)+beta_centre(i+1,j)))/6. 
328
329                   betamy(i,j)=max(betamy(i,j),0.)
330                   betamy(i,j)=min(betamy(i,j),beta_limgz)
331                end do
332             end do
333
334          else if (stagger.eq.-1) then  ! test dramatique !
335             write(6,*) 'stagger', stagger, iter_beta
336             do j=2,ny
337                do i=2,nx
338                   if (abs(uxbar(i,j))-abs(Vcol_x(i,j)).lt.-50.) then
339                      !             write(6,*) i,j, betamx(i,j),betamx(i,j+1), betamx(i,j-1),uxbar(i,j),Vcol_x(i,j)
340                      betamx(i,j)=min(betamx(i,j),100.)
341                      !             write(6,*) i,j, betamx(i,j),betamx(i,j+1), betamx(i,j-1)
342                   endif
343
344                   if (abs(uybar(i,j))-abs(Vcol_y(i,j)).lt.-50.) then
345                      betamy(i,j)=min(betamy(i,j),100.)
346                   endif
347                end do
348             end do
349             do j=2,ny
350                do i=2,nx
351                   if (betamx(i,j).eq.-1) then
352
353                      betamx(i,j)=100.
354                      betamx(i,j+1)=200
355                      betamx(i,j-1)=200
356                   end if
357                   if (betamy(i,j).eq.-1) then
358                      betamy(i,j)=100
359                      betamy(i+1,j)=200
360                      betamy(i-1,j)=200
361                   end if
362                end do
363             end do
364          endif stag
365       else
366          do j=2,ny
367             do i=2,nx
368                if (gzmx(i,j)) then
369                   ecart_quad= ecart_quad  & 
370                        + abs(Vcol_x(i,j)*Vcol_x(i,j)-uxbar(i,j)*uxbar(i,j))
371                end if
372                if (gzmy(i,j)) then
373                   ecart_quad= ecart_quad  & 
374                        + abs(Vcol_y(i,j)*Vcol_y(i,j)-uybar(i,j)*uybar(i,j))
375                end if
376             end do
377          end do
378       end if
379
380
381       write(6,*) 'ecart_quad',ecart_quad
382    end if Rob
383    !-------------------------- fin iteration Arthern like--------------------------
384
385
386    ! iteration multiplicative sur beta
387    !________________________________________
388    !On part dun beta tres fort et on arrete de le diminuer quand les vitesses sont ok
389    !
390    !   if (itracebug.eq.1) write(num_tracebug,*)'     coefbeta',coefbeta
391    !
392    !where (gzmx(:,:).and.(abs(uxbar(:,:)).gt.(abs(Vcol_x(:,:)))))   ! la vitesse est trop grande, augmenter le beta
393    !   betamx(:,:)=betamx(:,:)*coefbeta*0.9                         ! mais moins vite pour eviter une oscillation
394    ! betamx(:,:)=betamx(:,:)*coefbeta
395    !elsewhere                                       !
396    !   betamx(:,:)=betamx(:,:)/coefbeta
397    !end where
398
399    !where (gzmy(:,:).and.(abs(uybar(:,:)).gt.(abs(Vcol_y(:,:)))))   ! la vitesse est trop grande, augmenter le beta
400    !   betamy(:,:)=betamy(:,:)*coefbeta*0.9                        ! mais moins vite pour eviter une oscillation
401    !  betamy(:,:)=betamy(:,:)*coefbeta                              ! mais moins vite pour eviter une oscillation
402    !elsewhere                                       !
403    !   betamy(:,:)=betamy(:,:)/coefbeta
404    !end where
405
406!!$flgzmy(:,:)=.false.
407!!$flgzmx(:,:)=.false.
408!!$
409!!$   do j=2,ny
410!!$      do i=2,nx
411!!$         if (flot(i,j).and.(flot(i-1,j))) then
412!!$            gzmx(i,j)=.false.
413!!$            flgzmx(i,j)=.true.
414!!$            betamx(i,j)=0.
415!!$         end if
416!!$         if (flot(i,j).and.(flot(i,j-1))) then
417!!$            gzmy(i,j)=.false.
418!!$            flgzmy(i,j)=.true.
419!!$            betamy(i,j)=0.
420!!$         end if
421!!$      end do
422!!$   end do
423!!$end if
424!!$
425!!$flgzmx(:,:)=flgzmx(:,:).or.gzmx(:,:)
426!!$flgzmy(:,:)=flgzmy(:,:).or.gzmy(:,:)
427
428!!$where (flgzmy(:,:))
429!!$   debug_3D(:,:,84)=1
430!!$elsewhere
431!!$   debug_3D(:,:,84)=0
432!!$endwhere
433
434
435
436    if (itracebug.eq.1)  call tracebug(' Dragging sortie')
437
438    return
439  end subroutine dragging
440
441  !----------------------------------------------------------------------------------
442  subroutine gzm_betacalc
443
444    ! calcul de gzmx qui ne sera plus modifie ensuite
445
446
447    gzmx(:,:)=.true.
448    gzmy(:,:)=.true.
449    flgzmx(:,:)=.false.
450    flgzmy(:,:)=.false.
451
452
453    ! points flottants : flgzmx mais pas gzmx
454    do j=2,ny
455       do i=2,nx
456          if (flot(i,j).and.(flot(i-1,j))) then
457             flgzmx(i,j)=.true.
458             gzmx(i,j)=.false.
459             betamx(i,j)=0.
460          end if
461          if (flot(i,j).and.(flot(i,j-1))) then
462             flgzmy(i,j)=.true.
463             gzmy(i,j)=.false.
464             betamy(i,j)=0.
465          end if
466       end do
467    end do
468    !--------- autres criteres
469
470    ! points poses
471    gzmx(:,:)=gzmx(:,:).and.(betamx(:,:).lt.beta_limgz)   !  Pas de calcul pour les points
472    gzmy(:,:)=gzmy(:,:).and.(betamy(:,:).lt.beta_limgz)   !  au fort beta
473
474    ! pour être sûr d'avoir quelques points "Dirichlet"
475    gzmx(:,:)=gzmx(:,:).and.(abs(Vcol_x(:,:)).gt.ubil_limgz) ! Pas de calcul pour les pts lents
476    gzmy(:,:)=gzmy(:,:).and.(abs(Vcol_y(:,:)).gt.ubil_limgz) ! Pas de calcul pour les pts lents
477
478
479    flgzmx(:,:)=flgzmx(:,:).or.gzmx(:,:)
480    flgzmy(:,:)=flgzmy(:,:).or.gzmy(:,:)
481
482    gz_centre(:,:)=.false.
483    do j=2,ny-1
484       do i=2,nx-1
485          gz_centre(i,j)=gzmx(i,j).or.gzmx(i+1,j).or.gzmy(i,j).or.gzmy(i,j+1)
486       end do
487    end do
488
489    where (flgzmy(:,:))
490       debug_3D(:,:,84)=1
491    elsewhere
492       debug_3D(:,:,84)=0
493    endwhere
494
495
496    if (itracebug.eq.1) write(num_tracebug,*)' Subroutine     gzm_betacalc     ', & 
497         flgzmy(191,115), gzmx(218,126),gzmy(244,259),flgzmy(244,259),flotmx(3,3),H(3,3)
498
499  end subroutine gzm_betacalc
500
501end module dragging_calc_beta
502
Note: See TracBrowser for help on using the repository browser.