source: LMDZ6/trunk/libf/dyn3d/advect.f90 @ 5274

Last change on this file since 5274 was 5272, checked in by abarral, 9 months ago

Turn paramet.h into a module

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.4 KB
RevLine 
[524]1!
2! $Header$
3!
[5246]4SUBROUTINE advect(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta)
5  USE comconst_mod, ONLY: daysec
6  USE logic_mod, ONLY: conser
7  USE ener_mod, ONLY: gtot
[5271]8  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
[5272]9  USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
10          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
[5246]11  IMPLICIT NONE
12  !=======================================================================
13  !
14  !   Auteurs:  P. Le Van , Fr. Hourdin  .
15  !   -------
16  !
17  !   Objet:
18  !   ------
19  !
20  !   *************************************************************
21  !   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
22  !   *************************************************************
23  !    ces termes sont ajoutes a du,dv,dteta et dq .
24  !  Modif F.Forget 03/94 : on retire q de advect
25  !
26  !=======================================================================
27  !-----------------------------------------------------------------------
28  !   Declarations:
29  !   -------------
30  include "comgeom.h"
[524]31
[5246]32  !   Arguments:
33  !   ----------
[524]34
[5246]35  REAL :: vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm)
36  REAL :: massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm)
37  REAL :: dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm)
[524]38
[5246]39  !   Local:
40  !   ------
[524]41
[5246]42  REAL :: uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1)
43  REAL :: unsaire2(ip1jmp1), ge(ip1jmp1)
44  REAL :: deuxjour, ww, gt, uu, vv
[524]45
[5246]46  INTEGER :: ij,l
[524]47
[5246]48  REAL :: SSUM
[524]49
[5246]50  !-----------------------------------------------------------------------
51  !   2. Calculs preliminaires:
52  !   -------------------------
[524]53
[5246]54  IF (conser)  THEN
55     deuxjour = 2. * daysec
[524]56
[5246]57     DO  ij   = 1, ip1jmp1
58     unsaire2(ij) = unsaire(ij) * unsaire(ij)
59     END DO
60  END IF
[524]61
62
[5246]63  !------------------  -yy ----------------------------------------------
64  !   .  Calcul de     u
[524]65
[5246]66  DO  l=1,llm
67     DO    ij     = iip2, ip1jmp1
68        uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )
69     ENDDO
70     DO    ij     = iip2, ip1jm
71        uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)
72     ENDDO
73     DO      ij         = 1, iip1
74        uav(ij      ,l) = 0.
75        uav(ip1jm+ij,l) = 0.
76     ENDDO
77  ENDDO
[524]78
[5246]79  !------------------  -xx ----------------------------------------------
80  !   .  Calcul de     v
[524]81
[5246]82  DO  l=1,llm
83     DO    ij   = 2, ip1jm
84      vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )
85     ENDDO
86     DO    ij   = 1,ip1jm,iip1
87      vav(ij,l) = vav(ij+iim,l)
88     ENDDO
89     DO    ij   = 1, ip1jm-1
90      vav(ij,l) = vav(ij,l) + vav(ij+1,l)
91     ENDDO
92     DO    ij       = 1, ip1jm, iip1
93      vav(ij+iim,l) = vav(ij,l)
94     ENDDO
95  ENDDO
[524]96
[5246]97  !-----------------------------------------------------------------------
[524]98
[5246]99  !
100  DO l = 1, llmm1
[524]101
102
[5246]103    ! ......   calcul de  - w/2.    au niveau  l+1   .......
[524]104
[5246]105  DO   ij   = 1, ip1jmp1
106  wsur2( ij ) = - 0.5 * w( ij,l+1 )
107  END DO
[524]108
109
[5246]110  ! .....................     calcul pour  du     ..................
[524]111
[5246]112  DO ij = iip2 ,ip1jm-1
113  ww        = wsur2 (  ij  )     + wsur2( ij+1 )
114  uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
115  du(ij,l)  = du(ij,l)   - ww * ( uu - uav(ij, l ) )/massebx(ij, l )
116  du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)
117  END DO
[524]118
[5246]119  ! .....  correction pour  du(iip1,j,l)  ........
120  ! .....     du(iip1,j,l)= du(1,j,l)   .....
[524]121
[5246]122  !DIR$ IVDEP
123  DO  ij   = iip1 +iip1, ip1jm, iip1
124  du( ij, l  ) = du( ij -iim, l  )
125  du( ij,l+1 ) = du( ij -iim,l+1 )
126  END DO
[524]127
[5246]128  ! .................    calcul pour   dv      .....................
[524]129
[5246]130  DO ij = 1, ip1jm
131  ww        = wsur2( ij+iip1 )   + wsur2( ij )
132  vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
133  dv(ij,l)  = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l )
134  dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)
135  END DO
[524]136
[5246]137  !
[524]138
[5246]139  ! ............................................................
140  ! ...............    calcul pour   dh      ...................
141  ! ............................................................
[524]142
[5246]143  !                   ---z
144  !   calcul de  - d( teta  * w )      qu'on ajoute a   dh
145  !               ...............
[524]146
[5246]147    DO ij = 1, ip1jmp1
148     ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
149     dteta(ij, l ) = dteta(ij, l )  -  ww
150     dteta(ij,l+1) = dteta(ij,l+1)  +  ww
151    END DO
[524]152
[5246]153  IF( conser)  THEN
154    DO ij = 1,ip1jmp1
155    ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
156    END DO
157    gt       = SSUM( ip1jmp1,ge,1 )
158    gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
159  END IF
160
161  END DO
162
163  RETURN
164END SUBROUTINE advect
Note: See TracBrowser for help on using the repository browser.