source: LMDZ4/trunk/libf/phylmd/surf_land_orchidee_mod.F90 @ 1023

Last change on this file since 1023 was 1023, checked in by lsce, 16 years ago

Bug parallélisme en MPI/OPENMP lorsque pour un grand nombre de CPU, le processus maître et/ou la tâche maitre se retrouve sans points de terre, et sont donc exlus de la liste des domaines dans orchidee.
YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 20.9 KB
Line 
1!
2! $Header$
3!
4MODULE surf_land_orchidee_mod
5!
6! This module controles the interface towards the model ORCHIDEE
7!
8! Subroutines in this module : surf_land_orchidee
9!                              Init_orchidee_index
10!                              Get_orchidee_communicator
11!                              Init_neighbours
12#ifdef CPP_VEGET
13
14  USE dimphy
15  USE intersurf     ! module d'ORCHIDEE
16  USE cpl_mod,      ONLY : cpl_send_land_fields
17  USE surface_data, ONLY : type_ocean
18  USE comgeomphy,   ONLY : cuphy, cvphy
19  USE mod_grid_phy_lmdz
20  USE mod_phys_lmdz_para, mpi_root_rank=>mpi_root
21
22  IMPLICIT NONE
23
24  PRIVATE
25  PUBLIC  :: surf_land_orchidee
26
27  LOGICAL, ALLOCATABLE, SAVE :: flag_omp(:)
28CONTAINS
29!
30!****************************************************************************************
31
32  SUBROUTINE surf_land_orchidee(itime, dtime, date0, knon, &
33       knindex, rlon, rlat, pctsrf, &
34       debut, lafin, &
35       plev,  u1_lay, v1_lay, temp_air, spechum, epot_air, ccanopy, &
36       tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, &
37       precip_rain, precip_snow, lwdown, swnet, swdown, &
38       ps, &
39       evap, fluxsens, fluxlat, &             
40       tsol_rad, tsurf_new, alb1_new, alb2_new, &
41       emis_new, z0_new, qsurf)
42   USE mod_surf_para
43   USE mod_synchro_omp
44   
45!   
46! Cette routine sert d'interface entre le modele atmospherique et le
47! modele de sol continental. Appel a sechiba
48!
49! L. Fairhead 02/2000
50!
51! input:
52!   itime        numero du pas de temps
53!   dtime        pas de temps de la physique (en s)
54!   nisurf       index de la surface a traiter (1 = sol continental)
55!   knon         nombre de points de la surface a traiter
56!   knindex      index des points de la surface a traiter
57!   rlon         longitudes de la grille entiere
58!   rlat         latitudes de la grille entiere
59!   pctsrf       tableau des fractions de surface de chaque maille
60!   debut        logical: 1er appel a la physique (lire les restart)
61!   lafin        logical: dernier appel a la physique (ecrire les restart)
62!                     (si false calcul simplifie des fluxs sur les continents)
63!   plev         hauteur de la premiere couche (Pa)     
64!   u1_lay       vitesse u 1ere couche
65!   v1_lay       vitesse v 1ere couche
66!   temp_air     temperature de l'air 1ere couche
67!   spechum      humidite specifique 1ere couche
68!   epot_air     temp pot de l'air
69!   ccanopy      concentration CO2 canopee
70!   tq_cdrag     cdrag
71!   petAcoef     coeff. A de la resolution de la CL pour t
72!   peqAcoef     coeff. A de la resolution de la CL pour q
73!   petBcoef     coeff. B de la resolution de la CL pour t
74!   peqBcoef     coeff. B de la resolution de la CL pour q
75!   precip_rain  precipitation liquide
76!   precip_snow  precipitation solide
77!   lwdown       flux IR descendant a la surface
78!   swnet        flux solaire net
79!   swdown       flux solaire entrant a la surface
80!   ps           pression au sol
81!   radsol       rayonnement net aus sol (LW + SW)
82!   
83!
84! output:
85!   evap         evaporation totale
86!   fluxsens     flux de chaleur sensible
87!   fluxlat      flux de chaleur latente
88!   tsol_rad     
89!   tsurf_new    temperature au sol
90!   alb1_new     albedo in visible SW interval
91!   alb2_new     albedo in near IR interval
92!   emis_new     emissivite
93!   z0_new       surface roughness
94!   qsurf        air moisture at surface
95!
96    INCLUDE "indicesol.h"
97    INCLUDE "temps.h"
98    INCLUDE "YOMCST.h"
99    INCLUDE "iniprint.h"
100    INCLUDE "dimensions.h"
101 
102!
103! Parametres d'entree
104!****************************************************************************************
105    INTEGER, INTENT(IN)                       :: itime
106    REAL, INTENT(IN)                          :: dtime
107    REAL, INTENT(IN)                          :: date0
108    INTEGER, INTENT(IN)                       :: knon
109    INTEGER, DIMENSION(klon), INTENT(IN)      :: knindex
110    LOGICAL, INTENT(IN)                       :: debut, lafin
111    REAL, DIMENSION(klon,nbsrf), INTENT(IN)   :: pctsrf
112    REAL, DIMENSION(klon), INTENT(IN)         :: rlon, rlat
113    REAL, DIMENSION(klon), INTENT(IN)         :: plev
114    REAL, DIMENSION(klon), INTENT(IN)         :: u1_lay, v1_lay
115    REAL, DIMENSION(klon), INTENT(IN)         :: temp_air, spechum
116    REAL, DIMENSION(klon), INTENT(IN)         :: epot_air, ccanopy
117    REAL, DIMENSION(klon), INTENT(IN)         :: tq_cdrag
118    REAL, DIMENSION(klon), INTENT(IN)         :: petAcoef, peqAcoef
119    REAL, DIMENSION(klon), INTENT(IN)         :: petBcoef, peqBcoef
120    REAL, DIMENSION(klon), INTENT(IN)         :: precip_rain, precip_snow
121    REAL, DIMENSION(klon), INTENT(IN)         :: lwdown, swnet, swdown, ps
122    REAL, DIMENSION(klon)                     :: swdown_vrai
123
124! Parametres de sortie
125!****************************************************************************************
126    REAL, DIMENSION(klon), INTENT(OUT)        :: evap, fluxsens, fluxlat, qsurf
127    REAL, DIMENSION(klon), INTENT(OUT)        :: tsol_rad, tsurf_new
128    REAL, DIMENSION(klon), INTENT(OUT)        :: alb1_new, alb2_new
129    REAL, DIMENSION(klon), INTENT(OUT)        :: emis_new, z0_new
130
131! Local
132!****************************************************************************************
133    INTEGER                                   :: ij, jj, igrid, ireal, index
134    INTEGER                                   :: error
135    CHARACTER (len = 20)                      :: modname = 'surf_land_orchidee'
136    CHARACTER (len = 80)                      :: abort_message
137    LOGICAL,SAVE                              :: check = .FALSE.
138    !$OMP THREADPRIVATE(check)
139
140! type de couplage dans sechiba
141!  character (len=10)   :: coupling = 'implicit'
142! drapeaux controlant les appels dans SECHIBA
143!  type(control_type), save   :: control_in
144! Preserved albedo
145    REAL, ALLOCATABLE, DIMENSION(:), SAVE     :: albedo_keep, zlev
146    !$OMP THREADPRIVATE(albedo_keep,zlev)
147! coordonnees geographiques
148    REAL, ALLOCATABLE, DIMENSION(:,:), SAVE   :: lalo
149    !$OMP THREADPRIVATE(lalo)
150! pts voisins
151    INTEGER,ALLOCATABLE, DIMENSION(:,:), SAVE :: neighbours
152    !$OMP THREADPRIVATE(neighbours)
153! fractions continents
154    REAL,ALLOCATABLE, DIMENSION(:), SAVE      :: contfrac
155    !$OMP THREADPRIVATE(contfrac)
156! resolution de la grille
157    REAL, ALLOCATABLE, DIMENSION (:,:), SAVE  :: resolution
158    !$OMP THREADPRIVATE(resolution)
159
160    REAL, ALLOCATABLE, DIMENSION (:,:), SAVE  :: lon_scat, lat_scat 
161    !$OMP THREADPRIVATE(lon_scat,lat_scat)
162
163    LOGICAL, SAVE                             :: lrestart_read = .TRUE.
164    !$OMP THREADPRIVATE(lrestart_read)
165    LOGICAL, SAVE                             :: lrestart_write = .FALSE.
166    !$OMP THREADPRIVATE(lrestart_write)
167
168    REAL, DIMENSION(knon,2)                   :: albedo_out
169
170! Pb de nomenclature
171    REAL, DIMENSION(klon)                     :: petA_orc, peqA_orc
172    REAL, DIMENSION(klon)                     :: petB_orc, peqB_orc
173! Pb de correspondances de grilles
174    INTEGER, DIMENSION(:), SAVE, ALLOCATABLE  :: ig, jg
175    !$OMP THREADPRIVATE(ig,jg)
176    INTEGER :: indi, indj
177    INTEGER, SAVE, ALLOCATABLE,DIMENSION(:)   :: ktindex
178    !$OMP THREADPRIVATE(ktindex)
179
180! Essai cdrag
181    REAL, DIMENSION(klon)                     :: cdrag
182    INTEGER,SAVE                              :: offset
183    !$OMP THREADPRIVATE(offset)
184
185    REAL, DIMENSION(klon_glo)                 :: rlon_g,rlat_g
186    INTEGER, SAVE                             :: orch_comm
187    !$OMP THREADPRIVATE(orch_comm)
188
189    REAL, ALLOCATABLE, DIMENSION(:), SAVE     :: coastalflow
190    !$OMP THREADPRIVATE(coastalflow)
191    REAL, ALLOCATABLE, DIMENSION(:), SAVE     :: riverflow
192    !$OMP THREADPRIVATE(riverflow)
193   
194    INTEGER :: orch_omp_rank
195    INTEGER :: orch_omp_size
196!
197! Fin definition
198!****************************************************************************************
199
200    IF (check) WRITE(lunout,*)'Entree ', modname
201 
202! Initialisation
203 
204    IF (debut) THEN
205       CALL Init_surf_para(knon)
206       ALLOCATE(ktindex(knon))
207       IF ( .NOT. ALLOCATED(albedo_keep)) THEN
208!ym          ALLOCATE(albedo_keep(klon))
209!ym bizarre que non alloué en knon precedement
210          ALLOCATE(albedo_keep(knon))
211          ALLOCATE(zlev(knon))
212       ENDIF
213! Pb de correspondances de grilles
214       ALLOCATE(ig(klon))
215       ALLOCATE(jg(klon))
216       ig(1) = 1
217       jg(1) = 1
218       indi = 0
219       indj = 2
220       DO igrid = 2, klon - 1
221          indi = indi + 1
222          IF ( indi > iim) THEN
223             indi = 1
224             indj = indj + 1
225          ENDIF
226          ig(igrid) = indi
227          jg(igrid) = indj
228       ENDDO
229       ig(klon) = 1
230       jg(klon) = jjm + 1
231
232       IF ((.NOT. ALLOCATED(lalo))) THEN
233          ALLOCATE(lalo(knon,2), stat = error)
234          IF (error /= 0) THEN
235             abort_message='Pb allocation lalo'
236             CALL abort_gcm(modname,abort_message,1)
237          ENDIF
238       ENDIF
239       IF ((.NOT. ALLOCATED(lon_scat))) THEN
240          ALLOCATE(lon_scat(iim,jjm+1), stat = error)
241          IF (error /= 0) THEN
242             abort_message='Pb allocation lon_scat'
243             CALL abort_gcm(modname,abort_message,1)
244          ENDIF
245       ENDIF
246       IF ((.NOT. ALLOCATED(lat_scat))) THEN
247          ALLOCATE(lat_scat(iim,jjm+1), stat = error)
248          IF (error /= 0) THEN
249             abort_message='Pb allocation lat_scat'
250             CALL abort_gcm(modname,abort_message,1)
251          ENDIF
252       ENDIF
253       lon_scat = 0.
254       lat_scat = 0.
255       DO igrid = 1, knon
256          index = knindex(igrid)
257          lalo(igrid,2) = rlon(index)
258          lalo(igrid,1) = rlat(index)
259       ENDDO
260
261       
262       
263       CALL Gather(rlon,rlon_g)
264       CALL Gather(rlat,rlat_g)
265
266       IF (is_mpi_root) THEN
267          index = 1
268          DO jj = 2, jjm
269             DO ij = 1, iim
270                index = index + 1
271                lon_scat(ij,jj) = rlon_g(index)
272                lat_scat(ij,jj) = rlat_g(index)
273             ENDDO
274          ENDDO
275          lon_scat(:,1) = lon_scat(:,2)
276          lat_scat(:,1) = rlat_g(1)
277          lon_scat(:,jjm+1) = lon_scat(:,2)
278          lat_scat(:,jjm+1) = rlat_g(klon_glo)
279       ENDIF
280   
281       CALL bcast(lon_scat)
282       CALL bcast(lat_scat)
283!
284! Allouer et initialiser le tableau des voisins et des fraction de continents
285!
286       IF ( (.NOT.ALLOCATED(neighbours))) THEN
287          ALLOCATE(neighbours(knon,8), stat = error)
288          IF (error /= 0) THEN
289             abort_message='Pb allocation neighbours'
290             CALL abort_gcm(modname,abort_message,1)
291          ENDIF
292       ENDIF
293       neighbours = -1.
294       IF (( .NOT. ALLOCATED(contfrac))) THEN
295          ALLOCATE(contfrac(knon), stat = error)
296          IF (error /= 0) THEN
297             abort_message='Pb allocation contfrac'
298             CALL abort_gcm(modname,abort_message,1)
299          ENDIF
300       ENDIF
301
302       DO igrid = 1, knon
303          ireal = knindex(igrid)
304          contfrac(igrid) = pctsrf(ireal,is_ter)
305       ENDDO
306
307
308       CALL Init_neighbours(knon,neighbours,knindex,pctsrf(:,is_ter))
309
310!
311!  Allocation et calcul resolutions
312       IF ( (.NOT.ALLOCATED(resolution))) THEN
313          ALLOCATE(resolution(knon,2), stat = error)
314          IF (error /= 0) THEN
315             abort_message='Pb allocation resolution'
316             CALL abort_gcm(modname,abort_message,1)
317          ENDIF
318       ENDIF
319       DO igrid = 1, knon
320          ij = knindex(igrid)
321          resolution(igrid,1) = cuphy(ij)
322          resolution(igrid,2) = cvphy(ij)
323       ENDDO
324     
325       ALLOCATE(coastalflow(klon), stat = error)
326       IF (error /= 0) THEN
327          abort_message='Pb allocation coastalflow'
328          CALL abort_gcm(modname,abort_message,1)
329       ENDIF
330       
331       ALLOCATE(riverflow(klon), stat = error)
332       IF (error /= 0) THEN
333          abort_message='Pb allocation riverflow'
334          CALL abort_gcm(modname,abort_message,1)
335       ENDIF
336
337    ENDIF                          ! (fin debut)
338
339!
340! Appel a la routine sols continentaux
341!
342    IF (lafin) lrestart_write = .TRUE.
343    IF (check) WRITE(lunout,*)'lafin ',lafin,lrestart_write
344     
345    petA_orc(1:knon) = petBcoef(1:knon) * dtime
346    petB_orc(1:knon) = petAcoef(1:knon)
347    peqA_orc(1:knon) = peqBcoef(1:knon) * dtime
348    peqB_orc(1:knon) = peqAcoef(1:knon)
349
350    cdrag = 0.
351    cdrag(1:knon) = tq_cdrag(1:knon)
352
353! zlev(1:knon) = (100.*plev(1:knon))/((ps(1:knon)/287.05*temp_air(1:knon))*9.80665)
354    zlev(1:knon) = (100.*plev(1:knon))/((ps(1:knon)/RD*temp_air(1:knon))*RG)
355
356
357! PF et PASB
358!   where(cdrag > 0.01)
359!     cdrag = 0.01
360!   endwhere
361!  write(*,*)'Cdrag = ',minval(cdrag),maxval(cdrag)
362
363 
364    IF (debut) THEN
365       CALL Init_orchidee_index(knon,knindex,offset,ktindex)
366       CALL Get_orchidee_communicator(orch_comm,orch_omp_size,orch_omp_rank)
367       CALL Init_synchro_omp
368       
369       IF (knon > 0) THEN
370         CALL Init_intersurf(nbp_lon,nbp_lat,knon,ktindex,offset,orch_omp_size,orch_omp_rank,orch_comm)
371       ENDIF
372
373       
374       IF (knon > 0) THEN
375
376          CALL intersurf_main (itime+itau_phy-1, iim, jjm+1, knon, ktindex, dtime, &
377               lrestart_read, lrestart_write, lalo, &
378               contfrac, neighbours, resolution, date0, &
379               zlev,  u1_lay, v1_lay, spechum, temp_air, epot_air, ccanopy, &
380               cdrag, petA_orc, peqA_orc, petB_orc, peqB_orc, &
381               precip_rain, precip_snow, lwdown, swnet, swdown, ps, &
382               evap, fluxsens, fluxlat, coastalflow, riverflow, &
383               tsol_rad, tsurf_new, qsurf, albedo_out, emis_new, z0_new, &
384               lon_scat, lat_scat)
385         
386       ENDIF
387
388       CALL Synchro_omp
389
390       albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
391
392    ENDIF
393
394   
395!  swdown_vrai(1:knon) = swnet(1:knon)/(1. - albedo_keep(1:knon))
396    swdown_vrai(1:knon) = swdown(1:knon)
397
398    IF (knon > 0) THEN
399   
400       CALL intersurf_main (itime+itau_phy, iim, jjm+1, knon, ktindex, dtime,  &
401            lrestart_read, lrestart_write, lalo, &
402            contfrac, neighbours, resolution, date0, &
403            zlev,  u1_lay(1:knon), v1_lay(1:knon), spechum(1:knon), temp_air(1:knon), epot_air(1:knon), ccanopy(1:knon), &
404            cdrag(1:knon), petA_orc(1:knon), peqA_orc(1:knon), petB_orc(1:knon), peqB_orc(1:knon), &
405            precip_rain(1:knon), precip_snow(1:knon), lwdown(1:knon), swnet(1:knon), swdown_vrai(1:knon), ps(1:knon), &
406            evap(1:knon), fluxsens(1:knon), fluxlat(1:knon), coastalflow(1:knon), riverflow(1:knon), &
407            tsol_rad(1:knon), tsurf_new(1:knon), qsurf(1:knon), albedo_out(1:knon,:), emis_new(1:knon), z0_new(1:knon), &
408            lon_scat, lat_scat)
409       
410    ENDIF
411
412    CALL Synchro_omp
413   
414    albedo_keep(1:knon) = (albedo_out(1:knon,1)+albedo_out(1:knon,2))/2.
415
416!* Send to coupler
417!
418    IF (type_ocean=='couple') THEN
419       CALL cpl_send_land_fields(itime, knon, knindex, &
420            riverflow, coastalflow)
421    ENDIF
422
423    alb1_new(1:knon) = albedo_out(1:knon,1)
424    alb2_new(1:knon) = albedo_out(1:knon,2)
425
426! Convention orchidee: positif vers le haut
427    fluxsens(1:knon) = -1. * fluxsens(1:knon)
428    fluxlat(1:knon)  = -1. * fluxlat(1:knon)
429   
430!  evap     = -1. * evap
431
432    IF (debut) lrestart_read = .FALSE.
433   
434    IF (debut) CALL Finalize_surf_para
435   
436  END SUBROUTINE surf_land_orchidee
437!
438!****************************************************************************************
439!
440  SUBROUTINE Init_orchidee_index(knon,knindex,offset,ktindex)
441  USE mod_surf_para
442  USE mod_grid_phy_lmdz
443 
444    INTEGER,INTENT(IN)    :: knon
445    INTEGER,INTENT(IN)    :: knindex(klon)   
446    INTEGER,INTENT(OUT)   :: offset
447    INTEGER,INTENT(OUT)   :: ktindex(klon)
448   
449    INTEGER               :: ktindex_glo(knon_glo)
450    INTEGER               :: offset_para(0:omp_size*mpi_size-1)
451    INTEGER               :: LastPoint
452    INTEGER               :: task
453   
454    ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+nbp_lon-1
455   
456    CALL gather_surf(ktindex(1:knon),ktindex_glo)
457   
458    IF (is_mpi_root .AND. is_omp_root) THEN
459      LastPoint=0
460      DO Task=0,mpi_size*omp_size-1
461        IF (knon_glo_para(Task)>0) THEN
462           offset_para(task)= LastPoint-MOD(LastPoint,nbp_lon)
463           LastPoint=ktindex_glo(knon_glo_end_para(task))
464        ENDIF
465      ENDDO
466    ENDIF
467   
468    CALL bcast(offset_para)
469   
470    offset=offset_para(omp_size*mpi_rank+omp_rank)
471   
472    ktindex(1:knon)=ktindex(1:knon)-offset
473
474  END SUBROUTINE Init_orchidee_index
475
476!
477!************************* ***************************************************************
478!
479
480  SUBROUTINE Get_orchidee_communicator(orch_comm,orch_omp_size,orch_omp_rank)
481  USE  mod_surf_para
482     
483#ifdef CPP_MPI
484    INCLUDE 'mpif.h'
485#endif   
486
487    INTEGER,INTENT(OUT) :: orch_comm
488    INTEGER,INTENT(OUT) :: orch_omp_size
489    INTEGER,INTENT(OUT) :: orch_omp_rank
490    INTEGER             :: color
491    INTEGER             :: i,ierr
492!
493! End definition
494!****************************************************************************************
495   
496   
497    IF (is_omp_root) THEN         
498     
499      IF (knon_mpi==0) THEN
500         color = 0
501      ELSE
502         color = 1
503      ENDIF
504   
505#ifdef CPP_MPI   
506      CALL MPI_COMM_SPLIT(COMM_LMDZ_PHY,color,mpi_rank,orch_comm,ierr)
507#endif
508   
509    ENDIF
510    CALL bcast_omp(orch_comm)
511   
512    IF (knon_mpi /= 0) THEN
513      orch_omp_size=0
514      DO i=0,omp_size-1
515        IF (knon_omp_para(i) /=0) THEN
516          orch_omp_size=orch_omp_size+1
517          IF (i==omp_rank) orch_omp_rank=orch_omp_size-1
518        ENDIF
519      ENDDO
520    ENDIF
521   
522   
523  END SUBROUTINE Get_orchidee_communicator
524!
525!****************************************************************************************
526
527
528  SUBROUTINE Init_neighbours(knon,neighbours,knindex,pctsrf)
529    USE mod_grid_phy_lmdz
530    USE mod_surf_para   
531    INCLUDE "indicesol.h"
532
533#ifdef CPP_MPI
534    INCLUDE 'mpif.h'
535#endif   
536
537! Input arguments
538!****************************************************************************************
539    INTEGER, INTENT(IN)                     :: knon
540    INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
541    REAL, DIMENSION(klon), INTENT(IN)       :: pctsrf
542   
543! Output arguments
544!****************************************************************************************
545    INTEGER, DIMENSION(knon,8), INTENT(OUT) :: neighbours
546
547! Local variables
548!****************************************************************************************
549    INTEGER                              :: i, igrid, jj, ij, iglob
550    INTEGER                              :: ierr, ireal, index
551    INTEGER, DIMENSION(8,3)              :: off_ini
552    INTEGER, DIMENSION(8)                :: offset 
553    INTEGER, DIMENSION(nbp_lon,nbp_lat)  :: correspond
554    INTEGER, DIMENSION(knon_glo)         :: ktindex_glo
555    INTEGER, DIMENSION(knon_glo,8)       :: neighbours_glo
556    REAL, DIMENSION(klon_glo)            :: pctsrf_glo
557    INTEGER                              :: ktindex(klon)
558!
559! End definition
560!****************************************************************************************
561
562    ktindex(1:knon)=knindex(1:knon)+(klon_mpi_begin-1)+(klon_omp_begin-1)+nbp_lon-1
563   
564    CALL gather_surf(ktindex(1:knon),ktindex_glo)
565    CALL gather(pctsrf,pctsrf_glo)
566   
567    IF (is_mpi_root .AND. is_omp_root) THEN
568      neighbours_glo(:,:)=-1
569!  Initialisation des offset   
570!
571! offset bord ouest
572       off_ini(1,1) = - nbp_lon   ; off_ini(2,1) = - nbp_lon + 1     ; off_ini(3,1) = 1
573       off_ini(4,1) = nbp_lon + 1 ; off_ini(5,1) = nbp_lon           ; off_ini(6,1) = 2 * nbp_lon - 1
574       off_ini(7,1) = nbp_lon -1  ; off_ini(8,1) = - 1
575! offset point normal
576       off_ini(1,2) = - nbp_lon   ; off_ini(2,2) = - nbp_lon + 1     ; off_ini(3,2) = 1
577       off_ini(4,2) = nbp_lon + 1 ; off_ini(5,2) = nbp_lon           ; off_ini(6,2) = nbp_lon - 1
578       off_ini(7,2) = -1          ; off_ini(8,2) = - nbp_lon - 1
579! offset bord   est
580       off_ini(1,3) = - nbp_lon   ; off_ini(2,3) = - 2 * nbp_lon + 1 ; off_ini(3,3) = - nbp_lon + 1
581       off_ini(4,3) =  1          ; off_ini(5,3) = nbp_lon           ; off_ini(6,3) = nbp_lon - 1
582       off_ini(7,3) = -1          ; off_ini(8,3) = - nbp_lon - 1
583!
584!
585! Attention aux poles
586!
587       DO igrid = 1, knon_glo
588          index = ktindex_glo(igrid)
589          jj = INT((index - 1)/nbp_lon) + 1
590          ij = index - (jj - 1) * nbp_lon
591          correspond(ij,jj) = igrid
592       ENDDO
593       
594       DO igrid = 1, knon_glo
595          iglob = ktindex_glo(igrid)
596         
597          IF (MOD(iglob, nbp_lon) == 1) THEN
598             offset = off_ini(:,1)
599          ELSE IF(MOD(iglob, nbp_lon) == 0) THEN
600             offset = off_ini(:,3)
601          ELSE
602             offset = off_ini(:,2)
603          ENDIF
604         
605          DO i = 1, 8
606             index = iglob + offset(i)
607             ireal = (MIN(MAX(1, index - nbp_lon + 1), klon_glo))
608             IF (pctsrf_glo(ireal) > EPSFRA) THEN
609                jj = INT((index - 1)/nbp_lon) + 1
610                ij = index - (jj - 1) * nbp_lon
611                neighbours_glo(igrid, i) = correspond(ij, jj)
612             ENDIF
613          ENDDO
614       ENDDO
615
616    ENDIF
617   
618    DO i = 1, 8
619      CALL scatter_surf(neighbours_glo(:,i),neighbours(1:knon,i))
620    ENDDO
621  END SUBROUTINE Init_neighbours
622
623!
624!****************************************************************************************
625!
626
627#endif
628
629END MODULE surf_land_orchidee_mod
Note: See TracBrowser for help on using the repository browser.