source: LMDZ6/branches/Amaury_dev/libf/dyn3d/groupe.F90 @ 5209

Last change on this file since 5209 was 5159, checked in by abarral, 3 months ago

Put dimensions.h and paramet.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
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.9 KB
Line 
1! $Header$
2
3MODULE lmdz_groupe
4  USE lmdz_paramet
5  IMPLICIT NONE; PRIVATE
6  PUBLIC groupe
7
8CONTAINS
9
10  SUBROUTINE groupe(pbaru, pbarv, pbarum, pbarvm, wm)
11
12    USE comconst_mod, ONLY: ngroup
13    USE lmdz_ssum_scopy, ONLY: scopy
14    USE lmdz_comgeom2
15
16  USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
17    IMPLICIT NONE
18
19    !   sous-programme servant a fitlrer les champs de flux de masse aux
20    !   poles en "regroupant" les mailles 2 par 2 puis 4 par 4 etc. au fur
21    !   et a mesure qu'on se rapproche du pole.
22
23    !   en entree: pbaru et pbarv
24
25    !   en sortie:  pbarum,pbarvm et wm.
26
27    !   remarque, le wm est recalcule a partir des pbaru pbarv et on n'a donc
28    !   pas besoin de w en entree.
29
30
31
32
33    ! integer ngroup
34    ! parameter (ngroup=3)
35
36    REAL :: pbaru(iip1, jjp1, llm), pbarv(iip1, jjm, llm)
37
38    REAL :: pbarum(iip1, jjp1, llm), pbarvm(iip1, jjm, llm)
39    REAL :: wm(iip1, jjp1, llm)
40
41    REAL :: zconvm(iip1, jjp1, llm), zconvmm(iip1, jjp1, llm)
42    ! (gfortran) Warning: Array ‘zconvm’ at (1) is larger than limit set by ‘-fmax-stack-var-size=’, moved from stack to static storage.
43    ! This makes the procedure unsafe when called recursively, or concurrently from multiple threads.
44
45    REAL :: uu
46
47    INTEGER :: i, j, l
48
49    LOGICAL :: firstcall, groupe_ok
50    save firstcall, groupe_ok
51
52    data firstcall/.TRUE./
53    data groupe_ok/.TRUE./
54
55    IF (iim==1) THEN
56      groupe_ok = .FALSE.
57    ENDIF
58
59    IF (firstcall) THEN
60      IF (groupe_ok) THEN
61        IF(mod(iim, 2**ngroup)/=0) &
62                CALL abort_gcm('groupe', 'probleme du nombre de point', 1)
63      endif
64      firstcall = .FALSE.
65    ENDIF
66
67
68    !   Champs 1D
69
70    CALL convflu(pbaru, pbarv, llm, zconvm)
71
72    CALL scopy(ijp1llm, zconvm, 1, zconvmm, 1)
73    CALL scopy(ijmllm, pbarv, 1, pbarvm, 1)
74
75    IF (groupe_ok) THEN
76      CALL groupeun(jjp1, llm, zconvmm)
77      CALL groupeun(jjm, llm, pbarvm)
78
79      !   Champs 3D
80      DO l = 1, llm
81        DO j = 2, jjm
82          uu = pbaru(iim, j, l)
83          DO i = 1, iim
84            uu = uu + pbarvm(i, j, l) - pbarvm(i, j - 1, l) - zconvmm(i, j, l)
85            pbarum(i, j, l) = uu
86            ! zconvm(i,j,l ) =  xflu(i-1,j,l)-xflu(i,j,l)+
87            !    *                      yflu(i,j,l)-yflu(i,j-1,l)
88          enddo
89          pbarum(iip1, j, l) = pbarum(1, j, l)
90        enddo
91      enddo
92
93    else
94      pbarum(:, :, :) = pbaru(:, :, :)
95      pbarvm(:, :, :) = pbarv(:, :, :)
96    ENDIF
97
98    !    integration de la convergence de masse de haut  en bas ......
99    DO l = 1, llm
100      DO j = 1, jjp1
101        DO i = 1, iip1
102          zconvmm(i, j, l) = zconvmm(i, j, l)
103        enddo
104      enddo
105    enddo
106    DO  l = llm - 1, 1, -1
107      DO j = 1, jjp1
108        DO i = 1, iip1
109          zconvmm(i, j, l) = zconvmm(i, j, l) + zconvmm(i, j, l + 1)
110        enddo
111      enddo
112    enddo
113
114    CALL vitvert(zconvmm, wm)
115
116  END SUBROUTINE  groupe
117
118END MODULE lmdz_groupe
Note: See TracBrowser for help on using the repository browser.