1 | include(dom.inc)
2 |
3 | SUBROUTINE read_data_slave
4 |
5 | ! ================================================================!
6 | ! !
7 | ! read_data_slave.F : Reads all data from input files and !
8 | ! allocates slave vectors. !
9 | ! !
10 | ! out : Slave-side global vectors with initialized !
11 | ! data obtained from *.in files. !
12 | ! !
13 | ! author : J. AMAYA (January 2009) !
14 | ! Modified by : T. PEDOT (November 2010) Add Probes !
15 | ! !
16 | ! ================================================================!
17 |
18 | USE mod_inout
19 | USE mod_slave
20 | USE mod_pmm
21 |
22 | IMPLICIT NONE
23 |
24 | INCLUDE 'dom_constants.h'
25 | include 'pmm_constants.h'
26 |
27 | DOM_INT :: i, j, k, icell, idir, icoef
28 | DOM_INT :: n, i_bande, patch
29 | DOM_INT :: iface, nbnodes, ios
30 |
31 | DOM_REAL :: ddata
32 |
33 | CHARACTER*80 :: c2cfile
34 | CHARACTER*80 :: normfile, volafile, facesfile
35 | CHARACTER*80 :: kextfile
36 | CHARACTER*80 :: clpropfile, cldatfile, fcfile
37 | CHARACTER*80 :: snbwnfile,cnodefile, quadfile
38 | CHARACTER*80 :: facfile, propfile, progfile
39 | CHARACTER*80 :: lspecfile , sspecfile
40 | CHARACTER*80 :: wsggfile, trackfile
41 |
42 | ! Tabulation variables
43 | CHARACTER*64 :: tabfile
44 | DOM_REAL :: MH2O, MCO2, MCO
45 |
46 | ! --------------------!
47 | ! Loop over all nodes !
48 | ! --------------------!
49 |
50 | kextfile = path(1:len_trim(path))//'/K_Extinction.in'
51 | propfile = path(1:len_trim(path))//'/Properties.in'
52 |
53 | OPEN(FILE_KEXT , FILE=kextfile , FORM='UNFORMATTED')
54 | OPEN(FILE_PROP , FILE=propfile , FORM='UNFORMATTED')
55 |
56 | IF (ALLOCATED(s_celldata)) DEALLOCATE(s_celldata)
57 | IF (ALLOCATED(s_k_scat)) DEALLOCATE(s_k_scat)
58 | IF (ALLOCATED(s_kabs_gray)) DEALLOCATE(s_kabs_gray)
59 |
60 | ALLOCATE(s_celldata (8,is_nnodes))
61 | ALLOCATE(s_k_scat (is_nnodes))
62 | IF ( mediumtype.eq.'GRAY' ) THEN
63 | ALLOCATE(s_kabs_gray (is_nnodes))
64 | ENDIF
65 |
66 | DO i=1,is_nnodes
67 |
68 | READ(FILE_PROP) icell, (s_celldata(j,icell),j=1,8)
69 |
70 | IF ( mediumtype.eq.'GRAY' ) THEN
71 | READ(FILE_KEXT) icell,s_kabs_gray(icell),s_k_scat(icell)
72 | ELSE
73 | READ(FILE_KEXT) icell,ddata,s_k_scat(icell)
74 | ENDIF
75 |
76 | ENDDO
77 |
78 | CLOSE(FILE_PROP)
79 | CLOSE(FILE_KEXT)
80 |
81 | ! --------------------!
82 | ! Loop over all cells !
83 | ! --------------------!
84 |
85 | cnodefile = path(1:len_trim(path))//'/Cellnodes.in'
86 | c2cfile = path(1:len_trim(path))//'/Cell2cells.in'
87 | clpropfile = path(1:len_trim(path))//'/CLProperties.in'
88 | normfile = path(1:len_trim(path))//'/Normals.in'
89 | volafile = path(1:len_trim(path))//'/Volumesareas.in'
90 |
91 | OPEN(FILE_CLNOD, FILE=cnodefile , FORM='UNFORMATTED')
92 | OPEN(FILE_C2C , FILE=c2cfile, FORM='UNFORMATTED')
93 | OPEN(FILE_CLPRO, FILE=clpropfile, FORM='UNFORMATTED')
94 | OPEN(FILE_NORM , FILE=normfile , FORM='UNFORMATTED')
95 | OPEN(FILE_VOLA , FILE=volafile , FORM='UNFORMATTED')
96 |
97 | IF (ALLOCATED(is_cnodes)) DEALLOCATE(is_cnodes)
98 | IF (ALLOCATED(is_cnnode)) DEALLOCATE(is_cnnode)
99 | IF (ALLOCATED(is_nfcelt)) DEALLOCATE(is_nfcelt)
100 | IF (ALLOCATED(is_neighs)) DEALLOCATE(is_neighs)
101 | IF (ALLOCATED(s_norm)) DEALLOCATE(s_norm)
102 | IF (ALLOCATED(s_V)) DEALLOCATE(s_V)
103 | IF (ALLOCATED(s_S)) DEALLOCATE(s_S)
104 |
105 | ALLOCATE(is_cnodes (is_ncells))
106 | ALLOCATE(is_cnnode (MAX_NNODES_CELL,is_ncells))
107 | ALLOCATE(is_nfcelt (is_ncells))
108 | ALLOCATE(is_neighs (2*is_nfacesmax,is_ncells))
109 | ALLOCATE(s_norm (3,is_nfacesmax,is_ncells))
110 | ALLOCATE(s_V (is_ncells))
111 | ALLOCATE(s_S (is_nfacesmax,is_ncells))
112 |
113 | is_neighs = 0
114 |
115 | ! WRITE(*,*) pmm_rank," >> SLAVE: Reading *.in files"
116 |
117 | DO i=1,is_ncells
118 |
119 | ! print*, pmm_rank," reading cell", i
120 |
121 | READ(FILE_CLNOD) icell, is_cnodes(i), &
122 | & (is_cnnode(j,i),j=1,is_cnodes(i))
123 |
124 | READ(FILE_C2C) icell, &
125 | & is_nfcelt(icell), &
126 | & (is_neighs(j,icell),j=1,(2*is_nfcelt(icell)))
127 |
128 |
129 | READ(FILE_CLPRO) icell, &
130 | & is_nfcelt(icell), &
131 | & (ddata,patch,j=1,is_nfcelt(icell))
132 |
133 | READ(FILE_NORM) icell, &
134 | & is_nfcelt(icell), &
135 | & ((s_norm(k,j,icell),k=1,3),j=1,is_nfcelt(icell))
136 |
137 | READ(FILE_VOLA) icell, &
138 | & is_nfcelt(icell), &
139 | & s_V(icell), &
140 | & (s_S(j,icell),j=1,is_nfcelt(icell))
141 |
142 | ENDDO
143 |
144 | CLOSE(FILE_CLNOD)
145 | CLOSE(FILE_C2C)
146 | CLOSE(FILE_CLPRO)
147 | CLOSE(FILE_NORM)
148 | CLOSE(FILE_VOLA)
149 |
150 | ! ----------------------!
151 | ! Reading boundary data !
152 | ! ----------------------!
153 |
154 | cldatfile = path(1:len_trim(path))//'/CLdata.in'
155 | OPEN(FILE_CLDAT, FILE=cldatfile , FORM='UNFORMATTED')
156 |
157 | IF (ALLOCATED(is_bcell)) DEALLOCATE(is_bcell)
158 | IF (ALLOCATED(is_bface)) DEALLOCATE(is_bface)
159 | IF (ALLOCATED(s_epsil)) DEALLOCATE(s_epsil)
160 | IF (ALLOCATED(s_Tf)) DEALLOCATE(s_Tf)
161 |
162 | ALLOCATE(is_bcell (is_nbfaces))
163 | ALLOCATE(is_bface (is_nbfaces))
164 | ALLOCATE(s_epsil (is_nbfaces))
165 | ALLOCATE(s_Tf (is_nbfaces))
166 |
167 | DO i = 1, is_nbfaces
168 |
169 | READ(FILE_CLDAT) is_bcell(i), is_bface(i), s_epsil(i), s_Tf(i)
170 |
171 | ENDDO
172 |
173 | ! TEST
174 | ! print*, pmm_rank," TEST: Tf =", s_Tf
175 | ! print*, pmm_rank," TEST: epsil=", s_epsil
176 |
177 | CLOSE(FILE_CLDAT)
178 |
179 | IF (mediumtype.ne.'SNB-CK') THEN
180 |
181 | IF (ALLOCATED(is_facenodes)) DEALLOCATE(is_facenodes)
182 | ALLOCATE(is_facenodes(is_nfacesmax, is_nfaces))
183 | is_facenodes = 0
184 |
185 | fcfile = path(1:len_trim(path))//'/Facelist.in'
186 | OPEN(FILE_FC ,FILE=fcfile,FORM='UNFORMATTED')
187 | DO i=1, is_nfaces
188 | READ(FILE_FC) iface, nbnodes, &
189 | & (is_facenodes(j,i),j=2,nbnodes+1)
190 | is_facenodes(1,i) = nbnodes
191 | ENDDO
192 | CLOSE(FILE_FC)
193 |
194 | ENDIF
195 |
196 | ! ---------------------------------------!
197 | ! Reading pathway and angular quadrature !
198 | ! ---------------------------------------!
199 |
200 | quadfile = path(1:len_trim(path))//'/Quadrature.in'
201 | progfile = path(1:len_trim(path))//'/Progress.in'
202 |
203 | OPEN(FILE_QUADR, FILE=quadfile , FORM='UNFORMATTED')
204 | OPEN(FILE_PROG , FILE=progfile , FORM='UNFORMATTED')
205 |
206 | IF (ALLOCATED(s_mu)) DEALLOCATE(s_mu)
207 | IF (ALLOCATED(s_eta)) DEALLOCATE(s_eta)
208 | IF (ALLOCATED(s_ksi)) DEALLOCATE(s_ksi)
209 | IF (ALLOCATED(s_w)) DEALLOCATE(s_w)
210 | IF (ALLOCATED(is_pathway)) DEALLOCATE(is_pathway)
211 |
212 | ALLOCATE(s_mu (is_ndir))
213 | ALLOCATE(s_eta (is_ndir))
214 | ALLOCATE(s_ksi (is_ndir))
215 | ALLOCATE(s_w (is_ndir))
216 | ALLOCATE(is_pathway (is_ncells,is_ndir))
217 |
218 | i = 1
219 | j = 1
220 | DO WHILE (i.lt.1000)
221 |
222 | IF ( (i.ge.is_dird).and.(i.le.is_dirf) ) THEN
223 | READ(FILE_QUADR) s_mu(j), s_eta(j), s_ksi(j), s_w(j)
224 | READ(FILE_PROG) (is_pathway(n,j), n=1, is_ncells)
225 | j = j + 1
226 | ELSE
227 | READ(FILE_QUADR)
228 | READ(FILE_PROG)
229 | ENDIF
230 |
231 | IF (i.ge.is_dirf) THEN
232 | i = 2000
233 | ENDIF
234 |
235 | i = i + 1
236 |
237 | ENDDO
238 |
239 | CLOSE(FILE_QUADR)
240 | CLOSE(FILE_PROG)
241 |
242 | ! -------------------------------------------!
243 | ! Read data for exponential band integration !
244 | ! -------------------------------------------!
245 |
246 | IF (spascheme.eq.EXPON) THEN
247 |
248 | lspecfile = path(1:len_trim(path))//'/L_SPEC.in'
249 | sspecfile = path(1:len_trim(path))//'/S_SPEC.in'
250 |
251 | OPEN(FILE_LSPEC,FILE=lspecfile,FORM='unformatted')
252 | OPEN(FILE_SSPEC,FILE=sspecfile,FORM='unformatted')
253 |
254 | IF (ALLOCATED(s_maxlen)) DEALLOCATE(s_maxlen)
255 | IF (ALLOCATED(s_ss)) DEALLOCATE(s_ss)
256 | ALLOCATE(s_maxlen (is_ncells,is_ndir))
257 | ALLOCATE(s_ss (is_nfacesmax,is_ncells,is_ndir))
258 |
259 | s_ss =0.
260 | i = 1
261 | j = 1
262 | DO WHILE (i.lt.1000)
263 |
264 | IF ( (i.ge.is_dird).and.(i.le.is_dirf) ) THEN
265 | READ(FILE_LSPEC) (s_maxlen(icell,idir), &
266 | & icell=1,is_ncells)
267 | READ(FILE_SSPEC)((s_ss(icoef,icell,idir), &
268 | & icell=1,is_ncells),icoef=1,4)
269 | j = j + 1
270 | ELSE
271 | READ(FILE_LSPEC)
272 | READ(FILE_SSPEC)
273 | ENDIF
274 |
275 | IF (i.ge.is_dirf) THEN
276 | i = 2000
277 | ENDIF
278 |
279 | i = i + 1
280 |
281 | ENDDO
282 |
283 | CLOSE(FILE_LSPEC)
284 | CLOSE(FILE_SSPEC)
285 |
286 | ENDIF
287 |
288 | ! ------------!
289 | ! Read probes !
290 | ! ------------!
291 |
292 | trackfile = path(1:len_trim(path))//'/Track.in'
293 | OPEN(FILE_TRACK, FILE=trackfile , FORM='FORMATTED', IOSTAT =ios,&
294 | & STATUS='old')
295 |
296 | is_nprobes = 0
297 | IF(ios.eq.0) THEN
298 |
299 | IF (ALLOCATED(s_norm_probe)) DEALLOCATE(s_norm_probe)
300 | IF (ALLOCATED(is_norm_probe)) DEALLOCATE(is_norm_probe)
301 | IF (ALLOCATED(is_pcells)) DEALLOCATE(is_pcells)
302 |
303 | READ(FILE_TRACK,*) is_nprobes
304 | ALLOCATE(s_norm_probe(3,is_nprobes))
305 | s_norm_probe(:,:)=0.0
306 | ALLOCATE(is_norm_probe(is_nprobes))
307 | is_norm_probe(:)=0
308 |
309 | ! The 3 first row of s_norm_probe are coordinates
310 | ! the is_norm_probe is the number of the probe cell
311 |
312 | DO i=1,is_nprobes
313 |
314 | READ(FILE_TRACK,*) icell,is_norm_probe(i), &
315 | & (s_norm_probe(k,i) ,k=1,3)
316 |
317 | ENDDO
318 | i=1
319 | IF(is_nprobes.gt.0) THEN
320 | ALLOCATE(is_pcells(is_ncells))
321 | is_pcells(:) = 0
322 |
323 | ! The probes must be shorten by incresing order
324 | DO i=1,is_nprobes
325 | DO icell=1,is_ncells
326 | IF(icell.eq.is_norm_probe(i)) THEN
327 | is_pcells(icell) = i
328 | ENDIF
329 | ENDDO
330 | ENDDO
331 |
332 | ENDIF
333 |
334 | ENDIF
335 |
336 | CLOSE(FILE_TRACK)
337 |
338 | ! ---------------------------------!
339 | ! Read spectral data for each band !
340 | ! ---------------------------------!
341 | is_ngaz = 3
342 | ALLOCATE(is_nbandes(is_ngaz))
343 | is_nbandes = 0
344 | is_nbandes(GAZ_CO) = 48
345 | is_nbandes(GAZ_C) = 96
346 | is_nbandes(GAZ_H) = 367
347 |
348 | is_nallbandes = 371
349 |
350 | ! WRITE(*,*) pmm_rank," >> SLAVE: Reading spectral data"
351 |
352 | snbwnfile = pathspec(1:len_trim(pathspec))//'/SNBWN'
353 |
354 | IF (mediumtype.ne.'GRAY') THEN
355 | ! ----------------------------------------------!
356 | ! Allocate and set properties for radiating gaz !
357 | ! (to be changed for N gaz radiation) !
358 | ! ----------------------------------------------!
359 | IF (ALLOCATED(s_KCO)) DEALLOCATE(s_KCO)
360 | IF (ALLOCATED(s_KC)) DEALLOCATE(s_KC)
361 | IF (ALLOCATED(s_KH)) DEALLOCATE(s_KH)
362 | IF (ALLOCATED(s_DCO)) DEALLOCATE(s_DCO)
363 | IF (ALLOCATED(s_DC)) DEALLOCATE(s_DC)
364 | IF (ALLOCATED(s_DH)) DEALLOCATE(s_DH)
365 | ALLOCATE(s_KCO (14,is_nbandes(GAZ_CO)))
366 | ALLOCATE(s_KC (14,is_nbandes(GAZ_C)))
367 | ALLOCATE(s_KH (14,is_nbandes(GAZ_H)))
368 | ALLOCATE(s_DCO (14,is_nbandes(GAZ_CO)))
369 | ALLOCAte(s_DC (14,is_nbandes(GAZ_C)))
370 | ALLOCATE(s_DH (14,is_nbandes(GAZ_H)))
371 |
372 | ! ------------------------------------!
373 | ! Read spectral properties of gases !
374 | ! ------------------------------------!
375 |
376 | ! WRITE(*,*) pmm_rank," >> SLAVE: Reading gas properties"
377 | IF((mediumtype.ne.'GRAY').and.(mediumtype.ne.'WSGG')) THEN
378 | CALL PARAM_SLAVE(pathspec,nb_base)
379 | ENDIF
380 |
381 | IF (ALLOCATED(s_all_WVNB)) DEALLOCATE(s_all_WVNB)
382 | IF (ALLOCATED(s_all_DWVNB)) DEALLOCATE(s_all_DWVNB)
383 | ALLOCATE(s_all_WVNB (is_nallbandes))
384 | ALLOCATE(s_all_DWVNB (is_nallbandes))
385 |
386 | OPEN(FILE_SNBWN,FILE=snbwnfile)
387 | i_bande=1
388 |
389 | DO WHILE (i_bande .le. is_nallbandes)
390 |
391 | READ(FILE_SNBWN,*) s_all_WVNB(i_bande),s_all_DWVNB(i_bande)
392 |
393 | IF (s_all_WVNB(i_bande).lt.0.) THEN
394 | i_bande = is_nallbandes + 1 !arret de la boucle
395 | ENDIF
396 |
397 | i_bande=i_bande+1
398 |
399 | ENDDO
400 |
401 | CLOSE(FILE_SNBWN)
402 |
403 | ENDIF
404 |
405 | ! ----------------------------!
406 | ! Read spectral data for WSGG !
407 | ! ----------------------------!
408 |
409 | wsggfile = pathspec(1:len_trim(pathspec))// &
410 | & '/WSGG_Soufiani_Djavdan_H20_CO2'
411 |
412 | IF (mediumtype.eq.'WSGG') THEN
413 |
414 | ALLOCATE(s_alpha (6,is_ngg))
415 | ALLOCATE(s_kwsgg (is_ngg))
416 |
417 | OPEN(UNIT=FILE_Wsgg,FILE=wsggfile,FORM='FORMATTED')
418 | READ(FILE_Wsgg,*)
419 |
420 | DO i=1,is_ngg
421 | READ(FILE_Wsgg,*) s_kwsgg(i),(s_alpha(j,i),j=1,6)
422 | ENDDO
423 |
424 | CLOSE(FILE_Wsgg)
425 |
426 | ENDIF
427 |
428 | ! -----------------------------!
429 | ! Read data for tabulated FSK !
430 | ! and set the number of points !
431 | ! for the spectral quadrature !
432 | ! -----------------------------!
433 |
434 | IF ((mediumtype.eq.'TFSK').or.(mediumtype.eq.'TFSCK')) THEN
435 | tabfile = pathspec(1:len_trim(pathspec))//'/table.dat'
436 | IF (pmm_rank.eq.PMM_HOST) THEN
437 | PRINT*, " -> Tabulated File : ",trim(tabfile)
438 | ENDIF
439 |
440 | OPEN(FILE_TAB,FILE=tabfile,FORM='FORMATTED')
441 | READ(FILE_TAB,*) is_nkabs
442 | READ(FILE_TAB,*) s_DT
443 | READ(FILE_TAB,*) s_DYH, MH2O
444 | READ(FILE_TAB,*) s_DYC, MCO2
445 | READ(FILE_TAB,*) s_DYCO, MCO
446 | CLOSE(FILE_TAB)
447 |
448 | is_nT = INT((2900-300)/s_DT) + 1
449 | is_nYH = INT((MH2O-0.0)/s_DYH) + 1
450 | is_nYC = INT((MCO2-0.0)/s_DYC) + 1
451 | is_nYCO = INT((MCO-0.0)/s_DYCO) + 1
452 |
453 | ALLOCATE(s_tabkabs(is_nYH,is_nYC,is_nYCO,is_nT,is_nkabs))
454 |
455 | CALL readtab(tabfile,s_tabkabs, is_nYH, is_nYC, is_nYCO, &
456 | & is_nT, is_nkabs, mediumtype, s_dataref)
457 |
458 | IF (pmm_rank.eq.PMM_HOST) THEN
459 | PRINT*, " -> Table for ", trim(mediumtype) ," model readed"
460 | ENDIF
461 |
462 | ELSEIF (mediumtype.eq.'GRAY') THEN
463 | is_nkabs = 1
464 | ELSEIF (mediumtype.eq.'WSGG') THEN
465 | is_nkabs = is_ngg
466 | ELSE
467 | is_nkabs = Nq_kabs
468 | ENDIF
469 |
470 | ! print*, " is_ncells : ", is_ncells
471 | ! print*, " is_nfacesmax : ", is_nfacesmax
472 | ! print*, " is_nallbandes: ", is_nallbandes
473 | ! print*, " is_nbandes : ", is_nbandes
474 |
475 | END SUBROUTINE read_data_slave