// test_nuderiv2dg2_tri.java test nuderiv2dg2 with 28 points // order 1 minimum points 3 // order 2 minimum points 6 // order 3 minimum points 10 // order 4 minimum points 15 // order 5 minimum points 28 // going beyond minimum points does not help much import java.io.*; class test_nuderiv2dg2_tri { // variables for reading triangles static String root; // root name for .tri, .coord, .bound final int sz = 512; final int szsz = 1024; int debug = 0; int ntri; // number of triangles int minvert; // minimum vertex number, reduced to zero int t1[] = new int[sz]; // vertex numbers on triangles int t2[] = new int[sz]; // vertex numbers on triangles int t3[] = new int[sz]; // vertex numbers on triangles int ncoord; // number of coordinates, also equals nvert double xc[] = new double[sz]; // coordinates in vertex order double yc[] = new double[sz]; // coordinates in vertex order int b1[] = new int[sz]; // dirichlet boundary edge vertices int b2[] = new int[sz]; // dirichlet boundary edge vertices double xmin, xmax, ymin, ymax; // determined by input double kg[] = new double[szsz]; // global stiffness matrix double fg[] = new double[sz]; // right hand side, forcing function double ug[] = new double[sz]; // solution computed by fem double Ua[] = new double[sz]; // known solution for checking int uniquev[] = new int[sz]; // all vertices int nvert; // number of unique vertices int uniqueb[] = new int[sz]; // bound vertices int nbound; // number of boundary vertices int uniquef[] = new int[sz]; // free vertices, 0 to nfree-1 int nfree; // degrees of freedom nvert-nbound int nuniquev, nuniqueb, nuniquef; // vertices counts test_nuderiv2dg2_tri() { int debug = 0; int i, j, n; int m = 0; int order = 3; int stat; final int siz = 1024; double x[] = new double[siz]; double y[] = new double[siz]; double U[] = new double[siz]; double est, actual, dx, dy; int ip[] = new int[36]; double cx[] = new double[36]; double cy[] = new double[36]; double cxx[] = new double[36]; double cxy[] = new double[36]; double cyy[] = new double[36]; double cxxx[] = new double[36]; double cxxy[] = new double[36]; double cxyy[] = new double[36]; double cyyy[] = new double[36]; double error, maxerror; nuderiv2dg N = new nuderiv2dg(); System.out.println("test_nuderiv2dg2_tri.java running"); stat = do_input(); if(stat != 0) System.exit(1); // can not continue n = ncoord; // initialize vertices for(i=0; i2) System.out.println("finding unique of nold="+nold); sortint(nold,a); j=0; for(i=1; ia[i-1]) { j++; a[j]=a[i]; } } j++; if(debug>2) System.out.println("found unique of n="+j); return j; } // end uniqueint void sortint(int n, int a[]) { int i, j, temp; for(i=0; ia[j]) {temp=a[i]; a[i]=a[j]; a[j]=temp;} } // end sortint int freevert(int c[], int na, int a[], int nb, int b[]) { // a and b sorted integer arrays, c will be from a, not in b int ia=0; int ib=0; int ic=0; if(debug>2) System.out.println("freevert na="+na+", nb="+nb); while(true) { if(ib>=nb || a[ia]!=b[ib]) {c[ic]=a[ia]; ic++; ia++;} else {ia++; ib++;} if(ia>=na) break; } if(debug>2) System.out.println("freevert nc free = "+ic); return ic; } boolean not_in(int i, int a[], int n) { boolean found = false; int j; for(j=0; j2) System.out.println("about to read triangles from "+fname); ntri=0; minvert=999999; nvert=0; try { BufferedReader in = new BufferedReader(new FileReader(fname)); String input_line; input_line = in.readLine(); while(input_line != null) { if(debug>0) System.out.println(input_line); // have a line, extract 3 integers len = input_line.length(); if(len<5) // not enough data, ignore blank lines { input_line = in.readLine(); continue; } index = 0; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); t1[ntri] = Integer.parseInt(input_line.substring(index,last)); index = last+1; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); t2[ntri] = Integer.parseInt(input_line.substring(index,last)); index = last+1; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); if(last<1) last = len; t3[ntri] = Integer.parseInt(input_line.substring(index,last)); if(debug>0) System.out.println("tri "+ntri+" has vertices "+t1[ntri]+ " "+t2[ntri]+" "+t3[ntri]); if(t1[ntri]>nvert) nvert=t1[ntri]; if(t2[ntri]>nvert) nvert=t2[ntri]; if(t3[ntri]>nvert) nvert=t3[ntri]; if(t1[ntri]0) System.out.println(ntri+" triangles read from "+fname); nvert=nvert+1-minvert; // still must be dense sequence of numbers nuniquev=0; for(int i=0; i2) System.out.println("about to read boundary from "+fname); nbound=0; try { BufferedReader in = new BufferedReader(new FileReader(fname)); String input_line; input_line = in.readLine(); while(input_line != null) { // have a line, extract 2 integers len = input_line.length(); if(len<4) // not enough data, ignore blank lines { input_line = in.readLine(); continue; } index = 0; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); b1[nbound] = Integer.parseInt(input_line.substring(index,last)); index = last+1; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); if(last<1) last = len; b2[nbound] = Integer.parseInt(input_line.substring(index,last)); if(debug>0) System.out.println("boundary segment nbound="+nbound+ " has vertices "+b1[nbound]+", "+b2[nbound]); if(b1[nbound]>nvert) System.out.println("bad boundary vertex "+ b1[nbound]); if(b2[nbound]>nvert) System.out.println("bad boundary vertex "+ b2[nbound]); if(b1[nbound]0) System.out.println("read Dirichlet boundaries from "+fname); nuniqueb=0; for(int i=0; i0) for(int i=0; i0) System.out.println("number of free vertices is "+nuniquef); if(debug>0) for(int i=0; i2) System.out.println("about to read coordinates from "+ fname); ncoord=0; try { BufferedReader in = new BufferedReader(new FileReader(fname)); String input_line; input_line = in.readLine(); while(input_line != null) { // have a line, extract 2 double len = input_line.length(); if(len<5) // not enough data, ignore blank lines { input_line = in.readLine(); continue; } index = 0; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); xc[ncoord] = Double.parseDouble(input_line.substring(index,last)); index = last+1; while(input_line.substring(index,index+1).equals(" ")){index++;} last = input_line.indexOf(' ',index+1); if(last<1) last = len; yc[ncoord] = Double.parseDouble(input_line.substring(index,last)); if(debug>0) System.out.println("coordinate "+ncoord+" at "+ xc[ncoord]+", "+yc[ncoord]); if(ncoord==0) { xmax=xc[ncoord]; xmin=xc[ncoord]; ymax=yc[ncoord]; ymin=yc[ncoord]; } if(xc[ncoord]>xmax) xmax=xc[ncoord]; if(xc[ncoord]ymax) ymax=yc[ncoord]; if(yc[ncoord]0) System.out.println("coordinates read from "+fname); if(ncoord!=nvert) System.out.println("**** wrong number of coordinates="+ncoord+ ", should be"+nvert); nfree=nvert-nuniqueb; // make free vertices first if(debug>0) { System.out.println("vertex, x, y before free first"); for(int i=0; i0) root=args[0]; new test_nuderiv2dg2_tri(); } } // end class test_nuderiv2dg2_tri