source: XIOS/trunk/src/output/nc4_data_output.cpp @ 314

Last change on this file since 314 was 314, checked in by ymipsl, 12 years ago

Removing obsolete files and some cleaning...

YM

File size: 26.7 KB
Line 
1
2#include "nc4_data_output.hpp"
3
4#include <boost/lexical_cast.hpp>
5#include "attribute_template_impl.hpp"
6#include "group_template_impl.hpp"
7
8#include "file.hpp"
9#include "calendar.hpp"
10#include "context.hpp"
11#include "context_server.hpp"
12
13namespace xmlioserver
14{
15   namespace io
16   {
17      /// ////////////////////// Définitions ////////////////////// ///
18      CNc4DataOutput::CNc4DataOutput
19         (const StdString & filename, bool exist)
20            : SuperClass()
21            , SuperClassWriter(filename, exist)
22            , filename(filename)
23      {
24         StdString timeid = StdString("time_counter");
25         SuperClass::type = MULTI_FILE;
26         if (!exist)
27            SuperClassWriter::addDimension(timeid);
28      }
29
30      CNc4DataOutput::CNc4DataOutput
31         (const StdString & filename, bool exist, MPI_Comm comm_server,bool multifile)
32            : SuperClass()
33            , SuperClassWriter(filename, exist, &comm_server,multifile)
34            , comm_server(comm_server)
35            , filename(filename)
36      {
37         StdString timeid = StdString("time_counter");
38
39         SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE;
40         
41         if (!exist)
42            SuperClassWriter::addDimension(timeid);
43      }
44
45
46      CNc4DataOutput::~CNc4DataOutput(void)
47      { /* Ne rien faire de plus */ }
48
49      ///--------------------------------------------------------------
50
51      const StdString & CNc4DataOutput::getFileName(void) const
52      {
53         return (this->filename);
54      }
55
56      //---------------------------------------------------------------
57
58      void CNc4DataOutput::writeDomain_(const boost::shared_ptr<tree::CDomain> domain)
59      {
60         shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ;
61         CContextServer* server=context->server ;
62         
63         if (domain->IsWritten(this->filename)) return;
64         domain->checkAttributes();
65         
66         if (domain->isEmpty()) 
67           if (SuperClass::type==MULTI_FILE) return ;
68
69         std::vector<StdString> dim0, dim1;
70         StdString domid     = (!domain->name.isEmpty())
71                             ? domain->name.getValue() : domain->getId();
72         StdString lonid     = StdString("lon_").append(domid);
73         StdString latid     = StdString("lat_").append(domid);
74         StdString lonid_loc = (server->intraCommSize > 1)
75                             ? StdString("lon_").append(domid).append("_local")
76                             : lonid;
77         StdString latid_loc = (server->intraCommSize > 1)
78                             ? StdString("lat_").append(domid).append("_local")
79                             : latid;
80// supress mask         StdString maskid    = StdString("mask_").append(domid).append("_local");
81
82// supress mask         ARRAY(int, 2) mask = domain->getLocalMask();
83
84//         unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue();
85//         bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize);
86         bool isCurvilinear = true ; //for moment
87
88         switch (SuperClass::type)
89         {
90            case (MULTI_FILE) :
91            {
92//               if (domain->isEmpty()) return;
93               
94               if (server->intraCommSize > 1)
95               {
96                 SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue());
97                 SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue());
98               }
99
100               if (isCurvilinear)
101               {
102                 dim0.push_back(latid_loc); dim0.push_back(lonid_loc);
103                 lonid = StdString("nav_lon_").append(domid);
104                 latid = StdString("nav_lat_").append(domid);
105               }
106               else
107               {
108                 dim0.push_back(latid_loc);
109                 dim1.push_back(lonid_loc);
110               }
111
112               SuperClassWriter::addDimension(lonid_loc, domain->zoom_ni_srv);
113               SuperClassWriter::addDimension(latid_loc, domain->zoom_nj_srv);
114               if (server->intraCommSize > 1)
115               {
116                  this->writeLocalAttributes(domain->zoom_ibegin_srv,
117                                             domain->zoom_ni_srv,
118                                             domain->zoom_jbegin_srv,
119                                             domain->zoom_nj_srv,
120                                             domid);
121               }
122               
123               if (isCurvilinear)
124               {
125                  SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
126                  SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
127               }
128               else
129               {
130                  SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
131                  SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1);
132               }
133               this->writeAxisAttributes
134                  (lonid, "X", "longitude", "Longitude", "degrees_east", domid);
135               this->writeAxisAttributes
136                  (latid, "Y", "latitude", "Latitude", "degrees_north", domid);
137
138               dim0.clear();
139               dim0.push_back(latid_loc);
140               dim0.push_back(lonid_loc);
141
142
143// supress mask               if (server->intraCommSize > 1)
144// supress mask               {
145// supress mask                  SuperClassWriter::addVariable(maskid, NC_INT, dim0);
146// supress mask
147// supress mask                  this->writeMaskAttributes(maskid,
148// supress mask                     domain->data_dim.getValue()/*,
149// supress mask                     domain->data_ni.getValue(),
150// supress mask                     domain->data_nj.getValue(),
151// supress mask                     domain->data_ibegin.getValue(),
152// supress mask                     domain->data_jbegin.getValue()*/);
153// supress mask               }
154                 
155               //SuperClassWriter::setDefaultValue(maskid, &dvm);
156
157               SuperClassWriter::definition_end();
158               SuperClassWriter::writeData(domain->latvalue_srv, latid, true, 0);
159               SuperClassWriter::writeData(domain->lonvalue_srv, lonid, true, 0);
160// supress mask               if (server->intraCommSize > 1) SuperClassWriter::writeData(mask, maskid);
161               SuperClassWriter::definition_start();
162
163               break;
164            }
165            case (ONE_FILE) :
166            {
167               SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue());
168               SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue());
169
170               
171               if (isCurvilinear)
172               {
173                  dim0.push_back(latid); dim0.push_back(lonid);
174                  lonid = StdString("nav_lon_").append(domid);
175                  latid = StdString("nav_lat_").append(domid);
176                  SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
177                  SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
178               }
179               else
180               {
181                  dim0.push_back(latid);
182                  dim1.push_back(lonid);
183                  SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
184                  SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1);
185               }
186               this->writeAxisAttributes
187                  (latid, "X", "longitude", "Longitude", "degrees_east", domid);
188               this->writeAxisAttributes
189                  (lonid, "Y", "latitude", "Latitude", "degrees_north", domid);
190
191
192               SuperClassWriter::definition_end();
193               std::vector<StdSize> start(2) ; 
194               std::vector<StdSize> count(2) ;
195               if (domain->isEmpty())
196               {
197                 start[0]=0 ; start [1]=0 ; 
198                 count[0]=0 ; count[1]=0 ; 
199               }
200               else
201               {
202                 start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 
203                 count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; 
204               }
205               
206               SuperClassWriter::writeData(domain->latvalue_srv, latid, true, 0,&start,&count);
207               SuperClassWriter::writeData(domain->lonvalue_srv, lonid, true, 0,&start,&count);
208               SuperClassWriter::definition_start();
209
210               break;
211            }           
212            default :
213               ERROR("CNc4DataOutput::writeDomain(domain)",
214                     << "[ type = " << SuperClass::type << "]"
215                     << " not implemented yet !");
216         }
217         domain->addRelFile(this->filename);
218      }
219
220      //--------------------------------------------------------------
221
222      void CNc4DataOutput::writeAxis_(const boost::shared_ptr<tree::CAxis> axis)
223      {
224         if (axis->IsWritten(this->filename)) return;
225         axis->checkAttributes();
226         std::vector<StdString> dims;
227         StdString axisid = (!axis->name.isEmpty())
228                           ? axis->name.getValue() : axis->getId();
229         SuperClassWriter::addDimension(axisid, axis->size.getValue());
230         dims.push_back(axisid);
231         
232         switch (SuperClass::type)
233         {
234            case (MULTI_FILE ) :
235            {}
236            case (ONE_FILE) :
237            {
238               SuperClassWriter::addVariable(axisid, NC_FLOAT, dims);
239
240               SuperClassWriter::addAttribute("axis", StdString("Z"), &axisid);
241
242               if (!axis->standard_name.isEmpty())
243                  SuperClassWriter::addAttribute
244                     ("standard_name",  axis->standard_name.getValue(), &axisid);
245
246               if (!axis->long_name.isEmpty())
247                  SuperClassWriter::addAttribute
248                     ("long_name", axis->long_name.getValue(), &axisid);
249
250               if (!axis->unit.isEmpty())
251                  SuperClassWriter::addAttribute
252                     ("units", axis->unit.getValue(), &axisid);
253
254               SuperClassWriter::definition_end();
255               SuperClassWriter::writeData(axis->value.getValue(), axisid, true, 0);
256               SuperClassWriter::definition_start();
257
258               break;
259            }
260            default :
261               ERROR("CNc4DataOutput::writeDomain(domain)",
262                     << "[ type = " << SuperClass::type << "]"
263                     << " not implemented yet !");
264         }
265         axis->addRelFile(this->filename);
266      }
267
268      //--------------------------------------------------------------
269
270      void CNc4DataOutput::writeField_(const boost::shared_ptr<tree::CField> field)
271      {
272         shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ;
273         CContextServer* server=context->server ;
274
275         std::vector<StdString> dims, coodinates;
276         boost::shared_ptr<CGrid> grid = field->grid;
277         boost::shared_ptr<CDomain> domain = grid->domain;
278           
279         if (domain->isEmpty()) 
280           if (SuperClass::type==MULTI_FILE) return ;
281
282         StdString timeid    = StdString("time_counter");
283         StdString domid     = (!domain->name.isEmpty())
284                             ? domain->name.getValue() : domain->getId();
285         StdString lonid     = StdString("lon_").append(domid);
286         StdString latid     = StdString("lat_").append(domid);
287         StdString lonid_loc = (server->intraCommSize > 1)
288                             ? StdString("lon_").append(domid).append("_local")
289                             : lonid;
290         StdString latid_loc = (server->intraCommSize > 1)
291                             ? StdString("lat_").append(domid).append("_local")
292                             : latid;
293         StdString fieldid   = (!field->name.isEmpty())
294                             ? field->name.getValue() : field->getBaseFieldReference()->getId();
295
296//         unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue();
297//         bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize);
298          bool isCurvilinear = true ; // for moment
299         
300         nc_type type = (!field->prec.isEmpty() &&
301                        ( field->prec.getValue() == 4))
302                        ? NC_FLOAT : NC_DOUBLE;
303         bool wtime   = !(!field->operation.isEmpty() &&
304                         ( field->operation.getValue().compare("once") == 0));
305                         
306         if (wtime)
307         {
308            StdOStringStream oss;
309            oss << "time_" << field->operation.getValue()
310                << "_" << field->getRelFile()->output_freq.getValue();
311
312            coodinates.push_back(oss.str());
313            dims.push_back(timeid);
314         }
315
316         if (!grid->axis_ref.isEmpty())
317         {
318            boost::shared_ptr<CAxis> axis = grid->axis ;
319            StdString axisid = (!axis->name.isEmpty()) ? axis->name.getValue() : axis->getId();
320            dims.push_back(axisid);
321            coodinates.push_back(axisid);
322         }
323
324         if (isCurvilinear)
325         {
326            coodinates.push_back(StdString("nav_lat_").append(domid));
327            coodinates.push_back(StdString("nav_lon_").append(domid));
328         }
329         else
330         {
331            coodinates.push_back(latid);
332            coodinates.push_back(lonid);
333         }
334
335         switch (SuperClass::type)
336         {
337            case (MULTI_FILE) :
338            {
339               dims.push_back(latid_loc);
340               dims.push_back(lonid_loc);
341               break ;
342            }
343            case (ONE_FILE) :
344            {
345               dims.push_back(latid);
346               dims.push_back(lonid);
347               break;
348            }
349            default :
350               ERROR("CNc4DataOutput::writeDomain(domain)",
351                     << "[ type = " << SuperClass::type << "]"
352                     << " not implemented yet !");
353         }
354         
355         SuperClassWriter::addVariable(fieldid, type, dims);
356         
357         if (!field->standard_name.isEmpty())
358            SuperClassWriter::addAttribute
359               ("standard_name",  field->standard_name.getValue(), &fieldid);
360
361         if (!field->long_name.isEmpty())
362            SuperClassWriter::addAttribute
363               ("long_name", field->long_name.getValue(), &fieldid);
364
365         if (!field->unit.isEmpty())
366            SuperClassWriter::addAttribute
367               ("units", field->unit.getValue(), &fieldid);
368               
369         SuperClassWriter::addAttribute
370               ("online_operation", field->operation.getValue(), &fieldid);
371               
372         if (wtime)
373         {
374            SuperClassWriter::addAttribute
375                  ("interval_operation", field->freq_op.getValue(), &fieldid);
376            SuperClassWriter::addAttribute
377                  ("interval_write", field->getRelFile()->output_freq.getValue(), &fieldid);
378         }
379         
380         if (!field->default_value.isEmpty())
381         {
382            double default_value = field->default_value.getValue();
383            float fdefault_value = (float)default_value;
384            if (type == NC_DOUBLE)
385               SuperClassWriter::setDefaultValue(fieldid, &default_value);
386            else
387               SuperClassWriter::setDefaultValue(fieldid, &fdefault_value);
388         }
389         else
390         {
391            double * default_value = NULL;
392            SuperClassWriter::setDefaultValue(fieldid, default_value);
393         }             
394
395         {  // Ecriture des coordonnées
396         
397            StdString coordstr; //boost::algorithm::join(coodinates, " ")
398            std::vector<StdString>::iterator
399               itc = coodinates.begin(), endc = coodinates.end();
400           
401            for (; itc!= endc; itc++)
402            {
403               StdString & coord = *itc;
404               if (itc+1 != endc)
405                     coordstr.append(coord).append(" ");
406               else  coordstr.append(coord);
407            }
408
409            SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid);
410
411         }
412
413      }
414
415      //--------------------------------------------------------------
416
417      void CNc4DataOutput::writeFile_ (const boost::shared_ptr<tree::CFile> file)
418      {
419         StdString filename = (!file->name.isEmpty())
420                            ? file->name.getValue() : file->getId();
421         StdString description = (!file->description.isEmpty())
422                               ? file->description.getValue()
423                               : StdString("Created by xmlioserver");
424         this->writeFileAttributes(filename, description,
425                                   StdString ("CF-1.1"),
426                                   StdString("An IPSL model"),
427                                   this->getTimeStamp());
428      }
429
430      void CNc4DataOutput::closeFile_ (void)
431      {
432         SuperClassWriter::close() ;
433      }
434
435      //---------------------------------------------------------------
436
437      StdString CNc4DataOutput::getTimeStamp(void) const
438      {
439         const int buffer_size = 100;
440         time_t rawtime;
441         struct tm * timeinfo = NULL;
442         char buffer [buffer_size];
443
444         time ( &rawtime );
445         timeinfo = localtime ( &rawtime );
446         strftime (buffer, buffer_size, "%Y-%b-%d %H:%M:%S %Z", timeinfo);
447
448         return (StdString(buffer));
449      }
450     
451      //---------------------------------------------------------------
452     
453      void CNc4DataOutput::writeFieldData_ (const boost::shared_ptr<tree::CField>  field)
454      {
455         shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ;
456
457         boost::shared_ptr<CGrid> grid = field->grid ;
458         boost::shared_ptr<CDomain> domain = grid->domain ;
459         
460         if(SuperClass::type==MULTI_FILE) if (domain->isEmpty()) return;
461
462
463         StdString fieldid   = (!field->name.isEmpty()) 
464                             ? field->name.getValue() 
465                             : field->getBaseFieldReference()->getId();
466                             
467         StdOStringStream oss;
468         oss << "time_" << field->operation.getValue()
469             << "_" << field->getRelFile()->output_freq.getValue();
470             
471 //        ARRAY(double, 1) field_data = field->data_srv;
472         ARRAY_CREATE(time_data, double, 1, [1]);
473         (*time_data)[0] = date::Time(*field->last_Write_srv);
474         
475         if (grid->hasAxis()) // 3D
476         {
477            boost::shared_ptr<CAxis> axis = grid->axis ;
478            ARRAY_CREATE(field_data3D,double,3,[domain->zoom_ni_srv][domain->zoom_nj_srv][axis->size.getValue()]) ;
479            field->outputField(field_data3D);
480            switch (SuperClass::type)
481           {
482              case (MULTI_FILE) :
483              {
484                 SuperClassWriter::writeData(field_data3D, fieldid, true, field->getNStep()-1);
485                 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1);
486                 break ;
487              }
488              case (ONE_FILE) :
489              {
490                 std::vector<StdSize> start(3) ; 
491                 std::vector<StdSize> count(3) ;
492                 if (domain->isEmpty())
493                 {
494                   start[0]=0 ; start[1]=0 ; start[2]=0 ;
495                   count[0]=0 ; count[1]=0 ; start[2]=0 ;
496                 }
497                 else
498                 {
499//                 start[2]=domain->zoom_ibegin_loc.getValue()-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_loc.getValue()-domain->zoom_jbegin.getValue() ; start[0]=0 ;
500                   start[2]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; start[0]=0 ;
501                   count[2]=domain->zoom_ni_srv ; count[1]=domain->zoom_nj_srv ; count[0] = axis->size.getValue();
502                 }
503                 SuperClassWriter::writeData(field_data3D, fieldid, true, field->getNStep()-1,&start,&count );
504                 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1 );
505                 break;
506              }
507            }
508           
509         }
510         else // 2D
511         {
512            ARRAY_CREATE(field_data2D,double,2,[domain->zoom_ni_srv][domain->zoom_nj_srv]) ;
513            field->outputField(field_data2D);
514            switch (SuperClass::type)
515            {
516              case (MULTI_FILE) :
517              {
518                SuperClassWriter::writeData(field_data2D, fieldid, true, field->getNStep()-1);
519                SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1);
520                break;
521              }
522              case (ONE_FILE) :
523              {
524                 std::vector<StdSize> start(2) ; 
525                 std::vector<StdSize> count(2) ;
526                 if (domain->isEmpty())
527                 {
528                   start[0]=0 ; start[1]=0 ;
529                   count[0]=0 ; count[1]=0 ;
530                 }
531                 else
532                 {
533                   start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 
534                   count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ;
535                 }
536
537                 SuperClassWriter::writeData(field_data2D, fieldid, true, field->getNStep()-1,&start,&count);
538                 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1);
539                 break;
540             
541              }
542            }
543         }
544      }
545
546      //---------------------------------------------------------------
547
548      void CNc4DataOutput::writeTimeAxis_
549                  (const boost::shared_ptr<tree::CField>    field,
550                   const boost::shared_ptr<date::CCalendar> cal)
551      {
552         StdOStringStream oss;
553         oss << "time_" << field->operation.getValue()
554             << "_" << field->getRelFile()->output_freq.getValue();
555
556         std::vector<StdString> dims;
557         StdString axisid = oss.str();
558         StdString timeid = StdString("time_counter");
559
560         dims.push_back(timeid);
561         if (!SuperClassWriter::varExist(axisid))
562         {
563            SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims);
564            date::CDate initDate=cal->getInitDate() ;
565            StdOStringStream oss2;
566            oss2<<initDate.getYear()<<"-"<<initDate.getMonth()<<"-"<<initDate.getDay()<<" "
567                <<initDate.getHour()<<"-"<<initDate.getMinute()<<"-"<<initDate.getSecond() ;
568            StdString strInitdate=oss2.str() ;
569            this->writeTimeAxisAttributes
570               (axisid, cal->getType(),
571                StdString("seconds since ").append(strInitdate),
572                strInitdate);
573         }
574
575      }
576
577      //---------------------------------------------------------------
578     
579      void CNc4DataOutput::writeTimeAxisAttributes(const StdString & axis_name,
580                                                   const StdString & calendar,
581                                                   const StdString & units,
582                                                   const StdString & time_origin,
583                                                   const StdString & standard_name,
584                                                   const StdString & long_name,
585                                                   const StdString & title)
586      {
587         SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name);
588         SuperClassWriter::addAttribute("long_name",     long_name    , &axis_name);
589         SuperClassWriter::addAttribute("title",         title        , &axis_name);
590         SuperClassWriter::addAttribute("calendar",      calendar     , &axis_name);
591         SuperClassWriter::addAttribute("units",         units        , &axis_name);
592         SuperClassWriter::addAttribute("time_origin",   time_origin  , &axis_name);
593      }
594     
595      //---------------------------------------------------------------
596
597      void CNc4DataOutput::writeAxisAttributes(const StdString & axis_name,
598                                               const StdString & axis,
599                                               const StdString & standard_name,
600                                               const StdString & long_name,
601                                               const StdString & units,
602                                               const StdString & nav_model)
603      {
604         SuperClassWriter::addAttribute("axis"         , axis         , &axis_name);
605         SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name);
606         SuperClassWriter::addAttribute("long_name"    , long_name    , &axis_name);
607         SuperClassWriter::addAttribute("units"        , units        , &axis_name);
608         SuperClassWriter::addAttribute("nav_model"    , nav_model    , &axis_name);
609      }
610
611      //---------------------------------------------------------------
612     
613      void CNc4DataOutput::writeLocalAttributes
614         (int ibegin, int ni, int jbegin, int nj, StdString domid)
615      {
616         SuperClassWriter::addAttribute(StdString("ibegin_").append(domid), ibegin);
617         SuperClassWriter::addAttribute(StdString("ni_"    ).append(domid), ni);
618         SuperClassWriter::addAttribute(StdString("jbegin_").append(domid), jbegin);
619         SuperClassWriter::addAttribute(StdString("nj_"    ).append(domid), nj);
620      }
621
622      //---------------------------------------------------------------
623
624      void CNc4DataOutput:: writeFileAttributes(const StdString & name,
625                                                const StdString & description,
626                                                const StdString & conventions,
627                                                const StdString & production,
628                                                const StdString & timeStamp)
629      {
630         SuperClassWriter::addAttribute("name"       , name);
631         SuperClassWriter::addAttribute("description", description);
632         SuperClassWriter::addAttribute("conventions", conventions);
633         SuperClassWriter::addAttribute("production" , production);
634         SuperClassWriter::addAttribute("timeStamp"  , timeStamp);
635      }
636
637      //---------------------------------------------------------------
638
639      void CNc4DataOutput::writeMaskAttributes(const StdString & mask_name,
640                                               int data_dim,
641                                               int data_ni,
642                                               int data_nj,
643                                               int data_ibegin,
644                                               int data_jbegin)
645      {
646         SuperClassWriter::addAttribute("data_dim"   , data_dim   , &mask_name);
647         SuperClassWriter::addAttribute("data_ni"    , data_ni    , &mask_name);
648         SuperClassWriter::addAttribute("data_nj"    , data_nj    , &mask_name);
649         SuperClassWriter::addAttribute("data_ibegin", data_ibegin, &mask_name);
650         SuperClassWriter::addAttribute("data_jbegin", data_jbegin, &mask_name);
651      }
652
653      ///--------------------------------------------------------------
654
655   } // namespace io
656} // namespace xmlioserver
Note: See TracBrowser for help on using the repository browser.