/[lmdze]/trunk/libf/dyn3d/Dissipation/dissip.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/Dissipation/dissip.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 65 - (show annotations)
Thu Sep 20 09:57:03 2012 UTC (11 years, 8 months ago) by guez
File size: 2670 byte(s)
Removed unused procedure "divgrad".

In procedure "dissip", save memory by using intermediary arrays "gdx"
and "gdy" several times instead of additional array "grx" and "gry".

In procedure "inidissip", write "dtdiss * teta*" instead of "teta*".

In "comvert", change name of s_sampling from "LMD5" to "tropo" and
from "strato2" to "strato".

1 module dissip_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE dissip(vcov, ucov, teta, p, dv, du, dh)
8
9 ! From dyn3d/dissip.F, version 1.1.1.1 2004/05/19 12:53:05
10 ! Author: P. Le Van
11 ! Objet : calcul de la dissipation horizontale
12 ! Avec opérateurs star : gradiv2, divgrad2, nxgraro2
13
14 USE comdissnew, ONLY: nitergdiv, nitergrot, niterh
15 USE dimens_m, ONLY: iim, jjm, llm
16 use divgrad2_m, only: divgrad2
17 use gradiv2_m, only: gradiv2
18 USE inidissip_m, ONLY: dtdiss, tetah, tetaudiv, tetaurot, cdivu, crot, cdivh
19 use nr_util, only: assert
20 use nxgraro2_m, only: nxgraro2
21
22 REAL, intent(in):: vcov(:, :, :) ! (iim + 1, jjm, llm)
23 REAL, intent(in):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm)
24 REAL, intent(in):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
25 REAL, INTENT(IN):: p(:, :, :) ! (iim + 1, jjm + 1, llm + 1)
26 REAL, intent(out):: dv(:, :, :) ! (iim + 1, jjm, llm)
27 REAL, intent(out):: du(:, :, :) ! (iim + 1, jjm + 1, llm)
28 REAL, intent(out):: dh(:, :, :) ! (iim + 1, jjm + 1, llm)
29
30 ! Local:
31 REAL gdx(iim + 1, jjm + 1, llm), gdy(iim + 1, jjm, llm)
32 REAL tedt(llm)
33 REAL deltapres(iim + 1, jjm + 1, llm)
34 INTEGER l
35
36 !-----------------------------------------------------------------------
37
38 call assert((/size(vcov, 1), size(ucov, 1), size(teta, 1), size(p, 1), &
39 size(dv, 1), size(du, 1), size(dh, 1)/) == iim + 1, "dissip iim")
40 call assert((/size(vcov, 2), size(ucov, 2) - 1, size(teta, 2) - 1, &
41 size(p, 2) - 1, size(dv, 2), size(du, 2) - 1, size(dh, 2) - 1/) &
42 == jjm, "dissip jjm")
43 call assert((/size(vcov, 3), size(ucov, 3), size(teta, 3), size(p, 3) - 1, &
44 size(dv, 3), size(du, 3), size(dh, 3)/) == llm, "dissip llm")
45
46 du(:, 1, :) = 0.
47 du(:, jjm + 1, :) = 0.
48
49 ! Calcul de la partie grad(div) :
50 CALL gradiv2(ucov, vcov, nitergdiv, gdx, gdy, cdivu)
51 tedt = tetaudiv * dtdiss
52 forall (l = 1: llm)
53 du(:, 2: jjm, l) = - tedt(l) * gdx(:, 2: jjm, l)
54 dv(:, :, l) = - tedt(l) * gdy(:, :, l)
55 END forall
56
57 ! Calcul de la partie n X grad(rot) :
58 CALL nxgraro2(ucov, vcov, nitergrot, gdx, gdy, crot)
59 tedt = tetaurot * dtdiss
60 forall (l = 1: llm)
61 du(:, 2: jjm, l) = du(:, 2: jjm, l) - tedt(l) * gdx(:, 2: jjm, l)
62 dv(:, :, l) = dv(:, :, l) - tedt(l) * gdy(:, :, l)
63 END forall
64
65 ! calcul de la partie div(grad) :
66 forall (l = 1: llm) &
67 deltapres(:, :, l) = max(0., p(:, :, l) - p(:, :, l + 1))
68 CALL divgrad2(llm, teta, deltapres, niterh, gdx, cdivh)
69 forall (l = 1: llm) dh(:, :, l) = - tetah(l) * dtdiss * gdx(:, :, l)
70
71 END SUBROUTINE dissip
72
73 end module dissip_m

  ViewVC Help
Powered by ViewVC 1.1.21