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

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

documentation of loggers updated

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