| 1 | module exner_milieu_m |
|---|
| 2 | |
|---|
| 3 | IMPLICIT NONE |
|---|
| 4 | |
|---|
| 5 | CONTAINS |
|---|
| 6 | |
|---|
| 7 | SUBROUTINE exner_milieu(ngrid, ps, p, pks, pk, pkf) |
|---|
| 8 | |
|---|
| 9 | ! Auteurs : F. Forget , Y. Wanherdrick |
|---|
| 10 | ! P.Le Van , Fr. Hourdin . |
|---|
| 11 | ! .......... |
|---|
| 12 | |
|---|
| 13 | ! .... ngrid, ps,p sont des argum.d'entree au sous-prog ... |
|---|
| 14 | ! .... pks,pk,pkf sont des argum.de sortie au sous-prog ... |
|---|
| 15 | |
|---|
| 16 | ! ************************************************************************ |
|---|
| 17 | ! Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des |
|---|
| 18 | ! couches . Pk(l) sera calcule aux milieux des couches l ,entre les |
|---|
| 19 | ! pressions p(l) et p(l+1) ,definis aux interfaces des llm couches . |
|---|
| 20 | ! ************************************************************************ |
|---|
| 21 | ! .. N.B : Au sommet de l'atmosphere, p(llm+1) = 0. , et ps et pks sont |
|---|
| 22 | ! la pression et la fonction d'Exner au sol . |
|---|
| 23 | |
|---|
| 24 | ! WARNING : CECI est une version speciale de exner_hyb originale |
|---|
| 25 | ! Utilise dans la version martienne pour pouvoir |
|---|
| 26 | ! tourner avec des coordonnees verticales complexe |
|---|
| 27 | ! => Il ne verifie PAS la condition la proportionalite en |
|---|
| 28 | ! energie totale/ interne / potentielle (F.Forget 2001) |
|---|
| 29 | ! ( voir note de Fr.Hourdin ) , |
|---|
| 30 | |
|---|
| 31 | USE comconst_mod, ONLY: jmp1, cpp, kappa, r |
|---|
| 32 | USE comvert_mod, ONLY: preff |
|---|
| 33 | USE lmdz_filtreg, ONLY: filtreg |
|---|
| 34 | USE lmdz_comgeom |
|---|
| 35 | |
|---|
| 36 | USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm |
|---|
| 37 | USE lmdz_paramet |
|---|
| 38 | IMPLICIT NONE |
|---|
| 39 | |
|---|
| 40 | |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | INTEGER ngrid |
|---|
| 44 | REAL p(ngrid, llmp1), pk(ngrid, llm) |
|---|
| 45 | REAL, optional :: pkf(ngrid, llm) |
|---|
| 46 | REAL ps(ngrid), pks(ngrid) |
|---|
| 47 | |
|---|
| 48 | ! .... variables locales ... |
|---|
| 49 | |
|---|
| 50 | INTEGER l, ij |
|---|
| 51 | REAL dum1 |
|---|
| 52 | |
|---|
| 53 | logical, save :: firstcall = .TRUE. |
|---|
| 54 | CHARACTER(LEN = *), parameter :: modname = "exner_milieu" |
|---|
| 55 | |
|---|
| 56 | ! Sanity check |
|---|
| 57 | IF (firstcall) THEN |
|---|
| 58 | ! sanity checks for Shallow Water case (1 vertical layer) |
|---|
| 59 | IF (llm==1) THEN |
|---|
| 60 | IF (kappa/=1) THEN |
|---|
| 61 | CALL abort_gcm(modname, & |
|---|
| 62 | "kappa!=1 , but running in Shallow Water mode!!", 42) |
|---|
| 63 | endif |
|---|
| 64 | IF (cpp/=r) THEN |
|---|
| 65 | CALL abort_gcm(modname, & |
|---|
| 66 | "cpp!=r , but running in Shallow Water mode!!", 42) |
|---|
| 67 | endif |
|---|
| 68 | endif ! of if (llm.EQ.1) |
|---|
| 69 | |
|---|
| 70 | firstcall = .FALSE. |
|---|
| 71 | endif ! of if (firstcall) |
|---|
| 72 | |
|---|
| 73 | ! Specific behaviour for Shallow Water (1 vertical layer) case: |
|---|
| 74 | IF (llm==1) THEN |
|---|
| 75 | ! Compute pks(:),pk(:),pkf(:) |
|---|
| 76 | |
|---|
| 77 | DO ij = 1, ngrid |
|---|
| 78 | pks(ij) = (cpp / preff) * ps(ij) |
|---|
| 79 | pk(ij, 1) = .5 * pks(ij) |
|---|
| 80 | ENDDO |
|---|
| 81 | |
|---|
| 82 | IF (present(pkf)) THEN |
|---|
| 83 | pkf = pk |
|---|
| 84 | CALL filtreg (pkf, jmp1, llm, 2, 1, .TRUE., 1) |
|---|
| 85 | end if |
|---|
| 86 | |
|---|
| 87 | ! our work is done, exit routine |
|---|
| 88 | RETURN |
|---|
| 89 | endif ! of if (llm.EQ.1) |
|---|
| 90 | |
|---|
| 91 | ! General case: |
|---|
| 92 | |
|---|
| 93 | ! ------------- |
|---|
| 94 | ! Calcul de pks |
|---|
| 95 | ! ------------- |
|---|
| 96 | |
|---|
| 97 | DO ij = 1, ngrid |
|---|
| 98 | pks(ij) = cpp * (ps(ij) / preff) ** kappa |
|---|
| 99 | ENDDO |
|---|
| 100 | |
|---|
| 101 | ! .... Calcul de pk pour la couche l |
|---|
| 102 | ! -------------------------------------------- |
|---|
| 103 | |
|---|
| 104 | dum1 = cpp * (2 * preff)**(-kappa) |
|---|
| 105 | DO l = 1, llm - 1 |
|---|
| 106 | DO ij = 1, ngrid |
|---|
| 107 | pk(ij, l) = dum1 * (p(ij, l) + p(ij, l + 1))**kappa |
|---|
| 108 | ENDDO |
|---|
| 109 | ENDDO |
|---|
| 110 | |
|---|
| 111 | ! .... Calcul de pk pour la couche l = llm .. |
|---|
| 112 | ! (on met la meme distance (en log pression) entre Pk(llm) |
|---|
| 113 | ! et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2) |
|---|
| 114 | |
|---|
| 115 | DO ij = 1, ngrid |
|---|
| 116 | pk(ij, llm) = pk(ij, llm - 1)**2 / pk(ij, llm - 2) |
|---|
| 117 | ENDDO |
|---|
| 118 | |
|---|
| 119 | IF (present(pkf)) THEN |
|---|
| 120 | ! calcul de pkf |
|---|
| 121 | pkf = pk |
|---|
| 122 | CALL filtreg (pkf, jmp1, llm, 2, 1, .TRUE., 1) |
|---|
| 123 | end if |
|---|
| 124 | |
|---|
| 125 | END SUBROUTINE exner_milieu |
|---|
| 126 | |
|---|
| 127 | END MODULE exner_milieu_m |
|---|