3 #ifndef ORCHIDEE_NOOPENMP
35 plev, u1_lay, v1_lay, gustiness, temp_air, spechum, epot_air, ccanopy, &
36 tq_cdrag, petacoef, peqacoef, petbcoef, peqbcoef, &
37 precip_rain, precip_snow, lwdown, swnet, swdown, &
39 evap, fluxsens, fluxlat, &
40 tsol_rad, tsurf_new, alb1_new, alb2_new, &
41 emis_new, z0_new, qsurf)
109 INTEGER,
INTENT(IN) :: itime
110 REAL,
INTENT(IN) :: dtime
111 REAL,
INTENT(IN) :: date0
112 INTEGER,
INTENT(IN) :: knon
113 INTEGER,
DIMENSION(klon),
INTENT(IN) :: knindex
114 LOGICAL,
INTENT(IN) :: debut, lafin
115 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf
116 REAL,
DIMENSION(klon),
INTENT(IN) :: rlon, rlat
117 REAL,
DIMENSION(klon),
INTENT(IN) :: plev
118 REAL,
DIMENSION(klon),
INTENT(IN) :: u1_lay, v1_lay, gustiness
119 REAL,
DIMENSION(klon),
INTENT(IN) :: temp_air, spechum
120 REAL,
DIMENSION(klon),
INTENT(IN) :: epot_air, ccanopy
121 REAL,
DIMENSION(klon),
INTENT(IN) :: tq_cdrag
122 REAL,
DIMENSION(klon),
INTENT(IN) :: petAcoef, peqAcoef
123 REAL,
DIMENSION(klon),
INTENT(IN) :: petBcoef, peqBcoef
124 REAL,
DIMENSION(klon),
INTENT(IN) :: precip_rain, precip_snow
125 REAL,
DIMENSION(klon),
INTENT(IN) :: lwdown, swnet, swdown, ps
126 REAL,
DIMENSION(klon),
INTENT(IN) :: q2m, t2m
130 REAL,
DIMENSION(klon),
INTENT(OUT) :: evap, fluxsens, fluxlat, qsurf
131 REAL,
DIMENSION(klon),
INTENT(OUT) :: tsol_rad, tsurf_new
132 REAL,
DIMENSION(klon),
INTENT(OUT) :: alb1_new, alb2_new
133 REAL,
DIMENSION(klon),
INTENT(OUT) :: emis_new, z0_new
137 INTEGER :: ij, jj, igrid, ireal, index
139 REAL,
DIMENSION(klon) :: swdown_vrai
140 CHARACTER (len = 20) :: modname =
'surf_land_orchidee'
141 CHARACTER (len = 80) :: abort_message
142 LOGICAL,
SAVE :: check = .
false.
150 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: albedo_keep, zlev
153 REAL,
ALLOCATABLE,
DIMENSION(:,:),
SAVE :: lalo
156 INTEGER,
ALLOCATABLE,
DIMENSION(:,:),
SAVE :: neighbours
159 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: contfrac
162 REAL,
ALLOCATABLE,
DIMENSION (:,:),
SAVE :: resolution
165 REAL,
ALLOCATABLE,
DIMENSION (:,:),
SAVE :: lon_scat, lat_scat
168 LOGICAL,
SAVE :: lrestart_read = .
true.
170 LOGICAL,
SAVE :: lrestart_write = .
false.
173 REAL,
DIMENSION(knon,2) :: albedo_out
176 REAL,
DIMENSION(klon) :: petA_orc, peqA_orc
177 REAL,
DIMENSION(klon) :: petB_orc, peqB_orc
179 INTEGER,
DIMENSION(:),
SAVE,
ALLOCATABLE :: ig, jg
181 INTEGER :: indi, indj
182 INTEGER,
SAVE,
ALLOCATABLE,
DIMENSION(:) :: ktindex
186 REAL,
DIMENSION(klon) :: cdrag
187 INTEGER,
SAVE :: offset
190 REAL,
DIMENSION(klon_glo) :: rlon_g,rlat_g
191 INTEGER,
SAVE :: orch_comm
194 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: coastalflow
196 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: riverflow
199 INTEGER :: orch_omp_rank
200 INTEGER :: orch_omp_size
205 IF (check)
WRITE(
lunout,*)
'Entree ', modname
212 abort_message=
'Pb de coherence: ok_veget = .true. mais CPP_VEGET = .false.'
217 ALLOCATE(ktindex(knon))
218 IF ( .NOT.
ALLOCATED(albedo_keep))
THEN
221 ALLOCATE(albedo_keep(knon))
231 DO igrid = 2,
klon - 1
243 IF ((.NOT.
ALLOCATED(lalo)))
THEN
244 ALLOCATE(lalo(knon,2), stat = error)
246 abort_message=
'Pb allocation lalo'
250 IF ((.NOT.
ALLOCATED(lon_scat)))
THEN
253 abort_message=
'Pb allocation lon_scat'
257 IF ((.NOT.
ALLOCATED(lat_scat)))
THEN
260 abort_message=
'Pb allocation lat_scat'
267 index = knindex(igrid)
268 lalo(igrid,2) = rlon(index)
269 lalo(igrid,1) = rlat(index)
277 IF (is_mpi_root)
THEN
282 lon_scat(ij,jj) = rlon_g(index)
283 lat_scat(ij,jj) = rlat_g(index)
286 lon_scat(:,1) = lon_scat(:,2)
287 lat_scat(:,1) = rlat_g(1)
288 lon_scat(:,
nbp_lat) = lon_scat(:,2)
289 lat_scat(:,
nbp_lat) = rlat_g(klon_glo)
297 IF ( (.NOT.
ALLOCATED(neighbours)))
THEN
298 ALLOCATE(neighbours(knon,8), stat = error)
300 abort_message=
'Pb allocation neighbours'
305 IF (( .NOT.
ALLOCATED(contfrac)))
THEN
306 ALLOCATE(contfrac(knon), stat = error)
308 abort_message=
'Pb allocation contfrac'
314 ireal = knindex(igrid)
315 contfrac(igrid) = pctsrf(ireal,
is_ter)
323 IF ( (.NOT.
ALLOCATED(resolution)))
THEN
324 ALLOCATE(resolution(knon,2), stat = error)
326 abort_message=
'Pb allocation resolution'
332 resolution(igrid,1) =
dx(ij)
333 resolution(igrid,2) =
dy(ij)
336 ALLOCATE(coastalflow(
klon), stat = error)
338 abort_message=
'Pb allocation coastalflow'
342 ALLOCATE(riverflow(
klon), stat = error)
344 abort_message=
'Pb allocation riverflow'
351 abort_message=
'carbon_cycle_cpl not yet possible with this interface of ORCHIDEE'
361 IF (lafin) lrestart_write = .
true.
362 IF (check)
WRITE(
lunout,*)
'lafin ',lafin,lrestart_write
364 peta_orc(1:knon) = petbcoef(1:knon) * dtime
365 petb_orc(1:knon) = petacoef(1:knon)
366 peqa_orc(1:knon) = peqbcoef(1:knon) * dtime
367 peqb_orc(1:knon) = peqacoef(1:knon)
370 cdrag(1:knon) = tq_cdrag(1:knon)
374 zlev(1:knon) = plev(1:knon)*rd*temp_air(1:knon)/((ps(1:knon)*100.0)*
rg)
391 CALL init_intersurf(
nbp_lon,
nbp_lat,knon,ktindex,offset,orch_omp_size,orch_omp_rank,orch_comm)
400 lrestart_read, lrestart_write, lalo, &
401 contfrac, neighbours, resolution, date0, &
402 zlev, u1_lay, v1_lay, spechum, temp_air, epot_air, ccanopy, &
403 cdrag, peta_orc, peqa_orc, petb_orc, peqb_orc, &
404 precip_rain, precip_snow, lwdown, swnet, swdown, ps, &
405 evap, fluxsens, fluxlat, coastalflow, riverflow, &
406 tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, &
407 lon_scat, lat_scat, q2m, t2m)
413 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
419 swdown_vrai(1:knon) = swdown(1:knon)
424 lrestart_read, lrestart_write, lalo, &
425 contfrac, neighbours, resolution, date0, &
426 zlev, u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), &
427 cdrag(1:knon), peta_orc(1:knon), peqa_orc(1:knon), petb_orc(1:knon), peqb_orc(1:knon), &
428 precip_rain(1:knon), precip_snow(1:knon), lwdown(1:knon), swnet(1:knon), swdown_vrai(1:knon), ps(1:knon), &
429 evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
430 tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
431 lon_scat, lat_scat, q2m, t2m)
437 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
443 riverflow, coastalflow)
446 alb1_new(1:knon) = albedo_out(1:knon,1)
447 alb2_new(1:knon) = albedo_out(1:knon,2)
450 fluxsens(1:knon) = -1. * fluxsens(1:knon)
451 fluxlat(1:knon) = -1. * fluxlat(1:knon)
455 IF (debut) lrestart_read = .
false.
468 INTEGER,
INTENT(IN) :: knon
469 INTEGER,
INTENT(IN) :: knindex(
klon)
470 INTEGER,
INTENT(OUT) :: offset
471 INTEGER,
INTENT(OUT) :: ktindex(
klon)
474 INTEGER :: offset_para(0:omp_size*mpi_size-1)
478 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+
nbp_lon-1
482 IF (is_mpi_root .AND. is_omp_root)
THEN
484 DO task=0,mpi_size*omp_size-1
486 offset_para(task)= lastpoint-mod(lastpoint,
nbp_lon)
492 CALL bcast(offset_para)
494 offset=offset_para(omp_size*mpi_rank+omp_rank)
496 ktindex(1:knon)=ktindex(1:knon)-offset
511 INTEGER,
INTENT(OUT) :: orch_comm
512 INTEGER,
INTENT(OUT) :: orch_omp_size
513 INTEGER,
INTENT(OUT) :: orch_omp_rank
521 IF (is_omp_root)
THEN
530 CALL mpi_comm_split(comm_lmdz_phy,color,mpi_rank,orch_comm,ierr)
534 CALL bcast_omp(orch_comm)
540 orch_omp_size=orch_omp_size+1
541 IF (i==omp_rank) orch_omp_rank=orch_omp_size-1
563 INTEGER,
INTENT(IN) :: knon
564 INTEGER,
DIMENSION(klon),
INTENT(IN) :: knindex
565 REAL,
DIMENSION(klon),
INTENT(IN) :: pctsrf
569 INTEGER,
DIMENSION(knon,8),
INTENT(OUT) :: neighbours
573 INTEGER :: i, igrid, jj, ij, iglob
574 INTEGER :: ierr, ireal, index
575 INTEGER,
DIMENSION(8,3) :: off_ini
576 INTEGER,
DIMENSION(8) :: offset
577 INTEGER,
DIMENSION(nbp_lon,nbp_lat) :: correspond
578 INTEGER,
DIMENSION(knon_glo) :: ktindex_glo
579 INTEGER,
DIMENSION(knon_glo,8) :: neighbours_glo
580 REAL,
DIMENSION(klon_glo) :: pctsrf_glo
581 INTEGER :: ktindex(
klon)
586 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+
nbp_lon-1
589 CALL gather(pctsrf,pctsrf_glo)
591 IF (is_mpi_root .AND. is_omp_root)
THEN
592 neighbours_glo(:,:)=-1
596 off_ini(1,1) = -
nbp_lon ; off_ini(2,1) = -
nbp_lon + 1 ; off_ini(3,1) = 1
598 off_ini(7,1) =
nbp_lon -1 ; off_ini(8,1) = - 1
600 off_ini(1,2) = -
nbp_lon ; off_ini(2,2) = -
nbp_lon + 1 ; off_ini(3,2) = 1
602 off_ini(7,2) = -1 ; off_ini(8,2) = -
nbp_lon - 1
605 off_ini(4,3) = 1 ; off_ini(5,3) =
nbp_lon ; off_ini(6,3) =
nbp_lon - 1
606 off_ini(7,3) = -1 ; off_ini(8,3) = -
nbp_lon - 1
612 index = ktindex_glo(igrid)
613 jj = int((index - 1)/
nbp_lon) + 1
614 ij = index - (jj - 1) *
nbp_lon
615 correspond(ij,jj) = igrid
621 neighbours_glo(igrid, i) = igrid
624 print*,
'sonia : knon_glo,ij,jj',
knon_glo, ij,jj
627 iglob = ktindex_glo(igrid)
629 IF (mod(iglob,
nbp_lon) == 1)
THEN
630 offset = off_ini(:,1)
631 ELSE IF(mod(iglob,
nbp_lon) == 0)
THEN
632 offset = off_ini(:,3)
634 offset = off_ini(:,2)
638 index = iglob + offset(i)
640 IF (pctsrf_glo(ireal) >
epsfra)
THEN
641 jj = int((index - 1)/
nbp_lon) + 1
642 ij = index - (jj - 1) *
nbp_lon
643 neighbours_glo(igrid, i) = correspond(ij, jj)
652 CALL scatter_surf(neighbours_glo(:,i),neighbours(1:knon,i))
!IM Implemente en modes sequentiel et parallele CALL rlon_glo CALL bcast(rlon_glo)!$OMP MASTER if(is_mpi_root) then!zstophy
integer, parameter is_ter
integer, dimension(:), allocatable, save knon_glo_end_para
subroutine init_surf_para(knon)
real, dimension(:), allocatable, save dx
subroutine init_neighbours(knon, neighbours, knindex, pctsrf)
subroutine get_orchidee_communicator(orch_comm, orch_omp_size, orch_omp_rank)
!$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, public surf_land_orchidee(itime, dtime, date0, knon, knindex, rlon, rlat, pctsrf, debut, lafin, plev, u1_lay, v1_lay, gustiness, temp_air, spechum, epot_air, ccanopy, tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, precip_rain, precip_snow, lwdown, swnet, swdown, ps, q2m, t2m, evap, fluxsens, fluxlat, tsol_rad, tsurf_new, alb1_new, alb2_new, emis_new, z0_new, qsurf)
!IM Implemente en modes sequentiel et parallele CALL gather(rlat, rlat_glo) CALL bcast(rlat_glo) CALL gather(rlon
subroutine init_orchidee_index(knon, knindex, offset, ktindex)
subroutine init_synchro_omp
real, dimension(:), allocatable, save dy
logical, dimension(:), allocatable, save flag_omp
!$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
c c $Id c nbregdyn DO klon c rlat(i) c ENDIF!lon c ENDIF!lat ENDIF!pctsrf ENDDO!klon ENDDO!nbregdyn cIM 190504 ENDIF!ok_regdyn cIM somme de toutes les nhistoW BEG IF(debut) THEN DO nreg
character(len=6), save type_ocean
integer, dimension(:), allocatable, save knon_glo_para
subroutine, public cpl_send_land_fields(itime, knon, knindex, rriv_in, rcoa_in)
subroutine abort_physic(modname, message, ierr)
logical, public carbon_cycle_cpl
integer, dimension(:), allocatable, save knon_omp_para
c c $Id c nbregdyn DO klon c rlon(i)
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
subroutine finalize_surf_para