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

Last change on this file since 437 was 437, checked in by ymipsl, 11 years ago

not commited file from rev 436

YM

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