Newer
Older
!MNH_LIC Copyright 2001-2019 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
!-----------------------------------------------------------------
!! ################################
MODULE MODI_CH_INIT_CONST_n
!! ################################
!!
INTERFACE
!!
SUBROUTINE CH_INIT_CONST_n (KLUOUT, KVERB)
IMPLICIT NONE
!!
INTEGER, INTENT(IN) :: KLUOUT ! output listing channel
INTEGER, INTENT(IN) :: KVERB ! verbosity level
!!
END SUBROUTINE CH_INIT_CONST_n
!!
END INTERFACE
!!
END MODULE MODI_CH_INIT_CONST_n
!!
!! ###########################################
SUBROUTINE CH_INIT_CONST_n(KLUOUT, KVERB)
!! ###########################################
!!
!!*** *CH_INIT_CONST_n*
!!
!! PURPOSE
!! -------
! Read Henry Specific constant, Molecular Mass and Biological reactivity
!! factor.
!!
!!
!!** METHOD
!! ------
!
!! Chemical constant will be read from
!! the general purpose input file (variable CCHEM_INPUT_FILE).
!!
!! chemical molecular diffusivity MASS_MOL
!! molecular reactivity factor REA_FACT
!! molecular effective Henry constant HENRY_SP
!!
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!! P. Tulet *Meteo France*
!!
!! MODIFICATIONS
!! -------------
!! Original 16/02/01
! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
! P. Wautelet: 25/02/2019: bug correction for the file unit numbers
!! EXTERNAL
!! --------
USE MODI_CH_OPEN_INPUT ! open the general purpose ASCII input file

WAUTELET Philippe
committed
USE MODD_IO_ll, ONLY: TFILEDATA
USE MODE_FM, ONLY: IO_FILE_CLOSE_ll
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
!!
!! IMPLICIT ARGUMENTS
!! ------------------
USE MODD_CH_M9_n, ONLY: NEQ, &! number of chemical variables
CNAMES ! names of the chemical species
USE MODD_CH_MNHC_n, ONLY: CCHEM_INPUT_FILE ! general purpose ASCII input file
USE MODD_CH_CONST_n
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
IMPLICIT NONE
!
!* 0.1 declarations of arguments
!
INTEGER, INTENT(IN) :: KLUOUT
! output listing channel
INTEGER, INTENT(IN) :: KVERB
! verbosity level
!
!* 0.2 declarations of local variables
!
INTEGER :: ICHANNEL
! I/O channel for file input
CHARACTER(LEN=40) :: YFORMAT
! format for input
CHARACTER(LEN=40) :: YOUTFORMAT = '(A32,2E15.5)'
! format for output
!
INTEGER :: IMASS ! number of molecular diffusivity to be read
CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YMASSMOLNAME !species names
REAL , DIMENSION(:), ALLOCATABLE :: ZMASSMOLVAL
! molecular diffusivity value
!
INTEGER :: IREACT ! number of chemical reactivity factor to be read
CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YREACTNAME !species names
REAL , DIMENSION(:), ALLOCATABLE :: ZREACTVAL
! chemical reactivity factor value
!
INTEGER :: IHENRY ! number of chemical Henry constant to be read
CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YHENRYNAME !species names
REAL , DIMENSION(:,:), ALLOCATABLE :: ZHENRYVAL
!chemical Henry constant value
!
INTEGER :: IFAIL ! return code from CLOSE_ll
INTEGER :: JI, JN, JNREAL ! loop control variables
INTEGER :: INACT ! array pointer

WAUTELET Philippe
committed
TYPE(TFILEDATA),POINTER :: TZFILE
!-------------------------------------------------------------------------------

