13
Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan Muszala John Cary, Tom Epperly, Ammar Hakim, Scott Kruger, Gary Kumfert, Alexander Pletzer, Rooparani Pundaleeka, Srinath Vadlamani, Nanbor Wang January 17, 2008

Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

Embed Size (px)

Citation preview

Page 1: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

Babel F2003 Struct Support Update and FACETS

integration

Funded by DOE (TASCS) Grant No

DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099

and Tech-X

Stefan MuszalaJohn Cary, Tom Epperly, Ammar

Hakim, Scott Kruger, Gary Kumfert, Alexander Pletzer,

Rooparani Pundaleeka, Srinath Vadlamani, Nanbor Wang

January 17, 2008

Page 2: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

Distcomp: One of the goals of the Distcomp work is to implement Fortran 2003 bindings in Babel for struct support. This work is aligned with the work of the Common Component Architecture (TASCS).

What are the Tech-X scopes of theDistcomp and TASCS projects?

TASCS: Part of the TASCS work is a collaboration with the FACETS*project in which we are integrating a C++ framework withFortran modules (eventually Python, C). We are using the newly developed Fortran 2003 bindings in Babel to achieve our goal.

* FACETS-(Framework Application for Core-Edge Transport Simulations) is a SCIDAC project led by Tech-X which aims to integrate core, edge and wall fusion simulations.

Page 3: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

mmm95 glf23

Interfacesf1,f2,...,fM

FMCFM

tglf

C++Methods

BABEL

Interfacesw1,w2,...,wN

WallPSI

C++Methods

Fortran

BABEL

Fortran

C++Class Interfaces

FACETS+Babel integration only requirescomponents at end of call chain

Page 4: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

What work has been Completed?

•Distcomp:•F2003 Implementation of Primitive Types in Babel.•F2003 Implementation of Array Types in Babel.•F2003 Implementation of R-array Types in Babel.

•TASCS work related to Fusion Projects:•Have SIDL versions of FACETS Fortran Derived Types. Runs in a test FACETS Framework using R-arrays.•Have SIDL prototype of FACETS interface which passes Babel struct from C++ to Fortran transport module•Added timing infrastructure to test codes in order to compare with original (non-Babel) test code.

Page 5: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

What still needs to be completed?

•Distcomp:• Regression tests for F2003 structs.

•Includes all Fortran->”other language” combinations.• Add examples - have some of these in Tech-X repo.•Enumeration Types• Documentation.• Check pointer _init - (OK?) for non-static rarrays.• Check pointer _destroy - (OK?) for non-static rarrays.• Make sure copy works - (OK?) For non-static rarrays.• _serialize/_deserialize for RMI calls.• Provide access to every struct member.

•TASCS work related to Fusion Projects:•Complete transport module interfaces. •Continue working on SIDL interfaces for other modules.

Page 6: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

package addRand version 1.0{ struct fStruct{ double bX; int bY; };…}

module addRand_fStrucuse,intrinsic :: iso_c_binding type,bind(c) :: addRand_fStruct_t real(c_double) :: bX integer(c_int32_t) :: bY end type addRand_fStruct_tend module addRand_fStruct

How we use BindC to provide Babel Primitive type capability in Babel

Structs.

Page 7: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

How we use BindC to provide Babel Array type capability in Babel

Structs.package addRand version 1.0{ struct fStruct{ double bX; int iY; array<double,1,column-major> testArr; }; class modStruct{ void doWork(in int n, inout fStruct

structTest); }}

addRand::fStruct fTest;

… for (size_t i = 0 ; i < N ; i++) { sidl_double__array_set1(fTest.testArr,i,double(i)); }…addRand::modStruct bS = addRand::modStruct:: _create();

bS.doWork(10,fTest);

… type(addRand_fStruct_t) :: structTest! inout…

do i=0,structTest%iY call get(structTest%testArr, i, temp) call set(structTest%testArr,i,temp*5.0) enddo

module addRand_fStruct use,intrinsic :: iso_c_binding use sidl_double_array type,bind(c) :: addRand_fStruct_t real(c_double) :: bX integer(c_int32_t) :: iY type(sidl_double_1d) :: testArr end type addRand_fStruct_tend module addRand_fStruct

