Re: Trouble passing array to f90 subroutine using WRAPIT

From: Dennis Shea <shea_at_nyahnyahspammersnyahnyah>
Date: Mon Aug 26 2013 - 13:22:26 MDT

Below you created

>>> C NCLFORTSTART
>>> subroutine writearr(ntim,nmod,xtas)
>>> integer ntim,nmod
>>> real xtas(nmod,ntim)
>>> C NCLEND

which declares 'xtas' as type 'real' (ie, a float)

If you passed integers in 'xtas', there would be a problem.
However, passing variables of type float/real should be
exactly what is expected. Just the opposite of what you
stated below. One approach to writing floats and
integers is:

C NCLFORTSTART
          subroutine writeflt(ntim,nmod,xtas)
          implicit none
          integer ntim,nmod
          real xtas(nmod,ntim)
C NCLEND

C NCLFORTSTART
          subroutine writeint(ntim,nmod,xtas)
          implicit none
          integer ntim,nmod
          integer xtas(nmod,ntim)
C NCLEND

On 8/26/13 12:55 PM, David Rasmussen wrote:
> I take back some of what I said. The problem seems to be dependent on the
> variable type. I can pass 2-D integer arrays just fine, but I have trouble
> with floats, which is what I would like to pass between NCL and my f90
> subroutine.
>
>
> On Mon, Aug 26, 2013 at 1:34 PM, David Rasmussen <drasmussen@ucdavis.edu>wrote:
>
>> No errors now, but when I print elements of the array I just get 4
>> question marks (i.e "????") (I am guessing one for each byte?)
>>
>> When I try and format the output, Fortran tells me that my format choice
>> is invalid because the data is of type character....
>>
>> Line: 32 write(6,'(f6.3)') xtas(1,1)
>>
>> At line 32 of file writearr.f90 (unit = 6, file = 'stdout')
>> Fortran runtime error: Expected REAL for item 2 in formatted transfer, got
>> CHARACTER
>> (f6.3)
>>
>> I am able to print results from passed 1-D arrays OK. For passing 2-D
>> arrays, does anything else special need to happen besides swapping array
>> dimensions in the stub file? Again, my subroutine is f90.
>>
>> Thanks!
>>
>>
>> On Mon, Aug 26, 2013 at 11:07 AM, Dennis Shea <shea@ucar.edu> wrote:
>>
>>> Computer rule: Fastest varying dimension maps into fastest
>>> varying dimension. NCL (row major like C) is 0 based and the
>>> rightmost dimension varies fastest. Fortran is column major
>>> and the leftmost dimension varies fastest.
>>>
>>> Dimension order and subscripting are different for different languages.
>>>
>>> NCL: x(NA,NB,NC) <===> x(NC,NC,NA) : fortran
>>>
>>> In computer memory, think of the arrays as a long linear list and the
>>> elements are accessed via a particular language's conventions
>>>
>>> See: page 37: http://www.ncl.ucar.edu/**Document/Manuals/language_man.**
>>> pdf <http://www.ncl.ucar.edu/Document/Manuals/language_man.pdf>
>>>
>>> ---
>>> It should be:
>>>
>>>
>>> C NCLFORTSTART
>>> subroutine writearr(ntim,nmod,xtas)
>>> integer ntim,nmod
>>> real xtas(nmod,ntim)
>>> C NCLEND
>>>
>>> Note:No data rearranging should be done.
>>>
>>>
>>>
>>> On 8/26/13 8:47 AM, David Rasmussen wrote:
>>>
>>>> Hi,
>>>>
>>>> I would like to write an array of data to a text file, similar to this
>>>> request from a previous thread:
>>>> http://www.ncl.ucar.edu/**Support/talk_archives/2012/**0230.html<http://www.ncl.ucar.edu/Support/talk_archives/2012/0230.html>
>>>>
>>>> I have chosen to use WRAPIT to write my data to disk.
>>>>
>>>> I am trying to pass an array to an f90 subroutine, but NCL/WRAPIT keeps
>>>> telling me that my array is not dimensioned correctly.
>>>>
>>>> I have an array defined in the driving NCL script as:
>>>>
>>>> xtas(ntim,nmod), where ntim=34675, nmod=33
>>>>
>>>> I would like to pass this array to a f90 routine. When I try and do this,
>>>> the routine expects xtas to be dimensioned xtas(nmod,ntim) which is NOT
>>>> how
>>>> it is defined in the driving NCL script...
>>>>
>>>> fatal:writearr: dimension size of dimension (1) of xtas must be equal to
>>>> the value of ntim
>>>> fatal:["Execute.c":8128]:**Execute: Error occurred at or near line 226
>>>> in
>>>> file extract_BCSD_lat_lon.ncl
>>>>
>>>> The call to the routine in the NCL script is:
>>>> WRITEARRAY::writearr(ntim,**nmod,xtas)
>>>>
>>>> Immediately before calling the f90 routine, I do
>>>> "printVarSummary(xtas)"...
>>>>
>>>> I get...
>>>>
>>>> Variable: xtas
>>>> Type: float
>>>> Total Size: 4577100 bytes
>>>> 1144275 values
>>>> Number of Dimensions: 2
>>>> Dimensions and sizes: [34675] x [33]
>>>> Coordinates:
>>>> Number Of Attributes: 1
>>>> _FillValue : -999.999
>>>>
>>>> The print summary for xtas is as expected...xtas(ntim,nmod)...
>>>>
>>>> my stub file is:
>>>>
>>>> C NCLFORTSTART
>>>> subroutine writearr(ntim,nmod,xtas)
>>>> integer ntim,nmod
>>>> real xtas(ntim,nmod)
>>>> C NCLEND
>>>>
>>>> my f90 routine is:
>>>>
>>>> subroutine writearr(ntim,nmod,xtas)
>>>> integer ntim, nmod
>>>> real xtas(ntim,nmod)
>>>>
>>>> print*, xtas
>>>>
>>>> return
>>>> end subroutine writearr
>>>>
>>>> Both compile with no errors.
>>>>
>>>> Other info:
>>>>
>>>> WRAPIT Version: 120209
>>>> OPERATING SYSTEM: Darwin
>>>> FORTRAN COMPILER (f90c): gfortran
>>>> FORTRAN COMPILER OPTIONS (fopts): -m64 -fPIC -v -c
>>>> -fno-second-underscore
>>>> gcc -m64 -c -fno-common -I/usr/local/ncl-6.1.2/include WRAPIT.c
>>>> COMPILING writearr.f90
>>>> gfortran -m64 -fPIC -v -c -fno-second-underscore writearr.f90
>>>> Using built-in specs.
>>>> COLLECT_GCC=gfortran
>>>> COLLECT_LTO_WRAPPER=/usr/**local/gfortran/libexec/gcc/**
>>>> x86_64-apple-darwin11/4.6.2/**lto-wrapper
>>>> Target: x86_64-apple-darwin11
>>>> Configured with: ../gcc-4.6.2-RC-20111019/**configure
>>>> --prefix=/usr/local/gfortran
>>>> --with-gmp=/Users/fx/devel/**gcc/deps-static/x86_64
>>>> --enable-languages=c,c++,**fortran,objc,obj-c++
>>>> --build=x86_64-apple-darwin11
>>>> Thread model: posix
>>>> gcc version 4.6.2 20111019 (prerelease) (GCC)
>>>> COLLECT_GCC_OPTIONS='-mmacosx-**version-min=10.8.3' '-m64' '-fPIC' '-v'
>>>> '-c'
>>>> '-fno-second-underscore' '-mtune=core2'
>>>> /usr/local/gfortran/libexec/**gcc/x86_64-apple-darwin11/4.6.**2/f951
>>>> writearr.f90 -fPIC -quiet -dumpbase writearr.f90
>>>> -mmacosx-version-min=10.8.3 -m64 -mtune=core2 -auxbase writearr -version
>>>> -fPIC -fno-second-underscore -fintrinsic-modules-path
>>>> /usr/local/gfortran/lib/gcc/**x86_64-apple-darwin11/4.6.2/**finclude -o
>>>> /var/folders/fl/**p8bxmn6x0gb7vk2qlzv90bdh0000gn**/T//cc8VXUoN.s
>>>> GNU Fortran (GCC) version 4.6.2 20111019 (prerelease)
>>>> (x86_64-apple-darwin11)
>>>> compiled by GNU C version 4.6.2 20111019 (prerelease), GMP version 5.0.2,
>>>> MPFR version 3.0.1-p4, MPC version 0.9
>>>> GGC heuristics: --param ggc-min-expand=100 --param
>>>> ggc-min-heapsize=131072
>>>> GNU Fortran (GCC) version 4.6.2 20111019 (prerelease)
>>>> (x86_64-apple-darwin11)
>>>> compiled by GNU C version 4.6.2 20111019 (prerelease), GMP version 5.0.2,
>>>> MPFR version 3.0.1-p4, MPC version 0.9
>>>> GGC heuristics: --param ggc-min-expand=100 --param
>>>> ggc-min-heapsize=131072
>>>> COLLECT_GCC_OPTIONS='-mmacosx-**version-min=10.8.3' '-m64' '-fPIC' '-v'
>>>> '-c'
>>>> '-fno-second-underscore' '-mtune=core2'
>>>> as -arch x86_64 -force_cpusubtype_ALL -o writearr.o
>>>> /var/folders/fl/**p8bxmn6x0gb7vk2qlzv90bdh0000gn**/T//cc8VXUoN.s
>>>> COMPILER_PATH=/usr/local/**gfortran/libexec/gcc/x86_64-**
>>>> apple-darwin11/4.6.2/:/usr/**local/gfortran/libexec/gcc/**
>>>> x86_64-apple-darwin11/4.6.2/:/**usr/local/gfortran/libexec/**
>>>> gcc/x86_64-apple-darwin11/:/**usr/local/gfortran/lib/gcc/**
>>>> x86_64-apple-darwin11/4.6.2/:/**usr/local/gfortran/lib/gcc/**
>>>> x86_64-apple-darwin11/
>>>> LIBRARY_PATH=/usr/local/**gfortran/lib/gcc/x86_64-apple-**
>>>> darwin11/4.6.2/:/usr/local/**gfortran/lib/gcc/x86_64-apple-**
>>>> darwin11/4.6.2/../../../:/usr/**lib/
>>>> COLLECT_GCC_OPTIONS='-mmacosx-**version-min=10.8.3' '-m64' '-fPIC' '-v'
>>>> '-c'
>>>> '-fno-second-underscore' '-mtune=core2'
>>>> SHARED OBJECT NAME (SharedObj): writearr2.so
>>>> LINKER SUFFIX (ld_suffix): WRAPIT.o writearr.o -L/usr/local/gfortran/lib/
>>>> -o writearr2.so
>>>>
>>>> LINKING
>>>> gcc -m64 -bundle -flat_namespace -undefined suppress WRAPIT.o writearr.o
>>>> -L/usr/local/gfortran/lib/ -o writearr2.so -lgfortran
>>>> END WRAPIT
>>>>
>>>> I must be missing something here. I am not trying to do anything
>>>> complicated. Thanks in advance.
>>>>
>>>>
>>>>
>>>> ______________________________**_________________
>>>> ncl-talk mailing list
>>>> List instructions, subscriber options, unsubscribe:
>>>> http://mailman.ucar.edu/**mailman/listinfo/ncl-talk<http://mailman.ucar.edu/mailman/listinfo/ncl-talk>
>>>>
>>>>
>>
>
_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Mon Aug 26 13:22:34 2013

This archive was generated by hypermail 2.1.8 : Fri Aug 30 2013 - 14:04:57 MDT