예제 #1
0
 public static void test5() {
   MathFunc f = FX.x * FX.y * FX.z + 1;
   System.out.println(f);
   System.out.println(f.getVarNames());
   System.out.println(f.apply(2, 3, 4));
   CompiledFunc cf = f.compile();
   System.out.println(cf.apply(2, 3, 4));
 }
예제 #2
0
  public static void test1() {
    MathFunc x = FX.x;
    MathFunc y = FX.y;
    MathFunc xy = x.S(y);

    FuncClassLoader<CompiledFunc> fcl = new FuncClassLoader<CompiledFunc>();
    ClassGen genClass = BytecodeUtils.genClass(xy, null, "add", true, false);
    CompiledFunc fxy = fcl.newInstance(genClass);
    System.out.println(fxy.apply(1.0, 2.0));

    System.out.println(xy.compile(new String[] {"y", "x"}).apply(1.0, 2.0));
  }
예제 #3
0
  public static void test7() {
    FSin sin = new FSin();
    MathFunc fun = FMath.pow(sin, 2);
    System.out.println(fun.toString());
    System.out.println(fun.diff("x"));

    System.out.println(FMath.sqrt(sin));
    System.out.println(FMath.sqrt(sin).diff("x"));

    FSqrt sqrt = new FSqrt();
    System.out.println(sqrt.compile().apply(16));
    System.out.println(FMath.sqrt(FX.x).compile().apply(16));
  }
예제 #4
0
  public static void test4() {
    FSin sin = new FSin("x");
    FCos cos = new FCos("y");
    MathFunc f = sin * cos;
    System.out.println(f);
    System.out.println(f.getVarNames());
    System.out.println(f.apply(Math.PI / 2, Math.PI / 4));

    CompiledFunc cf = f.compile();
    System.out.println(cf.apply(Math.PI / 2, Math.PI / 4));
    // bug in order of args
    System.out.println(f.compile(new String[] {"y", "x"}).apply(Math.PI / 2, Math.PI / 4));
  }
예제 #5
0
  /**
   * 构造下列形函数中的一个: N1 = L1 = r N2 = L2 = s N3 = L3 = t
   *
   * @param funID = 1,2,3
   */
  public void Create(int funID, double coef) {
    funIndex = funID - 1;
    if (funID < 1 || 3 < funID) {
      throw new FutureyeException("ERROR: funID should be 1,2 or 3.");
    }

    this.varNames = new String[] {"r", "s", "t"};
    innerVarNames = new ObjList<String>("x", "y");

    // Compose function: r = r(x,y), s = s(x,y), t = t(x,y)
    Map<String, MathFunc> fInners = new HashMap<String, MathFunc>();
    final String varName = varNames[funIndex];
    fInners.put(
        varName,
        new AbstractMathFunc(innerVarNames.toList()) {
          public MathFunc diff(String var) {
            if (area < 0.0) {
              throw new FutureyeException("Check nodes order: area < 0.0");
            } else {
              if (varName.equals("r")) { // r对应三角形高h的负倒数
                if (var.equals("x")) return new FC(b[0] / (2 * area));
                if (var.equals("y")) return new FC(c[0] / (2 * area));
              } else if (varName.equals("s")) { // s对应三角形高h的负倒数
                if (var.equals("x")) return new FC(b[1] / (2 * area));
                if (var.equals("y")) return new FC(c[1] / (2 * area));
              } else if (varName.equals("t")) { // t对应三角形高h的负倒数
                if (var.equals("x")) return new FC(b[2] / (2 * area));
                if (var.equals("y")) return new FC(c[2] / (2 * area));
              }
            }
            return null;
          }

          @Override
          public double apply(double... args) {
            throw new UnsupportedOperationException();
          }
        });

    // 使用复合函数构造形函数
    funOuter = new SF123();
    this.coef = coef;
    funCompose = FC.c(this.coef).M(funOuter.compose(fInners));
    funCompose.setActiveVarNames(funOuter.getVarNames());
  }
