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))
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)
subroutine pf_to_mr(npoints, nlev, ncol, rain_ls, snow_ls, grpl_ls, rain_cv, snow_cv, prec_frac, p, t, mx_rain_ls, mx_snow_ls, mx_grpl_ls, mx_rain_cv, mx_snow_cv)
!IM Implemente en modes sequentiel et parallele CALL rlon_glo CALL bcast(rlon_glo)!$OMP MASTER if(is_mpi_root) then!zstophy
subroutine cosp_subgrid_cpsection(ix, iy, x, y)
subroutine construct_cosp_sghydro(Npoints, Ncolumns, Nlevels, Nhydro, y)
subroutine construct_cosp_vgrid(gbx, Nlvgrid, use_vgrid, cloudsat, x)
subroutine free_cosp_isccp(x)
subroutine cosp_simulator(gbx, sgx, sghydro, cfg, vgrid, sgradar, sglidar, isccp, misr, stradar, stlidar)
subroutine free_cosp_radarstats(x)
subroutine free_cosp_lidarstats(x)
subroutine free_cosp_sghydro(y)
subroutine cosp_sglidar_cpsection(ix, iy, x, y)
subroutine prec_scops(npoints, nlev, ncol, ls_p_rate, cv_p_rate, frac_out, prec_frac)
subroutine free_cosp_sglidar(x)
subroutine construct_cosp_lidarstats(cfg, Npoints, Ncolumns, Nlevels, Nhydro, Nrefl, x)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine cosp_isccp_cpsection(ix, iy, x, y)
!IM Implemente en modes sequentiel et parallele CALL gather(rlat, rlat_glo) CALL bcast(rlat_glo) CALL gather(rlon
subroutine scops(npoints, nlev, ncol, seed, cc, conv, overlap, frac_out, ncolprint)
subroutine construct_cosp_gridbox(time, radar_freq, surface_radar, use_mie_tables, use_gas_abs, do_ray, melt_lay, k2,Npoints, Nlevels, Ncolumns, Nhydro, Nprmts_max_hydro, Naero, Nprmts_max_aero, Npoints_it,lidar_ice_type, isccp_top_height, isccp_top_height_direction, isccp_overlap, isccp_emsfc_lw,use_precipitation_fluxes, use_reff,
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine cosp_sgradar_cpsection(ix, iy, x, y)
subroutine free_cosp_sgradar(x)
subroutine construct_cosp_subgrid(Npoints, Ncolumns, Nlevels, y)
subroutine free_cosp_gridbox(y, dglobal)
subroutine cosp_iter(overlap, seed, cfg, vgrid, gbx, sgx, sgradar, sglidar, isccp, misr, stradar, stlidar)
subroutine construct_cosp_sgradar(cfg, Npoints, Ncolumns, Nlevels, Nhydro, x)
subroutine construct_cosp_sglidar(cfg, Npoints, Ncolumns, Nlevels, Nhydro, Nrefl, x)
subroutine free_cosp_vgrid(x)
subroutine construct_cosp_isccp(cfg, Npoints, Ncolumns, Nlevels, x)
subroutine free_cosp_subgrid(y)
subroutine cosp(overlap, Ncolumns, cfg, vgrid, gbx, sgx, sgradar, sglidar, isccp, misr, stradar, stlidar)
subroutine free_cosp_misr(x)
subroutine cosp_misr_cpsection(ix, iy, x, y)
subroutine construct_cosp_misr(cfg, Npoints, x)
subroutine cosp_gridbox_cpsection(ix, iy, x, y)
subroutine cosp_radarstats_cpsection(ix, iy, x, y)
subroutine cosp_lidarstats_cpsection(ix, iy, x, y)
subroutine construct_cosp_radarstats(cfg, Npoints, Ncolumns, Nlevels, Nhydro, x)