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

Last change on this file since 545 was 377, checked in by dubos, 8 years ago

New : positive advection option for theta

File size: 2.1 KB
Line 
1MODULE disvert_std_mod
2  USE icosa
3  IMPLICIT NONE
4  PRIVATE
5
6  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: ap(:)
7!$OMP THREADPRIVATE(ap)
8  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: bp(:)
9!$OMP THREADPRIVATE(bp)
10  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: presnivs(:)
11!$OMP THREADPRIVATE(presnivs)
12
13  PUBLIC :: init_disvert, ap, bp, presnivs
14
15CONTAINS
16
17  SUBROUTINE init_disvert
18  USE icosa
19  IMPLICIT NONE
20 
21    ALLOCATE(ap(llm+1))
22    ALLOCATE(bp(llm+1))
23    ALLOCATE(presnivs(llm))
24
25    CALL disvert(ap,bp,presnivs)   
26
27  END SUBROUTINE init_disvert 
28
29
30  SUBROUTINE disvert(ap,bp,presnivs)
31  USE icosa
32  USE mpipara
33  USE earth_const
34  IMPLICIT NONE
35  REAL(rstd),INTENT(OUT) :: ap(:)
36  REAL(rstd),INTENT(OUT) :: bp(:)
37  REAL(rstd),INTENT(OUT) :: presnivs(:)
38 
39  REAL(rstd) :: dsig(llm)
40  REAL(rstd) :: sig(llm+1)
41  REAL(rstd) :: snorm
42  INTEGER :: l
43 
44    snorm  = 0.
45    DO l = 1, llm
46      dsig(l) = 1.0 + 7.0 * SIN( Pi*(l-0.5)/(llm+1) )**2
47      snorm = snorm + dsig(l)
48    ENDDO   
49   
50    DO l = 1, llm
51      dsig(l) = dsig(l)/snorm
52    ENDDO
53
54    sig(llm+1) = 0.
55    DO l = llm, 1, -1
56      sig(l) = sig(l+1) + dsig(l)
57    ENDDO
58
59    bp(llm+1) =   0.
60    DO l = 1, llm
61      bp(l) = EXP( 1. -1./( sig(l)*sig(l)) )
62      ap(l) = pa * ( sig(l) - bp(l) )
63    ENDDO
64    bp(1)=1.
65    ap(1)=0.
66    ap(llm+1) = pa * ( sig(llm+1) - bp(llm+1) )
67    DO l = 1, llm
68      presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
69    ENDDO
70   
71    ! tell the world about it
72    IF (is_mpi_root) THEN
73!$OMP MASTER
74      WRITE(*,*) "ap()=",ap
75      WRITE(*,*) "bp()=",bp
76      WRITE(*,*) "Approximative mid-layer pressure, assuming a surface pressure preff=",preff," Pa"
77      WRITE(*,*) "and approximative mid-layer height, assuming an atmospheric scale height of ",scale_height/1000," (km)"
78      DO l=1,llm
79        WRITE(*,*) 'PRESNIVS(',l,')=',presnivs(l),'  Z ~ ',log(preff/presnivs(l))*scale_height/1000,       &
80                   ' DZ ~ ',scale_height/1000*log((ap(l)+bp(l)*preff)/ max(ap(l+1)+bp(l+1)*preff,1.e-10))
81      ENDDO
82!$OMP END MASTER
83    ENDIF
84 
85  END SUBROUTINE disvert
86 
87END MODULE disvert_std_mod
Note: See TracBrowser for help on using the repository browser.