/********************************************************************/ /* Copyright (c) 2017 System fugen G.K. and Yuzi Mizuno */ /* All rights reserved. */ /********************************************************************/ #ifndef _MGDefint_HH_ #define _MGDefint_HH_ /** @defgroup ALGORITHM (Template) Functions or classes. * @{ */ #include #include "mg/defintArea.h" /** * @brief Integrate f(x)(l=0) or F(x)(l=1, see below) over finite interval (a,b). * The DE formula (double exponential formula) is applied. * *Note* Original Fortran program codes are from DEFINT of the book * "Fortran77による数値計算ソフトウェア" by M.Sugihara, M.Mori, published by Maruzen K.K. * * @retval integral of f(x)(when l=0) or F(x)(when l=1). */ template double mgDefint( func& f,///=eps0) epsv = eps; else epsv = eps0; double epsq = sqrt(epsv) * .2; d = a0[l] * fac + shfp; double vnew = f(d) * b0; /* ---- initial step ---- */ /* integrate with mesh size = 0.5 and check decay of integrand */ double h = .5; int is=1; is=is<=nend : i<=nend; i+=im){ if(km<=1){ d = am[i+id]*fac + shfm; wm = f(d) * bb[i-1]; vnew += wm; if(fabs(wm)<=epsv){ ++km; if (km >= 2) nm = i - im; }else km = 0; } if (kp<=1) { d = ap[i+id]*fac + shfp; wp = f(d) * bb[i-1]; vnew += wp; if(fabs(wp)<=epsv){ ++kp; if (kp>=2) np=i-im; }else kp = 0; } if(km==2 && kp==2) break; } double epsm = 0., epsp = 0.; if (nm == 0) { nm = nend; epsm = sqrt(fabs(wm)); } if(np == 0){ np = nend; epsp = sqrt(fabs(wp)); } if (epsq=nm : i<=nm; i+=ih) { d = am[i+id] * fac + shfm; vnew += f(d) * bb[i - 1]; } for(i=is; ih<0 ? i>=np : i<=np; i+=ih) { d = ap[i+id] * fac + shfp; vnew += f(d) * bb[i-1]; } vnew = (vold + h*fac*vnew) * .5; if((d=vnew-vold,fabs(d))