@Override
 public LevelSetApproximationAssemblier synchronizeClone() {
   LevelSetApproximationAssemblier result = new LevelSetApproximationAssemblier();
   result.setWeightFunction(weightFunction.synchronizeClone());
   result.setNodesNum(nodesNum);
   result.setDirichletNodesNum(dirichletNodesNum);
   result.prepare();
   return result;
 }
 @Override
 public void assembleVolume() {
   double aimFunc = load[0];
   double wholeWeight = weight * weightFunction.values(aimFunc, weightFunctionValue)[0];
   TDoubleArrayList shapeFunc = shapeFunctionValues[0];
   for (int i = 0; i < nodesAssemblyIndes.size(); i++) {
     int row = nodesAssemblyIndes.getQuick(i);
     double rowShapeFunc = shapeFunc.getQuick(i);
     mainVector.add(row, wholeWeight * aimFunc * rowShapeFunc);
     for (int j = 0; j < nodesAssemblyIndes.size(); j++) {
       int col = nodesAssemblyIndes.getQuick(j);
       if (isUpperSymmertric() && row > col) {
         continue;
       }
       double colShapeFunc = shapeFunc.getQuick(j);
       mainMatrix.add(row, col, wholeWeight * rowShapeFunc * colShapeFunc);
     }
   }
 }
 public void setWeightFunction(RadialFunctionCore weightFunction) {
   this.weightFunction = weightFunction;
   weightFunction.setDiffOrder(0);
 }