39 SUBROUTINE cosp(overlap,Ncolumns,cfg,vgrid,gbx,sgx,sgradar,sglidar,isccp,misr,stradar,stlidar)
42 integer,
intent(in) :: overlap
43 integer,
intent(in) :: ncolumns
60 integer :: i_first,i_last
62 integer,
dimension(2) :: ix,iy
66 integer,
dimension(:),
save,
allocatable :: &
72 real,
dimension(:),
allocatable :: rseed
84 logical,
save :: first_cosp=.true.
94 call cosp_check_input(
'longitude',gbx%longitude,min_val=-180.0,max_val=180.0)
95 call cosp_check_input(
'latitude',gbx%latitude,min_val=-90.0,max_val=90.0)
96 call cosp_check_input(
'dlev',gbx%dlev,min_val=0.0)
97 call cosp_check_input(
'p',gbx%p,min_val=0.0)
98 call cosp_check_input(
'ph',gbx%ph,min_val=0.0)
99 call cosp_check_input(
'T',gbx%T,min_val=0.0)
100 call cosp_check_input(
'q',gbx%q,min_val=0.0)
101 call cosp_check_input(
'sh',gbx%sh,min_val=0.0)
102 call cosp_check_input(
'dtau_s',gbx%dtau_s,min_val=0.0)
103 call cosp_check_input(
'dtau_c',gbx%dtau_c,min_val=0.0)
104 call cosp_check_input(
'dem_s',gbx%dem_s,min_val=0.0,max_val=1.0)
105 call cosp_check_input(
'dem_c',gbx%dem_c,min_val=0.0,max_val=1.0)
107 call cosp_check_input(
'land',gbx%land,min_val=0.0,max_val=1.0)
108 call cosp_check_input(
'psfc',gbx%psfc,min_val=0.0)
109 call cosp_check_input(
'sunlit',gbx%sunlit,min_val=0.0,max_val=1.0)
110 call cosp_check_input(
'skt',gbx%skt,min_val=0.0)
112 call cosp_check_input(
'tca',gbx%tca,min_val=0.0,max_val=1.0)
113 call cosp_check_input(
'cca',gbx%cca,min_val=0.0,max_val=1.0)
115 call cosp_check_input(
'rain_ls',gbx%rain_ls,min_val=0.0)
116 call cosp_check_input(
'rain_cv',gbx%rain_cv,min_val=0.0)
117 call cosp_check_input(
'snow_ls',gbx%snow_ls,min_val=0.0)
118 call cosp_check_input(
'snow_cv',gbx%snow_cv,min_val=0.0)
119 call cosp_check_input(
'grpl_ls',gbx%grpl_ls,min_val=0.0)
121 call cosp_check_input(
'mr_hydro',gbx%mr_hydro,min_val=0.0)
123 call cosp_check_input(
'Reff',gbx%Reff,min_val=0.0)
125 if (any(gbx%Reff > 1.e-8))
then
139 if ((.not. gbx%use_reff) .and. (reff_zero))
then
140 gbx%Reff = default_lidar_reff
141 print *,
'---------- COSP WARNING ------------'
143 print *,
'Using default Reff in lidar simulations'
145 print *,
'----------------------------------'
149 call cosp_check_input(
'conc_aero',gbx%conc_aero,min_val=0.0)
151 if (ncolumns == 1)
then
152 if (gbx%use_precipitation_fluxes)
then
153 print *,
'---------- COSP ERROR ------------'
155 print *,
'Use of precipitation fluxes not supported in CRM mode (Ncolumns=1)'
157 print *,
'----------------------------------'
160 if ((maxval(gbx%dtau_c) > 0.0).or.(maxval(gbx%dem_c) > 0.0))
then
161 print *,
'---------- COSP ERROR ------------'
163 print *,
' dtau_c > 0.0 or dem_c > 0.0. In CRM mode (Ncolumns=1), '
164 print *,
' the optical depth (emmisivity) of all clouds must be '
165 print *,
' passed through dtau_s (dem_s)'
167 print *,
'----------------------------------'
174 allocate(
seed(npoints))
176 allocate(rseed(klon_glo))
177 CALL
gather(gbx%psfc,rseed)
185 if (npoints .gt. 1)
THEN
186 seed=int((gbx%psfc-minp)/(maxp-minp)*100000) + 1
188 seed=int(gbx%psfc-minp)
195 if (gbx%Npoints_it >= gbx%Npoints)
then
196 call
cosp_iter(overlap,
seed,cfg,vgrid,gbx,sgx,sgradar,sglidar,isccp,misr,stradar,stlidar)
198 niter = gbx%Npoints/gbx%Npoints_it
199 if (niter*gbx%Npoints_it < gbx%Npoints) niter = niter + 1
201 i_first = (
i-1)*gbx%Npoints_it + 1
202 i_last = i_first + gbx%Npoints_it - 1
203 i_last = min(i_last,gbx%Npoints)
204 ni = i_last - i_first + 1
207 call
construct_cosp_gridbox(gbx%time,gbx%radar_freq,gbx%surface_radar,gbx%use_mie_tables,gbx%use_gas_abs, &
208 gbx%do_ray,gbx%melt_lay,gbx%k2,ni,nlevels,ncolumns,n_hydro,gbx%Nprmts_max_hydro, &
209 gbx%Naero,gbx%Nprmts_max_aero,ni,gbx%lidar_ice_type,gbx%isccp_top_height, &
210 gbx%isccp_top_height_direction,gbx%isccp_overlap,gbx%isccp_emsfc_lw, &
211 gbx%use_precipitation_fluxes,gbx%use_reff, &
212 gbx%plat,gbx%sat,gbx%inst,gbx%nchan,gbx%ZenAng, &
213 gbx%Ichan(1:gbx%nchan),gbx%surfem(1:gbx%nchan), &
214 gbx%co2,gbx%ch4,gbx%n2o,gbx%co, &
224 elseif (
i == niter)
then
235 call
construct_cosp_gridbox(gbx%time,gbx%radar_freq,gbx%surface_radar,gbx%use_mie_tables,gbx%use_gas_abs, &
236 gbx%do_ray,gbx%melt_lay,gbx%k2,ni,nlevels,ncolumns,n_hydro,gbx%Nprmts_max_hydro, &
237 gbx%Naero,gbx%Nprmts_max_aero,ni,gbx%lidar_ice_type,gbx%isccp_top_height, &
238 gbx%isccp_top_height_direction,gbx%isccp_overlap,gbx%isccp_emsfc_lw, &
239 gbx%use_precipitation_fluxes,gbx%use_reff, &
240 gbx%plat,gbx%sat,gbx%inst,gbx%nchan,gbx%ZenAng, &
241 gbx%Ichan(1:gbx%nchan),gbx%surfem(1:gbx%nchan), &
242 gbx%co2,gbx%ch4,gbx%n2o,gbx%co, &
245 gbx_it%dist_prmts_hydro = gbx%dist_prmts_hydro
246 gbx_it%dist_type_aero = gbx_it%dist_type_aero
257 ix=(/i_first,i_last/)
268 print *,
'---------ix: ',ix
269 call
cosp_iter(overlap,
seed(ix(1):ix(2)),cfg,vgrid_it,gbx_it,sgx_it,sgradar_it, &
270 sglidar_it,isccp_it,misr_it,stradar_it,stlidar_it)
275 iy=(/i_first,i_last/)
302 SUBROUTINE cosp_iter(overlap,seed,cfg,vgrid,gbx,sgx,sgradar,sglidar,isccp,misr,stradar,stlidar)
305 integer,
intent(in) :: overlap
306 integer,
dimension(:),
intent(in) ::
seed
326 real,
dimension(:,:),
pointer :: column_frac_out
327 integer,
parameter :: scops_debug=0
329 real,
dimension(:, :),
allocatable :: cca_scops,ls_p_rate,cv_p_rate, &
332 real,
dimension(:,:),
allocatable :: frac_ls,prec_ls,frac_cv,prec_cv
334 real,
dimension(:,:),
allocatable :: rho
339 npoints = gbx%Npoints
340 ncolumns = gbx%Ncolumns
341 nlevels = gbx%Nlevels
346 if (ncolumns > 1)
then
349 allocate(frac_ls(npoints,nlevels),frac_cv(npoints,nlevels),prec_ls(npoints,nlevels),prec_cv(npoints,nlevels))
350 allocate(tca_scops(npoints,nlevels),cca_scops(npoints,nlevels), &
351 ls_p_rate(npoints,nlevels),cv_p_rate(npoints,nlevels))
358 tca_scops = gbx%tca(:,nlevels:1:-1)
359 cca_scops = gbx%cca(:,nlevels:1:-1)
363 call
scops(npoints,nlevels,ncolumns,
seed,tca_scops,cca_scops,overlap,sgx%frac_out,scops_debug)
366 if(gbx%use_precipitation_fluxes)
then
367 ls_p_rate(:,nlevels:1:-1)=gbx%rain_ls(:,1:nlevels)+gbx%snow_ls(:,1:nlevels)+gbx%grpl_ls(:,1:nlevels)
368 cv_p_rate(:,nlevels:1:-1)=gbx%rain_cv(:,1:nlevels)+gbx%snow_cv(:,1:nlevels)
370 ls_p_rate(:,nlevels:1:-1)=gbx%mr_hydro(:,1:nlevels,i_lsrain)+ &
371 gbx%mr_hydro(:,1:nlevels,i_lssnow)+ &
372 gbx%mr_hydro(:,1:nlevels,i_lsgrpl)
373 cv_p_rate(:,nlevels:1:-1)=gbx%mr_hydro(:,1:nlevels,i_cvrain)+ &
374 gbx%mr_hydro(:,1:nlevels,i_cvsnow)
377 call
prec_scops(npoints,nlevels,ncolumns,ls_p_rate,cv_p_rate,sgx%frac_out,sgx%prec_frac)
383 if (sgx%frac_out (
j,
i,nlevels+1-
k) == i_lsc) frac_ls(
j,
k)=frac_ls(
j,
k)+1.
384 if (sgx%frac_out (
j,
i,nlevels+1-
k) == i_cvc) frac_cv(
j,
k)=frac_cv(
j,
k)+1.
385 if (sgx%prec_frac(
j,
i,nlevels+1-
k) .eq. 1) prec_ls(
j,
k)=prec_ls(
j,
k)+1.
386 if (sgx%prec_frac(
j,
i,nlevels+1-
k) .eq. 2) prec_cv(
j,
k)=prec_cv(
j,
k)+1.
387 if (sgx%prec_frac(
j,
i,nlevels+1-
k) .eq. 3)
then
388 prec_cv(
j,
k)=prec_cv(
j,
k)+1.
389 prec_ls(
j,
k)=prec_ls(
j,
k)+1.
392 frac_ls(
j,
k)=frac_ls(
j,
k)/ncolumns
393 frac_cv(
j,
k)=frac_cv(
j,
k)/ncolumns
394 prec_ls(
j,
k)=prec_ls(
j,
k)/ncolumns
395 prec_cv(
j,
k)=prec_cv(
j,
k)/ncolumns
400 if (npoints*ncolumns*nlevels < 10000)
then
401 sgx%frac_out(1:npoints,:,1:nlevels) = sgx%frac_out(1:npoints,:,nlevels:1:-1)
402 sgx%prec_frac(1:npoints,:,1:nlevels) = sgx%prec_frac(1:npoints,:,nlevels:1:-1)
406 sgx%frac_out(
j,:,1:nlevels) = sgx%frac_out(
j,:,nlevels:1:-1)
407 sgx%prec_frac(
j,:,1:nlevels) = sgx%prec_frac(
j,:,nlevels:1:-1)
412 deallocate(tca_scops,cca_scops,ls_p_rate,cv_p_rate)
418 column_frac_out => sgx%frac_out(:,
k,:)
419 where (column_frac_out == i_lsc)
420 sghydro%mr_hydro(:,
k,:,i_lscliq) = gbx%mr_hydro(:,:,i_lscliq)
421 sghydro%mr_hydro(:,
k,:,i_lscice) = gbx%mr_hydro(:,:,i_lscice)
423 sghydro%Reff(:,
k,:,i_lscliq) = gbx%Reff(:,:,i_lscliq)
424 sghydro%Reff(:,
k,:,i_lscice) = gbx%Reff(:,:,i_lscice)
425 sghydro%Reff(:,
k,:,i_lsrain) = gbx%Reff(:,:,i_lsrain)
426 sghydro%Reff(:,
k,:,i_lssnow) = gbx%Reff(:,:,i_lssnow)
427 sghydro%Reff(:,
k,:,i_lsgrpl) = gbx%Reff(:,:,i_lsgrpl)
428 elsewhere (column_frac_out == i_cvc)
429 sghydro%mr_hydro(:,
k,:,i_cvcliq) = gbx%mr_hydro(:,:,i_cvcliq)
430 sghydro%mr_hydro(:,
k,:,i_cvcice) = gbx%mr_hydro(:,:,i_cvcice)
432 sghydro%Reff(:,
k,:,i_cvcliq) = gbx%Reff(:,:,i_cvcliq)
433 sghydro%Reff(:,
k,:,i_cvcice) = gbx%Reff(:,:,i_cvcice)
434 sghydro%Reff(:,
k,:,i_cvrain) = gbx%Reff(:,:,i_cvrain)
435 sghydro%Reff(:,
k,:,i_cvsnow) = gbx%Reff(:,:,i_cvsnow)
438 if (.not. gbx%use_precipitation_fluxes)
then
439 where (column_frac_out == i_lsc)
440 sghydro%mr_hydro(:,
k,:,i_lsrain) = gbx%mr_hydro(:,:,i_lsrain)
441 sghydro%mr_hydro(:,
k,:,i_lssnow) = gbx%mr_hydro(:,:,i_lssnow)
442 sghydro%mr_hydro(:,
k,:,i_lsgrpl) = gbx%mr_hydro(:,:,i_lsgrpl)
443 elsewhere (column_frac_out == i_cvc)
444 sghydro%mr_hydro(:,
k,:,i_cvrain) = gbx%mr_hydro(:,:,i_cvrain)
445 sghydro%mr_hydro(:,
k,:,i_cvsnow) = gbx%mr_hydro(:,:,i_cvsnow)
453 if (frac_ls(
j,
k) .ne. 0.)
then
454 sghydro%mr_hydro(
j,:,
k,i_lscliq) = sghydro%mr_hydro(
j,:,
k,i_lscliq)/frac_ls(
j,
k)
455 sghydro%mr_hydro(
j,:,
k,i_lscice) = sghydro%mr_hydro(
j,:,
k,i_lscice)/frac_ls(
j,
k)
457 if (frac_cv(
j,
k) .ne. 0.)
then
458 sghydro%mr_hydro(
j,:,
k,i_cvcliq) = sghydro%mr_hydro(
j,:,
k,i_cvcliq)/frac_cv(
j,
k)
459 sghydro%mr_hydro(
j,:,
k,i_cvcice) = sghydro%mr_hydro(
j,:,
k,i_cvcice)/frac_cv(
j,
k)
462 if (gbx%use_precipitation_fluxes)
then
463 if (prec_ls(
j,
k) .ne. 0.)
then
464 gbx%rain_ls(
j,
k) = gbx%rain_ls(
j,
k)/prec_ls(
j,
k)
465 gbx%snow_ls(
j,
k) = gbx%snow_ls(
j,
k)/prec_ls(
j,
k)
466 gbx%grpl_ls(
j,
k) = gbx%grpl_ls(
j,
k)/prec_ls(
j,
k)
468 if (prec_cv(
j,
k) .ne. 0.)
then
469 gbx%rain_cv(
j,
k) = gbx%rain_cv(
j,
k)/prec_cv(
j,
k)
470 gbx%snow_cv(
j,
k) = gbx%snow_cv(
j,
k)/prec_cv(
j,
k)
473 if (prec_ls(
j,
k) .ne. 0.)
then
474 sghydro%mr_hydro(
j,:,
k,i_lsrain) = sghydro%mr_hydro(
j,:,
k,i_lsrain)/prec_ls(
j,
k)
475 sghydro%mr_hydro(
j,:,
k,i_lssnow) = sghydro%mr_hydro(
j,:,
k,i_lssnow)/prec_ls(
j,
k)
476 sghydro%mr_hydro(
j,:,
k,i_lsgrpl) = sghydro%mr_hydro(
j,:,
k,i_lsgrpl)/prec_ls(
j,
k)
478 if (prec_cv(
j,
k) .ne. 0.)
then
479 sghydro%mr_hydro(
j,:,
k,i_cvrain) = sghydro%mr_hydro(
j,:,
k,i_cvrain)/prec_cv(
j,
k)
480 sghydro%mr_hydro(
j,:,
k,i_cvsnow) = sghydro%mr_hydro(
j,:,
k,i_cvsnow)/prec_cv(
j,
k)
485 deallocate(frac_ls,prec_ls,frac_cv,prec_cv)
487 if (gbx%use_precipitation_fluxes)
then
489 call
pf_to_mr(npoints,nlevels,ncolumns,gbx%rain_ls,gbx%snow_ls,gbx%grpl_ls, &
490 gbx%rain_cv,gbx%snow_cv,sgx%prec_frac,gbx%p,gbx%T, &
491 sghydro%mr_hydro(:,:,:,i_lsrain),sghydro%mr_hydro(:,:,:,i_lssnow),sghydro%mr_hydro(:,:,:,i_lsgrpl), &
492 sghydro%mr_hydro(:,:,:,i_cvrain),sghydro%mr_hydro(:,:,:,i_cvsnow))
496 sghydro%mr_hydro(:,1,:,:) = gbx%mr_hydro
497 sghydro%Reff(:,1,:,:) = gbx%Reff
499 where ((gbx%dtau_s > 0.0))
500 sgx%frac_out(:,1,:) = 1
506 call
cosp_simulator(gbx,sgx,sghydro,cfg,vgrid,sgradar,sglidar,isccp,misr,stradar,stlidar)