source: palm/trunk/SOURCE/data_output_mask.f90 @ 1682

Last change on this file since 1682 was 1682, checked in by knoop, 9 years ago

Code annotations made doxygen readable

  • Property svn:keywords set to Id
File size: 22.7 KB
Line 
1!> @file data_output_mask.f90
2!--------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the terms
6! of the GNU General Public License as published by the Free Software Foundation,
7! either version 3 of the License, or (at your option) any later version.
8!
9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
10! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
12!
13! You should have received a copy of the GNU General Public License along with
14! PALM. If not, see <http://www.gnu.org/licenses/>.
15!
16! Copyright 1997-2014 Leibniz Universitaet Hannover
17!--------------------------------------------------------------------------------!
18!
19! Current revisions:
20! -----------------
21! Code annotations made doxygen readable
22!
23! Former revisions:
24! -----------------
25! $Id: data_output_mask.f90 1682 2015-10-07 23:56:08Z knoop $
26!
27! 1585 2015-04-30 07:05:52Z maronga
28! Added support for RRTMG
29!
30! 1438 2014-07-22 14:14:06Z heinze
31! +nr, qc, qr
32!
33! 1359 2014-04-11 17:15:14Z hoffmann
34! New particle structure integrated.
35!
36! 1353 2014-04-08 15:21:23Z heinze
37! REAL constants provided with KIND-attribute
38!
39! 1327 2014-03-21 11:00:16Z raasch
40!
41!
42! 1320 2014-03-20 08:40:49Z raasch
43! ONLY-attribute added to USE-statements,
44! kind-parameters added to all INTEGER and REAL declaration statements,
45! kinds are defined in new module kinds,
46! revision history before 2012 removed,
47! comment fields (!:) to be used for variable explanations added to
48! all variable declaration statements
49!
50! 1318 2014-03-17 13:35:16Z raasch
51! barrier argument removed from cpu_log,
52! module interfaces removed
53!
54! 1092 2013-02-02 11:24:22Z raasch
55! unused variables removed
56!
57! 1036 2012-10-22 13:43:42Z raasch
58! code put under GPL (PALM 3.9)
59!
60! 1031 2012-10-19 14:35:30Z raasch
61! netCDF4 without parallel file support implemented
62!
63! 1007 2012-09-19 14:30:36Z franke
64! Bugfix: calculation of pr must depend on the particle weighting factor,
65! missing calculation of ql_vp added
66!
67! 410 2009-12-04 17:05:40Z letzel
68! Initial version
69!
70! Description:
71! ------------
72!> Masked data output in netCDF format for current mask (current value of mid).
73!------------------------------------------------------------------------------!
74 SUBROUTINE data_output_mask( av )
75
76 
77
78#if defined( __netcdf )
79    USE arrays_3d,                                                             &
80        ONLY:  e, nr, p, pt, q, qc, ql, ql_c, ql_v, qr, rho, sa, tend, u,      &
81               v, vpt, w
82   
83    USE averaging,                                                             &
84        ONLY:  e_av, lpt_av, nr_av, p_av, pc_av, pr_av, pt_av, q_av, qc_av,    &
85               ql_av, ql_c_av, ql_v_av, ql_vp_av, qv_av, qr_av, rho_av, s_av,  &
86               sa_av, u_av, v_av, vpt_av, w_av 
87   
88    USE cloud_parameters,                                                      &
89        ONLY:  l_d_cp, pt_d_t
90   
91    USE control_parameters,                                                    &
92        ONLY:  cloud_physics, domask, domask_no, domask_time_count,            &
93               mask_i, mask_j, mask_k, mask_size, mask_size_l,                 &
94               mask_start_l, max_masks, message_string, mid,                   &
95               netcdf_data_format, nz_do3d, simulated_time
96    USE cpulog,                                                                &
97        ONLY:  cpu_log, log_point
98
99
100   
101    USE indices,                                                               &
102        ONLY:  nbgp, nxl, nxr, nyn, nys, nzb, nzt
103       
104    USE kinds
105   
106    USE netcdf
107   
108    USE netcdf_control
109   
110    USE particle_attributes,                                                   &
111        ONLY:  grid_particles, number_of_particles, particles,                 &
112               particle_advection_start, prt_count
113   
114    USE pegrid
115
116    USE radiation_model_mod,                                                   &
117        ONLY:  rad_lw_in, rad_lw_in_av, rad_lw_out, rad_lw_out_av,             &
118               rad_sw_in, rad_sw_in_av, rad_sw_out, rad_sw_out_av
119
120    IMPLICIT NONE
121
122    INTEGER(iwp) ::  av       !<
123    INTEGER(iwp) ::  ngp      !<
124    INTEGER(iwp) ::  i        !<
125    INTEGER(iwp) ::  if       !<
126    INTEGER(iwp) ::  j        !<
127    INTEGER(iwp) ::  k        !<
128    INTEGER(iwp) ::  n        !<
129    INTEGER(iwp) ::  psi      !<
130    INTEGER(iwp) ::  sender   !<
131    INTEGER(iwp) ::  ind(6)   !<
132   
133    LOGICAL ::  found         !<
134    LOGICAL ::  resorted      !<
135   
136    REAL(wp) ::  mean_r       !<
137    REAL(wp) ::  s_r2         !<
138    REAL(wp) ::  s_r3         !<
139   
140    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  local_pf    !<
141#if defined( __parallel )
142    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  total_pf    !<
143#endif
144    REAL(wp), DIMENSION(:,:,:), POINTER ::  to_be_resorted  !<
145
146!
147!-- Return, if nothing to output
148    IF ( domask_no(mid,av) == 0 )  RETURN
149
150    CALL cpu_log (log_point(49),'data_output_mask','start')
151
152!
153!-- Open output file.
154    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
155       CALL check_open( 200+mid+av*max_masks )
156    ENDIF 
157
158!
159!-- Allocate total and local output arrays.
160#if defined( __parallel )
161    IF ( myid == 0 )  THEN
162       ALLOCATE( total_pf(mask_size(mid,1),mask_size(mid,2),mask_size(mid,3)) )
163    ENDIF
164#endif
165    ALLOCATE( local_pf(mask_size_l(mid,1),mask_size_l(mid,2), &
166                       mask_size_l(mid,3)) )
167
168!
169!-- Update the netCDF time axis.
170    domask_time_count(mid,av) = domask_time_count(mid,av) + 1
171    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
172       nc_stat = NF90_PUT_VAR( id_set_mask(mid,av), id_var_time_mask(mid,av), &
173                               (/ simulated_time /),                          &
174                               start = (/ domask_time_count(mid,av) /),       &
175                               count = (/ 1 /) )
176       CALL handle_netcdf_error( 'data_output_mask', 460 )
177    ENDIF
178
179!
180!-- Loop over all variables to be written.
181    if = 1
182
183    DO  WHILE ( domask(mid,av,if)(1:1) /= ' ' )
184!
185!--    Reallocate local_pf on PE 0 since its shape changes during MPI exchange
186       IF ( netcdf_data_format < 5   .AND.  myid == 0  .AND.  if > 1 )  THEN
187          DEALLOCATE( local_pf )
188          ALLOCATE( local_pf(mask_size_l(mid,1),mask_size_l(mid,2), &
189                             mask_size_l(mid,3)) )
190       ENDIF
191!
192!--    Store the variable chosen.
193       resorted = .FALSE.
194       SELECT CASE ( TRIM( domask(mid,av,if) ) )
195
196          CASE ( 'e' )
197             IF ( av == 0 )  THEN
198                to_be_resorted => e
199             ELSE
200                to_be_resorted => e_av
201             ENDIF
202
203          CASE ( 'lpt' )
204             IF ( av == 0 )  THEN
205                to_be_resorted => pt
206             ELSE
207                to_be_resorted => lpt_av
208             ENDIF
209
210          CASE ( 'nr' )
211             IF ( av == 0 )  THEN
212                to_be_resorted => nr
213             ELSE
214                to_be_resorted => nr_av
215             ENDIF
216
217          CASE ( 'p' )
218             IF ( av == 0 )  THEN
219                to_be_resorted => p
220             ELSE
221                to_be_resorted => p_av
222             ENDIF
223
224          CASE ( 'pc' )  ! particle concentration (requires ghostpoint exchange)
225             IF ( av == 0 )  THEN
226                tend = prt_count
227                CALL exchange_horiz( tend, nbgp )
228                DO  i = 1, mask_size_l(mid,1)
229                   DO  j = 1, mask_size_l(mid,2)
230                      DO  k = 1, mask_size_l(mid,3)
231                         local_pf(i,j,k) =  tend(mask_k(mid,k), &
232                                   mask_j(mid,j),mask_i(mid,i))
233                      ENDDO
234                   ENDDO
235                ENDDO
236                resorted = .TRUE.
237             ELSE
238                CALL exchange_horiz( pc_av, nbgp )
239                to_be_resorted => pc_av
240             ENDIF
241
242          CASE ( 'pr' )  ! mean particle radius (effective radius)
243             IF ( av == 0 )  THEN
244                IF ( simulated_time >= particle_advection_start )  THEN
245                   DO  i = nxl, nxr
246                      DO  j = nys, nyn
247                         DO  k = nzb, nz_do3d
248                            number_of_particles = prt_count(k,j,i)
249                            IF (number_of_particles <= 0)  CYCLE
250                            particles => grid_particles(k,j,i)%particles(1:number_of_particles)
251                            s_r2 = 0.0_wp
252                            s_r3 = 0.0_wp
253                            DO  n = 1, number_of_particles
254                               IF ( particles(n)%particle_mask )  THEN
255                                  s_r2 = s_r2 + grid_particles(k,j,i)%particles(n)%radius**2 * &
256                                         grid_particles(k,j,i)%particles(n)%weight_factor
257                                  s_r3 = s_r3 + grid_particles(k,j,i)%particles(n)%radius**3 * &
258                                         grid_particles(k,j,i)%particles(n)%weight_factor
259                               ENDIF
260                            ENDDO
261                            IF ( s_r2 > 0.0_wp )  THEN
262                               mean_r = s_r3 / s_r2
263                            ELSE
264                               mean_r = 0.0_wp
265                            ENDIF
266                            tend(k,j,i) = mean_r
267                         ENDDO
268                      ENDDO
269                   ENDDO
270                   CALL exchange_horiz( tend, nbgp )
271                ELSE
272                   tend = 0.0_wp
273                ENDIF
274                DO  i = 1, mask_size_l(mid,1)
275                   DO  j = 1, mask_size_l(mid,2)
276                      DO  k = 1, mask_size_l(mid,3)
277                         local_pf(i,j,k) =  tend(mask_k(mid,k), &
278                                   mask_j(mid,j),mask_i(mid,i))
279                      ENDDO
280                   ENDDO
281                ENDDO
282                resorted = .TRUE.
283             ELSE
284                CALL exchange_horiz( pr_av, nbgp )
285                to_be_resorted => pr_av
286             ENDIF
287
288          CASE ( 'pt' )
289             IF ( av == 0 )  THEN
290                IF ( .NOT. cloud_physics ) THEN
291                   to_be_resorted => pt
292                ELSE
293                   DO  i = 1, mask_size_l(mid,1)
294                      DO  j = 1, mask_size_l(mid,2)
295                         DO  k = 1, mask_size_l(mid,3)
296                            local_pf(i,j,k) =  &
297                                 pt(mask_k(mid,k),mask_j(mid,j),mask_i(mid,i)) &
298                                 + l_d_cp * pt_d_t(mask_k(mid,k)) * &
299                                   ql(mask_k(mid,k),mask_j(mid,j),mask_i(mid,i))
300                         ENDDO
301                      ENDDO
302                   ENDDO
303                   resorted = .TRUE.
304                ENDIF
305             ELSE
306                to_be_resorted => pt_av
307             ENDIF
308
309          CASE ( 'q' )
310             IF ( av == 0 )  THEN
311                to_be_resorted => q
312             ELSE
313                to_be_resorted => q_av
314             ENDIF
315
316          CASE ( 'qc' )
317             IF ( av == 0 )  THEN
318                to_be_resorted => qc
319             ELSE
320                to_be_resorted => qc_av
321             ENDIF
322
323          CASE ( 'ql' )
324             IF ( av == 0 )  THEN
325                to_be_resorted => ql
326             ELSE
327                to_be_resorted => ql_av
328             ENDIF
329
330          CASE ( 'ql_c' )
331             IF ( av == 0 )  THEN
332                to_be_resorted => ql_c
333             ELSE
334                to_be_resorted => ql_c_av
335             ENDIF
336
337          CASE ( 'ql_v' )
338             IF ( av == 0 )  THEN
339                to_be_resorted => ql_v
340             ELSE
341                to_be_resorted => ql_v_av
342             ENDIF
343
344          CASE ( 'ql_vp' )
345             IF ( av == 0 )  THEN
346                IF ( simulated_time >= particle_advection_start )  THEN
347                   DO  i = nxl, nxr
348                      DO  j = nys, nyn
349                         DO  k = nzb, nz_do3d
350                            number_of_particles = prt_count(k,j,i)
351                            IF (number_of_particles <= 0)  CYCLE
352                            particles => grid_particles(k,j,i)%particles(1:number_of_particles)
353                            DO  n = 1, number_of_particles
354                               IF ( particles(n)%particle_mask )  THEN
355                                  tend(k,j,i) = tend(k,j,i) + &
356                                          particles(n)%weight_factor / &
357                                          prt_count(k,j,i)
358                               ENDIF
359                            ENDDO
360                         ENDDO
361                      ENDDO
362                   ENDDO
363                   CALL exchange_horiz( tend, nbgp )
364                ELSE
365                   tend = 0.0_wp
366                ENDIF
367                DO  i = 1, mask_size_l(mid,1)
368                   DO  j = 1, mask_size_l(mid,2)
369                      DO  k = 1, mask_size_l(mid,3)
370                         local_pf(i,j,k) =  tend(mask_k(mid,k), &
371                                   mask_j(mid,j),mask_i(mid,i))
372                      ENDDO
373                   ENDDO
374                ENDDO
375                resorted = .TRUE.
376             ELSE
377                CALL exchange_horiz( ql_vp_av, nbgp )
378                to_be_resorted => ql_vp_av
379             ENDIF
380
381          CASE ( 'qv' )
382             IF ( av == 0 )  THEN
383                DO  i = 1, mask_size_l(mid,1)
384                   DO  j = 1, mask_size_l(mid,2)
385                      DO  k = 1, mask_size_l(mid,3)
386                         local_pf(i,j,k) =  &
387                              q(mask_k(mid,k),mask_j(mid,j),mask_i(mid,i)) -  &
388                              ql(mask_k(mid,k),mask_j(mid,j),mask_i(mid,i))
389                      ENDDO
390                   ENDDO
391                ENDDO
392                resorted = .TRUE.
393             ELSE
394                to_be_resorted => qv_av
395             ENDIF
396
397          CASE ( 'qr' )
398             IF ( av == 0 )  THEN
399                to_be_resorted => qr
400             ELSE
401                to_be_resorted => qr_av
402             ENDIF
403
404          CASE ( 'rad_sw_in' )
405             IF ( av == 0 )  THEN
406                to_be_resorted => rad_sw_in
407             ELSE
408                to_be_resorted => rad_sw_in_av
409             ENDIF
410
411          CASE ( 'rad_sw_out' )
412             IF ( av == 0 )  THEN
413                to_be_resorted => rad_sw_out
414             ELSE
415                to_be_resorted => rad_sw_out_av
416             ENDIF
417
418          CASE ( 'rad_lw_in' )
419             IF ( av == 0 )  THEN
420                to_be_resorted => rad_lw_in
421             ELSE
422                to_be_resorted => rad_lw_in_av
423             ENDIF
424
425          CASE ( 'rad_lw_out' )
426             IF ( av == 0 )  THEN
427                to_be_resorted => rad_lw_out
428             ELSE
429                to_be_resorted => rad_lw_out_av
430             ENDIF
431
432          CASE ( 'rho' )
433             IF ( av == 0 )  THEN
434                to_be_resorted => rho
435             ELSE
436                to_be_resorted => rho_av
437             ENDIF
438
439          CASE ( 's' )
440             IF ( av == 0 )  THEN
441                to_be_resorted => q
442             ELSE
443                to_be_resorted => s_av
444             ENDIF
445
446          CASE ( 'sa' )
447             IF ( av == 0 )  THEN
448                to_be_resorted => sa
449             ELSE
450                to_be_resorted => sa_av
451             ENDIF
452
453          CASE ( 'u' )
454             IF ( av == 0 )  THEN
455                to_be_resorted => u
456             ELSE
457                to_be_resorted => u_av
458             ENDIF
459
460          CASE ( 'v' )
461             IF ( av == 0 )  THEN
462                to_be_resorted => v
463             ELSE
464                to_be_resorted => v_av
465             ENDIF
466
467          CASE ( 'vpt' )
468             IF ( av == 0 )  THEN
469                to_be_resorted => vpt
470             ELSE
471                to_be_resorted => vpt_av
472             ENDIF
473
474          CASE ( 'w' )
475             IF ( av == 0 )  THEN
476                to_be_resorted => w
477             ELSE
478                to_be_resorted => w_av
479             ENDIF
480
481          CASE DEFAULT
482!
483!--          User defined quantity
484             CALL user_data_output_mask(av, domask(mid,av,if), found, local_pf )
485             resorted = .TRUE.
486
487             IF ( .NOT. found )  THEN
488                WRITE ( message_string, * ) 'no output available for: ', &
489                                            TRIM( domask(mid,av,if) )
490                CALL message( 'data_output_mask', 'PA0327', 0, 0, 0, 6, 0 )
491             ENDIF
492
493       END SELECT
494
495!
496!--    Resort the array to be output, if not done above
497       IF ( .NOT. resorted )  THEN
498          DO  i = 1, mask_size_l(mid,1)
499             DO  j = 1, mask_size_l(mid,2)
500                DO  k = 1, mask_size_l(mid,3)
501                   local_pf(i,j,k) =  to_be_resorted(mask_k(mid,k), &
502                                      mask_j(mid,j),mask_i(mid,i))
503                ENDDO
504             ENDDO
505          ENDDO
506       ENDIF
507
508!
509!--    I/O block. I/O methods are implemented
510!--    (1) for parallel execution
511!--     a. with netCDF 4 parallel I/O-enabled library
512!--     b. with netCDF 3 library
513!--    (2) for serial execution.
514!--    The choice of method depends on the correct setting of preprocessor
515!--    directives __parallel and __netcdf4_parallel as well as on the parameter
516!--    netcdf_data_format.
517#if defined( __parallel )
518#if defined( __netcdf4_parallel )
519       IF ( netcdf_data_format > 4 )  THEN
520!
521!--       (1) a. Parallel I/O using netCDF 4 (not yet tested)
522          nc_stat = NF90_PUT_VAR( id_set_mask(mid,av),  &
523               id_var_domask(mid,av,if),  &
524               local_pf,  &
525               start = (/ mask_start_l(mid,1), mask_start_l(mid,2),  &
526                          mask_start_l(mid,3), domask_time_count(mid,av) /),  &
527               count = (/ mask_size_l(mid,1), mask_size_l(mid,2),  &
528                          mask_size_l(mid,3), 1 /) )
529          CALL handle_netcdf_error( 'data_output_mask', 461 )
530       ELSE
531#endif
532!
533!--       (1) b. Conventional I/O only through PE0
534!--       PE0 receives partial arrays from all processors of the respective mask
535!--       and outputs them. Here a barrier has to be set, because otherwise
536!--       "-MPI- FATAL: Remote protocol queue full" may occur.
537          CALL MPI_BARRIER( comm2d, ierr )
538
539          ngp = mask_size_l(mid,1) * mask_size_l(mid,2) * mask_size_l(mid,3)
540          IF ( myid == 0 )  THEN
541!
542!--          Local array can be relocated directly.
543             total_pf( &
544               mask_start_l(mid,1):mask_start_l(mid,1)+mask_size_l(mid,1)-1, &
545               mask_start_l(mid,2):mask_start_l(mid,2)+mask_size_l(mid,2)-1, &
546               mask_start_l(mid,3):mask_start_l(mid,3)+mask_size_l(mid,3)-1 ) &
547               = local_pf
548!
549!--          Receive data from all other PEs.
550             DO  n = 1, numprocs-1
551!
552!--             Receive index limits first, then array.
553!--             Index limits are received in arbitrary order from the PEs.
554                CALL MPI_RECV( ind(1), 6, MPI_INTEGER, MPI_ANY_SOURCE, 0,  &
555                     comm2d, status, ierr )
556!
557!--             Not all PEs have data for the mask
558                IF ( ind(1) /= -9999 )  THEN
559                   ngp = ( ind(2)-ind(1)+1 ) * (ind(4)-ind(3)+1 ) *  &
560                         ( ind(6)-ind(5)+1 )
561                   sender = status(MPI_SOURCE)
562                   DEALLOCATE( local_pf )
563                   ALLOCATE(local_pf(ind(1):ind(2),ind(3):ind(4),ind(5):ind(6)))
564                   CALL MPI_RECV( local_pf(ind(1),ind(3),ind(5)), ngp,  &
565                        MPI_REAL, sender, 1, comm2d, status, ierr )
566                   total_pf(ind(1):ind(2),ind(3):ind(4),ind(5):ind(6)) &
567                        = local_pf
568                ENDIF
569             ENDDO
570
571             nc_stat = NF90_PUT_VAR( id_set_mask(mid,av),  &
572                  id_var_domask(mid,av,if), total_pf, &
573                  start = (/ 1, 1, 1, domask_time_count(mid,av) /), &
574                  count = (/ mask_size(mid,1), mask_size(mid,2), &
575                             mask_size(mid,3), 1 /) )
576             CALL handle_netcdf_error( 'data_output_mask', 462 )
577
578          ELSE
579!
580!--          If at least part of the mask resides on the PE, send the index
581!--          limits for the target array, otherwise send -9999 to PE0.
582             IF ( mask_size_l(mid,1) > 0 .AND.  mask_size_l(mid,2) > 0 .AND. &
583                  mask_size_l(mid,3) > 0  ) &
584                  THEN
585                ind(1) = mask_start_l(mid,1)
586                ind(2) = mask_start_l(mid,1) + mask_size_l(mid,1) - 1
587                ind(3) = mask_start_l(mid,2)
588                ind(4) = mask_start_l(mid,2) + mask_size_l(mid,2) - 1
589                ind(5) = mask_start_l(mid,3)
590                ind(6) = mask_start_l(mid,3) + mask_size_l(mid,3) - 1
591             ELSE
592                ind(1) = -9999; ind(2) = -9999
593                ind(3) = -9999; ind(4) = -9999
594                ind(5) = -9999; ind(6) = -9999
595             ENDIF
596             CALL MPI_SEND( ind(1), 6, MPI_INTEGER, 0, 0, comm2d, ierr )
597!
598!--          If applicable, send data to PE0.
599             IF ( ind(1) /= -9999 )  THEN
600                CALL MPI_SEND( local_pf(1,1,1), ngp, MPI_REAL, 0, 1, comm2d, &
601                     ierr )
602             ENDIF
603          ENDIF
604!
605!--       A barrier has to be set, because otherwise some PEs may proceed too
606!--       fast so that PE0 may receive wrong data on tag 0.
607          CALL MPI_BARRIER( comm2d, ierr )
608#if defined( __netcdf4_parallel )
609       ENDIF
610#endif
611#else
612!
613!--    (2) For serial execution of PALM, the single processor (PE0) holds all
614!--    data and writes them directly to file.
615       nc_stat = NF90_PUT_VAR( id_set_mask(mid,av),  &
616            id_var_domask(mid,av,if),       &
617            local_pf, &
618            start = (/ 1, 1, 1, domask_time_count(mid,av) /), &
619            count = (/ mask_size_l(mid,1), mask_size_l(mid,2), &
620                       mask_size_l(mid,3), 1 /) )
621       CALL handle_netcdf_error( 'data_output_mask', 463 )
622#endif
623
624       if = if + 1
625
626    ENDDO
627
628!
629!-- Deallocate temporary arrays.
630    DEALLOCATE( local_pf )
631#if defined( __parallel )
632    IF ( myid == 0 )  THEN
633       DEALLOCATE( total_pf )
634    ENDIF
635#endif
636
637
638    CALL cpu_log( log_point(49), 'data_output_mask', 'stop' )
639#endif
640
641 END SUBROUTINE data_output_mask
Note: See TracBrowser for help on using the repository browser.