Package com.opengamma.analytics.financial.model.finitedifference.applications

Source Code of com.opengamma.analytics.financial.model.finitedifference.applications.VariableCoefficientWaveEquationTest

/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.finitedifference.applications;

import org.apache.commons.lang.Validate;
import org.testng.annotations.Test;

import com.opengamma.analytics.financial.model.finitedifference.BoundaryCondition;
import com.opengamma.analytics.financial.model.finitedifference.ConvectionDiffusionPDE1DCoefficients;
import com.opengamma.analytics.financial.model.finitedifference.ConvectionDiffusionPDE1DStandardCoefficients;
import com.opengamma.analytics.financial.model.finitedifference.ConvectionDiffusionPDESolver;
import com.opengamma.analytics.financial.model.finitedifference.DirichletBoundaryCondition;
import com.opengamma.analytics.financial.model.finitedifference.ExponentialMeshing;
import com.opengamma.analytics.financial.model.finitedifference.MeshingFunction;
import com.opengamma.analytics.financial.model.finitedifference.PDE1DDataBundle;
import com.opengamma.analytics.financial.model.finitedifference.PDEFullResults1D;
import com.opengamma.analytics.financial.model.finitedifference.PDEGrid1D;
import com.opengamma.analytics.financial.model.finitedifference.ThetaMethodFiniteDifference;
import com.opengamma.analytics.math.FunctionUtils;
import com.opengamma.analytics.math.function.Function;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.surface.ConstantDoublesSurface;
import com.opengamma.analytics.math.surface.FunctionalDoublesSurface;
import com.opengamma.analytics.math.surface.Surface;

/**
*
*/
public class VariableCoefficientWaveEquationTest {

  private static final Surface<Double, Double, Double> A = ConstantDoublesSurface.from(-0.01);
  private static final Surface<Double, Double, Double> B;
  private static final Surface<Double, Double, Double> C = ConstantDoublesSurface.from(0);
  private static final ConvectionDiffusionPDE1DCoefficients COEFF;
  private static BoundaryCondition LOWER;
  private static BoundaryCondition UPPER;
  private static PDE1DDataBundle<ConvectionDiffusionPDE1DCoefficients> DATA;

  static {
    final Function<Double, Double> b = new Function<Double, Double>() {
      @Override
      public Double evaluate(final Double... tx) {
        Validate.isTrue(tx.length == 2);
        final double x = tx[1];
        return 0.2 + FunctionUtils.square(Math.sin(x - 1));
      }
    };

    final Function1D<Double, Double> initial = new Function1D<Double, Double>() {

      @Override
      public Double evaluate(final Double x) {
        return Math.exp(-100 * (x - 1) * (x - 1));
      }
    };

    B = FunctionalDoublesSurface.from(b);
    COEFF = new ConvectionDiffusionPDE1DStandardCoefficients(A, B, C);

    //Trefethen uses periodic boundary conditions
    LOWER = new DirichletBoundaryCondition(0, 0);
    UPPER = new DirichletBoundaryCondition(0, 2 * Math.PI);

    final int spaceSteps = 100;
    final double h = 2 * Math.PI / spaceSteps;
    final double dt = h / 2;
    final double tMax = 8;
    final int timeSteps = (int) (tMax / dt);

    final MeshingFunction timeMesh = new ExponentialMeshing(0, tMax, timeSteps + 1, 0);
    final MeshingFunction spaceMesh = new ExponentialMeshing(LOWER.getLevel(), UPPER.getLevel(), spaceSteps + 1, 0);//new HyperbolicMeshing(LOWER.getLevel(), UPPER.getLevel(), 1.0, spaceSteps + 1, 1.0);
    final PDEGrid1D grid = new PDEGrid1D(timeMesh, spaceMesh);

    DATA = new PDE1DDataBundle<>(COEFF, initial, LOWER, UPPER, grid);
  }

  @Test
      (enabled = false)
      public void test() {

    final ConvectionDiffusionPDESolver solver = new ThetaMethodFiniteDifference(1.0, true);
    final PDEFullResults1D res = (PDEFullResults1D) solver.solve(DATA);
    PDEUtilityTools.printSurface("wave", res);
  }
}
TOP

Related Classes of com.opengamma.analytics.financial.model.finitedifference.applications.VariableCoefficientWaveEquationTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.