source: XMLIO_V2/dev/common/src/output/nc4_data_output.cpp @ 300

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

nouvelle version de developpement de xios

  • nouvelle interface fortran
  • recodage complet de la couche de communication
  • et bien d'autres choses...

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