1 | MODULE mod_clim_def |
---|
2 | ! |
---|
3 | ! |
---|
4 | !**** DEFINE |
---|
5 | ! |
---|
6 | ! Purpose: |
---|
7 | ! Routines CLIM_Define and CLIM_Defport are now in a module. |
---|
8 | ! |
---|
9 | ! Interface: |
---|
10 | ! none |
---|
11 | ! |
---|
12 | ! Method: |
---|
13 | ! Uses assumed shape array method to dimension local arrays. |
---|
14 | ! |
---|
15 | ! External: |
---|
16 | ! none |
---|
17 | ! |
---|
18 | ! Files: |
---|
19 | ! none |
---|
20 | ! |
---|
21 | ! References: |
---|
22 | ! |
---|
23 | ! History: |
---|
24 | ! -------- |
---|
25 | ! Version Programmer Date Description |
---|
26 | ! ------------------------------------------------ |
---|
27 | ! 2.5 A.Caubel 2002/06 created |
---|
28 | ! |
---|
29 | !*----------------------------------------------------------------------- |
---|
30 | |
---|
31 | CONTAINS |
---|
32 | ! |
---|
33 | SUBROUTINE CLIM_Define(id_nports, cdport,kinout,ktype,kparal,kinfo) |
---|
34 | ! |
---|
35 | !* *** Define *** CLIM 2.0 |
---|
36 | ! |
---|
37 | ! purpose: |
---|
38 | ! -------- |
---|
39 | ! define a port |
---|
40 | ! |
---|
41 | ! interface: |
---|
42 | ! ---------- |
---|
43 | ! id_nports : port number of the field |
---|
44 | ! cdport : symbolic name of the field |
---|
45 | ! kinout : port status in/out |
---|
46 | ! ktype : type of data |
---|
47 | ! kparal : type of parallel decomposition |
---|
48 | ! kinfo : output status |
---|
49 | ! |
---|
50 | ! lib mp: |
---|
51 | ! ------- |
---|
52 | ! mpi-1 |
---|
53 | ! |
---|
54 | ! author: |
---|
55 | ! ------- |
---|
56 | ! Eric Sevault - METEO FRANCE |
---|
57 | ! Laurent Terray - CERFACS |
---|
58 | ! Arnaud Caubel - Fecit |
---|
59 | ! ---------------------------------------------------------------- |
---|
60 | #if defined use_comm_MPI1 || defined use_comm_MPI2 || !defined use_comm_MPI1 && !defined use_comm_MPI2 && !defined use_comm_SIPC && !defined use_comm_GMEM && !defined use_comm_PIPE && !defined use_comm_NONE |
---|
61 | USE mod_kinds_oasis |
---|
62 | USE mod_clim |
---|
63 | USE mod_comclim |
---|
64 | ! ---------------------------------------------------------------- |
---|
65 | INTEGER(kind=ip_intwp_p) kinout, ktype, kinfo, id_nports |
---|
66 | INTEGER(kind=ip_intwp_p), DIMENSION(:) :: kparal |
---|
67 | CHARACTER*(*) cdport |
---|
68 | ! ---------------------------------------------------------------- |
---|
69 | ! |
---|
70 | !* 0. First Check |
---|
71 | ! -------------- |
---|
72 | ! |
---|
73 | IF ( nexit.NE.1 ) THEN |
---|
74 | kinfo = CLIM_FastExit |
---|
75 | WRITE(nulprt,FMT='(A)') 'Define - should not be called' |
---|
76 | GO TO 1010 |
---|
77 | ENDIF |
---|
78 | kinfo = CLIM_Ok |
---|
79 | ! |
---|
80 | !* 1. define the port |
---|
81 | ! ------------------ |
---|
82 | ! |
---|
83 | WRITE(nulprt,*) 'Define - port name, status : ',cdport,kinout |
---|
84 | WRITE(nulprt,*) 'Define - data type: ',ktype |
---|
85 | ! |
---|
86 | IF ( kinout.EQ.CLIM_InOut ) THEN |
---|
87 | CALL CLIM_Defport (id_nports,cdport, CLIM_In, ktype, kparal, kinfo ) |
---|
88 | IF (kinfo.EQ.CLIM_Ok) THEN |
---|
89 | CALL CLIM_Defport (id_nports,cdport,CLIM_Out,ktype,kparal,kinfo ) |
---|
90 | ENDIF |
---|
91 | ELSE |
---|
92 | CALL CLIM_Defport ( id_nports,cdport, kinout, ktype, kparal, kinfo ) |
---|
93 | ENDIF |
---|
94 | ! |
---|
95 | ! ---------------------------------------------------------------- |
---|
96 | ! |
---|
97 | 1010 CONTINUE |
---|
98 | CALL FLUSH(nulprt) |
---|
99 | #endif |
---|
100 | RETURN |
---|
101 | END SUBROUTINE CLIM_Define |
---|
102 | ! |
---|
103 | ! ==================================================================== |
---|
104 | |
---|
105 | SUBROUTINE CLIM_Defport(id_nports,cdport,kinout,ktype,kparal,kinfo) |
---|
106 | ! |
---|
107 | !* *** Define *** CLIM 2.2 |
---|
108 | ! |
---|
109 | ! purpose: |
---|
110 | ! -------- |
---|
111 | ! define a port |
---|
112 | ! |
---|
113 | ! interface: |
---|
114 | ! ---------- |
---|
115 | ! id_nports : port number of the field |
---|
116 | ! cdport : symbolic name of the field |
---|
117 | ! kinout : port status in/out |
---|
118 | ! ktype : type of data |
---|
119 | ! kparal : type of parallel decomposition |
---|
120 | ! kinfo : output status |
---|
121 | ! |
---|
122 | ! lib mp: |
---|
123 | ! ------- |
---|
124 | ! mpi-2 |
---|
125 | ! |
---|
126 | ! author: |
---|
127 | ! ------- |
---|
128 | ! Eric Sevault - METEO FRANCE |
---|
129 | ! Laurent Terray - CERFACS |
---|
130 | ! Jean Latour - F.S.E. (mpi-2) |
---|
131 | ! |
---|
132 | ! ---------------------------------------------------------------- |
---|
133 | #if defined use_comm_MPI1 || defined use_comm_MPI2 || !defined use_comm_MPI1 && !defined use_comm_MPI2 && !defined use_comm_SIPC && !defined use_comm_GMEM && !defined use_comm_PIPE && !defined use_comm_NONE |
---|
134 | USE mod_kinds_oasis |
---|
135 | USE mod_clim |
---|
136 | USE mod_comclim |
---|
137 | ! ---------------------------------------------------------------- |
---|
138 | INTEGER(kind=ip_intwp_p) kinout, ktype, kinfo |
---|
139 | INTEGER(kind=ip_intwp_p), DIMENSION(:) :: kparal |
---|
140 | CHARACTER*(*) cdport |
---|
141 | ! ---------------------------------------------------------------- |
---|
142 | INTEGER(kind=ip_intwp_p) ip, is, id_nports |
---|
143 | INTEGER(kind=ip_intwp_p) il_testvar |
---|
144 | REAL(kind=ip_realwp_p) rl_testvar |
---|
145 | REAL(kind=ip_double_p) dl_testvar |
---|
146 | CHARACTER*32 cltest |
---|
147 | ! ---------------------------------------------------------------- |
---|
148 | ! |
---|
149 | !* 1. check if this port already exist |
---|
150 | ! ----------------------------------- |
---|
151 | ! |
---|
152 | cltest= cdport |
---|
153 | il_testvar = 0 |
---|
154 | rl_testvar = 0.0 |
---|
155 | dl_testvar = 0.0 |
---|
156 | ! |
---|
157 | DO ip=1,nports |
---|
158 | IF (cltest.EQ.cports(ip).AND.kinout.EQ.myport(1,ip)) THEN |
---|
159 | kinfo = CLIM_DoubleDef |
---|
160 | WRITE(nulprt,FMT='(A,A)') & |
---|
161 | 'Define - WARNING - duplicate definition of port ', & |
---|
162 | cdport |
---|
163 | GO TO 1010 |
---|
164 | ENDIF |
---|
165 | ENDDO |
---|
166 | ! |
---|
167 | !* 2. save arguments as half a link |
---|
168 | ! -------------------------------- |
---|
169 | ! |
---|
170 | nports = nports + 1 |
---|
171 | id_nports = nports |
---|
172 | cports(nports) = cdport |
---|
173 | ! |
---|
174 | myport(1,nports) = kinout |
---|
175 | myport(5,nports) = 0 |
---|
176 | ! |
---|
177 | ! IF ( ktype.EQ.CLIM_Integer ) THEN |
---|
178 | ! myport(2,nports) = CLIM_Integer |
---|
179 | ! myport(3,nports) = kind(il_testvar) |
---|
180 | ! ELSEIF ( ktype.EQ.CLIM_Real ) THEN |
---|
181 | IF ( ktype.EQ.CLIM_Real ) THEN |
---|
182 | myport(2,nports) = CLIM_Real |
---|
183 | myport(3,nports) = kind(rl_testvar) |
---|
184 | ! ELSEIF ( ktype.EQ.CLIM_Double ) THEN |
---|
185 | ! myport(2,nports) = CLIM_Double |
---|
186 | ! myport(3,nports) = kind(dl_testvar) |
---|
187 | ELSE |
---|
188 | kinfo = CLIM_BadType |
---|
189 | WRITE(nulprt,FMT='(A,I4)') & |
---|
190 | 'Define - WARNING - Bad data type:',ktype |
---|
191 | ENDIF |
---|
192 | ! |
---|
193 | IF (kparal(CLIM_Strategy).EQ.CLIM_Serial) THEN |
---|
194 | ! |
---|
195 | mydist(CLIM_Strategy,nports) = CLIM_Serial |
---|
196 | mydist(CLIM_Segments,nports) = 1 |
---|
197 | mydist(CLIM_Segments+1,nports) = 0 |
---|
198 | mydist(CLIM_Segments+2,nports) = kparal(CLIM_Length) |
---|
199 | myport(4,nports) = kparal(CLIM_Length) |
---|
200 | ! |
---|
201 | ELSEIF (kparal(CLIM_Strategy).EQ.CLIM_Apple) THEN |
---|
202 | ! |
---|
203 | mydist(CLIM_Strategy,nports) = CLIM_Apple |
---|
204 | mydist(CLIM_Segments,nports) = 1 |
---|
205 | mydist(CLIM_Segments+1,nports) = kparal(CLIM_Offset) |
---|
206 | mydist(CLIM_Segments+2,nports) = kparal(CLIM_Length) |
---|
207 | myport(4,nports) = kparal(CLIM_Length) |
---|
208 | ! |
---|
209 | ELSEIF (kparal(CLIM_strategy).EQ.CLIM_Box) THEN |
---|
210 | ! |
---|
211 | mydist(CLIM_Strategy,nports) = CLIM_Box |
---|
212 | mydist(CLIM_Segments,nports) = kparal(CLIM_SizeY) |
---|
213 | DO is=1,kparal(CLIM_SizeY) |
---|
214 | mydist(CLIM_Segments+2*is-1,nports) = & |
---|
215 | kparal(CLIM_Offset) + (is-1) * kparal(CLIM_LdX) |
---|
216 | mydist(CLIM_Segments+2*is,nports) = kparal(CLIM_SizeX) |
---|
217 | ENDDO |
---|
218 | myport(4,nports) = kparal(CLIM_SizeX) * kparal(CLIM_SizeY) |
---|
219 | ! |
---|
220 | ELSEIF (kparal(CLIM_strategy).EQ.CLIM_Orange) THEN |
---|
221 | ! |
---|
222 | mydist(CLIM_Strategy,nports) = CLIM_Orange |
---|
223 | mydist(CLIM_Segments,nports) = kparal(CLIM_Segments) |
---|
224 | myport(4,nports) = 0 |
---|
225 | DO is=1,2*kparal(CLIM_Segments) |
---|
226 | mydist(CLIM_Segments+is,nports) = kparal(CLIM_Segments+is) |
---|
227 | IF (MOD(is,2).EQ.0) THEN |
---|
228 | myport(4,nports) = myport(4,nports) + & |
---|
229 | kparal(CLIM_Segments+is) |
---|
230 | ENDIF |
---|
231 | ENDDO |
---|
232 | ENDIF |
---|
233 | ! |
---|
234 | ! ---------------------------------------------------------------- |
---|
235 | ! |
---|
236 | 1010 CONTINUE |
---|
237 | CALL FLUSH(nulprt) |
---|
238 | #endif |
---|
239 | RETURN |
---|
240 | END SUBROUTINE CLIM_Defport |
---|
241 | END MODULE mod_clim_def |
---|