source: CONFIG/UNIFORM/v7/ICOLMDZOR_v7/SOURCES/DYNAMICO/src/vertical/disvert_std.f90 @ 5878

Last change on this file since 5878 was 5878, checked in by aclsce, 3 years ago

Merged LMDZORv6.2.2 with ICOLMDZOR_v7 configuration te be able to launch LMDZOR experiment from ICOLMDZOR configuration.
Use of NPv6.2 physiq version in ICOLMDZOR experiments.

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