source: branches/iLoveclim/SOURCES/Draggings_modules/beta_iter_vitbil_mod.f90 @ 187

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

Grisli-iloveclim branch merged to trunk at revision 185

File size: 9.7 KB
Line 
1!< \file beta_iter_vitbil_mod.f90
2!< Module pour affiner le beta a partir d'une carte vitbil  sur les noeuds centres.
3!< A appeler depuis steps_time_loop
4!< a utiliser avec beta_prescr
5
6!> \ beta_iter_vitbil
7!! \author ...
8!! \date ...
9!! @note Used module
10!! @note   - use module3D_phy
11!<
12
13module beta_iter_vitbil_mod
14
15  use module3d_phy
16  use interface_input
17  use netcdf
18  use io_netcdf_grisli
19
20  implicit none
21
22  real, dimension(nx,ny) :: Vcol_x           !< uniquement pour compatibilite
23  real, dimension(nx,ny) :: Vcol_y           !<
24  real, dimension(nx,ny) :: Vsl_x            !<
25  real, dimension(nx,ny) :: Vsl_y            !<
26
27
28  real, dimension(nx,ny) :: drag_centre      !< beta on major node (average)
29  real :: beta_limgz                         !< when beta gt beta_limgz -> not gzmx
30  real :: beta_min                           !< minimum value of beta
31  real :: beta_mult                          !< coefficient of beta field
32  integer  :: ill,jll,nmoy
33
34  real :: maxi                               !< calcul correction dS a la grounding line
35  real :: mini
36
37  logical :: corr_def = .False.               !< for deformation correction (compatibility)
38
39
40  real, dimension(nx,ny) :: Umag_vitbil             !< vitesse de bilan
41  real, dimension(nx,ny) :: Uslid_vitbil            !< vitesse de bilan partie glissement
42  real, dimension(nx,ny) :: Umag_direct             !< vitesse moyenne centree calculee par GRISLI
43  real, dimension(nx,ny) :: Uslmag_direct           !< vitesse glissement centree calculee par GRISLI
44  real, dimension(nx,ny) :: Udefmag_direct          !< vitesse deformation centree calculee par GRISLI
45  real, dimension(nx,ny) :: driving_stress          !< driving stress
46
47  character(len=100)     :: Umag_bil_file           !< fichier qui contient les donnees
48  real                   :: time_iter               !< temps de debut des iterations
49  real                   :: time_iter_end           !< temps de fin des iterations
50  real                   :: time_reiter             !< nbr annees entre 2 iterations calcul beta
51  integer                :: nb_iter_vitbil          !< nombre d'iteratiosn avant de changer de pas de temps
52  real                   :: coef_iter_vitbil        !< coefficient <= 1 (rapport vitesses)
53  real                   :: J_Umag                  !< estimateur ecart entre vitesses
54  real                   :: J_Udef                  !< estimateur vitesse regions sans glissement
55  integer                :: nb_umag                 !< nombre de points calcul J_Umag
56  integer                :: nb_Udef                 !< nombre de points calcul J_Umag
57
58
59contains
60
61!-----------------------------------------------------------------------------------------
62!< subroutine : init_beta_iter_vitbil
63!< Cette routine fait l'initialisation de la procedure beta_iter_vitbil
64
65subroutine init_beta_iter_vitbil
66
67  implicit none
68 
69  real*8, dimension(:,:),   pointer  :: tab => null() !< tableau 2d real ecrit dans le fichier pour lect ncdf
70
71    namelist/beta_iter_vitbil/time_iter,nb_iter_vitbil,coef_iter_vitbil,Umag_bil_file,time_reiter
72
73
74    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
75428 format(A)
76    read(num_param,beta_iter_vitbil)
77
78    write(num_rep_42,428) '!___________________________________________________________' 
79    write(num_rep_42,428) '!  module beta_iter_vitbil'
80    write(num_rep_42,beta_iter_vitbil)                   
81    write(num_rep_42,428) '! ' 
82    write(num_rep_42,428) '!  Umag_bil_file : fichier qui contient les donnees Umag_vitbil'
83    write(num_rep_42,428) '!  time_iter     : temps de debut des iterations '
84    write(num_rep_42,428) '!  nb_iter_vitbil: nombre diteratation a faire avant de changer de pas de temps ' 
85    write(num_rep_42,*)   '!  coef_iter_vitbil : coefficient pour le rapport vitesses  '
86    write(num_rep_42,*)   '!  time_reiter : nombre d annees entre 2 iterations'
87    write(num_rep_42,428) '!___________________________________________________________' 
88
89    time_iter = time_iter + tbegin       ! time_iter est le temps de relaxation (de l'ordre de 5 ans)
90                                         ! ajouter tbegin pour ne pas dependre du temps de depart.
91    time_iter_end = time_iter + 1.       ! 20. ans en version std Cat et Seb
92    print*,'debug init_beta_iter_vitbil time_iter=', time_iter, time_iter_end, time
93
94    Umag_bil_file = trim(dirnameinp)//trim(Umag_bil_file)
95
96    write(6,*) Umag_bil_file
97!    call lect_input(1,'Umag_vitbil',1,Umag_vitbil,Umag_bil_file,'')
98    call Read_Ncdf_var('Umag_vitbil',Umag_bil_file,tab)
99    Umag_vitbil(:,:) = tab(:,:)
100   
101    debug_3D(:,:,58) = Umag_vitbil(:,:)
102
103  end subroutine init_beta_iter_vitbil
104
105
106
107
108!______________________________________________________________________________________
109!>SUBROUTINE:   beta_min_value
110!! valeur mini que peut avoir beta (en Pa an m-1)
111!<
112
113  subroutine beta_min_value(val_betamin)
114
115  real :: val_betamin     ! valeur mini que peut avoir beta (en Pa an m-1)
116
117    drag_centre(:,:) = max(drag_centre(:,:),val_betamin)
118    drag_mx(:,:) = max(drag_mx(:,:),val_betamin)
119    drag_my(:,:) = max(drag_my(:,:),val_betamin)
120    where(flot(:,:))
121       drag_centre(:,:) = 0.
122    end where
123
124  end subroutine beta_min_value
125
126!>SUBROUTINE:   beta_c2stag 
127!! redistribute central values on staggered grid
128!<
129
130  subroutine beta_c2stag(nxx,nyy,R_mx,R_my,R_centre)              ! redistribute central values on staggered grid
131
132    implicit none
133    integer                                ::  nxx,nyy                ! dimension des tableaux
134    real, dimension(nxx,nyy), intent(out)  ::  R_mx                   ! valeur du beta sur maille mx
135    real, dimension(nxx,nyy), intent(out)  ::  R_my                   ! valeur du beta sur maille my
136    real, dimension(nxx,nyy), intent(in)   ::  R_centre               ! valeur du beta sur maille centree
137
138    do j=2,nyy 
139       do i=2,nxx
140          R_mx(i,j)= (R_centre(i-1,j)+R_centre(i,j))*0.5
141          R_my(i,j)= (R_centre(i,j-1)+R_centre(i,j))*0.5
142       end do
143    end do
144
145  end subroutine beta_c2stag
146
147
148!-----------------------------------------------------------------------------------------
149!< subroutine : beta_iter_vitbil
150!< fait des iterations pour affiner la valeur de beta_centre pour s'ajuster sur vitbil
151!-----------------------------------------------------------------------------------------
152subroutine beta_iter_vitbil(m_iter)
153
154implicit none
155integer :: m_iter ! indice bloucle iteration
156
157
158! calcul des vitesses cibles :
159!if ((time.eq.time_iter).and.(time.gt.time_reiter).and.(m_iter.eq.1)) then
160if ((abs(time-time_iter).lt.dtmin).and.(time.gt.time_reiter).and.(m_iter.eq.1)) then
161  Umag_direct(:,:)    = (((uxbar(:,:)+eoshift(uxbar(:,:),shift=1,boundary=0.,dim=1))**2+ &        ! moyenne
162                          (uybar(:,:)+eoshift(uybar(:,:),shift=1,boundary=0.,dim=2))**2)**0.5)*0.5
163  Umag_vitbil(:,:)= min(Umag_direct(:,:) * min(1.e3,H(:,:)/H0(:,:)), 5000.)
164  print*,'*****debug beta_iter_vitbil calcul de Umag_vitbil',time,m_iter
165  do j=1,ny
166    do i=1,nx
167      write(266,*) Umag_vitbil(i,j)
168    enddo
169  enddo
170endif
171
172! calcule la vitesse centree venant du calcul direct
173
174  Umag_direct(:,:)    = (((uxbar(:,:)+eoshift(uxbar(:,:),shift=1,boundary=0.,dim=1))**2+ &        ! moyenne
175                          (uybar(:,:)+eoshift(uybar(:,:),shift=1,boundary=0.,dim=2))**2)**0.5)*0.5
176
177  Uslmag_direct(:,:)  = (((ux(:,:,nz)+eoshift(ux(:,:,nz),shift=1,boundary=0.,dim=1))**2+ &        ! glissement
178                          (uy(:,:,nz)+eoshift(uy(:,:,nz),shift=1,boundary=0.,dim=2))**2)**0.5)*0.5
179
180  Udefmag_direct(:,:) = max( (Umag_direct(:,:)- Uslmag_direct(:,:)) , 0.)                          ! deformation
181
182
183! guess du beta dans les zones où GRISLI a une vitesse de glissement nulle
184
185  call slope_surf
186  driving_stress(:,:) = rog * H(:,:) * slope(:,:)   !  driving stress
187
188
189  Uslid_vitbil(:,:)   = Umag_vitbil(:,:) - Udefmag_direct(:,:)  ! calcule la vitesse de glissement "bilan"
190
191
192! Pas de glissement dans GRISLI
193
194where ((Uslmag_direct(:,:).le.0.).and.(Uslid_vitbil(:,:).gt.1.e-3))     ! pas de glissement dans GRISLI
195  beta_centre(:,:) = driving_stress(:,:) / Uslid_vitbil(:,:)            ! mais du glissement "bilan"
196end where
197
198
199where ((Uslmag_direct(:,:).le.0.).and.(Uslid_vitbil(:,:).le.1.e-3))     ! ni l'un ni l'autre
200   Uslid_vitbil(:,:) = 0.
201   beta_centre(:,:)  = beta_limgz
202end where
203
204
205! Glissement dans GRISLI
206
207  where (Uslid_vitbil(:,:).le.1.e-3)    ! la vitesse de bilan est deja trop rapide
208     Uslid_vitbil(:,:) = 0.
209     beta_centre(:,:)  = beta_limgz
210
211  elsewhere (Uslmag_direct(:,:).gt.0.)
212     beta_centre(:,:) = beta_centre(:,:) * coef_iter_vitbil * Uslmag_direct(:,:) / Uslid_vitbil(:,:)
213
214  end where
215
216  where(flot(:,:))
217     beta_centre(:,:) = 0.
218  end where
219
220
221
222  beta_centre(:,:) = min(beta_centre(:,:),beta_limgz)
223 
224    call  beta_c2stag(nx,ny,betamx,betamy,beta_centre)  ! redistribue sur les mailles alternees
225    call  beta_min_value(beta_min)                      !  valeur mini que peut avoir beta (en Pa an m-1)
226 
227
228 debug_3D(:,:,59) = betamx(:,:)
229 debug_3D(:,:,60) = beta_centre(:,:)
230
231! estimateurs
232J_Umag  = 0.
233J_Udef   = 0.
234nb_umag = 0
235nb_udef = 0
236
237do j=2,ny-1
238   do i=2,nx-1
239
240      if (.not.flot(i,j)) then                       ! calcul sur les points poses
241         nb_umag = nb_umag + 1
242         J_Umag = (Umag_direct(i,j) - Umag_vitbil(i,j))**2. + J_Umag
243
244         if (Uslid_vitbil(i,j).le.1.e-3) then       ! calcul sur la partie deformation suelement
245            nb_udef = nb_udef + 1
246            J_Udef = (Umag_direct(i,j) - Umag_vitbil(i,j))**2. + J_Udef
247         end if
248      end if
249
250   end do
251end do
252      J_Umag = (J_Umag**0.5) / nb_umag
253      J_Udef = (J_Udef**0.5) / nb_udef
254
255
256drag_centre(:,:) = beta_centre(:,:)
257drag_mx(:,:)     = betamx(:,:)
258drag_my(:,:)     = betamy(:,:)
259
260
261end subroutine beta_iter_vitbil
262!-----------------------------------------------------------------------------------------
263end module beta_iter_vitbil_mod
Note: See TracBrowser for help on using the repository browser.