9 #ifdef ORCHIDEE_NOOPENMP
21 USE cpl_mod, ONLY : cpl_send_land_fields
39 plev, u1_lay, v1_lay, temp_air, spechum, epot_air, ccanopy, &
40 tq_cdrag, petacoef, peqacoef, petbcoef, peqbcoef, &
41 precip_rain, precip_snow, lwdown, swnet, swdown, &
43 evap, fluxsens, fluxlat, &
44 tsol_rad, tsurf_new, alb1_new, alb2_new, &
45 emis_new, z0_new,
qsurf)
101 include
"indicesol.h"
105 include
"dimensions.h"
110 INTEGER,
INTENT(IN) ::
itime
111 REAL,
INTENT(IN) ::
dtime
112 REAL,
INTENT(IN) :: date0
113 INTEGER,
INTENT(IN) :: knon
114 INTEGER,
DIMENSION(klon),
INTENT(IN) :: knindex
115 LOGICAL,
INTENT(IN) :: debut, lafin
116 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf
117 REAL,
DIMENSION(klon),
INTENT(IN) ::
rlon,
rlat
118 REAL,
DIMENSION(klon),
INTENT(IN) :: plev
119 REAL,
DIMENSION(klon),
INTENT(IN) :: u1_lay, v1_lay
120 REAL,
DIMENSION(klon),
INTENT(IN) :: temp_air, spechum
121 REAL,
DIMENSION(klon),
INTENT(IN) :: epot_air, ccanopy
122 REAL,
DIMENSION(klon),
INTENT(IN) :: tq_cdrag
123 REAL,
DIMENSION(klon),
INTENT(IN) :: petacoef, peqacoef
124 REAL,
DIMENSION(klon),
INTENT(IN) :: petbcoef, peqbcoef
125 REAL,
DIMENSION(klon),
INTENT(IN) :: precip_rain, precip_snow
126 REAL,
DIMENSION(klon),
INTENT(IN) :: lwdown, swnet, swdown, ps
127 REAL,
DIMENSION(klon),
INTENT(IN) :: q2m, t2m
131 REAL,
DIMENSION(klon),
INTENT(OUT) :: evap, fluxsens, fluxlat,
qsurf
132 REAL,
DIMENSION(klon),
INTENT(OUT) :: tsol_rad, tsurf_new
133 REAL,
DIMENSION(klon),
INTENT(OUT) :: alb1_new, alb2_new
134 REAL,
DIMENSION(klon),
INTENT(OUT) :: emis_new, z0_new
138 INTEGER ::
ij, jj, igrid, ireal, index
140 INTEGER,
SAVE :: nb_fields_cpl
141 REAL,
SAVE,
ALLOCATABLE,
DIMENSION(:,:) :: fields_cpl
142 REAL,
DIMENSION(klon) :: swdown_vrai
143 CHARACTER (len = 20) :: modname =
'surf_land_orchidee'
144 CHARACTER (len = 80) :: abort_message
145 LOGICAL,
SAVE :: check = .false.
153 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: albedo_keep, zlev
156 REAL,
ALLOCATABLE,
DIMENSION(:,:),
SAVE :: lalo
159 INTEGER,
ALLOCATABLE,
DIMENSION(:,:),
SAVE :: neighbours
162 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: contfrac
165 REAL,
ALLOCATABLE,
DIMENSION (:,:),
SAVE :: resolution
168 REAL,
ALLOCATABLE,
DIMENSION (:,:),
SAVE :: lon_scat, lat_scat
171 LOGICAL,
SAVE :: lrestart_read = .true.
173 LOGICAL,
SAVE :: lrestart_write = .false.
176 REAL,
DIMENSION(knon,2) :: albedo_out
180 REAL,
DIMENSION(klon) :: peta_orc, peqa_orc
181 REAL,
DIMENSION(klon) :: petb_orc, peqb_orc
183 INTEGER,
DIMENSION(:),
SAVE,
ALLOCATABLE :: ig, jg
185 INTEGER :: indi, indj
186 INTEGER,
SAVE,
ALLOCATABLE,
DIMENSION(:) :: ktindex
190 REAL,
DIMENSION(klon) :: cdrag
191 INTEGER,
SAVE :: offset
194 REAL,
DIMENSION(klon_glo) :: rlon_g,rlat_g
195 INTEGER,
SAVE :: orch_comm
198 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: coastalflow
200 REAL,
ALLOCATABLE,
DIMENSION(:),
SAVE :: riverflow
207 IF (check)
WRITE(
lunout,*)
'Entree ', modname
215 IF (carbon_cycle_cpl)
THEN
216 abort_message=
'You must define preprossing key ORCH_NEW when running carbon_cycle_cpl=y'
220 ALLOCATE(ktindex(knon))
221 IF ( .NOT.
ALLOCATED(albedo_keep))
THEN
222 ALLOCATE(albedo_keep(klon))
232 DO igrid = 2, klon - 1
234 IF ( indi >
iim)
THEN
244 IF ((.NOT.
ALLOCATED(lalo)))
THEN
245 ALLOCATE(lalo(knon,2), stat = error)
247 abort_message=
'Pb allocation lalo'
251 IF ((.NOT.
ALLOCATED(lon_scat)))
THEN
252 ALLOCATE(lon_scat(
iim,jjm+1), stat = error)
254 abort_message=
'Pb allocation lon_scat'
258 IF ((.NOT.
ALLOCATED(lat_scat)))
THEN
259 ALLOCATE(lat_scat(
iim,jjm+1), stat = error)
261 abort_message=
'Pb allocation lat_scat'
268 index = knindex(igrid)
269 lalo(igrid,2) =
rlon(index)
270 lalo(igrid,1) =
rlat(index)
278 IF (is_mpi_root)
THEN
283 lon_scat(
ij,jj) = rlon_g(index)
284 lat_scat(
ij,jj) = rlat_g(index)
287 lon_scat(:,1) = lon_scat(:,2)
288 lat_scat(:,1) = rlat_g(1)
289 lon_scat(:,jjm+1) = lon_scat(:,2)
290 lat_scat(:,jjm+1) = rlat_g(klon_glo)
299 IF ( (.NOT.
ALLOCATED(neighbours)))
THEN
300 ALLOCATE(neighbours(knon,8), stat = error)
302 abort_message=
'Pb allocation neighbours'
307 IF (( .NOT.
ALLOCATED(contfrac)))
THEN
308 ALLOCATE(contfrac(knon), stat = error)
310 abort_message=
'Pb allocation contfrac'
316 ireal = knindex(igrid)
317 contfrac(igrid) = pctsrf(ireal,is_ter)
325 IF ( (.NOT.
ALLOCATED(resolution)))
THEN
326 ALLOCATE(resolution(knon,2), stat = error)
328 abort_message=
'Pb allocation resolution'
334 resolution(igrid,1) =
cuphy(
ij)
335 resolution(igrid,2) =
cvphy(
ij)
338 ALLOCATE(coastalflow(klon), stat = error)
340 abort_message=
'Pb allocation coastalflow'
344 ALLOCATE(riverflow(klon), stat = error)
346 abort_message=
'Pb allocation riverflow'
352 IF ( carbon_cycle_cpl )
THEN
359 IF (carbon_cycle_cpl)
THEN
360 ALLOCATE(fco2_land_inst(klon),stat=error)
361 IF (error /= 0) CALL
abort_gcm(modname,
'Pb in allocation fco2_land_inst',1)
363 ALLOCATE(fco2_lu_inst(klon),stat=error)
364 IF(error /=0) CALL
abort_gcm(modname,
'Pb in allocation fco2_lu_inst',1)
367 ALLOCATE(fields_cpl(klon,nb_fields_cpl), stat = error)
368 IF (error /= 0) CALL
abort_gcm(modname,
'Pb in allocation fields_cpl',1)
375 IF (lafin) lrestart_write = .true.
376 IF (check)
WRITE(
lunout,*)
'lafin ',lafin,lrestart_write
378 peta_orc(1:knon) = petbcoef(1:knon) *
dtime
379 petb_orc(1:knon) = petacoef(1:knon)
380 peqa_orc(1:knon) = peqbcoef(1:knon) *
dtime
381 peqb_orc(1:knon) = peqacoef(1:knon)
384 cdrag(1:knon) = tq_cdrag(1:knon)
387 zlev(1:knon) = (100.*plev(1:knon))/((ps(1:knon)/rd*temp_air(1:knon))*rg)
416 lrestart_read, lrestart_write, lalo, &
417 contfrac, neighbours, resolution, date0, &
418 zlev, u1_lay, v1_lay, spechum, temp_air, epot_air, ccanopy, &
419 cdrag, peta_orc, peqa_orc, petb_orc, peqb_orc, &
420 precip_rain, precip_snow, lwdown, swnet, swdown, ps, &
421 evap, fluxsens, fluxlat, coastalflow, riverflow, &
422 tsol_rad, tsurf_new,
qsurf, albedo_out, emis_new, z0_new, &
423 lon_scat, lat_scat, q2m, t2m &
425 , nb_fields_cpl, fields_cpl)
433 orch_comm,
dtime, lrestart_read, lrestart_write, lalo, &
434 contfrac, neighbours, resolution, date0, &
435 zlev, u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), &
436 cdrag(1:knon), peta_orc(1:knon), peqa_orc(1:knon), petb_orc(1:knon), peqb_orc(1:knon), &
437 precip_rain(1:knon), precip_snow(1:knon), lwdown(1:knon), swnet(1:knon), swdown(1:knon), ps(1:knon), &
438 evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
439 tsol_rad(1:knon), tsurf_new(1:knon),
qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
440 lon_scat, lat_scat, q2m, t2m &
442 , nb_fields_cpl, fields_cpl(1:knon,:))
450 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
455 swdown_vrai(1:knon) = swdown(1:knon)
461 lrestart_read, lrestart_write, lalo, &
462 contfrac, neighbours, resolution, date0, &
463 zlev, u1_lay, v1_lay, spechum, temp_air, epot_air, ccanopy, &
464 cdrag, peta_orc, peqa_orc, petb_orc, peqb_orc, &
465 precip_rain, precip_snow, lwdown, swnet, swdown_vrai, ps, &
466 evap, fluxsens, fluxlat, coastalflow, riverflow, &
467 tsol_rad, tsurf_new,
qsurf, albedo_out, emis_new, z0_new, &
468 lon_scat, lat_scat, q2m, t2m &
470 , nb_fields_cpl, fields_cpl)
477 orch_comm,
dtime, lrestart_read, lrestart_write, lalo, &
478 contfrac, neighbours, resolution, date0, &
479 zlev, u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), &
480 cdrag(1:knon), peta_orc(1:knon), peqa_orc(1:knon), petb_orc(1:knon), peqb_orc(1:knon), &
481 precip_rain(1:knon), precip_snow(1:knon), lwdown(1:knon), swnet(1:knon), swdown_vrai(1:knon), ps(1:knon), &
482 evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
483 tsol_rad(1:knon), tsurf_new(1:knon),
qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
484 lon_scat, lat_scat, q2m, t2m &
486 , nb_fields_cpl, fields_cpl(1:knon,:))
493 albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
497 IF (type_ocean==
'couple')
THEN
499 riverflow, coastalflow)
502 alb1_new(1:knon) = albedo_out(1:knon,1)
503 alb2_new(1:knon) = albedo_out(1:knon,2)
506 fluxsens(1:knon) = -1. * fluxsens(1:knon)
507 fluxlat(1:knon) = -1. * fluxlat(1:knon)
511 IF (debut) lrestart_read = .false.
514 IF (carbon_cycle_cpl)
THEN
519 ireal = knindex(igrid)
520 fco2_land_inst(ireal) = fields_cpl(igrid,1)
521 fco2_lu_inst(ireal) = fields_cpl(igrid,2)
532 include
"dimensions.h"
541 INTEGER,
INTENT(IN) :: knon
542 INTEGER,
INTENT(IN) :: orch_comm
543 INTEGER,
DIMENSION(klon),
INTENT(IN) :: knindex
547 INTEGER,
INTENT(OUT) :: offset
548 INTEGER,
DIMENSION(knon),
INTENT(OUT) :: ktindex
553 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: status
556 INTEGER :: mylastpoint
558 INTEGER :: mpi_rank_orch
559 INTEGER :: mpi_size_orch
565 mylastpoint=klon_mpi_begin-1+knindex(knon)+
iim-1
567 IF (is_parallel)
THEN
569 CALL mpi_comm_size(orch_comm,mpi_size_orch,ierr)
570 CALL mpi_comm_rank(orch_comm,mpi_rank_orch,ierr)
577 IF (is_parallel)
THEN
578 IF (mpi_rank_orch /= 0)
THEN
580 CALL mpi_recv(lastpoint,1,mpi_integer,mpi_rank_orch-1,1234,orch_comm,status,ierr)
584 IF (mpi_rank_orch /= mpi_size_orch-1)
THEN
586 CALL mpi_send(mylastpoint,1,mpi_integer,mpi_rank_orch+1,1234,orch_comm,ierr)
591 IF (mpi_rank_orch == 0)
THEN
594 offset=lastpoint-mod(lastpoint,
iim)
597 ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin+
iim-1)-offset-1
611 INTEGER,
INTENT(IN) :: knon
612 INTEGER,
INTENT(OUT) :: orch_comm
627 CALL mpi_comm_split(comm_lmdz_phy,color,mpi_rank,orch_comm,ierr)
636 include
"indicesol.h"
637 include
"dimensions.h"
644 INTEGER,
INTENT(IN) :: knon
645 INTEGER,
DIMENSION(klon),
INTENT(IN) :: ktindex
646 REAL,
DIMENSION(klon),
INTENT(IN) :: pctsrf
650 INTEGER,
DIMENSION(knon,8),
INTENT(OUT) :: neighbours
655 INTEGER ::
i, igrid, jj,
ij, iglob
656 INTEGER :: ierr, ireal, index
658 INTEGER,
DIMENSION(0:mpi_size-1) :: knon_nb
659 INTEGER,
DIMENSION(0:mpi_size-1) :: displs
660 INTEGER,
DIMENSION(8,3) :: off_ini
661 INTEGER,
DIMENSION(8) :: offset
662 INTEGER,
DIMENSION(knon) :: ktindex_p
663 INTEGER,
DIMENSION(iim,jjm+1) :: correspond
664 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ktindex_g
665 INTEGER,
ALLOCATABLE,
DIMENSION(:,:) :: neighbours_g
666 REAL,
DIMENSION(klon_glo) :: pctsrf_g
672 IF (is_sequential)
THEN
677 CALL mpi_gather(knon,1,mpi_integer,knon_nb,1,mpi_integer,0,comm_lmdz_phy,ierr)
682 IF (is_mpi_root)
THEN
683 knon_g=sum(knon_nb(:))
684 ALLOCATE(ktindex_g(knon_g))
685 ALLOCATE(neighbours_g(knon_g,8))
689 displs(
i)=displs(
i-1)+knon_nb(
i-1)
692 ALLOCATE(neighbours_g(1,8))
695 ktindex_p(1:knon)=ktindex(1:knon)+klon_mpi_begin-1+
iim-1
697 IF (is_sequential)
THEN
698 ktindex_g(:)=ktindex_p(:)
702 CALL mpi_gatherv(ktindex_p,knon,mpi_integer,ktindex_g,knon_nb,&
703 displs,mpi_integer,0,comm_lmdz_phy,ierr)
708 CALL
gather(pctsrf,pctsrf_g)
710 IF (is_mpi_root)
THEN
714 off_ini(1,1) = -
iim ; off_ini(2,1) = -
iim + 1; off_ini(3,1) = 1
715 off_ini(4,1) =
iim + 1; off_ini(5,1) =
iim ; off_ini(6,1) = 2 *
iim - 1
716 off_ini(7,1) =
iim -1 ; off_ini(8,1) = - 1
718 off_ini(1,2) = -
iim ; off_ini(2,2) = -
iim + 1; off_ini(3,2) = 1
719 off_ini(4,2) =
iim + 1; off_ini(5,2) =
iim ; off_ini(6,2) =
iim - 1
720 off_ini(7,2) = -1 ; off_ini(8,2) = -
iim - 1
722 off_ini(1,3) = -
iim; off_ini(2,3) = - 2 *
iim + 1; off_ini(3,3) = -
iim + 1
723 off_ini(4,3) = 1 ; off_ini(5,3) =
iim ; off_ini(6,3) =
iim - 1
724 off_ini(7,3) = -1 ; off_ini(8,3) = -
iim - 1
730 index = ktindex_g(igrid)
731 jj = int((index - 1)/
iim) + 1
732 ij = index - (jj - 1) *
iim
733 correspond(
ij,jj) = igrid
737 iglob = ktindex_g(igrid)
738 IF (mod(iglob,
iim) == 1)
THEN
739 offset = off_ini(:,1)
740 ELSE IF(mod(iglob,
iim) == 0)
THEN
741 offset = off_ini(:,3)
743 offset = off_ini(:,2)
746 index = iglob + offset(
i)
747 ireal = (min(max(1, index -
iim + 1), klon_glo))
748 IF (pctsrf_g(ireal) > epsfra)
THEN
749 jj = int((index - 1)/
iim) + 1
750 ij = index - (jj - 1) *
iim
751 neighbours_g(igrid,
i) = correspond(
ij, jj)
759 IF (is_sequential)
THEN
760 neighbours(:,
i)=neighbours_g(:,
i)
765 CALL mpi_scatterv(neighbours_g(:,
i),knon_nb,displs,mpi_integer,neighbours(:,
i),knon,mpi_integer,0,comm_lmdz_phy,ierr)
768 CALL mpi_scatterv(neighbours_g(:,
i),knon_nb,displs,mpi_integer,var_tmp,knon,mpi_integer,0,comm_lmdz_phy,ierr)