source: codes/icosagcm/trunk/src/vertical/disvert_strato.f90 @ 548

Last change on this file since 548 was 548, checked in by dubos, 7 years ago

trunk : reorganize source tree

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