Page 8: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

We have used BIND© to provide two types of rarray support for C/F90 and C+

+/F90 struct bindings.

SIDL

struct flags{…rarray<int,1> glfIflagin(5);…}

C++/C …double glfIflagin[5];

FORTRAN …real(c_double)::glfIflagin(5)…

Static R-Array

Page 9: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

We have used BIND© to provide two types of rarray support for C/F90 and C+

+/F90 struct bindings.SIDLstruct structTest{…int iY;rarray<int,1> structRaw(iY);// Probably don’t want:rarray<int,1> structRaw(*);…}C++/C double *structRaw;

real(c_double),dimension(:),pointer :: structTest_structRAW_fptr

call C_F_POINTER(CPTR=structTest%structRAW, & FPTR=structTest_structRAW_fptr, & SHAPE=(/DIM/))

do i=1,structTest%iY structTest_structRAW_fptr(i)=structTest_structRAW_fptr(i)+5.0 enddo

module addRand_fStruct use,intrinsic :: iso_c_binding use sidl_double_array type,bind(c) :: addRand_fStruct_t real(c_double) :: bX integer(c_int32_t) :: iY type(c_ptr) :: structRAW real(c_double)::fixBound(10) end type addRand_fStruct_tend module addRand_fStruct

Dynamic R-Array

Page 10: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

real(c_double),dimension(:),pointer :: structTest_structRAW_fptr

call C_F_POINTER(CPTR=structTest%structRAW, & FPTR=structTest_structRAW_fptr, & SHAPE=(/DIM/)) do i=1,structTest%iY structTest_structRAW_fptr(i)=structTest_structRAW_fptr(i)+5.0

enddo

call procedureDoSomething(structTest_structRAW_fptr)

! NOT

call procedureDoSomething(structTest)

What is the best way to pass the converted F pointer

to deeply nested procedure calls?

Page 11: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

struct Flags {… double glfCbetae; /*FD set cbetae=1 for fully electromagnetic */ double glfCnu; /*FD factor for the collisionality */ rarray<int,1> glfIflagin(5); /*FD Transport flags internal to the GLF module */ rarray<double,1> glfXparam(30); /*FD Normalizers and calibration coefficients */

/* internal to the module */ int mmmNroot; /*FD number of moments */ int mmmNpoints; /*FD should be always 1 */… };

REAL(kind=r8) :: glfCbetae !*FD set cbetae=1 for fully electromagnetic REAL(kind=r8) :: glfCnu !*FD factor for the collisionality INTEGER, DIMENSION(5) :: glfIflagin !*FD Transport flags internal to the GLF module REAL(kind=r8), DIMENSION(30) :: glfXparam !*FD Normalizers and calibration c

!* coefficients internal to the module INTEGER :: mmmNroot !*FD number of moments INTEGER :: mmmNpoints !*FD should be always 1

How do we convert the transport module Flags type to SIDL?

Page 12: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

How do we provide the transport modules interface

using Babel?

fmcfmWrap::fmcfm FM = fmcfmWrap::fmcfm::_create(); retVal=t_start("TmInitFlags");FM.siInitFlags(flags,funit_input);retVal=t_stop("TmInitFlags");

recursive subroutine fmcfmWrap_fmcfm_siInitFlags_mi(self, mflags, funit, & exception)… call sidlInitFlags(mflags,funit)…

19 SUBROUTINE sidlInitFlags(mFlags,funit) 20 USE input_namelist_mod 21 IMPLICIT NONE 22 23 TYPE(fmcfmWrap_Flags_t),INTENT(OUT) :: mflags 24 INTEGER, INTENT(IN) :: funit 25 26 IF(funit > 0) THEN 27 REWIND(funit) 28 READ(funit,GLF_FLAGS) 29 REWIND(funit) 30 READ(funit,MMM_FLAGS) 31 ENDIF 32 33 CALL setFlags(mFlags) 34 35 END SUBROUTINE sidlInitFlags

Page 13: Babel F2003 Struct Support Update and FACETS integration Funded by DOE (TASCS) Grant No DE-FC02-07ER25805, DOE Grant No DE-FG02-04ER84099 and Tech-X Stefan

• Questions/Comments