source: CONFIG/UNIFORM/v7/ICOLMDZOR_v7/SOURCES/DYNAMICO/src/vertical/disvert_strato.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: 7.1 KB
Line 
1MODULE disvert_strato_mod
2  USE icosa
3  USE mpipara
4  USE getin_mod
5  USE earth_const
6  IMPLICIT NONE
7  PRIVATE
8
9  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: ap(:)
10!$OMP THREADPRIVATE(ap)
11  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: bp(:)
12!$OMP THREADPRIVATE(bp)
13  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: presnivs(:)
14!$OMP THREADPRIVATE(presnivs)
15  REAL(rstd), SAVE, ALLOCATABLE,TARGET :: presinter(:)
16!$OMP THREADPRIVATE(presinter)
17
18
19  PUBLIC :: ap,bp,presnivs, presinter, init_disvert, init_disvert_strato_custom
20
21CONTAINS
22 
23  SUBROUTINE init_disvert
24    REAL(rstd) :: dsigmin, snorm, x, dsig(llm),  sig(llm+1)
25    INTEGER :: l
26
27    ALLOCATE(ap(llm+1))
28    ALLOCATE(bp(llm+1))
29    ALLOCATE(presnivs(llm))
30    ALLOCATE(presinter(llm+1))
31   
32    dsigmin=1.0  ! Should be 0.3 for CMIP5
33    CALL getin('disvert_dsigmin', dsigmin) 
34   
35    snorm  = 0.
36    DO l = 1, llm
37      x = Pi*(l-0.5)/(llm+1)
38      dsig(l) = (dsigmin + 7.0 * SIN(x)**2) * (0.5* (1.-tanh( (x-Pi/2)/(Pi/2) ) ))**2
39      snorm = snorm + dsig(l)
40    ENDDO   
41   
42    DO l = 1, llm
43      dsig(l) = dsig(l)/snorm
44    ENDDO
45
46    sig(llm+1) = 0.
47    DO l = llm, 1, -1
48      sig(l) = sig(l+1) + dsig(l)
49    ENDDO
50
51    bp(llm+1) =   0.
52    DO l = 1, llm
53      bp(l) = EXP( 1. -1./( sig(l)*sig(l)) )
54      ap(l) = pa * ( sig(l) - bp(l) )
55    ENDDO
56    bp(1)=1.
57    ap(1)=0.
58    ap(llm+1) = pa * ( sig(llm+1) - bp(llm+1) )
59    DO l = 1, llm
60      presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
61    ENDDO
62    DO l=1, llm+1
63      presinter(l)= ap(l)+bp(l)*preff
64    ENDDO
65
66   
67    ! tell the world about it
68    IF (is_mpi_root) THEN
69!$OMP MASTER
70      WRITE(*,*) "ap()=",ap
71      WRITE(*,*) "bp()=",bp
72      WRITE(*,*) "Approximative mid-layer pressure, assuming a surface pressure preff=",preff," Pa"
73      WRITE(*,*) "and approximative mid-layer height, assuming an atmospheric scale height of ",scale_height/1000," (km)"
74      DO l=1,llm
75        WRITE(*,*) 'PRESNIVS(',l,')=',presnivs(l),'  Z ~ ',log(preff/presnivs(l))*scale_height/1000,       &
76                   ' DZ ~ ',scale_height/1000*log((ap(l)+bp(l)*preff)/ max(ap(l+1)+bp(l+1)*preff,1.e-10))
77      ENDDO
78!$OMP END MASTER
79    ENDIF
80 
81  END SUBROUTINE init_disvert
82 
83  SUBROUTINE init_disvert_strato_custom
84    REAL(rstd) :: vert_scale,vert_dzmin,vert_dzlow,vert_z0low,vert_dzmid,vert_z0mid,vert_h_mid,vert_dzhig,vert_z0hig,vert_h_hig
85    REAL(rstd) :: z, sig(llm+1), sig0(llm+1), zz(llm+1)
86    INTEGER :: l
87    ALLOCATE(ap(llm+1))
88    ALLOCATE(bp(llm+1))
89    ALLOCATE(presnivs(llm))
90    ALLOCATE(presinter(llm+1))
91
92!===================================================================
93! David Cugnet, François Lott, Lionel Guez, Ehouoarn Millour, Fredho
94! 2014/05
95! custumize strato distribution
96! Al the parameter are given in km assuming a given scalehigh
97    vert_scale=7.     ! scale hight
98    vert_dzmin=0.02   ! width of first layer
99    vert_dzlow=1.     ! dz in the low atmosphere
100    vert_z0low=8.     ! height at which resolution recches dzlow
101    vert_dzmid=3.     ! dz in the mid atmsophere
102    vert_z0mid=70.    ! height at which resolution recches dzmid
103    vert_h_mid=20.    ! width of the transition
104    vert_dzhig=11.    ! dz in the high atmsophere
105    vert_z0hig=80.    ! height at which resolution recches dz
106    vert_h_hig=20.    ! width of the transition
107!===================================================================
108
109    call getin('vert_scale',vert_scale)
110    call getin('vert_dzmin',vert_dzmin)
111    call getin('vert_dzlow',vert_dzlow)
112    call getin('vert_z0low',vert_z0low)
113    CALL getin('vert_dzmid',vert_dzmid)
114    CALL getin('vert_z0mid',vert_z0mid)
115    call getin('vert_h_mid',vert_h_mid)
116    call getin('vert_dzhig',vert_dzhig)
117    call getin('vert_z0hig',vert_z0hig)
118    call getin('vert_h_hig',vert_h_hig)
119 
120!!!!!    scaleheight=vert_scale ! for consistency with further computations
121    ! Build geometrical distribution
122    zz(1)=0.
123    DO l=1,llm
124       z=zz(l)
125       zz(l+1)=zz(l)+vert_dzmin+vert_dzlow*TANH(z/vert_z0low)+                &
126                  (vert_dzmid-vert_dzlow)* &
127                       (TANH((z-vert_z0mid)/vert_h_mid)-TANH((-vert_z0mid)/vert_h_mid)) &
128                 +(vert_dzhig-vert_dzmid-vert_dzlow)*                                  &
129                       (TANH((z-vert_z0hig)/vert_h_hig)-TANH((-vert_z0hig)/vert_h_hig))
130    ENDDO
131
132
133!===================================================================
134! Comment added Fredho 2014/05/18, Saint-Louis, Senegal
135! From approximate z to ap, bp, so that p=ap+bp*p0 and p/p0=exp(-z/H)
136! sig0 is p/p0
137! sig is an intermediate distribution introduce to estimate bp
138! 1.   sig0=exp(-z/H)
139! 2.   inversion of sig0=(1-pa/p0)*sig+(1-pa/p0)*exp(1-1/sig**2)
140! 3.   bp=exp(1-1/sig**2)
141! 4.   ap deduced from  the combination of 2 and 3 so that sig0=ap/p0+bp
142!===================================================================
143
144    sig0(llm+1)=0.
145    DO l = 1, llm
146       sig0(l)=EXP(-zz(l)/vert_scale)
147!!!     sig(l)=racinesig(sig0(l))
148    ENDDO
149    sig=racinesig(sig0)
150   
151    bp(llm+1) =   0.
152    DO l = 2, llm
153       bp(l) = EXP( 1. -1./( sig(l)*sig(l)) )
154       ap(l) = pa * ( sig(l) - bp(l) )
155    ENDDO
156    bp(1)=1.
157    !!    ap=pa*(sig-bp)
158    ap(1)=0.
159    ap(llm+1) = pa * ( sig(llm+1) - bp(llm+1) )
160    DO l = 1, llm
161       presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
162    ENDDO
163    DO l=1, llm+1
164      presinter(l)= ( ap(l)+bp(l)*preff)
165    ENDDO
166   
167    ! tell the world about it
168    IF (is_mpi_root) THEN
169       !$OMP MASTER
170       WRITE(*,*) "ap()=",ap
171       WRITE(*,*) "bp()=",bp
172       WRITE(*,*) "Approximative mid-layer pressure, assuming a surface pressure preff=",preff," Pa"
173       WRITE(*,*) "and approximative mid-layer height, assuming an atmospheric scale height of ",scale_height/1000," (km)"
174       DO l=1,llm
175          WRITE(*,*) 'PRESNIVS(',l,')=',presnivs(l),'  Z ~ ',log(preff/presnivs(l))*scale_height/1000,       &
176               ' DZ ~ ',scale_height/1000*log((ap(l)+bp(l)*preff)/ max(ap(l+1)+bp(l+1)*preff,1.e-10))
177       ENDDO
178       !$OMP END MASTER
179    ENDIF
180   
181  CONTAINS
182   
183    FUNCTION racinesig(sig) RESULT(sg)
184      !
185      !-------------------------------------------------------------------------------
186      ! Fredho 2014/05/18
187      ! Purpose: Search for s solving (Pa/Preff)*sg+(1-Pa/Preff)*EXP(1-1./sg**2)=s
188      ! Notes:   Uses Newton Raphson search
189      !-------------------------------------------------------------------------------
190      ! Arguments:
191      REAL, INTENT(IN)  :: sig(:)
192      REAL(rstd)        :: sg(SIZE(sig))
193      !-------------------------------------------------------------------------------
194      ! Local variables:
195      INTEGER      :: it, ns, maxit
196      REAL(rstd)   :: c1, c2, f1
197      !-------------------------------------------------------------------------------
198      ns=SIZE(sig); maxit=100
199      c1=Pa/Preff; c2=1.-c1
200      DO l=2,ns-1
201         sg(l)=sig(l)
202         DO it=1,maxit
203            f1=exp(1-1./sg(l)**2)*(1.-c1)
204            sg(l)=sg(l)-(c1*sg(l)+f1-sig(l))/(c1+2*f1*sg(l)**(-3))
205         ENDDO
206         !   print*,'SSSSIG ',sig(l),sg(l),c1*sg(l)+exp(1-1./sg(l)**2)*(1.-c1)
207      ENDDO
208      sg(1)=1.; sg(ns)=0.
209     
210    END FUNCTION racinesig
211   
212  END SUBROUTINE init_disvert_strato_custom
213 
214END MODULE disvert_strato_mod
Note: See TracBrowser for help on using the repository browser.