source: trunk/SOURCES/Temperature-routines/temp_col.f90 @ 24

Last change on this file since 24 was 24, checked in by dumas, 8 years ago

Correction Bug dans le calcul de la temperature : reecriture sans les modules-procedures

File size: 5.3 KB
Line 
1!> \file temp_col.f90
2!! Subroutines for vertical temperature calculation
3!<
4
5!> \namespace temp_col
6!!  Subroutines for vertical temperature calculation
7!<
8
9!> SUBROUTINE: Temp_column
10!! Subroutine for vertical temperature calculation
11!! Used modules:
12!! - use Icetemp_declar
13!! - use Tridiagmod
14!>
15
16Subroutine  Temp_col(Ii,Jj,Newtempcol_m,Ct_m,Flot_m,H_m,Tbmer_m)
17
18  Use Icetemp_declar
19  Use Tridiagmod
20 
21 
22  Implicit None
23  integer :: Ii,Jj
24  Real,Dimension(Nx,Ny,Nz+Nzm),Intent(Out)  :: Newtempcol_m        !< Tableau 1d Vert. Des Temperatures En Sortie
25  Real,Dimension(Nz),Intent(In)             :: Ct_m                !< Tableau 1d Vert. Conductivite Thermique
26  Logical,Intent(In)                        :: Flot_m              !< Vrai Si Flot_mtant (Test D'Archimede) 'O'
27  Real,Intent(In)                           :: H_m                 !< Ice Thickness  'O'
28  Real,Intent(In)                           :: Tbmer_m             !< Temperature De La Mer A La Base De L'Ice Shelf
29
30
31  If (H_m.Gt.10.) Then
32
33     ! Conditions Aux Limites a La Base De La Glace
34     !________________________________________________
35
36     ! Base Froide
37     If ( ((Ibase(Ii,Jj).Eq.1).Or.(Ibase(Ii,Jj).Eq.4) &
38          .Or. ((Ibase(Ii,Jj).Eq.5).And.(T(Ii,Jj,Nz).Lt.Tpmp(Ii,Jj,Nz)))) &
39          .And..Not.Flot_m) Then
40
41        Ibase(Ii,Jj)=1
42        Bb(Nz)=1.
43
44        If (Ncond.Eq.1) Then ! Avec Socle
45           Dzi=H_m*Dee*Cm/Ct_m(Nz)
46           Aa(Nz)=-Dzm/(Dzm+Dzi)
47           Cc(Nz)=-Dzi/(Dzm+Dzi)
48           Rr(Nz)=H_m*Dee*Phid(Ii,Jj)*Dzm/Ct_m(Nz)/(Dzm+Dzi)
49        Else                 ! Sans Socle
50           Aa(Nz)=-1.
51           Cc(Nz)=0.
52           Rr(Nz)=-(Ghf(Ii,Jj)-Phid(Ii,Jj))/Ct_m(Nz)*H_m*Dee
53        Endif
54
55     Else
56
57        ! Base Temperee Ou Shelf
58        ! ----------------------               
59        If (Ibase(Ii,Jj).Eq.5)  Ibase(Ii,Jj)=2
60        Ibase(Ii,Jj)=Max(Ibase(Ii,Jj),2)
61        Aa(Nz)=0.
62        Bb(Nz)=1.
63        Cc(Nz)=0.
64
65        If (.Not.Flot_m) Then
66           Rr(Nz)=Tpmp(Ii,Jj,Nz)
67        Else
68           Rr(Nz)=Tbmer_m
69        End If
70
71     Endif
72
73
74     If (Ncond.Eq.1) Then ! Avec Socle
75        Do K=Nz+1,nz+nzm-1
76           Rr(K)=T(Ii,Jj,K)
77        End Do
78        Call Tridiag (Aa,Bb,Cc,Rr,Hh,nz+nzm,Ifail1)
79
80     Else                 ! Sans Socle
81
82        Call Tridiag (Aa,Bb,Cc,Rr,Hh,Nz,Ifail1)
83     Endif
84
85
86     ! Temperature Dans Le Socle Si Ncond=0, Lineaire Avec Le Gradient Ghf
87     If (Ncond.Eq.0) Then
88        Do K=Nz+1,nz+nzm
89           Hh(K)=Hh(Nz)-Dzm*(K-Nz)*Ghf(Ii,Jj)/Cm
90        End Do
91     Endif
92
93     Do K=1,nz+nzm
94        Newtempcol_m(Ii,Jj,K)=Hh(K)
95     End Do
96     Tbdot(Ii,Jj)=(Newtempcol_m(Ii,Jj,Nz)-T(Ii,Jj,Nz))/Dtt
97
98     !      ------------------------------------------------- Glace Tres Fine (H<10m Ou H=0)
99  Else If (H_m.Le.10.) Then
100
101     !       Pour Eviter Des Problemes Lorsque H Est Inferieur A 10 M
102     !       Profil Lineaire, Pente=Flux Geothermique
103     !       Le Cas Sans Glace Est Traite De La Meme Facon  (Dou=0)
104
105     ! ........................................ Avec Calcul Dans Le Socle
106     If (Ncond.Eq.1.And..Not.Flot_m) Then   
107        If (H_m.Gt.0.) Then
108           ! Gradient Dans Le Socle
109           Dou=(T(Ii,Jj,Nz+1)-T(Ii,Jj,Nz))/Dzm*Cm     
110           Dou=Dou/Ct_m(Nz)*Dee*H_m
111
112           Tss=Min(0.,Ts(Ii,Jj))
113           Do K=1,Nz
114              Newtempcol_m(Ii,Jj,K)=Tss+Dou*(K-1.)
115           End Do
116
117        Else
118           ! Pas De Glace
119           Tss=Ts(Ii,Jj)
120           Do K=1,Nz
121              Newtempcol_m(Ii,Jj,K)=Tss
122           End Do
123        End If
124
125        ! Calcul Dans Le Socle Meme S'Il N'Y A Pas De Glace
126        Rr(Nz)=Newtempcol_m(Ii,Jj,Nz)
127        Aa(Nz)=0
128        Bb(Nz)=1
129        Cc(Nz)=0
130
131        Do K=Nz+1,nz+nzm-1
132           Rr(K)=T(Ii,Jj,K)
133        End Do
134
135        ! Creation De Nouveaux Tableaux Juste Pour Tridiag     
136        Do K=1,Nzm+1
137           Abis(K)=Aa(Nz-1+K)
138           Bbis(K)=Bb(Nz-1+K)
139           Cbis(K)=Cc(Nz-1+K)
140           Rbis(K)=Rr(Nz-1+K)
141        End Do
142
143        Call Tridiag (Abis,Bbis,Cbis,Rbis,Hbis,Nzm+1,Ifail1)
144
145        Do K=1,Nzm+1
146           Hh(Nz-1+K)=Hbis(K)
147        End Do
148
149        ! ........................................ Sans Calcul Dans Le Socle
150     Else
151        ! Calotte Posee                   
152        If ((H_m.Gt.0.).And..Not.Flot_m) Then
153           Dou=-Ghf(Ii,Jj)/Ct_m(Nz)*Dee*H_m
154           Tss=Min(0.,Ts(Ii,Jj))
155           Do K=1,Nz
156              Newtempcol_m(Ii,Jj,K)=Tss+Dou*(K-1.)
157           End Do
158
159           !  Shelf
160        Else If ((H_m.Gt.0.).And.Flot_m) Then
161           Tss=Min(0.,Ts(Ii,Jj))
162           Dou=(Tbmer_m-Tss)*Dee
163           Do K=1,Nz
164              Newtempcol_m(Ii,Jj,K)=Tss+Dou*(K-1.)
165           End Do
166
167           ! Pas De Glace
168        Else
169           Tss=Ts(Ii,Jj)     
170           Do K=1,Nz
171              Newtempcol_m(Ii,Jj,K)=Tss
172           End Do
173        End If
174
175        ! Temperature Dans Le Socle, Lineaire Avec Le Gradient Ghf
176        If (.Not.Flot_m) Then
177           Do K=Nz+1,nz+nzm
178              Hh(K)=Newtempcol_m(Ii,Jj,Nz)-Dzm*(K-Nz)*Ghf(Ii,Jj)/Cm
179           End Do
180        Else
181           Do K=Nz+1,nz+nzm
182              Hh(K)=Tbmer_m-Dzm*(K-Nz)*Ghf(Ii,Jj)/Cm
183           End Do
184        End If
185
186     Endif
187     ! Fin Du Test Socle
188
189
190     Do K=Nz+1,nz+nzm
191        Newtempcol_m(Ii,Jj,K)=Hh(K)
192     End Do
193
194     Tbdot(Ii,Jj)=(Newtempcol_m(Ii,Jj,Nz)-T(Ii,Jj,Nz))/Dtt
195     Bmelt(Ii,Jj)=0.
196     Ibase(Ii,Jj)=5
197     Phid(Ii,Jj)=0.
198
199
200  End If
201
202End Subroutine Temp_col
Note: See TracBrowser for help on using the repository browser.