LMDZ
sumplat_mod.F90
Go to the documentation of this file.
1 MODULE sumplat_mod
2 CONTAINS
3 SUBROUTINE sumplat(KDGL,KPROC,KPROCA,KMYSETA,LDSPLIT,LDEQ_REGIONS,&
4  &kfrstlat,klstlat,kfrstloff,kptrlat,&
5  &kptrfrstlat,kptrlstlat,kptrfloff,&
6  &kmediap,krestm,ldsplitlat)
7 
8 !**** *SUMPLAT * - Initialize gridpoint distrbution in N-S direction
9 
10 ! Purpose.
11 ! --------
12 
13 
14 !** Interface.
15 ! ----------
16 ! *CALL* *SUMPLAT *
17 
18 ! Explicit arguments - input :
19 ! --------------------
20 ! KDGL -last latitude
21 ! KPROC -total number of processors
22 ! KPROCA -number of processors in A direction
23 ! KMYSETA -process number in A direction
24 ! LDSPLIT -true for latitudes shared between sets
25 ! LDEQ_REGIONS -true if eq_regions partitioning
26 
27 ! Explicit arguments - output:
28 ! --------------------
29 ! KMEDIAP -mean number of grid points per PE
30 ! KRESTM -number of PEs with one extra point
31 ! KFRSTLAT -first latitude row on processor
32 ! KLSTLAT -last latitude row on processor
33 ! KFRSTLOFF -offset for first latitude in set
34 ! KPTRLAT -pointer to start of latitude
35 ! KPTRFRSTLAT-pointer to first latitude
36 ! KPTRLSTLAT -pointer to last latitude
37 ! KPTRFLOFF -offset for pointer to first latitude
38 ! LDSPLITLAT -true for latitudes which are split
39 
40 ! Implicit arguments :
41 ! --------------------
42 
43 
44 ! Method.
45 ! -------
46 ! See documentation
47 
48 ! Externals. SUMPLATB and SUEMPLATB.
49 ! ----------
50 
51 ! Reference.
52 ! ----------
53 ! ECMWF Research Department documentation of the IFS
54 
55 ! Author.
56 ! -------
57 ! MPP Group *ECMWF*
58 
59 ! Modifications.
60 ! --------------
61 ! Original : 95-10-01
62 ! David Dent:97-06-02 parameters KFRSTLAT etc added
63 ! JF. Estrade:97-11-13 Adaptation to ALADIN case
64 ! J.Boutahar: 98-07-06 phasing with CY19
65 ! Modified 98-08-10 by K. YESSAD: removal of LRPOLE option + cleanings
66 ! (correct computation of extrapolar latitudes for KPROCL).
67 ! Modified 98-12-07 by K. YESSAD and C. FISCHER: cleaning.
68 ! - merge old sumplat.F and suemplat.F
69 ! - gather 'lelam' code and 'not lelam' code.
70 ! - clean (useless duplication of variables, non doctor features).
71 ! - remodularise according to lelam/not lelam
72 ! -> lelam features in new routine suemplatb.F,
73 ! not lelam features in new routine sumplatb.F
74 ! ------------------------------------------------------------------
75 
76 USE parkind1 ,ONLY : jpim ,jprb
77 
78 USE tpm_geometry
79 USE tpm_distr
80 
81 USE sumplatb_mod
83 
84 IMPLICIT NONE
85 
86 
87 ! * DUMMY:
88 INTEGER(KIND=JPIM),INTENT(OUT) :: KMEDIAP
89 INTEGER(KIND=JPIM),INTENT(OUT) :: KRESTM
90 INTEGER(KIND=JPIM),INTENT(IN) :: KDGL
91 INTEGER(KIND=JPIM),INTENT(IN) :: KPROC
92 INTEGER(KIND=JPIM),INTENT(IN) :: KPROCA
93 INTEGER(KIND=JPIM),INTENT(IN) :: KMYSETA
94 INTEGER(KIND=JPIM),INTENT(OUT) :: KFRSTLAT(:)
95 INTEGER(KIND=JPIM),INTENT(OUT) :: KLSTLAT(:)
96 INTEGER(KIND=JPIM),INTENT(OUT) :: KFRSTLOFF
97 INTEGER(KIND=JPIM),INTENT(OUT) :: KPTRLAT(:)
98 INTEGER(KIND=JPIM),INTENT(OUT) :: KPTRFRSTLAT(:)
99 INTEGER(KIND=JPIM),INTENT(OUT) :: KPTRLSTLAT(:)
100 INTEGER(KIND=JPIM),INTENT(OUT) :: KPTRFLOFF
101 LOGICAL,INTENT(IN) :: LDSPLIT
102 LOGICAL,INTENT(IN) :: LDEQ_REGIONS
103 LOGICAL,INTENT(OUT) :: LDSPLITLAT(:)
104 
105 ! * LOCAL:
106 ! === END OF INTERFACE BLOCK ===
107 INTEGER(KIND=JPIM) :: INDIC(kproca),ILAST(kproca)
108 
109 ! LOCAL INTEGER SCALARS
110 INTEGER(KIND=JPIM) :: IPTRLATITUDE, JA, JGL
111 
112 
113 ! -----------------------------------------------------------------
114 
115 !* 1. CODE DEPENDING ON 'LELAM': COMPUTATION OF
116 ! KMEDIAP, KRESTM, INDIC, ILAST.
117 ! -----------------------------------------
118 
119 
120 IF( ldeq_regions )THEN
121  CALL sumplatbeq(1,kdgl,kproc,kproca,g%NLOEN,ldsplit,ldeq_regions,&
122  &kmediap,krestm,indic,ilast)
123 ELSE
124  CALL sumplatb(1,kdgl,kproca,g%NLOEN,ldsplit,&
125  &kmediap,krestm,indic,ilast)
126 ENDIF
127 
128 ! -----------------------------------------------------------------
129 
130 !* 2. CODE NOT DEPENDING ON 'LELAM': COMPUTATION OF
131 ! KFRSTLAT TO LDSPLITLAT.
132 ! ---------------------------------------------
133 
134 
135 ! * Computation of first and last latitude of processor sets
136 ! ----------- in grid-point-space -----------------------
137 
138 kfrstlat(1) = 1
139 klstlat(kproca) = kdgl
140 DO ja=1,kproca-1
141 !!$ IF(MYPROC==1)THEN
142 !!$ WRITE(0,'("SUMPLAT_MOD: JA=",I3," ILAST=",I3," INDIC=",I3)')&
143 !!$ &JA,ILAST(JA),INDIC(JA)
144 !!$ ENDIF
145  IF ((.NOT. ldsplit) .OR. indic(ja) == 0) THEN
146  kfrstlat(ja+1) = ilast(ja) + 1
147  klstlat(ja) = ilast(ja)
148  ELSE
149  kfrstlat(ja+1) = indic(ja)
150  klstlat(ja) = indic(ja)
151  ENDIF
152 ENDDO
153 kfrstloff=kfrstlat(kmyseta)-1
154 
155 ! * Initialise following data structures:-
156 ! NPTRLAT (pointer to the start of each latitude)
157 ! LSPLITLAT (TRUE if latitude is split over two A sets)
158 ! NPTRFRSTLAT (pointer to the first latitude of each A set)
159 ! NPTRLSTLAT (pointer to the last latitude of each A set)
160 
161 DO jgl=1,kdgl
162  kptrlat(jgl)=-999
163  ldsplitlat(jgl)=.false.
164 ENDDO
165 iptrlatitude=0
166 DO ja=1,kproca
167  DO jgl=kfrstlat(ja),klstlat(ja)
168  iptrlatitude=iptrlatitude+1
169  ldsplitlat(jgl)=.true.
170  IF( kptrlat(jgl) == -999 )THEN
171  kptrlat(jgl)=iptrlatitude
172  ldsplitlat(jgl)=.false.
173  ENDIF
174  ENDDO
175 ENDDO
176 DO ja=1,kproca
177  IF( ldsplitlat(kfrstlat(ja)) .AND. ja /= 1)THEN
178  kptrfrstlat(ja)=kptrlat(kfrstlat(ja))+1
179  ELSE
180  kptrfrstlat(ja)=kptrlat(kfrstlat(ja))
181  ENDIF
182  IF( ldsplitlat(klstlat(ja)) .AND. ja == kproca)THEN
183  kptrlstlat(ja)=kptrlat(klstlat(ja))+1
184  ELSE
185  kptrlstlat(ja)=kptrlat(klstlat(ja))
186  ENDIF
187 ENDDO
188 kptrfloff=kptrfrstlat(kmyseta)-1
189 !!$IF(MYPROC==1)THEN
190 !!$ DO JGL=1,KDGL
191 !!$ WRITE(0,'("SUMPLAT_MOD: JGL=",I3," KPTRLAT=",I3," LDSPLITLAT=",L4)')&
192 !!$ & JGL,KPTRLAT(JGL),LDSPLITLAT(JGL)
193 !!$ ENDDO
194 !!$ DO JA=1,KPROCA
195 !!$ WRITE(0,'("SUMPLAT_MOD: JA=",I3," KFRSTLAT=",I3," KLSTLAT=",I3,&
196 !!$ & " KPTRFRSTLAT=",I3," KPTRLSTLAT=",I3)')&
197 !!$ & JA,KFRSTLAT(JA),KLSTLAT(JA),KPTRFRSTLAT(JA),KPTRLSTLAT(JA)
198 !!$ ENDDO
199 !!$ENDIF
200 
201 ! ------------------------------------------------------------------
202 
203 END SUBROUTINE sumplat
204 END MODULE sumplat_mod
subroutine sumplatbeq(KDGSA, KDGL, KPROC, KPROCA, KLOENG, LDSPLIT, LDEQ_REGIONS, KMEDIAP, KRESTM, KINDIC, KLAST)
!$Id mode_top_bound COMMON comconstr g
Definition: comconst.h:7
subroutine sumplat(KDGL, KPROC, KPROCA, KMYSETA, LDSPLIT, LDEQ_REGIONS, KFRSTLAT, KLSTLAT, KFRSTLOFF, KPTRLAT, KPTRFRSTLAT, KPTRLSTLAT, KPTRFLOFF, KMEDIAP, KRESTM, LDSPLITLAT)
Definition: sumplat_mod.F90:7
!$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
Definition: calcul_STDlev.h:26
integer, parameter jprb
Definition: parkind1.F90:31
!$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
integer, parameter jpim
Definition: parkind1.F90:13
subroutine sumplatb(KDGSA, KDGL, KPROCA, KLOENG, LDSPLIT, KMEDIAP, KRESTM, KINDIC, KLAST)
Definition: sumplatb_mod.F90:5