3 SUBROUTINE disvert(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig,scaleheight)
8 use ioipsl
, only: getin
13 include
"dimensions.h"
30 REAL sig(llm+1), dsig(llm)
31 real zk, zkm1, dzk1, dzk2, k0, k1
37 character(len=*),
parameter :: modname=
"disvert"
39 character(len=6):: vert_sampling
44 print *,
"Call sequence information: disvert"
49 vert_sampling = merge(
"strato",
"tropo ",
ok_strato)
50 call
getin(
'vert_sampling', vert_sampling)
51 print *,
'vert_sampling = ' // vert_sampling
53 select case (vert_sampling)
56 OPEN(99, file=
'sigma.def', status=
'old', form=
'formatted')
64 write(
lunout, *)trim(modname),
':scaleheight, alpha, k0, k1, beta', &
78 write(
lunout, *)
l, sig(
l+1), zk, zk-zkm1, dzk1, dzk2
84 bp(: llm) = exp(1. - 1. / sig(: llm)**2)
90 x = 2*asin(1.) * (
l - 0.5) / (llm + 1)
91 dsig(
l) = 1.0 + 7.0 * sin(
x)**2
93 dsig = dsig / sum(dsig)
96 sig(
l) = sig(
l+1) + dsig(
l)
100 bp(2: llm) = exp(1. - 1. / sig(2: llm)**2)
104 ap(2: llm + 1) =
pa * (sig(2: llm + 1) -
bp(2: llm + 1))
108 else if (llm==50)
then
111 write(
lunout,*) trim(modname),
' ATTENTION discretisation z a ajuster'
114 WRITE(
lunout,*) trim(modname),
'Discretisation verticale DSIGMIN=',dsigmin
117 x = 2*asin(1.) * (
l - 0.5) / (llm + 1)
118 dsig(
l) =(dsigmin + 7. * sin(
x)**2) &
119 *(0.5*(1.-tanh(1.*(
x-asin(1.))/asin(1.))))**2
121 dsig = dsig / sum(dsig)
124 sig(
l) = sig(
l+1) + dsig(
l)
128 bp(2: llm) = exp(1. - 1. / sig(2: llm)**2)
132 ap(2: llm + 1) =
pa * (sig(2: llm + 1) -
bp(2: llm + 1))
138 open(
unit, file=
"hybrid.txt", status=
"old", action=
"read", &
145 call
assert(
ap(1) == 0.,
ap(llm + 1) == 0.,
bp(1) == 1., &
146 bp(llm + 1) == 0.,
"disvert: bad ap or bp values")
148 call
abort_gcm(
"disvert",
'Wrong value for "vert_sampling"', 1)
159 write(
lunout, *) trim(modname),
': BP '
161 write(
lunout, *) trim(modname),
': AP '
164 write(
lunout, *)
'Niveaux de pressions approximatifs aux centres des'
165 write(
lunout, *)
'couches calcules pour une pression de surface =',
preff
166 write(
lunout, *)
'et altitudes equivalentes pour une hauteur d echelle de '
177 write(
lunout, *) trim(modname),
': PRESNIVS '