WAUTELET Philippe
committed
TZFILE => NULL()
!
!* 1. ALLOCATE FIELD
! --------------
!
IF (.NOT. ASSOCIATED(XSREALMASSMOLVAL)) ALLOCATE( XSREALMASSMOLVAL(NEQ) )
IF (.NOT. ASSOCIATED(XSREALREACTVAL)) ALLOCATE( XSREALREACTVAL(NEQ) )
IF (.NOT. ASSOCIATED(XSREALHENRYVAL)) ALLOCATE( XSREALHENRYVAL(NEQ,2) )
!
!* 2. read chemical molecular diffusivity MASS_MOL
!
! open input file
IF (KVERB >= 5) WRITE(KLUOUT,*) &
"CH_INIT_CONST: reading molar mass"

WAUTELET Philippe
committed
CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "MASS_MOL", TZFILE, KLUOUT, KVERB)
ICHANNEL = TZFILE%NLU
!
! read number of molecular diffusivity IMASS
READ(ICHANNEL, *) IMASS
IF (KVERB >= 5) WRITE(KLUOUT,*) "number of molecular diffusivity: ", IMASS
!
! read data input format
READ(ICHANNEL,"(A)") YFORMAT
IF (KVERB >= 5) WRITE(KLUOUT,*) "input format is: ", YFORMAT
!
! allocate fields
ALLOCATE(YMASSMOLNAME(IMASS))
ALLOCATE(ZMASSMOLVAL(IMASS))
!
! read molecular diffusivity
DO JI = 1, IMASS
READ(ICHANNEL,YFORMAT) YMASSMOLNAME(JI), ZMASSMOLVAL(JI)
WRITE(KLUOUT,YFORMAT) YMASSMOLNAME(JI), ZMASSMOLVAL(JI)
END DO
!
! close file

WAUTELET Philippe
committed
CALL IO_FILE_CLOSE_ll(TZFILE)
TZFILE => NULL()
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
!
!
IF (KVERB >= 10) THEN
WRITE(KLUOUT,'(A)') '----------------------------------------------------'
WRITE(KLUOUT,'(A)') 'MASS_MOL'
WRITE(KLUOUT,'(A)') 'molecular mass (in g/mol) for molecular diffusion'
WRITE(KLUOUT,'(I4)') NEQ
WRITE(KLUOUT,'(A)') YOUTFORMAT
END IF
XSREALMASSMOLVAL(:) = 50. ! default molecular mass
DO JNREAL = 1, NEQ
INACT = 0
search_loop3 : DO JN = 1, IMASS
IF (CNAMES(JNREAL) .EQ. YMASSMOLNAME(JN)) THEN
INACT = JN
EXIT search_loop3
END IF
END DO search_loop3
IF (INACT .NE. 0) XSREALMASSMOLVAL(JNREAL) = ZMASSMOLVAL(INACT)
IF (KVERB >= 10) THEN
WRITE(KLUOUT,YOUTFORMAT) CNAMES(JNREAL), XSREALMASSMOLVAL(JNREAL)
END IF
END DO
!
!-----------------------------------------------------------------------------
!
!* 3. read molecular reactivity factor REA_FACT
!
! open input file
IF (KVERB >= 5) WRITE(KLUOUT,*) &
"CH_INIT_CONST: reading reactivity factor "

WAUTELET Philippe
committed
CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "REA_FACT", TZFILE, KLUOUT, KVERB)
ICHANNEL = TZFILE%NLU
!
! read number of molecular diffusivity IREACT
READ(ICHANNEL, *) IREACT
IF (KVERB >= 5) WRITE(KLUOUT,*) "number of reactivity factor : ", IREACT
!
! read data input format
READ(ICHANNEL,"(A)") YFORMAT
IF (KVERB >= 5) WRITE(KLUOUT,*) "input format is: ", YFORMAT
!
! allocate fields
ALLOCATE(YREACTNAME(IREACT))
ALLOCATE(ZREACTVAL(IREACT))
! read reactivity factor
DO JI = 1, IREACT
READ(ICHANNEL,YFORMAT) YREACTNAME(JI), ZREACTVAL(JI)
WRITE(KLUOUT,YFORMAT) YREACTNAME(JI), ZREACTVAL(JI)
END DO
!
! close file