예제 #6
0
  public static void testSFBilinearLocal2D() {
    NodeList nodes = new NodeList();
    nodes.add(new Node(1, -2.0, -2.0));
    nodes.add(new Node(2, 2.0, -2.0));
    nodes.add(new Node(3, 2.0, 2.0));
    nodes.add(new Node(4, -2.0, 2.0));
    Element e = new Element(nodes);

    System.out.println("Test coordinate transform and Jacbian on element " + e);
    CoordinateTransform trans = new CoordinateTransform(2);
    trans.transformLinear2D(e);
    trans.computeJacobianMatrix();
    trans.computeJacobian2D();
    MathFunc jac = trans.getJacobian();
    Variable v = new Variable();
    v.set("r", 0);
    v.set("s", 0);
    check(jac.toString(), jac.apply(v), 4.0);

    ScalarShapeFunction[] shapeFun = new ScalarShapeFunction[4];
    shapeFun[0] = new SFBilinearLocal2D(1);
    shapeFun[1] = new SFBilinearLocal2D(2);
    shapeFun[2] = new SFBilinearLocal2D(3);
    shapeFun[3] = new SFBilinearLocal2D(4);

    System.out.println("Test the evaluation of SFBilinearLocal2D:");
    double[] args = new double[] {0.1, 0.1};
    Variable v0 = new Variable();
    v0.set("r", args[0]);
    v0.set("s", args[1]);
    System.out.println(shapeFun[0]);
    check(shapeFun[0].toString(), shapeFun[0].apply(v0), 0.2025);
    check(shapeFun[0].toString(), shapeFun[0].apply(args), 0.2025);
    check(shapeFun[0].toString(), shapeFun[0].compile().apply(args), 0.2025);

    System.out.println("Test the derivatives of shape function SFBilinearLocal2D:");
    e.updateJacobin();
    double[] rlt = new double[] {-0.125, -0.125, 0.125, -0.125, 0.125, 0.125, -0.125, 0.125};
    int j = 0;
    for (int i = 0; i < 4; i++) {
      System.out.println(shapeFun[i]);
      shapeFun[i].assignElement(e);
      MathFunc SFdx = shapeFun[i].diff("x");
      MathFunc SFdy = shapeFun[i].diff("y");
      check("shapeFun[" + i + "].diff(\"x\")=" + SFdy, SFdx.apply(v), rlt[j++]);
      check("shapeFun[" + i + "].diff(\"y\")=" + SFdy, SFdy.apply(v), rlt[j++]);
    }
  }
예제 #7
0
  public static void test2() {
    MathFunc x = FX.x;
    MathFunc y = FX.y;
    MathFunc xy = x.M(y);
    System.out.println(xy);
    HashMap<String, MathFunc> map = new HashMap<String, MathFunc>();
    map.put(x.getVarNames().get(0), FX.r.A(FX.s));
    map.put(y.getVarNames().get(0), FX.r.S(FX.s));
    MathFunc xy2 = xy.compose(map);
    System.out.println(xy2);

    System.out.println(FX.r.A(FX.s).M(FX.r.S(FX.s)));

    FuncClassLoader<CompiledFunc> fcl = new FuncClassLoader<CompiledFunc>();
    ClassGen genClass = BytecodeUtils.genClass(xy2, null, "add2", true, false);
    CompiledFunc fxy2 = fcl.newInstance(genClass);
    System.out.println(fxy2.apply(4.0, 2.0));
  }
예제 #8
0
 public String toString() {
   if (this.coef < 1.0) return this.coef + "*" + funOuter.toString();
   else return funOuter.toString();
 }
예제 #9
0
 @Override
 public double[] applyAll(VariableArray v, Map<Object, Object> cache) {
   return funCompose.applyAll(v, cache);
 }
예제 #10
0
 public double apply(Variable v) {
   return funCompose.apply(v);
 }
예제 #11
0
 public MathFunc diff(String varName) {
   return funCompose.diff(varName);
 }
