New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
nc4_data_output.cpp in vendors/XIOS/current/src/output – NEMO

source: vendors/XIOS/current/src/output/nc4_data_output.cpp @ 3428

Last change on this file since 3428 was 3428, checked in by rblod, 12 years ago

importing initial XIOS vendor drop

File size: 27.5 KB
Line 
1
2#include "nc4_data_output.hpp"
3
4#include <boost/lexical_cast.hpp>
5#include "attribute_template.hpp"
6#include "group_template.hpp"
7
8#include "file.hpp"
9#include "calendar.hpp"
10#include "context.hpp"
11#include "context_server.hpp"
12
13namespace xios
14{
15      /// ////////////////////// Définitions ////////////////////// ///
16      CNc4DataOutput::CNc4DataOutput
17         (const StdString & filename, bool exist)
18            : SuperClass()
19            , SuperClassWriter(filename, exist)
20            , filename(filename)
21      {
22         StdString timeid = StdString("time_counter");
23         SuperClass::type = MULTI_FILE;
24         if (!exist)
25            SuperClassWriter::addDimension(timeid);
26      }
27
28      CNc4DataOutput::CNc4DataOutput
29         (const StdString & filename, bool exist, MPI_Comm comm_server,bool multifile, bool isCollective)
30            : SuperClass()
31            , SuperClassWriter(filename, exist, &comm_server,multifile)
32            , comm_server(comm_server)
33            , filename(filename)
34            , isCollective(isCollective)
35      {
36         StdString timeid = StdString("time_counter");
37
38         SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE;
39         
40         if (!exist)
41            SuperClassWriter::addDimension(timeid);
42      }
43
44
45      CNc4DataOutput::~CNc4DataOutput(void)
46      { /* Ne rien faire de plus */ }
47
48      ///--------------------------------------------------------------
49
50      const StdString & CNc4DataOutput::getFileName(void) const
51      {
52         return (this->filename);
53      }
54
55      //---------------------------------------------------------------
56
57      void CNc4DataOutput::writeDomain_(CDomain* domain)
58      {
59         CContext* context = CContext::getCurrent() ;
60         CContextServer* server=context->server ;
61         
62         if (domain->IsWritten(this->filename)) return;
63         domain->checkAttributes();
64         
65         if (domain->isEmpty()) 
66           if (SuperClass::type==MULTI_FILE) return ;
67
68         std::vector<StdString> dim0, dim1;
69         StdString domid     = (!domain->name.isEmpty())
70                             ? domain->name.getValue() : domain->getId();
71         StdString appendDomid  = (singleDomain) ? "" : "_"+domid ;
72
73         StdString lonid     = StdString("lon").append(appendDomid);
74         StdString latid     = StdString("lat").append(appendDomid);
75         StdString lonid_loc = (server->intraCommSize > 1)
76                             ? StdString("lon").append(appendDomid).append("_local")
77                             : lonid;
78         StdString latid_loc = (server->intraCommSize > 1)
79                             ? StdString("lat").append(appendDomid).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(appendDomid);
105                 latid = StdString("nav_lat").append(appendDomid);
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                                             appendDomid);
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, isCollective, 0);
160               SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 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(appendDomid);
176                  latid = StdString("nav_lat").append(appendDomid);
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, isCollective, 0,&start,&count);
208               SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 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_(CAxis* axis)
224      {
225         if (axis->IsWritten(this->filename)) return;
226         axis->checkAttributes();
227         StdSize zoom_size=axis->zoom_size.getValue() ;
228         StdSize zoom_begin=axis->zoom_begin.getValue()-1 ;
229         
230         std::vector<StdString> dims;
231         StdString axisid = (!axis->name.isEmpty())
232                           ? axis->name.getValue() : axis->getId();
233         SuperClassWriter::addDimension(axisid, zoom_size);
234         dims.push_back(axisid);
235         
236         switch (SuperClass::type)
237         {
238            case (MULTI_FILE ) :
239            {}
240            case (ONE_FILE) :
241            {
242               SuperClassWriter::addVariable(axisid, NC_FLOAT, dims);
243
244               SuperClassWriter::addAttribute("axis", StdString("Z"), &axisid);
245
246               if (!axis->standard_name.isEmpty())
247                  SuperClassWriter::addAttribute
248                     ("standard_name",  axis->standard_name.getValue(), &axisid);
249
250               if (!axis->long_name.isEmpty())
251                  SuperClassWriter::addAttribute
252                     ("long_name", axis->long_name.getValue(), &axisid);
253
254               if (!axis->unit.isEmpty())
255                  SuperClassWriter::addAttribute
256                     ("units", axis->unit.getValue(), &axisid);
257
258               SuperClassWriter::definition_end();
259               
260               ARRAY(double,1) axis_value=axis->value.getValue() ;
261               ARRAY_CREATE(value,double,1,[zoom_size]) ;
262               for(StdSize i = 0 ; i < zoom_size ; i++) (*value)[i]=(*axis_value)[i+zoom_begin] ;
263               SuperClassWriter::writeData(value, axisid, isCollective, 0);
264               
265               SuperClassWriter::definition_start();
266
267               break;
268            }
269            default :
270               ERROR("CNc4DataOutput::writeDomain(domain)",
271                     << "[ type = " << SuperClass::type << "]"
272                     << " not implemented yet !");
273         }
274         axis->addRelFile(this->filename);
275      }
276
277      //--------------------------------------------------------------
278
279      void CNc4DataOutput::writeField_(CField* field)
280      {
281         CContext* context = CContext::getCurrent() ;
282         CContextServer* server=context->server ;
283
284         std::vector<StdString> dims, coodinates;
285         CGrid* grid = field->grid;
286         CDomain* domain = grid->domain;
287           
288         if (domain->isEmpty()) 
289           if (SuperClass::type==MULTI_FILE) return ;
290
291         StdString timeid    = StdString("time_counter");
292         StdString domid     = (!domain->name.isEmpty())
293                             ? domain->name.getValue() : domain->getId();
294         StdString appendDomid  = (singleDomain) ? "" : "_"+domid ;
295
296         StdString lonid     = StdString("lon").append(appendDomid);
297         StdString latid     = StdString("lat").append(appendDomid);
298         StdString lonid_loc = (server->intraCommSize > 1)
299                             ? StdString("lon").append(appendDomid).append("_local")
300                             : lonid;
301         StdString latid_loc = (server->intraCommSize > 1)
302                             ? StdString("lat").append(appendDomid).append("_local")
303                             : latid;
304         StdString fieldid   = (!field->name.isEmpty())
305                             ? field->name.getValue() : field->getBaseFieldReference()->getId();
306
307//         unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue();
308//         bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize);
309          bool isCurvilinear = true ; // for moment
310         
311         nc_type type = (!field->prec.isEmpty() &&
312                        ( field->prec.getValue() == 4))
313                        ? NC_FLOAT : NC_DOUBLE;
314         bool wtime   = !(!field->operation.isEmpty() &&
315                         ( field->operation.getValue().compare("once") == 0));
316                         
317         if (wtime)
318         {
319            StdOStringStream oss;
320            oss << "time_" << field->operation.getValue()
321                << "_" << field->getRelFile()->output_freq.getValue();
322
323            coodinates.push_back(oss.str());
324            dims.push_back(timeid);
325         }
326
327         if (!grid->axis_ref.isEmpty())
328         {
329            CAxis* axis = grid->axis ;
330            StdString axisid = (!axis->name.isEmpty()) ? axis->name.getValue() : axis->getId();
331            dims.push_back(axisid);
332            coodinates.push_back(axisid);
333         }
334
335         if (isCurvilinear)
336         {
337            coodinates.push_back(StdString("nav_lat").append(appendDomid));
338            coodinates.push_back(StdString("nav_lon").append(appendDomid));
339         }
340         else
341         {
342            coodinates.push_back(latid);
343            coodinates.push_back(lonid);
344         }
345
346         switch (SuperClass::type)
347         {
348            case (MULTI_FILE) :
349            {
350               dims.push_back(latid_loc);
351               dims.push_back(lonid_loc);
352               break ;
353            }
354            case (ONE_FILE) :
355            {
356               dims.push_back(latid);
357               dims.push_back(lonid);
358               break;
359            }
360            default :
361               ERROR("CNc4DataOutput::writeDomain(domain)",
362                     << "[ type = " << SuperClass::type << "]"
363                     << " not implemented yet !");
364         }
365         
366         SuperClassWriter::addVariable(fieldid, type, dims);
367         
368         if (!field->standard_name.isEmpty())
369            SuperClassWriter::addAttribute
370               ("standard_name",  field->standard_name.getValue(), &fieldid);
371
372         if (!field->long_name.isEmpty())
373            SuperClassWriter::addAttribute
374               ("long_name", field->long_name.getValue(), &fieldid);
375
376         if (!field->unit.isEmpty())
377            SuperClassWriter::addAttribute
378               ("units", field->unit.getValue(), &fieldid);
379               
380         SuperClassWriter::addAttribute
381               ("online_operation", field->operation.getValue(), &fieldid);
382               
383         if (wtime)
384         {
385            SuperClassWriter::addAttribute
386                  ("interval_operation", field->freq_op.getValue(), &fieldid);
387            SuperClassWriter::addAttribute
388                  ("interval_write", field->getRelFile()->output_freq.getValue(), &fieldid);
389         }
390         
391         if (!field->default_value.isEmpty())
392         {
393            double default_value = field->default_value.getValue();
394            float fdefault_value = (float)default_value;
395            if (type == NC_DOUBLE)
396               SuperClassWriter::setDefaultValue(fieldid, &default_value);
397            else
398               SuperClassWriter::setDefaultValue(fieldid, &fdefault_value);
399         }
400         else
401         {
402            double * default_value = NULL;
403            SuperClassWriter::setDefaultValue(fieldid, default_value);
404         }             
405
406         {  // Ecriture des coordonnées
407         
408            StdString coordstr; //boost::algorithm::join(coodinates, " ")
409            std::vector<StdString>::iterator
410               itc = coodinates.begin(), endc = coodinates.end();
411           
412            for (; itc!= endc; itc++)
413            {
414               StdString & coord = *itc;
415               if (itc+1 != endc)
416                     coordstr.append(coord).append(" ");
417               else  coordstr.append(coord);
418            }
419
420            SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid);
421
422         }
423
424      }
425
426      //--------------------------------------------------------------
427
428      void CNc4DataOutput::writeFile_ (CFile* file)
429      {
430         StdString filename = (!file->name.isEmpty())
431                            ? file->name.getValue() : file->getId();
432         StdString description = (!file->description.isEmpty())
433                               ? file->description.getValue()
434                               : StdString("Created by xios");
435         this->writeFileAttributes(filename, description,
436                                   StdString ("CF-1.1"),
437                                   StdString("An IPSL model"),
438                                   this->getTimeStamp());
439         if (file->nbDomain==1) singleDomain=true ;
440         else singleDomain=false ;
441      }
442 
443      void CNc4DataOutput::syncFile_ (void)
444      {
445         SuperClassWriter::sync() ;
446      }
447
448      void CNc4DataOutput::closeFile_ (void)
449      {
450         SuperClassWriter::close() ;
451      }
452
453      //---------------------------------------------------------------
454
455      StdString CNc4DataOutput::getTimeStamp(void) const
456      {
457         const int buffer_size = 100;
458         time_t rawtime;
459         struct tm * timeinfo = NULL;
460         char buffer [buffer_size];
461
462         time ( &rawtime );
463         timeinfo = localtime ( &rawtime );
464         strftime (buffer, buffer_size, "%Y-%b-%d %H:%M:%S %Z", timeinfo);
465
466         return (StdString(buffer));
467      }
468     
469      //---------------------------------------------------------------
470     
471      void CNc4DataOutput::writeFieldData_ (CField*  field)
472      {
473         CContext* context = CContext::getCurrent() ;
474//          if (field->getRelFile()->isSyncTime()) SuperClassWriter::sync() ;
475
476         CGrid* grid = field->grid ;
477         CDomain* domain = grid->domain ;
478         
479         if(SuperClass::type==MULTI_FILE || !isCollective) if (domain->isEmpty()) return;
480
481
482         StdString fieldid   = (!field->name.isEmpty()) 
483                             ? field->name.getValue() 
484                             : field->getBaseFieldReference()->getId();
485                             
486         StdOStringStream oss;
487         oss << "time_" << field->operation.getValue()
488             << "_" << field->getRelFile()->output_freq.getValue();
489             
490 //        ARRAY(double, 1) field_data = field->data_srv;
491         ARRAY_CREATE(time_data, double, 1, [1]);
492         if (field->operation.getValue()=="instant") (*time_data)[0] = Time(*field->last_Write_srv)
493                                                                      -Time(context->calendar->getTimeOrigin());
494         else (*time_data)[0] = (Time(*field->last_Write_srv)+Time(*field->lastlast_Write_srv))/2
495                               -Time(context->calendar->getTimeOrigin());
496           
497         if (grid->hasAxis()) // 3D
498         {
499            CAxis* axis = grid->axis ;
500            ARRAY_CREATE(field_data3D,double,3,[domain->zoom_ni_srv][domain->zoom_nj_srv][axis->zoom_size.getValue()]) ;
501            field->outputField(field_data3D);
502            switch (SuperClass::type)
503           {
504              case (MULTI_FILE) :
505              {
506                 SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1);
507                 SuperClassWriter::writeData(time_data, oss.str(), isCollective, field->getNStep()-1);
508                 break ;
509              }
510              case (ONE_FILE) :
511              {
512                 std::vector<StdSize> start(3) ; 
513                 std::vector<StdSize> count(3) ;
514                 if (domain->isEmpty())
515                 {
516                   start[0]=0 ; start[1]=0 ; start[2]=0 ;
517                   count[0]=0 ; count[1]=0 ; start[2]=0 ;
518                 }
519                 else
520                 {
521//                 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 ;
522                   start[2]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; start[0]=0 ;
523                   count[2]=domain->zoom_ni_srv ; count[1]=domain->zoom_nj_srv ; count[0] = axis->zoom_size.getValue();
524                 }
525                 SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1,&start,&count );
526                 SuperClassWriter::writeData(time_data, oss.str(), isCollective, field->getNStep()-1 );
527                 break;
528              }
529            }
530           
531         }
532         else // 2D
533         {
534            ARRAY_CREATE(field_data2D,double,2,[domain->zoom_ni_srv][domain->zoom_nj_srv]) ;
535            field->outputField(field_data2D);
536            switch (SuperClass::type)
537            {
538              case (MULTI_FILE) :
539              {
540                SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1);
541                SuperClassWriter::writeData(time_data, oss.str(), isCollective, field->getNStep()-1);
542                break;
543              }
544              case (ONE_FILE) :
545              {
546                 std::vector<StdSize> start(2) ; 
547                 std::vector<StdSize> count(2) ;
548                 if (domain->isEmpty())
549                 {
550                   start[0]=0 ; start[1]=0 ;
551                   count[0]=0 ; count[1]=0 ;
552                 }
553                 else
554                 {
555                   start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 
556                   count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ;
557                 }
558
559                 SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1,&start,&count);
560                 SuperClassWriter::writeData(time_data, oss.str(), isCollective, field->getNStep()-1);
561                 break;
562             
563              }
564            }
565         }
566      }
567
568      //---------------------------------------------------------------
569
570      void CNc4DataOutput::writeTimeAxis_
571                  (CField*    field,
572                   const boost::shared_ptr<CCalendar> cal)
573      {
574         StdOStringStream oss;
575         oss << "time_" << field->operation.getValue()
576             << "_" << field->getRelFile()->output_freq.getValue();
577
578         std::vector<StdString> dims;
579         StdString axisid = oss.str();
580         StdString timeid = StdString("time_counter");
581
582         dims.push_back(timeid);
583         if (!SuperClassWriter::varExist(axisid))
584         {
585            SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims);
586            CDate timeOrigin=cal->getTimeOrigin() ;
587//            StdOStringStream oss2;
588//            oss2<<initDate.getYear()<<"-"<<initDate.getMonth()<<"-"<<initDate.getDay()<<" "
589//                <<initDate.getHour()<<"-"<<initDate.getMinute()<<"-"<<initDate.getSecond() ;
590//            StdString strInitdate=oss2.str() ;
591            StdString strTimeOrigin=timeOrigin.toString() ;
592            this->writeTimeAxisAttributes
593               (axisid, cal->getType(),
594                StdString("seconds since ").append(strTimeOrigin),
595                strTimeOrigin);
596         }
597
598      }
599
600      //---------------------------------------------------------------
601     
602      void CNc4DataOutput::writeTimeAxisAttributes(const StdString & axis_name,
603                                                   const StdString & calendar,
604                                                   const StdString & units,
605                                                   const StdString & time_origin,
606                                                   const StdString & standard_name,
607                                                   const StdString & long_name,
608                                                   const StdString & title)
609      {
610         SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name);
611         SuperClassWriter::addAttribute("long_name",     long_name    , &axis_name);
612         SuperClassWriter::addAttribute("title",         title        , &axis_name);
613         SuperClassWriter::addAttribute("calendar",      calendar     , &axis_name);
614         SuperClassWriter::addAttribute("units",         units        , &axis_name);
615         SuperClassWriter::addAttribute("time_origin",   time_origin  , &axis_name);
616      }
617     
618      //---------------------------------------------------------------
619
620      void CNc4DataOutput::writeAxisAttributes(const StdString & axis_name,
621                                               const StdString & axis,
622                                               const StdString & standard_name,
623                                               const StdString & long_name,
624                                               const StdString & units,
625                                               const StdString & nav_model)
626      {
627         SuperClassWriter::addAttribute("axis"         , axis         , &axis_name);
628         SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name);
629         SuperClassWriter::addAttribute("long_name"    , long_name    , &axis_name);
630         SuperClassWriter::addAttribute("units"        , units        , &axis_name);
631         SuperClassWriter::addAttribute("nav_model"    , nav_model    , &axis_name);
632      }
633
634      //---------------------------------------------------------------
635     
636      void CNc4DataOutput::writeLocalAttributes
637         (int ibegin, int ni, int jbegin, int nj, StdString domid)
638      {
639         SuperClassWriter::addAttribute(StdString("ibegin").append(domid), ibegin);
640         SuperClassWriter::addAttribute(StdString("ni"    ).append(domid), ni);
641         SuperClassWriter::addAttribute(StdString("jbegin").append(domid), jbegin);
642         SuperClassWriter::addAttribute(StdString("nj"    ).append(domid), nj);
643      }
644
645      //---------------------------------------------------------------
646
647      void CNc4DataOutput:: writeFileAttributes(const StdString & name,
648                                                const StdString & description,
649                                                const StdString & conventions,
650                                                const StdString & production,
651                                                const StdString & timeStamp)
652      {
653         SuperClassWriter::addAttribute("name"       , name);
654         SuperClassWriter::addAttribute("description", description);
655         SuperClassWriter::addAttribute("conventions", conventions);
656         SuperClassWriter::addAttribute("production" , production);
657         SuperClassWriter::addAttribute("timeStamp"  , timeStamp);
658      }
659
660      //---------------------------------------------------------------
661
662      void CNc4DataOutput::writeMaskAttributes(const StdString & mask_name,
663                                               int data_dim,
664                                               int data_ni,
665                                               int data_nj,
666                                               int data_ibegin,
667                                               int data_jbegin)
668      {
669         SuperClassWriter::addAttribute("data_dim"   , data_dim   , &mask_name);
670         SuperClassWriter::addAttribute("data_ni"    , data_ni    , &mask_name);
671         SuperClassWriter::addAttribute("data_nj"    , data_nj    , &mask_name);
672         SuperClassWriter::addAttribute("data_ibegin", data_ibegin, &mask_name);
673         SuperClassWriter::addAttribute("data_jbegin", data_jbegin, &mask_name);
674      }
675
676      ///--------------------------------------------------------------
677
678} // namespace xios
Note: See TracBrowser for help on using the repository browser.