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

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

Cartesian/Regular? grid are now working correctly.

YM

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