source: branches/GRISLIv3/SOURCES/MISMIP3D_files/dragging_mismip3d_mod.f90 @ 364

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

initial import GRISLI trunk

File size: 7.0 KB
Line 
1!> \file dragging_mismip3d_mod.f90
2!<
3
4!> \namespace dragging_mismip3
5!!  Module qui fait le dragging de MISMIP avec un beta non lineraire
6!!  tau_b = C  | U_b |**(m-1)  U_b
7
8!! \author Cat
9!! \date 11 mars 2012
10!! @note Used module
11!! @note   - use module3D_phy
12!! @note   - use param_phy_mod
13!<
14
15module dragging_mismip3
16
17
18  use module3d_phy
19  use param_phy_mod
20  use interface_input
21
22  implicit none
23
24  real, dimension(nx,ny)   :: Vcol_x              !< uniquement pour compatibilite dans le spinup
25  real, dimension(nx,ny)   :: Vcol_y              !< uniquement pour compatibilite
26  real, dimension(nx,ny)   :: Vsl_x               !<
27  real, dimension(nx,ny)   :: Vsl_y               !<
28  logical :: corr_def = .False.                   !< for deformation correction (compatibility)
29
30
31real :: beta_limgz          !< when beta gt beta_limgz -> not gzmx
32
33!  equation glissement        tau_b = C  | U_b |**(m-1)  U_b
34
35real :: Coef_C              ! coefficient du glissement dans equation (C)
36real :: exp_m               ! exposant du glissement
37real :: m_1                 ! exposant dans l'equation
38real :: lim_unorm           ! vitesse correspondante a beta_limgz
39integer :: i_dome           ! indice du noeud milieu en x
40integer :: j_dome           ! indice du noeud milieu en y
41 
42contains
43!-------------------------------------------------------------------------------
44
45!> subroutine: init_dragging
46!! Cette routine fait l'initialisation du dragging.
47!<
48
49  subroutine init_dragging      ! Cette routine fait l'initialisation du dragging.
50
51    implicit none
52
53    if (itracebug.eq.1)  call tracebug(' entree dans init_dragging de MISMIP')
54! les coefficients sont codes en dur
55
56    Coef_C = 1.e7                         ! Coefficient glissement en Pa m-1/3 s-1/3
57    exp_m  = 1./3.                        ! exposant du glissement (m)
58    Coef_C = secyear**(-exp_m) * Coef_C   ! en Pa m-1/3 a-1/3
59    m_1    = exp_m - 1                    ! exposant dans le calcul de beta
60
61
62!   limites sur beta
63    beta_limgz = 1.e6                     ! valeur maxi de beta <-->  U = 0
64    betamax    = beta_limgz
65    lim_unorm  = (beta_limgz/Coef_C)**(1./m_1)  ! vitesse correspondante a beta_limgz (de l'ordre de 5 mm/an)
66
67
68! coefficient permettant de modifier le basal drag.
69! drag est celui fixe au depart qui reflete les proprietes du socle
70    drag_mx(:,:)=1.
71    drag_my(:,:)=1.
72
73! mstream est celui courant, eventuellement affecte par les conditions basales
74    mstream_mx(:,:)=1.
75    mstream_my(:,:)=1.
76
77! il faut quand meme au moins un point immobile
78! Ca fait 4 points pour des raisons de symetrie
79
80    i_dome = (nx-1)/2 +1
81    j_dome = (ny-1)/2 +1
82
83    drag_mx(i_dome:i_dome+1,j_dome         )  = 0
84    drag_my(i_dome        ,j_dome:j_dome+1 )  = 0
85    mstream_mx(i_dome:i_dome+1,j_dome         )  = 0
86    mstream_my(i_dome        ,j_dome:j_dome+1 )  = 0
87
88
89! initialisation de certains tableaux
90    ilemx(:,:)  =  .false.
91    ilemy(:,:)  =  .false.
92
93
94! initialisation des vitesses de glissement : lues dans lect_mismip_mod
95
96! initialisation du beta en fonction des vitesses
97!
98
99    call drag_non_lin_stag (nx,ny,Uxflgz,Uyflgz,betamx,betamy)
100
101    return
102  end subroutine init_dragging
103
104
105!________________________________________________________________________________
106
107!> subroutine: dragging
108!! Defini la localisation des streams et le frottement basal
109!! est appele par flottab
110!! en entrant dans cette routine les logiques
111!!  float et flotmx/flotmy sont connus
112!<
113!-------------------------------------------------------------------------
114  subroutine dragging   ! defini la localisation des streams et le frottement basal
115
116
117    if (itracebug.eq.1)  call tracebug(' entree dans dragging de MISMIP')
118
119    call drag_non_lin_stag (nx,ny,Uxflgz,Uyflgz,betamx,betamy)
120
121
122! pas d'iles
123    ilemx(:,:)  =  .false.
124    ilemy(:,:)  =  .false.
125
126
127    where (mstream_mx(:,:).eq.1)    ! SSA  betamx garde la valeur
128       gzmx(:,:) = .true.
129
130
131!       betamx(:,:) = beta_limgz     ! attention ligne pour debug qui enleve le gissement
132
133    elsewhere
134       gzmx(:,:) = .false.
135       betamx(:,:) = beta_limgz
136       Uxflgz(:,:) = 0.
137    end where
138
139    where (flotmx(:,:))             ! pas de frottement sous les parties flottantes
140       betamx(:,:) = 0.
141    end where
142
143    where (mstream_my(:,:).eq.1)    ! SSA  betamy garde la valeur
144       gzmy(:,:) = .true.
145
146
147!       betamy(:,:) = beta_limgz     ! attention ligne pour debug qui enleve le gissement
148
149
150
151    elsewhere
152       gzmy(:,:) = .false.
153       betamy(:,:) = beta_limgz
154       Uyflgz(:,:) = 0.
155    end where
156
157    where (flotmy(:,:))             ! pas de frottement sous les parties flottantes
158       betamy(:,:) = 0.
159    end where
160   
161  if (itracebug.eq.1)  call tracebug(' fin  dragging de MISMIP')
162
163  end subroutine dragging
164
165!________________________________________________________________________________________
166!< calcule la valeur de beta dependant de la vitesse basale
167
168
169  subroutine drag_non_lin_stag (nxx,nyy,Ux_mx,Uy_my,beta_x,beta_y)
170
171    implicit none
172
173                                                            !declarations variables dummy
174    integer                               :: nxx,nyy        !< dimension des tableaux
175    real, dimension(nxx,nyy),intent(in)   :: Ux_mx          !< vitesse de glissement x sur le noeud mineur x
176    real, dimension(nxx,nyy),intent(in)   :: Uy_my          !< vitesse de glissement y sur le noeud mineur y
177    real, dimension(nxx,nyy),intent(out)  :: beta_x         !< valeur de beta sur le noeud mineur x
178    real, dimension(nxx,nyy),intent(out)  :: beta_y         !< valeur de beta sur le noeud mineur y
179
180                                                          ! variables locales
181    real, dimension(nxx,nyy)              :: Uxmy           ! vitesse selon x en my
182    real, dimension(nxx,nyy)              :: Uymx           ! vitesse selon y en mx
183    real, dimension(nxx,nyy)              :: Unorm_mx       !< norme vitesse de glissement sur le noeud mineur x
184    real, dimension(nxx,nyy)              :: Unorm_my       !< norme vitesse de glissement sur le noeud mineur y
185
186
187  if (itracebug.eq.1)  call tracebug(' entree dans drag_non_lin_stag MISMIP')
188
189
190    do j=2,nyy-1
191       do i=2,nxx
192          Uymx(i,j)      = ((Uy_my(i,j)+Uy_my(i-1,j+1))+(Uy_my(i-1,j)+Uy_my(i,j+1)))/4.  ! vitesse selon y en mx
193          Unorm_mx(i,j)  = (Ux_mx(i,j)**2+Uymx(i,j)**2)**0.5
194        end do
195    end do
196
197
198    do j=2,nyy
199       do i=2,nxx-1
200          Uxmy(i,j)      = ((Ux_mx(i,j)+Ux_mx(i+1,j-1))+(Ux_mx(i,j-1)+Ux_mx(i+1,j)))/4.  ! vitesse selon y en mx
201          Unorm_my(i,j)  = (Uy_my(i,j)**2+Uxmy(i,j)**2)**0.5
202       end do
203    end do
204
205
206    do j=2,nyy-1
207       do i=2,nxx
208
209          if (Unorm_mx(i,j).gt.lim_unorm) then
210             beta_x(i,j)    =  Coef_C * Unorm_mx(i,j)**m_1
211          else
212             beta_x(i,j)    =  beta_limgz
213          end if
214       end do
215    end do
216
217
218    do j=2,nyy
219       do i=2,nxx-1
220
221          if (Unorm_my(i,j).gt.lim_unorm) then
222             beta_y(i,j)    =  Coef_C * Unorm_my(i,j)**m_1
223          else
224             beta_y(i,j)    =  beta_limgz
225          end if
226       end do
227    end do
228
229  end subroutine drag_non_lin_stag
230
231  end module dragging_mismip3
232
Note: See TracBrowser for help on using the repository browser.