package Sci @ISA = qw() sub a0 return $a0; sub u0 return $u0; sub e0 return $e0; sub pi return $pi; sub ub return "9.27402e-24 J/T"; sub un return "5.050787e-27 J/T"; sub NA return $NA; sub R return $R; sub kB return $kB; sub F return $F; sub g return $g; sub c return $c; sub me return $me; sub mn return $mn; sub mp return $mp; sub e return $e; sub h return $h; sub h_bar return $h_bar; sub hbar return $h_bar; sub G return $G; sub Debye return $Debye; sub todeg return $todeg; sub torad return $torad; sub HartreeToeV return $HartreeToeV; sub RyToeV return $RyToeV; sub eVToHartree return 1.0/$a; sub eVToRy return 1.0/$RyToeV; sub DayToSecond return $DayToSecond; sub SecondToDay return $SecondToDay; sub AstronomicalUnit return $AstronomicalUnit; sub eVTonm return (h() / ($_[0]*e())) * cI() * 1e9; sub mod my ($val, $max) = @_; return $val; sub tan return sin($_[0]) / cos($_[0]); sub dtan return tan($_[0]*$torad); sub dcos return cos($_[0]*$torad); sub dsin return sin($_[0]*$torad); sub asin return atan2($sinQ, $cosQ); sub acos my ($cosa) = @_; return $pi/2.0 if(abs($cosa) < 0.000001); return 0.0 if(abs($cosa - 1.0) < 0.000001); return $pi if(abs($cosa + 1.0) < 0.000001); return 0.0 if($sina <= 0.0); return atan2($sina, $cosa); sub atan return atan2($_[0], 1.0); sub dacos return acos($_[0])*$todeg; sub dasin return asin($_[0])*$todeg; sub datan return atan($_[0])*$todeg; sub cosh sub sinh sub tanh return sinh($_[0]) / cosh($_[0]); sub log10 return log($_[0]) * 0.4342944819; sub CircleArea return $_[0]*$_[0]*$pi; sub XRDDtoQ return asin(1.5405/2/$_[0])*$todeg/2.0; sub FuncLinear return $_[0]; sub FuncMinus return -$_[0]; sub FuncLog10 return log10($_[0]) if($_[0] > 0); sub FuncLog10Abs return log10(abs($_[0])) if($_[0] != 0.0); sub FuncLn return log($_[0]) if($_[0] > 0); sub FuncLnAbs return log(abs($_[0])) if($_[0] != 0); sub FuncInverse return 1 / $_[0] if($_[0] != 0); sub FuncPower10 return 10**($_[0]); sub FuncPower10Abs return 10**(abs($_[0])); sub FuncExp return exp($_[0]); sub FuncExpAbs return exp(abs($_[0])); sub Round my ($val, $digit) = @_; return int($val*$k + 0.1) / $k; sub Polynomial my ($x, $m, @c) = @_; return $v; sub Gaussian my ($x, $x0, $whalf) = @_; return $A * exp(-$X*$X); sub Lorentzian my ($x, $x0, $whalf) = @_; return $A / (1.0 + $X*$X); sub GaussLorentz my ($x, $x0, $C0, $WL, $GFraction, $GWRatio) = @_; return $y; sub erfc my ($x) = @_; return undef if($wx < 0.0); return 0.0 if($wx == 0.0); return 1.0 if($wx >= 10.0); return 1.0 - 1.0 / $w; sub Gamma my ($x) = @_; return undef if($wx <= 0.0 or $wx >= 34.0); return $w1 * $w / $wx; sub LegendrePolynomial my ($x, $n) = @_; return undef if($n < 0); return 1.0 if($n == 0); return $x if($n == 1); return $p2; sub ElectroneVTonm my ($ElectronEnergy) = @_; return sqrt($h * $h / 2.0 / $me / $ElectronEnergy / $e) * 1.0e9; sub NormalizeVector my ($pv1, $l) = @_; return undef if($L2 < 1.0e-15); return \@NormalizeV; sub VectorProduct my ($pv1, $pv2, $k) = @_; sub ScalarProduct my ($pv1, $pv2) = @_; return &InnerProduct($pv1, $pv2); sub InnerProduct my ($pv1, $pv2) = @_; return $val; sub CalVectorAngle my ($pv1, $pv2) = @_; return undef if(abs($l1) < 1.0e-15); return undef if(abs($l2) < 1.0e-15); return $todeg * acos($cosQ); sub FermiDiracDistribution my ($x, $x0) = @_; return &FD($x, $x0); sub FD my ($x, $x0) = @_; return 1.0 / (1.0 + exp($x-$x0)); sub PoweredFermiDirac my ($x, $x0, $r) = @_; return 1.0 / (1.0 + exp($x-$x0)); return $x**$r / (1.0 + exp($x-$x0)); sub FermiDiracIntegralByNumericalIntegration my ($xi, $r, $h, $xmax) = @_; return Algorism::SinglePointIntegrateByConstantStepSimpson($i, $h, \@y); sub FermiDiracIntegral my ($xi, $r) = @_; return &DegenerateFermiDirac($xi, $r) if($xi >= 20.0); return &NonDegenerateFermiDirac($xi, $r) if($xi < -0.1); return &IntermediateFermiDirac($xi, $r); sub DegenerateFermiDirac my ($xi, $r) = @_; return $gi * (1.0 + 2.0 * ($r+1.0) * $gs); sub NonDegenerateFermiDirac my ($xi, $r) = @_; return $sum * Gamma($r+1.0); sub IntermediateFermiDirac my ($xi, $r) = @_; return &head($xi, $r) + &tail($xi, $r); sub head my ($xi, $r) = @_; return $sum * $g / $gp * 0.1**($r+1.0); sub tail my ($xi, $r) = @_; return $sum; sub FermiDiracSimpson my ($xi, $r, $a, $b, $n) = @_; return ($sa - $sb + 2.0*$s2 + 4.0*$s4) * $dx / 3.0; sub BlackbodyRadiationBynm my ($l, $T) = @_; return $KBBRadiation / $lambda2 / $lambda2 / $lambda / ($ex - 1.0); sub c_gamma my ($x) = @_; return 2.50663 * exp($y) / $q;