=head1 NAME NCAR =head1 SYNOPSIS use PDL; use NCAR; &NCAR::gopks( 6, 1 ); &NCAR::gopwk( 1, 2, 1 ); &NCAR::gacwk( 1 ); # # Symbolic station model # &NCAR::wmsetr('WBS',0.20); &NCAR::gslwsc(3.); ( ... ) &NCAR::frame(); &NCAR::gdawk( 1 ); &NCAR::gclwk( 1 ); &NCAR::gclks(); =head1 DESCRIPTION Interfaces Perl, PDL & NCAR, through XS code. The aim is to provide the user with native NCAR commands. Whenever large float/int arrays are needed, piddles have to be passed to NCAR routines, eg : my $F = float [ [ ... ], ... ]; my $NX = ...; my $NY = ...; &NCAR::cpezct( $F, $NX, $NY ); Because the Fortran declaration of the routine cpezct looks like : C SUBROUTINE CPEZCT (ZDAT,MZDT,NZDT) C DIMENSION ZDAT(MZDT,NZDT) However, small arrays ( ie arrays whose dimension is fixed and small ) are passed as native Perl ARRAY refs : &NCAR::mapset( "CO", [ 0., 0. ], [ -90., 0. ], [ 90., 0. ], [ 90., 0. ] ); Because the Fortran declaration of mapset is : SUBROUTINE MAPSET (ARG1,ARG2,ARG3,ARG4,ARG5) CHARACTER*(*) ARG1 REAL ARG2(2),ARG3(2),ARG4(2),ARG5(2) So there is no need to use piddles in that case ( and it would not be very convenient ). It is possible to pass arrays of strings : my @IMDAT = ( '11212', '83320', '10011', '20000', '30000', '40147', '52028', '60111', '77060', '86792', ); &NCAR::wmstnm($X2,.23, \@IMDAT); Such arrays are converted into Fortran arrays of strings ( which is a rather dirty business ), and passed by value( up to now ), which means that you can't get back the modified values ( if the array was modified by the Fortran subroutine ). =head2 Callbacks Some NCAR Fortran subroutines accept callback subroutines as arguments, eg : EXTERNAL SHADER ( ... ) CALL ARSCAM (IAMA,XCRA,YCRA,1000,IARA,IGRA,10,SHADER) ( ... ) SUBROUTINE SHADER (XCS,YCS,NCS,IAI,IAG,NAI) END It's possible to do that in Perl as wall, that is, one would write : &NCAR::arscam($IAMA,$XCRA,$YCRA,1000,$IARA,$IGRA,10,\&SHADER); ( ... ) sub SHADER { my (XCS,YCS,NCS,IAI,IAG,NAI) = @_; ( ... ) } =head2 Common blocks Some NCAR Fortran examples access COMMON blocks of the NCAR library, eg : COMMON /SRFIP1/ IFR ,ISTP ,IROTS ,IDRX , 1 IDRY ,IDRZ ,IUPPER ,ISKIRT , 2 NCLA ,THETA ,HSKIRT ,CHI , 3 CLO ,CINC ,ISPVAL ( ... ) IFR = 0 In Perl, one would write : use NCAR::COMMON qw( %SRFIP1 ); ( ... ) $SRFIP1{IFR} = 0; Note that only a few of the NCAR COMMON blocks have been included in NCAR.pm, although it would be possible to include them all ( there are about 280 of them in the NCAR library, so I will take a bit of time to consider which of them might be useful ). =head2 User defined routines. Some NCAR Fortran routines called from within the library may be re-defined by the user ( actually the whole library may be redefined by the user in Fortran :-); the following routines may ( according to their embedded documentation ) be overriden by the user : =over 4 =item * agchax =item * agchnl =item * agchcu =item * agchil =item * agutol =item * cpchhl =item * cpchll =item * cpmpxy =item * mapeod =item * mapusr =item * mpchln =item * slubkg =item * vvumxy =back In Perl, to override one of those routines, one would write : sub NCAR::mpchln { ( ... ) } for a permanent redefinition of mpchln, or : { local *NCAR::mpchln = sub { ( ... ) }; ( ... ) } for a local redefinition of mpchln. Note that redefining a routine which is not part of the above mentioned set would not allow access to it from within the Fortran library. =head1 BUILD You need the full PDL package in order to build an use NCAR. Currently, the NCAR XS interface has only been tested on linux-i686 using the g77 compiler. =head1 EXAMPLES There's now quite a few examples ( converted by hand ) from the NCAR distribution. `make test' will execute them, and dump ncgm in the ncgm/ directory. ncgm files are viewable with the ctrans NCAR utility : ctrans -d X11 myplot.ncgm ctrans -d ps.color myplot.ncgm > myplot.ps =head1 BUGS Maybe plenty of them !! Note that the XS glue includes the interfaces for more than 500 Fortran subroutines, and I haven't tested them all, though I have about 160 of the NCAR packages which seems to work fine. =head1 SEE ALSO =over 4 =item * NCAR graphics documentation ( http://ngwww.ucar.edu/ng4.3/ ) =item * PDL documentation ( http://pdl.perl.org/ ) =back =head1 COPYRIGHT Copyright (c) 2003 Philippe Marguinaud. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as the NCAR graphics library. =head1 AUTHOR Philippe Marguinaud, pmarguinaud@hotmail.com =cut