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