28 #include <rl_Multilayer_rdb.h> 30 #include <rl_raylib/rl_Traits.h> 31 #include <rl_DielectricPOD_rdb.h> 32 #include <tracefct/exiterrvals.h> 33 #include <tracefctxx/TraceFct.h> 38 #include <mst_rdb/mst_rdb.h> 39 #include <suplib/str.h> 47 {
"DW_CSAO", rl_Traits::ERoughDebyeWaller_CSAO },
48 {
"DW_RSAO", rl_Traits::ERoughDebyeWaller_RSAO },
49 {
"DW_SPILLER", rl_Traits::ERoughDebyeWaller_Spiller },
50 {
"MDW", rl_Traits::ERoughModifiedDebyeWaller },
51 {
"NC", rl_Traits::ERoughNevotCroce },
52 {
"NONE", rl_Traits::ERoughNone }
54 TokList srough_types = GenTokList( srough_type );
67 rl_Multilayer_rdb(
char const rdb_filename[],
68 rl_Traits::EInterpMode interp_mode
72 init_from_rdb( rdb_filename, interp_mode );
78 void rl_Multilayer_rdb::
79 init_from_rdb(
char const *rdb_filename_in,
80 rl_Traits::EInterpMode interp_mode
83 TraceFct tf(
"rl_Multilayer_rdb::init");
85 own_data_ = rl_Traits::True;
89 DataColumnMap_st *map;
94 typedef struct LayerRecord
103 LayerRecord layer_record;
105 RDBFieldStInfo fields[6];
108 RDBentry( material, RDB_String, LayerRecord ),
109 RDBentry( thickness, RDB_Num, LayerRecord ),
110 RDBentry( bulkdensity, RDB_Num, LayerRecord ),
111 RDBentry( optconst_rdb, RDB_String, LayerRecord ),
112 RDBentry( roughness_type, RDB_String, LayerRecord ),
113 RDBentry( srough, RDB_Num, LayerRecord )
117 #define SET_FIELD(colname,var,vartype,idx) \ 119 fields[idx].name = #colname; \ 120 fields[idx].type = vartype; \ 121 fields[idx].offset = offsetof( LayerRecord, var ); \ 125 #define CHECK_FIELD(colname) \ 126 if (! rdb_is_column( hdr, #colname ) ) \ 128 tf.die( "no \"" #colname "\"column in reflectance rdb file" ); \ 133 str_interp( rdb_filename_in, 1, NULL, NULL, &error );
135 tf.die(
"error interpolating filename: %s", rdb_filename_in );
137 if ( !(in=fopen( rdb_filename,
"r" )) )
138 tf.exit( ExitERR_fopen,
"unable to open input `%s'", rdb_filename );
140 if (! (hdr = rdb_rd_hdr( in )) )
141 tf.die(
"rdb file `%s' contains no rdb headers!", rdb_filename );
143 CHECK_FIELD( material );
144 SET_FIELD( material, material, RDB_String, num_fields );
146 CHECK_FIELD( thickness );
147 SET_FIELD( thickness, thickness, RDB_Num, num_fields );
149 CHECK_FIELD( bulkdensity );
150 SET_FIELD( bulkdensity, bulkdensity, RDB_Num, num_fields );
152 CHECK_FIELD( optconst_rdb );
153 SET_FIELD( optconst_rdb, optconst_rdb, RDB_String, num_fields );
155 int have_roughness = 0;
156 if ( rdb_is_column( hdr,
"roughness_type" ) )
160 CHECK_FIELD( srough );
161 SET_FIELD( roughness_type, roughness_type, RDB_String, num_fields );
162 SET_FIELD( srough, srough, RDB_Num, num_fields );
165 map = rdb_map_cols_stst( hdr, num_fields, fields );
170 nrow = rdb_count(in, hdr);
172 tf.die(
"multilayer rdb file '%s' is not rewindable" );
173 else if ( nrow == 0 )
175 "multilayer rdb file '%s' must have at least one row", rdb_filename );
179 layer_ =
new rl_DielectricLayer[num_layers_];
182 tf.exit(ExitERR_alloc,
"unable to allocate rl_DielectricLayer array" );
186 for ( n = 0 ; n < num_layers_ ; ++n )
188 rdb_col_read_st(in, hdr, map, &layer_record);
189 if (! (layer_record.bulkdensity >= 0.0) )
191 tf.die(
"layer %d: must have bulk density >= 0.0" );
196 rl_Traits::ERoughType rtype = rl_Traits::ERoughNone;
198 if ( have_roughness )
200 char* str = layer_record.roughness_type;
203 *str = toupper(*str);
206 int roughtype = tokmatch( layer_record.roughness_type, &srough_types );
208 if ( roughtype >= 0 )
210 rtype = (rl_Traits::ERoughType)roughtype;
214 tf.die(
"invalid \"roughness\" type %s", layer_record.roughness_type );
216 srough = layer_record.srough;
219 rl_Traits::Bool substrate = rl_Traits::Bool((n == num_layers_-1) ? 1 : 0);
221 layer_[n].init( diel.const_data_ptr(),
223 layer_record.thickness,
227 layer_record.bulkdensity,
228 layer_record.material,
231 delete layer_record.material;
232 delete layer_record.roughness_type;
233 delete layer_record.optconst_rdb;
237 free( rdb_filename );
A class encapsulating reading of rl_DielectricPOD initialization data from an rdb table.