private static double CalcCompliance(int WX, int WY, int penal, KXMSolvers kx, double[] Rd1, double[] U) { var ke = kx.KE; double c = 0.0; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(Rd1[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; } } return(c); }
}/**/ for (int inner = 0; inner < 1; inner++) { var Ukx = skx.FE_inded(WX, WY, g.Genom, SelectedUs, penal); var ke = skx.KE; double c = 0.0; double[] dc = new double[WX * WY]; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = Ukx[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; dc[ely + elx * WY] = -penal *Math.Pow(g.Genom[ely + elx * WY], penal - 1) * UEKUE; } } dc = skx.Check(WX, WY, 1.5, g.Genom, dc); g.Genom = skx.OC(WX, WY, g.Genom, volfraq, dc); } return(AFC.ToArray()); } public static double[] Test_eval_simp(Genome <double> g, int WX, int WY, double volfraq, double f1, double f2, double f3) { double[] retval = new double[1]; int penal = 3; KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, g.Genom, penal); var ke = skx.KE; double c = 0.0; double[] dc = new double[WX * WY]; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; dc[ely + elx * WY] = -penal *Math.Pow(g.Genom[ely + elx *WY], penal - 1) * UEKUE; } } dc = skx.Check(WX, WY, 1.5, g.Genom, dc); g.Genom = skx.OC(WX, WY, g.Genom, volfraq, dc); double sumV = 0; foreach (var gg in g.Genom) { sumV += (double)gg; } sumV = sumV - WX * WY * volfraq; retval[0] = c; return(retval); } public static double Test_eval(Genome <double> g, int WX, int WY, double volfraq) { double retval = 0.0f; int penal = 3; KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, g.Genom, penal); var ke = skx.KE; double c = 0.0; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; } } // g.Genom = skx.Check(WX, WY, 1.5, g.Genom); double sumV = 0; foreach (var gg in g.Genom) { sumV += (double)gg; } sumV = sumV - WX * WY * volfraq; retval = c * c + sumV * sumV * 2.0; return(retval); } /**/ public static double Test_eval_weave(Genome <int> g, int WX, int WY, double volfraq) { double retval = 0; int penal = 3; var ge = convertWeaverToField(g, WX, WY); KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, ge, penal); var ke = skx.KE; double c = 0.0; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(ge[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; } } double sumV = ge.Sum(); sumV = sumV - (double)(WX * WY) * volfraq; retval = c * c * 1.0 + sumV * sumV * 0.0; return(retval); }