Ticket #792: read_couplepar.F

File read_couplepar.F, 11.6 KB (added by m.hadfield, 6 years ago)
Line 
1#include "cppdefs.h"
2#if defined MODEL_COUPLING && defined MCT_LIB
3 SUBROUTINE read_CouplePar (model)
4!
5!svn $Id$
6!================================================== Hernan G. Arango ===
7! Copyright (c) 2002-2018 The ROMS/TOMS Group !
8! Licensed under a MIT/X style license !
9! See License_ROMS.txt !
10!=======================================================================
11! !
12! This routine reads and reports multiple model coupling input !
13! parameters. !
14! !
15!=======================================================================
16!
17 USE mod_param
18 USE mod_parallel
19 USE mod_coupler
20 USE mod_iounits
21 USE mod_scalars
22!
23 USE inp_decode_mod
24# ifdef DISTRIBUTE
25!
26 USE distribute_mod, ONLY : mp_bcasts
27# endif
28!
29 implicit none
30!
31! Imported variable declarations.
32!
33 integer, intent(in) :: model
34!
35! Local variable declarations.
36!
37 logical :: Lwrite
38 logical :: Lvalue(1)
39
40 integer :: Npts, Nval, i, ic, j, inp, ng, out, status
41 integer :: Ivalue(1)
42
43 real(r8), dimension(nRval) :: Rval
44
45 real(r8), allocatable :: MyRval(:)
46
47 character (len=40) :: KeyWord
48 character (len=256) :: line
49 character (len=256) :: Cname
50 character (len=256), dimension(nCval) :: Cval
51!
52!-----------------------------------------------------------------------
53! Determine coupling standard input file name. In distributed-memory,
54! this name is assigned at the executtion command line and processed
55! with the Unix routine GETARG. The ROMS/TOMS input parameter script
56! name is specified in this coupling script.
57!-----------------------------------------------------------------------
58!
59# ifdef DISTRIBUTE
60 Lwrite=Master
61 inp=1
62 out=stdout
63!
64 IF (MyRank.eq.0) CALL my_getarg (1,Cname)
65 CALL mp_bcasts (1, model, Cname)
66 IF (MyRank.eq.0) THEN
67 WRITE(stdout,*) 'Coupled Input File name = ', TRIM(Cname)
68 END IF
69 OPEN (inp, FILE=TRIM(Cname), FORM='formatted', STATUS='old', &
70 & ERR=10)
71 GO TO 30
72 10 WRITE (stdout,20)
73 IF (Master) WRITE(stdout,*) 'MyRank = ', MyRank, TRIM(Cname)
74 exit_flag=4
75 RETURN
76 20 FORMAT (/,' INP_PAR - Unable to open coupling input script.', &
77 & /,11x,'In distributed-memory applications, the input', &
78 & /,11x,'script file is processed in parallel. The Unix', &
79 & /,11x,'routine GETARG is used to get script file name.', &
80 & /,11x,'For example, in MPI applications make sure that', &
81 & /,11x,'command line is something like:',/, &
82 & /,11x,'mpirun -np 4 masterM coupling.in',/, &
83 & /,11x,'and not',/, &
84 & /,11x,'mpirun -np 4 masterM < coupling.in',/)
85 30 CONTINUE
86# else
87 Lwrite=Master
88 inp=stdinp
89 out=stdout
90# endif
91!
92!-----------------------------------------------------------------------
93! Read in multiple models coupling parameters. Then, load input
94! data into module. Take into account nested grid configurations.
95!-----------------------------------------------------------------------
96!
97 DO WHILE (.TRUE.)
98 READ (inp,'(a)',ERR=40,END=50) line
99 status=decode_line(line, KeyWord, Nval, Cval, Rval)
100 IF (status.gt.0) THEN
101 SELECT CASE (TRIM(KeyWord))
102 CASE ('Nmodels')
103 Npts=load_i(Nval, Rval, 1, Ivalue)
104 Nmodels=Ivalue(1)
105 IF (.not.allocated(MyRval) ) THEN
106 allocate ( MyRval(Nmodels) )
107 END IF
108 IF (.not.allocated(OrderLabel) ) THEN
109 allocate ( OrderLabel(Nmodels) )
110 END IF
111 IF (.not.allocated(Nthreads) ) THEN
112 allocate ( Nthreads(Nmodels) )
113 Nthreads=0
114 END IF
115 IF (.not.allocated(TimeInterval) ) THEN
116 allocate ( TimeInterval(Nmodels,Nmodels) )
117 TimeInterval=0.0_r8
118 END IF
119 IF (.not.allocated(INPname) ) THEN
120 allocate ( INPname(Nmodels) )
121 END IF
122 IF (.not.allocated(Nexport) ) THEN
123 allocate ( Nexport(Nmodels) )
124 Nexport=0
125 END IF
126 IF (.not.allocated(Nimport) ) THEN
127 allocate ( Nimport(Nmodels) )
128 Nimport=0
129 END IF
130 CASE ('Lreport')
131 Npts=load_l(Nval, Cval, 1, Lvalue)
132 Lreport=Lvalue(1)
133 CASE ('OrderLabel')
134 DO i=1,Nmodels
135 IF (i.eq.Nval) THEN
136 OrderLabel(i)=TRIM(ADJUSTL(Cval(Nval)))
137 IF (INDEX(TRIM(OrderLabel(i)),'ocean').ne.0) THEN
138 Iocean=i
139 ELSE IF (INDEX(TRIM(OrderLabel(i)),'waves').ne.0) THEN
140 Iwaves=i
141 ELSE IF (INDEX(TRIM(OrderLabel(i)),'atmos').ne.0) THEN
142 Iatmos=i
143 END IF
144 END IF
145 END DO
146 CASE ('Nthreads(ocean)')
147 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
148 Npts=load_i(Nval, Rval, 1, Ivalue)
149 Nthreads(Iocean)=Ivalue(1)
150 END IF
151 CASE ('Nthreads(waves)')
152 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
153 Npts=load_i(Nval, Rval, 1, Ivalue)
154 Nthreads(Iwaves)=Ivalue(1)
155 END IF
156 CASE ('Nthreads(atmos)')
157 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
158 Npts=load_i(Nval, Rval, 1, Ivalue)
159 Nthreads(Iatmos)=Ivalue(1)
160 END IF
161 CASE ('TimeInterval')
162 Npts=load_r(Nval, Rval, Nmodels, MyRval)
163 ic=0
164 DO j=1,Nmodels
165 DO i=1,Nmodels
166 IF (i.gt.j) THEN
167 ic=ic+1
168 TimeInterval(i,j)=MyRval(ic)
169 TimeInterval(j,i)=MyRval(ic)
170 END IF
171 END DO
172 END DO
173 CASE ('INPname(ocean)')
174 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
175 INPname(Iocean)=TRIM(ADJUSTL(Cval(Nval)))
176 Iname=TRIM(INPname(Iocean))
177 END IF
178 CASE ('INPname(waves)')
179 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
180 INPname(Iwaves)=TRIM(ADJUSTL(Cval(Nval)))
181 END IF
182 CASE ('INPname(atmos)')
183 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
184 INPname(Iatmos)=TRIM(ADJUSTL(Cval(Nval)))
185 END IF
186 CASE ('CPLname')
187 CPLname=TRIM(ADJUSTL(Cval(Nval)))
188 CASE ('Nexport(ocean)')
189 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
190 Npts=load_i(Nval, Rval, 1, Ivalue)
191 Nexport(Iocean)=Ivalue(1)
192 END IF
193 CASE ('Nexport(waves)')
194 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
195 Npts=load_i(Nval, Rval, 1, Ivalue)
196 Nexport(Iwaves)=Ivalue(1)
197 END IF
198 CASE ('Nexport(atmos)')
199 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
200 Npts=load_i(Nval, Rval, 1, Ivalue)
201 Nexport(Iatmos)=Ivalue(1)
202 END IF
203 CASE ('Export(ocean)')
204 IF (.not.allocated(Export)) THEN
205 allocate ( Export(Nmodels) )
206 DO i=1,Nmodels
207 allocate ( Export(i)%code(MAX(1,Nexport(i))) )
208 Export(i)%code=' '
209 END DO
210 END IF
211 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
212 IF (Nval.le.Nexport(Iocean)) THEN
213 Export(Iocean)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
214 END IF
215 END IF
216 CASE ('Export(waves)')
217 IF (.not.allocated(Export)) THEN
218 allocate ( Export(Nmodels) )
219 DO i=1,Nmodels
220 allocate ( Export(i)%code(MAX(1,Nexport(i))) )
221 Export(i)%code=' '
222 END DO
223 END IF
224 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
225 IF (Nval.le.Nexport(Iwaves)) THEN
226 Export(Iwaves)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
227 END IF
228 END IF
229 CASE ('Export(atmos)')
230 IF (.not.allocated(Export)) THEN
231 allocate ( Export(Nmodels) )
232 DO i=1,Nmodels
233 allocate ( Export(i)%code(MAX(1,Nexport(i))) )
234 Export(i)%code=' '
235 END DO
236 END IF
237 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
238 IF (Nval.le.Nexport(Iatmos)) THEN
239 Export(Iatmos)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
240 END IF
241 END IF
242 CASE ('Nimport(ocean)')
243 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
244 Npts=load_i(Nval, Rval, 1, Ivalue)
245 Nimport(Iocean)=Ivalue(1)
246 END IF
247 CASE ('Nimport(waves)')
248 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
249 Npts=load_i(Nval, Rval, 1, Ivalue)
250 Nimport(Iwaves)=Ivalue(1)
251 END IF
252 CASE ('Nimport(atmos)')
253 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
254 Npts=load_i(Nval, Rval, 1, Ivalue)
255 Nimport(Iatmos)=Ivalue(1)
256 END IF
257 CASE ('Import(ocean)')
258 IF (.not.allocated(Import)) THEN
259 allocate ( Import(Nmodels) )
260 DO i=1,Nmodels
261 allocate ( Import(i)%code(MAX(1,Nimport(i))) )
262 Import(i)%code=' '
263 END DO
264 END IF
265 IF ((0.lt.Iocean).and.(Iocean.le.Nmodels)) THEN
266 IF (Nval.le.Nimport(Iocean)) THEN
267 Import(Iocean)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
268 END IF
269 END IF
270 CASE ('Import(waves)')
271 IF (.not.allocated(Import)) THEN
272 allocate ( Import(Nmodels) )
273 DO i=1,Nmodels
274 allocate ( Import(i)%code(MAX(1,Nimport(i))) )
275 Import(i)%code=' '
276 END DO
277 END IF
278 IF ((0.lt.Iwaves).and.(Iwaves.le.Nmodels)) THEN
279 IF (Nval.le.Nimport(Iwaves)) THEN
280 Import(Iwaves)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
281 END IF
282 END IF
283 CASE ('Import(atmos)')
284 IF (.not.allocated(Import)) THEN
285 allocate ( Import(Nmodels) )
286 DO i=1,Nmodels
287 allocate ( Import(i)%code(MAX(1,Nimport(i))) )
288 Import(i)%code=' '
289 END DO
290 END IF
291 IF ((0.lt.Iatmos).and.(Iatmos.le.Nmodels)) THEN
292 IF (Nval.le.Nimport(Iatmos)) THEN
293 Import(Iatmos)%code(Nval)=TRIM(ADJUSTL(Cval(Nval)))
294 END IF
295 END IF
296 END SELECT
297 END IF
298 END DO
299 40 IF (Master) WRITE (out,60) line
300 exit_flag=4
301 RETURN
302 50 CLOSE (inp)
303
304 60 FORMAT (/,' READ_CouplePar - Error while processing line: ',/,a)
305
306 RETURN
307 END SUBROUTINE read_CouplePar
308#else
309 SUBROUTINE read_CouplePar
310 END SUBROUTINE read_CouplePar
311#endif