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

Revision 676, 4.1 kB (checked in by smidl, 15 years ago)

logger refactoring

  • 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() {
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
[162]31void memlog::itsave ( const char* fname ) {
32        it_file itf ( fname );
[102]33        int i;
[477]34        string vec_name = "";
[347]35        int istart, iend;
[477]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 ) + entries ( i ).name ( j );
40                        iend = istart + entries ( i ).size ( j ) - 1;
41                        itf << Name ( vec_name ) << vectors ( i ).get_cols ( istart, iend );
[347]42                        // move start after current end...
[477]43                        istart = iend + 1;
[162]44                }
[477]45
[102]46        }
47}
48
[477]49void memlog::from_setting ( const Setting &set ) {
[357]50        // TODO tady se natvrdo ocekava existence stringu, nejsou zadne defaulty.. je to tak OK?
[477]51        string itfilename = ( const char* ) set["filename"];
[377]52        maxlen = set["maxlen"];
[357]53}
54
[92]55void dirfilelog::init() {
[477]56        int i, j, k;
57        int nsc = 0;
58        for ( i = 0; i < entries.length(); i++ ) {
59                nsc += entries ( i )._dsize();
60        }
[92]61        ; //all entries!!
62
63        char filename[200];
64        char num[3];
65
66// Initialize directory
[162]67        makedir ( dirname ); //
[92]68
69// directory OK, or it can be overwritten
70
71//Create filenames
72        scalarnames.set_length ( nsc );
73        // For all entries
[477]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
[92]77                        int rvsize = entries ( i ).size ( j );
[230]78                        // for non-empty names
[477]79                        if ( names ( i ).length() > 0 ) {
[676]80                                scalarnames ( ii ) = names ( i ) + separator;
[477]81                        }
[230]82                        // add name
83                        scalarnames ( ii ) +=  entries ( i ).name ( j );
84                        // add number when needed
[477]85                        if ( rvsize > 1 ) {
[230]86                                // copy the same name for th whole RV
[477]87                                for ( k = 1; k < rvsize; k++ ) {
88                                        scalarnames ( ii + k ) = scalarnames ( ii );
89                                }
[230]90                                // add numbers
[477]91                                for ( k = 0; k < rvsize; k++ ) { //for all scalars in given RV
92                                        sprintf ( num, "%d", k );
[676]93                                        scalarnames ( ii ) += separator + num;
[92]94                                        ii++;
95                                }
[477]96                        } else {
97                                ii++;
98                        }
[92]99                }
100        }
101        //Create format
[477]102        string frm = "format";
[92]103        get_fname ( filename, dirname, frm );
104
105        FILE* fpf;
106        fpf = fopen ( filename, "w" );
[477]107        for ( i = 0; i < ii; i++ ) {
[92]108                fprintf ( fpf, "%s RAW d 1\n", scalarnames ( i ).c_str() );
109        }
110        fclose ( fpf );
111
112        memlog::init();
113
[162]114        //Delete old data
[92]115        write_buffers ( 0 );
116}
117
118
119void dirfilelog::write_buffers ( int Len ) {
120        int fp;
[477]121        int nen = entries.length(); //all entries!!
[92]122        double *Dt;
123        int DtRows;
[477]124        int i, j, k;
[92]125        int ii; //index in scalarnames;
126        int jj; //index in vectors()
127        char filename[200];
128
[565]129        bdm_assert_debug ( Len <= maxlen, "diffilelog::write_buffers: Len too large" );
[92]130
131        ii = 0;
[477]132        for ( i = 0; i < nen; i++ ) { //for entries
[92]133                Dt = vectors ( i )._data();
[162]134                DtRows = vectors ( i ).rows();
135
[477]136                jj = 0;
137                for ( j = 0; j < entries ( i ).length(); j++ ) { //for RVs in entries
[92]138                        int rvsize = entries ( i ).size ( j );
[477]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
[92]142                                                fp = open ( filename, O_CREAT | O_WRONLY | O_TRUNC, 00644 );
143                                        else
144                                                fp = open ( filename, O_CREAT | O_WRONLY | O_APPEND, 00644 );
145
[477]146                                        write ( fp, &Dt[jj* ( DtRows ) ], ( Len ) *sizeof ( double ) );
[92]147                                        close ( fp );
148
149                                        //next row in Dt
150                                        jj++;
151                                        //next scalarname
152                                        ii++;
153                                }
154                        }
155                }
156        }
157}
158
[162]159void dirfilelog::step ( ) {
[92]160
[477]161        if ( ind == ( maxlen - 1 ) ) {
162                write_buffers ( ind + 1 );
[162]163                ind = 0;
[477]164        } else
[162]165                ind++;
[92]166
167}
[162]168
169void dirfilelog::finalize ( ) {
[477]170        if ( ind > 0 )
[162]171                write_buffers ( ind ); //assuming here that i+1 was not filled
172}
[254]173
[357]174
[477]175void dirfilelog::from_setting ( const Setting &set ) {
[357]176        // TODO tady se natvrdo ocekava existence stringu, nejsou zadne defaulty.. je to tak OK?
[477]177        dirname = ( const char* ) set["dirname"];
[377]178        maxlen = set["maxlen"];
[477]179        scalarnames.set_length ( 0 );
[262]180}
[357]181
182}
Note: See TracBrowser for help on using the browser.