geomag/geomag_calc.c
author A.M. Thurnherr <athurnherr@yahoo.com>
Mon, 23 Feb 2015 09:19:46 +0000
changeset 15 3746197831db
parent 5 033a169071de
permissions -rw-r--r--
IX11beta for CLIVAR P16
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
    The core calculation subroutines are here.
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
    The first set were added be Eric Firing to modernize
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
    the reading and handling of the model data, but are
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
    otherwise based on code from the original geomag61.c.
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
    The second set of subroutines are identical to the originals,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
    or are lightly modified to use the new model data structure
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
    and to avoid the use of global variables.
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
*/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#include "geomag.h"
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#include "igrf11.h"  /* initializes model_lines */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#define LINEBUFSIZE 90 /* leave some slop */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
int models_from_lines(struct model_t ***model_array)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
/* May want to change this to return the array of pointers and use
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
   a pointer to an int to return the length or error code; as it
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
   is, triple dereferencing is getting confusing.
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
*/
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
    struct model_t model;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
    struct model_t *mod_ptr, *prev_mod_ptr, *first_mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
    struct model_t **models;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
    char buf[LINEBUFSIZE];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
    char *c;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
    int nmodels = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
    int ret; /* used for error return cases of "goto error;" */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
    int nscan;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
    int ii;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
    int iline=0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
    while (1)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
        strcpy(buf, model_lines[iline]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
        iline++;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
        if (strlen(buf) != RECLEN) break;
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
        if (!strncmp(buf,"   ", 3))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
            if (nmodels)
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
                prev_mod_ptr = mod_ptr;
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
            mod_ptr = malloc(sizeof(struct model_t));
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
            if (mod_ptr == NULL)
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
                ret = -2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
            mod_ptr->next = NULL;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
            if (nmodels)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
                prev_mod_ptr->next = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
            else
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
                first_mod_ptr = mod_ptr;
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
            nmodels++;  /* Now it can be used for deallocation on error */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
            nscan = sscanf(buf, "%s%lf%d%d%d%lf%lf%lf%lf",
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
                                  mod_ptr->name, &mod_ptr->epoch,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
                                  &mod_ptr->max1, &mod_ptr->max2,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
                                  &mod_ptr->max3, &mod_ptr->yrmin,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
                                  &mod_ptr->yrmax, &mod_ptr->altmin,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
                                  &mod_ptr->altmax);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
            if (nscan != 9)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
                ret = -3;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
            ii = 0;  /* initialized for reading coefficients */
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
        else
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
            int mm, nn;
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
            if (nmodels < 1)
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
                ret = -4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
           for ( nn = 1; nn <= mod_ptr->max1; ++nn)
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
              for (mm = 0; mm <= nn; ++mm)
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
                 int m, n;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
                 double f1, f2, f3, f4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
                 int nscan2, nscan3;
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
                 /* Read a new line only if we have already used the line. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
                 if (buf[0] == '\0')
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
                    strcpy(buf, model_lines[iline]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
                    iline++;
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
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
                 nscan = sscanf(buf, "%d %d %lf %lf %lf %lf", /*  %8s%d", */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
                                  &n, &m, &f1, &f2, &f3, &f4);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
                                                    /*, irat, &line_num); */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
                 if (nscan != 6)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
                    ret = -5;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
                    // printf("nscan=%d\n", nscan);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
                    // printf("%s\n", buf);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
                    goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
                 if ((nn != n) || (mm != m))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
                    ret = -6;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
                    // printf("nn, n, mm, m: %d %d  %d %d\n", nn, n, mm, m);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
                    // printf("%s\n", buf);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
                    goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
                 ii++; /* 1-based arrays */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
                 mod_ptr->gh[ii] = f1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
                 mod_ptr->ghr[ii] = f3;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
                 if (m != 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
                    ii++;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
                    mod_ptr->gh[ii] = f2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
                    mod_ptr->ghr[ii] = f4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
                 buf[0] = '\0';  /* flag: read a new line */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
              }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
           }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
    models = (struct model_t **)malloc(nmodels * sizeof(void *));
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
    if (models == NULL)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
        return(-6);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
    mod_ptr = first_mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
    for (ii=0; ii<nmodels; ii++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
        models[ii] = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
        mod_ptr = mod_ptr->next;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
    *model_array = models;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
    return nmodels;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
    error:
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
    /* Clean up by working forward through the linked list. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
    for (ii=0; ii<nmodels; ii++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
        mod_ptr = first_mod_ptr->next;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
        if (first_mod_ptr) free(first_mod_ptr);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
        first_mod_ptr = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
    return ret;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
int models_from_file(char *filename, struct model_t ***model_array)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
/* May want to change this to return the array of pointers and use
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
   a pointer to an int to return the length or error code; as it
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
   is, triple dereferencing is getting confusing.
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
*/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
    struct model_t model;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
    struct model_t *mod_ptr, *prev_mod_ptr, *first_mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
    struct model_t **models;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
    FILE *modfile;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
    char buf[LINEBUFSIZE];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
    char *c;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
    int nmodels = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
    int ret; /* used for error return cases of "goto error;" */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
    int nscan;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
    int ii;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
    modfile = fopen(filename, "rb"); /* handle line endings ourselves */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
    if (modfile == NULL) return(-1);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
    while (!feof(modfile))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
        fgets(buf, LINEBUFSIZE, modfile);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
        for (c = buf; *c; c++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
            if (*c == '\n' || *c == '\r')
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
                *c = '\0';
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
                break;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
        if (strlen(buf) != RECLEN) continue;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
        if (!strncmp(buf,"   ", 3))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
            if (nmodels)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
                prev_mod_ptr = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
            mod_ptr = malloc(sizeof(struct model_t));
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
            if (mod_ptr == NULL)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
                ret = -2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
            mod_ptr->next = NULL;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
            if (nmodels)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
                prev_mod_ptr->next = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
            else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
                first_mod_ptr = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
            nmodels++;  /* Now it can be used for deallocation on error */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
            nscan = sscanf(buf, "%s%lf%d%d%d%lf%lf%lf%lf",
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
                                  mod_ptr->name, &mod_ptr->epoch,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
                                  &mod_ptr->max1, &mod_ptr->max2,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
                                  &mod_ptr->max3, &mod_ptr->yrmin,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
                                  &mod_ptr->yrmax, &mod_ptr->altmin,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
                                  &mod_ptr->altmax);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
            if (nscan != 9)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
                ret = -3;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
            ii = 0;  /* initialized for reading coefficients */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
        else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
        {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
            int mm, nn;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
            if (nmodels < 1)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
            {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
                ret = -4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
                goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
            }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
           for ( nn = 1; nn <= mod_ptr->max1; ++nn)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
           {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
              for (mm = 0; mm <= nn; ++mm)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
              {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
                 int m, n;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
                 double f1, f2, f3, f4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
                 int nscan2, nscan3;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
                 /* Read a new line only if we have already used the line. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
                 if (buf[0] == '\0')
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
                     /* Read a line and chop off the line ending. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
                     fgets(buf, LINEBUFSIZE, modfile);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
                     for (c = buf; *c; c++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
                     {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
                         if (*c == '\n' || *c == '\r')
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
                         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
                             *c = '\0';
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
                             break;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
                         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
                     }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
                 nscan = sscanf(buf, "%d %d %lf %lf %lf %lf", /*  %8s%d", */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
                                  &n, &m, &f1, &f2, &f3, &f4);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
                                                    /*, irat, &line_num); */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
                 if (nscan != 6)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
                    ret = -5;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
                    // printf("nscan=%d\n", nscan);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
                    // printf("%s\n", buf);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
                    goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
                 if ((nn != n) || (mm != m))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
                    ret = -6;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
                    // printf("nn, n, mm, m: %d %d  %d %d\n", nn, n, mm, m);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
                    // printf("%s\n", buf);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
                    goto error;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
                 ii++; /* 1-based arrays */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
                 mod_ptr->gh[ii] = f1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
                 mod_ptr->ghr[ii] = f3;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
                 if (m != 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
                 {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
                    ii++;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
                    mod_ptr->gh[ii] = f2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
                    mod_ptr->ghr[ii] = f4;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
                 }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
                 buf[0] = '\0';  /* flag: read a new line */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
              }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
           }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
        }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
    fclose(modfile);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
    models = (struct model_t **)malloc(nmodels * sizeof(void *));
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
    if (models == NULL)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
        return(-6);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
    mod_ptr = first_mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
    for (ii=0; ii<nmodels; ii++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
        models[ii] = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
        mod_ptr = mod_ptr->next;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
    *model_array = models;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
    return nmodels;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
    error:
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
    fclose(modfile);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
    /* Clean up by working forward through the linked list. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
    for (ii=0; ii<nmodels; ii++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
        mod_ptr = first_mod_ptr->next;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
        if (first_mod_ptr) free(first_mod_ptr);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
        first_mod_ptr = mod_ptr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
    return ret;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
void free_models(struct model_t **model_array, int nmodels)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
    int i;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
    for (i=0; i<nmodels; i++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
        if (model_array[i]) free(model_array[i]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
    if (model_array) free(model_array);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
int dihf_from_models(struct model_t **model_array, int nmodels,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
                        double yr, double lon, double lat,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
                        double *d_ptr, double *i_ptr, double *h_ptr,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
                        double *f_ptr)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
    int ret = 0;  /* return code */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
    int modelI;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
    int nmax;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
    double gha[MAXCOEFF];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
    double x, y, z;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
    double d, i, h, f;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
    struct model_t *modI, *modIp;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
    /* might not want to keep these */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
    int warn_H = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
    int warn_H_strong = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
    double warn_H_strong_val;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
    for (modelI=0; modelI<nmodels; modelI++)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
        if (yr < model_array[modelI]->yrmax)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
            break;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
    if (modelI == nmodels) modelI--;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
    modI = model_array[modelI];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
    if (modI->max2 == 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
        modIp = model_array[modelI+1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
        nmax = interpsh(yr, modI->yrmin, modI->max1,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
                            modIp->yrmin, modIp->max1,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
                            modI->gh, modIp->gh, gha);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
    else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
        nmax = extrapsh(yr, modI->epoch, modI->max1, modI->max2,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
                            modI->gh, modI->ghr, gha);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
    shval3(1, lat, lon, 0.0, nmax, gha,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
           IEXT, EXT_COEFF1, EXT_COEFF2, EXT_COEFF3,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
           &x, &y, &z);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
    dihf(x, y, z, &d, &i, &h, &f);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
    if (h < 100.0) /* at magnetic poles */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
        d = NaN;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
        /* while rest is ok */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
    if (90.0-fabs(lat) <= 0.001) /* at geographic poles */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
    {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
        x = NaN;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
        y = NaN;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
        d = NaN;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
        /* while rest is ok */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
    }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
    *d_ptr = d * (180.0/M_PI);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
    *i_ptr = i * (180.0/M_PI);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
    *h_ptr = h;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
    *f_ptr = f;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
    return ret;  /* always 0 at present */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
/* subroutines below are modifications of the routines from geomag61.c */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
/*                           Subroutine julday                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
/*     Computes the decimal day of year from month, day, year.              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
/*     Leap years accounted for 1900 and 2000 are not leap years.           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
/*     Input:                                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
/*           year - Integer year of interest                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
/*           month - Integer month of interest                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
/*           day - Integer day of interest                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
/*     Output:                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
/*           date - Julian date to thousandth of year                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
/*     FORTRAN                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
/*           S. McLean                                                      */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
/*           NGDC, NOAA egc1, 325 Broadway, Boulder CO.  80301              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
/*     C                                                                    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
/*           C. H. Shaffer                                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
/*           Lockheed Missiles and Space Company, Sunnyvale CA              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
/*           August 12, 1988                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
/*     Julday Bug Fix                                                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
/*           Thanks to Rob Raper                                            */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
double julday(int i_month, int i_day, int i_year)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
   int   aggregate_first_day_of_month[13];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
   int   leap_year = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
   int   truncated_dividend;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
   double year;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
   double day;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
   double decimal_date;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
   double remainder = 0.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
   double divisor = 4.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
   double dividend;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
   double left_over;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
   aggregate_first_day_of_month[1] = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
   aggregate_first_day_of_month[2] = 32;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
   aggregate_first_day_of_month[3] = 60;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
   aggregate_first_day_of_month[4] = 91;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
   aggregate_first_day_of_month[5] = 121;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
   aggregate_first_day_of_month[6] = 152;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
   aggregate_first_day_of_month[7] = 182;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
   aggregate_first_day_of_month[8] = 213;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
   aggregate_first_day_of_month[9] = 244;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
   aggregate_first_day_of_month[10] = 274;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
   aggregate_first_day_of_month[11] = 305;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
   aggregate_first_day_of_month[12] = 335;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
   /* Test for leap year.  If true add one to day. */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
   year = i_year;                                 /*    Century Years not   */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
   if ((i_year != 1900) && (i_year != 2100))      /*  divisible by 400 are  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
   {                                              /*      NOT leap years    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
      dividend = year/divisor;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
      truncated_dividend = dividend;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
      left_over = dividend - truncated_dividend;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
      remainder = left_over*divisor;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
      if ((remainder > 0.0) && (i_month > 2))
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
         leap_year = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
         leap_year = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
   day = aggregate_first_day_of_month[i_month] + i_day - 1 + leap_year;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
   if (leap_year)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
      decimal_date = year + (day/366.0);  /*In version 3.0 this was incorrect*/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
   else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
      decimal_date = year + (day/365.0);  /*In version 3.0 this was incorrect*/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
   return(decimal_date);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
/*                           Subroutine extrapsh                            */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
/*     Extrapolates linearly a spherical harmonic model with a              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
/*     rate-of-change model.                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
/*     Input:                                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
/*           date     - date of resulting model (in decimal year)           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
/*           dte1     - date of base model                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
/*           nmax1    - maximum degree and order of base model              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
/*           gh1      - Schmidt quasi-normal internal spherical             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
/*                      harmonic coefficients of base model                 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
/*           nmax2    - maximum degree and order of rate-of-change model    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
/*           gh2      - Schmidt quasi-normal internal spherical             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
/*                      harmonic coefficients of rate-of-change model       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
/*     Output:                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
/*           gha or b - Schmidt quasi-normal internal spherical             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
/*                    harmonic coefficients                                 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
/*           nmax   - maximum degree and order of resulting model           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
/*     FORTRAN                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
/*           A. Zunde                                                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
/*           USGS, MS 964, box 25046 Federal Center, Denver, CO.  80225     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
/*     C                                                                    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
/*           C. H. Shaffer                                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
/*           Lockheed Missiles and Space Company, Sunnyvale CA              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
/*           August 16, 1988                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
/* gh_Schmidt[12] are input arrays of Schmidt coefficients: gh1, gh2 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
/* gh_model is an output array of model coefficients: gha or ghb */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
int extrapsh(double date, double dte1, int nmax1, int nmax2,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
                double *gh_Schmidt1, double *gh_Schmidt2, double *gh_model)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
   int   nmax;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
   int   k, l;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
   int   ii;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
   double factor;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
   factor = date - dte1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
   if (nmax1 == nmax2)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
      k =  nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
      nmax = nmax1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
   else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
      if (nmax1 > nmax2)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
         k = nmax2 * (nmax2 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
         l = nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
         for ( ii = k + 1; ii <= l; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
            gh_model[ii] = gh_Schmidt1[ii];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
         nmax = nmax1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
         k = nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
         l = nmax2 * (nmax2 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
         for ( ii = k + 1; ii <= l; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
            gh_model[ii] = factor * gh_Schmidt2[ii];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
         nmax = nmax2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
   for ( ii = 1; ii <= k; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
      gh_model[ii] = gh_Schmidt1[ii] + factor * gh_Schmidt2[ii];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
   return(nmax);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
/*                           Subroutine interpsh                            */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
/*     Interpolates linearly, in time, between two spherical harmonic       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
/*     models.                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
/*     Input:                                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
/*           date     - date of resulting model (in decimal year)           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
/*           dte1     - date of earlier model                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
/*           nmax1    - maximum degree and order of earlier model           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
/*           gh1      - Schmidt quasi-normal internal spherical             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
/*                      harmonic coefficients of earlier model              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
/*           dte2     - date of later model                                 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
/*           nmax2    - maximum degree and order of later model             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
/*           gh2      - Schmidt quasi-normal internal spherical             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
/*                      harmonic coefficients of internal model             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
/*     Output:                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
/*           gha or b - coefficients of resulting model                     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
/*           nmax     - maximum degree and order of resulting model         */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
/*     FORTRAN                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
/*           A. Zunde                                                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
/*           USGS, MS 964, box 25046 Federal Center, Denver, CO.  80225     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
/*     C                                                                    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
/*           C. H. Shaffer                                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
/*           Lockheed Missiles and Space Company, Sunnyvale CA              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
/*           August 17, 1988                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
/* gh_Schmidt[12] are input arrays of Schmidt coefficients: gh1, gh2 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
/* gh_model is an output array of model coefficients: gha or ghb */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
int interpsh(double date, double dte1, int nmax1, double dte2, double nmax2,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
                double *gh_Schmidt1, double *gh_Schmidt2, double *gh_model)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
   int   nmax;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
   int   k, l;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
   int   ii;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
   double factor;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
   factor = (date - dte1) / (dte2 - dte1);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
   if (nmax1 == nmax2)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
      k =  nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
      nmax = nmax1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
   else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
      if (nmax1 > nmax2)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
         k = nmax2 * (nmax2 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
         l = nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
         for ( ii = k + 1; ii <= l; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
            gh_model[ii] = gh_Schmidt1[ii] * (1 - factor);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
         nmax = nmax1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
         k = nmax1 * (nmax1 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
         l = nmax2 * (nmax2 + 2);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
         for ( ii = k + 1; ii <= l; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
            gh_model[ii] = factor * gh_Schmidt2[ii];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
         nmax = nmax2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
   for ( ii = 1; ii <= k; ++ii)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
      gh_model[ii] = gh_Schmidt1[ii] +
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
                        factor * (gh_Schmidt2[ii] - gh_Schmidt1[ii]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
   return(nmax);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
/*                           Subroutine shval3                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
/*     Calculates field components from spherical harmonic (sh)             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
/*     models.                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
/*     Input:                                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
/*           igdgc     - indicates coordinate system used; set equal        */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
/*                       to 1 if geodetic, 2 if geocentric                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
/*           latitude  - north latitude, in degrees                         */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
/*           longitude - east longitude, in degrees                         */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
/*           elev      - WGS84 altitude above mean sea level (igdgc=1), or  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
/*                       radial distance from earth's center (igdgc=2)      */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
/*           nmax      - maximum degree and order of coefficients           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
/*           iext      - external coefficients flag (=0 if none)            */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
/*           ext1,2,3  - the three 1st-degree external coefficients         */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
/*                       (not used if iext = 0)                             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   683
/*     Output:                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   684
/*           x         - northward component                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
/*           y         - eastward component                                 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
/*           z         - vertically-downward component                      */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
/*     based on subroutine 'igrf' by D. R. Barraclough and S. R. C. Malin,  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
/*     report no. 71/1, institute of geological sciences, U.K.              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   691
/*     FORTRAN                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   692
/*           Norman W. Peddie                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   693
/*           USGS, MS 964, box 25046 Federal Center, Denver, CO.  80225     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   694
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   695
/*     C                                                                    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   696
/*           C. H. Shaffer                                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   697
/*           Lockheed Missiles and Space Company, Sunnyvale CA              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   698
/*           August 17, 1988                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   699
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   700
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   701
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   702
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   703
/* gh is the array of model coefficients--gha or ghb */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   704
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   705
void shval3(int igdgc, double flat, double flon, double elev,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   706
                int nmax, double *gh, int iext,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   707
                double ext1, double ext2, double ext3,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   708
                double *x_ptr, double *y_ptr, double *z_ptr)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   709
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   710
   double earths_radius = 6371.2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   711
   double dtr = 0.01745329;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   712
   double slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   713
   double clat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   714
   double ratio;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   715
   double aa, bb, cc, dd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   716
   double sd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   717
   double cd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   718
   double r;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   719
   double a2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   720
   double b2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   721
   double rr;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   722
   double fm,fn;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   723
   double sl[14];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   724
   double cl[14];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   725
   double p[119];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   726
   double q[119];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   727
   int ii,j,k,l,m,n;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   728
   int npq;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   729
   double power;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   730
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   731
   double x, y, z;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   732
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   733
   /* a2,b2     - squares of semi-major and semi-minor axes of       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   734
   /*             the reference spheroid used for transforming       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   735
   /*             between geodetic and geocentric coordinates        */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   736
   /*             or components                                      */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   737
   a2 = 40680631.59;            /* WGS84 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   738
   b2 = 40408299.98;            /* WGS84 */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   739
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   740
   r = elev;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   741
   slat = sin(flat * dtr  );
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   742
   if ((90.0 - flat) < 0.001)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   743
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   744
      aa = 89.999;            /*  300 ft. from North pole  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   745
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   746
   else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   747
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   748
      if ((90.0 + flat) < 0.001)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   749
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   750
         aa = -89.999;        /*  300 ft. from South pole  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   751
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   752
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   753
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   754
         aa = flat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   755
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   756
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   757
   clat = cos(aa * dtr);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   758
   sl[1] = sin(flon*dtr);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   759
   cl[1] = cos(flon*dtr);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   760
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   761
   x = y = z = 0.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   762
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   763
   sd = 0.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   764
   cd = 1.0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   765
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   766
   l = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   767
   n = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   768
   m = 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   769
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   770
   npq = (nmax * (nmax + 3)) / 2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   771
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   772
   if (igdgc == 1)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   773
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   774
      aa = a2 * clat * clat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   775
      bb = b2 * slat * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   776
      cc = aa + bb;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   777
      dd = sqrt(cc);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   778
      r = sqrt(elev * (elev + 2.0 * dd) + (a2 * aa + b2 * bb) / cc);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   779
      cd = (elev + dd) / r;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   780
      sd = (a2 - b2) / dd * slat * clat / r;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   781
      aa = slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   782
      slat = slat * cd - clat * sd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   783
      clat = clat * cd + aa * sd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   784
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   785
   ratio = earths_radius / r;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   786
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   787
   aa = sqrt(3.0);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   788
   p[1] = 2.0 * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   789
   p[2] = 2.0 * clat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   790
   p[3] = 4.5 * slat * slat - 1.5;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   791
   p[4] = 3.0 * aa * clat * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   792
   q[1] = -clat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   793
   q[2] = slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   794
   q[3] = -3.0 * clat * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   795
   q[4] = aa * (slat * slat - clat * clat);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   796
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   797
   for ( k = 1; k <= npq; ++k)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   798
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   799
      if (n < m)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   800
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   801
         m = 0;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   802
         n = n + 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   803
         power =  n + 2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   804
         rr = pow(ratio,power);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   805
         fn = n;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   806
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   807
      fm = m;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   808
      if (k >= 5)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   809
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   810
         if (m == n)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   811
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   812
            aa = sqrt(1.0 - 0.5/fm);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   813
            j = k - n - 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   814
            p[k] = (1.0 + 1.0/fm) * aa * clat * p[j];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   815
            q[k] = aa * (clat * q[j] + slat/fm * p[j]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   816
            sl[m] = sl[m-1] * cl[1] + cl[m-1] * sl[1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   817
            cl[m] = cl[m-1] * cl[1] - sl[m-1] * sl[1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   818
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   819
         else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   820
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   821
            aa = sqrt(fn*fn - fm*fm);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   822
            bb = sqrt(((fn - 1.0)*(fn-1.0)) - (fm * fm)) / aa;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   823
            cc = (2.0 * fn - 1.0)/aa;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   824
            ii = k - n;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   825
            j = k - 2 * n + 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   826
            p[k] = (fn + 1.0) * (cc * slat/fn * p[ii] - bb/(fn - 1.0) * p[j]);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   827
            q[k] = cc * (slat * q[ii] - clat/fn * p[ii]) - bb * q[j];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   828
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   829
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   830
      aa = rr * gh[l];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   831
      if (m == 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   832
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   833
         x = x + aa * q[k];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   834
         z = z - aa * p[k];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   835
         l = l + 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   836
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   837
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   838
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   839
         bb = rr * gh[l+1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   840
         cc = aa * cl[m] + bb * sl[m];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   841
         x = x + cc * q[k];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   842
         z = z - cc * p[k];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   843
         if (clat > 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   844
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   845
            y = y + (aa * sl[m] - bb * cl[m]) *
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   846
                fm * p[k]/((fn + 1.0) * clat);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   847
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   848
         else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   849
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   850
            y = y + (aa * sl[m] - bb * cl[m]) * q[k] * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   851
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   852
         l = l + 2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   853
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   854
      m = m + 1;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   855
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   856
   if (iext != 0)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   857
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   858
      aa = ext2 * cl[1] + ext3 * sl[1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   859
      x = x - ext1 * clat + aa * slat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   860
      y = y + ext2 * sl[1] - ext3 * cl[1];
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   861
      z = z + ext1 * slat + aa * clat;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   862
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   863
   aa = x;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   864
   x = x * cd + z * sd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   865
   z = z * cd - aa * sd;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   866
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   867
   *x_ptr = x;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   868
   *y_ptr = y;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   869
   *z_ptr = z;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   870
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   871
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   872
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   873
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   874
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   875
/*                           Subroutine dihf                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   876
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   877
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   878
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   879
/*     Computes the geomagnetic d, i, h, and f from x, y, and z.            */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   880
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   881
/*     Input:                                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   882
/*           x  - northward component                                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   883
/*           y  - eastward component                                        */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   884
/*           z  - vertically-downward component                             */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   885
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   886
/*     Output:                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   887
/*           d  - declination                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   888
/*           i  - inclination                                               */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   889
/*           h  - horizontal intensity                                      */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   890
/*           f  - total intensity                                           */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   891
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   892
/*     FORTRAN                                                              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   893
/*           A. Zunde                                                       */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   894
/*           USGS, MS 964, box 25046 Federal Center, Denver, CO.  80225     */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   895
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   896
/*     C                                                                    */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   897
/*           C. H. Shaffer                                                  */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   898
/*           Lockheed Missiles and Space Company, Sunnyvale CA              */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   899
/*           August 22, 1988                                                */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   900
/*                                                                          */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   901
/****************************************************************************/
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   902
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   903
void dihf(double x, double y, double z,
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   904
                 double *d_ptr, double *i_ptr, double *h_ptr, double *f_ptr)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   905
{
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   906
   double d, i, h, f;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   907
   double h2;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   908
   double hpx;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   909
   double sn = 0.0001;  /* constant threshold */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   910
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   911
   h2 = x*x + y*y;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   912
   h = sqrt(h2);       /* calculate horizontal intensity */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   913
   f = sqrt(h2 + z*z);      /* calculate total intensity */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   914
   if (f < sn)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   915
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   916
      d = NaN;        /* If d and i cannot be determined, */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   917
      i = NaN;        /*       set equal to NaN         */
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   918
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   919
   else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   920
   {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   921
      i = atan2(z, h);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   922
      if (h < sn)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   923
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   924
         d = NaN;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   925
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   926
      else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   927
      {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   928
         hpx = h + x;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   929
         if (hpx < sn)
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   930
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   931
            d = M_PI;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   932
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   933
         else
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   934
         {
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   935
            d = 2.0 * atan2(y, hpx);
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   936
         }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   937
      }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   938
   }
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   939
   *d_ptr = d;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   940
   *i_ptr = i;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   941
   *h_ptr = h;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   942
   *f_ptr = f;
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   943
}
033a169071de Version IX_9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   944