! These tests assume that GPLInfinity = 30 PROGRAM TEST use globals use utils use shuffle use maths_functions use mpl_module use gpl_module use chenreftest, only: do_chen_test implicit none real(kind=prec) :: tol = 8.0e-7 logical :: tests_successful = .true. integer :: i character(len=32) :: arg i = 1 do call get_command_argument(i, arg) if (len_trim(arg) == 0) exit ! parse verbosity select case(trim(arg)) case('-verb') #ifdef DEBUG i=i+1 call get_command_argument(i,arg) read(arg,*) verb ! str to int #else call errprint("Argument -verb is not available, compile with --debug") #endif case('-mpl-test') tol = zero * 1.e5_prec call do_MPL_tests case('-gpl-test') tol = zero * 1.e5_prec call do_GPL_tests case('-chen-test') tol = 8.0e-7 tests_successful = tests_successful .and. do_chen_test() #if defined(HAVE_GINAC) && defined(HAVE_MM) case('-ginac-tests') tol = 8.0e-7 call do_ginac_tests case ('-speed-tests') i=i+1 call get_command_argument(i,arg) read(arg,*) verb call do_timing_tests(i) case ('-hw-tests') tol = 8.0e-7 call do_high_weight_tests #else case('-ginac-tests', '-speed-tests', '-hw-tests') call errprint("Argument "//trim(arg)//" is not available, compile with --with-ginac --with-mcc") #endif #ifdef HAVE_GINAC case ('-long-test') tol = 8.0e-7 call do_long_test #else case('-long-test') call errprint("Argument "//trim(arg)//" is not available, compile with --with-ginac") #endif case ('-report') #ifdef DEBUG verb = 1000 #endif tol = zero * 1.e5_prec call do_MPL_tests call do_GPL_tests tol = 8.0e-7 tests_successful = tests_successful .and. do_chen_test() #if defined(HAVE_GINAC) && defined(HAVE_MM) call do_ginac_tests #endif case default call errprint("Unknown argument "//trim(arg)) end select i = i+1 end do ! call do_shuffle_tests() ! put this somewhere else if(tests_successful) then print*, 'All tests passed. ' else call errprint('Some tests failed. ') end if stop CONTAINS subroutine errprint(msg) character(len=*) msg write(0,*) "Error:", msg stop 1 end subroutine subroutine check(res, ref) complex(kind=prec) :: res, ref real(kind=prec) :: delta delta = abs(res-ref) if(delta < tol) then print*, ' ',' passed with delta = ', delta else print*, ' ',' FAILED with delta = ', delta tests_successful = .false. end if end subroutine check subroutine test_one_MPL(m,x,ref, test_id) integer :: m(:) complex(kind=prec) :: x(:), ref, res character(len=*) :: test_id print*, ' ', 'testing MPL ', test_id, ' ...' res = MPL(m,x) call check(res,ref) end subroutine test_one_MPL subroutine do_MPL_tests() complex(kind=prec) :: ref print*, 'doing MPL tests...' ref = (0.0226974036143118403367048874190211851348_prec,0.) call test_one_MPL((/ 1,1 /),cmplx([ 119._prec/377._prec, 35._prec / 102._prec ],kind=prec),ref, '1.1') ref = (2.31346156303083313941538625891818239608127E-4_prec,0.) call test_one_MPL((/ 1,1 /),cmplx([0.03_prec, 100._prec-30._prec*sqrt(11._prec) ], kind=prec),ref, '1.2') ref = (2.34617486908178608355021488772249510275409004880846912378356e-5_prec,0.) call test_one_MPL((/ 2,1,2 /),cmplx([0.03_prec, 100._prec-30._prec*sqrt(11._prec), 250._prec/9._prec + sqrt(6875._prec)/3._prec ], kind=prec),ref, '1.3') ref = (-0.06565799418838388900030511939327151809905663800733251335678_prec,0.) call test_one_MPL((/1, 1/), (/(-0.25_prec,0.),(-2._prec,0.) /), ref, '1.4') ref = (-0.0319989639656484125354488353677231989818697987217232462808_prec,0.) call test_one_MPL((/2, 1/), (/(-0.25_prec,0.),(-2._prec,0.) /), ref, '1.5') end subroutine do_MPL_tests subroutine test_one_condensed(m,z,y,k,ref,test_id) integer :: m(:), k complex(kind=prec) :: z(:), y, res, ref character(len=*) :: test_id print*, ' ', 'testing GPL ', test_id, ' ...' res = G_condensed(m,toinum(z),inum(y,di0),k) call check(res,ref) end subroutine test_one_condensed subroutine test_one_flat(z,ref,test_id) complex(kind=prec) :: z(:), res, ref character(len=*) :: test_id print*, ' ', 'testing GPL ', test_id, ' ...' res = G(z) call check(res,ref) end subroutine test_one_flat subroutine do_GPL_tests() complex(kind=prec) :: ref, res real(kind=prec) :: z, xchen print*, 'doing GPL tests...' ref = (0.0819393734128676670196050250748145117414_prec,0.) call test_one_condensed((/ 1,1 /),(/ (1.3_prec,0.), (1.1_prec,0.) /),(0.4_prec,0.),2,ref,'2.1') ref = (0.0159279595253714815409530431586662402173_prec,0.) call test_one_condensed((/ 3,2 /),(/ (1.3_prec,0.), (1.1_prec,0.) /),(0.4_prec,0.),2,ref,'2.2') ref = (0.0020332632172573960663410568998748341439_prec,0.) call test_one_condensed((/ 4 /),(/ (0._prec,0.) /),(1.6_prec,0.),1,ref,'2.3') ! requires making convergent ref = (0.0959304167763934268889451723647597269243_prec,-0.882935179519785044294098901083860819793_prec) call test_one_flat(cmplx([0,1,3,2],kind=prec),ref,'2.4') ref = (0.00994794778992862285848386211876302459484_prec,0.0) call test_one_flat([ (0._prec,0.), (0._prec,0.), cmplx(-10._prec/3._prec,kind=prec), cmplx(-10._prec/3._prec,kind=prec), (1._prec,0.) ],ref,'2.5') ! requires hoelder convolution ref = (-0.01270994282825128082040127705282437854604_prec,0.0) call test_one_flat([ (0._prec,0.), cmplx(10._prec/3._prec,kind=prec), (1._prec,0.), cmplx(10._prec/3._prec,kind=prec), (1._prec,0.) ],ref,'2.6') ! here the tests from the mathematica nb start ! -------------------------------------------------------------------------- z = 1._prec/200; xchen = 0.3_prec; ref = (-0.00501254182354428204309373895836778138658_prec,0.0) call test_one_flat(cmplx([1./z,1.0_prec],kind=prec),ref,'3.1') ref = (-0.001501126126267145650881556104825717433567_prec,0.0) call test_one_flat(cmplx([1./(xchen*z),1.0_prec],kind=prec),ref,'3.2') ref = (-7.50286081781062398521044689345496255877E-4_prec,0.0) call test_one_flat(cmplx([(1+sqrt(1-z**2))/(xchen*z),1.0_prec],kind=prec),ref,'3.3') ref = (0.0074335969894769006767497160582533005912_prec,0.0) call test_one_flat(cmplx([-1._prec/xchen,-1._prec/xchen,1._prec,1._prec,1._prec],kind=prec),ref,'3.4') ref = (-8.40378597494480117619893114520705717404E-6_prec,0.0) call test_one_flat(cmplx([-1._prec/xchen,0._prec,-1._prec/xchen,1._prec/(xchen*z),1.0_prec],kind=prec),ref,'3.5') ref = (0.492575584745015188956099120118429131062_prec,2.63892140547433046711653044177665570864_prec) call test_one_flat(cmplx([-1._prec,-1._prec,z,z,1._prec],kind=prec),ref,'3.6') ref = (-0.001531771317885848316868878120481266022195_prec,-4.50039113668843745227527662921010599E-4_prec) call test_one_flat(cmplx([0._prec,0._prec,(1._prec-sqrt(1-z**2))/(xchen*z), 1._prec/(xchen*z),1._prec],kind=prec),ref,'3.7') ! here the chen integral tests start ! ---------------------------------------------------------------------- z = 1/100._prec ref = (-1.203972804325935992622746217761838502954_prec,0.0) call test_one_flat((/ (0._prec,0.), (0.3_prec,0.) /),ref,'4.1') ref = (10.6037962209567960211233327771880353832_prec,0.0) call test_one_flat( (/ (0._prec,0.), (0._prec,0.), (0.01_prec,0.) /),ref,'4.2') ref = (5.0429900651807654463744449762857296353E-4_prec,0.0) call test_one_flat((/(100._prec,0.), (1._prec,0.), (0.3_prec,0.) /),ref,'4.3') ref = (0.05630861877185110944118569266547272128_prec,0.0) call test_one_flat( (/ (1._prec,0.), (0._prec,0.), (0.01_prec,0.) /) ,ref,'4.4') ref = (0.0403289515087272334386799760345612761274_prec,0.29227096475688417627233177065883250904_prec) call test_one_flat([cmplx(z,sqrt(1._prec-z**2),kind=prec), (0.3_prec,0._prec)],ref,'4.5') ref = (2.52106450983403521007132254962389653479E-5_prec,0.) call test_one_flat(cmplx([1._prec/z, (1+sqrt(1-z**2))/z, 1._prec], kind=prec),ref,'4.6') ref = (0.0556470547634805907802456701296765199105_prec,0.) call test_one_flat((/ (-1._prec,0.), (0.01_prec,0.), (0._prec,0.), (0.01_prec,0.) /),ref,'4.7') ref = (3.79489584700899518570534417045601144619E-5_prec,0.) call test_one_flat((/ (100._prec,0.), (100._prec,0.), (1._prec,0.), (0._prec,0.), (1._prec,0.) /),ref,'4.8') ref = (7.57428443370789293292663421167820669347E-5_prec,0.) call test_one_flat((/ (100._prec,0.), (1._prec,0.), (100._prec,0.), (0._prec,0.), (1._prec,0.) /),ref,'4.9') ref = (1.88019115860102242751826218248903485831_prec,2.50943413859806280406885100241705929527_prec) call test_one_flat((/ (0.01_prec,0.), (-1.0_prec,0.), (0.01_prec,0.), (1._prec,0.) /),ref,'4.10') ref = (-0.0125391083150538283259376060156453327489_prec,-0.0154142501684376766660782277248386124052_prec) call test_one_flat(cmplx([z, (1+sqrt(1-z**2))/z, z, 1._prec],kind=prec),ref,'4.11') ! Increase test coverage ref = (-1.203972804325935992622746217761838502953611_prec, pi) call test_one_flat((/ (0._prec,0.), (-0.3_prec,0.) /),ref,'E.1') ref = (-0.539404830685964989184608085018712655769250_prec, 1.0303768265243124637877433270311515319634364_prec) call test_one_flat([(0._prec,0._prec), (0.3_prec, 0.5_prec)],ref,'E.2') ref = (3.79489584700899518570534417045601144619E-5_prec,0.) print*, ' ', 'testing GPL ', 'E.3', ' ...' res = G((/100._prec, 100._prec, 1._prec, 0._prec, 1._prec/)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.4', ' ...' res = G((/100,100,1,0,1/)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.5', ' ...' res = G_superflatn(toinum((/100,100,1,0,1/)), 5) call check(res,ref) print*, ' ', 'testing GPL ', 'E.6', ' ...' res = G((/100._prec,100._prec,1._prec,0._prec/), 1._prec) call check(res,ref) print*, ' ', 'testing GPL ', 'E.7', ' ...' res = G((/(100._prec,0.),(100._prec,0.),(1._prec,0.),(0._prec,0.)/), (1._prec,0.)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.8', ' ...' res = G( (/1,1,1,1/) , (/ 100._prec, 100._prec, 1._prec, 0._prec /), 1._prec) call check(res,ref) !ref = cmplx(0.01592795952537145) ref = (0.0485035531168477720320998551314479928648_prec,-2.82326885118931135859594797186107474877_prec) print*, ' ', 'testing GPL ', 'E.9', ' ...' res = G( (/ 3, 2 /), toinum((/ 1.3_prec, 1.1_prec /)), toinum(4._prec) ) call check(res,ref) print*, ' ', 'testing GPL ', 'E.10', ' ...' res = G( (/ 3, 2 /), (/ 1.3_prec, 1.1_prec /), 4._prec ) call check(res,ref) print*, ' ', 'testing GPL ', 'E.11', ' ...' res = G( (/ 3, 2 /), (/ (1.3_prec,0.), (1.1_prec,0.) /), (4._prec,0.) ) call check(res,ref) print*, ' ', 'testing GPL ', 'E.12', ' ...' ref = (0.107961231635965271810236308594279564021882373573100109007684973130605145011141_prec, 0.) res = G((/ 0._prec, 1.3_prec, 0._prec, 0._prec, 4._prec, 1.1_prec /)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.13', ' ...' ref = (-1.229846637025798984989235266565630713100_prec,-1.05705870670612913651142424798975000765_prec) res = G([inum(2._prec, +1), inum(7._prec, +1)], inum(5._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.14', ' ...' ref = (-1.229846637025798984989235266565630713100_prec,+1.05705870670612913651142424798975000765_prec) res = G([inum(2._prec, -1), inum(7._prec, +1)], inum(5._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.15', ' ...' ref = (0.2982254208688088675254638762780704094718_prec,0.) res = G([inum(2._prec, -1), inum(7._prec, +1)], inum(-5._prec, -1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.17', ' ...' ref = (0.190800137777535619036913153766083992418_prec, 0.) res = G((/ 6, 1, 1 /)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.18', ' ...' ref = (0.058192342415778512650117048874978455691_prec, 0.) res = G((/ 6, 1, -1 /)) call check(res,ref) ref = cmplx(log(0.5_prec), pi,kind=prec) print*, ' ', 'testing GPL ', 'E.19a', ' ...' res = G((/ inum(2._prec, +1) /), inum(3._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.19b', ' ...' res = G((/ inum(2._prec, -1) /), inum(3._prec, +1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.19c', ' ...' res = G((/ inum(2._prec, +1) /), inum(3._prec, -1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.19d', ' ...' res = G((/ inum(2._prec, -1) /), inum(3._prec, -1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.19e', ' ...' res = G((/ inum(-2._prec, +1) /), inum(-3._prec, +1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.19f', ' ...' res = G((/ inum(-2._prec, -1) /), inum(-3._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.19g', ' ...' res = G((/ inum(-2._prec, +1) /), inum(-3._prec, -1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.19h', ' ...' res = G((/ inum(-2._prec, -1) /), inum(-3._prec, -1)) call check(res,ref) ref = -(2.374395270272480200677499763071638424_prec, - 1.273806204919600530933131685580471698_prec) print*, ' ', 'testing GPL ', 'E.20a', ' ...' res = G((/ izero, inum(2._prec, +1) /), inum(3._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.20b', ' ...' res = G((/ izero, inum(2._prec, -1) /), inum(3._prec, +1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.20c', ' ...' res = G((/ izero, inum(2._prec, +1) /), inum(3._prec, -1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.20d', ' ...' res = G((/ izero, inum(2._prec, -1) /), inum(3._prec, -1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.20e', ' ...' res = G((/ izero, inum(-2._prec, +1) /), inum(-3._prec, +1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.20f', ' ...' res = G((/ izero, inum(-2._prec, -1) /), inum(-3._prec, +1)) call check(res,ref) print*, ' ', 'testing GPL ', 'E.20g', ' ...' res = G((/ izero, inum(-2._prec, +1) /), inum(-3._prec, -1)) call check(res,conjg(ref)) print*, ' ', 'testing GPL ', 'E.20h', ' ...' res = G((/ izero, inum(-2._prec, -1) /), inum(-3._prec, -1)) call check(res,ref) ! Thanks to Roman Zwicky and Ben Pullin for these tests ref = (0.392707112217551702879328061598355445_prec, - 1.274969448494380061814943180491890080_prec) call test_one_flat((/ (0._prec,0.), (1._prec,0.), (0._prec, 1.5_prec) /),ref,'F.1') ref = (2.09624324167194065961839363660174566_prec, 0.62644605179087454819421905065313983_prec) call test_one_flat( (/ (1._prec,0.), (-1._prec,0.), (2.5_prec, -2.4_prec) /) , ref, 'F.2') ref = conjg(ref) call test_one_flat( (/ (1._prec,0.), (-1._prec,0.), (2.5_prec, +2.4_prec) /) , ref, 'F.3') ref = (0.6874619495289224183167486785286777066_prec, -1.8261934916106546308783576818077830287_prec) call test_one_flat( (/ (-1._prec,0.), (1._prec,0.), (2.5_prec, +2.4_prec) /) , ref, 'F.4') ref = (0.320016770069038023050391296154549_prec , 0.064263450879286017225353602844105_prec) call test_one_flat( (/ (0._prec,0.), (1._prec,0.), (-1._prec,0.), (0.3_prec, -1.2_prec) /) , ref, 'F.5') ref = conjg(ref) call test_one_flat( (/ (0._prec,0.), (1._prec,0.), (-1._prec,0.), (0.3_prec, +1.2_prec) /) , ref, 'F.6') ref = (0.8382358254435272068734922352_prec, - 0.3702062785327198487992149341_prec) call test_one_flat( (/ (0._prec,0.), (1._prec,0.), (-1._prec,0.), (1.1_prec,2._prec) /) , ref, 'F.7') ref = (0.185156872427485220072774923047908301422_prec,-0.249989197161429773744237773045427322847_prec) call test_one_flat( (/ (1._prec,0.), (-1._prec,0.), (2.3_prec,-1._prec), (1.1_prec,-0.1_prec) /) , ref, 'F.8') ref = (-1.11161035333074623447215317094270858897_prec,-0.875225967273157437459269290416981432294_prec) call test_one_flat( (/ (1._prec,0.), (1.1_prec,-0.1_prec), (1._prec,0.), (2.3_prec,-1.2_prec), (3.4_prec,9.7_prec) /) , ref, 'F.9') ref = (-0.1109203962012759970680116512959180346924_prec,0.114779444698808046532782358409267479097_prec) call test_one_flat( (/ (0._prec, 0.) , (-0.1_prec, - 0.3_prec), (1._prec,0.), (0.5_prec, 0._prec) /) , ref, 'F.10') ref = (-0.108930339927322068475622176344923224046_prec,0.1122893584726586134006078500824852031925_prec) call test_one_flat( (/ (-0.005_prec, 0.) , (-0.1_prec, - 0.3_prec), (1._prec,0.), (0.5_prec, 0._prec)/) , ref, 'F.11') ref = (-1.00642162671475190543135817048062920163_prec,0.75972801214517468120067717498723544972_prec) call test_one_flat( (/ (-0.005_prec, 0.) , (-0.1_prec, - 0.3_prec), (1._prec,0.), (1.5_prec, 0._prec)/) , ref, 'F.12') ref = (-0.764543307991553066235740993950606803628_prec, 0.54861507469010653128533842086292369104_prec) call test_one_flat( (/ (-0.1_prec, - 0.3_prec), (1._prec,0.), (-0.005_prec, 0.) , (0.5_prec, 0._prec)/) , ref, 'F.13') ref = (4.52004218277686921073832347986485146573_prec,-1.812384329980915889835338149845575221705_prec) call test_one_flat( (/ (1.005_prec,0.), (0._prec,0.), (1.1_prec,0.3_prec), (1._prec,0.) /) , ref, 'F.14') ref = (1.6706939608077788063504210821631008732_prec,-0.631820518538505729899318406678510198266_prec) call test_one_flat( (/ (1.1_prec,0.), (0._prec,0.), (1.1_prec,0.3_prec), (1._prec,0.) /) , ref, 'F.10') ref = (0.198693810038777868937967610639933071867_prec,+0.72807783717224553483870820314753060868_prec) call test_one_flat( (/ (0._prec,0.), (1.0_prec,0._prec), (1.1_prec,0.), (1.1_prec,+0.3_prec) /) , ref, 'F.11') ref = (1.6706939608077788063504210821631008732_prec,-0.631820518538505729899318406678510198266_prec) call test_one_flat( (/ (1.1_prec,0.), (0._prec,0._prec), (1.1_prec,+0.3_prec), (1._prec,0.) /) , ref, 'F.12') ref = (0.1810339553848393655117844582129810543006_prec,+0.82543851493400141056822586864697825094_prec) call test_one_flat( (/ (0._prec,0.), (1.0_prec,0._prec), (1._prec,0.), (1.1_prec,+0.3_prec) /) , ref, 'F.13') ref = (-3.028608056170828558746818459366566689807_prec,-0.52999686156911157999452896083600882192_prec) call test_one_flat( (/ (1._prec,0._prec), (0.0_prec,0._prec), (0._prec,1._prec), (1.1_prec,0.0_prec) /) , ref, 'F.14') ! Here the branch cut matters, in Mathematica this is entered as G(1_-, 0, -I, -1.1) ref = (0.0538179677556747874824671812943783830465_prec,0.340519960719077282936661573786600733497_prec) print*, ' ', 'testing GPL ', 'F.15', ' ...' res = G((/ inum(1._prec,-1), izero, inum((0._prec,-1._prec), -1) /), inum(-1.1_prec, +1)) call check(res,ref) ref = (0.0075181720252360930529649927100295277234_prec,0.009279206321129807482628652573319115651_prec) call test_one_flat( (/ (0._prec,0.), (0._prec,0.), (1.0_prec,0._prec), (0.1_prec,-0.1_prec), (0.11_prec,0._prec) /) , ref, 'F.16') ref = (0.0135493735561310633082925053080300174678_prec,+0.01851696361979639851211857931403696163_prec) call test_one_flat( (/ (0._prec,0.), (0._prec,0.), (1.0_prec,0._prec), (0.1_prec,-0.1_prec), (0.15_prec,0._prec) /) , ref, 'F.17') ref = (-2.41176903997917647290181947143140323970805e-4_prec,0.00129690184788114442363777169655122) call test_one_flat( (/ (0._prec,0.), (1._prec,0.), (0.5_prec,-0.1_prec), (-1.3_prec,10.2_prec), (0.4_prec,0._prec) /) , ref, 'F.18') ref = (-0.003113755848404291707649322614093090379815_prec,-4.6914973893242872720303973859400498154E-4_prec) call test_one_flat( (/ (0._prec,0.), (1._prec,0.), (0.1_prec,-0.1_prec), (-1.3_prec,10.2_prec), (0.4_prec,0._prec) /) , ref, 'F.19') end subroutine do_GPL_tests #ifdef HAVE_GINAC function evalt(arr, what) #if KINDREAL==16 use ieps, only: inum2inum #endif implicit none complex(kind=prec) :: arr(:), evalt complex(kind=8) :: geval integer what, i, l evalt =0. do i=1,size(arr) if (abs(arr(i)) .gt. 1.e10) then ! isnan? l = i-1 goto 123 endif enddo l = size(arr) 123 continue if (l==0) return if (what .eq. 0) then evalt = G(arr(1:l)) elseif (what.eq.1) then #if KINDREAL==16 evalt = cmplx(geval(inum2inum(toinum(arr(1:l))),l),kind=prec) #else evalt = geval(toinum(arr(1:l)),l) #endif endif end function #ifdef HAVE_MM subroutine perform_ginacv(n, args) use maths_functions, only:clearcache complex(kind=prec) :: args(:,:) integer i,n call clearcache do i=1,size(args,1) write(*,900) n,i call check(evalt(args(i,:),0),evalt(args(i,:),1)) enddo 900 format(" testing GPL ",I1,".",I4.4," ...") end subroutine subroutine do_ginac_tests use maths_functions, only:clearcache use gtestchen , only: inichen =>args use gtestmuone , only: inimuone =>args use gtestmuonenp, only: inimuonenp=>args implicit none tol = 6.0e-6 call perform_ginacv( 6, inichen ((0.3_prec,0.), (0.1_prec,0.)) ) call perform_ginacv( 7, inimuone ((0.5_prec,0.), (0.6_prec,0.)) ) call perform_ginacv( 8, inimuonenp((0.3_prec,0.), (0.6_prec,0.)) ) end subroutine subroutine do_one_speed_test(args, u, msg) use maths_functions, only:clearcache implicit none complex(kind=prec) :: args(:,:,:),res integer(kind=8) cstart, cend, count_rate real(kind=prec) :: time(2), ttime(2) integer i,j, u character,parameter :: cr = achar(13) character(len=*) msg do j=1,size(args,1) ! try function a bunch of times call system_clock(cstart, count_rate=count_rate) do i=1,size(args,3) res=evalt(args(j,:,i),0) enddo call system_clock(cend, count_rate=count_rate) time(1) = real(cend-cstart)/real(count_rate,kind=prec)/size(args,3) if (time(1).lt.zero) print*,j, cend-cstart,count_rate ttime(1) = ttime(1) + time(1) call system_clock(cstart, count_rate=count_rate) do i=1,size(args,3) res=evalt(args(j,:,i),1) enddo call system_clock(cend, count_rate=count_rate) time(2) = real(cend-cstart)/real(count_rate,kind=prec)/size(args,3) if (time(2).lt.zero) print*,j ttime(2) = ttime(2) + time(2) write(u,*) time write( * , 900, advance='no' ) cr, j, size(args,1), msg enddo print*, print*,ttime write(*,901) msg, size(args,1)/ttime(2)/1000., size(args,1)/ttime(1)/1000., int(ttime(2)/ttime(1)) ! Lets to another, fair comparison call system_clock(cstart, count_rate=count_rate) do j=1,size(args,1) res=evalt(args(j,:,1),0) enddo call system_clock(cend, count_rate=count_rate) ttime(1) = real(cend-cstart)/real(count_rate,kind=prec) call system_clock(cstart, count_rate=count_rate) do j=1,size(args,1) res=evalt(args(j,:,1),1) enddo call system_clock(cend, count_rate=count_rate) ttime(2) = real(cend-cstart)/real(count_rate,kind=prec) write(*,901) msg, size(args,1)/ttime(2)/1000., size(args,1)/ttime(1)/1000., int(ttime(2)/ttime(1)) 900 FORMAT(a , 'Function ',i4,'/',i4,' for ',a) 901 format('Evaluating ',A,' using GiNaC at ',F9.2,'kG/s and handyG at ',F9.2,'kG/s (',I3,'x)') end subroutine subroutine do_timing_tests(n) use gtestchen , only: inichen =>args use gtestchenff , only: inichenff =>args use gtestmuone , only: inimuone =>args use gtestmuonenp, only: inimuonenp=>args implicit none integer, intent(in) :: n integer i complex(kind=prec) :: cargs( 1399,5,n) complex(kind=prec) :: fargs( 540,5,n) complex(kind=prec) :: pargs( 198,5,n) complex(kind=prec) :: nargs( 1733,5,n) real(kind=prec) :: z, x, y, w integer ranseed ranseed = 233123 do i=1,n z = ran2(ranseed) / 2. x = ran2(ranseed)*(1-z) + z cargs(:,:,i) = inichen (cmplx(x,kind=prec), cmplx(z,kind=prec)) fargs(:,:,i) = inichenff(cmplx(x,kind=prec), cmplx(z,kind=prec)) w = ran2(ranseed) ! 0 length) nuniq = length - nzero !do i=1,nsmall ! alphabet(i) = 0.8_prec * ran2(seed) !enddo !do i=nsmall+1,nuniq ! alphabet(i) = 1.5_prec/(0.15_prec + ran2(seed)) !enddo arguments(1:nzero) = 0._prec do i=1,nuniq arguments(nzero+i) = alphabet(i) enddo do i=nzero+nuniq,length c = int(ran2(seed)*nuniq)+1 arguments(i) = alphabet(c) enddo call fyshuffle(arguments, seed) do while(arguments(length) maxd) maxd = abs(ans(1)-ans(2)) if(abs(ans(1)-ans(2)) > tol) goto 123 enddo print*,' done. largest=',maxd maxd=0. enddo print*,maxd close(9) return 123 continue print*,"Failed with delta",abs(ans(1)-ans(2)) print*,"Offending G was",args(1:w) print*,ans close(9) 900 FORMAT(a , 'Testing ',i5,'/',i5,' GPLs with w=',i1) END SUBROUTINE FUNCTION RAN2(randy) ! This is the usual "random" implicit none real(kind=prec) :: MINV,RAN2 integer m,a,Qran,r,hi,lo,randy PARAMETER(M=2147483647,A=16807,Qran=127773,R=2836) PARAMETER(MINV=0.46566128752458e-09) HI = RANDY/Qran LO = MOD(RANDY,Qran) RANDY = A*LO - R*HI IF(RANDY.LE.0) RANDY = RANDY + M RAN2 = RANDY*MINV END FUNCTION RAN2 #endif ! subroutine do_shuffle_tests() ! complex(kind=prec) :: v(2) = cmplx((/1,2/)) ! complex(kind=prec) :: w(2) = cmplx((/3,4/)) ! call print_matrix(shuffle_product(v,w)) ! end subroutine do_shuffle_tests END PROGRAM TEST ! In terminal kann man den exit code bekommen via echo $?