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

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

Add splitting file functionality
new file attribut "split_freq" to put the frequency of splitting

YM

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