Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
byte.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include <float.h>
6 #include <math.h>
7 #include <time.h>
8 #include <sys/stat.h>
9 #include <sys/types.h>
10 
11 #ifndef FNAME_H
12 #define FNAME_H
13 
14 /*
15  FORTRAN naming convention
16  default cpgs_setup, etc.
17  -DUPCASE CPGS_SETUP, etc.
18  -DUNDERSCORE cpgs_setup_, etc.
19 */
20 
21 #ifdef UPCASE
22 # define FORTRAN_NAME(low,up) up
23 #else
24 #ifdef UNDERSCORE
25 # define FORTRAN_NAME(low,up) low##_
26 #else
27 # define FORTRAN_NAME(low,up) low
28 #endif
29 #endif
30 
31 #endif
32 
33 #define byte_reverse FORTRAN_NAME(byte_reverse, BYTE_REVERSE)
34 #define byte_reverse8 FORTRAN_NAME(byte_reverse8, BYTE_REVERSE8)
35 #define byte_open FORTRAN_NAME(byte_open, BYTE_OPEN )
36 #define byte_close FORTRAN_NAME(byte_close, BYTE_CLOSE )
37 #define byte_rewind FORTRAN_NAME(byte_rewind, BYTE_REWIND )
38 #define byte_read FORTRAN_NAME(byte_read, BYTE_READ )
39 #define byte_write FORTRAN_NAME(byte_write, BYTE_WRITE )
40 #define set_bytesw_write FORTRAN_NAME(set_bytesw_write,SET_BYTESW_WRITE)
41 #define set_bytesw_read FORTRAN_NAME(set_bytesw_read ,SET_BYTESW_READ )
42 #define get_bytesw_write FORTRAN_NAME(get_bytesw_write,GET_BYTESW_WRITE)
43 #define get_bytesw_read FORTRAN_NAME(get_bytesw_read ,GET_BYTESW_READ )
44 
45 #define READ 1
46 #define WRITE 2
47 #define MAX_NAME 132
48 
49 #define SWAP(a,b) temp=(a); (a)=(b); (b)=temp;
50 
51 static FILE *fp=NULL;
52 static int flag=0;
53 static char name[MAX_NAME+1];
54 
57 
58 /*************************************byte.c***********************************/
59 
60 #ifdef UNDERSCORE
61  void exitt_();
62 #else
63  void exitt();
64 #endif
65 
66 void byte_reverse(float *buf, int *nn,int *ierr)
67 {
68  int n;
69  char temp, *ptr;
70 
71  if (*nn<0)
72  {
73  printf("byte_reverse() :: n must be positive\n");
74  *ierr=1;
75  return;
76  }
77 
78  for (ptr=(char *)buf,n=*nn; n--; ptr+=4)
79  {
80  SWAP(ptr[0],ptr[3])
81  SWAP(ptr[1],ptr[2])
82  }
83  *ierr=0;
84 }
85 
86 void byte_reverse8(float *buf, int *nn,int *ierr)
87 {
88  int n;
89  char temp, *ptr;
90 
91  if (*nn<0)
92  {
93  printf("byte_reverse8() :: n must be positive\n");
94  *ierr=1;
95  return;
96  }
97  if(*nn % 2 != 0)
98  {
99  printf("byte_reverse8() :: n must be multiple of 2\n");
100  *ierr=1;
101  return;
102  }
103 
104  for (ptr=(char *)buf,n=*nn,n=n+2; n-=2; ptr+=8)
105  {
106  SWAP(ptr[0],ptr[7])
107  SWAP(ptr[1],ptr[6])
108  SWAP(ptr[2],ptr[5])
109  SWAP(ptr[3],ptr[4])
110  }
111  *ierr=0;
112 }
113 
114 
115 void byte_open(char *n,int *ierr)
116 {
117  int i,len,istat;
118  char slash;
119  char dirname[MAX_NAME+1];
120 
121  len = strlen(n);
122 
123  if (len<0)
124  {
125  printf("byte_open() :: file name has negative length!\n");
126  *ierr=1;
127  return;
128  }
129 
130  if (len>MAX_NAME)
131  {
132  printf("byte_open() :: file name too long!\n");
133  *ierr=1;
134  return;
135  }
136 
137  strcpy(name,n);
138  strcpy(dirname,n);
139 
140  for (i=1;dirname[i]!='\0';i++)
141  {
142  if (i>0 && dirname[i]=='/')
143  {
144  slash = name[i];
145  dirname[i] = '\0';
146  istat = mkdir(dirname,0755);
147  }
148  }
149  *ierr=0;
150 }
151 
152 void byte_close(int *ierr)
153 {
154  if (!fp) return;
155 
156  if (fclose(fp))
157  {
158  printf("byte_close() :: couldn't fclose file!\n");
159  *ierr=1;
160  return;
161  }
162 
163  fp=NULL;
164  *ierr=0;
165 }
166 
168 {
169  if (!fp) return;
170 
171  rewind(fp);
172 }
173 
174 
175 void byte_write(float *buf, int *n,int *ierr)
176 {
177  int flags;
178  mode_t mode;
179 
180  if (*n<0)
181  {
182  printf("byte_write() :: n must be positive\n");
183  *ierr=1;
184  return;
185  }
186 
187  if (!fp)
188  {
189  if (!(fp=fopen(name,"wb")))
190  {
191  printf("byte_write() :: fopen failure!\n");
192  *ierr=1;
193  return;
194  }
195  flag=WRITE;
196  }
197 
198  if (flag==WRITE)
199  {
200  if (bytesw_write == 1)
201  byte_reverse (buf,n,ierr);
202  fwrite(buf,sizeof(float),*n,fp);
203  }
204  else
205  {
206  printf("byte_write() :: can't fwrite after freading!\n");
207  *ierr=1;
208  return;
209  }
210  *ierr=0;
211 }
212 
213 
214 void byte_read(float *buf, int *n,int *ierr)
215 {
216  int flags;
217  mode_t mode;
218 
219  if (*n<0)
220  {printf("byte_read() :: n must be positive\n"); *ierr=1; return;}
221 
222  if (!fp)
223  {
224  if (!(fp=fopen(name,"rb")))
225  {
226  printf("%s\n",name);
227  printf("byte_read() :: fopen failure2!\n");
228  *ierr=1;
229  return;
230  }
231  flag=READ;
232  }
233 
234  if (flag==READ)
235  {
236  if (bytesw_read == 1)
237  byte_reverse (buf,n,ierr);
238  fread(buf,sizeof(float),*n,fp);
239  if (ferror(fp))
240  {
241  printf("ABORT: Error reading %s\n",name);
242  *ierr=1;
243  return;
244  }
245  else if (feof(fp))
246  {
247  printf("ABORT: EOF found while reading %s\n",name);
248  *ierr=1;
249  return;
250  }
251 
252  }
253  else
254  {
255  printf("byte_read() :: can't fread after fwriting!\n");
256  *ierr=1;
257  return;
258  }
259  *ierr=0;
260 }
261 
262 void set_bytesw_write (int *pa)
263 {
264  if (*pa != 0)
265  bytesw_write = 1;
266  else
267  bytesw_write = 0;
268 }
269 
270 void set_bytesw_read (int *pa)
271 {
272  if (*pa != 0)
273  bytesw_read = 1;
274  else
275  bytesw_read = 0;
276 }
277 
278 void get_bytesw_write (int *pa)
279 {
280  *pa = bytesw_write;
281 }
282 
283 void get_bytesw_read (int *pa)
284 {
285  *pa = bytesw_read;
286 }
#define byte_rewind
Definition: byte.c:37
#define get_bytesw_write
Definition: byte.c:42
#define byte_close
Definition: byte.c:36
#define READ
Definition: byte.c:45
n
Definition: xxt_test.m:73
#define set_bytesw_read
Definition: byte.c:41
#define MAX_NAME
Definition: byte.c:47
int bytesw_write
Definition: byte.c:55
#define byte_read
Definition: byte.c:38
void exitt()
Definition: comm_mpi.F90:411
#define WRITE
Definition: byte.c:46
#define byte_open
Definition: byte.c:35
#define byte_reverse
Definition: byte.c:33
#define set_bytesw_write
Definition: byte.c:40
#define byte_write
Definition: byte.c:39
for i
Definition: xxt_test.m:74
#define byte_reverse8
Definition: byte.c:34
static int flag
Definition: byte.c:52
#define SWAP(a, b)
Definition: byte.c:49
static FILE * fp
Definition: byte.c:51
int bytesw_read
Definition: byte.c:56
#define get_bytesw_read
Definition: byte.c:43
static char name[MAX_NAME+1]
Definition: byte.c:53