10 use,
intrinsic :: iso_c_binding
11 use kinds,
only: kind_real
12 use missing_values_mod
19 subroutine get_integral_limits(airpressure, botpressure, toppressure, modelpressure, nlevs, nlocs, nsig)
21 integer,
intent(in) :: nlevs, nlocs, nsig
22 real(kind_real) ,
dimension(nlocs),
intent(in) :: airpressure
23 real(kind_real),
dimension(nlocs),
intent(inout) :: botpressure,toppressure
24 real(kind_real),
dimension(nsig+1,nlocs),
intent(in) :: modelpressure
26 integer :: nprofs, iobs, iprof, kk, k1, k2
29 toppressure(iobs) = modelpressure(nsig+1,iobs)
30 botpressure(iobs) = modelpressure(1,iobs)
46 toppressure(iobs) = airpressure(k2)
47 botpressure(iobs) = airpressure(k1)
49 toppressure(iobs) = modelpressure(nsig+1, iobs)
50 botpressure(iobs) = airpressure(k1)
51 if(botpressure(iobs) < modelpressure(nsig+1, iobs))
then
52 botpressure(iobs) = modelpressure(nsig+1, iobs)
54 else if( kk == nlevs)
then
55 toppressure(iobs) = modelpressure(nsig+1, iobs)
56 botpressure(iobs) = modelpressure(1, iobs)
64 real function pindex(nx, press, obspressure)
72 real(kind_real) :: ozp, obspressure, psi
73 real(kind_real),
dimension(nx) :: press
75 psi = 1.0_kind_real/press(1)
76 if(obspressure*psi < 1.)
then
81 if( ozp >= press(1))
then
86 if(ozp >= press(k))
then
95 (ozp-press(ix))/(press(ix+1)-press(ix))
100 subroutine apply_layer_integral(coefficient, modelozone, modelpressure, botpressure, toppressure, nsig, layer_oz)
102 integer,
intent(in) :: nsig
103 real,
intent(in) :: coefficient
104 real(kind_real),
intent(in) :: botpressure, toppressure
105 real(kind_real),
dimension(:),
intent(in) :: modelpressure, modelozone
106 real(kind_real),
intent(out) :: layer_oz
108 integer :: kk, iz1, iz2
109 real(kind_real) :: pob,delz,g,delp4,dz1
110 real(kind_real) :: topozp, botozp
111 topozp =
pindex(nsig+1, modelpressure, toppressure)
112 botozp =
pindex(nsig+1, modelpressure, botpressure)
115 if (iz1>nsig) iz1=nsig
117 layer_oz = 0._kind_real
121 if(kk == iz1) delz = dz1 - iz1
122 if (kk == iz2) delz = delz - pob + iz2
123 delp4 = modelpressure(kk)-modelpressure(kk+1)
124 layer_oz = layer_oz + modelozone(kk)*coefficient*(delz*delp4)
129 subroutine undo_layer_integral(coefficient, modelozone, modelpressure, botpressure, toppressure, nsig, layer_oz)
131 integer,
intent(in) :: nsig
132 real,
intent(in) :: coefficient
133 real(kind_real),
intent(in) :: botpressure, toppressure
134 real(kind_real),
dimension(:),
intent(in) :: modelpressure
135 real(kind_real),
dimension(:),
intent(out):: modelozone
136 real(kind_real),
intent(in) :: layer_oz
138 integer :: kk, iz1, iz2
139 real(kind_real) :: pob,delz,g,delp4,dz1
140 real(kind_real) :: topozp, botozp
141 topozp =
pindex(nsig+1, modelpressure, toppressure)
142 botozp =
pindex(nsig+1, modelpressure, botpressure)
145 if (iz1>nsig) iz1=nsig
148 modelozone = 0.0_kind_real
151 if(kk == iz1) delz = dz1 - iz1
152 if (kk == iz2) delz = delz - pob + iz2
153 delp4 = modelpressure(kk)-modelpressure(kk+1)
154 modelozone(kk) = modelozone(kk) + layer_oz*coefficient*(delz*delp4)
161 real(kind_real),
intent(in) ::modelozoned(:)
162 real(kind_real),
intent(in):: botpressure, toppressure
163 real(kind_real),
intent(in),
dimension(nsig+1) :: modelpressure
164 real(kind_real),
intent(out) :: layer_ozd
165 integer,
intent(in) :: nsig
166 real,
intent(in) :: coefficient
167 call apply_layer_integral(coefficient, modelozoned, modelpressure, botpressure, toppressure, nsig, layer_ozd)
171 real(kind_real),
intent(out) ::modelozoneb(:)
172 real(kind_real),
intent(in):: botpressure, toppressure
173 real(kind_real),
intent(in),
dimension(nsig+1) :: modelpressure
174 real(kind_real),
intent(in) :: layer_ozb
175 integer,
intent(in) :: nsig
176 real,
intent(in) :: coefficient
177 call undo_layer_integral(coefficient, modelozoneb, modelpressure, botpressure, toppressure, nsig, layer_ozb)
Fortran module to perform linear interpolation.
subroutine undo_layer_integral(coefficient, modelozone, modelpressure, botpressure, toppressure, nsig, layer_oz)
subroutine vert_interp_lay_apply_tl(modelozoned, layer_ozd, coefficient, modelpressure, botpressure, toppressure, nsig)
real function pindex(nx, press, obspressure)
subroutine apply_layer_integral(coefficient, modelozone, modelpressure, botpressure, toppressure, nsig, layer_oz)
subroutine get_integral_limits(airpressure, botpressure, toppressure, modelpressure, nlevs, nlocs, nsig)
subroutine vert_interp_lay_apply_ad(modelozoneb, layer_ozb, coefficient, modelpressure, botpressure, toppressure, nsig)