source: trunk/SOURCES/Ant45_CISM_files/dragging-vit_bil_CISM_45_mod.f90 @ 111

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

initial import GRISLI trunk

File size: 9.1 KB
Line 
1!> \file dragging-vit_bil_CISM_45_mod.f90
2!! Module qui defini les zones de stream d'apres les vitesses de bilan
3!<
4
5!> \namespace dragging_vit_bil_CISM_45
6!! Module qui defini les zones de stream
7!! \author ...
8!! \date ...
9!! @note Defini les zones de stream avec :
10!! @note   - un critere sur la hauteur d'eau
11!! @note   - un critere de fleuves actuels
12!! @note Attention il faut fonctionner en additionnant SIA et Stream pour éviter les pb
13!! de fleuves en pointille
14!! @note Used module
15!! @note   - use module3D_phy
16!! @note   - use param_phy_mod
17!<
18module dragging_vit_bil_CISM_45
19
20  ! Defini les zones de stream avec :
21  ! * un critere sur la hauteur d'eau
22  ! * un critere de fleuves actuels
23  ! attention il faut fonctionner en additionnant SIA et Stream pour éviter les pb
24  ! de fleuves en pointille
25
26
27  use module3d_phy
28  use param_phy_mod
29  use interface_input
30  implicit none
31  logical,dimension(nx,ny) :: fleuvemx         !< fleuves sont les tableaux courants (dep. time)   
32  logical,dimension(nx,ny) :: fleuvemy
33  logical,dimension(nx,ny) :: fleuve     
34  logical,dimension(nx,ny) :: cote   
35
36  !hassine
37  real, dimension(nx,ny) :: Vcol_x              !< uniquement pour compatibilite dans le spinup
38  real, dimension(nx,ny) :: Vcol_y              !< uniquement pour compatibilite
39  !
40
41  character(len=100) :: balance_vel_file        !<  vitesses de bilan
42  real, dimension(nx,ny) :: vitbil_max          !<  vitesse de bilan max sur la maille
43  real ::  seuil_vel                            !<  seuil sur les vitesses pour definir le masque stream
44
45  real :: valmax
46  integer :: imax,jmax
47  integer :: i_moins1,i_plus1,j_moins1,j_plus1
48  integer :: lmax=20
49  integer :: idep,jdep,iloc,jloc
50
51
52  real :: tostick      ! pour la glace posee
53  real :: tob_ile      ! pour les iles
54
55contains
56  !-------------------------------------------------------------------------------
57  subroutine init_dragging      ! Cette routine fait l'initialisation du dragging.
58
59    implicit none
60
61    namelist/drag_vit_bil_CISM_45/hwatstream,cf,betamax,toblim,seuil_vel,balance_vel_file   
62
63    if (itracebug.eq.1)  call tracebug(' Init_dragging avec dragging_vit_bil_CISM_45')
64
65
66    ! formats pour les ecritures dans 42
67428 format(A)
68
69    ! lecture des parametres du run                   
70    !--------------------------------------------------------------------
71
72    rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
73    read(num_param,drag_vit_bil_CISM_45)
74
75    write(num_rep_42,428) '!___________________________________________________________' 
76    write(num_rep_42,428) '! module dragging_vit_bil_CISM_45 '
77    write(num_rep_42,drag_vit_bil_CISM_45)                   
78    write(num_rep_42,428) '! hwatstream (m) :  critere de passage en stream en partant de la cote'
79    write(num_rep_42,428) '!  si hwater > hwatstream '
80    write(num_rep_42,428) '! cf coefficient de la loi de frottement fonction Neff'
81    write(num_rep_42,428) '! seulement pour les points cotiers'
82    write(num_rep_42,428) '! betamax : (Pa) frottement maxi sous les streams '
83    write(num_rep_42,428) '! toblim : (Pa)  pour les iles '
84    write(num_rep_42,428) '! seuil_vel (m/an) : seuil sur les vitesses pour definir le masque stream '
85    write(num_rep_42,428) '! balance_vel_file : nom du fichier qui contient les vitesse de bilan'
86    write(num_rep_42,*)
87
88    tostick=1.e5   ! valeurs pour les points non flgzmx
89    tob_ile=betamax/2.
90    moteurmax=toblim
91
92
93    !-------------------------------------------------------------------
94    ! masque stream : lecture des vitesses de bilan
95    ! attention on prend la colonne 3 qui est la vitesse max dans la maille
96
97    balance_vel_file  = trim(dirnameinp)//trim(balance_vel_file)
98
99
100    call lect_input(3,'vitbil',3,vitbil_max,balance_vel_file,trim(dirnameinp)//trim(runname)//'.nc')   
101    !call lect_datfile(nx,ny,vitbil_max,3,balance_vel_file)     
102
103    mstream_mx(:,:)=0
104    mstream_my(:,:)=0
105
106    do j=1,ny
107       do i=1,nx
108          if (vitbil_max(i,j).gt.seuil_vel) then
109             mstream_mx(i:i+1,j) = 1
110             mstream_my(i,j:j+1) = 1
111             mstream(i,j) = 1                             ! allowed ice streams
112          end if
113       end do
114    end do
115
116    ! coefficient permettant de modifier le basal drag.
117    drag_mx(:,:)=1.
118    drag_my(:,:)=1.
119
120
121    return
122  end subroutine init_dragging
123  !________________________________________________________________________________
124
125
126  !-------------------------------------------------------------------------
127  subroutine dragging   ! defini la localisation des streams et le frottement basal
128
129
130    !         les iles n'ont pas de condition neff mais ont la condition toblim
131    !         (ce bloc etait avant dans flottab)
132
133
134    do j=2,ny
135       do i=2,nx
136          ilemx(i,j)=ilemx(i,j).and.(abs(rog*Hmx(i,j)*sdx(i,j)).lt.toblim)
137          ilemy(i,j)=ilemy(i,j).and.(abs(rog*Hmy(i,j)*sdy(i,j)).lt.toblim)
138       end do
139    end do
140
141    fleuvemx(:,:)=.false.
142    fleuvemy(:,:)=.false.
143    fleuve(:,:)=.false.
144    cote(:,:)=.false.
145    cotemx(:,:)=.false.
146    cotemy(:,:)=.false.
147
148    ! detection des cotes
149    do  j=2,ny-1 
150       do i=2,nx-1 
151          if ((.not.flot(i,j)).and. & 
152               ((flot(i+1,j)).or.(flot(i,j+1)).or.(flot(i-1,j)).or.(flot(i,j-1)))) then
153             cote(i,j)=.true.
154             cotemx(i:i+1,j) = .true.
155             cotemy(i,j:j+1) = .true.
156          endif
157       end do
158    end do
159
160    ! le calcul des fleuves se fait sur les mailles majeures
161    ! normalement, les points cotiers sont deja tagges gzmx dans la routine flottab
162
163    do j=2,ny-1
164       do i=2,nx-1
165
166          if ((hwater(i,j).gt.hwatstream).and.(mstream(i,j).eq.1).and.(.not.flot(i,j))) then
167             fleuve(i,j)=.true.
168             fleuvemx(i:i+1,j)=.true.
169             fleuvemy(i,j:j+1)=.true.
170             gzmx(i:i+1,j)=.true.
171             gzmy(i,j:j+1)=.true.
172          endif
173       end do
174    end do
175
176
177    ! calcul du frottement basal (ce bloc etait avant dans neffect)
178
179    drag_mx : do j=2,ny-1
180       do i=2,nx-1
181
182          if ((.not.ilemx(i,j)).and.(fleuvemx(i,j))) gzmx(i,j)=.true. 
183
184          if (cotemx(i,j)) then                        ! point cotier peut etre diminue si pression d'eau
185             betamx(i,j)=cf*neffmx(i,j) 
186             betamx(i,j)=min(betamx(i,j),betamax)
187          else if ((gzmx(i,j)).and.(.not.cotemx(i,j))) then  ! stream -> betamax
188             betamx(i,j)=betamax
189             betamx(i,j)=min(betamx(i,j),betamax)
190             betamx(i,j)=max(betamx(i,j),10.)
191
192             !         if (cf*neffmx(i,j).gt.1500.) then
193             !            gzmx(i,j)=.false.
194             !            betamx(i,j)=tostick
195             !         endif
196
197          else if (ilemx(i,j)) then                     ! ile : tob_ile=betamax/2 + peut etre diminue si pression d'eau
198             betamx(i,j)=cf*neffmx(i,j) 
199             betamx(i,j)=min(betamx(i,j),tob_ile)       
200          else if (flotmx(i,j)) then                    ! flottant ou ile
201             betamx(i,j)=0.
202          else                                         ! grounded, SIA
203             betamx(i,j)=tostick                       ! frottement glace posee (1 bar)
204          endif
205
206       end do
207    end do drag_mx
208
209    drag_my : do j=2,ny-1
210       do i=2,nx-1
211
212          if ((.not.ilemy(i,j)).and.(fleuvemy(i,j))) gzmy(i,j)=.true. 
213
214          if (cotemy(i,j)) then                        ! point cotier peut etre diminue si pression d'eau
215             betamy(i,j)=cf*neffmy(i,j) 
216             betamy(i,j)=min(betamy(i,j),betamax)
217          else if ((gzmy(i,j)).and.(.not.cotemy(i,j))) then  ! stream -> betamax
218             betamy(i,j)=betamax
219             betamy(i,j)=min(betamy(i,j),betamax)
220             betamy(i,j)=max(betamy(i,j),10.)
221
222             !         if (cf*neffmy(i,j).gt.1500.) then
223             !            gzmy(i,j)=.false.
224             !            betamy(i,j)=tostick
225             !         endif
226
227          else if (ilemy(i,j)) then                     ! ile : tob_ile=betamax/2 + peut etre diminue si pression d'eau
228             betamy(i,j)=cf*neffmy(i,j) 
229             betamy(i,j)=min(betamy(i,j),tob_ile)       
230          else if (flotmy(i,j)) then                    ! flottant ou ile
231             betamy(i,j)=0.
232          else                                         ! grounded, SIA
233             betamy(i,j)=tostick                       ! frottement glace posee (1 bar)
234          endif
235
236       end do
237    end do drag_my
238
239
240    where (fleuve(:,:))
241       debug_3D(:,:,1)=1
242    elsewhere (flot(:,:))
243       debug_3D(:,:,1)=2
244    elsewhere
245       debug_3D(:,:,1)=0
246    endwhere
247
248    where (cote(:,:))
249       debug_3D(:,:,2)=1
250    elsewhere
251       debug_3D(:,:,2)=0
252    endwhere
253
254    where (fleuvemx(:,:))
255       debug_3D(:,:,3)=1
256    elsewhere
257       debug_3D(:,:,3)=0
258    endwhere
259
260    where (flotmx(:,:))
261       debug_3D(:,:,3)=-1
262    endwhere
263
264    !_____________________
265
266
267    where (fleuvemy(:,:))
268       debug_3D(:,:,4)=1
269    elsewhere
270       debug_3D(:,:,4)=0
271    endwhere
272
273    where (flotmy(:,:))
274       debug_3D(:,:,4)=-1
275    end where
276
277    debug_3D(:,:,23)= abs(RO*G*HMX(:,:)*sdx(:,:)*1.e-5) 
278    debug_3D(:,:,24)= abs(RO*G*HMY(:,:)*sdy(:,:)*1.e-5) 
279
280    return
281  end subroutine dragging
282
283end module dragging_vit_bil_CISM_45
284
Note: See TracBrowser for help on using the repository browser.