1 | MODULE module_get_file_names |
---|
2 | |
---|
3 | ! This module is used by the ndown program. We can have multiple output |
---|
4 | ! files generated from the wrf program. To remove the what-are-the- |
---|
5 | ! files-to-input-to-ndown task from the user, we use a couple of UNIX |
---|
6 | ! commands. These are activated from either the "system" command or |
---|
7 | ! the "exec" command. Neither is part of the Fortran standard. |
---|
8 | |
---|
9 | INTEGER :: number_of_eligible_files |
---|
10 | CHARACTER(LEN=132) , DIMENSION(:) , ALLOCATABLE :: eligible_file_name |
---|
11 | |
---|
12 | CONTAINS |
---|
13 | |
---|
14 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
15 | #ifdef crayx1 |
---|
16 | SUBROUTINE system(cmd) |
---|
17 | IMPLICIT NONE |
---|
18 | CHARACTER (LEN=*) , INTENT(IN) :: cmd |
---|
19 | integer :: ierr |
---|
20 | call pxfsystem(cmd, len(cmd), ierr) |
---|
21 | RETURN |
---|
22 | END SUBROUTINE system |
---|
23 | #endif |
---|
24 | |
---|
25 | SUBROUTINE unix_ls ( root , id ) |
---|
26 | USE module_dm |
---|
27 | |
---|
28 | IMPLICIT NONE |
---|
29 | |
---|
30 | CHARACTER (LEN=*) , INTENT(IN) :: root |
---|
31 | INTEGER , INTENT(IN) :: id |
---|
32 | |
---|
33 | CHARACTER (LEN=132) :: command |
---|
34 | INTEGER :: ierr , loop , loslen , strlen |
---|
35 | LOGICAL :: unix_access_ok |
---|
36 | LOGICAL, EXTERNAL :: wrf_dm_on_monitor |
---|
37 | CHARACTER*256 message |
---|
38 | |
---|
39 | ! This is to make sure that we successfully use one of the available methods |
---|
40 | ! for getting at a UNIX command. This is an initialized flag. |
---|
41 | |
---|
42 | unix_access_ok = .FALSE. |
---|
43 | |
---|
44 | ! Build a UNIX command, and "ls", of all of the files mnatching the "root*" prefix. |
---|
45 | |
---|
46 | monitor_only_code : IF ( wrf_dm_on_monitor() ) THEN |
---|
47 | |
---|
48 | loslen = LEN ( command ) |
---|
49 | CALL all_spaces ( command , loslen ) |
---|
50 | WRITE ( command , FMT='("ls -1 ",A,"*d",I2.2,"* > .foo")' ) TRIM ( root ) , id |
---|
51 | |
---|
52 | ! We stuck all of the matching files in the ".foo" file. Now we place the |
---|
53 | ! number of the those file (i.e. how many there are) in ".foo1". Also, if we |
---|
54 | ! do get inside one of these CPP ifdefs, then we set our access flag to true. |
---|
55 | |
---|
56 | #ifdef NONSTANDARD_SYSTEM |
---|
57 | CALL SYSTEM ( TRIM ( command ) ) |
---|
58 | CALL SYSTEM ( '( cat .foo | wc -l > .foo1 )' ) |
---|
59 | unix_access_ok = .TRUE. |
---|
60 | #endif |
---|
61 | #ifdef NONSTANDARD_EXEC |
---|
62 | CALL SYSTEM ( TRIM ( command ) ) |
---|
63 | CALL SYSTEM ( '( cat .foo | wc -l > .foo1 )' ) |
---|
64 | unix_access_ok = .TRUE. |
---|
65 | #endif |
---|
66 | |
---|
67 | ! Test to be sure that we did indeed hit one of the ifdefs. |
---|
68 | |
---|
69 | IF ( .NOT. unix_access_ok ) THEN |
---|
70 | PRINT *,'Oops, how can I access UNIX commands from Fortran?' |
---|
71 | CALL wrf_error_fatal ( 'system_or_exec_only' ) |
---|
72 | END IF |
---|
73 | |
---|
74 | ! Read the number of files. |
---|
75 | |
---|
76 | OPEN (FILE = '.foo1' , & |
---|
77 | UNIT = 112 , & |
---|
78 | STATUS = 'OLD' , & |
---|
79 | ACCESS = 'SEQUENTIAL' , & |
---|
80 | FORM = 'FORMATTED' ) |
---|
81 | |
---|
82 | READ ( 112 , * ) number_of_eligible_files |
---|
83 | CLOSE ( 112 ) |
---|
84 | |
---|
85 | ! If there are zero files, we are toast. |
---|
86 | |
---|
87 | IF ( number_of_eligible_files .LE. 0 ) THEN |
---|
88 | PRINT *,'Oops, we need at least ONE input file (wrfout*) for the ndown program to read.' |
---|
89 | CALL wrf_error_fatal ( 'need_wrfout_input_data' ) |
---|
90 | END IF |
---|
91 | |
---|
92 | ENDIF monitor_only_code |
---|
93 | |
---|
94 | ! On the monitor proc, we got the number of files. We use that number to |
---|
95 | ! allocate space on all of the procs. |
---|
96 | |
---|
97 | CALL wrf_dm_bcast_integer ( number_of_eligible_files, 1 ) |
---|
98 | |
---|
99 | ! Allocate space for this many files. |
---|
100 | |
---|
101 | ALLOCATE ( eligible_file_name(number_of_eligible_files) , STAT=ierr ) |
---|
102 | |
---|
103 | ! Did the allocate work OK? |
---|
104 | |
---|
105 | IF ( ierr .NE. 0 ) THEN |
---|
106 | print *,'tried to allocate ',number_of_eligible_files,' eligible files, (look at ./foo)' |
---|
107 | WRITE(message,*)'module_get_file_names: unix_ls: unable to allocate filename array Status = ',ierr |
---|
108 | CALL wrf_error_fatal( message ) |
---|
109 | END IF |
---|
110 | |
---|
111 | ! Initialize all of the file names to blank. |
---|
112 | |
---|
113 | CALL init_module_get_file_names |
---|
114 | |
---|
115 | ! Now we go back to a single monitor proc to read in the file names. |
---|
116 | |
---|
117 | monitor_only_code2: IF ( wrf_dm_on_monitor() ) THEN |
---|
118 | |
---|
119 | ! Open the file that has the list of filenames. |
---|
120 | |
---|
121 | OPEN (FILE = '.foo' , & |
---|
122 | UNIT = 111 , & |
---|
123 | STATUS = 'OLD' , & |
---|
124 | ACCESS = 'SEQUENTIAL' , & |
---|
125 | FORM = 'FORMATTED' ) |
---|
126 | |
---|
127 | ! Read all of the file names and store them. |
---|
128 | |
---|
129 | DO loop = 1 , number_of_eligible_files |
---|
130 | READ ( 111 , FMT='(A)' ) eligible_file_name(loop) |
---|
131 | print *,TRIM(eligible_file_name(loop)) |
---|
132 | END DO |
---|
133 | CLOSE ( 111 ) |
---|
134 | |
---|
135 | ! We clean up our own messes. |
---|
136 | |
---|
137 | #ifdef NONSTANDARD_SYSTEM |
---|
138 | CALL SYSTEM ( '/bin/rm -f .foo' ) |
---|
139 | CALL SYSTEM ( '/bin/rm -f .foo1' ) |
---|
140 | #endif |
---|
141 | #ifdef NONSTANDARD_EXEC |
---|
142 | CALL SYSTEM ( '/bin/rm -f .foo' ) |
---|
143 | CALL SYSTEM ( '/bin/rm -f .foo1' ) |
---|
144 | #endif |
---|
145 | |
---|
146 | ENDIF monitor_only_code2 |
---|
147 | |
---|
148 | ! Broadcast the file names to everyone on all of the procs. |
---|
149 | |
---|
150 | DO loop = 1 , number_of_eligible_files |
---|
151 | strlen = LEN( TRIM( eligible_file_name(loop) ) ) |
---|
152 | CALL wrf_dm_bcast_string ( eligible_file_name(loop) , strlen ) |
---|
153 | ENDDO |
---|
154 | |
---|
155 | END SUBROUTINE unix_ls |
---|
156 | |
---|
157 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
158 | |
---|
159 | SUBROUTINE all_spaces ( command , length_of_char ) |
---|
160 | |
---|
161 | IMPLICIT NONE |
---|
162 | |
---|
163 | INTEGER :: length_of_char |
---|
164 | CHARACTER (LEN=length_of_char) :: command |
---|
165 | INTEGER :: loop |
---|
166 | |
---|
167 | DO loop = 1 , length_of_char |
---|
168 | command(loop:loop) = ' ' |
---|
169 | END DO |
---|
170 | |
---|
171 | END SUBROUTINE all_spaces |
---|
172 | |
---|
173 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
174 | |
---|
175 | SUBROUTINE init_module_get_file_names |
---|
176 | |
---|
177 | IMPLICIT NONE |
---|
178 | eligible_file_name = ' ' // & |
---|
179 | ' ' // & |
---|
180 | ' ' |
---|
181 | |
---|
182 | END SUBROUTINE init_module_get_file_names |
---|
183 | |
---|
184 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
185 | |
---|
186 | END MODULE module_get_file_names |
---|
187 | |
---|
188 | !program foo |
---|
189 | !USE module_get_file_names |
---|
190 | !call init_module_get_file_names |
---|
191 | !call unix_ls ( 'wrf_real' , 1 ) |
---|
192 | !end program foo |
---|