예제 #12
0
  /**
   * 构造下列形函数中的一个: Ni = (1+r*ri)*(1+s*si)*(1+t*ti)/8 where (ri,si,ti),i=1,...,8 are vertices
   * coordinate of the hexahedron
   *
   * @param funID = 1,...,8
   */
  public void Create(int funID, double coef) {
    funIndex = funID - 1;
    if (funID < 1 || funID > 8) {
      System.out.println("ERROR: funID should be 1,...,8.");
      return;
    }

    varNames.add("r");
    varNames.add("s");
    varNames.add("t");
    innerVarNames = new ObjList<String>("x", "y", "z");

    // 复合函数
    Map<String, MathFunc> fInners = new HashMap<String, MathFunc>(4);

    for (final String varName : varNames) {
      fInners.put(
          varName,
          new AbstractMathFunc(innerVarNames.toList()) {

            // r_x,r_y,r_z, s_x,s_y,s_z, t_x,t_y,t_z
            public MathFunc diff(String var) {
              /**
               * f(x,y,z) = g(r,s,t) f_x = g_r*r_x + g_s*s_x + g_t*t_x ---(1) f_y = g_r*r_y +
               * g_s*s_y + g_t*t_y ---(2) f_z = g_r*r_z + g_s*s_z + g_t*t_z ---(3)
               *
               * <p>for (1) let f=x,f=y,f=z we get 3 equations, solve them: (x_r x_s x_t) (r_x) (1)
               * (y_r y_s y_z) * (s_x) = (0) (z_r z_s z_t) (t_x) (0)
               *
               * <p>similarly, for (2): (x_r x_s x_t) (r_y) (0) (y_r y_s y_z) * (s_y) = (1) (z_r z_s
               * z_t) (t_y) (0)
               *
               * <p>for (3): (x_r x_s x_t) (r_z) (0) (y_r y_s y_z) * (s_z) = (0) (z_r z_s z_t) (t_z)
               * (1)
               *
               * <p>(x_r x_s x_t) Let J = (y_r y_s y_z) (z_r z_s z_t)
               *
               * <p>from the above 9 equations, we have: (r_x r_y r_z) (s_x s_y s_z) = inv(J) (t_x
               * t_y t_z)
               */
              return new InvJ(varName, var);
            }

            @Override
            public double apply(Variable v) {
              // TODO Auto-generated method stub
              return 0;
            }
          });
    }

    //		funOuter = new FAxpb("r",vt[funIndex][0]/2.0,0.5).M(
    //				   new FAxpb("s",vt[funIndex][1]/2.0,0.5)).M(
    //				   new FAxpb("t",vt[funIndex][2]/2.0,0.5));
    // 速度提高1倍
    funOuter = new FOuter(varNames, funIndex);

    // 使用复合函数构造形函数
    this.coef = coef;
    funCompose = FC.c(this.coef).M(funOuter.compose(fInners));
  }
예제 #13
0
  public static void testSFLinearLocal2D() {
    NodeList nodes = new NodeList();
    nodes.add(new Node(1, 0.0, 0.0));
    nodes.add(new Node(2, 0.2, 0.0));
    nodes.add(new Node(3, 0.0, 0.2));
    Element e = new Element(nodes);

    System.out.println("Test coordinate transform and Jacbian on element " + e);
    CoordinateTransform trans = new CoordinateTransform(2);
    trans.transformLinear2D(e);
    trans.computeJacobianMatrix();
    trans.computeJacobian2D();
    MathFunc jac = trans.getJacobian();
    Variable v = new Variable();
    v.set("r", 0);
    v.set("s", 0);
    check(jac.toString(), jac.apply(v), 0.04);

    ScalarShapeFunction[] shapeFun = new ScalarShapeFunction[3];
    shapeFun[0] = new SFLinearLocal2DRS(1);
    shapeFun[1] = new SFLinearLocal2DRS(2);
    shapeFun[2] = new SFLinearLocal2DRS(3);

    System.out.println("Test the derivatives of shape function SFLinearLocal2DRS:");
    double[] rlt = new double[] {-5, -5, 5, 0, 0, 5};
    int j = 0;
    for (int i = 0; i < 3; i++) {
      System.out.println(shapeFun[i]);
      shapeFun[i].assignElement(e);
      MathFunc SFdx = shapeFun[i].diff("x");
      MathFunc SFdy = shapeFun[i].diff("y");
      check("shapeFun[" + i + "].diff(\"x\")", SFdx.apply(), rlt[j++]);
      check("shapeFun[" + i + "].diff(\"y\")", SFdy.apply(), rlt[j++]);
    }

    System.out.println("Test the derivatives of shape function SFLinearLocal2D:");
    shapeFun[0] = new SFLinearLocal2D(1);
    shapeFun[1] = new SFLinearLocal2D(2);
    shapeFun[2] = new SFLinearLocal2D(3);
    j = 0;
    for (int i = 0; i < 3; i++) {
      System.out.println(shapeFun[i]);
      shapeFun[i].assignElement(e);
      MathFunc SFdx = shapeFun[i].diff("x");
      MathFunc SFdy = shapeFun[i].diff("y");
      check("shapeFun[" + i + "].diff(\"x\")=" + SFdy, SFdx.apply(v), rlt[j++]);
      check("shapeFun[" + i + "].diff(\"y\")=" + SFdy, SFdy.apply(v), rlt[j++]);
    }
  }
예제 #14
0
 public String toString() {
   return "N" + (funIndex + 1) + "(r,s,t) = " + funOuter.getExpr();
 }