-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathfopensoilcode.c
More file actions
128 lines (124 loc) · 4.39 KB
/
fopensoilcode.c
File metadata and controls
128 lines (124 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**************************************************************************************/
/** \n**/
/** f o p e n s o i l c o d e . c \n**/
/** \n**/
/** C implementation of LPJmL \n**/
/** \n**/
/** Function opens soil code file \n**/
/** \n**/
/** (C) Potsdam Institute for Climate Impact Research (PIK), see COPYRIGHT file \n**/
/** authors, and contributors see AUTHORS file \n**/
/** This file is part of LPJmL and licensed under GNU AGPL Version 3 \n**/
/** or later. See LICENSE file or go to http://www.gnu.org/licenses/ \n**/
/** Contact: https://github.com/PIK-LPJmL/LPJmL \n**/
/** \n**/
/**************************************************************************************/
#include "lpj.h"
FILE *fopensoilcode(const Filename *filename, /**< filename of soil code file */
Map **map, /**< soilmap array or NULL */
Bool *swap, /**< byte order has to be changed */
size_t *offset, /**< offset in binary file */
Type *type, /**< data type in soilcode file */
unsigned int nsoil, /**< number of soil types */
Bool isout /**< enable output of error messages */
) /** \return file pointer or NULL */
{
FILE *file;
Header header;
int version;
if(filename->fmt==META)
{
header.scalar=1;
header.order=CELLYEAR;
header.nbands=1;
header.nstep=1;
header.datatype=LPJ_BYTE;
header.firstcell=0;
header.ncell=0;
header.nyear=1;
header.cellsize_lon=header.cellsize_lat=0.5;
file=openmetafile(&header,map,filename->map,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,swap,offset,filename->name,isout);
if(file==NULL)
return file;
*type=header.datatype;
if(header.nbands!=1)
{
if(isout)
fprintf(stderr,"ERROR127: Invalid number of bands %d in '%s', must be 1.\n",
header.nbands,filename->name);
fclose(file);
return NULL;
}
if(header.nstep!=1)
{
if(isout)
fprintf(stderr,"ERROR127: Invalid number of steps %d in '%s', must be 1.\n",
header.nstep,filename->name);
fclose(file);
return NULL;
}
return file;
}
if(map!=NULL)
*map=NULL;
file=fopen(filename->name,"rb");
if(file==NULL)
{
if(isout)
printfopenerr(filename->name);
return NULL;
}
if(filename->fmt==RAW)
{
*swap=FALSE;
if(nsoil<UCHAR_MAX)
*type=LPJ_BYTE;
else if(nsoil<USHRT_MAX)
*type=LPJ_SHORT;
else
*type=LPJ_INT;
*offset=0;
}
else
{
if(filename->fmt==CLM)
version=READ_VERSION;
else
version=2;
if(freadheader(file,&header,swap,LPJSOIL_HEADER,&version,isout))
{
if(isout)
fprintf(stderr,"ERROR154: Invalid header in '%s'.\n",filename->name);
fclose(file);
return NULL;
}
if(version>2)
*type=header.datatype;
else if(nsoil<UCHAR_MAX)
*type=LPJ_BYTE;
else if(nsoil<USHRT_MAX)
*type=LPJ_SHORT;
else
*type=LPJ_INT;
if(header.nbands!=1)
{
if(isout)
fprintf(stderr,"ERROR127: Invalid number of bands %d in '%s', must be 1.\n",
header.nbands,filename->name);
fclose(file);
return NULL;
}
if(header.nstep!=1)
{
if(isout)
fprintf(stderr,"ERROR127: Invalid number of steps %d in '%s', must be 1.\n",
header.nstep,filename->name);
fclose(file);
return NULL;
}
*offset=headersize(LPJSOIL_HEADER,version);
if(isout && getfilesizep(file)!=typesizes[*type]*header.ncell+*offset)
fprintf(stderr,"WARNING032: File size of '%s' does not match header.\n",filename->name);
}
return file;
} /* of 'fopensoilcode' */