Changeset 1045 for XIOS/trunk/src


Ignore:
Timestamp:
02/02/17 10:39:53 (7 years ago)
Author:
ymipsl
Message:

New attributs prec for axis, domain and scalar to control the output precision of the coordinates.
Correct values are 4 or 8 to output in single or double precision. Default is single precision.

YM

Location:
XIOS/trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/config/axis_attribute.conf

    r817 r1045  
    2929DECLARE_ARRAY(bool, 1 , mask) 
    3030DECLARE_ARRAY(double, 2 , bounds) 
     31DECLARE_ATTRIBUTE(int,       prec) 
  • XIOS/trunk/src/config/domain_attribute.conf

    r953 r1045  
    5353DECLARE_ENUM4(type,rectilinear,curvilinear,unstructured, gaussian) 
    5454DECLARE_ATTRIBUTE(StdString, domain_ref) 
     55DECLARE_ATTRIBUTE(int,       prec) 
  • XIOS/trunk/src/config/scalar_attribute.conf

    r887 r1045  
    99 
    1010DECLARE_ATTRIBUTE(StdString, scalar_ref) 
     11DECLARE_ATTRIBUTE(int, prec) 
  • XIOS/trunk/src/io/nc4_data_output.cpp

    r1044 r1045  
    7575 
    7676 
    77          StdString dimXid, dimYid ; 
    78  
     77        StdString dimXid, dimYid ; 
     78 
     79        nc_type typePrec ; 
     80        if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ; 
     81        else if (domain->prec==4)  typePrec =  NC_FLOAT ; 
     82        else if (domain->prec==8)   typePrec =  NC_DOUBLE ; 
     83          
    7984         bool isRegularDomain = (domain->type == CDomain::type_attr::rectilinear); 
    8085         switch (domain->type) 
     
    164169                   { 
    165170                     case CDomain::type_attr::curvilinear : 
    166                        SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    167                        SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); 
     171                       SuperClassWriter::addVariable(latid, typePrec, dim0); 
     172                       SuperClassWriter::addVariable(lonid, typePrec, dim0); 
    168173                       break ; 
    169174                      case CDomain::type_attr::rectilinear : 
    170                         SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    171                         SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1); 
     175                        SuperClassWriter::addVariable(latid, typePrec, dim0); 
     176                        SuperClassWriter::addVariable(lonid, typePrec, dim1); 
    172177                        break ; 
    173178                   } 
     
    185190                     dim0.push_back(dimXid); 
    186191                     dim0.push_back(dimVertId); 
    187                      SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); 
    188                      SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); 
     192                     SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0); 
     193                     SuperClassWriter::addVariable(bounds_latid, typePrec, dim0); 
    189194                   } 
    190195                 } 
     
    211216                 if (domain->hasArea) 
    212217                 { 
    213                    SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     218                   SuperClassWriter::addVariable(areaId, typePrec, dim0); 
    214219                   SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId); 
    215220                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     
    264269                       lonid = StdString("nav_lon").append(appendDomid); 
    265270                       latid = StdString("nav_lat").append(appendDomid); 
    266                        SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    267                        SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); 
     271                       SuperClassWriter::addVariable(latid, typePrec, dim0); 
     272                       SuperClassWriter::addVariable(lonid, typePrec, dim0); 
    268273                       break; 
    269274 
     
    273278                       lonid = StdString("lon").append(appendDomid); 
    274279                       latid = StdString("lat").append(appendDomid); 
    275                        SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    276                        SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1); 
     280                       SuperClassWriter::addVariable(latid, typePrec, dim0); 
     281                       SuperClassWriter::addVariable(lonid, typePrec, dim1); 
    277282                       break; 
    278283                   } 
     
    295300                     dim0.push_back(dimXid); 
    296301                     dim0.push_back(dimVertId); 
    297                      SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); 
    298                      SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); 
     302                     SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0); 
     303                     SuperClassWriter::addVariable(bounds_latid, typePrec, dim0); 
    299304                   } 
    300305                 } 
     
    304309                   dim0.clear(); 
    305310                   dim0.push_back(dimYid); dim0.push_back(dimXid); 
    306                    SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     311                   SuperClassWriter::addVariable(areaId, typePrec, dim0); 
    307312                   SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId); 
    308313                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     
    446451        if (SuperClass::type==MULTI_FILE) return ; 
    447452 
     453     nc_type typePrec ; 
     454     if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ; 
     455     else if (domain->prec==4)  typePrec =  NC_FLOAT ; 
     456     else if (domain->prec==8)   typePrec =  NC_DOUBLE ; 
     457 
    448458      std::vector<StdString> dim0; 
    449459      StdString domid = domain->getDomainOutputName(); 
     
    497507                dim0.clear(); 
    498508                dim0.push_back(dimNode); 
    499                 SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0); 
     509                SuperClassWriter::addVariable(node_x, typePrec, dim0); 
    500510                SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x); 
    501511                SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x); 
    502512                SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x); 
    503                 SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0); 
     513                SuperClassWriter::addVariable(node_y, typePrec, dim0); 
    504514                SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y); 
    505515                SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y); 
     
    516526                dim0.clear(); 
    517527                dim0.push_back(dimNode); 
    518                 SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0); 
     528                SuperClassWriter::addVariable(node_x, typePrec, dim0); 
    519529                SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x); 
    520530                SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x); 
    521531                SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x); 
    522                 SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0); 
     532                SuperClassWriter::addVariable(node_y, typePrec, dim0); 
    523533                SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y); 
    524534                SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y); 
     
    530540              dim0.clear(); 
    531541              dim0.push_back(dimEdge); 
    532               SuperClassWriter::addVariable(edge_x, NC_FLOAT, dim0); 
     542              SuperClassWriter::addVariable(edge_x, typePrec, dim0); 
    533543              SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &edge_x); 
    534544              SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh edges."), &edge_x); 
    535545              SuperClassWriter::addAttribute("units", StdString("degrees_east"), &edge_x); 
    536               SuperClassWriter::addVariable(edge_y, NC_FLOAT, dim0); 
     546              SuperClassWriter::addVariable(edge_y, typePrec, dim0); 
    537547              SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &edge_y); 
    538548              SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh edges."), &edge_y); 
     
    556566                dim0.clear(); 
    557567                dim0.push_back(dimNode); 
    558                 SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0); 
     568                SuperClassWriter::addVariable(node_x, typePrec, dim0); 
    559569                SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x); 
    560570                SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x); 
    561571                SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x); 
    562                 SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0); 
     572                SuperClassWriter::addVariable(node_y, typePrec, dim0); 
    563573                SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y); 
    564574                SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y); 
     
    572582                dim0.clear(); 
    573583                dim0.push_back(dimEdge); 
    574                 SuperClassWriter::addVariable(edge_x, NC_FLOAT, dim0); 
     584                SuperClassWriter::addVariable(edge_x, typePrec, dim0); 
    575585                SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &edge_x); 
    576586                SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh edges."), &edge_x); 
    577587                SuperClassWriter::addAttribute("units", StdString("degrees_east"), &edge_x); 
    578                 SuperClassWriter::addVariable(edge_y, NC_FLOAT, dim0); 
     588                SuperClassWriter::addVariable(edge_y, typePrec, dim0); 
    579589                SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &edge_y); 
    580590                SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh edges."), &edge_y); 
     
    594604              dim0.clear(); 
    595605              dim0.push_back(dimFace); 
    596               SuperClassWriter::addVariable(face_x, NC_FLOAT, dim0); 
     606              SuperClassWriter::addVariable(face_x, typePrec, dim0); 
    597607              SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &face_x); 
    598608              SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh faces."), &face_x); 
    599609              SuperClassWriter::addAttribute("units", StdString("degrees_east"), &face_x); 
    600               SuperClassWriter::addVariable(face_y, NC_FLOAT, dim0); 
     610              SuperClassWriter::addVariable(face_y, typePrec, dim0); 
    601611              SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &face_y); 
    602612              SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh faces."), &face_y); 
     
    860870         string areaId = "area" + appendDomid; 
    861871 
     872         nc_type typePrec ; 
     873         if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ; 
     874         else if (domain->prec==4)  typePrec =  NC_FLOAT ; 
     875         else if (domain->prec==8)   typePrec =  NC_DOUBLE ; 
     876 
    862877         try 
    863878         { 
     
    875890                 if (domain->hasLonLat) 
    876891                 { 
    877                    SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    878                    SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); 
     892                   SuperClassWriter::addVariable(latid, typePrec, dim0); 
     893                   SuperClassWriter::addVariable(lonid, typePrec, dim0); 
    879894                   this->writeAxisAttributes(lonid, "", "longitude", "Longitude", "degrees_east", domid); 
    880895                   if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_lonid, &lonid); 
     
    888903                   dim0.push_back(dimXid); 
    889904                   dim0.push_back(dimVertId); 
    890                    SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); 
    891                    SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); 
     905                   SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0); 
     906                   SuperClassWriter::addVariable(bounds_latid, typePrec, dim0); 
    892907                 } 
    893908 
     
    896911                 if (domain->hasArea) 
    897912                 { 
    898                    SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     913                   SuperClassWriter::addVariable(areaId, typePrec, dim0); 
    899914                   SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId); 
    900915                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     
    931946                 if (domain->hasLonLat) 
    932947                 { 
    933                    SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 
    934                    SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); 
     948                   SuperClassWriter::addVariable(latid, typePrec, dim0); 
     949                   SuperClassWriter::addVariable(lonid, typePrec, dim0); 
    935950 
    936951                   this->writeAxisAttributes(lonid, "", "longitude", "Longitude", "degrees_east", domid); 
     
    946961                   dim0.push_back(dimXid); 
    947962                   dim0.push_back(dimVertId); 
    948                    SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); 
    949                    SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); 
     963                   SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0); 
     964                   SuperClassWriter::addVariable(bounds_latid, typePrec, dim0); 
    950965                 } 
    951966 
     
    954969                   dim0.clear(); 
    955970                   dim0.push_back(dimXid); 
    956                    SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     971                   SuperClassWriter::addVariable(areaId, typePrec, dim0); 
    957972                   SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId); 
    958973                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     
    10371052        else setWrittenAxis(axisid); 
    10381053 
     1054        nc_type typePrec ; 
     1055        if (axis->prec.isEmpty()) typePrec =  NC_FLOAT ; 
     1056        else if (axis->prec==4)  typePrec =  NC_FLOAT ; 
     1057        else if (axis->prec==8)   typePrec =  NC_DOUBLE ; 
     1058          
    10391059        try 
    10401060        { 
     
    10431063          { 
    10441064            dims.push_back(axisid); 
    1045             SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); 
     1065            SuperClassWriter::addVariable(axisid, typePrec, dims); 
    10461066 
    10471067            if (!axis->name.isEmpty()) 
     
    10691089            { 
    10701090              dims.push_back("axis_nbounds"); 
    1071               SuperClassWriter::addVariable(axisBoundsId, NC_FLOAT, dims); 
     1091              SuperClassWriter::addVariable(axisBoundsId, typePrec, dims); 
    10721092              SuperClassWriter::addAttribute("bounds", axisBoundsId, &axisid); 
    10731093            } 
     
    11401160        else setWrittenAxis(scalaId); 
    11411161 
     1162        nc_type typePrec ; 
     1163        if (scalar->prec.isEmpty()) typePrec =  NC_FLOAT ; 
     1164        else if (scalar->prec==4)  typePrec =  NC_FLOAT ; 
     1165        else if (scalar->prec==8)   typePrec =  NC_DOUBLE ; 
     1166 
     1167         
    11421168        try 
    11431169        { 
     
    11461172//            dims.push_back(scalaId); 
    11471173            std::vector<StdString> dims; 
    1148             SuperClassWriter::addVariable(scalaId, NC_FLOAT, dims); 
     1174            SuperClassWriter::addVariable(scalaId, typePrec, dims); 
    11491175 
    11501176            if (!scalar->name.isEmpty()) 
Note: See TracChangeset for help on using the changeset viewer.