use Inline C => Config => CCFLAGS => '' => LIBS => '' => CC => 'gcc'; #use Inline C => Config => CCFLAGS => '' => LIBS => '' => CC => 'cl'; #use Inline C; 1; __DATA__ __C__ #include #include #include double TaucLorentz(double E, double e1inf, double e2inf, double A, double Eg, double En0, double C) { double pi = 3.1415926535; double e1TL, e2TL, e2Tauc, L; double EminusEg, EplusEg, aln, atan, gsi4, lnE, lnEngrt; double dEEg; double Eg2 = Eg * Eg; double En02 = En0* En0; double C2 = C * C; double alpha = sqrt(4.0 * En02 - C2); double gamma = sqrt(En02 - C2/2.0); double alpha2 = alpha * alpha; double gamma2 = gamma * gamma; double lnEn0g = log( (En02+Eg2+alpha*Eg) / (En02+Eg2-alpha*Eg) ); double atanEgaC = pi - atan2( (2.0*Eg+alpha)/C, 1.0 ) + atan2( (-2.0*Eg+alpha)/C, 1.0 ); double atangEg = pi + 2.0*atan2( 2.0 * (gamma2-Eg2) / alpha / C, 1.0 ); double E2 = E * E; e2TL = e2inf; if(E > Eg) { dEEg = E - Eg; e2Tauc = A * dEEg * dEEg / E / E; L = En0 * C * E / ( (E2-En02)*(E2-En02) + C2*E2 ); e2TL = e2inf + e2Tauc * L; } /* E == Egの場合、log(|E-Eg|)の2つの項が打ち消しあうので、|E-Eg|を1と置き換えても結果は変わらない */ EminusEg = 1.0; if(E != Eg) { EminusEg = fabs(E - Eg); } EplusEg = E + Eg; aln = (Eg2-En02) * E2 + Eg2*C2 - En02 * (En02 + 3.0*Eg2); atan = (E2-En02) * (En02+Eg2) + Eg2*C2; gsi4 = (E2-gamma2)*(E2-gamma2) + alpha2*C2/4.0; lnE = log( EminusEg / EplusEg ); lnEngrt = log( EminusEg * EplusEg / sqrt( (En02-Eg2)*(En02-Eg2) + Eg2*C2 ) ); e1TL = e1inf + (A*C/pi/gsi4) * (aln/2.0/alpha/En0) * lnEn0g - (A/pi/gsi4) * (atan/En0) * atanEgaC + 2.0 * (A*En0/pi/gsi4/alpha) * Eg * (E2-gamma2) * atangEg - (A*En0*C/pi/gsi4) * (E2+Eg2)/E * lnE + (2.0*A*En0*C/pi/gsi4) * Eg * lnEngrt; /* *pe1 = e1TL; *pe2 = e2TL; */ return e1TL; }