Ignore:
Timestamp:
10/16/12 13:04:44 (12 years ago)
Author:
ymipsl
Message:

Major Update

  • redesign Type and attribute manipulation
  • add enumerate type and attribute
  • use blitz class array instead of boost class array

YM

File:
1 edited

Legend:

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

    r354 r369  
    66#include "type_util.hpp" 
    77#include "indent.hpp" 
    8 #include "array.hpp" 
     8#include "enum.hpp" 
     9#include "array_new.hpp" 
    910 
    1011namespace xios 
     
    8384  } 
    8485 
     86  template<> 
     87  void CInterface::AttributeCInterface<CEnumBase>(ostream& oss, const string& className,const string& name)   
     88  { 
     89    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, const char * "<<name<<", int "<<name<<"_size)"<<iendl ; 
     90    oss<<"{"<<iendl ; 
     91    oss<<"  std::string "<<name<<"_str;"<<iendl; 
     92    oss<<"  if(!cstr2string("<<name<<", "<<name<<"_size, "<<name<<"_str)) return;"<<iendl ; 
     93    oss<<"   CTimer::get(\"XIOS\").resume();"<<iendl ; 
     94    oss<<"  "<<className<<"_hdl->"<<name<<".fromString("<<name<<"_str);"<<iendl ; 
     95    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ; 
     96    oss<<"   CTimer::get(\"XIOS\").suspend();"<<iendl ; 
     97    oss<<"}"<<iendl ; 
     98     
     99    oss<<iendl ; 
     100     
     101    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, char * "<<name<<", int "<<name<<"_size)"<<iendl ; 
     102    oss<<"{"<<iendl ; 
     103    oss<<"   CTimer::get(\"XIOS\").resume();"<<iendl ; 
     104    oss<<"  if(!string_copy("<<className<<"_hdl->"<<name<<".getStringValue(),"<<name<<" , "<<name<<"_size))"<<iendl ; 
     105    oss<<"    ERROR(\"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, char * "<<name<<", int " 
     106       <<name<<"_size)\", <<\"Input string is to short\");"<<iendl ; 
     107    oss<<"   CTimer::get(\"XIOS\").suspend();"<<iendl ; 
     108    oss<<"}"<<iendl ; 
     109   
     110  } 
    85111//     if (!array_copy(domain_hdl->mask.getValue(), mask, extent1, extent2)) 
    86112//        ERROR("cxios_get_domain_mask(XDomainPtr domain_hdl, bool * mask, int extent1, int extent2)",<<"Output array size is not conform to array size attribut") ; 
    87113 
    88  
     114/* 
    89115#define macro(T) \ 
    90116  template <>\ 
     
    160186macro(double) 
    161187macro(int) 
     188*/ 
    162189 
    163190#undef macro   
     
    206233      
    207234   } 
    208      
     235 
     236/* 
    209237#define macro(T)\ 
    210238   template <>\ 
     
    280308  macro(double) 
    281309  macro(int) 
    282    
     310 
    283311  #undef macro 
    284    
     312*/   
    285313   template <class T> 
    286314   void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) 
     
    309337   } 
    310338 
     339/* 
    311340#define macro(T)\ 
    312341   template <> \ 
     
    356385 
    357386#undef macro 
    358  
     387*/ 
    359388    
    360389   template <class T> 
     
    404433   } 
    405434 
    406  
     435/* 
    407436#define macro(T) \ 
    408437   template <>  \ 
     
    459488 
    460489#undef macro 
    461  
     490*/ 
     491 
     492/* 
    462493#define macro(T) \ 
    463494   template <>  \ 
     
    514545 
    515546#undef macro 
     547*/ 
     548 
     549// declaration for CArray 
     550 
     551 
     552 
     553 
     554#define macro(T) \ 
     555  template <>\ 
     556  void CInterface::AttributeCInterface<CArray<T,1> >(ostream& oss, const string& className,const string& name)\ 
     557  {\ 
     558    string typeName=getStrType<T>() ;\ 
     559\ 
     560    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1)"<<iendl ;\ 
     561    oss<<"{"<<iendl ;\ 
     562    oss<<"  CTimer::get(\"XIOS\").resume();"<<iendl ; \ 
     563    oss<<"  CArray<"<<typeName<<",1> tmp("<<name<<",shape(extent1),neverDeleteData) ;"<<iendl ;\ 
     564    oss<<"  "<<className<<"_hdl->"<<name<<".reference(tmp.copy());"<<iendl ;\ 
     565    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\ 
     566    oss<<"}"<<iendl ;\ 
     567    oss<<iendl; \ 
     568    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1)"<<iendl ;\ 
     569    oss<<"{"<<iendl; \ 
     570    oss<<"  CArray<"<<typeName<<",1> tmp("<<name<<",shape(extent1),neverDeleteData) ;"<<iendl ;\ 
     571    oss<<"  tmp="<<className<<"_hdl->"<<name<<" ;"<<iendl ;\ 
     572    oss<<"   CTimer::get(\"XIOS\").suspend();"<<iendl ;\ 
     573    oss<<"}"<<iendl ;\ 
     574  }\ 
     575\ 
     576  template <> \ 
     577  void CInterface::AttributeCInterface<CArray<T,2> >(ostream& oss, const string& className,const string& name)\ 
     578  {\ 
     579    string typeName=getStrType<T>() ;\ 
     580\ 
     581    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2)"<<iendl ;\ 
     582    oss<<"{"<<iendl ;\ 
     583    oss<<"  CTimer::get(\"XIOS\").resume();"<<iendl ; \ 
     584    oss<<"  CArray<"<<typeName<<",2> tmp("<<name<<",shape(extent1,extent2),neverDeleteData) ;"<<iendl ;\ 
     585    oss<<"  "<<className<<"_hdl->"<<name<<".reference(tmp.copy());"<<iendl ;\ 
     586    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\ 
     587    oss<<"}"<<iendl ;\ 
     588    oss<<iendl; \ 
     589    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2)"<<iendl ;\ 
     590    oss<<"{"<<iendl; \ 
     591    oss<<"  CArray<"<<typeName<<",2> tmp("<<name<<",shape(extent1,extent2),neverDeleteData) ;"<<iendl ;\ 
     592    oss<<"  tmp="<<className<<"_hdl->"<<name<<" ;"<<iendl ;\ 
     593    oss<<"   CTimer::get(\"XIOS\").suspend();"<<iendl ;\ 
     594    oss<<"}"<<iendl ;\ 
     595  }\ 
     596\ 
     597  template <>\ 
     598  void CInterface::AttributeCInterface<CArray<T,3> >(ostream& oss, const string& className,const string& name)\ 
     599  {\ 
     600    string typeName=getStrType<T>() ;\ 
     601\ 
     602    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2, int extent3)"<<iendl ;\ 
     603    oss<<"{"<<iendl ;\ 
     604    oss<<"  CTimer::get(\"XIOS\").resume();"<<iendl ; \ 
     605    oss<<"  CArray<"<<typeName<<",2> tmp("<<name<<",shape(extent1,extent2,extent3),neverDeleteData) ;"<<iendl ;\ 
     606    oss<<"  "<<className<<"_hdl->"<<name<<".reference(tmp.copy());"<<iendl ;\ 
     607    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\ 
     608    oss<<"}"<<iendl ;\ 
     609    oss<<iendl; \ 
     610    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2, int extent3)"<<iendl ;\ 
     611    oss<<"{"<<iendl; \ 
     612    oss<<"  CArray<"<<typeName<<",2> tmp("<<name<<",shape(extent1,extent2,extent3),neverDeleteData) ;"<<iendl ;\ 
     613    oss<<"  tmp="<<className<<"_hdl->"<<name<<" ;"<<iendl ;\ 
     614    oss<<"   CTimer::get(\"XIOS\").suspend();"<<iendl ;\ 
     615    oss<<"}"<<iendl ;\ 
     616  } 
     617 
     618macro(bool) 
     619macro(double) 
     620macro(int) 
     621 
     622#undef macro   
     623 
     624// ///////////////////////////////////////////////// 
     625// //          Fortran 2003 Interface             // 
     626// ///////////////////////////////////////////////// 
     627 
     628 
     629     
     630#define macro(T)\ 
     631   template <>\ 
     632   void CInterface::AttributeFortran2003Interface<CArray<T,1> >(ostream& oss,const string& className,const string& name) \ 
     633   { \ 
     634     string fortranType=getStrFortranType<T>() ; \ 
     635     string fortranKindC=getStrFortranKindC<T>() ; \ 
     636      \ 
     637     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1) BIND(C)"<<iendl ; \ 
     638     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     639     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     640     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     641     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     642     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \ 
     643     oss<<iendl; \ 
     644     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1) BIND(C)"<<iendl ; \ 
     645     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     646     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     647     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     648     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     649     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \ 
     650   } \ 
     651 \ 
     652   template <> \ 
     653   void CInterface::AttributeFortran2003Interface<CArray<T,2> >(ostream& oss,const string& className,const string& name) \ 
     654   { \ 
     655     string fortranType=getStrFortranType<T>() ; \ 
     656     string fortranKindC=getStrFortranKindC<T>() ; \ 
     657      \ 
     658     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2) BIND(C)"<<iendl ; \ 
     659     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     660     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     661     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     662     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     663     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \ 
     664     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \ 
     665     oss<<iendl ; \ 
     666     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2) BIND(C)"<<iendl ; \ 
     667     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     668     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     669     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     670     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     671     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \ 
     672     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \ 
     673   } \ 
     674     \ 
     675   template <> \ 
     676   void CInterface::AttributeFortran2003Interface<CArray<T,3> >(ostream& oss,const string& className,const string& name) \ 
     677   { \ 
     678     string fortranType=getStrFortranType<T>() ; \ 
     679     string fortranKindC=getStrFortranKindC<T>() ; \ 
     680      \ 
     681     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2, extent3) BIND(C)"<<iendl ; \ 
     682     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     683     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     684     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     685     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     686     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \ 
     687     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent3"<<iendl ; \ 
     688     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \ 
     689     oss<<iendl ;\ 
     690     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2, extent3) BIND(C)"<<iendl ; \ 
     691     oss<<"  USE ISO_C_BINDING"<<iendl ; \ 
     692     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \ 
     693     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \ 
     694     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \ 
     695     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \ 
     696     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent3"<<iendl ; \ 
     697     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \ 
     698   } 
     699   
     700  macro(bool) 
     701  macro(double) 
     702  macro(int) 
     703   
     704  #undef macro 
     705   
     706 
     707#define macro(T)\ 
     708   template <> \ 
     709   void CInterface::AttributeFortranInterfaceDeclaration<CArray<T,1> >(ostream& oss,const string& className,const string& name) \ 
     710   { \ 
     711     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:)"<<iendl ; \ 
     712     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:)"<<iendl ; \ 
     713   } \ 
     714   template <> \ 
     715   void CInterface::AttributeFortranInterfaceGetDeclaration<CArray<T,1> >(ostream& oss,const string& className,const string& name) \ 
     716   { \ 
     717     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:)"<<iendl ; \ 
     718     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:)"<<iendl ; \ 
     719   } \ 
     720 \ 
     721   template <> \ 
     722   void CInterface::AttributeFortranInterfaceDeclaration<CArray<T,2> >(ostream& oss,const string& className,const string& name) \ 
     723   { \ 
     724     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:,:)"<<iendl ; \ 
     725     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:)"<<iendl ; \ 
     726   } \ 
     727 \ 
     728   template <> \ 
     729   void CInterface::AttributeFortranInterfaceGetDeclaration<CArray<T,2> >(ostream& oss,const string& className,const string& name) \ 
     730   { \ 
     731     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:,:)"<<iendl ; \ 
     732     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:)"<<iendl ; \ 
     733   } \ 
     734 \ 
     735   template <> \ 
     736   void CInterface::AttributeFortranInterfaceDeclaration<CArray<T,3> >(ostream& oss,const string& className,const string& name) \ 
     737   { \ 
     738     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:,:,:)"<<iendl ; \ 
     739     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:,:)"<<iendl ; \ 
     740   }\ 
     741 \ 
     742   template <> \ 
     743   void CInterface::AttributeFortranInterfaceGetDeclaration<CArray<T,3> >(ostream& oss,const string& className,const string& name) \ 
     744   { \ 
     745     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:,:,:)"<<iendl ; \ 
     746     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:,:)"<<iendl ; \ 
     747   }      
     748    
     749  macro(bool) 
     750  macro(double) 
     751  macro(int) 
     752 
     753#undef macro 
     754 
     755    
     756 
     757#define macro(T) \ 
     758   template <>  \ 
     759   void CInterface::AttributeFortranInterfaceBody< CArray<T,1> >(ostream& oss,const string& className,const string& name) \ 
     760   {  \ 
     761     string name_tmp=name+"__tmp" ; \ 
     762      \ 
     763     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     764     if (!matchingTypeCFortran<T>())  \ 
     765     { \ 
     766       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1)))"<<iendl ; \ 
     767       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \ 
     768       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1))"<<iendl ; \ 
     769     } \ 
     770     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1))"<<iendl ; \ 
     771     oss<<"ENDIF"<<iendl ; \ 
     772   } \ 
     773 \ 
     774   template <>  \ 
     775   void CInterface::AttributeFortranInterfaceBody< CArray<T,2> >(ostream& oss,const string& className,const string& name) \ 
     776   {  \ 
     777     string name_tmp=name+"__tmp" ; \ 
     778      \ 
     779     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     780     if (!matchingTypeCFortran<T>())  \ 
     781     { \ 
     782       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2)))"<<iendl ; \ 
     783       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \ 
     784       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \ 
     785     } \ 
     786     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \ 
     787     oss<<"ENDIF"<<iendl ; \ 
     788   } \ 
     789    \ 
     790   template <>  \ 
     791   void CInterface::AttributeFortranInterfaceBody< CArray<T,3> >(ostream& oss,const string& className,const string& name) \ 
     792   {  \ 
     793     string name_tmp=name+"__tmp" ; \ 
     794      \ 
     795     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     796     if (!matchingTypeCFortran<T>())  \ 
     797     { \ 
     798       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3)))"<<iendl ; \ 
     799       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \ 
     800       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \ 
     801     } \ 
     802     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \ 
     803     oss<<"ENDIF"<<iendl ; \ 
     804   } 
     805   
     806  macro(bool) 
     807  macro(double) 
     808  macro(int) 
     809 
     810#undef macro 
     811 
     812#define macro(T) \ 
     813   template <>  \ 
     814   void CInterface::AttributeFortranInterfaceGetBody< CArray<T,1> >(ostream& oss,const string& className,const string& name) \ 
     815   {  \ 
     816     string name_tmp=name+"__tmp" ; \ 
     817      \ 
     818     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     819     if (!matchingTypeCFortran<T>())  \ 
     820     { \ 
     821       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1)))"<<iendl ; \ 
     822       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1))"<<iendl ; \ 
     823       oss<<"  "<<name<<"_="<<name_tmp<<"_"<<iendl ; \ 
     824     } \ 
     825     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1))"<<iendl ; \ 
     826     oss<<"ENDIF"<<iendl ; \ 
     827   } \ 
     828 \ 
     829   template <>  \ 
     830   void CInterface::AttributeFortranInterfaceGetBody< CArray<T,2> >(ostream& oss,const string& className,const string& name) \ 
     831   {  \ 
     832     string name_tmp=name+"__tmp" ; \ 
     833      \ 
     834     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     835     if (!matchingTypeCFortran<T>())  \ 
     836     { \ 
     837       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2)))"<<iendl ; \ 
     838       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \ 
     839       oss<<"  "<<name<<"_="<<name_tmp<<iendl ; \ 
     840     } \ 
     841     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \ 
     842     oss<<"ENDIF"<<iendl ; \ 
     843   } \ 
     844    \ 
     845   template <>  \ 
     846   void CInterface::AttributeFortranInterfaceGetBody< CArray<T,3> >(ostream& oss,const string& className,const string& name) \ 
     847   {  \ 
     848     string name_tmp=name+"__tmp" ; \ 
     849      \ 
     850     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \ 
     851     if (!matchingTypeCFortran<T>())  \ 
     852     { \ 
     853       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3)))"<<iendl ; \ 
     854       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \ 
     855       oss<<"  "<<name<<"_="<<name_tmp<<iendl ; \ 
     856      } \ 
     857     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \ 
     858     oss<<"ENDIF"<<iendl ; \ 
     859   } 
     860      
     861  macro(bool) 
     862  macro(double) 
     863  macro(int) 
     864 
     865#undef macro 
     866 
     867 
     868 
     869 
     870 
     871 
     872 
     873 
     874 
     875 
     876 
     877 
     878 
     879 
     880 
     881 
     882 
     883 
     884 
     885 
     886 
     887 
     888 
     889 
     890 
     891 
     892 
     893 
     894 
     895 
     896 
     897 
     898 
     899 
     900 
    516901} 
    517902 
Note: See TracChangeset for help on using the changeset viewer.