Ignore:
Timestamp:
12/10/14 14:27:09 (9 years ago)
Author:
rlacroix
Message:

Add a new attribute type for dates and use it for the context's start_date and time_origin.

The "xios_date" type should now be used to get/set date attributes through the Fortran interface. This avoids using strings to manipulate dates.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/generate_interface_impl.hpp

    r509 r532  
    88#include "enum.hpp" 
    99#include "array_new.hpp" 
     10#include "date.hpp" 
    1011 
    1112namespace xios 
     
    1516  template<> string CInterface::getStrFortranType<double>(void) {return string("REAL") ;} 
    1617  template<> string CInterface::getStrFortranType<float>(void) {return string("REAL") ;} 
     18  template<> string CInterface::getStrFortranType<CDate>(void) {return string("TYPE(txios(date))") ;} 
    1719 
    1820  template<> string CInterface::getStrFortranKind<int>(void) {return string("") ;} 
     
    2022  template<> string CInterface::getStrFortranKind<double>(void) {return string("(KIND=8)") ;} 
    2123  template<> string CInterface::getStrFortranKind<float>(void) {return string("(KIND=4)") ;} 
     24  template<> string CInterface::getStrFortranKind<CDate>(void) {return string("") ;} 
    2225 
    2326  template<> string CInterface::getStrFortranKindC<int>(void) {return string("(KIND=C_INT)") ;} 
     
    2528  template<> string CInterface::getStrFortranKindC<double>(void) {return string("(KIND=C_DOUBLE)") ;} 
    2629  template<> string CInterface::getStrFortranKindC<float>(void) {return string("(KIND=C_FLOAT)") ;} 
     30  template<> string CInterface::getStrFortranKindC<CDate>(void) {return string("") ;} 
    2731 
    2832  template<> bool CInterface::matchingTypeCFortran<int>(void) { return true ; } 
     
    3034  template<> bool CInterface::matchingTypeCFortran<double>(void) { return true; } 
    3135  template<> bool CInterface::matchingTypeCFortran<float>(void) { return true; } 
     36  template<> bool CInterface::matchingTypeCFortran<CDate>(void) { return true; } 
    3237 
    3338 
     
    125130//     if (!array_copy(domain_hdl->mask.getValue(), mask, extent1, extent2)) 
    126131//        ERROR("cxios_get_domain_mask(XDomainPtr domain_hdl, bool * mask, int extent1, int extent2)",<<"Output array size is not conform to array size attribut") ; 
     132 
     133  template<> 
     134  void CInterface::AttributeCInterface<CDate>(ostream& oss, const string& className,const string& name) 
     135  { 
     136    oss << "void cxios_set_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, cxios_date " << name << "_c)" << iendl; 
     137    oss << "{" << iendl; 
     138    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; 
     139    oss << "  " << className << "_hdl->" << name << ".allocate();" << iendl; 
     140    oss << "  CDate& " << name <<" = " << className << "_hdl->" << name << ".get();" << iendl; 
     141    oss << "  " << name << ".setDate(" << name << "_c.year," << iendl; 
     142    oss << "                         " << name << "_c.month," << iendl; 
     143    oss << "                         " << name << "_c.day," << iendl; 
     144    oss << "                         " << name << "_c.hour," << iendl; 
     145    oss << "                         " << name << "_c.minute," << iendl; 
     146    oss << "                         " << name << "_c.second);" << iendl; 
     147    oss << "  if (" << name << ".hasRelCalendar())" << iendl; 
     148    oss << "    " << name << ".checkDate();" << iendl; 
     149    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; 
     150    oss << "}" << iendl; 
     151 
     152    oss << iendl; 
     153 
     154    oss << "void cxios_get_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, cxios_date* " << name << "_c)" << iendl; 
     155    oss << "{" << iendl; 
     156    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; 
     157    oss << "  CDate " << name <<" = " << className << "_hdl->" << name << ".getInheritedValue();" << iendl; 
     158    oss << "  " << name << "_c->year = " << name << ".getYear();" << iendl; 
     159    oss << "  " << name << "_c->month = " << name << ".getMonth();" << iendl; 
     160    oss << "  " << name << "_c->day = " << name << ".getDay();" << iendl; 
     161    oss << "  " << name << "_c->hour = " << name << ".getHour();" << iendl; 
     162    oss << "  " << name << "_c->minute = " << name << ".getMinute();" << iendl; 
     163    oss << "  " << name << "_c->second = " << name << ".getSecond();" << iendl; 
     164    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; 
     165    oss << "}" << iendl; 
     166    oss << iendl; 
     167  } 
    127168 
    128169/* 
     
    256297     oss<<iendl ; 
    257298   } 
     299 
     300  template <> 
     301  void CInterface::AttributeFortran2003Interface<CDate>(ostream& oss, const string& className, const string& name) 
     302  { 
     303    oss << "SUBROUTINE cxios_set_" << className << "_" << name << "(" << className << "_hdl, " << name << ") BIND(C)" << iendl; 
     304    oss << "  USE ISO_C_BINDING" << iendl; 
     305    oss << "  USE IDATE" << iendl; 
     306    oss << "  INTEGER (kind = C_INTPTR_T), VALUE :: " << className << "_hdl" << iendl; 
     307    oss << "  TYPE(xios_date), VALUE :: " << name << iendl; 
     308    oss << "END SUBROUTINE cxios_set_" << className << "_" << name << iendl; 
     309    oss << iendl; 
     310    oss << "SUBROUTINE cxios_get_" << className << "_" << name << "(" << className << "_hdl, " << name << ") BIND(C)" << iendl; 
     311    oss << "  USE ISO_C_BINDING" << iendl; 
     312    oss << "  USE IDATE" << iendl; 
     313    oss << "  INTEGER (kind = C_INTPTR_T), VALUE :: " << className << "_hdl" << iendl; 
     314    oss << "  TYPE(txios(date)) :: " << name << iendl; 
     315    oss << "END SUBROUTINE cxios_get_" << className << "_" << name << iendl; 
     316    oss << iendl; 
     317  } 
    258318 
    259319/* 
Note: See TracChangeset for help on using the changeset viewer.