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

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

Change namespace xmlioserver -> xios

YM

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