public static int createModelFromString(FemCore femCore, String input) {

    int bandwidthExpected = 0;

    final List<Node> temporaryNodes = new LinkedList<Node>();
    temporaryNodes.add(new Node());

    final List<Integer[]> temporaryElements = new LinkedList<Integer[]>();
    temporaryElements.add(new Integer[5]);

    final String[] lines = input.toString().split("\\n");
    for (final String line : lines) {
      if (!line.trim().isEmpty()) {
        final String[] args = line.split(",");
        if (0 == args[0].trim().compareToIgnoreCase("N")) {
          femCore.incementNumberOfNodes();
          final int number = Integer.valueOf(args[1].trim());
          for (int index = temporaryNodes.size(); index <= number; index++) {
            temporaryNodes.add(new Node());
          }

          final Integer first = Integer.valueOf(args[2].trim());
          final Integer second = Integer.valueOf(args[3].trim());

          temporaryNodes.get(number).x = first;
          temporaryNodes.get(number).y = second;
        }
        if (0 == args[0].trim().compareToIgnoreCase("E")) {
          femCore.incementNumberOfElements();
          final int number = Integer.valueOf(args[1].trim());
          for (int index = temporaryElements.size(); index <= number; index++) {
            temporaryElements.add(new Integer[5]);
          }

          final Integer first = Integer.valueOf(args[2].trim());
          final Integer second = Integer.valueOf(args[3].trim());
          final Integer third = Integer.valueOf(args[4].trim());

          temporaryElements.get(femCore.getNumberOfElements())[1] = number;
          temporaryElements.get(femCore.getNumberOfElements())[2] = first;
          temporaryElements.get(femCore.getNumberOfElements())[3] = second;
          temporaryElements.get(femCore.getNumberOfElements())[4] = third;

          final int max = Math.max(Math.max(first, second), third);
          final int min = Math.min(Math.min(first, second), third);
          final int bandwidthOfElement = (1 + max - min) * 2;
          bandwidthExpected = Math.max(bandwidthExpected, bandwidthOfElement);
        }
        if (0 == args[0].trim().compareToIgnoreCase("D")) {

          if (femCore.getInputDisplacements() == null) {
            femCore.resetInputDisplacements();
          }

          final int number = Integer.valueOf(args[1].trim());
          if (0 == args[2].trim().compareToIgnoreCase("x")) {
            femCore.setInputDisplacementX(number, Double.valueOf(args[3].trim()));
          }
          if (0 == args[2].trim().compareToIgnoreCase("y")) {
            femCore.setInputDisplacementY(number, Double.valueOf(args[3].trim()));
          }
        }
        if (0 == args[0].trim().compareToIgnoreCase("F")) {

          if (femCore.getInputForces() == null) {
            femCore.resetInputForces();
          }

          final int number = Integer.valueOf(args[1].trim());
          if (0 == args[2].trim().compareToIgnoreCase("x")) {
            femCore.setNodeForceX(number, Double.valueOf(args[3].trim()));
          }
          if (0 == args[2].trim().compareToIgnoreCase("y")) {
            femCore.setNodeForceY(number, Double.valueOf(args[3].trim()));
          }
        }
      }
    }

    femCore.initRest();

    for (int i = 1; i <= femCore.getNumberOfElements(); i++) {
      femCore.setNodeIdByElementIdX(
          temporaryElements.get(i)[1], 1, temporaryNodes.get(temporaryElements.get(i)[2]).x);
      femCore.setNodeIdByElementIdX(
          temporaryElements.get(i)[1], 2, temporaryNodes.get(temporaryElements.get(i)[3]).x);
      femCore.setNodeIdByElementIdX(
          temporaryElements.get(i)[1], 3, temporaryNodes.get(temporaryElements.get(i)[4]).x);

      femCore.setNodeIdByElementIdY(
          temporaryElements.get(i)[1], 1, temporaryNodes.get(temporaryElements.get(i)[2]).y);
      femCore.setNodeIdByElementIdY(
          temporaryElements.get(i)[1], 2, temporaryNodes.get(temporaryElements.get(i)[3]).y);
      femCore.setNodeIdByElementIdY(
          temporaryElements.get(i)[1], 3, temporaryNodes.get(temporaryElements.get(i)[4]).y);

      femCore.setNodeIdByElementIdnodeID(
          temporaryElements.get(i)[1], 1, temporaryElements.get(i)[2]);
      femCore.setNodeIdByElementIdnodeID(
          temporaryElements.get(i)[1], 2, temporaryElements.get(i)[3]);
      femCore.setNodeIdByElementIdnodeID(
          temporaryElements.get(i)[1], 3, temporaryElements.get(i)[4]);
    }
    System.out.println(
        "default model created    [nodes="
            + femCore.getNumberOfNodes()
            + ", elements="
            + femCore.getNumberOfElements()
            + ", bandwidth="
            + bandwidthExpected
            + "]");
    return bandwidthExpected;
  }
  public static String getJSON(FemCore model, double beta, double gamma) {

    final double start = System.currentTimeMillis();

    final int numberOfNodes = model.getNumberOfNodes();
    final int numberOfElements = model.getNumberOfElements();

    // Set new gravity forces
    if (Math.abs(beta) >= 0.1 || Math.abs(gamma) >= 0.1) {

      double xForce = 2000.0 * Math.sin(-beta / 180 * Math.PI) / numberOfNodes;
      double yForce = 2000.0 * Math.sin(-gamma / 180 * Math.PI) / numberOfNodes;

      final double[] newinputForces = new double[numberOfNodes * 2];
      for (int nodeId = 1; nodeId <= numberOfNodes; nodeId++) {
        if (!model.isNodeHorzontallyFixed(nodeId)) {
          newinputForces[nodeId * 2 - 1] = xForce;
        } else {
          newinputForces[nodeId * 2 - 1] = 0.0;
        }

        if (!model.isNodeVerticallyFixed(nodeId)) {
          newinputForces[nodeId * 2 - 2] = yForce;
        } else {
          newinputForces[nodeId * 2 - 2] = 0.0;
        }
      }
      model.solveLinearEquations(newinputForces);
    } else {
      model.solveLinearEquations(null);
    }

    final HashMap<Integer, Boolean> nodeIds = new HashMap<Integer, Boolean>();
    final StringBuilder pre = new StringBuilder("[");
    for (int elementId = 1; elementId <= numberOfElements; elementId++) {
      pre.append("[");
      for (int cornerId = 1; cornerId < 4; cornerId++) {
        final int nodeId = model.getNodeIdByElementId(elementId, cornerId);
        pre.append("\n{\"id\": ")
            .append(
                nodeId //
                )
            .append(", \"x_force\" : ")
            .append(
                model.getSolutionNodeForceX(nodeId) //
                )
            .append(", \"y_force\" : ")
            .append(
                model.getSolutionNodeForceY(nodeId) //
                )
            .append(", \"x_d\" : ")
            .append(
                model.getSolutionNodeDisplacementX(nodeId) //
                )
            .append(", \"y_d\" : ")
            .append(
                model.getSolutionNodeDisplacementY(nodeId) //
                )
            .append(", \"x_fixed\" : ")
            .append(
                model.isNodeVerticallyFixed(nodeId) //
                )
            .append(", \"y_fixed\" : ")
            .append(
                model.isNodeHorzontallyFixed(nodeId) //
                )
            .append(", \"x\" : ")
            .append(
                model.getNodeIdByElementIdX(elementId, cornerId) //
                )
            .append(", \"y\" : ")
            .append(
                model.getNodeIdByElementIdY(elementId, cornerId) //
                )
            .append(", \"deltaArea\" : ")
            .append(
                model.getSolutionsDisplacementsMeanX(elementId) //
                )
            .append("  }\n");
        if (cornerId <= 3) {
          pre.append(',');
        }
        nodeIds.put(nodeId, true);
      }
      pre.append("]");
      if (elementId < numberOfElements + 1) {
        pre.append(',');
      }
    }
    pre.append("]");
    final double end = System.currentTimeMillis();
    System.out.println("json created             [" + (end - start) + "ms]");

    return pre.toString();
  }