source: trunk/SOURCES/Ant15_CISM_files/dragging-vit_bil_CISM_15_mod.f90 @ 23

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

initial import GRISLI trunk

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