/*! \file f77test.cc * \brief test interfacing Fortran code (implementation) * * ---------------------------------------------------------------------------- * * $Id: f77test.cc,v 1.5 2002-12-27 16:18:08 forbrig Exp $ * \author Thomas Forbriger * \date 22/12/2002 * * test interfacing Fortran code (implementation) * * \sa \ref page_fortran * * Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt) * * REVISIONS and CHANGES * - 22/12/2002 V1.0 Thomas Forbriger * * ============================================================================ */ /*! \example tests/f77test.cc * * Passing arrays to Fortran 77 code and retrieving array structures * from Fortran 77 common blocks. * * \sa tests/f77test.cc * \sa \ref page_fortran */ #define AFF_F77TEST_CC_VERSION \ "AFF_F77TEST_CC V1.0 " #define AFF_F77TEST_CC_CVSID \ "$Id: f77test.cc,v 1.5 2002-12-27 16:18:08 forbrig Exp $" #include #include #include #include #include #include #include "f77proto.h" using std::cout; using std::endl; using namespace aff; /*----------------------------------------------------------------------*/ //! print headline void section(const char* s, const char l='-') { cout << endl << s << endl; const char* p=s; while (*p) { cout << l; ++p; } cout << endl; } /*======================================================================*/ /*! \brief test array interface to Fortran 77 * * \sa \ref page_fortran */ int main() { cout << AFF_F77TEST_CC_VERSION << endl; cout << AFF_F77TEST_CC_CVSID << endl; // First we test the shape class that should support passing arrays to // Fortran 77 functions section("FortranShape:", '='); { section("Full Layout"); // we create a test array with known Fortran layout CODE(Strided strided(Shaper(1,10,20)(1,5,10)(1,30)(20))); // dump this shape DUMP(strided); // create Fortran shape from this (should be identical to known) CODE(aff::util::FortranShape fs1(strided)); // and dump this DUMP(fs1.first()); DUMP(fs1.last()); DUMP(fs1.dimlast()); cout << "fs1.offset(): " << fs1.offset() << endl; section("Sliced Subshape"); // now take shape of a subarray CODE(Strided subshape(strided)); CODE(subshape.shrink(0,2).shrink(1,3,5).shrink(3,10,20)); CODE(subshape.collapse(2,15)); // create Fortran shape from this CODE(aff::util::FortranShape fs2(subshape)); // and dump this DUMP(fs2.first()); DUMP(fs2.last()); DUMP(fs2.dimlast()); cout << "fs2.offset(): " << fs2.offset() << endl; } /*----------------------------------------------------------------------*/ section("Pass array to Fortran via subroutine arguments:", '='); { // create an array and fill it CODE(Array A(Shaper(-3,3)(9)(-1,1))); CODE(A=-55); // create a subarray view and fill this through Fortran CODE(Array B=Subarray(A)(-2,2)(3,7)(0)); CODE(f77interface::fill(B)); // dump the result CODE(dump_array(A)); // do it again for a slice CODE(f77interface::fill(Slice(A)()(2))); CODE(dump_array(A)); } /*----------------------------------------------------------------------*/ section("Access to common block:", '='); { // prepare to vectors to pass to fillarray CODE(Array v1(5)); CODE(Array v2(3)); CODE(for(int i=v1.f(0); i<=v1.l(0); i++) { v1(i)=2.*i; }); CODE(for(int i=v2.f(0); i<=v2.l(0); i++) { v2(i)=.5*i; }); // fill common block through Fortran 77 subroutine CODE(f77interface::fillarray(v1, v2)); // get a view on the common block and dump it CODE(f77interface::Tzarray Z(f77interface::viewcommon())); CODE(dump_array(Z)); // call Fortran subroutine sum and dump result CODE(dump_array(f77interface::sums())); CODE(typedef f77interface::Tzarray::Tvalue Tzvalue); // write directly to common block through a subarray CODE(Subarray SZ); CODE(SZ(Z)(2,4)=Tzvalue(-10.)); // and dump the effect CODE(dump_array(Z)); CODE(dump_array(f77interface::sums())); } } // main /* ----- END OF f77test.cc ----- */