1 #include <stdio.h>
2 #include <grass/gis.h>
3 
4 #define POLYGON_DIMENSION 20
5 /* From FAOSOIL CD, after USDA 1951, p209 */
6 
7 struct vector
8 {
9     double sand;
10     double clay;
11     double silt;
12 };
13 
point_in_triangle(double point_x,double point_y,double point_z,double t1_x,double t1_y,double t1_z,double t2_x,double t2_y,double t2_z,double t3_x,double t3_y,double t3_z)14 double point_in_triangle(double point_x, double point_y, double point_z,
15 			 double t1_x, double t1_y, double t1_z, double t2_x,
16 			 double t2_y, double t2_z, double t3_x, double t3_y,
17 			 double t3_z)
18 {
19     G_debug(1,"point_in_triangle: sand=%5.3f clay=%5.3f silt=%5.3f",
20 				point_x,point_y,point_z);
21     double answer;
22     double answer1_x, answer1_y, answer1_z;
23     double answer2_x, answer2_y, answer2_z;
24     double answer3_x, answer3_y, answer3_z;
25 
26     /* Consider three points forming a trinagle from a given soil class boundary ABC */
27     /* Consider F an additional point in space */
28     double af1, af2, af3;	/*Points for vector AF */
29     double bf1, bf2, bf3;	/*Points for vector BF */
30     double cf1, cf2, cf3;	/*Points for vector CF */
31     double ab1, ab2, ab3;	/*Points for vector AB */
32     double bc1, bc2, bc3;	/*Points for vector BC */
33     double ca1, ca2, ca3;	/*Points for vector CA */
34 
35     /* Create vectors AB, BC and CA */
36     ab1 = (t2_x - t1_x);
37     ab2 = (t2_y - t1_y);
38     ab3 = (t2_z - t1_z);
39     bc1 = (t3_x - t2_x);
40     bc2 = (t3_y - t2_y);
41     bc3 = (t3_z - t2_z);
42     ca1 = (t1_x - t3_x);
43     ca2 = (t1_y - t3_y);
44     ca3 = (t1_z - t3_z);
45     /* Create vectors AF, BF and CF */
46     af1 = (point_x - t1_x);
47     af2 = (point_y - t1_y);
48     af3 = (point_z - t1_z);
49     bf1 = (point_x - t2_x);
50     bf2 = (point_y - t2_y);
51     bf3 = (point_z - t2_z);
52     cf1 = (point_x - t3_x);
53     cf2 = (point_y - t3_y);
54     cf3 = (point_z - t3_z);
55     /* Calculate the following CrossProducts: */
56     /* AFxAB */
57     answer1_x = (af2 * ab3) - (af3 * ab2);
58     answer1_y = (af3 * ab1) - (af1 * ab3);
59     answer1_z = (af1 * ab2) - (af2 * ab1);
60     /* G_message("answer(AFxAB)= %f %f %f",answer1_x, answer1_y, answer1_z); */
61     /*BFxBC */
62     answer2_x = (bf2 * bc3) - (bf3 * bc2);
63     answer2_y = (bf3 * bc1) - (bf1 * bc3);
64     answer2_z = (bf1 * bc2) - (bf2 * bc1);
65     /* G_message("answer(BFxBC)= %f %f %f",answer2_x, answer2_y, answer2_z); */
66     /*CFxCA */
67     answer3_x = (cf2 * ca3) - (cf3 * ca2);
68     answer3_y = (cf3 * ca1) - (cf1 * ca3);
69     answer3_z = (cf1 * ca2) - (cf2 * ca1);
70     /* G_message("answer(CFxCA)= %f %f %f",answer3_x, answer3_y, answer3_z); */
71     answer = 0.0; /*initialize value */
72     if ((int)answer1_x >= 0 && (int)answer2_x >= 0 && (int)answer3_x >= 0) {
73 	answer += 1.0;
74     }
75     else if ((int)answer1_x <= 0 && (int)answer2_x <= 0 &&
76 	     (int)answer3_x <= 0) {
77 	answer -= 1.0;
78     }
79     if ((int)answer1_y >= 0 && (int)answer2_y >= 0 && (int)answer3_y >= 0) {
80 	answer += 1.0;
81     }
82     else if ((int)answer1_y <= 0 && (int)answer2_y <= 0 &&
83 	     (int)answer3_y <= 0) {
84 	answer -= 1.0;
85     }
86     if ((int)answer1_z >= 0 && (int)answer2_z >= 0 && (int)answer3_z >= 0) {
87 	answer += 1.0;
88     }
89     else if ((int)answer1_z <= 0 && (int)answer2_z <= 0 &&
90 	     (int)answer3_z <= 0) {
91 	answer -= 1.0;
92     }
93     if (answer == 3 || answer == -3) {
94 	answer = 1;
95     }
96     else {
97 	answer = 0;
98     }
99     return answer;
100 }
101 
prct2tex(double sand_input,double clay_input,double silt_input)102 int prct2tex(double sand_input, double clay_input, double silt_input)
103 {
104     G_debug(1,"%5.3f||%5.3f||%5.3f",sand_input,clay_input,silt_input);
105 
106     /* set up index for soil texture classes */
107     int index = 20;
108 
109     /* set up mark index for inside/outside polygon check */
110     double mark[POLYGON_DIMENSION] = { 0.0 };
111     /*G_message("in prct2tex()"); */
112     /*setup the 3Dvectors and initialize them */
113     /* index 0 */
114     struct vector cls_clay[POLYGON_DIMENSION] = { { 0.0 } };
115     /* index 1 */
116     struct vector cls_sandy_clay[POLYGON_DIMENSION] = { { 0.0 } };
117     /* index 2 */
118     struct vector cls_silty_clay[POLYGON_DIMENSION] = { { 0.0 } };
119     /* index 3 */
120     struct vector cls_sandy_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
121     /* index 4 */
122     struct vector cls_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
123     /* index 5 */
124     struct vector cls_silty_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
125     /* index 6 */
126     struct vector cls_sand[POLYGON_DIMENSION] = { { 0.0 } };
127     /* index 7 */
128     struct vector cls_loamy_sand[POLYGON_DIMENSION] = { { 0.0 } };
129     /* index 8 */
130     struct vector cls_sandy_loam[POLYGON_DIMENSION] = { { 0.0 } };
131     /* index 9 */
132     struct vector cls_loam[POLYGON_DIMENSION] = { { 0.0 } };
133     /* index 10 */
134     struct vector cls_silt_loam[POLYGON_DIMENSION] = { { 0.0 } };
135     /* index 11 */
136     struct vector cls_silt[POLYGON_DIMENSION] = { { 0.0 } };
137 
138     if ((sand_input + clay_input + silt_input) <= 10.0) {
139 	sand_input = sand_input * 100.0;
140 	clay_input = clay_input * 100.0;
141 	silt_input = silt_input * 100.0;
142     }
143     /*G_message("%5.3f||%5.3f||%5.3f|",sand_input,clay_input,silt_input); */
144 
145     /*Feed the polygons for index 0 */
146     cls_clay[0].sand = 0.0;
147     cls_clay[0].clay = 100.0;
148     cls_clay[0].silt = 0.0;
149     cls_clay[1].sand = 0.0;
150     cls_clay[1].clay = 60.0;
151     cls_clay[1].silt = 40.0;
152     cls_clay[2].sand = 20.0;
153     cls_clay[2].clay = 40.0;
154     cls_clay[2].silt = 40.0;
155     cls_clay[3].sand = 50.0;
156     cls_clay[3].clay = 40.0;
157     cls_clay[3].silt = 10.0;
158     cls_clay[4].sand = 50.0;
159     cls_clay[4].clay = 50.0;
160     cls_clay[4].silt = 0.0;
161     /* Check for index 0 */
162     /* G_message("in prct2tex(): check for index 0"); */
163     mark[0] =
164 	point_in_triangle(sand_input, clay_input, silt_input,
165 			  cls_clay[0].sand, cls_clay[0].clay,
166 			  cls_clay[0].silt, cls_clay[1].sand,
167 			  cls_clay[1].clay, cls_clay[1].silt,
168 			  cls_clay[2].sand, cls_clay[2].clay,
169 			  cls_clay[2].silt);
170     mark[1] =
171 	point_in_triangle(sand_input, clay_input, silt_input,
172 			  cls_clay[0].sand, cls_clay[0].clay,
173 			  cls_clay[0].silt, cls_clay[2].sand,
174 			  cls_clay[2].clay, cls_clay[2].silt,
175 			  cls_clay[3].sand, cls_clay[3].clay,
176 			  cls_clay[3].silt);
177     mark[2] =
178 	point_in_triangle(sand_input, clay_input, silt_input,
179 			  cls_clay[0].sand, cls_clay[0].clay,
180 			  cls_clay[0].silt, cls_clay[3].sand,
181 			  cls_clay[3].clay, cls_clay[3].silt,
182 			  cls_clay[4].sand, cls_clay[4].clay,
183 			  cls_clay[4].silt);
184     /* G_message("Clay: mark[0]=%f",mark[0]); */
185     /* G_message("Clay: mark[1]=%f",mark[1]); */
186     /* G_message("Clay: mark[2]=%f",mark[2]); */
187     if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
188 	index = 0;
189 	/* G_message("Clay: index labelled as 0"); */
190     }
191     if (index == 20) {	/* if index not found then continue */
192 	/*Feed the polygons for index 1 */
193 	cls_sandy_clay[0].sand = 50.0;
194 	cls_sandy_clay[0].clay = 50.0;
195 	cls_sandy_clay[0].silt = 0.0;
196 	cls_sandy_clay[1].sand = 50.0;
197 	cls_sandy_clay[1].clay = 35.0;
198 	cls_sandy_clay[1].silt = 15.0;
199 	cls_sandy_clay[2].sand = 65.0;
200 	cls_sandy_clay[2].clay = 35.0;
201 	cls_sandy_clay[2].silt = 0.0;
202 	/* Check for index 1 */
203 	mark[0] =
204 	    point_in_triangle(sand_input, clay_input, silt_input,
205 			      cls_sandy_clay[0].sand, cls_sandy_clay[0].clay,
206 			      cls_sandy_clay[0].silt, cls_sandy_clay[1].sand,
207 			      cls_sandy_clay[1].clay, cls_sandy_clay[1].silt,
208 			      cls_sandy_clay[2].sand, cls_sandy_clay[2].clay,
209 			      cls_sandy_clay[2].silt);
210 
211 	/* G_message("Sandy Clay: mark[0]=%f",mark[0]); */
212 	if (mark[0] == 1) {
213 	    index = 1;
214 	    /* G_message("Sandy Clay: index labelled as 1"); */
215 	}
216     }
217     if (index == 20) {		/* if index not found then continue */
218 	/*Feed the polygons for index 2 */
219 	cls_silty_clay[0].sand = 0.0;
220 	cls_silty_clay[0].clay = 60.0;
221 	cls_silty_clay[0].silt = 40.0;
222 	cls_silty_clay[1].sand = 0.0;
223 	cls_silty_clay[1].clay = 40.0;
224 	cls_silty_clay[1].silt = 60.0;
225 	cls_silty_clay[2].sand = 20.0;
226 	cls_silty_clay[2].clay = 40.0;
227 	cls_silty_clay[2].silt = 40.0;
228 	/* Check for index 2 */
229 	/* G_message("sand=%5.3f||clay=%5.3f||silt=%5.3f",sand_input,
230 				clay_input,silt_input); */
231 	mark[0] =
232 	    point_in_triangle(sand_input, clay_input, silt_input,
233 			      cls_silty_clay[0].sand, cls_silty_clay[0].clay,
234 			      cls_silty_clay[0].silt, cls_silty_clay[1].sand,
235 			      cls_silty_clay[1].clay, cls_silty_clay[1].silt,
236 			      cls_silty_clay[2].sand, cls_silty_clay[2].clay,
237 			      cls_silty_clay[2].silt);
238 
239 	/* G_message("Silty Clay: mark[0]=%f",mark[0]); */
240 	if (mark[0] == 1) {
241 	    index = 2;
242 	    /* G_message("Silty Clay: index labelled as 2"); */
243 	}
244     }
245     if (index == 20) {	/* if index not found then continue */
246 	/*Feed the polygons for index 3 */
247 	cls_sandy_clay_loam[0].sand = 65.0;
248 	cls_sandy_clay_loam[0].clay = 35.0;
249 	cls_sandy_clay_loam[0].silt = 0.0;
250 	cls_sandy_clay_loam[1].sand = 50.0;
251 	cls_sandy_clay_loam[1].clay = 35.0;
252 	cls_sandy_clay_loam[1].silt = 15.0;
253 	cls_sandy_clay_loam[2].sand = 50.0;
254 	cls_sandy_clay_loam[2].clay = 30.0;
255 	cls_sandy_clay_loam[2].silt = 20.0;
256 	cls_sandy_clay_loam[3].sand = 55.0;
257 	cls_sandy_clay_loam[3].clay = 25.0;
258 	cls_sandy_clay_loam[3].silt = 20.0;
259 	cls_sandy_clay_loam[4].sand = 75.0;
260 	cls_sandy_clay_loam[4].clay = 25.0;
261 	cls_sandy_clay_loam[4].silt = 0.0;
262 	/* Check for index 0 */
263 	/* G_message("in prct2tex(): check for index 3"); */
264 	mark[0] =
265 	    point_in_triangle(sand_input, clay_input, silt_input,
266 			      cls_sandy_clay_loam[0].sand,
267 			      cls_sandy_clay_loam[0].clay,
268 			      cls_sandy_clay_loam[0].silt,
269 			      cls_sandy_clay_loam[1].sand,
270 			      cls_sandy_clay_loam[1].clay,
271 			      cls_sandy_clay_loam[1].silt,
272 			      cls_sandy_clay_loam[2].sand,
273 			      cls_sandy_clay_loam[2].clay,
274 			      cls_sandy_clay_loam[2].silt);
275 	mark[1] =
276 	    point_in_triangle(sand_input, clay_input, silt_input,
277 			      cls_sandy_clay_loam[0].sand,
278 			      cls_sandy_clay_loam[0].clay,
279 			      cls_sandy_clay_loam[0].silt,
280 			      cls_sandy_clay_loam[2].sand,
281 			      cls_sandy_clay_loam[2].clay,
282 			      cls_sandy_clay_loam[2].silt,
283 			      cls_sandy_clay_loam[3].sand,
284 			      cls_sandy_clay_loam[3].clay,
285 			      cls_sandy_clay_loam[3].silt);
286 	mark[2] =
287 	    point_in_triangle(sand_input, clay_input, silt_input,
288 			      cls_sandy_clay_loam[0].sand,
289 			      cls_sandy_clay_loam[0].clay,
290 			      cls_sandy_clay_loam[0].silt,
291 			      cls_sandy_clay_loam[3].sand,
292 			      cls_sandy_clay_loam[3].clay,
293 			      cls_sandy_clay_loam[3].silt,
294 			      cls_sandy_clay_loam[4].sand,
295 			      cls_sandy_clay_loam[4].clay,
296 			      cls_sandy_clay_loam[4].silt);
297 	/* G_message("Sandy Clay Loam: mark[0]=%f",mark[0]); */
298 	/* G_message("Sandy Clay Loam: mark[1]=%f",mark[1]); */
299 	/* G_message("Sandy Clay Loam: mark[2]=%f",mark[2]); */
300 	if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
301 	    index = 3;
302 	    /* G_message("Sandy Clay Loam: index labelled as 3"); */
303 	}
304     }
305     if (index == 20) {	/* if index not found then continue */
306 	/*Feed the polygons for index 4 */
307 	cls_clay_loam[0].sand = 20.0;
308 	cls_clay_loam[0].clay = 40.0;
309 	cls_clay_loam[0].silt = 40.0;
310 	cls_clay_loam[1].sand = 20.0;
311 	cls_clay_loam[1].clay = 30.0;
312 	cls_clay_loam[1].silt = 50.0;
313 	cls_clay_loam[2].sand = 50.0;
314 	cls_clay_loam[2].clay = 30.0;
315 	cls_clay_loam[2].silt = 20.0;
316 	cls_clay_loam[3].sand = 10.0;
317 	cls_clay_loam[3].clay = 50.0;
318 	cls_clay_loam[3].silt = 40.0;
319 	/* Check for index 4 */
320 	/* G_message("in prct2tex(): check for index 4"); */
321 	mark[0] =
322 	    point_in_triangle(sand_input, clay_input, silt_input,
323 			      cls_clay_loam[0].sand, cls_clay_loam[0].clay,
324 			      cls_clay_loam[0].silt, cls_clay_loam[1].sand,
325 			      cls_clay_loam[1].clay, cls_clay_loam[1].silt,
326 			      cls_clay_loam[2].sand, cls_clay_loam[2].clay,
327 			      cls_clay_loam[2].silt);
328 	mark[1] =
329 	    point_in_triangle(sand_input, clay_input, silt_input,
330 			      cls_clay_loam[0].sand, cls_clay_loam[0].clay,
331 			      cls_clay_loam[0].silt, cls_clay_loam[2].sand,
332 			      cls_clay_loam[2].clay, cls_clay_loam[2].silt,
333 			      cls_clay_loam[3].sand, cls_clay_loam[3].clay,
334 			      cls_clay_loam[3].silt);
335 	/* G_message("Clay Loam: mark[0]=%f",mark[0]); */
336 	/* G_message("Clay Loam: mark[1]=%f",mark[1]); */
337 	if (mark[0] == 1 || mark[1] == 1) {
338 	    index = 4;
339 	    /* G_message("Clay Loam: index labelled as 4"); */
340 	}
341     }
342     if (index == 20) {	/* if index not found then continue */
343 	/*Feed the polygons for index 5 */
344 	cls_silty_clay_loam[0].sand = 0.0;
345 	cls_silty_clay_loam[0].clay = 40.0;
346 	cls_silty_clay_loam[0].silt = 60.0;
347 	cls_silty_clay_loam[1].sand = 0.0;
348 	cls_silty_clay_loam[1].clay = 30.0;
349 	cls_silty_clay_loam[1].silt = 70.0;
350 	cls_silty_clay_loam[2].sand = 20.0;
351 	cls_silty_clay_loam[2].clay = 30.0;
352 	cls_silty_clay_loam[2].silt = 50.0;
353 	cls_silty_clay_loam[3].sand = 20.0;
354 	cls_silty_clay_loam[3].clay = 40.0;
355 	cls_silty_clay_loam[3].silt = 40.0;
356 	/* Check for index 5 */
357 	/* G_message("in prct2tex(): check for index 5"); */
358 	mark[0] =
359 	    point_in_triangle(sand_input, clay_input, silt_input,
360 			      cls_silty_clay_loam[0].sand,
361 			      cls_silty_clay_loam[0].clay,
362 			      cls_silty_clay_loam[0].silt,
363 			      cls_silty_clay_loam[1].sand,
364 			      cls_silty_clay_loam[1].clay,
365 			      cls_silty_clay_loam[1].silt,
366 			      cls_silty_clay_loam[2].sand,
367 			      cls_silty_clay_loam[2].clay,
368 			      cls_silty_clay_loam[2].silt);
369 	mark[1] =
370 	    point_in_triangle(sand_input, clay_input, silt_input,
371 			      cls_silty_clay_loam[0].sand,
372 			      cls_silty_clay_loam[0].clay,
373 			      cls_silty_clay_loam[0].silt,
374 			      cls_silty_clay_loam[2].sand,
375 			      cls_silty_clay_loam[2].clay,
376 			      cls_silty_clay_loam[2].silt,
377 			      cls_silty_clay_loam[3].sand,
378 			      cls_silty_clay_loam[3].clay,
379 			      cls_silty_clay_loam[3].silt);
380 	/* G_message("Silty Clay Loam: mark[0]=%f",mark[0]); */
381 	/* G_message("Silty Clay Loam: mark[1]=%f",mark[1]); */
382 	if (mark[0] == 1 || mark[1] == 1) {
383 	    index = 5;
384 	    /* G_message("Silty Clay Loam: index labelled as 5"); */
385 	}
386     }
387     if (index == 20) {	/* if index not found then continue */
388 	/*Feed the polygons for index 6 */
389 	cls_sand[0].sand = 85.0;
390 	cls_sand[0].clay = 15.0;
391 	cls_sand[0].silt = 0.0;
392 	cls_sand[1].sand = 85.0;
393 	cls_sand[1].clay = 0.0;
394 	cls_sand[1].silt = 15.0;
395 	cls_sand[2].sand = 100.0;
396 	cls_sand[2].clay = 0.0;
397 	cls_sand[2].silt = 0.0;
398 	/* Check for index 6 */
399 	mark[0] =
400 	    point_in_triangle(sand_input, clay_input, silt_input,
401 			      cls_sand[0].sand, cls_sand[0].clay,
402 			      cls_sand[0].silt, cls_sand[1].sand,
403 			      cls_sand[1].clay, cls_sand[1].silt,
404 			      cls_sand[2].sand, cls_sand[2].clay,
405 			      cls_sand[2].silt);
406 	/* G_message("Sand: mark[0]=%f",mark[0]); */
407 	if (mark[0] == 1) {
408 	    index = 6;
409 	    /* G_message("Sand: index labelled as 6"); */
410 	}
411     }
412     if (index == 20) {	/* if index not found then continue */
413 	/*Feed the polygons for index 7 */
414 	cls_loamy_sand[0].sand = 80.0;
415 	cls_loamy_sand[0].clay = 20.0;
416 	cls_loamy_sand[0].silt = 0.0;
417 	cls_loamy_sand[1].sand = 70.0;
418 	cls_loamy_sand[1].clay = 0.0;
419 	cls_loamy_sand[1].silt = 30.0;
420 	cls_loamy_sand[2].sand = 85.0;
421 	cls_loamy_sand[2].clay = 0.0;
422 	cls_loamy_sand[2].silt = 15.0;
423 	cls_loamy_sand[3].sand = 85.0;
424 	cls_loamy_sand[3].clay = 15.0;
425 	cls_loamy_sand[3].silt = 0.0;
426 	/* Check for index 7 */
427 	/* G_message("in prct2tex(): check for index 7"); */
428 	mark[0] =
429 	    point_in_triangle(sand_input, clay_input, silt_input,
430 			      cls_loamy_sand[0].sand, cls_loamy_sand[0].clay,
431 			      cls_loamy_sand[0].silt, cls_loamy_sand[1].sand,
432 			      cls_loamy_sand[1].clay, cls_loamy_sand[1].silt,
433 			      cls_loamy_sand[2].sand, cls_loamy_sand[2].clay,
434 			      cls_loamy_sand[2].silt);
435 	mark[1] =
436 	    point_in_triangle(sand_input, clay_input, silt_input,
437 			      cls_loamy_sand[0].sand, cls_loamy_sand[0].clay,
438 			      cls_loamy_sand[0].silt, cls_loamy_sand[2].sand,
439 			      cls_loamy_sand[2].clay, cls_loamy_sand[2].silt,
440 			      cls_loamy_sand[3].sand, cls_loamy_sand[3].clay,
441 			      cls_loamy_sand[3].silt);
442 	/* G_message("Loamy Sand: mark[0]=%f",mark[0]); */
443 	/* G_message("Loamy Sand: mark[1]=%f",mark[1]); */
444 	if (mark[0] == 1 || mark[1] == 1) {
445 	    index = 7;
446 	    /* G_message("Loamy Sand: index labelled as 7"); */
447 	}
448     }
449 
450     if (index == 20) {	/* if index not found then continue */
451 	/*Feed the polygons for index 8 */
452 	cls_sandy_loam[0].sand = 75.0;
453 	cls_sandy_loam[0].clay = 25.0;
454 	cls_sandy_loam[0].silt = 0.0;
455 	cls_sandy_loam[1].sand = 55.0;
456 	cls_sandy_loam[1].clay = 25.0;
457 	cls_sandy_loam[1].silt = 20.0;
458 	cls_sandy_loam[2].sand = 55.0;
459 	cls_sandy_loam[2].clay = 10.0;
460 	cls_sandy_loam[2].silt = 35.0;
461 	cls_sandy_loam[3].sand = 40.0;
462 	cls_sandy_loam[3].clay = 10.0;
463 	cls_sandy_loam[3].silt = 50.0;
464 	cls_sandy_loam[4].sand = 50.0;
465 	cls_sandy_loam[4].clay = 0.0;
466 	cls_sandy_loam[4].silt = 50.0;
467 	cls_sandy_loam[5].sand = 70.0;
468 	cls_sandy_loam[5].clay = 0.0;
469 	cls_sandy_loam[5].silt = 30.0;
470 	cls_sandy_loam[6].sand = 80.0;
471 	cls_sandy_loam[6].clay = 20.0;
472 	cls_sandy_loam[6].silt = 0.0;
473 	/* Check for index 8 */
474 	/* G_message("in prct2tex(): check for index 8"); */
475 	mark[0] =
476 	    point_in_triangle(sand_input, clay_input, silt_input,
477 			      cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
478 			      cls_sandy_loam[2].silt, cls_sandy_loam[3].sand,
479 			      cls_sandy_loam[3].clay, cls_sandy_loam[3].silt,
480 			      cls_sandy_loam[4].sand, cls_sandy_loam[4].clay,
481 			      cls_sandy_loam[4].silt);
482 	mark[1] =
483 	    point_in_triangle(sand_input, clay_input, silt_input,
484 			      cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
485 			      cls_sandy_loam[2].silt, cls_sandy_loam[4].sand,
486 			      cls_sandy_loam[4].clay, cls_sandy_loam[4].silt,
487 			      cls_sandy_loam[5].sand, cls_sandy_loam[5].clay,
488 			      cls_sandy_loam[5].silt);
489 	mark[2] =
490 	    point_in_triangle(sand_input, clay_input, silt_input,
491 			      cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
492 			      cls_sandy_loam[2].silt, cls_sandy_loam[5].sand,
493 			      cls_sandy_loam[5].clay, cls_sandy_loam[5].silt,
494 			      cls_sandy_loam[6].sand, cls_sandy_loam[6].clay,
495 			      cls_sandy_loam[6].silt);
496 	mark[3] =
497 	    point_in_triangle(sand_input, clay_input, silt_input,
498 			      cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
499 			      cls_sandy_loam[2].silt, cls_sandy_loam[6].sand,
500 			      cls_sandy_loam[6].clay, cls_sandy_loam[6].silt,
501 			      cls_sandy_loam[0].sand, cls_sandy_loam[0].clay,
502 			      cls_sandy_loam[0].silt);
503 	mark[4] =
504 	    point_in_triangle(sand_input, clay_input, silt_input,
505 			      cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
506 			      cls_sandy_loam[2].silt, cls_sandy_loam[0].sand,
507 			      cls_sandy_loam[0].clay, cls_sandy_loam[0].silt,
508 			      cls_sandy_loam[1].sand, cls_sandy_loam[1].clay,
509 			      cls_sandy_loam[1].silt);
510 	/* G_message("Sandy Loam: mark[0]=%f",mark[0]); */
511 	/* G_message("Sandy Loam: mark[1]=%f",mark[1]); */
512 	if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1 || mark[3] == 1 ||
513 	    mark[4] == 1) {
514 	    index = 8;
515 	    /* G_message("Sandy Loam: index labelled as 8"); */
516 	}
517     }
518 
519     if (index == 20) {	/* if index not found then continue */
520 	/*Feed the polygons for index 9 */
521 	cls_loam[0].sand = 50.0;
522 	cls_loam[0].clay = 30.0;
523 	cls_loam[0].silt = 20.0;
524 	cls_loam[1].sand = 20.0;
525 	cls_loam[1].clay = 30.0;
526 	cls_loam[1].silt = 50.0;
527 	cls_loam[2].sand = 40.0;
528 	cls_loam[2].clay = 10.0;
529 	cls_loam[2].silt = 50.0;
530 	cls_loam[3].sand = 55.0;
531 	cls_loam[3].clay = 10.0;
532 	cls_loam[3].silt = 35.0;
533 	cls_loam[4].sand = 55.0;
534 	cls_loam[4].clay = 25.0;
535 	cls_loam[4].silt = 15.0;
536 	/* Check for index 9 */
537 	/* G_message("in prct2tex(): check for index 9"); */
538 	mark[0] =
539 	    point_in_triangle(sand_input, clay_input, silt_input,
540 			      cls_loam[0].sand, cls_loam[0].clay,
541 			      cls_loam[0].silt, cls_loam[1].sand,
542 			      cls_loam[1].clay, cls_loam[1].silt,
543 			      cls_loam[2].sand, cls_loam[2].clay,
544 			      cls_loam[2].silt);
545 	mark[1] =
546 	    point_in_triangle(sand_input, clay_input, silt_input,
547 			      cls_loam[0].sand, cls_loam[0].clay,
548 			      cls_loam[0].silt, cls_loam[2].sand,
549 			      cls_loam[2].clay, cls_loam[2].silt,
550 			      cls_loam[3].sand, cls_loam[3].clay,
551 			      cls_loam[3].silt);
552 	mark[2] =
553 	    point_in_triangle(sand_input, clay_input, silt_input,
554 			      cls_loam[0].sand, cls_loam[0].clay,
555 			      cls_loam[0].silt, cls_loam[3].sand,
556 			      cls_loam[3].clay, cls_loam[3].silt,
557 			      cls_loam[4].sand, cls_loam[4].clay,
558 			      cls_loam[4].silt);
559 	/* G_message("Sandy Loam: mark[0]=%f",mark[0]); */
560 	/* G_message("Sandy Loam: mark[1]=%f",mark[1]); */
561 	if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
562 	    index = 9;
563 	    /* G_message("Loam: index labelled as 9"); */
564 	}
565     }
566 
567     if (index == 20) {	/* if index not found then continue */
568 	/*Feed the polygons for index 10 */
569 	cls_silt_loam[0].sand = 20.0;
570 	cls_silt_loam[0].clay = 30.0;
571 	cls_silt_loam[0].silt = 50.0;
572 	cls_silt_loam[1].sand = 0.0;
573 	cls_silt_loam[1].clay = 30.0;
574 	cls_silt_loam[1].silt = 70.0;
575 	cls_silt_loam[2].sand = 0.0;
576 	cls_silt_loam[2].clay = 10.0;
577 	cls_silt_loam[2].silt = 90.0;
578 	cls_silt_loam[3].sand = 15.0;
579 	cls_silt_loam[3].clay = 10.0;
580 	cls_silt_loam[3].silt = 75.0;
581 	cls_silt_loam[4].sand = 25.0;
582 	cls_silt_loam[4].clay = 0.0;
583 	cls_silt_loam[4].silt = 75.0;
584 	cls_silt_loam[5].sand = 50.0;
585 	cls_silt_loam[5].clay = 0.0;
586 	cls_silt_loam[5].silt = 50.0;
587 	/* Check for index 10 */
588 	/* G_message("in prct2tex(): check for index 10"); */
589 	mark[0] =
590 	    point_in_triangle(sand_input, clay_input, silt_input,
591 			      cls_silt_loam[3].sand, cls_silt_loam[3].clay,
592 			      cls_silt_loam[3].silt, cls_silt_loam[4].sand,
593 			      cls_silt_loam[4].clay, cls_silt_loam[4].silt,
594 			      cls_silt_loam[5].sand, cls_silt_loam[5].clay,
595 			      cls_silt_loam[5].silt);
596 	mark[1] =
597 	    point_in_triangle(sand_input, clay_input, silt_input,
598 			      cls_silt_loam[3].sand, cls_silt_loam[3].clay,
599 			      cls_silt_loam[3].silt, cls_silt_loam[5].sand,
600 			      cls_silt_loam[5].clay, cls_silt_loam[5].silt,
601 			      cls_silt_loam[0].sand, cls_silt_loam[0].clay,
602 			      cls_silt_loam[0].silt);
603 	mark[2] =
604 	    point_in_triangle(sand_input, clay_input, silt_input,
605 			      cls_silt_loam[3].sand, cls_silt_loam[3].clay,
606 			      cls_silt_loam[3].silt, cls_silt_loam[0].sand,
607 			      cls_silt_loam[0].clay, cls_silt_loam[0].silt,
608 			      cls_silt_loam[1].sand, cls_silt_loam[1].clay,
609 			      cls_silt_loam[1].silt);
610 	mark[3] =
611 	    point_in_triangle(sand_input, clay_input, silt_input,
612 			      cls_silt_loam[3].sand, cls_silt_loam[3].clay,
613 			      cls_silt_loam[3].silt, cls_silt_loam[1].sand,
614 			      cls_silt_loam[1].clay, cls_silt_loam[1].silt,
615 			      cls_silt_loam[2].sand, cls_silt_loam[2].clay,
616 			      cls_silt_loam[2].silt);
617 	/* G_message("Silt Loam: mark[0]=%f",mark[0]); */
618 	/* G_message("Silt Loam: mark[1]=%f",mark[1]); */
619 	/* G_message("Silt Loam: mark[2]=%f",mark[2]); */
620 	/* G_message("Silt Loam: mark[3]=%f",mark[3]); */
621 	if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1 || mark[3] == 1) {
622 	    index = 10;
623 	    /* G_message("Silt Loam: index labelled as 10"); */
624 	}
625     }
626 
627     if (index == 20) {	/* if index not found then continue */
628 	/*Feed the polygons for index 11 */
629 	cls_silt[0].sand = 15.0;
630 	cls_silt[0].clay = 10.0;
631 	cls_silt[0].silt = 75.0;
632 	cls_silt[1].sand = 0.0;
633 	cls_silt[1].clay = 10.0;
634 	cls_silt[1].silt = 90.0;
635 	cls_silt[2].sand = 0.0;
636 	cls_silt[2].clay = 0.0;
637 	cls_silt[2].silt = 100.0;
638 	cls_silt[3].sand = 25.0;
639 	cls_silt[3].clay = 0.0;
640 	cls_silt[3].silt = 75.0;
641 	/* Check for index 11 */
642 	/* G_message("in prct2tex(): check for index 11"); */
643 	mark[0] =
644 	    point_in_triangle(sand_input, clay_input, silt_input,
645 			      cls_silt[0].sand, cls_silt[0].clay,
646 			      cls_silt[0].silt, cls_silt[1].sand,
647 			      cls_silt[1].clay, cls_silt[1].silt,
648 			      cls_silt[2].sand, cls_silt[2].clay,
649 			      cls_silt[2].silt);
650 	mark[1] =
651 	    point_in_triangle(sand_input, clay_input, silt_input,
652 			      cls_silt[0].sand, cls_silt[0].clay,
653 			      cls_silt[0].silt, cls_silt[2].sand,
654 			      cls_silt[2].clay, cls_silt[2].silt,
655 			      cls_silt[3].sand, cls_silt[3].clay,
656 			      cls_silt[3].silt);
657 	/* G_message("Silt: mark[0]=%f",mark[0]); */
658 	/* G_message("Silt: mark[1]=%f",mark[1]); */
659 	if (mark[0] == 1 || mark[1] == 1) {
660 	    index = 11;
661 	    /* G_message("Silt: index labelled as 11"); */
662 	}
663     }
664     if(index==0){
665        G_debug(1,"clay");
666        } else if (index==1){
667        G_debug(1,"sandy clay");
668        } else if (index==2){
669        G_debug(1,"silty clay");
670        } else if (index==3){
671        G_debug(1,"sandy clay loam");
672        } else if (index==4){
673        G_debug(1,"clay loam");
674        } else if (index==5){
675        G_debug(1,"silty clay loam");
676        } else if (index==6){
677        G_debug(1,"sand");
678        } else if (index==7){
679        G_debug(1,"loamy sand");
680        } else if (index==8){
681        G_debug(1,"sandy loam");
682        } else if (index==9){
683        G_debug(1,"loam");
684        } else if (index==10){
685        G_message("silt loam");
686        } else if (index==11){
687        G_debug(1,"silt");
688        } else {
689        G_debug(1,"Unable to allocate class");
690        }
691     return index;
692 }
693