File: cdRegTrfm.c

package info (click to toggle)
cmor 3.14.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,976 kB
  • sloc: ansic: 28,053; f90: 13,893; python: 12,699; sh: 3,739; makefile: 111
file content (149 lines) | stat: -rw-r--r-- 4,125 bytes parent folder | download | duplicates (5)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* -*-Mode: C;-*-
 * Module:      index <-> x-y <-> latlon wrapper routines
 *              CdXyIndex     - x-y -> index
 *              CdIndexXy     - index -> x-y
 *              CdLatLonXy    - latlon -> x-y
 *              CdXyLatLon    - x-y -> latlon
 *              CdIndexLatLon - index -> latlon
 *              CdLatLonIndex - latlon -> index
 *              CdMapGeom     - map CDMS geom/order to NEONS geom
 *
 * Copyright:	1994, Regents of the University of California
 *		This software may not be distributed to others without
 *		permission of the author.
 *
 * Author:      Bob Drach, Lawrence Livermore National Laboratory
 *              drach@llnl.gov
 *
 * Version:     $Id$
 *
 * Revision History:
 *
 * $Log: cdRegTrfm.c,v $
 * Revision 1.2  1996/02/21  23:56:46  drach
 * - Overlayed cdtime routines in cdTimeConv.c:
 * - Added seconds, julian calendar, changed include to cdmsint.h for old
 *   time routines in timeArith.c and timeConv.c
 *
 * Revision 1.1  1994/08/12  19:03:53  drach
 * Entered into CVS
 *
 *
 */

#include <string.h>
#include <stdio.h>
#include <cdmsint.h>
#include <isdb.h>
extern void   xy_index(REG_GEOM *, long *, long *, long *, int *);
extern void   latlon_index(REG_GEOM *, double *, double *, long *, int *);
extern void   index_xy(REG_GEOM *, long *, long *, long *, int *);
extern void   index_latlon(REG_GEOM *, long *, double *, double *, int *);
extern void   xy_latlon(REG_GEOM *, double *, double *, double *, double *, int *);
extern void   latlon_xy(REG_GEOM *, double *, double *, double *, double *, int *);
extern void   getf_latlon(REG_GEOM *, double *, double *, float *, float *, int *);
extern void   putf_latlon(REG_GEOM *, double *, double *, float *, float *, int *);

					     /* copy CDMS geom to NEONS ngeom */
void
CdCopyGeom(CdRegGeom *geom, REG_GEOM *ngeom)
{
	strncpy(ngeom->prjn_name,geom->prjnName,21);
	ngeom->nx = geom->nx;
	ngeom->ny = geom->ny;
	ngeom->lat = geom->lat;
	ngeom->lon = geom->lon;
	ngeom->orig_ix = geom->orig_ix;
	ngeom->orig_iy = geom->orig_iy;
	ngeom->x_int_dis = geom->x_int_dis;
	ngeom->y_int_dis = geom->y_int_dis;
	ngeom->parm_1 = geom->parm_1;
	ngeom->parm_2 = geom->parm_2;
	ngeom->parm_3 = geom->parm_3;

	return;
}

					     /* Copy CDMS geom & order to NEONS ngeom */
void
CdMapGeom(CdRegGeom *geom, CdOrder *order, REG_GEOM *ngeom)
{
	if(order->lonDir < 0){
		fprintf(stderr,"CDMS error: longitude direction must be non-negative.\n");
	}

	if(order->lonDir < order->latDir)
		if(order->latDir > 0)
			strcpy(ngeom->stor_dsc,"+x in +y");
		else
			strcpy(ngeom->stor_dsc,"+x in -y");
	else
		if(order->latDir > 0)
			strcpy(ngeom->stor_dsc,"+y in +x");
		else
			strcpy(ngeom->stor_dsc,"-y in +x");

	CdCopyGeom(geom,ngeom);
	return;
}

int
CdXyIndex(CdRegGeom *geom, CdOrder *order, long ix, long iy, long *index)
{
	REG_GEOM ngeom;
	int status;

	CdMapGeom(geom,order,&ngeom);
	xy_index(&ngeom,&ix,&iy,index,&status);
	return (status == 0 ? 0 : 1);
}
int
CdIndexXy(CdRegGeom *geom, CdOrder *order, long index, long *ix, long *iy)
{
	REG_GEOM ngeom;
	int status;

	CdMapGeom(geom,order,&ngeom);
	index_xy(&ngeom,&index,ix,iy,&status);
	return (status == 0 ? 0 : 1);
}
int
CdLatLonXy(CdRegGeom *geom, double lat, double lon, double *x, double *y)
{
	REG_GEOM ngeom;
	int status;

	CdCopyGeom(geom,&ngeom);	     /* order is unused */
	latlon_xy(&ngeom,&lat,&lon,x,y,&status);
	return (status == 0 ? 0 : 1);
}
int
CdXyLatLon(CdRegGeom *geom, double x, double y, double *lat, double *lon)
{
	REG_GEOM ngeom;
	int status;

	CdCopyGeom(geom,&ngeom);	     /* order is unused */
	xy_latlon(&ngeom,&x,&y,lat,lon,&status);
	return (status == 0 ? 0 : 1);
}
int
CdIndexLatLon(CdRegGeom *geom, CdOrder *order, long index, double *lat, double *lon)
{
	REG_GEOM ngeom;
	int status;

	CdMapGeom(geom,order,&ngeom);
	index_latlon(&ngeom,&index,lat,lon,&status);
	return (status == 0 ? 0 : 1);
}
int
CdLatLonIndex(CdRegGeom *geom, CdOrder *order, double lat, double lon, long *index)
{
	REG_GEOM ngeom;
	int status;

	CdMapGeom(geom,order,&ngeom);
	latlon_index(&ngeom,&lat,&lon,index,&status);
	return (status == 0 ? 0 : 1);
}