62 lines
867 B
C++
62 lines
867 B
C++
#include <cmath>
|
|
#include "nr.h"
|
|
using namespace std;
|
|
|
|
void NR::sncndn(const DP uu, const DP emmc, DP &sn, DP &cn, DP &dn)
|
|
{
|
|
const DP CA=1.0e-8;
|
|
bool bo;
|
|
int i,ii,l;
|
|
DP a,b,c,d,emc,u;
|
|
Vec_DP em(13),en(13);
|
|
|
|
emc=emmc;
|
|
u=uu;
|
|
if (emc != 0.0) {
|
|
bo=(emc < 0.0);
|
|
if (bo) {
|
|
d=1.0-emc;
|
|
emc /= -1.0/d;
|
|
u *= (d=sqrt(d));
|
|
}
|
|
a=1.0;
|
|
dn=1.0;
|
|
for (i=0;i<13;i++) {
|
|
l=i;
|
|
em[i]=a;
|
|
en[i]=(emc=sqrt(emc));
|
|
c=0.5*(a+emc);
|
|
if (fabs(a-emc) <= CA*a) break;
|
|
emc *= a;
|
|
a=c;
|
|
}
|
|
u *= c;
|
|
sn=sin(u);
|
|
cn=cos(u);
|
|
if (sn != 0.0) {
|
|
a=cn/sn;
|
|
c *= a;
|
|
for (ii=l;ii>=0;ii--) {
|
|
b=em[ii];
|
|
a *= c;
|
|
c *= dn;
|
|
dn=(en[ii]+a)/(b+a);
|
|
a=c/b;
|
|
}
|
|
a=1.0/sqrt(c*c+1.0);
|
|
sn=(sn >= 0.0 ? a : -a);
|
|
cn=c*sn;
|
|
}
|
|
if (bo) {
|
|
a=dn;
|
|
dn=cn;
|
|
cn=a;
|
|
sn /= d;
|
|
}
|
|
} else {
|
|
cn=1.0/cosh(u);
|
|
dn=cn;
|
|
sn=tanh(u);
|
|
}
|
|
}
|