/****************************************************************************/ /* */ /* IAGA_HDZ_to_XYZ.c */ /* */ /****************************************************************************/ /****************************************************************************/ /* This program converts an IAGA format data file in HDZ representation */ /* into XYZ representation. All data in the file will be converted. */ /* The data may may be read either from a file or from stdin. Results are */ /* written to standard output. */ /* */ /* Usage: */ /* IAGA_HDZ_to_XYZ [-p] [<] IAGAFileHDZ > IAGAFileXYZ */ /* -p This flag prevents the display of program */ /* info. It is usually used when reading data */ /* from unix pipe. */ /* IAGAFile Name of IAGA-format file. */ /* NewIAGAFile Name of generated IAGA-format file. */ /* */ /****************************************************************************/ /****************************************************************************/ /* Lasse Hakkinen */ /* Finnish Meteorological Institute */ /* Department of Geophysics */ /* P.O.Box 503 */ /* FIN-00101, Helsinki, Finland */ /* e-mail: Lasse.Hakkinen@fmi.fi */ /* phone : (+358)-9-19294634 */ /* fax : (+358)-9-19294603 */ /* */ /* version 1.02 04.04.2011 */ /****************************************************************************/ /****************************************************************************/ /* Version history: */ /* */ /* 1.02 04.04.2011 Changed name from HDZ_to_XYZ to IAGA_HDZ_to_XYZ */ /* 1.01 02.07.1999 Fixed a Y2K bug in NewTime.h file which resulted in */ /* incorrect year in date strings if year >= 2000. */ /* 1.0 30.7.1996 First official release */ /****************************************************************************/ #include #include #include #include #include "Usage.h" #include "MagnData.h" #include "IAGA.h" #define BuffSize 1440 /* Size of one block in an IAGA file */ char *version = "1.02"; char *date = "04.04.2011"; #define HeaderLineCount 4 #define UsageLineCount 6 char *HeaderText[HeaderLineCount] = { "**************************************************************************", "This program converts an IAGA format data file in HDZ representation into ", "XYZ representation. All data in the file will be converted. ", "**************************************************************************", }; char *UsageText[UsageLineCount] = { " [-p] [<] IAGAFileHDZ > IAGAFileXYZ", " [-p ] This flag prevents the display of program info.", " It is usually used when reading data from pipe", " line.", " IAGAFileHDZ Name of IAGA-format file in HDZ representation.", " IAGAFileXYZ Name of new IAGA-format file (XYZ).", }; /*--------------------------------------------------------------------------*/ /* Convert data from HDZ representation into XYZ representation. */ /* H is in units 0.1 nT and D in 0.1 arcminutes. */ /*--------------------------------------------------------------------------*/ void Convert_HDZ_to_XYZ(char *Buffer) { char *Xptr = Buffer+IAGA_Data; char *Yptr = Buffer+IAGA_Data+7; long i; long X,Y,H,D; double coeff = 2.90888e-5; /* = Pi/(180*60*10) */ char XYstr[30]; /*** 60 data points ***/ for (i=0;i<60;i++) { H = GetIAGAFieldValue(Xptr); D = GetIAGAFieldValue(Yptr); if ((H == MissingValue) || (D == MissingValue)) { memcpy(Xptr," 999999 999999",14); } else { X = RoundFloat(H*cos(coeff*D)); Y = RoundFloat(H*sin(coeff*D)); sprintf(XYstr,"% 07d% 07d",X,Y); memcpy(Xptr,XYstr,14); } Xptr += 21; Yptr += 21; } /*** Hour average ***/ H = GetIAGAFieldValue(Xptr); D = GetIAGAFieldValue(Yptr); if ((H == MissingValue) || (D == MissingValue)) { memcpy(Xptr," 999999 999999",14); } else if ((H == 0) && (D == 0)) { memcpy(Xptr," 000000 000000",14); } else { X = RoundFloat(H*cos(coeff*D)); Y = RoundFloat(H*sin(coeff*D)); sprintf(XYstr,"% 07d% 07d",X,Y); memcpy(Xptr,XYstr,14); } /*** Update the component marker ***/ Buffer[IAGA_Components] = '1'; } /*--------------------------------------------------------------------------*/ /* The main procedure */ /*--------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { long params; long status = 0; long FileCount = 0; char FileName[100] = ""; /* Name of the original data file */ char Buffer[BuffSize]; /* Buffer for one data block */ FILE *IAGAFile; /* IAGA format data file to be processed */ /*==========================*/ /* Analyse the command line */ /*==========================*/ if (argc == 1) { /* No arguments, show the usage text */ PrintUsage(argv[0],0,HeaderLineCount,UsageLineCount); return OK; } for (params = 1; params < argc; params++) { if (*argv[params] != '-') { strcpy(FileName,argv[params]); FileCount++; } else { switch (*(argv[params]+1)) { case 'p' : break; default : fprintf(stderr,"\n### %s: \"%s\" is not an option.\n\n", argv[0], argv[params]); PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount); return FAIL; break; } } } /*====================================*/ /* Check the values of the parameters */ /*====================================*/ if (FileCount > 1) { PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount); return FAIL; } /*===========================*/ /* Try to open the IAGA file */ /*===========================*/ if (FileCount == 0) IAGAFile = stdin; else { if ((IAGAFile = fopen(FileName, "r")) == NULL) { fprintf(stderr,"\n### %s - Unable to open file: %s\n",argv[0],FileName); return FAIL; } } /*===================================*/ /* Extract proper data from the file */ /*===================================*/ while (ReadIAGABlock(IAGAFile,Buffer)) { if (Buffer[IAGA_Components] == '2') { Convert_HDZ_to_XYZ(Buffer); } WriteIAGABlock(stdout,Buffer); } if (FileCount == 1) fclose(IAGAFile); return OK; }