geomag/magdec.c
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 29 Jun 2021 09:14:43 -0400
changeset 23 e83393696a24
parent 5 033a169071de
permissions -rw-r--r--
IX_14 Release Version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#include "geomag.h"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#include <time.h>
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#include <math.h>
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
static char usage[] = " Usage:\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
                      "   magdec lon lat [year [month [day]]]\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
                      "     lon, lat: in decimal degrees\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
                      "     year, month, day: integer date\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
                      "          or just decimal year\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
                      "   If no date is given, the present date is used\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
                      "   1 is substituted for missing month and/or day\n\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
                      "   Prints to stdout: 4 floating point"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
                      "  numbers separated by spaces:\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
                      "     declination, inclination in degrees\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
                      "     horizontal field, total field in nanoTeslas\n\n"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
                      " "
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
                      " Note: this version uses IGRF11, released in Dec. 2009."
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
                      "       Model parameters are hard-coded; no external"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
                      "       file is needed."
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
                      "";
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
int main(int argc, char **argv)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
    struct model_t **model_array;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
    int nmodels;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
    double dtest, itest, htest, ftest;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
    int year, month, day;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
    double dyear;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
    double lon, lat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
    struct tm *now;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
    time_t now_seconds;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
    int nscan;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
    if (argc < 3 || argc > 6)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
        puts(usage);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
        return 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
    nscan = sscanf(argv[1], "%lf", &lon);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
    nscan += sscanf(argv[2], "%lf", &lat);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
    if (nscan != 2)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
        puts(usage);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
        return 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
    if (argc == 3)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
        now_seconds = time(NULL);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
        now = gmtime(&now_seconds);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
        year = now->tm_year + 1900;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
        month = now->tm_mon + 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
        day = now->tm_mday;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
    else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
        if (argc == 4)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
            dyear = atof(argv[3]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
            /* the rest won't actually be used in this case */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
            year = (int)dyear;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
            month = 1 + (int)((dyear - year) * 12);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
            day = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
        if (argc > 4)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
            year = atoi(argv[3]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
            month = atoi(argv[4]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
            day = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
        if (argc == 6)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
            day = atoi(argv[5]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
    if (argc != 4)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
        dyear = julday(month, day, year);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
        /* julday function is mis-named--it simply returns decimal year */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
    while (lon > 180.0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
        lon -= 360.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
    while (lon < -180.0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
        lon += 360.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
    /* printf("lon %lf lat %lf dyear %lf year %d month %d day %d\n",
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
     *       lon, lat, dyear, year, month, day);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
    nmodels = models_from_lines(&model_array);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
    dihf_from_models(model_array, nmodels,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
                        dyear, lon, lat,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
                        &dtest, &itest, &htest, &ftest);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
    printf("%lf %lf %lf %lf\n",
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
              dtest, itest, htest, ftest);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
    free_models(model_array, nmodels);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
    return 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112