Line data Source code
1 : !-------------------------------------------------------------------
2 : ! Manages reading and interpolation of prescribed aerosol deposition
3 : ! fluxes. These are the deposition fluxes sent to the surface.
4 : !
5 : ! Created by: Francis Vitt
6 : !-------------------------------------------------------------------
7 : module aerodep_flx
8 :
9 : use shr_kind_mod, only : r8 => shr_kind_r8
10 : use cam_abortutils, only : endrun
11 : use spmd_utils, only : masterproc
12 : use tracer_data, only : trfld, trfile
13 : use cam_logfile, only : iulog
14 : use ppgrid, only : pcols, pver, begchunk, endchunk
15 :
16 : implicit none
17 : private
18 : save
19 :
20 : type(trfld), pointer :: fields(:)
21 : type(trfile) :: file
22 :
23 : public :: aerodep_flx_init
24 : public :: aerodep_flx_adv
25 : public :: aerodep_flx_readnl
26 : public :: aerodep_flx_prescribed
27 :
28 : logical :: has_aerodep_flx = .false.
29 : integer, parameter, public :: N_BULK = 14
30 : integer, parameter, public :: N_MODAL = 22
31 : integer :: number_flds
32 :
33 : character(len=256) :: filename = 'NONE'
34 : character(len=256) :: filelist = ' '
35 : character(len=256) :: datapath = ' '
36 : character(len=32) :: datatype = 'SERIAL'
37 : logical :: rmv_file = .false.
38 : integer :: cycle_yr = 0
39 : integer :: fixed_ymd = 0
40 : integer :: fixed_tod = 0
41 : character(len=32) :: specifier(N_MODAL) = ' '
42 :
43 : ! for bulk aerosol fluxes
44 :
45 : character(len=12), parameter :: bulk_names(N_BULK) = (/ &
46 : 'BCDEPWET ', 'BCPHODRY ', 'BCPHIDRY ', &
47 : 'OCDEPWET ', 'OCPHODRY ', 'OCPHIDRY ', &
48 : 'DSTX01DD ', 'DSTX02DD ', 'DSTX03DD ', 'DSTX04DD ', &
49 : 'DSTX01WD ', 'DSTX02WD ', 'DSTX03WD ', 'DSTX04WD ' /)
50 :
51 : integer :: index_bulk_map(N_BULK)
52 :
53 : integer :: ibcphiwet,ibcphidry,ibcphodry
54 : integer :: iocphiwet,iocphidry,iocphodry
55 :
56 : integer :: idstdry1,idstdry2,idstdry3,idstdry4
57 : integer :: idstwet1,idstwet2,idstwet3,idstwet4
58 :
59 : ! for modal aerosol fluxes
60 :
61 : character(len=12), parameter :: modal_names(N_MODAL) = (/ &
62 : 'bc_a1DDF ', 'bc_c1DDF ', 'pom_a1DDF ', 'pom_c1DDF ', &
63 : 'soa_a1DDF ', 'soa_c1DDF ', 'soa_a2DDF ', 'soa_c2DDF ', &
64 : 'dst_a1DDF ', 'dst_c1DDF ', 'dst_a3DDF ', 'dst_c3DDF ', &
65 : 'bc_a1SFWET ', 'bc_c1SFWET ', 'pom_a1SFWET ', 'pom_c1SFWET ', &
66 : 'soa_a1SFWET ', 'soa_c1SFWET ', 'dst_a1SFWET ', 'dst_c1SFWET ', &
67 : 'dst_a3SFWET ', 'dst_c3SFWET ' /)
68 :
69 : integer :: index_modal_map(N_MODAL)
70 :
71 : integer, parameter :: idx_bc1 = 1
72 : integer, parameter :: idx_pom1 = 2
73 : integer, parameter :: idx_soa1 = 3
74 : integer, parameter :: idx_soa2 = 4
75 : integer, parameter :: idx_dst1 = 5
76 : integer, parameter :: idx_dst3 = 6
77 : integer, parameter :: idx_ncl3 = 7
78 : integer, parameter :: idx_so43 = 8
79 :
80 : integer, parameter :: nmodal_idxs = 8
81 :
82 : integer :: idx_bc1_dryis = -1
83 : integer :: idx_bc1_drycw = -1
84 : integer :: idx_pom1_dryis = -1
85 : integer :: idx_pom1_drycw = -1
86 : integer :: idx_soa1_dryis = -1
87 : integer :: idx_soa1_drycw = -1
88 : integer :: idx_soa2_dryis = -1
89 : integer :: idx_soa2_drycw = -1
90 : integer :: idx_dst1_dryis = -1
91 : integer :: idx_dst1_drycw = -1
92 : integer :: idx_dst3_dryis = -1
93 : integer :: idx_dst3_drycw = -1
94 :
95 : integer :: idx_bc1_wetis = -1
96 : integer :: idx_bc1_wetcw = -1
97 : integer :: idx_pom1_wetis = -1
98 : integer :: idx_pom1_wetcw = -1
99 : integer :: idx_soa1_wetis = -1
100 : integer :: idx_soa1_wetcw = -1
101 : integer :: idx_dst1_wetis = -1
102 : integer :: idx_dst1_wetcw = -1
103 : integer :: idx_dst3_wetis = -1
104 : integer :: idx_dst3_wetcw = -1
105 :
106 : logical :: modal_fluxes = .false.
107 :
108 : contains
109 :
110 : !-------------------------------------------------------------------
111 : ! parses the list of dep fluxes specified in aerodep_flx_specifier namelist
112 : ! variable and sets up index variables
113 : !-------------------------------------------------------------------
114 1536 : subroutine aerodep_flx_init()
115 :
116 : use tracer_data, only : trcdata_init
117 : use cam_history, only : addfld, horiz_only
118 : use physics_buffer, only : physics_buffer_desc
119 : use modal_aero_deposition, only : modal_aero_deposition_init
120 :
121 : implicit none
122 :
123 : integer :: ndx, istat, i
124 :
125 1536 : if ( has_aerodep_flx ) then
126 1536 : if ( masterproc ) then
127 2 : write(iulog,*) 'aero dep fluxes are prescribed in :'//trim(filename)
128 : endif
129 : else
130 : return
131 : endif
132 :
133 1536 : allocate(file%in_pbuf(size(specifier)))
134 35328 : file%in_pbuf(:) = .false.
135 : call trcdata_init( specifier, filename, filelist, datapath, fields, file, &
136 1536 : rmv_file, cycle_yr, fixed_ymd, fixed_tod, datatype)
137 :
138 1536 : number_flds = 0
139 1536 : if (associated(fields)) number_flds = size( fields )
140 :
141 1536 : if( number_flds < 1 ) then
142 0 : has_aerodep_flx = .false.
143 0 : if (masterproc) then
144 0 : write(iulog,*) 'aerodep_flx_init: no aerosol deposition fluxes have been specified'
145 : endif
146 0 : return
147 : end if
148 :
149 23040 : index_bulk_map(:) = -1
150 35328 : index_modal_map(:) = -1
151 :
152 23040 : do i = 1,number_flds
153 :
154 21504 : ndx = get_ndx( fields(i)%fldnam, bulk_names )
155 21504 : if (ndx >0) then
156 21504 : index_bulk_map(ndx) = i
157 : else
158 0 : ndx = get_ndx( fields(i)%fldnam, modal_names )
159 0 : if (ndx >0) then
160 0 : index_modal_map(ndx) = i
161 : endif
162 : endif
163 23040 : if (ndx>0) then
164 21504 : call addfld(trim(fields(i)%fldnam)//'_D', horiz_only, 'A',fields(i)%units, 'prescribed aero dep' )
165 : else
166 0 : call endrun('aerodep_flx_init: aerosol flux name not recognized: '//trim(fields(i)%fldnam))
167 : endif
168 : enddo
169 :
170 35328 : modal_fluxes = any(index_modal_map(:)>0)
171 :
172 1536 : if (modal_fluxes) then
173 :
174 0 : idx_bc1_dryis = index_modal_map(1)
175 0 : idx_bc1_drycw = index_modal_map(2)
176 0 : idx_pom1_dryis = index_modal_map(3)
177 0 : idx_pom1_drycw = index_modal_map(4)
178 0 : idx_soa1_dryis = index_modal_map(5)
179 0 : idx_soa1_drycw = index_modal_map(6)
180 0 : idx_soa2_dryis = index_modal_map(7)
181 0 : idx_soa2_drycw = index_modal_map(8)
182 0 : idx_dst1_dryis = index_modal_map(9)
183 0 : idx_dst1_drycw = index_modal_map(10)
184 0 : idx_dst3_dryis = index_modal_map(11)
185 0 : idx_dst3_drycw = index_modal_map(12)
186 :
187 0 : idx_bc1_wetis = index_modal_map(13)
188 0 : idx_bc1_wetcw = index_modal_map(14)
189 0 : idx_pom1_wetis = index_modal_map(15)
190 0 : idx_pom1_wetcw = index_modal_map(16)
191 0 : idx_soa1_wetis = index_modal_map(17)
192 0 : idx_soa1_wetcw = index_modal_map(18)
193 0 : idx_dst1_wetis = index_modal_map(19)
194 0 : idx_dst1_wetcw = index_modal_map(20)
195 0 : idx_dst3_wetis = index_modal_map(21)
196 0 : idx_dst3_wetcw = index_modal_map(22)
197 :
198 : call modal_aero_deposition_init( bcphi_indices=(/idx_bc1/), &
199 : ocphi_indices=(/idx_pom1,idx_soa1/), &
200 : ocpho_indices=(/idx_soa2/), &
201 : fine_dust_indices=(/idx_dst1/),&
202 0 : crse_dust_indices=(/idx_dst3/) )
203 :
204 : else
205 :
206 1536 : ibcphiwet = index_bulk_map(1)
207 1536 : ibcphodry = index_bulk_map(2)
208 1536 : ibcphidry = index_bulk_map(3)
209 1536 : iocphiwet = index_bulk_map(4)
210 1536 : iocphodry = index_bulk_map(5)
211 1536 : iocphidry = index_bulk_map(6)
212 1536 : idstdry1 = index_bulk_map(7)
213 1536 : idstdry2 = index_bulk_map(8)
214 1536 : idstdry3 = index_bulk_map(9)
215 1536 : idstdry4 = index_bulk_map(10)
216 1536 : idstwet1 = index_bulk_map(11)
217 1536 : idstwet2 = index_bulk_map(12)
218 1536 : idstwet3 = index_bulk_map(13)
219 1536 : idstwet4 = index_bulk_map(14)
220 :
221 : endif
222 :
223 1536 : end subroutine aerodep_flx_init
224 :
225 : !-------------------------------------------------------------------
226 : ! sets namelist options
227 : !-------------------------------------------------------------------
228 1536 : subroutine aerodep_flx_readnl(nlfile)
229 :
230 1536 : use namelist_utils, only: find_group_name
231 : use units, only: getunit, freeunit
232 : use mpishorthand
233 :
234 : character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
235 :
236 : ! Local variables
237 : integer :: unitn, ierr
238 : character(len=*), parameter :: subname = 'aerodep_flx_readnl'
239 :
240 : character(len=32) :: aerodep_flx_specifier(N_MODAL)
241 : character(len=256) :: aerodep_flx_file
242 : character(len=256) :: aerodep_flx_filelist
243 : character(len=256) :: aerodep_flx_datapath
244 : character(len=32) :: aerodep_flx_type
245 : logical :: aerodep_flx_rmfile
246 : integer :: aerodep_flx_cycle_yr
247 : integer :: aerodep_flx_fixed_ymd
248 : integer :: aerodep_flx_fixed_tod
249 :
250 : namelist /aerodep_flx_nl/ &
251 : aerodep_flx_specifier, &
252 : aerodep_flx_file, &
253 : aerodep_flx_filelist, &
254 : aerodep_flx_datapath, &
255 : aerodep_flx_type, &
256 : aerodep_flx_rmfile, &
257 : aerodep_flx_cycle_yr, &
258 : aerodep_flx_fixed_ymd, &
259 : aerodep_flx_fixed_tod
260 : !-----------------------------------------------------------------------------
261 :
262 : ! Initialize namelist variables from local module variables.
263 35328 : aerodep_flx_specifier= specifier
264 1536 : aerodep_flx_file = filename
265 1536 : aerodep_flx_filelist = filelist
266 1536 : aerodep_flx_datapath = datapath
267 1536 : aerodep_flx_type = datatype
268 1536 : aerodep_flx_rmfile = rmv_file
269 1536 : aerodep_flx_cycle_yr = cycle_yr
270 1536 : aerodep_flx_fixed_ymd= fixed_ymd
271 1536 : aerodep_flx_fixed_tod= fixed_tod
272 :
273 : ! Read namelist
274 1536 : if (masterproc) then
275 2 : unitn = getunit()
276 2 : open( unitn, file=trim(nlfile), status='old' )
277 2 : call find_group_name(unitn, 'aerodep_flx_nl', status=ierr)
278 2 : if (ierr == 0) then
279 2 : read(unitn, aerodep_flx_nl, iostat=ierr)
280 2 : if (ierr /= 0) then
281 0 : call endrun(subname // ':: ERROR reading namelist')
282 : end if
283 : end if
284 2 : close(unitn)
285 2 : call freeunit(unitn)
286 : end if
287 :
288 : #ifdef SPMD
289 : ! Broadcast namelist variables
290 1536 : call mpibcast(aerodep_flx_specifier,len(aerodep_flx_specifier(1))*N_MODAL, mpichar, 0, mpicom)
291 1536 : call mpibcast(aerodep_flx_file, len(aerodep_flx_file), mpichar, 0, mpicom)
292 1536 : call mpibcast(aerodep_flx_filelist, len(aerodep_flx_filelist), mpichar, 0, mpicom)
293 1536 : call mpibcast(aerodep_flx_datapath, len(aerodep_flx_datapath), mpichar, 0, mpicom)
294 1536 : call mpibcast(aerodep_flx_type, len(aerodep_flx_type), mpichar, 0, mpicom)
295 1536 : call mpibcast(aerodep_flx_rmfile, 1, mpilog, 0, mpicom)
296 1536 : call mpibcast(aerodep_flx_cycle_yr, 1, mpiint, 0, mpicom)
297 1536 : call mpibcast(aerodep_flx_fixed_ymd,1, mpiint, 0, mpicom)
298 1536 : call mpibcast(aerodep_flx_fixed_tod,1, mpiint, 0, mpicom)
299 : #endif
300 :
301 : ! Update module variables with user settings.
302 35328 : specifier = aerodep_flx_specifier
303 1536 : filename = aerodep_flx_file
304 1536 : filelist = aerodep_flx_filelist
305 1536 : datapath = aerodep_flx_datapath
306 1536 : datatype = aerodep_flx_type
307 1536 : rmv_file = aerodep_flx_rmfile
308 1536 : cycle_yr = aerodep_flx_cycle_yr
309 1536 : fixed_ymd = aerodep_flx_fixed_ymd
310 1536 : fixed_tod = aerodep_flx_fixed_tod
311 :
312 : ! Turn on prescribed volcanics if user has specified an input dataset.
313 1536 : if (len_trim(filename) > 0 .and. filename.ne.'NONE' ) has_aerodep_flx = .true.
314 :
315 1536 : end subroutine aerodep_flx_readnl
316 :
317 : !-------------------------------------------------------------------
318 : ! sets the aerosol deposition fluxes in the cam_out structure
319 : ! to be sent to the surface models
320 : !-------------------------------------------------------------------
321 1495368 : subroutine aerodep_flx_set( cam_out, ncol, lchnk )
322 : use camsrfexch, only : cam_out_t
323 :
324 : type(cam_out_t), intent(inout) :: cam_out
325 : integer, intent(in) :: ncol, lchnk
326 :
327 1495368 : if( .not. has_aerodep_flx ) return
328 :
329 1495368 : if (modal_fluxes) then
330 0 : call set_modal_fluxes( cam_out, ncol, lchnk )
331 : else
332 1495368 : call set_bulk_fluxes( cam_out, ncol, lchnk )
333 : endif
334 :
335 1495368 : end subroutine aerodep_flx_set
336 :
337 : !-------------------------------------------------------------------
338 : ! advances the prescribed fluxes to the current time step
339 : !-------------------------------------------------------------------
340 741888 : subroutine aerodep_flx_adv( state, pbuf2d, cam_out )
341 :
342 1495368 : use tracer_data, only : advance_trcdata
343 : use physics_types, only : physics_state
344 : use camsrfexch, only : cam_out_t
345 : use physics_buffer, only : physics_buffer_desc
346 :
347 : implicit none
348 :
349 : type(physics_state), intent(in) :: state(begchunk:endchunk)
350 : type(cam_out_t), intent(inout) :: cam_out(begchunk:endchunk)
351 : type(physics_buffer_desc), pointer :: pbuf2d(:,:)
352 :
353 : integer :: c, ncol
354 :
355 370944 : if( .not. has_aerodep_flx ) return
356 :
357 370944 : call advance_trcdata( fields, file, state, pbuf2d )
358 :
359 : !$OMP PARALLEL DO PRIVATE (C, NCOL)
360 1866312 : do c = begchunk, endchunk
361 1495368 : ncol = state(c)%ncol
362 1866312 : call aerodep_flx_set( cam_out(c), ncol, c )
363 : enddo
364 :
365 370944 : end subroutine aerodep_flx_adv
366 :
367 : !-------------------------------------------------------------------
368 : ! returns true if aerosol dep fluxes are prescribed from dataset
369 : !-------------------------------------------------------------------
370 0 : function aerodep_flx_prescribed()
371 : logical :: aerodep_flx_prescribed
372 0 : aerodep_flx_prescribed = has_aerodep_flx
373 370944 : endfunction aerodep_flx_prescribed
374 :
375 : ! private methods
376 : !-------------------------------------------------------------------
377 : !-------------------------------------------------------------------
378 1495368 : subroutine set_bulk_fluxes( cam_out, ncol, lchnk )
379 : use camsrfexch, only : cam_out_t
380 :
381 : ! Arguments
382 : type(cam_out_t), intent(inout) :: cam_out
383 : integer, intent(in) :: ncol, lchnk
384 :
385 1495368 : call set_fluxes( cam_out%bcphiwet, ibcphiwet, ncol, lchnk )
386 1495368 : call set_fluxes( cam_out%bcphidry, ibcphidry, ncol, lchnk )
387 1495368 : call set_fluxes( cam_out%bcphodry, ibcphodry, ncol, lchnk )
388 :
389 1495368 : call set_fluxes( cam_out%ocphiwet, iocphiwet, ncol, lchnk )
390 1495368 : call set_fluxes( cam_out%ocphidry, iocphidry, ncol, lchnk )
391 1495368 : call set_fluxes( cam_out%ocphodry, iocphodry, ncol, lchnk )
392 :
393 1495368 : call set_fluxes( cam_out%dstdry1, idstdry1, ncol, lchnk )
394 1495368 : call set_fluxes( cam_out%dstdry2, idstdry2, ncol, lchnk )
395 1495368 : call set_fluxes( cam_out%dstdry3, idstdry3, ncol, lchnk )
396 1495368 : call set_fluxes( cam_out%dstdry4, idstdry4, ncol, lchnk )
397 :
398 1495368 : call set_fluxes( cam_out%dstwet1, idstwet1, ncol, lchnk )
399 1495368 : call set_fluxes( cam_out%dstwet2, idstwet2, ncol, lchnk )
400 1495368 : call set_fluxes( cam_out%dstwet3, idstwet3, ncol, lchnk )
401 1495368 : call set_fluxes( cam_out%dstwet4, idstwet4, ncol, lchnk )
402 :
403 1495368 : end subroutine set_bulk_fluxes
404 :
405 : !-------------------------------------------------------------------
406 : !-------------------------------------------------------------------
407 0 : subroutine set_modal_fluxes( cam_out, ncol, lchnk )
408 1495368 : use camsrfexch, only : cam_out_t
409 : use modal_aero_deposition, only : set_srf_drydep, set_srf_wetdep
410 :
411 : ! Arguments
412 : type(cam_out_t), intent(inout) :: cam_out
413 : integer, intent(in) :: ncol, lchnk
414 :
415 : ! local vars
416 : integer :: i
417 : real(r8) :: aerdepdryis(pcols,nmodal_idxs)
418 : real(r8) :: aerdepdrycw(pcols,nmodal_idxs)
419 : real(r8) :: aerdepwetis(pcols,nmodal_idxs)
420 : real(r8) :: aerdepwetcw(pcols,nmodal_idxs)
421 :
422 : ! bin the fluxes as using modal_aero_deposition...
423 :
424 0 : aerdepdryis(:,:) = 0._r8
425 0 : aerdepdrycw(:,:) = 0._r8
426 0 : aerdepwetis(:,:) = 0._r8
427 0 : aerdepwetcw(:,:) = 0._r8
428 :
429 0 : call set_fluxes( aerdepwetis(:ncol,idx_bc1 ), idx_bc1_wetis , ncol, lchnk )
430 0 : call set_fluxes( aerdepwetcw(:ncol,idx_bc1 ), idx_bc1_wetcw , ncol, lchnk )
431 0 : call set_fluxes( aerdepwetis(:ncol,idx_pom1), idx_pom1_wetis, ncol, lchnk )
432 0 : call set_fluxes( aerdepwetcw(:ncol,idx_pom1), idx_pom1_wetcw, ncol, lchnk )
433 0 : call set_fluxes( aerdepwetis(:ncol,idx_soa1), idx_soa1_wetis, ncol, lchnk )
434 0 : call set_fluxes( aerdepwetcw(:ncol,idx_soa1), idx_soa1_wetcw, ncol, lchnk )
435 0 : call set_fluxes( aerdepwetis(:ncol,idx_dst1), idx_dst1_wetis, ncol, lchnk )
436 0 : call set_fluxes( aerdepwetcw(:ncol,idx_dst1), idx_dst1_wetcw, ncol, lchnk )
437 0 : call set_fluxes( aerdepwetis(:ncol,idx_dst3), idx_dst3_wetis, ncol, lchnk )
438 0 : call set_fluxes( aerdepwetcw(:ncol,idx_dst3), idx_dst3_wetcw, ncol, lchnk )
439 :
440 0 : call set_fluxes( aerdepdryis(:ncol,idx_bc1 ), idx_bc1_dryis , ncol, lchnk )
441 0 : call set_fluxes( aerdepdrycw(:ncol,idx_bc1 ), idx_bc1_drycw , ncol, lchnk )
442 0 : call set_fluxes( aerdepdryis(:ncol,idx_pom1), idx_pom1_dryis, ncol, lchnk )
443 0 : call set_fluxes( aerdepdrycw(:ncol,idx_pom1), idx_pom1_drycw, ncol, lchnk )
444 0 : call set_fluxes( aerdepdryis(:ncol,idx_soa1), idx_soa1_dryis, ncol, lchnk )
445 0 : call set_fluxes( aerdepdrycw(:ncol,idx_soa1), idx_soa1_drycw, ncol, lchnk )
446 0 : call set_fluxes( aerdepdryis(:ncol,idx_soa2), idx_soa2_dryis, ncol, lchnk )
447 0 : call set_fluxes( aerdepdrycw(:ncol,idx_soa2), idx_soa2_drycw, ncol, lchnk )
448 0 : call set_fluxes( aerdepdryis(:ncol,idx_dst1), idx_dst1_dryis, ncol, lchnk )
449 0 : call set_fluxes( aerdepdrycw(:ncol,idx_dst1), idx_dst1_drycw, ncol, lchnk )
450 0 : call set_fluxes( aerdepdryis(:ncol,idx_dst3), idx_dst3_dryis, ncol, lchnk )
451 0 : call set_fluxes( aerdepdrycw(:ncol,idx_dst3), idx_dst3_drycw, ncol, lchnk )
452 :
453 0 : call set_srf_drydep(aerdepdryis, aerdepdrycw, cam_out)
454 0 : call set_srf_wetdep(aerdepwetis, aerdepwetcw, cam_out)
455 :
456 0 : end subroutine set_modal_fluxes
457 :
458 : !-------------------------------------------------------------------
459 : !-------------------------------------------------------------------
460 20935152 : subroutine set_fluxes( fluxes, fld_indx, ncol, lchnk )
461 0 : use cam_history, only : outfld
462 :
463 : real(r8), intent(inout) :: fluxes(:)
464 : integer, intent(in) :: fld_indx, ncol, lchnk
465 :
466 : integer :: i
467 :
468 20935152 : if (fld_indx<1) return
469 :
470 349568352 : do i = 1,ncol
471 : ! modal aero wet dep history fields are negative
472 349568352 : fluxes(i) = fields(fld_indx)%data(i,1,lchnk)
473 : enddo
474 :
475 20935152 : call outfld(trim(fields(fld_indx)%fldnam)//'_D', fluxes(:ncol), ncol, lchnk )
476 :
477 20935152 : endsubroutine set_fluxes
478 :
479 : !-------------------------------------------------------------------
480 : !-------------------------------------------------------------------
481 21504 : integer function get_ndx( name, list )
482 :
483 : implicit none
484 : character(len=*), intent(in) :: name
485 : character(len=*), intent(in) :: list(:)
486 :
487 : integer :: i
488 : integer :: maxnum
489 :
490 21504 : maxnum = size(list)
491 :
492 21504 : get_ndx = -1
493 161280 : do i = 1, maxnum
494 161280 : if ( trim(name) == trim(list(i)) ) then
495 21504 : get_ndx = i
496 21504 : return
497 : endif
498 : enddo
499 :
500 20935152 : end function get_ndx
501 :
502 : end module aerodep_flx
|