root/library/bdm/base/loggers.cpp @ 1068

Revision 1064, 4.8 kB (checked in by mido, 14 years ago)

astyle applied all over the library

  • Property svn:eol-style set to native
Line 
1
2#include "loggers.h"
3#include "../osutils.h"
4
5#include <fcntl.h>
6#ifdef WIN32
7#include <io.h>
8#define open _open
9#define write _write
10#define close _close
11#endif
12
13namespace bdm {
14
15void memlog::init() {
16    int i;
17    int n = entries.length();
18    vectors.set_size ( n );
19    for ( i = 0; i < n; i++ ) {
20        vectors ( i ).set_size ( maxlen, entries ( i )._dsize() );
21
22        // avoid uninitialized memory
23        for ( int j = 0; j < vectors ( i ).rows(); ++j ) {
24            for ( int k = 0; k < vectors ( i ).cols(); ++k ) {
25                vectors ( i ) ( j, k ) = 0;
26            }
27        }
28    }
29}
30
31void memlog::itsave ( const char* fname ) {
32    it_file itf ( fname );
33    int i;
34    string vec_name = "";
35    int istart, iend;
36    for ( i = 0; i < entries.length(); i++ ) {
37        istart = 0;
38        for ( int j = 0; j < entries ( i ).length(); j++ ) { // same for as in add!!!
39            vec_name = names ( i ) + separator + entries ( i ).name ( j );
40            iend = istart + entries ( i ).size ( j ) - 1;
41            itf << Name ( vec_name ) << vectors ( i ).get_cols ( istart, iend );
42            // move start after current end...
43            istart = iend + 1;
44        }
45
46    }
47}
48
49void memlog::from_setting ( const Setting &set ) {
50    UI::get ( maxlen,  set, "maxlen", UI::compulsory );
51    UI::get ( filename, set, "filename" );
52}
53
54void dirfilelog::init() {
55    int i, j, k;
56    int nsc = 0;
57    for ( i = 0; i < entries.length(); i++ ) {
58        nsc += entries ( i )._dsize();
59    }
60    ; //all entries!!
61
62    char filename[200];
63    char num[3];
64
65// Initialize directory
66    makedir ( dirname ); //
67
68// directory OK, or it can be overwritten
69
70//Create filenames
71    scalarnames.set_length ( nsc );
72    // For all entries
73    int ii = 0;
74    for ( i = 0; i < entries.length(); i++ ) { //for entries
75        for ( j = 0; j < entries ( i ).length(); j++ ) { //for RVs in entries
76            int rvsize = entries ( i ).size ( j );
77            // for non-empty names
78            if ( names ( i ).length() > 0 ) {
79                scalarnames ( ii ) = names ( i ) + separator;
80            }
81            // add name
82            scalarnames ( ii ) +=  entries ( i ).name ( j );
83            // add number when needed
84            if ( rvsize > 1 ) {
85                // copy the same name for th whole RV
86                for ( k = 1; k < rvsize; k++ ) {
87                    scalarnames ( ii + k ) = scalarnames ( ii );
88                }
89                // add numbers
90                for ( k = 0; k < rvsize; k++ ) { //for all scalars in given RV
91                    sprintf ( num, "%d", k );
92                    scalarnames ( ii ) += separator + num;
93                    ii++;
94                }
95            } else {
96                ii++;
97            }
98        }
99    }
100    //Create format
101    string frm = "format";
102    get_fname ( filename, dirname, frm );
103
104    FILE* fpf;
105    fpf = fopen ( filename, "w" );
106    for ( i = 0; i < ii; i++ ) {
107        fprintf ( fpf, "%s RAW d 1\n", scalarnames ( i ).c_str() );
108    }
109    fclose ( fpf );
110
111    memlog::init();
112
113    //Delete old data
114    write_buffers ( 0 );
115}
116
117
118void dirfilelog::write_buffers ( int Len ) {
119    int fp;
120    int nen = entries.length(); //all entries!!
121    double *Dt;
122    int DtRows;
123    int i, j, k;
124    int ii; //index in scalarnames;
125    int jj; //index in vectors()
126    char filename[200];
127
128    bdm_assert_debug ( Len <= maxlen, "diffilelog::write_buffers: Len too large" );
129
130    ii = 0;
131    for ( i = 0; i < nen; i++ ) { //for entries
132        Dt = vectors ( i )._data();
133        DtRows = vectors ( i ).rows();
134
135        jj = 0;
136        for ( j = 0; j < entries ( i ).length(); j++ ) { //for RVs in entries
137            int rvsize = entries ( i ).size ( j );
138            for ( k = 0; k < rvsize; k++ ) { { //for all scalars in given RV
139                    get_fname ( filename, dirname, scalarnames ( ii ) );
140                    if ( Len == 0 ) //initialization
141                        fp = open ( filename, O_CREAT | O_WRONLY | O_TRUNC, 00644 );
142                    else
143                        fp = open ( filename, O_CREAT | O_WRONLY | O_APPEND, 00644 );
144
145                    write ( fp, &Dt[jj* ( DtRows ) ], ( Len ) *sizeof ( double ) );
146                    close ( fp );
147
148                    //next row in Dt
149                    jj++;
150                    //next scalarname
151                    ii++;
152                }
153            }
154        }
155    }
156}
157
158void dirfilelog::step ( ) {
159
160    if ( ind == ( maxlen - 1 ) ) {
161        write_buffers ( ind + 1 );
162        ind = 0;
163    } else
164        ind++;
165
166}
167
168void dirfilelog::finalize ( ) {
169    if ( ind > 0 && !buffers_written) {
170        write_buffers ( ind ); //assuming here that i+1 was not filled
171        buffers_written = true;
172    }
173}
174
175
176void dirfilelog::from_setting ( const Setting &set ) {
177    dirname = ( const char* ) set["dirname"];
178    maxlen = set["maxlen"];
179    scalarnames.set_length ( 0 );
180}
181
182}
Note: See TracBrowser for help on using the browser.