File: func2d.c

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (115 lines) | stat: -rw-r--r-- 2,318 bytes parent folder | download | duplicates (2)
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
/*-
 *
 * 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 "gis.h"
#include "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;
}