1 // ****************************************************************************** 2 // 3 // Title: Force Field X. 4 // Description: Force Field X - Software for Molecular Biophysics. 5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2024. 6 // 7 // This file is part of Force Field X. 8 // 9 // Force Field X is free software; you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License version 3 as published by 11 // the Free Software Foundation. 12 // 13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT 14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 // details. 17 // 18 // You should have received a copy of the GNU General Public License along with 19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple 20 // Place, Suite 330, Boston, MA 02111-1307 USA 21 // 22 // Linking this library statically or dynamically with other modules is making a 23 // combined work based on this library. Thus, the terms and conditions of the 24 // GNU General Public License cover the whole combination. 25 // 26 // As a special exception, the copyright holders of this library give you 27 // permission to link this library with independent modules to produce an 28 // executable, regardless of the license terms of these independent modules, and 29 // to copy and distribute the resulting executable under terms of your choice, 30 // provided that you also meet, for each linked independent module, the terms 31 // and conditions of the license of that module. An independent module is a 32 // module which is not derived from or based on this library. If you modify this 33 // library, you may extend this exception to your version of the library, but 34 // you are not obligated to do so. If you do not wish to do so, delete this 35 // exception statement from your version. 36 // 37 // ****************************************************************************** 38 package ffx.numerics.special; 39 40 import java.util.Arrays; 41 import java.util.Collection; 42 43 import ffx.utilities.FFXTest; 44 import org.junit.Assert; 45 import org.junit.Test; 46 import org.junit.runner.RunWith; 47 import org.junit.runners.Parameterized; 48 import org.junit.runners.Parameterized.Parameters; 49 50 /** @author Michael J. Schnieders */ 51 @RunWith(Parameterized.class) 52 public class ModifiedBesselTest extends FFXTest { 53 54 /** 55 * The implementation of the Modified 0th and 1st Order Bessel functions pass for a tolerance of 56 * 1.0e-15. 57 */ 58 private final String info; 59 private final double x; 60 private final double i0; 61 private final double i1; 62 private final double tolerance = 1e-15; 63 64 public ModifiedBesselTest(String info, double x, double i0, double i1) { 65 this.info = info; 66 this.x = x; 67 this.i0 = i0; 68 this.i1 = i1; 69 } 70 71 /** 72 * The expected values were found to 20 decimal points of precision using Mathematica: 73 * SetPrecision[BesselI[0, x], 20]] SetPrecision[BesselI[1, x], 20]] 74 */ 75 @Parameters 76 public static Collection<Object[]> data() { 77 return Arrays.asList( 78 new Object[][] { 79 {"Test 0.0", 0.0, 1.0, 0.0}, 80 {"Test 1.0", 1.0, 1.2660658777520081841, 0.56515910399248503460}, 81 {"Test -1.0", -1.0, 1.2660658777520081841, -0.56515910399248503460}, 82 {"Test 4.0", 4.0, 11.301921952136330773, 9.7594651537044505574}, 83 {"Test -4.0", -4.0, 11.301921952136330773, -9.7594651537044505574}, 84 {"Test 7.9", 7.9, 389.40628328215802867, 363.85394408450838455}, 85 {"Test -7.9", -7.9, 389.40628328215802867, -363.85394408450838455}, 86 {"Test 8.0", 8.0, 427.56411572180473968, 399.87313678256009553}, 87 {"Test -8.0", -8.0, 427.56411572180473968, -399.87313678256009553}, 88 {"Test 8.0001", 8.0001, 427.60410492344237809, 399.91089657459764339}, 89 {"Test -8.0001", -8.0001, 427.60410492344237809, -399.91089657459764339}, 90 {"Test 10.0", 10.0, 2815.7166284662530416, 2670.9883037012536988}, 91 {"Test -10.0", -10.0, 2815.7166284662530416, -2670.9883037012536988} 92 }); 93 } 94 95 /** Test of erf method, of class Erf. */ 96 @Test 97 public void testZeroOrderModifiedBessel() { 98 double actual = ModifiedBessel.i0(x); 99 Assert.assertEquals(info, i0 / actual, 1.0, tolerance); 100 } 101 102 /** Test of erfc method, of class Erf. */ 103 @Test 104 public void testFirstOrderModifiedBessel() { 105 double actual = ModifiedBessel.i1(x); 106 if (actual != 0.0) { 107 Assert.assertEquals(info, i1 / actual, 1.0, tolerance); 108 } else { 109 Assert.assertEquals(info, i1, actual, tolerance); 110 } 111 } 112 }