Imported Upstream version 4.6.0
[debian/atlc] / src / non_gui / find_electric_fields.c
1 #include "definitions.h"
2 #include "exit_codes.h"
3
4 extern double **Vij;
5 extern unsigned char **oddity;
6 extern double **Er;
7 extern int width, height;
8
9 double find_Ex(int i, int j) 
10 {
11   double Ex=0.0;
12   unsigned char odd;
13   odd = oddity[i][j];
14   if(odd > CONDUCTOR_FLOATING) {
15
16     if (odd == TOP_LEFT_CORNER || odd == BOTTOM_LEFT_CORNER) 
17       Ex=Vij[0][j]-Vij[1][j];
18
19     else if (odd == TOP_RIGHT_CORNER || odd == BOTTOM_RIGHT_CORNER) 
20       Ex=Vij[width-2][0]-Vij[width-1][0];
21
22     else if (odd == ORDINARY_POINT_TOP_EDGE || odd == ORDINARY_POINT_BOTTOM_EDGE) 
23       Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
24
25     else if (odd == ORDINARY_POINT_LEFT_EDGE) 
26       Ex=(Vij[i][j]-Vij[i+1][j]);
27
28     else if (odd == ORDINARY_POINT_RIGHT_EDGE) 
29       Ex=(Vij[width-2][j]-Vij[width-1][j]);
30
31     else if(odd == METAL_LEFT || odd == METAL_BELOW_AND_LEFT || odd == METAL_ABOVE_AND_LEFT)
32       Ex=Vij[i][j]-Vij[i+1][j];
33
34     else if(odd == METAL_RIGHT || odd == METAL_ABOVE_AND_RIGHT || odd ==METAL_BELOW_AND_RIGHT)
35       Ex=Vij[i-1][j]-Vij[i][j];
36
37     else if (odd == ORDINARY_INTERIOR_POINT || odd == METAL_ABOVE || odd == METAL_BELOW)
38       Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
39
40     else if (odd >= DIFFERENT_DIELECTRIC_ABOVE_AND_RIGHT && odd < UNDEFINED_ODDITY  )
41       Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
42
43     else{
44       fprintf(stderr,"oddity[%d][%d]=%d\n",i,j,odd);
45       exit_with_msg_and_exit_code("Internal error in find_Ex",INTERNAL_ERROR);
46     }
47   }
48   return(Ex);
49 }
50
51 double find_Ey(int i, int j)
52 {
53   double Ey=0.0;
54   unsigned char odd;
55   odd = oddity[i][j];
56
57   if(odd > CONDUCTOR_FLOATING) {
58
59     if (odd == TOP_LEFT_CORNER || odd == TOP_RIGHT_CORNER) 
60       Ey=Vij[i][1]-Vij[i][0];
61
62     else if (odd == BOTTOM_LEFT_CORNER || odd == BOTTOM_RIGHT_CORNER) 
63       Ey=Vij[i][height-1]-Vij[i][height-2];
64
65     else if (odd == ORDINARY_POINT_LEFT_EDGE || odd == ORDINARY_POINT_RIGHT_EDGE) 
66       Ey=0.5*(Vij[i][j+1]-Vij[i][j-1]);
67
68     else if (odd == ORDINARY_POINT_BOTTOM_EDGE) 
69       Ey=Vij[i][j+1]-Vij[i][j];
70
71     else if (odd == ORDINARY_POINT_TOP_EDGE) 
72       Ey=Vij[i][j]-Vij[i][j-1];
73
74     else if (odd == METAL_ABOVE || odd == METAL_ABOVE_AND_LEFT || odd == METAL_ABOVE_AND_RIGHT)
75       Ey=Vij[i][j+1]-Vij[i][j];
76
77     else if (odd == METAL_BELOW || odd == METAL_BELOW_AND_LEFT || odd == METAL_BELOW_AND_RIGHT)
78       Ey=Vij[i][j]-Vij[i][j-1];
79
80     else if(odd >= DIFFERENT_DIELECTRIC_LOCALLY || odd == ORDINARY_INTERIOR_POINT || odd == METAL_RIGHT || odd == METAL_LEFT)
81       Ey=0.5*(Vij[i][j+1]-Vij[i][j-1]);
82
83     else{
84       fprintf(stderr,"oddity[%d][%d]=%d\n",i,j,odd);
85       exit_with_msg_and_exit_code("Internal error in find_Ey",INTERNAL_ERROR);
86     }
87   }
88   return(Ey);
89 }
90
91 double find_E(int w, int h)
92 {
93   double Ex, Ey, E;
94   Ex=find_Ex(w,h);
95   Ey=find_Ey(w,h);
96   E=sqrt(Ex*Ex+Ey*Ey);
97   return(E);
98 }
99