source: trunk/SOURCES/deformation_mod_2lois.f90 @ 23

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

initial import GRISLI trunk

File size: 15.8 KB
Line 
1!> \file deformation_mod_2lois.f90
2!! C'est ce module qui doit etre selectionne pour faire le calcul de la deformation de la glace 
3!! en utilisant une loi de deformation polynomiale
4!! a deux composantes (habituellement n=3 + n=1)
5!!
6!<
7
8!> \namespace deformation_mod_2lois
9!! C'est ce module qui doit etre selectionne pour faire le calcul de la
10!! deformation de la glace en utilisant une loi de deformation polynomiale
11!! a deux composantes (habituellement n=3 + n=1)
12!! \author CatRitz
13!! \date decmebre 2008
14!! @note Used modules
15!! @note  - use module3D_phy
16!! @note  Contient :
17!! @note  - les declarations des tableaux (etait avant dans deform_declar)
18!! en fait la declaration est independante du nombre d'elements de la loi
19!! et peut etre simplement copie pour un autre nombre
20!! @note  - lecture des valeurs utilisees par namelist
21!! N'est valable que pour la loi a 2 composants. Pour un nombre different de composants,
22!! le recopier et modifier
23!! @note  -  les parameters n1poly et n2poly
24!! @note  -  init_deformation en ajoutant ou supprimant des blocs de namelist
25!!
26!<
27module deformation_mod_2lois
28
29use module3d_phy
30implicit none
31
32
33! declarations ne dependant pas du nombre de lois
34
35real, dimension(nx,ny,nz)   :: teta           !< teta = t - tpmp
36real, dimension(nx,ny,nz-1) :: ti2            !< calcule dans flow_general
37real, dimension(nx,ny,nz)   :: visc           !< viscosite de la glace (pour les shelves)
38real, dimension(nz)         :: edecal         !< travail (decalage de E de 1 indice)
39
40! declaration des lois
41! la valeur de n1poly et de n2poly determine le nombre de lois additionnees
42
43integer, parameter :: n1poly=1     !< 2 lois numerotees de 1 a 2
44integer, parameter :: n2poly=2
45
46
47! Tous les parametres de la loi sous forme de tableau (n1poly:n2poly)
48
49real, dimension(n1poly:n2poly) :: glen             !< l'exposant
50real, dimension(n1poly:n2poly) :: ttrans           !< la temperature de transition
51real, dimension(n1poly:n2poly) :: sf               !< softening factor for flow law
52
53! Pour chaque loi (meme exposant), il y a deux domaines avec une temperature de transition
54
55! 1- temperature inferieure a Ttrans
56real, dimension(n1poly:n2poly) :: Q1               !< energies d'activation (temp < ttrans) 
57real, dimension(n1poly:n2poly) :: Bat1             !< coefficient           (temp < ttrans)
58         
59! 2- temperature superieure a Ttrans
60real, dimension(n1poly:n2poly) :: Q2               !< energies d'activation (temp > ttrans)
61real, dimension(n1poly:n2poly) :: Bat2             !< coefficient           (temp > ttrans)
62
63
64! declaration des tableaux utilises dans le calcul des vitesses, viscosites, ...
65
66real, dimension(nx,ny,nz,n1poly:n2poly) :: Btt     !< coefficient au point considere
67real, dimension(nx,ny,nz,n1poly:n2poly) :: Sa      !< sert dans l'integration des vitesses
68real, dimension(nx,ny,nz,n1poly:n2poly) :: Sa_mx   !< Sa sur demi mailles >
69real, dimension(nx,ny,nz,n1poly:n2poly) :: Sa_my   !< Sa sur demi mailles ^
70real, dimension(nx,ny,nz,n1poly:n2poly) :: S2a     !< sert dans l'integration des vitesses
71real, dimension(nx,ny,nz,n1poly:n2poly) :: S2a_mx  !< S2a sur demi mailles >
72real, dimension(nx,ny,nz,n1poly:n2poly) :: S2a_my  !< S2a sur demi mailles ^
73real, dimension(nx,ny,n1poly:n2poly) :: ddx     !< sert dans le calcul de conserv. masse
74real, dimension(nx,ny,n1poly:n2poly) :: ddy     !< sert dans le calcul de conserv. masse
75
76contains
77
78!-------------------------------------------------------------------------------------------
79
80!> SUBROUTINE: init_deformation
81!! Routine qui lit les variables de deformation
82!>
83subroutine init_deformation 
84
85real :: exposant_1
86real :: temp_trans_1
87real :: enhanc_fact_1
88real :: coef_cold_1
89real :: Q_cold_1
90real :: coef_warm_1
91real :: Q_warm_1
92
93real :: exposant_2
94real :: temp_trans_2
95real :: enhanc_fact_2
96real :: coef_cold_2
97real :: Q_cold_2
98real :: coef_warm_2
99real :: Q_warm_2
100
101namelist/loidef_1/exposant_1,temp_trans_1,enhanc_fact_1,   & 
102                  coef_cold_1,Q_cold_1,coef_warm_1,Q_warm_1
103
104namelist/loidef_2/exposant_2,temp_trans_2,enhanc_fact_2,   & 
105                  coef_cold_2,Q_cold_2,coef_warm_2,Q_warm_2
106
107
108! loi 1
109!--------------------------------------------------------------------------------
110
111rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
112read(num_param,loidef_1)
113
114write(num_rep_42,*)'!___________________________________________________________' 
115write(num_rep_42,*)'! loi de deformation 1          module deformation_mod_2lois'
116write(num_rep_42,*)
117write(num_rep_42,loidef_1)
118write(num_rep_42,*)'! exposant (glen), temperature de transition (ttrans)'
119write(num_rep_42,*)'! enhancement factor (sf)'
120write(num_rep_42,*)'! pour les temperatures inf. a Temp_trans :'
121write(num_rep_42,*)'!                            coef_cold (Bat1) et Q_cold (Q1)'
122write(num_rep_42,*)'! pour les temperatures sup. a Temp_trans :'
123write(num_rep_42,*)'!                            coef_warm (Bat2) et Q_warm (Q2)'
124write(num_rep_42,*)'!___________________________________________________________' 
125
126glen(1)   = exposant_1 
127ttrans(1) = temp_trans_1
128sf(1)     = enhanc_fact_1 
129Bat1(1)   = coef_cold_1
130Q1(1)     = Q_cold_1 
131Bat2(1)   = coef_warm_1
132Q2(1)     = Q_warm_1 
133
134
135! loi 2
136!--------------------------------------------------------------------------------
137 
138rewind(num_param)        ! pour revenir au debut du fichier param_list.dat
139read(num_param,loidef_2)
140
141write(num_rep_42,*)'!___________________________________________________________' 
142write(num_rep_42,*)'! loi de deformation 2          module deformation_mod_2lois'
143write(num_rep_42,*)
144write(num_rep_42,loidef_2)
145write(num_rep_42,*)'! exposant (glen), temperature de transition (ttrans)'
146write(num_rep_42,*)'! enhancement factor (sf)'
147write(num_rep_42,*)'! pour les temperatures inf. a Temp_trans :'
148write(num_rep_42,*)'!                            coef_cold (Bat1) et Q_cold (Q1)'
149write(num_rep_42,*)'! pour les temperatures sup. a Temp_trans :'
150write(num_rep_42,*)'!                            coef_warm (Bat2) et Q_warm (Q2)'
151write(num_rep_42,*)'!___________________________________________________________' 
152
153glen(2)   = exposant_2 
154ttrans(2) = temp_trans_2
155sf(2)     = enhanc_fact_2 
156Bat1(2)   = coef_cold_2
157Q1(2)     = Q_cold_2 
158Bat2(2)   = coef_warm_2
159Q2(2)     = Q_warm_2 
160
161! autre parametres ne changeant pas d'un run a l'autre
162RGAS=8.314
163
164! application des sf
165
166do iglen= n1poly,n2poly
167   bat1(iglen)=bat1(iglen)*sf(iglen)
168   bat2(iglen)=bat2(iglen)*sf(iglen)
169end do
170
171ddx(:,:,:)=0.
172ddy(:,:,:)=0.
173
174
175end subroutine init_deformation
176
177
178!--------------------------------------------------------------------
179subroutine flow_general
180
181  implicit none
182
183  teta(:,:,:) = t(:,:,1:nz)-tpmp(:,:,:)
184
185
186  do k=nz-1,1,-1
187     do i=2,nx-1
188        do j=2,ny-1
189           ti2(i,j,k) = (273.15+(tpmp(i,j,k+1)+tpmp(i,j,k))/2.)* &
190                (273.15+(t(i,j,k+1)+t(i,j,k))/2.)
191        end do
192     end do
193  end do
194
195end subroutine flow_general
196!---------------------------------------------------------------------------------------
197subroutine flowlaw (iiglen)
198
199
200  implicit none
201  integer ::  iiglen   !< compteur pour la boucle flowlaw
202  real :: a5 !< exposant de la loi de def +2
203  real :: a4 !< exposant de la loi de def +1
204  real :: ti1 !< utilise pour le calcul de btt a k=1
205  real :: bat !< prend la valeur de bat1 ou bat2 selon les cas
206  real :: q !< prend la valeur de q1 ou q2 selon les cas
207  real :: aat !< variable de travail =q*tetar(i,j,k)
208  real :: ssec !< variable de travail
209  real :: zetat !< variable de travail : profondeur ou t = trans(iiglen)
210  real,dimension(nx,ny,nz) :: si1 !< tableau de calcul
211  real,dimension(nx,ny,nz) :: si2 !< tableau de calcul
212  real,dimension(nx,ny) :: tab_mx
213  real,dimension(nx,ny) :: tab_my
214  real,dimension(nx,ny) :: tab2d
215
216!  real,dimension(nz) :: e          ! vertical coordinate in ice, scaled to h zeta
217  real :: de= 1./(nz-1)
218
219  e(1)=0.
220  e(nz)=1.
221  do k=1,nz
222     if ((k.ne.1).and.(k.ne.nz)) e(k)=(k-1.)/(nz-1.)
223  end do
224
225  ! exposant de la loi de deformation utilisee : glen(iiglen)
226  ! l'exposant correspondant a iiglen est defini dans deformation_mod
227  a5 = glen(iiglen) + 2 
228  a4 = glen(iiglen) + 1
229
230  !    boucle pour btt a k=1
231  ti1=273.15*273.15
232  do j=2,ny-1
233     do i=2,nx-1
234        if (t(i,j,1).le.ttrans(iiglen)) then
235           btt(i,j,1,iiglen)=bat1(iiglen)*exp(q1(iiglen)/rgas/ti1*t(i,j,1))
236        else
237           btt(i,j,1,iiglen)=bat2(iiglen)*exp(q2(iiglen)/rgas/ti1*t(i,j,1))
238        endif
239     end do
240  end do
241
242  ! boucle pour tous les autres btt
243  do k=nz-1,1,-1
244     do j=2,ny-1
245        do i=2,nx-1 
246           if (h(i,j).gt.1.) then
247              if ((teta(i,j,k).le.ttrans(iiglen)).and. &
248                   (teta(i,j,k+1).le.ttrans(iiglen))) then
249                 bat=bat1(iiglen)
250                 q=q1(iiglen)
251                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
252                 aat=max(-1.8,aat)
253                 aat=min(80.,aat)
254                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
255                 si1(i,j,k)=ssec/(aat+a4)*(e(k)**(aat+a4)-e(k+1)**(aat+a4))
256                 si2(i,j,k)=((e(k)**(aat+a5))/(aat+a5) &
257                      -(e(k+1)**(aat+a5))/(aat+a5) &
258                      -(e(k+1)**(aat+a4))*e(k)+e(k+1)**(aat+a5)) &
259                      * ssec/(aat+a4) 
260                 btt(i,j,k+1,iiglen)=bat*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
261              else if ((teta(i,j,k).ge.ttrans(iiglen)).and. &
262                   (teta(i,j,k+1).ge.ttrans(iiglen))) then
263                 bat=bat2(iiglen)
264                 q=q2(iiglen)
265                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
266                 aat=max(-1.8,aat)
267                 aat=min(80.,aat)
268                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
269                 si1(i,j,k)=ssec/(aat+a4)*(e(k)**(aat+a4)-e(k+1)**(aat+a4))
270                 si2(i,j,k)=((e(k)**(aat+a5))/(aat+a5) &
271                      -(e(k+1)**(aat+a5))/(aat+a5) &
272                      -(e(k+1)**(aat+a4))*e(k)+e(k+1)**(aat+a5)) &
273                      * ssec/(aat+a4) 
274                 btt(i,j,k+1,iiglen)=bat*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
275
276                 ! cas ou la temperature de la maille est en partie au dessus et au dessous
277                 ! de ttrans(iiglen)
278              else if ((teta(i,j,k).lt.ttrans(iiglen)).and. &
279                   (teta(i,j,k+1).gt.ttrans(iiglen))) then
280                 !         calcul de la profondeur de transition
281                 if (abs(teta(i,j,k)-teta(i,j,k+1)).lt.1.e-5) then
282                    zetat=(e(k)+e(k+1))/2.
283                 else
284                    zetat=e(k+1)-(ttrans(iiglen)-teta(i,j,k+1))/ &
285                         (teta(i,j,k)-teta(i,j,k+1))*de
286                 endif
287
288                 !         integration entre zeta2 et zetat, loi bat2
289                 bat=bat2(iiglen)
290                 q=q2(iiglen)
291                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
292                 aat=max(-1.8,aat)
293                 aat=min(80.,aat)
294                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
295                 si1(i,j,k)=ssec/(aat+a4)*(zetat**(aat+a4)-e(k+1)**(aat+a4))
296                 si2(i,j,k)=((zetat**(aat+a5))/(aat+a5) &
297                      -(e(k+1)**(aat+a5))/(aat+a5) &
298                      -(e(k+1)**(aat+a4))*zetat+e(k+1)**(aat+a5)) &
299                      * ssec/(aat+a4)
300                 btt(i,j,k+1,iiglen)=bat*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
301
302                 !         integration entre zetat et zeta1, loi bat1
303                 bat=bat1(iiglen)
304                 q=q1(iiglen)
305                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
306                 aat=max(-1.8,aat)
307                 aat=min(80.,aat)
308                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
309                 si1(i,j,k)=si1(i,j,k)+ &
310                      ssec/(aat+a4)*(e(k)**(aat+a4)-zetat**(aat+a4))
311                 si2(i,j,k)=si2(i,j,k) &
312                      +((e(k)**(aat+a5))/(aat+a5) &
313                      -(zetat**(aat+a5))/(aat+a5) &
314                      -(zetat**(aat+a4))*e(k)+zetat**(aat+a5)) &
315                      * ssec/(aat+a4)
316
317
318                 ! deuxieme cas ou la temperature de la maille est en partie au dessus et
319                 ! au dessous de ttrans(iiglen)
320              else if ((teta(i,j,k).gt.ttrans(iiglen)).and. &
321                   (teta(i,j,k+1).lt.ttrans(iiglen))) then
322                 !         calcul de la profondeur de transition
323                 if (abs(teta(i,j,k)-teta(i,j,k+1)).lt.1.e-5) then
324                    zetat=(e(k)+e(k+1))/2.
325                 else
326                    zetat=e(k+1)-(ttrans(iiglen)-teta(i,j,k+1))/ &
327                         (teta(i,j,k)-teta(i,j,k+1))*de
328                 endif
329
330                 !         integration entre zeta2 et zetat, loi bat1
331                 bat=bat1(iiglen)
332                 q=q1(iiglen)
333                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
334                 aat=max(-1.8,aat)
335                 aat=min(80.,aat)
336                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
337                 si1(i,j,k)=ssec/(aat+a4)*(zetat**(aat+a4)-e(k+1)**(aat+a4))
338                 si2(i,j,k)=((zetat**(aat+a5))/(aat+a5) &
339                      -(e(k+1)**(aat+a5))/(aat+a5) &
340                      -(e(k+1)**(aat+a4))*zetat+e(k+1)**(aat+a5)) &
341                      * ssec/(aat+a4)
342                 btt(i,j,k+1,iiglen)=bat*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
343
344                 !         integration entre zetat et zeta1, loi bat2
345                 bat=bat2(iiglen)
346                 q=q2(iiglen)
347                 aat=q/rgas/ti2(i,j,k)*(teta(i,j,k+1)-teta(i,j,k))/de*e(k+1)
348                 aat=max(-1.8,aat)
349                 aat=min(80.,aat)
350                 ssec=bat/(e(k+1)**aat)*exp((q*teta(i,j,k+1))/(rgas*ti2(i,j,k)))
351                 si1(i,j,k)=si1(i,j,k)+ &
352                      ssec/(aat+a4)*(e(k)**(aat+a4)-zetat**(aat+a4))
353                 si2(i,j,k)=si2(i,j,k) &
354                      +((e(k)**(aat+a5))/(aat+a5) &
355                      -(zetat**(aat+a5))/(aat+a5) &
356                      -(zetat**(aat+a4))*e(k)+zetat**(aat+a5)) &
357                      * ssec/(aat+a4)
358              endif
359           endif
360        end do
361     end do
362  end do
363
364  !     integration de sa et s2a
365
366  do j=1,ny
367     do i=1,nx 
368        sa(i,j,nz,iiglen)=0.
369        s2a(i,j,nz,iiglen)=0.
370        if (h(i,j).le.1.) btt(i,j,nz,iiglen)=bat2(iiglen)
371     end do
372  end do
373
374  do k=nz-1,1,-1
375     do j=1,ny
376        do i=1,nx
377           if (h(i,j).gt.1.) then
378              sa(i,j,k,iiglen)=sa(i,j,k+1,iiglen)-si1(i,j,k)
379              s2a(i,j,k,iiglen)=s2a(i,j,k+1,iiglen)+si2(i,j,k)+ &
380                   sa(i,j,k+1,iiglen)*de
381           else
382              sa(i,j,k,iiglen)=bat2(iiglen)/a4*(1-e(k)**a4)
383              s2a(i,j,k,iiglen)=bat2(iiglen)/a4*(a4/a5-e(k)+e(k)**a5/a5)
384              btt(i,j,k,iiglen)=bat2(iiglen)
385           endif
386        end do
387     end do
388  end do
389
390  !     cas particulier des bords
391  sa(:,1,:,iiglen)=sa(:,2,:,iiglen)
392  s2a(:,1,:,iiglen)=s2a(:,2,:,iiglen)
393  btt(:,1,:,iiglen)=btt(:,2,:,iiglen)
394  sa(:,ny,:,iiglen)=sa(:,ny-1,:,iiglen)
395  s2a(:,ny,:,iiglen)=s2a(:,ny-1,:,iiglen)
396  btt(:,ny,:,iiglen)=btt(:,ny-1,:,iiglen)
397
398  sa(1,:,:,iiglen)=sa(2,:,:,iiglen)
399  s2a(1,:,:,iiglen)=s2a(2,:,:,iiglen)
400  btt(1,:,:,iiglen)=btt(2,:,:,iiglen)
401  sa(nx,:,:,iiglen)=sa(nx-1,:,:,iiglen)
402  s2a(nx,:,:,iiglen)=s2a(nx-1,:,:,iiglen)
403  btt(nx,:,:,iiglen)=btt(nx-1,:,:,iiglen)
404
405  ! calcul des moyennes sur les mailles staggered
406
407  do k=1,nz
408     tab2d=sa(:,:,k,iiglen)
409
410     call moy_mxmy(nx,ny,tab2d,tab_mx,tab_my)
411     sa_mx(:,:,k,iglen)=tab_mx
412     sa_my(:,:,k,iglen)=tab_my
413
414     tab2d=s2a(:,:,k,iiglen)
415     call moy_mxmy(nx,ny,tab2d,tab_mx,tab_my)
416     s2a_mx(:,:,k,iglen)=tab_mx
417     s2a_my(:,:,k,iglen)=tab_my
418  end do
419
420! attribution de debug_3d pour les sorties s2a
421! loi 1 -> 190 dans description variable -> 90 dans debug_3d
422debug_3d(:,:,90+iiglen-1) = s2a(:,:,1,iiglen)
423
424end subroutine flowlaw
425
426
427end module deformation_mod_2lois
428
Note: See TracBrowser for help on using the repository browser.