[Spice_discussion] Porting SPICE Fortran program from Mac PowerPC to Mac Intel

Boris Semenov Boris.Semenov at jpl.nasa.gov
Tue Nov 25 10:22:13 PST 2008


Hi Bill --

It's possible that the cause of the problem is in the incorrect 
declaration of CMAT. In your program it is declared as

    DOUBLE PRECISION    CMAT(4)

while it should be

    DOUBLE PRECISION    CMAT(3,3)

Also, it would be cleaner is you changed "... , 1, ..." in CKW03 call to 
"..., .TRUE., ...".

Please, let me know if your program with these changes works on Intel Mac.

Regards,
Boris.

William Thompson wrote:
> Folks:
> 
> I've been running the attached SPICE Fortran program for some years now 
> without problem on a Mac OSX PowerPC platform.  I recently tried to port 
> it to the Mac Intel platform.  It seemed to compile and run okay, but 
> when I examined the values, I found that it gave a completely different 
> answer from that on older PowerPC platform.  Can anybody suggest why 
> that should be?
> 
> The program was compiled with
> 
> ifort -C -o cksmooth -assume byterecl cksmooth.f \
>     /service/stereo3/stereo/software/spice_fortran/i386/lib/support.a \
>     /service/stereo3/stereo/software/spice_fortran/i386/lib/spicelib.a
> 
> The "-assume byterecl" was based on an examination of the compilation 
> program for the source library.  However, I also tried it with this 
> keyword off, and it didn't seem to make a difference.
> 
> I also tried "-real-size 32 -double-size 64", but that didn't seem to 
> help either.
> 
> Thanks for any help you can give me,
> 
> Bill Thompson
> 
> 
> 
> ------------------------------------------------------------------------
> 
> C  This program applies a smoothing algorithm to a STEREO Type III
> C  Attitude History (CK) file.  It is used in conjunction with the
> C  CKSMRG utility to produce a reduced-resolution attitude history file
> C  representative of the average pointing.
> C
> C  This routine is called with 1-3 parameters:
> C
> C	INFILE	= The name of the CK file to process.
> C
> C	OUTFILE = The name of the output file.  If not passed, then
> C		  defaults to "cksmooth_out.bc".
> C
> C	NSMOOTH = A parameter related to the size of the boxcar average
> C		  smoothing function.  The box will run between
> C		  I-NSMOOTH to I+NSMOOTH, so that the total size of the
> C		  box is 2*NSMOOTH+1.  The default is NSMOOTH=150,
> C		  which for STEREO is equivalent to a box 5 minutes
> C		  wide.
> C
> C  Example:
> C
> C	rm -f ahead_2006_303_01_temp.ah.bc
> C	cksmooth ahead_2006_303_01.ah.bc ahead_2006_303_01_temp.ah.bc
> C
> C  Note that the output file must not exist when calling this program.
> C
> 
>       PROGRAM CKSMOOTH
> 
>       IMPLICIT DOUBLE PRECISION (A-H, O-Z)
>       IMPLICIT INTEGER (I-N)
> 
>       PARAMETER (ND=2, NI=6)
> 
>       CHARACTER*(128) INFILE, OUTFILE
>       CHARACTER*(80) ARCH, TYPE, REF, SSMOOTH
>       CHARACTER*(40) NAME
>       INTEGER INHANDLE, OUTHANDLE, IC(NI)
>       LOGICAL FOUND
>       DOUBLE PRECISION DC(ND), SUM(125), QUAT0(4), CMAT(4)
> 
>       PARAMETER (MAXREC=1000000)
>       DOUBLE PRECISION RECORD(8),INARRAY(8,MAXREC)
>       DOUBLE PRECISION SCLKDP(MAXREC), QUATS(4,MAXREC), AVVS(3,MAXREC)
>       DOUBLE PRECISION ANGLE0(3), ANGLES(3,MAXREC)
> 
> C  Get the number of arguments.  The first argument should be the name
> C  of the input file.  If supplied, the second argument will be the
> C  name of the output file, and the third argument will be the window
> C  size (+/-).
> 
>       NARGS = IARGC()
>       CALL GETARG (1, INFILE )
>       OUTFILE = 'cksmooth_out.bc'
>       IF (NARGS .GE. 2) CALL GETARG (2, OUTFILE)
>       NSMOOTH = 150
>       IF (NARGS .GE. 3) THEN
>          CALL GETARG (3, SSMOOTH)
>          READ (SSMOOTH,'(I5)') NSMOOTH
>       ENDIF
> 
> C  Open the input file.
> 
>       CALL DAFOPR (INFILE, INHANDLE)
> 
> C  Open the new file to initialize it.
> 
>       NAME = 'STEREO Ahead spacecraft bus (smoothed)'
>       IF (IC(1) .EQ. -235000) NAME =
>      $     'STEREO Behind spacecraft bus (smoothed)'
>       CALL CKOPN(OUTFILE, NAME, 0, OUTHANDLE)
> 
> C  Begin forward search, and find the first array.
> 
>       CALL DAFBFS (INHANDLE)
>       CALL DAFFNA (FOUND)
> 
> C  Step through the arrays.  Get the summary and unpack it.
> 
>       DO WHILE (FOUND)
>          CALL DAFGS (SUM)
>          CALL DAFUS (SUM, ND, NI, DC, IC)
> 
> C  Get the number of pointing instances.  Step through the pointing
> C  instances, and collect the array.
> 
>          CALL CKNR03(INHANDLE, SUM, NREC)
>          DO J=1,NREC
>             CALL CKGR03(INHANDLE, SUM, J, RECORD)
>             DO I=1,8
>                INARRAY(I,J) = RECORD(I)
>             ENDDO
>          ENDDO
> 
> C  Convert the quaternion first to a C-matrix, and then to Euler
> C  angles.
> 
>          DO J=1,NREC
>             DO I=1,4
>                QUAT0(I) = INARRAY(I+1,J)
>             ENDDO
>             CALL Q2M(QUAT0, CMAT)
>             CALL M2EUL(CMAT, 1, 2, 3, ROLL0, PITCH0, YAW0)
>             ANGLES(1,J) = ROLL0
>             ANGLES(2,J) = PITCH0
>             ANGLES(3,J) = YAW0
>          ENDDO
> 
> C  Extract out the spacecraft clock values, smoothed quaternions,
> C  and smoothed angular velocities.
> 
>          DO J=1,NREC
>             SCLKDP(J) = INARRAY(1,J)
> 
>             J1 = J-NSMOOTH
>             IF (J1 .LT. 1) J1 = 1
>             J2 = J+NSMOOTH
>             IF (J2 .GT. NREC) J2 = NREC
>             NAVG = J2-J1+1
> 
> C  Average together the Euler angles.
> 
>             DO I=1,3
>                C1 = 0.D0
>                S1 = 0.D0
>                X1 = 0.D0
>                X2 = 0.D0
>                XC = 0.D0
>                XS = 0.D0
>                DO K=J1,J2
>                   COS_ANGLE = DCOS(ANGLES(I,K))
>                   SIN_ANGLE = DSIN(ANGLES(I,K))
>                   C1 = C1 + COS_ANGLE
>                   S1 = S1 + SIN_ANGLE
>                   DX = K - J
>                   X1 = X1 + DX
>                   X2 = X2 + DX**2
>                   XC = XC + DX * COS_ANGLE
>                   XS = XS + DX * SIN_ANGLE
>                ENDDO
>                C1 = C1 / NAVG
>                S1 = S1 / NAVG
>                X1 = X1 / NAVG
>                X2 = X2 / NAVG
>                XC = XC / NAVG
>                XS = XS / NAVG               
>                SLOPE = (XC - X1*C1) / (X2 - X1**2)
>                COS_ANGLE = C1 - SLOPE*X1
>                SLOPE = (XS - X1*S1) / (X2 - X1**2)
>                SIN_ANGLE = S1 - SLOPE*X1
>                ANGLE0(I) = DATAN2(SIN_ANGLE, COS_ANGLE)
>             ENDDO
> 
> C  Convert the Euler angles back into a C-matrix, and then back into a
> C  quaternion.
> 
>             CALL EUL2M(ANGLE0(1), ANGLE0(2), ANGLE0(3), 1, 2, 3, CMAT)
>             CALL M2Q(CMAT, QUAT0)
>             DO I=1,4
>                QUATS(I,J) = QUAT0(I)
>             ENDDO
> 
> C  Average together the angular velocities.
> 
>             DO I=1,3
>                AVVS(I,J) = 0
>                DO K=J1,J2
>                   AVVS(I,J) = AVVS(I,J) + INARRAY(I+5,K)
>                ENDDO
>                AVVS(I,J) = AVVS(I,J) / NAVG
>             ENDDO
>          ENDDO
> 
> C  Write out the smoothed pointing segment.
> 
>          CALL CKW03(OUTHANDLE, DC(1), DC(2), IC(1), 'J2000', 1,
>      $        'Smoothed CK', NREC, SCLKDP, QUATS, AVVS, 1, SCLKDP(1))
> 
> C  Step to the next array
> 
>          CALL DAFGH(INHANDLE)
>          CALL DAFFNA (FOUND)
>       END DO
> 
> C  Close the input and output files.
> 
>       CALL DAFCLS(INHANDLE)
>       CALL DAFCLS(OUTHANDLE)
> 
>       END
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Spice_discussion mailing list
> Spice_discussion at naif.jpl.nasa.gov
> http://naif.jpl.nasa.gov/mailman/listinfo/spice_discussion




More information about the Spice_discussion mailing list