Newer
Older
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
129
130
131
132
133
134
135
136
137
138
139
140
141
function [ success ] = rfc(pFilename, pFloatDetails, pData)
%RFC Saves the given data to the filename in RFC format.
%
% Parameters:
% pFilename (string) The destination filename.
% pFloatDetails (struct) The FLOAT section that is stored in an RFB
% file.
% pData (matrix) The data that should be written to the RFC file.
% Each line contains one set of data. The matrix format needs to
% be the following:
% IFLAG MESSAGE_NUMBER MESSAGE_DATE TEMP PRES LAT LON u v w
%% Initialize return variables
success = false;
%% Initialize variables required for processing
headerLineIndicator = "** ";
%% Parameter check
parameterError = false;
if (~isstring(pFilename) && ~ischar(pFilename))
warning([mfilename ': Given filename is neither a string nor a char!']);
parameterError = true;
end
if (~isstruct(pFloatDetails))
warning([mfilename ': Given float details is not a struct!']);
parameterError = true;
end
expectedDataColumns = 10;
if (size(pData, 2) ~= expectedDataColumns)
warning([mfilename ': Given data has ' site(pData, 2) ' columns, but ' ...
num2str(expectedDataColumns) ' expected!']);
parameterError = true;
end
if (parameterError)
return;
else
clear parameterError;
end
%% Replace all NaN with default values
defaultValues = repmat(-999, 10);
defaultValues(4) = -9.99; % temperature default value
% start at index 4 because the first three do not have default values
for i = 4:size(pData, 2)
nanIndex = find(isnan(pData(:, i)));
if ~isempty(nanIndex)
pData(nanIndex, i) = repmat(defaultValues(i), 1, size(pData, 1));
end
clear nanIndex;
end
%% Prepare header and add it to the file string
% FLOAT NAME
floatname = num2str(pFloatDetails.floatname);
% FLOAT CYCLE
cycle = num2str(pFloatDetails.cycle(1));
% LAUNCH PARAMETER
launchPositionLat = num2str(pFloatDetails.cycle(2), '%3.2f');
launchPositionLon = num2str(pFloatDetails.cycle(3), '%3.2f');
launchTime = [pFloatDetails.launchtime, 0];
launchTimeRafosDays = num2str( ...
artoa.convert.dmy2rd(launchTime(3), launchTime(2), launchTime(1)) ...
);
launchTime = num2str(launchTime);
% RECOVER PARAMETER
recoverTime = [pFloatDetails.recovertime, 0];
recoverTimeRafosDays = num2str( ...
artoa.convert.dmy2rd(recoverTime(3), recoverTime(2), recoverTime(1)) ...
);
recoverTime = num2str(recoverTime);
% FIRST SURFACE POSITION
surfacePositionLat = num2str(pFloatDetails.cycle(9), '%3.2f');
surfacePositionLon = num2str(pFloatDetails.cycle(10), '%3.2f');
% CYCLE PARAMETER
floatCycleStartTime = [pFloatDetails.cycle(4:8), 0]; % seconds always zero
floatCycleStartTimeRafosDays = num2str( ...
artoa.convert.dmy2rd(floatCycleStartTime(3), floatCycleStartTime(2), floatCycleStartTime(1)) ...
+ artoa.convert.hms2rd(floatCycleStartTime(4), floatCycleStartTime(5), 0) ...
);
floatCycleStartTime = num2str(floatCycleStartTime);
floatCycleEndTime = [pFloatDetails.cycle(11:15), 0]; % seconds always zero
floatCycleEndTimeRafosDays = num2str( ...
artoa.convert.dmy2rd(floatCycleEndTime(3), floatCycleEndTime(2), floatCycleEndTime(1)) ...
+ artoa.convert.hms2rd(floatCycleEndTime(4), floatCycleEndTime(5), 0) ...
);
floatCycleEndTime = num2str(floatCycleEndTime);
header = { ...
['** Float: ' floatname], ...
['** Variables: InterpFlag LineNum RafosDay Temp Pres Lat Lon U V W'], ...
['** Units : # # # degC dbar deg deg cm/s cm/s mm/s'], ...
['** Dummies : NA NA NA -9.99 -999 999 999 999 999 999'], ...
['** Cycle : ' cycle], ...
['** Launch position (Cycle Start position): ' ...
launchPositionLat ' ' launchPositionLon], ...
['** Surface position (Cycle End position) : ' ...
surfacePositionLat ' ' surfacePositionLat], ...
['** Cycle Start time : ' floatCycleStartTime ' (RAFOS day ' floatCycleStartTimeRafosDays ')'], ...
['** Launch time : ' launchTime ' (RAFOS day ' launchTimeRafosDays ')'], ...
['** Cycle End time : ' floatCycleEndTime ' (RAFOS day ' floatCycleEndTimeRafosDays ')'], ...
['** First surface Position time : ' recoverTime ' (RAFOS day ' recoverTimeRafosDays ')'] ...
};
fileString = [strjoin(header, newline) newline];
%% Generate file format
for i = 1:size(pData, 1)
line = { ...
num2str(pData(i, 1), '%2d') ...
num2str(pData(i, 2), '%3d') ...
num2str(pData(i, 3), '%8.2f') ...
num2str(pData(i, 4), '%6.3f') ...
num2str(pData(i, 5), '%6.1f') ...
num2str(pData(i, 6), '%9.3f') ...
num2str(pData(i, 7), '%8.3f') ...
num2str(pData(i, 8), '%9.2f') ...
num2str(pData(i, 9), '%7.2f') ...
num2str(pData(i, 10), '%7.2f')
};
fileString = [fileString strjoin(line) newline];
end
%% Save to file
fid = fopen(pFilename, 'w');
fprintf(fid, fileString);
fclose(fid);
%% Update return variable
success = true;
end