File: func2d.c

package info (click to toggle)
grass 6.4.4-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 104,028 kB
  • ctags: 40,409
  • sloc: ansic: 419,980; python: 63,559; tcl: 46,692; cpp: 29,791; sh: 18,564; makefile: 7,000; xml: 3,505; yacc: 561; perl: 559; lex: 480; sed: 70; objc: 7
file content (118 lines) | stat: -rw-r--r-- 2,443 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

/*-
 *
 * Original program and various modifications:
 * Lubos Mitas 
 *
 * GRASS4.1 version of the program and GRASS4.2 modifications:
 * H. Mitasova,
 * I. Kosinovsky, D. Gerdes
 * D. McCauley 
 *
 * Copyright 1993, 1995:
 * L. Mitas ,
 * H. Mitasova ,
 * I. Kosinovsky, 
 * D.Gerdes 
 * D. McCauley 
 *
 * modified by McCauley in August 1995
 * modified by Mitasova in August 1995, Nov. 1996  
 *
 */

#include <stdio.h>
#include <math.h>
#include <grass/gis.h>
#include <grass/interpf.h>

double IL_crst(double r, double fi)
/*
 * Radial basis function - completely regularized spline with
 * tension (d=2)
 */
{
    double rfsta2 = fi * fi * r / 4.;

    static double c[4] = { 8.5733287401, 18.0590169730, 8.6347608925,
	0.2677737343
    };
    static double b[4] = { 9.5733223454, 25.6329561486, 21.0996530827,
	3.9584969228
    };
    double ce = 0.57721566;

    static double u[10] = { 1.e+00, -.25e+00,
	.055555555555556e+00, -.010416666666667e+00,	/*fixed bug 415.. repl. by 416.. */
	.166666666666667e-02, -2.31481481481482e-04,
	2.83446712018141e-05, -3.10019841269841e-06,
	3.06192435822065e-07, -2.75573192239859e-08
    };
    double x = rfsta2;
    double res;

    double e1, ea, eb;


    if (x < 1.e+00) {
	res = x * (u[0] + x * (u[1] + x * (u[2] + x * (u[3] + x * (u[4] + x *
								   (u[5] +
								    x *
								    (u[6] +
								     x *
								     (u[7] +
								      x *
								      (u[8] +
								       x *
								       u
								       [9])))))))));
	return (res);
    }

    if (x > 25.e+00)
	e1 = 0.00;
    else {
	ea = c[3] + x * (c[2] + x * (c[1] + x * (c[0] + x)));
	eb = b[3] + x * (b[2] + x * (b[1] + x * (b[0] + x)));
	e1 = (ea / eb) / (x * exp(x));
    }
    res = e1 + ce + log(x);
    return (res);
}



int IL_crstg(double r, double fi, double *gd1,	/* G1(r) */
	     double *gd2	/* G2(r) */
    )


/*
 * Function for calculating derivatives (d=2)
 */
{
    double r2 = r;
    double rfsta2 = fi * fi * r / 4.;
    double x, exm, oneme, hold;
    double fsta2 = fi * fi / 2.;

    x = rfsta2;
    if (x < 0.001) {
	*gd1 = 1. - x / 2. + x * x / 6. - x * x * x / 24.;
	*gd2 = fsta2 * (-.5 + x / 3. - x * x / 8. + x * x * x / 30.);
    }
    else {
	if (x < 35.e+00) {
	    exm = exp(-x);
	    oneme = 1. - exm;
	    *gd1 = oneme / x;
	    hold = x * exm - oneme;
	    *gd2 = (hold + hold) / (r2 * x);
	}
	else {
	    *gd1 = 1. / x;
	    *gd2 = -2. / (x * r2);
	}
    }
    return 1;
}