source: codes/icosagcm/trunk/src/disvert_std.f90 @ 156

Last change on this file since 156 was 131, checked in by ymipsl, 11 years ago

Some operations must be only done by the mpi master task.

YM

File size: 1.9 KB
Line 
1MODULE disvert_std_mod
2  USE icosa
3  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: ap(:)
4  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: bp(:)
5  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: presnivs(:)
6
7CONTAINS
8
9  SUBROUTINE init_disvert
10  USE icosa
11  IMPLICIT NONE
12 
13    ALLOCATE(ap(llm+1))
14    ALLOCATE(bp(llm+1))
15    ALLOCATE(presnivs(llm))
16
17    CALL disvert(ap,bp,presnivs)   
18
19  END SUBROUTINE init_disvert 
20
21
22  SUBROUTINE disvert(ap,bp,presnivs)
23  USE icosa
24  USE mpipara
25  IMPLICIT NONE
26  REAL(rstd),INTENT(OUT) :: ap(:)
27  REAL(rstd),INTENT(OUT) :: bp(:)
28  REAL(rstd),INTENT(OUT) :: presnivs(:)
29 
30  REAL(rstd) :: dsig(llm)
31  REAL(rstd) :: sig(llm+1)
32  REAL(rstd) :: snorm
33  INTEGER :: l
34 
35    snorm  = 0.
36    DO l = 1, llm
37      dsig(l) = 1.0 + 7.0 * SIN( Pi*(l-0.5)/(llm+1) )**2
38      snorm = snorm + dsig(l)
39    ENDDO   
40   
41    DO l = 1, llm
42      dsig(l) = dsig(l)/snorm
43    ENDDO
44
45    sig(llm+1) = 0.
46    DO l = llm, 1, -1
47      sig(l) = sig(l+1) + dsig(l)
48    ENDDO
49
50    bp(llm+1) =   0.
51    DO l = 1, llm
52      bp(l) = EXP( 1. -1./( sig(l)*sig(l)) )
53      ap(l) = pa * ( sig(l) - bp(l) )
54    ENDDO
55    bp(1)=1.
56    ap(1)=0.
57    ap(llm+1) = pa * ( sig(llm+1) - bp(llm+1) )
58   
59    IF (is_mpi_root) PRINT*,'ap',ap
60    IF (is_mpi_root) PRINT*,'bp',bp
61   
62    IF (is_mpi_root) PRINT*, 'Niveaux de pressions approximatifs aux centres des'
63    IF (is_mpi_root) PRINT*, 'couches calcules pour une pression de surface =', preff
64    IF (is_mpi_root) PRINT*, 'et altitudes equivalentes pour une hauteur d echelle de'
65    IF (is_mpi_root) PRINT*, '8km'
66   
67    DO l = 1, llm
68      presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
69 
70      IF (is_mpi_root) PRINT*, 'PRESNIVS(',l,')=',presnivs(l),'  Z ~ ',log(preff/presnivs(l))*8.,       &
71                               ' DZ ~ ',8.*log((ap(l)+bp(l)*preff)/ max(ap(l+1)+bp(l+1)*preff,1.e-10))
72    ENDDO
73 
74  END SUBROUTINE disvert
75 
76END MODULE disvert_std_mod
Note: See TracBrowser for help on using the repository browser.