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

Last change on this file since 5248 was 5246, checked in by abarral, 23 hours ago

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

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