Ignore:
Timestamp:
02/16/18 16:32:08 (6 years ago)
Author:
oabramkina
Message:

Adding new grid-related attributes.

Location:
XIOS/dev/XIOS_DEV_CMIP6/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/config/axis_attribute.conf

    r1266 r1430  
    1111DECLARE_ATTRIBUTE(int,       n_glo) 
    1212DECLARE_ENUM2(positive, up, down) 
     13DECLARE_ENUM4(axis_type, X, Y, Z, T) 
     14 
     15DECLARE_ATTRIBUTE(StdString, dim_name) 
    1316 
    1417/* GLOBAL */ 
  • XIOS/dev/XIOS_DEV_CMIP6/src/config/domain_attribute.conf

    r1391 r1430  
    55DECLARE_ATTRIBUTE(StdString       , lon_name) 
    66DECLARE_ATTRIBUTE(StdString       , lat_name) 
     7DECLARE_ATTRIBUTE(StdString       , bounds_lon_name) 
     8DECLARE_ATTRIBUTE(StdString       , bounds_lat_name) 
     9DECLARE_ATTRIBUTE(StdString       , dim_i_name) 
     10DECLARE_ATTRIBUTE(StdString       , dim_j_name) 
    711 
    812/* GLOBAL */ 
  • XIOS/dev/XIOS_DEV_CMIP6/src/config/scalar_attribute.conf

    r1158 r1430  
    77/* LOCAL and GLOBAL*/ 
    88DECLARE_ATTRIBUTE(double, value) 
     9DECLARE_ATTRIBUTE(StdString, bounds_value_name) 
     10DECLARE_ATTRIBUTE(double, bounds_value) 
    911 
    1012DECLARE_ATTRIBUTE(StdString, scalar_ref) 
    1113DECLARE_ATTRIBUTE(int, prec) 
     14 
     15DECLARE_ENUM4(axis_type, X, Y, Z, T) 
  • XIOS/dev/XIOS_DEV_CMIP6/src/io/inetcdf4.cpp

    r948 r1430  
    502502      { 
    503503        std::map<StdString, StdSize> dimvar = this->getDimensions(&coord, path); 
    504         if ((dimvar.size() == 1) && (dimvar.find(coord) != dimvar.end())) 
     504//        if ((dimvar.size() == 1) && (dimvar.find(coord) != dimvar.end())) 
     505        if ((dimvar.size() == 1) ) 
    505506          continue; 
    506507        else 
  • XIOS/dev/XIOS_DEV_CMIP6/src/io/nc4_data_input.cpp

    r1428 r1430  
    185185*/ 
    186186    for (std::list<StdString>::const_iterator it = dimList.begin(); it != dimList.end(); ++it) 
    187       listDimSize.push_front(*dimSizeMap.find(*it)); 
     187    { 
     188      // It is not required any more for dimension name and lon/lat names to be the same (aka lon(lon)) 
     189      if (SuperClassWriter::isRectilinear(fieldId)) 
     190      { 
     191        StdString lonName =   SuperClassWriter::getLonCoordName(fieldId); 
     192        StdString latName =   SuperClassWriter::getLatCoordName(fieldId); 
     193        StdString dimLonName = SuperClassWriter::getDimensions(&lonName).begin()->first; 
     194        StdString dimLatName = SuperClassWriter::getDimensions(&latName).begin()->first; 
     195        if ((lonName != dimLonName) && (*it == dimLonName)) 
     196        { 
     197          StdSize dimSizeTmp = dimSizeMap.find(*it)->second; 
     198          listDimSize.push_front(make_pair(lonName, dimSizeTmp)); 
     199        } 
     200        else if ((latName != dimLatName) && (*it == dimLatName)) 
     201        { 
     202          StdSize dimSizeTmp = dimSizeMap.find(*it)->second; 
     203          listDimSize.push_front(make_pair(latName, dimSizeTmp)); 
     204        } 
     205        else 
     206          listDimSize.push_front(*dimSizeMap.find(*it)); 
     207      } 
     208      else 
     209        listDimSize.push_front(*dimSizeMap.find(*it)); 
     210 
     211    } 
    188212 
    189213    // Now process domain and axis 
  • XIOS/dev/XIOS_DEV_CMIP6/src/io/nc4_data_output.cpp

    r1424 r1430  
    103103             else latName = domain->lat_name; 
    104104 
    105              dimXid     = StdString("x").append(appendDomid); 
    106              dimYid     = StdString("y").append(appendDomid); 
     105             if (domain->dim_i_name.isEmpty()) dimXid=StdString("x").append(appendDomid); 
     106             else dimXid=domain->dim_i_name.getValue() + appendDomid; 
     107 
     108             if (domain->dim_j_name.isEmpty()) dimYid=StdString("y").append(appendDomid); 
     109             else dimYid=domain->dim_j_name.getValue() + appendDomid; 
     110 
    107111             break ; 
    108112 
    109113           case CDomain::type_attr::rectilinear : 
    110114 
    111              if (domain->lon_name.isEmpty()) lonName = "lon"; 
     115             if (domain->lon_name.isEmpty()) 
     116             { 
     117               if (domain->dim_i_name.isEmpty()) 
     118                   lonName = "lon"; 
     119               else 
     120                 lonName = domain->dim_i_name.getValue(); 
     121             } 
    112122             else lonName = domain->lon_name; 
    113123 
    114              if (domain->lat_name.isEmpty()) latName = "lat"; 
     124             if (domain->lat_name.isEmpty()) 
     125             { 
     126               if (domain->dim_j_name.isEmpty()) 
     127                 latName = "lat"; 
     128               else 
     129                 latName = domain->dim_j_name.getValue(); 
     130             } 
    115131             else latName = domain->lat_name; 
    116132              
    117              dimXid     = lonName+appendDomid; 
    118              dimYid     = latName+appendDomid; 
     133             if (domain->dim_i_name.isEmpty()) dimXid = lonName+appendDomid; 
     134             else dimXid = domain->dim_i_name.getValue()+appendDomid; 
     135 
     136             if (domain->dim_j_name.isEmpty()) dimYid = latName+appendDomid; 
     137             else dimYid = domain->dim_j_name.getValue()+appendDomid; 
    119138             break; 
    120139         } 
     
    222241                     break; 
    223242                 } 
    224  
    225                  bounds_lonid = "bounds_"+lonName+appendDomid; 
    226                  bounds_latid = "bounds_"+latName+appendDomid; 
     243                 if (!domain->bounds_lon_name.isEmpty()) bounds_lonid = domain->bounds_lon_name; 
     244                 else bounds_lonid = "bounds_"+lonName+appendDomid; 
     245                 if (!domain->bounds_lat_name.isEmpty()) bounds_latid = domain->bounds_lat_name; 
     246                 else bounds_latid = "bounds_"+latName+appendDomid; 
    227247 
    228248                 SuperClassWriter::addDimension(dimXid, domain->zoom_ni); 
     
    370390                       break; 
    371391                   } 
    372  
    373                    bounds_lonid = "bounds_"+lonName+appendDomid; 
    374                    bounds_latid = "bounds_"+latName+appendDomid; 
     392                   if (!domain->bounds_lon_name.isEmpty()) bounds_lonid = domain->bounds_lon_name; 
     393                   else bounds_lonid = "bounds_"+lonName+appendDomid; 
     394                   if (!domain->bounds_lat_name.isEmpty()) bounds_latid = domain->bounds_lat_name; 
     395                   else bounds_latid = "bounds_"+latName+appendDomid; 
    375396 
    376397                   this->writeAxisAttributes 
     
    951972         StdString appendDomid  = (singleDomain) ? "" : "_"+domid ; 
    952973 
    953          StdString lonName,latName ; 
     974         StdString lonName,latName, cellName ; 
    954975         if (domain->lon_name.isEmpty()) lonName = "lon"; 
    955976         else lonName = domain->lon_name; 
     
    958979         else latName = domain->lat_name; 
    959980 
    960          StdString dimXid = StdString("cell").append(appendDomid); 
     981         if (!domain->dim_i_name.isEmpty()) cellName=domain->dim_i_name; 
     982         else cellName="cell"; 
     983         StdString dimXid = cellName+appendDomid; 
    961984         StdString dimVertId = StdString("nvertex").append(appendDomid); 
    962985 
     
    10441067                 lonid = lonName+appendDomid; 
    10451068                 latid = latName+appendDomid; 
    1046                  bounds_lonid = "bounds_"+lonName+appendDomid; 
    1047                  bounds_latid = "bounds_"+latName+appendDomid; 
     1069                 if (!domain->bounds_lon_name.isEmpty()) bounds_lonid = domain->bounds_lon_name; 
     1070                 else bounds_lonid = "bounds_"+lonName+appendDomid; 
     1071                 if (!domain->bounds_lat_name.isEmpty()) bounds_latid = domain->bounds_lat_name; 
     1072                 else bounds_latid = "bounds_"+latName+appendDomid; 
     1073 
    10481074                 if (domain->hasLonLat) 
    10491075                 { 
     
    10981124                 lonid = lonName+appendDomid; 
    10991125                 latid = latName+appendDomid; 
    1100                  bounds_lonid = "bounds_"+lonName+appendDomid; 
    1101                  bounds_latid = "bounds_"+latName+appendDomid; 
     1126                 if (!domain->bounds_lon_name.isEmpty()) bounds_lonid = domain->bounds_lon_name; 
     1127                 else bounds_lonid = "bounds_"+lonName+appendDomid; 
     1128                 if (!domain->bounds_lat_name.isEmpty()) bounds_latid = domain->bounds_lat_name; 
     1129                 else bounds_latid = "bounds_"+latName+appendDomid; 
    11021130 
    11031131                 dim0.push_back(dimXid); 
     
    12131241        std::vector<StdString> dims; 
    12141242        StdString axisid = axis->getAxisOutputName(); 
     1243        StdString axisDim; 
    12151244        if (isWrittenAxis(axisid)) return ; 
    12161245        else setWrittenAxis(axisid); 
     
    12251254        try 
    12261255        { 
    1227           SuperClassWriter::addDimension(axisid, zoom_size); 
    12281256          if (!axis->label.isEmpty()) SuperClassWriter::addDimension(strId, stringArrayLen); 
    12291257          if (axis->hasValue) 
    12301258          { 
    1231             dims.push_back(axisid); 
     1259            if (axis->dim_name.isEmpty()) axisDim = axisid; 
     1260            else axisDim=axis->dim_name.getValue(); 
     1261 
     1262            SuperClassWriter::addDimension(axisDim, zoom_size); 
     1263            dims.push_back(axisDim); 
     1264 
    12321265            if (!axis->label.isEmpty()) dims.push_back(strId); 
     1266 
    12331267            SuperClassWriter::addVariable(axisid, typePrec, dims); 
    12341268 
     
    12451279              SuperClassWriter::addAttribute("units", axis->unit.getValue(), &axisid); 
    12461280 
     1281            if (!axis->axis_type.isEmpty()) 
     1282            { 
     1283              switch(axis->axis_type) 
     1284              { 
     1285              case CAxis::axis_type_attr::X : 
     1286                SuperClassWriter::addAttribute("axis", string("X"), &axisid); 
     1287                break; 
     1288              case CAxis::axis_type_attr::Y : 
     1289                SuperClassWriter::addAttribute("axis", string("Y"), &axisid); 
     1290                break; 
     1291              case CAxis::axis_type_attr::Z : 
     1292                SuperClassWriter::addAttribute("axis", string("Z"), &axisid); 
     1293                break; 
     1294              case CAxis::axis_type_attr::T : 
     1295                SuperClassWriter::addAttribute("axis", string("T"), &axisid); 
     1296                break; 
     1297              } 
     1298            } 
     1299 
    12471300            if (!axis->positive.isEmpty()) 
    12481301            { 
    1249               SuperClassWriter::addAttribute("axis", string("Z"), &axisid); 
    12501302              SuperClassWriter::addAttribute("positive", 
    12511303                                             (axis->positive == CAxis::positive_attr::up) ? string("up") : string("down"), 
     
    12781330                SuperClassWriter::addAttribute("formula_term", axis->formula_term_bounds.getValue(), &axisBoundsId); 
    12791331            } 
    1280  
    12811332               
    12821333            SuperClassWriter::definition_end(); 
     
    14131464 
    14141465        StdString scalaId = scalar->getScalarOutputName(); 
     1466        StdString boundsId; 
    14151467        if (isWrittenAxis(scalaId)) return ; 
    14161468        else setWrittenAxis(scalaId); 
     
    14211473        else if (scalar->prec==8)   typePrec =  NC_DOUBLE ; 
    14221474 
    1423          
    14241475        try 
    14251476        { 
    14261477          if (!scalar->value.isEmpty()) 
    14271478          { 
     1479            std::vector<StdString> dims; 
    14281480//            dims.push_back(scalaId); 
    1429             std::vector<StdString> dims; 
     1481            StdString scalarDim = scalaId; 
     1482 
    14301483            SuperClassWriter::addVariable(scalaId, typePrec, dims); 
    14311484 
     
    14411494            if (!scalar->unit.isEmpty()) 
    14421495              SuperClassWriter::addAttribute("units", scalar->unit.getValue(), &scalaId); 
     1496 
     1497            if (!scalar->axis_type.isEmpty()) 
     1498            { 
     1499              switch(scalar->axis_type) 
     1500              { 
     1501              case CScalar::axis_type_attr::X : 
     1502                SuperClassWriter::addAttribute("axis", string("X"), &scalaId); 
     1503                break; 
     1504              case CScalar::axis_type_attr::Y : 
     1505                SuperClassWriter::addAttribute("axis", string("Y"), &scalaId); 
     1506                break; 
     1507              case CScalar::axis_type_attr::Z : 
     1508                SuperClassWriter::addAttribute("axis", string("Z"), &scalaId); 
     1509                break; 
     1510              case CScalar::axis_type_attr::T : 
     1511                SuperClassWriter::addAttribute("axis", string("T"), &scalaId); 
     1512                break; 
     1513              } 
     1514            } 
     1515 
     1516            if (!scalar->bounds_value.isEmpty()) 
     1517            { 
     1518              if (!scalar->bounds_value_name.isEmpty()) 
     1519              { 
     1520                boundsId = scalar->bounds_value_name.getValue(); 
     1521                SuperClassWriter::addAttribute("bounds_value_name", boundsId, &scalaId); 
     1522              } 
     1523              SuperClassWriter::addDimension(boundsId, 1); 
     1524              SuperClassWriter::addVariable(boundsId, typePrec, dims); 
     1525            } 
    14431526 
    14441527            SuperClassWriter::definition_end(); 
     
    14511534                scalarValue(0) = scalar->value; 
    14521535                SuperClassWriter::writeData(scalarValue, scalaId, isCollective, 0); 
     1536                if (!scalar->bounds_value.isEmpty()) 
     1537                { 
     1538                  scalarValue(0) = scalar->bounds_value; 
     1539                  SuperClassWriter::writeData(scalarValue, boundsId, isCollective, 0); 
     1540                } 
    14531541                SuperClassWriter::definition_start(); 
    14541542 
     
    14651553                count[0] = 1; 
    14661554                SuperClassWriter::writeData(scalarValue, scalaId, isCollective, 0, &start, &count); 
     1555                if (!scalar->bounds_value.isEmpty()) 
     1556                { 
     1557                  scalarValue(0) = scalar->bounds_value; 
     1558                  SuperClassWriter::writeData(scalarValue, boundsId, isCollective, 0, &start, &count); 
     1559                } 
    14671560                SuperClassWriter::definition_start(); 
    14681561 
     
    15331626                   break; 
    15341627                 case CDomain::type_attr::unstructured: 
    1535                    compress << "cell" << appendDomId; 
     1628                   StdString cellName = (!domain->dim_i_name.isEmpty()) ? cellName=domain->dim_i_name : "cell"; 
     1629                   compress << cellName << appendDomId; 
     1630//                   compress << "cell" << appendDomId; 
    15361631                   break; 
    15371632               } 
     
    17591854            StdString appendDomId  = singleDomain ? "" : "_" + domId ; 
    17601855            StdString lonName,latName ; 
     1856            StdString dimIname,dimJname ; 
    17611857 
    17621858            if (domain->lon_name.isEmpty()) 
     
    17731869            } 
    17741870            else latName = domain->lat_name; 
     1871 
     1872            if (domain->dim_i_name.isEmpty()) 
     1873            { 
     1874              if (domain->type==CDomain::type_attr::curvilinear) dimIname = "x"; 
     1875              else if (domain->type==CDomain::type_attr::unstructured) dimIname = "cell"; 
     1876              else dimIname = lonName; 
     1877            } 
     1878            else dimIname = domain->dim_i_name; 
     1879 
     1880            if (domain->dim_j_name.isEmpty()) 
     1881            { 
     1882              if (domain->type==CDomain::type_attr::curvilinear) dimJname = "y"; 
     1883              else dimJname = latName; 
     1884            } 
     1885            else dimJname = domain->dim_j_name; 
    17751886         
    17761887            if (compressedOutput && domain->isCompressible() && domain->type != CDomain::type_attr::unstructured) 
     
    17851896                if (!compressedOutput || !domain->isCompressible()) 
    17861897                { 
    1787                   dimXid     = StdString("x").append(appendDomId); 
     1898                  dimXid=dimIname+appendDomId; 
     1899                  dimYid=dimJname+appendDomId; 
    17881900                  dimIdList.push_back(dimXid); 
    1789                   dimYid     = StdString("y").append(appendDomId); 
    17901901                  dimIdList.push_back(dimYid); 
    17911902                } 
     
    17961907                if (!compressedOutput || !domain->isCompressible()) 
    17971908                { 
    1798                   dimXid     = lonName+appendDomId; 
     1909                  dimXid     = dimIname+appendDomId; 
     1910                  dimYid     = dimJname+appendDomId; 
    17991911                  dimIdList.push_back(dimXid); 
    1800                   dimYid     = latName+appendDomId; 
    18011912                  dimIdList.push_back(dimYid); 
    18021913                } 
     1914                if (lonName != dimIname)  dimCoordList.push_back(lonName+appendDomId); 
     1915                if (latName != dimJname)  dimCoordList.push_back(latName+appendDomId); 
     1916 
    18031917              break ; 
    18041918              case CDomain::type_attr::unstructured: 
     
    18061920                if (SuperClassWriter::useCFConvention) 
    18071921                { 
    1808                   dimXid     = StdString("cell").append(appendDomId); 
     1922                  dimXid     = dimIname + appendDomId; 
    18091923                  dimIdList.push_back(dimXid); 
    18101924                  dimCoordList.push_back(lonName+appendDomId); 
     
    18501964            CAxis* axis = CAxis::get(axisList[idxAxis]); 
    18511965            StdString axisId = axis->getAxisOutputName(); 
     1966            StdString axisDim; 
     1967 
     1968            if (axis->dim_name.isEmpty()) axisDim = axisId; 
     1969            else axisDim=axis->dim_name.getValue(); 
    18521970 
    18531971            if (compressedOutput && axis->isCompressible()) 
    18541972            { 
    1855               dimIdList.push_back(axisId + "_points"); 
     1973              dimIdList.push_back(axisDim + "_points"); 
    18561974              field->setUseCompressedOutput(); 
    18571975            } 
    18581976            else 
    1859               dimIdList.push_back(axisId); 
    1860  
    1861             dimCoordList.push_back(axisId); 
     1977              dimIdList.push_back(axisDim); 
     1978 
     1979            if (axisDim != axisId) dimCoordList.push_back(axisId); 
    18621980            ++idxAxis; 
    18631981          } 
    1864           else // scalar 
     1982          else 
    18651983          { 
    1866              /* Do nothing here */ 
     1984            CScalar* scalar = CScalar::get(scalarList[idxScalar]); 
     1985            StdString scalarId = scalar->getScalarOutputName(); 
     1986            dimCoordList.push_back(scalarId); 
     1987            ++idxScalar; 
    18671988          } 
    18681989        } 
Note: See TracChangeset for help on using the changeset viewer.