source: LMDZ6/branches/Amaury_dev/libf/phylmd/StratAer/strataer_emiss_mod.F90 @ 5208

Last change on this file since 5208 was 5158, checked in by abarral, 7 weeks ago

Add missing klon on strataer_emiss_mod.F90
Correct various missing explicit declarations
Replace tabs by spaces (tabs are not part of the fortran charset)
Continue cleaning modules
Removed unused arguments and variables

File size: 11.1 KB
Line 
1MODULE strataer_emiss_mod
2  ! This module contains information about strato microphysic model emission parameters
3  IMPLICIT NONE; PRIVATE
4  PUBLIC strataer_emiss_init
5
6CONTAINS
7
8  SUBROUTINE strataer_emiss_init()
9
10    USE strataer_local_var_mod
11    USE lmdz_ioipsl_getin_p, ONLY: getin_p
12    USE lmdz_print_control, ONLY: lunout
13    USE lmdz_phys_para, ONLY: is_master
14    USE lmdz_abort_physic, ONLY: abort_physic
15    USE dimphy, ONLY: klon
16
17    IMPLICIT NONE
18
19    ! Local variables
20    INTEGER :: ispec
21
22    WRITE(lunout, *) 'IN STRATAER_EMISS INIT WELCOME!'
23
24    IF (flag_emit==1 .OR. flag_emit==4) THEN ! Volcano
25      CALL getin_p('nErupt', nErupt) !eruption nb
26      CALL getin_p('injdur', injdur) !injection duration
27
28      IF (flag_emit==1) THEN
29        CALL getin_p('nAerErupt', nAerErupt) !sulfur aer nb
30      ELSEIF (flag_emit==4) THEN
31        CALL getin_p('nSpeciesErupt', nSpeciesErupt) !chimical species nb
32      ENDIF
33
34      IF (nErupt>0) THEN
35        ALLOCATE(year_emit_vol(nErupt), mth_emit_vol(nErupt), day_emit_vol(nErupt))
36        year_emit_vol = 0 ; mth_emit_vol = 0 ; day_emit_vol = 0
37        ALLOCATE(altemiss_vol(nErupt), sigma_alt_vol(nErupt))
38        ALLOCATE(xlat_min_vol(nErupt), xlon_min_vol(nErupt))
39        ALLOCATE(xlat_max_vol(nErupt), xlon_max_vol(nErupt))
40        altemiss_vol = 0. ; sigma_alt_vol = 0.
41        xlon_min_vol = 0. ; xlon_max_vol = 0.
42        xlat_min_vol = 0. ; xlat_max_vol = 0.
43        ! injection params (dates, loc, injections params)
44        CALL getin_p('year_emit_vol', year_emit_vol)
45        CALL getin_p('mth_emit_vol', mth_emit_vol)
46        CALL getin_p('day_emit_vol', day_emit_vol)
47        CALL getin_p('altemiss_vol', altemiss_vol)
48        CALL getin_p('sigma_alt_vol', sigma_alt_vol)
49        CALL getin_p('xlon_min_vol', xlon_min_vol)
50        CALL getin_p('xlon_max_vol', xlon_max_vol)
51        CALL getin_p('xlat_min_vol', xlat_min_vol)
52        CALL getin_p('xlat_max_vol', xlat_max_vol)
53        IF (flag_emit==1) THEN
54          ALLOCATE(m_sulf_emiss_vol(nErupt))
55          ALLOCATE(m_aer_emiss_vol(nErupt, nAerErupt))
56          m_aer_emiss_vol = 0. ; m_sulf_emiss_vol = 0.
57          IF (ok_qemiss) THEN
58            ALLOCATE(m_H2O_emiss_vol(nErupt))
59            ALLOCATE(m_H2O_emiss_vol_daily(nErupt))
60            !                ALLOCATE(d_q_emiss(klon,klev))
61            ALLOCATE(budg_emi(klon, nAerErupt + 1))
62            m_H2O_emiss_vol(:) = 0.
63            m_H2O_emiss_vol_daily(:) = 0.
64            !                d_q_emiss(:,:)=0.
65          ELSE
66            ALLOCATE(budg_emi(klon, nAerErupt))
67          ENDIF
68          budg_emi(:, :) = 0.
69        ELSEIF (flag_emit==4) THEN
70          ALLOCATE(m_Chlore_emiss_vol(nErupt))
71          ALLOCATE(id_HCl)
72          ALLOCATE(m_Brome_emiss_vol(nErupt))
73          ALLOCATE(id_HBr)
74          ALLOCATE(id_species(nSpeciesErupt))
75          id_species = 0
76          ALLOCATE(m_species_emiss_vol(nErupt, nSpeciesErupt))
77          m_species_emiss_vol = 0.
78          ALLOCATE(m_NOx_emiss_vol(nErupt))
79          ALLOCATE(m_H2O_emiss_vol(nErupt))
80          m_Chlore_emiss_vol = 0. ; m_Brome_emiss_vol = 0.
81          m_NOx_emiss_vol = 0. ; m_H2O_emiss_vol = 0.
82          ALLOCATE(id_NOx)
83          ALLOCATE(id_H2O)
84          ALLOCATE(budg_emi(klon, nSpeciesErupt))
85          budg_emi(:, :) = 0.
86        ENDIF
87      ELSE
88        WRITE(lunout, *) 'ERROR : Using flag_emit=1 or 4 (ie Volcanic eruption) but nErupt (', nErupt, ') <=0 !'
89        CALL abort_physic('strataer_emiss_mod', &
90                'No eruption define in physiq_def (nErupt=0). Add at one eruption or use background condition.', 1)
91      ENDIF ! fin if nerupt
92
93      IF (flag_emit==1) THEN
94        CALL getin_p('m_sulf_emiss_vol', m_sulf_emiss_vol)
95        IF (ok_qemiss) THEN
96          CALL getin_p('m_H2O_emiss_vol', m_H2O_emiss_vol)
97        endif
98      ELSEIF (flag_emit==4) THEN
99        CALL getin_p('id_species', id_species)
100        CALL getin_p('m_Chlore_emiss_vol', m_Chlore_emiss_vol)
101        CALL getin_p('id_HCl', id_HCl)
102        CALL getin_p('m_Brome_emiss_vol', m_Brome_emiss_vol)
103        CALL getin_p('id_HBr', id_HBr)
104        CALL getin_p('m_NOx_emiss_vol', m_NOx_emiss_vol)
105        CALL getin_p('id_NOx', id_NOx)
106        CALL getin_p('m_H2O_emiss_vol', m_H2O_emiss_vol)
107        CALL getin_p('id_H2O', id_H2O)
108      ENDIF
109
110    ELSEIF (flag_emit == 2) THEN ! SAI
111      CALL getin_p('m_aer_emiss_sai', m_aer_emiss_sai)
112      CALL getin_p('altemiss_sai', altemiss_sai)
113      CALL getin_p('sigma_alt_sai', sigma_alt_sai)
114      CALL getin_p('xlat_sai', xlat_sai)
115      CALL getin_p('xlon_sai', xlon_sai)
116      CALL getin_p('year_emit_sai_start', year_emit_sai_start)
117      CALL getin_p('year_emit_sai_end', year_emit_sai_end)
118      CALL getin_p('mth_emit_sai_start', mth_emit_sai_start)
119      CALL getin_p('mth_emit_sai_end', mth_emit_sai_end)
120      CALL getin_p('day_emit_sai_start', day_emit_sai_start)
121      CALL getin_p('day_emit_sai_end', day_emit_sai_end)
122
123    ELSEIF (flag_emit == 3) THEN ! SAI between latitudes
124      CALL getin_p('m_aer_emiss_sai', m_aer_emiss_sai)
125      CALL getin_p('altemiss_sai', altemiss_sai)
126      CALL getin_p('sigma_alt_sai', sigma_alt_sai)
127      CALL getin_p('xlon_sai', xlon_sai)
128      CALL getin_p('xlat_max_sai', xlat_max_sai)
129      CALL getin_p('xlat_min_sai', xlat_min_sai)
130    ENDIF
131
132    IF (flag_emit == 1) THEN
133      DO ispec = 1, nAerErupt
134        m_aer_emiss_vol(:, ispec) = m_sulf_emiss_vol(:)
135      ENDDO
136    ELSEIF (flag_emit== 4) THEN
137      DO ispec = 1, nSpeciesErupt
138        IF(id_species(ispec) == id_HCl) THEN
139          m_species_emiss_vol(:, ispec) = m_Chlore_emiss_vol(:)
140        ENDIF
141        IF (id_species(ispec) == id_HBr) THEN
142          m_species_emiss_vol(:, ispec) = m_Brome_emiss_vol(:)
143        ENDIF
144        IF (id_species(ispec) == id_NOx) THEN
145          m_species_emiss_vol(:, ispec) = m_NOx_emiss_vol(:)
146        ENDIF
147        IF (id_species(ispec) == id_H2O) THEN
148          m_species_emiss_vol(:, ispec) = m_H2O_emiss_vol(:)
149        ENDIF
150      ENDDO
151    ENDIF
152
153    !============= Injection ponderation =============
154    IF (flag_emit > 0) THEN
155      CALL strataer_ponde_init
156      WRITE(lunout, *) 'IN STRATAER INIT : ponde_lonlat_vol', ponde_lonlat_vol
157    ENDIF
158
159    !============= Print params =============
160    IF (is_master) THEN
161      IF (nErupt > 0) THEN
162        IF (flag_emit == 1 .OR. flag_emit == 4) THEN
163          WRITE(lunout, *) 'IN STRATAER nErupt: ', nErupt
164          WRITE(lunout, *) 'IN STRATAER injdur: ', injdur
165          WRITE(lunout, *) 'IN STRATAER nAerErupt: ', nAerErupt
166
167          WRITE(lunout, *) 'IN STRATAER : year_emit_vol', year_emit_vol
168          WRITE(lunout, *) 'IN STRATAER : mth_emit_vol', mth_emit_vol
169          WRITE(lunout, *) 'IN STRATAER : day_emit_vol', day_emit_vol
170          WRITE(lunout, *) 'IN STRATAER : altemiss_vol', altemiss_vol
171          WRITE(lunout, *) 'IN STRATAER : sigma_alt_vol', sigma_alt_vol
172          WRITE(lunout, *) 'IN STRATAER : xlat_min_vol', xlat_min_vol
173          WRITE(lunout, *) 'IN STRATAER : xlat_max_vol', xlat_max_vol
174          WRITE(lunout, *) 'IN STRATAER : xlon_min_vol', xlon_min_vol
175          WRITE(lunout, *) 'IN STRATAER : xlon_max_vol', xlon_max_vol
176          IF (flag_emit==1) THEN
177            WRITE(lunout, *) 'IN STRATAEREMISS : m_sulf_emiss_vol', m_sulf_emiss_vol
178            WRITE(lunout, *) 'IN STRATAER : m_aer_emiss_vol', m_aer_emiss_vol
179            IF (ok_qemiss) THEN
180              WRITE(lunout, *) 'IN STRATAEREMISS : m_H2O_emiss_vol', m_H2O_emiss_vol
181            ENDIF
182          ENDIF
183        ELSEIF (flag_emit == 2) THEN
184          WRITE(lunout, *) 'IN STRATAER : m_aer_emiss_sai', m_aer_emiss_sai
185          WRITE(lunout, *) 'IN STRATAER : altemiss_sai', altemiss_sai
186          WRITE(lunout, *) 'IN STRATAER : sigma_alt_sai', sigma_alt_sai
187          WRITE(lunout, *) 'IN STRATAER : xlat_sai', xlat_sai
188          WRITE(lunout, *) 'IN STRATAER : xlon_sai', xlon_sai
189        ELSEIF (flag_emit == 3) THEN
190          WRITE(lunout, *) 'IN STRATAER : m_aer_emiss_sai', m_aer_emiss_sai
191          WRITE(lunout, *) 'IN STRATAER : altemiss_sai', altemiss_sai
192          WRITE(lunout, *) 'IN STRATAER : sigma_alt_sai', sigma_alt_sai
193          WRITE(lunout, *) 'IN STRATAER : year_emit_sai start/end', year_emit_sai_start, year_emit_sai_end
194          WRITE(lunout, *) 'IN STRATAER : mth_emit_sai start/end', mth_emit_sai_start, mth_emit_sai_end
195          WRITE(lunout, *) 'IN STRATAER : day_emit_sai start/end', day_emit_sai_start, day_emit_sai_end
196          WRITE(lunout, *) 'IN STRATAER : xlat_min_sai', xlat_min_sai
197          WRITE(lunout, *) 'IN STRATAER : xlat_max_sai', xlat_max_sai
198          WRITE(lunout, *) 'IN STRATAER : xlon_sai', xlon_sai
199        ENDIF
200        IF(flag_emit == 4) THEN
201          WRITE(lunout, *) 'IN STRATAER : nSpeciesErupt: ', nSpeciesErupt
202          WRITE(lunout, *) 'IN STRATAER : id_species = ', id_species
203          WRITE(lunout, *) 'IN STRATAER : id_HCl = ', id_HCl
204          WRITE(lunout, *) 'IN STRATAER : id_HBr = ', id_HBr
205          WRITE(lunout, *) 'IN STRATAER : id_NOx = ', id_NOx
206          WRITE(lunout, *) 'IN STRATAER : id_H2O = ', id_H2O
207          WRITE(lunout, *) 'IN STRATAER : m_Chlore_emiss_vol = ', m_Chlore_emiss_vol
208          WRITE(lunout, *) 'IN STRATAER : m_Brome_emiss_vol = ', m_Brome_emiss_vol
209          WRITE(lunout, *) 'IN STRATAER : m_NOx_emiss_vol = ', m_NOx_emiss_vol
210          WRITE(lunout, *) 'IN STRATAER : m_H2O_emiss_vol = ', m_H2O_emiss_vol
211        ENDIF
212      endif
213    ENDIF ! if master
214
215    WRITE(lunout, *) 'IN STRATAER_EMISS END'
216  END SUBROUTINE strataer_emiss_init
217
218  ! Compute the ponderation to applicate in each grid point for all eruptions and init
219  ! dlat & dlon variables
220  SUBROUTINE strataer_ponde_init()
221
222    USE lmdz_regular_lonlat, ONLY: lon_reg, lat_reg
223    USE dimphy, ONLY: klon
224    USE lmdz_grid_phy, ONLY: nbp_lat, nbp_lon
225    USE lmdz_print_control, ONLY: lunout
226    USE strataer_local_var_mod
227    USE lmdz_yomcst, ONLY: RPI
228
229    ! local var
230    REAL :: lat_reg_deg, lon_reg_deg ! lat and lon of grid points in degree
231    INTEGER :: ieru, i, j
232
233    ALLOCATE(ponde_lonlat_vol(nErupt))
234
235    !Compute lon/lat ponderation for injection
236    dlat = 180. / 2. / FLOAT(nbp_lat)   ! d latitude in degree
237    dlon = 360. / 2. / FLOAT(nbp_lon)   ! d longitude in degree
238    WRITE(lunout, *) 'IN STRATAER_INIT dlat=', dlat, 'dlon=', dlon
239    WRITE(lunout, *) 'IN STRATAER_INIT nErupt=', nErupt
240    WRITE(lunout, *) 'IN STRATAER_INIT xlat_min=', xlat_min_vol, 'xlat_max=', xlat_max_vol
241    WRITE(lunout, *) 'IN STRATAER_INIT xlon_min=', xlon_min_vol, 'xlon_max=', xlon_max_vol
242
243    DO ieru = 1, nErupt
244      ponde_lonlat_vol(ieru) = 0
245      DO i = 1, nbp_lon
246        lon_reg_deg = lon_reg(i) * 180. / RPI
247        DO j = 1, nbp_lat
248          lat_reg_deg = lat_reg(j) * 180. / RPI
249          IF  (lat_reg_deg>=xlat_min_vol(ieru) - dlat .AND. lat_reg_deg<xlat_max_vol(ieru) + dlat .AND. &
250                  lon_reg_deg>=xlon_min_vol(ieru) - dlon .AND. lon_reg_deg<xlon_max_vol(ieru) + dlon) THEN
251            ponde_lonlat_vol(ieru) = ponde_lonlat_vol(ieru) + 1
252          ENDIF
253        ENDDO
254      ENDDO
255      IF(ponde_lonlat_vol(ieru) == 0) THEN
256        WRITE(lunout, *) 'STRATAER_INIT ERROR: no grid point found for eruption ieru=', ieru
257      ENDIF
258    ENDDO !ieru
259
260    WRITE(lunout, *) 'IN STRATAER_PONDE_INIT ponde_lonlat: ', ponde_lonlat_vol
261
262  END SUBROUTINE strataer_ponde_init
263
264END MODULE strataer_emiss_mod
Note: See TracBrowser for help on using the repository browser.