private void tanglu_struct(double rho, final double r[],
			final double gofr[], final double[] lambda, double[] epsilon,
			Data dat) {
		progress = 0;
		setProgress(0);

		beta = 1 / dat.temp;

		// final tanglu_constants tlc = new tanglu_constants();
		//
		final double[] depsilon = new double[epsilon.length];
		//
		depsilon[epsilon.length - 1] = epsilon[epsilon.length - 1];
		//
		// find delta epsilon
		for (int i = 0; i < epsilon.length - 1; i++)
			depsilon[i] = epsilon[i] - epsilon[i + 1];

		epsilon = depsilon;
		//
		// tlc.rho = rho;
		// tlc.eta = rho * Math.PI / 6.; // packing fraction
		// tlc.f = 3. + 3. * tlc.eta - Math.pow(tlc.eta, 2.);
		// tlc.yplus = Math.pow(1. + (Math.pow((1. + 2. * Math.pow(tlc.eta, 4.)
		// / Math.pow(tlc.f, 2.)), 0.5)), (1. / 3.));
		// tlc.yminus = Math
		// .pow(Math.abs(1. - (Math.pow((1. + 2. * Math.pow(tlc.eta, 4.)
		// / Math.pow(tlc.f, 2.)), 0.5))), (1. / 3.))
		// * -1.0;
		//
		// tlc.c = new Complex(0, 2. * Math.PI / 3.).exp();
		//
		// for (int i = 0; i <= 2; i++) {
		// tlc.t[i] = tsubi(i, tlc);
		// }

		for (int i = 0; i < r.length; i++) {
			if (r[i] < 1.0)
				gofr[i] = 0.0;
			else if (r[i] >= 10.0) {
				gofr[i] = 1.0;
			} else {
				gofr[i] = g0gmsa(r[i]);
			}
		}

		int threads = (Runtime.getRuntime().availableProcessors() + 1) / 2;
		ExecutorService e = Executors.newFixedThreadPool(threads);
		// for (int i = 0; i < r.length; i++) {
		// if (r[i] < 1.0)
		// gofr[i] = 0.0;
		// else {
		// final int ii = i;
		// e.execute(new Runnable() {
		//
		// public void run() {
		// gofr[ii] = g0gmsa(r[ii], tlc).real();
		// }
		// });
		// }
		// }
		// try {
		// e.shutdown();
		// e.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
		// } catch (InterruptedException e1) {
		// e1.printStackTrace();
		// }
		//
		// e = Executors
		// .newFixedThreadPool(threads > lambda.length ? lambda.length
		// : threads);
		for (int ja = 0; ja < lambda.length; ja++) {
			// final tanglu_constants tlcN = new tanglu_constants();
			// tlcN.c = tlc.c;
			// tlcN.eta = tlc.eta;
			// tlcN.f = tlc.f;
			// tlcN.rho = tlc.rho;
			// tlcN.t = tlc.t;
			// tlcN.yminus = tlc.yminus;
			// tlcN.yplus = tlc.yplus;
			final int j = ja;
			e.execute(new Runnable() {
				//
				@Override
				public void run() {
					double t;
					// for (int i = 0; i <= 2; i++) {
					// tlcN.a1[i] = a1(i, lambda[j], tlcN);
					// tlcN.a2[i] = a2(i, lambda[j], tlcN);
					// tlcN.a3[i] = a3(i, lambda[j], tlcN);
					//
					// }

					for (int i = 0; i < r.length; i++) {
						if (r[i] < 1.0)
							continue;
						t = Math.exp(g1sw(r[i], depsilon[j], lambda[j]));
						synchronized (gofr) {
							gofr[i] *= t;
						}
						if (r[i] >= 10.0)
							break;
					}
					synchronized (progress) {
						setProgress((int) ((double) (++progress)
								/ lambda.length * 100));
					}
				}

			});
		}
		try {
			e.shutdown();
			e.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		return;
	}