--- /dev/null
+#include "definitions.h"
+#include "exit_codes.h"
+
+extern double **Vij;
+extern unsigned char **oddity;
+extern double **Er;
+extern int width, height;
+
+double find_Ex(int i, int j)
+{
+ double Ex=0.0;
+ unsigned char odd;
+ odd = oddity[i][j];
+ if(odd > CONDUCTOR_FLOATING) {
+
+ if (odd == TOP_LEFT_CORNER || odd == BOTTOM_LEFT_CORNER)
+ Ex=Vij[0][j]-Vij[1][j];
+
+ else if (odd == TOP_RIGHT_CORNER || odd == BOTTOM_RIGHT_CORNER)
+ Ex=Vij[width-2][0]-Vij[width-1][0];
+
+ else if (odd == ORDINARY_POINT_TOP_EDGE || odd == ORDINARY_POINT_BOTTOM_EDGE)
+ Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
+
+ else if (odd == ORDINARY_POINT_LEFT_EDGE)
+ Ex=(Vij[i][j]-Vij[i+1][j]);
+
+ else if (odd == ORDINARY_POINT_RIGHT_EDGE)
+ Ex=(Vij[width-2][j]-Vij[width-1][j]);
+
+ else if(odd == METAL_LEFT || odd == METAL_BELOW_AND_LEFT || odd == METAL_ABOVE_AND_LEFT)
+ Ex=Vij[i][j]-Vij[i+1][j];
+
+ else if(odd == METAL_RIGHT || odd == METAL_ABOVE_AND_RIGHT || odd ==METAL_BELOW_AND_RIGHT)
+ Ex=Vij[i-1][j]-Vij[i][j];
+
+ else if (odd == ORDINARY_INTERIOR_POINT || odd == METAL_ABOVE || odd == METAL_BELOW)
+ Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
+
+ else if (odd >= DIFFERENT_DIELECTRIC_ABOVE_AND_RIGHT && odd < UNDEFINED_ODDITY )
+ Ex=0.5*(Vij[i-1][j]-Vij[i+1][j]);
+
+ else{
+ fprintf(stderr,"oddity[%d][%d]=%d\n",i,j,odd);
+ exit_with_msg_and_exit_code("Internal error in find_Ex",INTERNAL_ERROR);
+ }
+ }
+ return(Ex);
+}
+
+double find_Ey(int i, int j)
+{
+ double Ey=0.0;
+ unsigned char odd;
+ odd = oddity[i][j];
+
+ if(odd > CONDUCTOR_FLOATING) {
+
+ if (odd == TOP_LEFT_CORNER || odd == TOP_RIGHT_CORNER)
+ Ey=Vij[i][1]-Vij[i][0];
+
+ else if (odd == BOTTOM_LEFT_CORNER || odd == BOTTOM_RIGHT_CORNER)
+ Ey=Vij[i][height-1]-Vij[i][height-2];
+
+ else if (odd == ORDINARY_POINT_LEFT_EDGE || odd == ORDINARY_POINT_RIGHT_EDGE)
+ Ey=0.5*(Vij[i][j+1]-Vij[i][j-1]);
+
+ else if (odd == ORDINARY_POINT_BOTTOM_EDGE)
+ Ey=Vij[i][j+1]-Vij[i][j];
+
+ else if (odd == ORDINARY_POINT_TOP_EDGE)
+ Ey=Vij[i][j]-Vij[i][j-1];
+
+ else if (odd == METAL_ABOVE || odd == METAL_ABOVE_AND_LEFT || odd == METAL_ABOVE_AND_RIGHT)
+ Ey=Vij[i][j+1]-Vij[i][j];
+
+ else if (odd == METAL_BELOW || odd == METAL_BELOW_AND_LEFT || odd == METAL_BELOW_AND_RIGHT)
+ Ey=Vij[i][j]-Vij[i][j-1];
+
+ else if(odd >= DIFFERENT_DIELECTRIC_LOCALLY || odd == ORDINARY_INTERIOR_POINT || odd == METAL_RIGHT || odd == METAL_LEFT)
+ Ey=0.5*(Vij[i][j+1]-Vij[i][j-1]);
+
+ else{
+ fprintf(stderr,"oddity[%d][%d]=%d\n",i,j,odd);
+ exit_with_msg_and_exit_code("Internal error in find_Ey",INTERNAL_ERROR);
+ }
+ }
+ return(Ey);
+}
+
+double find_E(int w, int h)
+{
+ double Ex, Ey, E;
+ Ex=find_Ex(w,h);
+ Ey=find_Ey(w,h);
+ E=sqrt(Ex*Ex+Ey*Ey);
+ return(E);
+}
+