source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/caldyn_loc.f90 @ 5153

Last change on this file since 5153 was 5136, checked in by abarral, 8 weeks ago

Put comgeom.h, comgeom2.h into modules

  • 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
File size: 5.8 KB
RevLine 
[1987]1! $Id: $
[5099]2
[5101]3SUBROUTINE caldyn_loc &
4        (itau, ucov, vcov, teta, ps, masse, pk, pkf, phis, &
5        phi, conser, du, dv, dteta, dp, w, pbaru, pbarv, time)
6  USE parallel_lmdz
7  USE Write_Field_loc
8  USE caldyn_mod, ONLY: vcont, ucont, ang, p, massebx, masseby, &
9          vorpot, ecin, bern, massebxy, convm
10  USE comvert_mod, ONLY: ap, bp
11  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
[5136]12  USE lmdz_comgeom
[1632]13
[5101]14  IMPLICIT NONE
[1632]15
[5101]16  !=======================================================================
[5099]17
[5101]18  !  Auteur :  P. Le Van
[5099]19
[5101]20  !   Objet:
21  !   ------
[5099]22
[5101]23  !   Calcul des tendances dynamiques.
[5099]24
[5101]25  ! Modif 04/93 F.Forget
26  !=======================================================================
[1632]27
[5101]28  !-----------------------------------------------------------------------
29  !   0. Declarations:
30  !   ----------------
[1632]31
[5134]32  INCLUDE "dimensions.h"
33  INCLUDE "paramet.h"
[1632]34
[5101]35  !   Arguments:
36  !   ----------
[1632]37
[5101]38  LOGICAL, INTENT(IN) :: conser ! triggers printing some diagnostics ! not used
39  INTEGER, INTENT(IN) :: itau ! time step index ! not used
40  REAL, INTENT(IN) :: vcov(ijb_v:ije_v, llm) ! covariant meridional wind
41  REAL, INTENT(IN) :: ucov(ijb_u:ije_u, llm) ! covariant zonal wind
42  REAL, INTENT(IN) :: teta(ijb_u:ije_u, llm) ! potential temperature
43  REAL, INTENT(IN) :: ps(ijb_u:ije_u) ! surface pressure
44  REAL, INTENT(IN) :: phis(ijb_u:ije_u) ! geopotential at the surface
45  REAL, INTENT(IN) :: pk(iip1, jjb_u:jje_u, llm) ! Exner at mid-layer
46  REAL, INTENT(IN) :: pkf(ijb_u:ije_u, llm) ! filtered Exner
47  REAL, INTENT(IN) :: phi(ijb_u:ije_u, llm) ! geopotential
48  REAL, INTENT(OUT) :: masse(ijb_u:ije_u, llm) ! air mass
49  REAL, INTENT(OUT) :: dv(ijb_v:ije_v, llm) ! tendency on vcov
50  REAL, INTENT(OUT) :: du(ijb_u:ije_u, llm) ! tendency on ucov
51  REAL, INTENT(OUT) :: dteta(ijb_u:ije_u, llm) ! tenddency on teta
52  REAL, INTENT(OUT) :: dp(ijb_u:ije_u) ! tendency on ps
53  REAL, INTENT(OUT) :: w(ijb_u:ije_u, llm) ! vertical velocity
54  REAL, INTENT(OUT) :: pbaru(ijb_u:ije_u, llm) ! mass flux in the zonal direction
55  REAL, INTENT(OUT) :: pbarv(ijb_v:ije_v, llm) ! mass flux in the meridional direction
56  REAL, INTENT(IN) :: time ! current time
[1632]57
[5101]58  !   Local:
59  !   ------
[1632]60
[5101]61  INTEGER :: ij, l, ijb, ije, ierr
[1632]62
63
[5101]64  !-----------------------------------------------------------------------
65  !   Compute dynamical tendencies:
66  !--------------------------------
[1987]67
[5113]68  ! compute contravariant winds ucont() and vcont
[5101]69  CALL covcont_loc  (llm, ucov, vcov, ucont, vcont)
[5113]70  ! compute pressure p()
[5101]71  CALL pression_loc (ip1jmp1, ap, bp, ps, p)
72  !ym      CALL psextbar (   ps   , psexbarxy                          )
73  !$OMP BARRIER
[5113]74  ! compute mass in each atmospheric mesh: masse()
[5101]75  CALL massdair_loc (p, masse)
[5113]76  ! compute X and Y-averages of mass, massebx() and masseby()
[5101]77  CALL massbar_loc  (masse, massebx, masseby)
[5113]78  ! compute XY-average of mass, massebxy()
[5101]79  CALL massbarxy_loc(masse, massebxy)
[5113]80  ! compute mass fluxes pbaru() and pbarv()
[5101]81  CALL flumass_loc  (massebx, masseby, vcont, ucont, pbaru, pbarv)
[5113]82  ! compute dteta() , horizontal converging flux of theta
[5101]83  CALL dteta1_loc   (teta, pbaru, pbarv, dteta)
[5113]84  ! compute convm(), horizontal converging flux of mass
[5101]85  CALL convmas1_loc  (pbaru, pbarv, convm)
86  !$OMP BARRIER
87  CALL convmas2_loc  (convm)
88  !$OMP BARRIER
89  IF (CPPKEY_DEBUGIO) THEN
90    CALL WriteField_u('ucont', ucont)
91    CALL WriteField_v('vcont', vcont)
92    CALL WriteField_u('p', p)
93    CALL WriteField_u('masse', masse)
94    CALL WriteField_u('massebx', massebx)
95    CALL WriteField_v('masseby', masseby)
96    CALL WriteField_v('massebxy', massebxy)
97    CALL WriteField_u('pbaru', pbaru)
98    CALL WriteField_v('pbarv', pbarv)
99    CALL WriteField_u('dteta', dteta)
100    CALL WriteField_u('convm', convm)
101  END IF
[1632]102
[5101]103  !$OMP BARRIER
104  !$OMP MASTER
105  ijb = ij_begin
106  ije = ij_end
[5113]107  ! compute pressure variation due to mass convergence
[5101]108  DO ij = ijb, ije
109    dp(ij) = convm(ij, 1) / airesurg(ij)
110  ENDDO
111  !$OMP END MASTER
112  !$OMP BARRIER
[1632]113
[5113]114  ! compute vertical velocity w()
[5101]115  CALL vitvert_loc (convm, w)
[5113]116  ! compute potential vorticity vorpot()
[5101]117  CALL tourpot_loc (vcov, ucov, massebxy, vorpot)
[5113]118  ! compute rotation induced du() and dv()
[5101]119  CALL dudv1_loc   (vorpot, pbaru, pbarv, du, dv)
[1632]120
[5101]121  IF (CPPKEY_DEBUGIO) THEN
122    CALL WriteField_u('w', w)
123    CALL WriteField_v('vorpot', vorpot)
124    CALL WriteField_u('du', du)
125    CALL WriteField_v('dv', dv)
126  END IF
[1632]127
[5113]128  ! compute kinetic energy ecin()
[5101]129  CALL enercin_loc (vcov, ucov, vcont, ucont, ecin)
[5113]130  ! compute Bernouilli function bern()
[5101]131  CALL bernoui_loc (ip1jmp1, llm, phi, ecin, bern)
[5113]132  ! compute and add du() and dv() contributions from Bernouilli and pressure
[5101]133  CALL dudv2_loc   (teta, pkf, bern, du, dv)
[1632]134
[5101]135  IF (CPPKEY_DEBUGIO) THEN
136    CALL WriteField_u('ecin', ecin)
137    CALL WriteField_u('bern', bern)
138    CALL WriteField_u('du', du)
139    CALL WriteField_v('dv', dv)
140    CALL WriteField_u('pkf', pkf)
141  END IF
[1632]142
[5101]143  ijb = ij_begin - iip1
144  ije = ij_end + iip1
[1632]145
[5117]146  IF (pole_nord) ijb = ij_begin
147  IF (pole_sud) ije = ij_end
[1632]148
[5101]149  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
150  DO l = 1, llm
151    DO ij = ijb, ije
152      ang(ij, l) = ucov(ij, l) + constang(ij)
153    ENDDO
154  ENDDO
155  !$OMP END DO
[1632]156
[5113]157  ! compute vertical advection contributions to du(), dv() and dteta()
[5101]158  CALL advect_new_loc(ang, vcov, teta, w, massebx, masseby, du, dv, dteta)
159
160  !  WARNING probleme de peridocite de dv sur les PC/linux. Pb d'arrondi
161  ! probablement. Observe sur le code compile avec pgf90 3.0-1
162  ijb = ij_begin
163  ije = ij_end
[5117]164  IF (pole_sud) ije = ij_end - iip1
[5101]165
166  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
167  DO l = 1, llm
168    DO ij = ijb, ije, iip1
169      IF(dv(ij, l)/=dv(ij + iim, l))  THEN
170        ! PRINT *,'!!!ATTENTION!!! probleme de periodicite sur vcov',
171        !    ,   ' dans caldyn'
172        ! PRINT *,' l,  ij = ', l, ij, ij+iim,dv(ij+iim,l),dv(ij,l)
173        dv(ij + iim, l) = dv(ij, l)
174      endif
175    enddo
176  enddo
177  !$OMP END DO NOWAIT
178
179  ! Ehouarn: NB: output of control variables not implemented...
180
[5105]181
[5101]182END SUBROUTINE caldyn_loc
Note: See TracBrowser for help on using the repository browser.