source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/surf_heat_transp_mod.F90 @ 253

Last change on this file since 253 was 227, checked in by milmd, 10 years ago

Last LMDZ version (1315) with OpenMP directives and other stuff

  • Property svn:executable set to *
File size: 5.8 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/ocean_slab_mod.F90,v 1.3 2008-02-04 16:24:28 fairhead Exp $
3!
4MODULE surf_heat_transp_mod
5
6
7CONTAINS
8
9      SUBROUTINE divgrad_phy(ngrid,nlevs,temp,delta)
10
11
12
13      IMPLICIT NONE
14
15#include "dimensions.h"
16!#include "dimphys.h"
17#include "paramet.h"
18#include "comcstfi.h"
19#include "comgeom.h"
20#include "comhdiff.h"
21     
22      INTEGER,INTENT(IN) :: ngrid, nlevs
23      REAL,INTENT(IN) :: temp(ngrid,nlevs)
24      REAL,INTENT(OUT) :: delta(ngrid,nlevs)
25      REAL delta_2d(ip1jmp1,nlevs)
26      INTEGER :: ll
27      REAL ghx(ip1jmp1,nlevs), ghy(ip1jm,nlevs)
28
29
30      CALL gr_fi_dyn(nlevs,ngrid,iip1,jjp1,temp,delta_2d)
31      CALL grad(nlevs,delta_2d,ghx,ghy)
32      DO ll=1,nlevs
33          ghx(:,ll)=ghx(:,ll)*zmasqu
34! pas de diffusion zonale 
35!          ghx(:,ll)=0.
36          ghy(:,ll)=ghy(:,ll)*zmasqv
37      END DO
38      CALL diverg(nlevs,ghx,ghy,delta_2d)
39      CALL gr_dyn_fi(nlevs,iip1,jjp1,ngrid,delta_2d,delta)
40
41
42  END SUBROUTINE divgrad_phy
43
44
45
46      SUBROUTINE init_masquv(ngrid,zmasq)
47     
48      IMPLICIT NONE
49
50#include "dimensions.h"
51!#include "dimphys.h"
52#include "paramet.h"
53#include "comcstfi.h"   
54#include "comgeom.h"
55#include "comhdiff.h"
56
57
58      INTEGER,INTENT(IN) :: ngrid
59      REAL zmasq(ngrid)
60      REAL zmasq_2d(ip1jmp1)
61      REAL ff(ip1jm)
62      REAL eps
63      INTEGER i
64
65
66! Masques u,v
67      zmasqu=1.
68      zmasqv=1.
69
70      CALL gr_fi_dyn(1,ngrid,iip1,jjp1,zmasq,zmasq_2d)
71
72      DO i=1,ip1jmp1-1
73        IF (zmasq_2d(i).GT.1e-5 .OR. zmasq_2d(i+1).GT.1e-5) THEN
74                zmasqu(i)=0.
75        ENDIF
76      END DO
77      DO i=iip1,ip1jmp1,iip1
78        zmasqu(i)=zmasqu(i-iim)
79      END DO
80      DO i=1,ip1jm
81        IF (zmasq_2d(i).GT.1e-5 .OR. zmasq_2d(i+iip1).GT.1e-5) THEN 
82                zmasqv(i)=0.
83        END IF
84      END DO
85
86
87! Coriolis (pour Ekman transp.)
88      eps=1e-5
89!      CALL getin('slab_eps',eps)
90!      print *,'epsilon=',eps
91      ff=fext*unsairez       
92      DO i=1,ip1jm
93        unsev(i)=eps/(ff(i)*ff(i)+eps**2)
94        unsfv(i)=ff(i)/(ff(i)*ff(i)+eps**2)
95      ENDDO
96      CALL gr_v_scal(1,unsfv,unsfu)
97      CALL gr_v_scal(1,unsev,unseu)
98! Alpha variable?
99!      alpha_var=.FALSE.
100!      CALL getin('slab_alphav',alpha_var)
101
102
103     
104  END SUBROUTINE init_masquv
105
106
107
108      SUBROUTINE slab_ekman2(ngrid,tx_phy,ty_phy,ts_phy,dt_phy)
109 
110          use slab_ice_h 
111
112      IMPLICIT NONE
113     
114#include "dimensions.h"
115!#include "dimphys.h"
116#include "paramet.h"
117#include "comcstfi.h"
118#include "callkeys.h"
119#include "comgeom.h"
120#include "comhdiff.h"
121
122      INTEGER,INTENT(IN) :: ngrid
123      INTEGER ij
124      REAL txv(ip1jm),fluxm(ip1jm),tyv(ip1jm)
125      REAL fluxtm(ip1jm,noceanmx),fluxtz(ip1jmp1,noceanmx)
126      REAL tyu(ip1jmp1),txu(ip1jmp1),fluxz(ip1jmp1),fluxv(ip1jmp1)
127      REAL dt(ip1jmp1,noceanmx),ts(ip1jmp1,noceanmx)
128      REAL tx_phy(ngrid),ty_phy(ngrid)
129      REAL dt_phy(ngrid,noceanmx),ts_phy(ngrid,noceanmx)
130
131
132
133
134! Passage taux,y sur grilles 2d
135      CALL gr_fi_dyn(1,ngrid,iip1,jjp1,tx_phy,txu)
136      CALL gr_fi_dyn(1,ngrid,iip1,jjp1,ty_phy,tyu)
137! Passage grille u,v
138! Multiplication par f ou eps.
139      CALL gr_v_scal(1,txu,txv)
140      CALL gr_v_scal(1,tyu,tyv)
141      fluxm=tyv*unsev-txv*unsfv
142!      fluxm=-txv*unsfv
143      CALL gr_u_scal(1,txu,txu)
144      CALL gr_u_scal(1,tyu,tyu)
145      fluxz=tyu*unsfu+txu*unseu
146!      fluxz=tyu*unsfu
147           
148! Calcul de T, Tdeep
149      CALL gr_fi_dyn(2,ngrid,iip1,jjp1,ts_phy,ts)
150       
151! Flux de masse
152      fluxm=fluxm*cv*cuvsurcv*zmasqv
153      fluxz=fluxz*cu*cvusurcu*zmasqu
154! Flux de masse vertical
155      DO ij=iip2,ip1jm
156        fluxv(ij)=fluxz(ij)-fluxz(ij-1)-fluxm(ij)+fluxm(ij-iip1)
157      ENDDO
158      DO ij=iip1,ip1jmi1,iip1
159         fluxv(ij+1)=fluxv(ij+iip1)
160      END DO
161! Poles
162      fluxv(1)=-SUM(fluxm(1:iim))     
163      fluxv(ip1jmp1)=SUM(fluxm(ip1jm-iim:ip1jm-1))
164      fluxv=fluxv
165
166!Calcul flux de chaleur méridiens
167      DO ij=1,ip1jm
168          fluxtm(ij,1)=fluxm(ij)*(ts(ij+iip1,1)+ts(ij,1))/2.
169          fluxtm(ij,2)=-fluxm(ij)*(ts(ij+iip1,2)+ts(ij,2))/2.
170      END DO
171
172!Calcul flux chaleur zonaux
173      DO ij=iip2,ip1jm
174      IF (fluxz(ij).GE.0.) THEN
175             fluxtz(ij,1)=fluxz(ij)*ts(ij,1)
176             fluxtz(ij,2)=-fluxz(ij)*ts(ij+1,2)
177      ELSE
178             fluxtz(ij,1)=fluxz(ij)*ts(ij+1,1)
179             fluxtz(ij,2)=-fluxz(ij)*ts(ij,2)
180      ENDIF
181      END DO
182      DO ij=iip1*2,ip1jmp1,iip1
183             fluxtz(ij,:)=fluxtz(ij-iim,:)
184      END DO
185                   
186! Calcul de dT
187      DO ij=iip2,ip1jm
188         dt(ij,:)=fluxtz(ij-1,:)-fluxtz(ij,:)   &
189                  +fluxtm(ij,:)-fluxtm(ij-iip1,:)
190         IF (fluxv(ij).GT.0.) THEN
191           dt(ij,1)=dt(ij,1)+fluxv(ij)*ts(ij,2)
192           dt(ij,2)=dt(ij,2)-fluxv(ij)*ts(ij,2)
193         ELSE
194           dt(ij,1)=dt(ij,1)+fluxv(ij)*ts(ij,1)
195           dt(ij,2)=dt(ij,2)-fluxv(ij)*ts(ij,1)
196         ENDIF
197         dt(ij,:)=dt(ij,:)/aire(ij)
198      END DO
199      DO ij=iip1,ip1jmi1,iip1
200         dt(ij+1,:)=dt(ij+iip1,:) 
201      END DO
202! Pôles
203      dt(1,:)=SUM(fluxtm(1:iim,:),dim=1)
204        IF (fluxv(1).GT.0.) THEN
205          dt(1,1)=dt(1,1)+fluxv(1)*ts(1,2)
206          dt(1,2)=dt(1,2)-fluxv(1)*ts(1,2)
207        ELSE
208          dt(1,1)=dt(1,1)+fluxv(1)*ts(1,1)
209          dt(1,2)=dt(1,2)-fluxv(1)*ts(1,1)
210        ENDIF
211      dt(1,:)=dt(1,:)/apoln
212      dt(ip1jmp1,:)=-SUM(fluxtm(ip1jm-iim:ip1jm-1,:),dim=1)
213       IF (fluxv(ip1jmp1).GT.0.) THEN
214         dt(ip1jmp1,1)=dt(ip1jmp1,1)+fluxv(ip1jmp1)*ts(ip1jmp1,2)
215         dt(ip1jmp1,2)=dt(ip1jmp1,2)-fluxv(ip1jmp1)*ts(ip1jmp1,2)
216       ELSE
217         dt(ip1jmp1,1)=dt(ip1jmp1,1)+fluxv(ip1jmp1)*ts(ip1jmp1,1)
218         dt(ip1jmp1,2)=dt(ip1jmp1,2)-fluxv(ip1jmp1)*ts(ip1jmp1,1)
219       ENDIF
220      dt(ip1jmp1,:)=dt(ip1jmp1,:)/apols
221      dt(2:iip1,1)=dt(1,1)
222      dt(2:iip1,2)=dt(1,2)
223      dt(ip1jm+1:ip1jmp1,1)=dt(ip1jmp1,1)
224      dt(ip1jm+1:ip1jmp1,2)=dt(ip1jmp1,2)
225
226! Retour grille physique
227      CALL gr_dyn_fi(2,iip1,jjp1,ngrid,dt,dt_phy)
228
229
230  END SUBROUTINE slab_ekman2
231
232 
233END MODULE surf_heat_transp_mod
234
235
236
Note: See TracBrowser for help on using the repository browser.