/*
******************************************************************************** * triangle.c -- Routines for triangle function objects * * User routines: * Pro_TriangleFunc() creates a triangle function object. * Pro_TriangleInfo() returns information about a triangle function. * * Mark Showalter, PDS Ring-Moon Systems Node, March 1998 *******************************************************************************/ #include <stdio.h> #include "profile.h" #include "fortran.h" /******************** * Type definitions * ********************/ typedef struct ZPRO_TRIANGLE_STRUCT { RL_INT4 flag; RL_FLT8 height, halfwidth, norm; } ZPRO_TRIANGLE; /********************** * Symbol definitions * **********************/ #define ZPRO_TRIANGLE_FLAG 'tria' /************************************ * Prototypes of internal functions * ************************************/ static RL_FLT8 ZPro_TriangleCalc RL_PROTO((RL_FLT8 x, RL_VOID *params)); static void ZPro_PrintTriangle RL_PROTO((RL_VOID *params)); /* ******************************************************************************** * EXPORTED USER ROUTINES ******************************************************************************** *$ Component_name: * Pro_TriangleFunc (triangle.c) *$ Abstract: * This routine creates and returns a triangle function object. A triangle * function returns a value that decreases linearly from the origin, * reaching zero at its endpoints. *$ Keywords: * PROFILE, FUNCTION, PSF * C, PUBLIC, SUBROUTINE *$ Declarations: * PRO_OBJECT *Pro_TriangleFunc(height, halfwidth) * RL_FLT8 height, halfwidth; *$ Inputs: * height y-value of function at origin. * halfwidth x-value at which y-value first reaches zero. *$ Outputs: * none *$ Returns: * pointer to a new triangle function object, or NULL on non-fatal error. *$ Detailed_description: * This routine creates and returns a triangle function object. A triangle * function returns a value that decreases linearly from the origin, * reaching zero at its endpoints. The x and y coordinates are initially * unnamed. *$ External_references: * Profile toolkit *$ Side_effects: * Memory is allocated. *$ Examples: * This line of code creates a triangle function of full width 2 and height * 0.5. * * triangle = Pro_TriangleFunc(0.5, 1.); *$ Error_handling: * Profile toolkit error handling is in effect. * * Conditions raised: * RL_MEMORY_ERROR on memory allocation error. *$ Limitations: * none *$ Author_and_institution: * Mark R. Showalter * NASA/Ames Research Center *$ Version_and_date: * 1.0: March 1998 *$ Change_history: * none *******************************************************************************/ PRO_OBJECT *Pro_TriangleFunc(height, halfwidth) RL_FLT8 height, halfwidth; { ZPRO_TRIANGLE *params; PRO_OBJECT *func; RL_INT4 paramsize; paramsize = sizeof(ZPRO_TRIANGLE); params = (ZPRO_TRIANGLE *) XRL_Malloc(paramsize); if (params == NULL) return NULL; params->flag = ZPRO_TRIANGLE_FLAG; params->height = height; params->halfwidth = halfwidth; params->norm = height / halfwidth; func = Pro_SoftFunc(ZPro_TriangleCalc, -halfwidth, halfwidth, (RL_VOID *) params, paramsize, TRUE, ZPro_PrintTriangle); XRL_Free((RL_VOID *) params); return func; } /* ******************************************************************************** *$ Component_name: * Pro_TriangleInfo (triangle.c) *$ Abstract: * This routine returns information about a triangle function object. *$ Keywords: * PROFILE, FUNCTION, PSF * C, PUBLIC, SUBROUTINE *$ Declarations: * RL_BOOL Pro_TriangleInfo(triangle, height, halfwidth) * PRO_OBJECT *triangle; * RL_FLT8 *height, *halfwidth; *$ Inputs: * triangle pointer to a triangle function object. *$ Outputs: * *height height of triangle function at origin. * *halfwidth x-value above which y-value is zero. *$ Returns: * TRUE if this is a triangle function; FALSE otherwise. *$ Detailed_description: * This routine returns information about a triangle function object. *$ External_references: * Profile toolkit *$ Side_effects: * none *$ Examples: * This snippet of code of code prints the full width of a triangle * function. * * PRO_OBJECT *triangle; * RL_FLT8 halfwidth; * * Pro_TriangleInfo(boxcar, NULL, &halfwidth); * printf("Full width = %g\n", 2.*halfwidth); *$ Error_handling: * Profile toolkit error handling is in effect. * * Conditions raised: * PRO_CLASS_ERROR if this is not a software function object. *$ Limitations: * none *$ Author_and_institution: * Mark R. Showalter * NASA/Ames Research Center *$ Version_and_date: * 1.0: March 1998 *$ Change_history: * none *******************************************************************************/ RL_BOOL Pro_TriangleInfo(triangle, height, halfwidth) PRO_OBJECT *triangle; RL_FLT8 *height, *halfwidth; { ZPRO_TRIANGLE *params; params = (ZPRO_TRIANGLE *) XPro_SoftParams(triangle); if (params == NULL) return FALSE; if (params->flag != ZPRO_TRIANGLE_FLAG) return FALSE; if (height != NULL) *height = params->height; if (halfwidth != NULL) *halfwidth = params->halfwidth; return TRUE; } /* ******************************************************************************* * ZPro_PrintTriangle(params) * * This internal routine prints information about a triangle function. * * Inputs: * params pointer to the ZPRO_TRIANGLE data structure. *******************************************************************************/ static void ZPro_PrintTriangle(params) RL_VOID *params; { ZPRO_TRIANGLE *tripar; tripar = (ZPRO_TRIANGLE *) params; /* Print triangle object info... */ printf("\nTriangle software function parameters...\n"); printf(" height = %#g\n", tripar->height); printf("halfwidth = %#g\n", tripar->halfwidth); } /* ******************************************************************************* * INTERNAL ROUTINES ******************************************************************************** * ZPro_TriangleCalc(x, params) * * This internal routine calculates the value of a triangle function. * * Inputs: * x location at which to evaluate function. * params pointer to the ZPRO_TRIANGLE data structure. * * Return: value of function at x. *******************************************************************************/ static RL_FLT8 ZPro_TriangleCalc(x, params) RL_FLT8 x; RL_VOID *params; { ZPRO_TRIANGLE *tripar; tripar = (ZPRO_TRIANGLE *) params; if (x < 0.) x = -x; return tripar->norm * (tripar->halfwidth - x); } /* ******************************************************************************** * FORTRAN INTERFACE ROUTINES ******************************************************************************** *$ Component_name: * FPro_TriangleFunc (triangle.c) *$ Abstract: * This routine creates and returns a triangle function object. A triangle * function returns a value that decreases linearly from the origin, * reaching zero at its endpoints. *$ Keywords: * PROFILE, FUNCTION, PSF * FORTRAN, PUBLIC, SUBROUTINE *$ Declarations: * integer*4 function FPro_TriangleFunc(height, halfwidth) * real*8 height, domain *$ Inputs: * height y-value of function at origin. * halfwidth x-value at which y-value first reaches zero. *$ Outputs: * none *$ Returns: * FORTRAN pointer to a new triangle function object, or 0 on non-fatal * error. *$ Detailed_description: * This routine creates and returns a triangle function object. A triangle * function returns a value that decreases linearly from the origin, * reaching zero at its endpoints. The x and y coordinates are initially * unnamed. *$ External_references: * Profile toolkit *$ Side_effects: * Memory is allocated. *$ Examples: * This line of code creates a triangle function of full width 2 and height * 0.5. * * triangle = FPro_TriangleFunc(0.5d0, 1.d0) *$ Error_handling: * Profile toolkit error handling is in effect. * * Conditions raised: * RL_MEMORY_ERROR on memory allocation error. *$ Limitations: * none *$ Author_and_institution: * Mark R. Showalter * NASA/Ames Research Center *$ Version_and_date: * 1.0: March 1998 *$ Change_history: * none *******************************************************************************/ RL_INT4 FORTRAN_NAME(fpro_trianglefunc) (height, halfwidth) RL_FLT8 *height, *halfwidth; { RL_VOID *ptr; RL_INT4 index; ptr = (RL_VOID *) Pro_TriangleFunc(*height, *halfwidth); if (ptr == NULL) return 0; index = FORT_AddPointer(ptr); if (index == 0) Pro_FreeObject((PRO_OBJECT *) ptr); return index; } /* ******************************************************************************** *$ Component_name: * FPro_TriangleInfo (triangle.c) *$ Abstract: * This routine returns information about a triangle function object. *$ Keywords: * PROFILE, FUNCTION, PSF * FORTRAN, PUBLIC, SUBROUTINE *$ Declarations: * logical*4 function FPro_TriangleInfo(triangle, height, halfwidth) * integer*4 triangle * real*8 height, halfwidth *$ Inputs: * triangle FORTRAN pointer to a triangle function object. *$ Outputs: * height height of triangle function at origin. * halfwidth x-value above which y-value is zero. *$ Returns: * .TRUE. if this is a triangle function; .FALSE. otherwise. *$ Detailed_description: * This routine returns information about a triangle function object. *$ External_references: * Profile toolkit *$ Side_effects: * none *$ Examples: * This snippet of code of code prints the full width of a triangle * function. * * integer*4 triangle * real*8 dummy, halfwidth * * call FPro_TriangleInfo(triangle, dummy, halfwidth) * write(*,*) "Full width = ", 2.d0*halfwidth *$ Error_handling: * Profile toolkit error handling is in effect. * * Conditions raised: * PRO_CLASS_ERROR if this is not a software function object. * FORTRAN_POINTER_ERROR if triangle is not a FORTRAN object pointer. *$ Limitations: * none *$ Author_and_institution: * Mark R. Showalter * NASA/Ames Research Center *$ Version_and_date: * 1.0: March 1998 *$ Change_history: * none *******************************************************************************/ RL_INT4 FORTRAN_NAME(fpro_triangleinfo) (triangle, height, halfwidth) RL_INT4 *triangle; RL_FLT8 *height, *halfwidth; { RL_VOID *ptr; RL_BOOL status; /* Look up triangle function pointer */ ptr = FORT_GetPointer(*triangle); if (ptr == NULL) return 0; /* Return info */ status = Pro_TriangleInfo(ptr, height, halfwidth); return status ? FTRUE:FFALSE; } /********************************************************************************/