WAUTELET Philippe
committed
CALL IO_FILE_CLOSE_ll(TZFILE)
TZFILE => NULL()
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
!
!
IF (KVERB >= 10) THEN
WRITE(KLUOUT,'(A)') '----------------------------------------------------'
WRITE(KLUOUT,'(A)') 'REA_FACT'
WRITE(KLUOUT,'(A)') 'reactivity factor'
WRITE(KLUOUT,'(I4)') NEQ
WRITE(KLUOUT,'(A)') YOUTFORMAT
END IF
XSREALREACTVAL(:) = 0.0 ! default (high surface resistance)
DO JNREAL = 1, NEQ
INACT = 0
search_loop4 : DO JN = 1, IREACT
IF (CNAMES(JNREAL) .EQ. YREACTNAME(JN)) THEN
INACT = JN
EXIT search_loop4
END IF
END DO search_loop4
IF (INACT .NE. 0) XSREALREACTVAL(JNREAL) = ZREACTVAL(INACT)
IF (KVERB >= 10) THEN
WRITE(KLUOUT,YOUTFORMAT) CNAMES(JNREAL), XSREALREACTVAL(JNREAL)
END IF
END DO
!
!-----------------------------------------------------------------------------
!
!* 4. read molecular effective Henry constant HENRY_SP
!
! open input file
IF (KVERB >= 5) WRITE(KLUOUT,*) &
"CH_INIT_CONST: reading effective Henry constant", &
" and its temperature correction "

WAUTELET Philippe
committed
CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "HENRY_SP", TZFILE, KLUOUT, KVERB)
ICHANNEL = TZFILE%NLU
!
! read number of molecular diffusivity IHENRY
READ(ICHANNEL, *) IHENRY
IF (KVERB >= 5) WRITE(KLUOUT,*) "number of reactivity factor : ", IHENRY
!
! read data input format
READ(ICHANNEL,"(A)") YFORMAT
IF (KVERB >= 5) WRITE(KLUOUT,*) "input format is: ", YFORMAT
!
! allocate fields
ALLOCATE(YHENRYNAME(IHENRY))
ALLOCATE(ZHENRYVAL(IHENRY,2))
!
! read reactivity factor
DO JNREAL = 1, IHENRY
READ(ICHANNEL,YFORMAT) YHENRYNAME(JNREAL), ZHENRYVAL(JNREAL,1),&
ZHENRYVAL(JNREAL,2)
WRITE(KLUOUT,YFORMAT) YHENRYNAME(JNREAL), ZHENRYVAL(JNREAL,1),&
ZHENRYVAL(JNREAL,2)
END DO
!
! close file

WAUTELET Philippe
committed
CALL IO_FILE_CLOSE_ll(TZFILE)
TZFILE => NULL()
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
!
IF (KVERB >= 10) THEN
WRITE(KLUOUT,'(A)') '----------------------------------------------------'
WRITE(KLUOUT,'(A)') 'HENRY_SP'
WRITE(KLUOUT,'(A)') 'Henrys law constants factor / exponent'
WRITE(KLUOUT,'(I4)') NEQ
WRITE(KLUOUT,'(A)') YOUTFORMAT
END IF
XSREALHENRYVAL(:,1) = 1E-8 ! no deposition; low Henry constant
XSREALHENRYVAL(:,2) = 0. !
DO JNREAL = 1, NEQ
INACT = 0
search_loop5 : DO JN = 1, IHENRY
IF (CNAMES(JNREAL) .EQ. YHENRYNAME(JN)) THEN
INACT = JN
EXIT search_loop5
END IF
END DO search_loop5
IF (INACT .NE. 0) XSREALHENRYVAL(JNREAL,1) = ZHENRYVAL(INACT,1)
IF (INACT .NE. 0) XSREALHENRYVAL(JNREAL,2) = ZHENRYVAL(INACT,2)
IF (KVERB >= 10) THEN
WRITE(KLUOUT,YOUTFORMAT) CNAMES(JNREAL), &
XSREALHENRYVAL(JNREAL,1),&
XSREALHENRYVAL(JNREAL,2)
END IF
END DO
!
!
END SUBROUTINE CH_INIT_CONST_n